4 from __future__
import print_function
5 from __future__
import absolute_import
8 from .Options
import Options
14 from .Mixins
import PrintOptions,_ParameterTypeBase,_SimpleParameterTypeBase, _Parameterizable, _ConfigureComponent, _TypedParameterizable, _Labelable, _Unlabelable, _ValidatingListBase, _modifyParametersFromDict
17 from .Modules
import *
18 from .Modules
import _Module
19 from .SequenceTypes
import *
20 from .SequenceTypes
import _ModuleSequenceType, _Sequenceable
21 from .SequenceVisitors
import PathValidator, EndPathValidator, ScheduleTaskValidator, NodeVisitor, CompositeVisitor, ModuleNamesFromGlobalsVisitor
22 from .
import DictTypes
24 from .ExceptionHandling
import *
27 if sys.getrecursionlimit()<5000:
28 sys.setrecursionlimit(5000)
32 Raise an exception if called by special config files. This checks
33 the call or import stack for the importing file. An exception is raised if
34 the importing module is not in allowedPatterns and if it is called too deeply:
35 minLevel = 2: inclusion by top lvel cfg only
36 minLevel = 1: No inclusion allowed
37 allowedPatterns = ['Module1','Module2/SubModule1'] allows import
38 by any module in Module1 or Submodule1
44 ignorePatterns = [
'FWCore/ParameterSet/Config.py',
'<string>',
'<frozen ']
45 CMSSWPath = [os.environ[
'CMSSW_BASE'],os.environ[
'CMSSW_RELEASE_BASE']]
49 for item
in inspect.stack():
53 for pattern
in CMSSWPath:
54 if item[1].
find(pattern) != -1:
57 if item[1].
find(
'/') == -1:
60 for pattern
in ignorePatterns:
61 if item[1].
find(pattern) != -1:
65 if inPath
and not ignore:
66 trueStack.append(item[1])
68 importedFile = trueStack[0]
70 if len(trueStack) > 1:
71 importedBy = trueStack[1]
73 for pattern
in allowedPatterns:
74 if importedBy.find(pattern) > -1:
77 if len(trueStack) <= minLevel:
80 raise ImportError(
"Inclusion of %s is allowed only by cfg or specified cfi files."
84 """Look inside the module and find the Processes it contains"""
88 if isinstance(module,dict):
89 if 'process' in module:
93 if hasattr(module,
'process'):
94 if isinstance(module.process,Process):
95 process = module.process
97 raise RuntimeError(
"The attribute named 'process' does not inherit from the Process class")
99 raise RuntimeError(
"no 'process' attribute found in the module, please add one")
103 """Root class for a CMS configuration process"""
105 """The argument 'name' will be the name applied to this Process
106 Can optionally pass as additional arguments cms.Modifier instances
107 that will be used to modify the Process as it is built
109 self.__dict__[
'_Process__name'] = name
110 if not name.isalnum():
111 raise RuntimeError(
"Error: The process name is an empty string or contains non-alphanumeric characters")
112 self.__dict__[
'_Process__filters'] = {}
113 self.__dict__[
'_Process__producers'] = {}
114 self.__dict__[
'_Process__switchproducers'] = {}
115 self.__dict__[
'_Process__source'] =
None
116 self.__dict__[
'_Process__looper'] =
None
117 self.__dict__[
'_Process__subProcesses'] = []
118 self.__dict__[
'_Process__schedule'] =
None
119 self.__dict__[
'_Process__analyzers'] = {}
120 self.__dict__[
'_Process__outputmodules'] = {}
123 self.__dict__[
'_Process__sequences'] = {}
124 self.__dict__[
'_Process__tasks'] = {}
125 self.__dict__[
'_Process__services'] = {}
126 self.__dict__[
'_Process__essources'] = {}
127 self.__dict__[
'_Process__esproducers'] = {}
128 self.__dict__[
'_Process__esprefers'] = {}
129 self.__dict__[
'_Process__aliases'] = {}
130 self.__dict__[
'_Process__psets']={}
131 self.__dict__[
'_Process__vpsets']={}
132 self.__dict__[
'_cloneToObjectDict'] = {}
134 self.__dict__[
'_Process__InExtendCall'] =
False
135 self.__dict__[
'_Process__partialschedules'] = {}
137 self.__dict__[
'_Process__modifiers'] = Mods
141 for m
in self.__modifiers:
146 _Module.__isStrict__ =
True
150 """Returns a string containing all the EDProducer labels separated by a blank"""
153 """Returns a string containing all the SwitchProducer labels separated by a blank"""
156 """Returns a string containing all the EDAnalyzer labels separated by a blank"""
159 """Returns a string containing all the EDFilter labels separated by a blank"""
162 """Returns a string containing all the Path names separated by a blank"""
169 Since cloneToObjectDict stores a hash of objects by their
170 id() it needs to be updated when unpickling to use the
171 new object id values instantiated during the unpickle.
174 self.__dict__.
update(pkldict)
176 for value
in self._cloneToObjectDict.
values():
177 tmpDict[
id(value)] = value
178 self.__dict__[
'_cloneToObjectDict'] = tmpDict
183 """returns a dict of the filters that have been added to the Process"""
185 filters = property(filters_, doc=
"dictionary containing the filters for the process")
189 if not name.isalnum():
190 raise RuntimeError(
"Error: The process name is an empty string or contains non-alphanumeric characters")
191 self.__dict__[
'_Process__name'] = name
192 process = property(name_,setName_, doc=
"name of the process")
194 """returns a dict of the producers that have been added to the Process"""
196 producers = property(producers_,doc=
"dictionary containing the producers for the process")
198 """returns a dict of the SwitchProducers that have been added to the Process"""
200 switchProducers = property(switchProducers_,doc=
"dictionary containing the SwitchProducers for the process")
202 """returns the source that has been added to the Process or None if none have been added"""
206 source = property(source_,setSource_,doc=
'the main source or None if not set')
208 """returns the looper that has been added to the Process or None if none have been added"""
212 looper = property(looper_,setLooper_,doc=
'the main looper or None if not set')
215 return untracked.PSet(numberOfThreads = untracked.uint32(1),
216 numberOfStreams = untracked.uint32(0),
217 numberOfConcurrentRuns = untracked.uint32(1),
218 numberOfConcurrentLuminosityBlocks = untracked.uint32(1),
219 eventSetup = untracked.PSet(
220 numberOfConcurrentIOVs = untracked.uint32(1),
221 forceNumberOfConcurrentIOVs = untracked.PSet(
222 allowAnyLabel_ = required.untracked.uint32
225 wantSummary = untracked.bool(
False),
226 fileMode = untracked.string(
'FULLMERGE'),
227 forceEventSetupCacheClearOnNewRun = untracked.bool(
False),
228 throwIfIllegalParameter = untracked.bool(
True),
229 printDependencies = untracked.bool(
False),
230 sizeOfStackForThreadsInKB = optional.untracked.uint32,
231 Rethrow = untracked.vstring(),
232 SkipEvent = untracked.vstring(),
233 FailPath = untracked.vstring(),
234 IgnoreCompletely = untracked.vstring(),
235 canDeleteEarly = untracked.vstring(),
236 allowUnscheduled = obsolete.untracked.bool,
237 emptyRunLumiMode = obsolete.untracked.string,
238 makeTriggerResults = obsolete.untracked.bool
242 if isinstance(opt,dict):
243 for k,v
in six.iteritems(opt):
246 for p
in opt.parameters_():
247 setattr(newOpts, p, getattr(opt,p))
251 return untracked.PSet(input=optional.untracked.int32,
252 output=optional.untracked.allowed(int32,PSet))
255 if isinstance(ps,dict):
256 for k,v
in six.iteritems(ps):
259 for p
in ps.parameters_():
260 setattr(newMax, p, getattr(ps,p))
264 return untracked.PSet(input=untracked.int32(-1))
266 """returns a list of the subProcesses that have been added to the Process"""
267 return self.__subProcesses
268 subProcesses = property(subProcesses_,doc=
'the SubProcesses that have been added to the Process')
270 """returns a dict of the analyzers that have been added to the Process"""
272 analyzers = property(analyzers_,doc=
"dictionary containing the analyzers for the process")
274 """returns a dict of the output modules that have been added to the Process"""
276 outputModules = property(outputModules_,doc=
"dictionary containing the output_modules for the process")
278 """returns a dict of the paths that have been added to the Process"""
280 paths = property(paths_,doc=
"dictionary containing the paths for the process")
282 """returns a dict of the endpaths that have been added to the Process"""
284 endpaths = property(endpaths_,doc=
"dictionary containing the endpaths for the process")
286 """returns a dict of the sequences that have been added to the Process"""
288 sequences = property(sequences_,doc=
"dictionary containing the sequences for the process")
290 """returns a dict of the tasks that have been added to the Process"""
292 tasks = property(tasks_,doc=
"dictionary containing the tasks for the process")
294 """returns the schedule that has been added to the Process or None if none have been added"""
295 return self.__schedule
297 if label ==
"schedule":
300 self.
_place(label, sch, self.__partialschedules)
309 raise RuntimeError(
"The path at index "+
str(index)+
" in the Schedule was not attached to the process.")
310 self.__dict__[
'_Process__schedule'] = sch
311 schedule = property(schedule_,setSchedule_,doc=
'the schedule or None if not set')
313 """returns a dict of the services that have been added to the Process"""
315 services = property(services_,doc=
"dictionary containing the services for the process")
317 """returns a dict of the esproducers that have been added to the Process"""
319 es_producers = property(es_producers_,doc=
"dictionary containing the es_producers for the process")
321 """returns a the es_sources that have been added to the Process"""
323 es_sources = property(es_sources_,doc=
"dictionary containing the es_sources for the process")
325 """returns a dict of the es_prefers that have been added to the Process"""
327 es_prefers = property(es_prefers_,doc=
"dictionary containing the es_prefers for the process")
329 """returns a dict of the aliases that have been added to the Process"""
331 aliases = property(aliases_,doc=
"dictionary containing the aliases for the process")
333 """returns a dict of the PSets that have been added to the Process"""
335 psets = property(psets_,doc=
"dictionary containing the PSets for the process")
337 """returns a dict of the VPSets that have been added to the Process"""
339 vpsets = property(vpsets_,doc=
"dictionary containing the PSets for the process")
342 """returns True if the Modifier is in used by this Process"""
344 for m
in self.__modifiers:
345 if m._isOrContains(mod):
350 if not object.hasLabel_() :
351 object.setLabel(newLabel)
353 if newLabel == object.label_() :
355 if newLabel
is None :
356 object.setLabel(
None)
358 if (hasattr(self, object.label_())
and id(getattr(self, object.label_())) ==
id(object)) :
359 msg100 =
"Attempting to change the label of an attribute of the Process\n"
360 msg101 =
"Old label = "+object.label_()+
" New label = "+newLabel+
"\n"
361 msg102 =
"Type = "+
str(type(object))+
"\n"
362 msg103 =
"Some possible solutions:\n"
363 msg104 =
" 1. Clone modules instead of using simple assignment. Cloning is\n"
364 msg105 =
" also preferred for other types when possible.\n"
365 msg106 =
" 2. Declare new names starting with an underscore if they are\n"
366 msg107 =
" for temporaries you do not want propagated into the Process. The\n"
367 msg108 =
" underscore tells \"from x import *\" and process.load not to import\n"
368 msg109 =
" the name.\n"
369 msg110 =
" 3. Reorganize so the assigment is not necessary. Giving a second\n"
370 msg111 =
" name to the same object usually causes confusion and problems.\n"
371 msg112 =
" 4. Compose Sequences: newName = cms.Sequence(oldName)\n"
372 raise ValueError(msg100+msg101+msg102+msg103+msg104+msg105+msg106+msg107+msg108+msg109+msg110+msg111+msg112)
373 object.setLabel(
None)
374 object.setLabel(newLabel)
378 if not name.replace(
'_',
'').isalnum():
379 raise ValueError(
'The label '+name+
' contains forbiden characters')
381 if name ==
'options':
383 if name ==
'maxEvents':
387 if name.startswith(
'_Process__'):
388 self.__dict__[name]=value
390 if not isinstance(value,_ConfigureComponent):
391 raise TypeError(
"can only assign labels to an object that inherits from '_ConfigureComponent'\n"
392 +
"an instance of "+
str(type(value))+
" will not work - requested label is "+name)
393 if not isinstance(value,_Labelable)
and not isinstance(value,Source)
and not isinstance(value,Looper)
and not isinstance(value,Schedule):
394 if name == value.type_():
399 raise TypeError(
"an instance of "+
str(type(value))+
" can not be assigned the label '"+name+
"'.\n"+
400 "Please either use the label '"+value.type_()+
" or use the 'add_' method instead.")
403 newValue =value.copy()
405 newValue._filename = value._filename
411 if not self.
_okToPlace(name, value, self.__dict__):
412 newFile=
'top level config'
413 if hasattr(value,
'_filename'):
414 newFile = value._filename
415 oldFile=
'top level config'
416 oldValue = getattr(self,name)
417 if hasattr(oldValue,
'_filename'):
418 oldFile = oldValue._filename
419 msg =
"Trying to override definition of process."+name
420 msg +=
"\n new object defined in: "+newFile
421 msg +=
"\n existing object defined in: "+oldFile
422 raise ValueError(msg)
424 if hasattr(self,name)
and not (getattr(self,name)==newValue):
428 if newValue._isTaskComponent():
429 if not self.__InExtendCall:
433 if not isinstance(newValue, Task):
435 newFile=
'top level config'
436 if hasattr(value,
'_filename'):
437 newFile = value._filename
438 oldFile=
'top level config'
439 oldValue = getattr(self,name)
440 if hasattr(oldValue,
'_filename'):
441 oldFile = oldValue._filename
442 msg1 =
"Trying to override definition of "+name+
" while it is used by the task "
443 msg2 =
"\n new object defined in: "+newFile
444 msg2 +=
"\n existing object defined in: "+oldFile
447 raise ValueError(msg1+s.label_()+msg2)
449 if isinstance(newValue, _Sequenceable)
or newValue._isTaskComponent():
450 if not self.__InExtendCall:
454 newFile=
'top level config'
455 if hasattr(value,
'_filename'):
456 newFile = value._filename
457 oldFile=
'top level config'
458 oldValue = getattr(self,name)
459 if hasattr(oldValue,
'_filename'):
460 oldFile = oldValue._filename
461 msg1 =
"Trying to override definition of "+name+
" while it is used by the "
462 msg2 =
"\n new object defined in: "+newFile
463 msg2 +=
"\n existing object defined in: "+oldFile
466 raise ValueError(msg1+
"sequence "+s.label_()+msg2)
469 raise ValueError(msg1+
"path "+s.label_()+msg2)
472 raise ValueError(msg1+
"endpath "+s.label_()+msg2)
475 if isinstance(newValue, EDAlias):
476 oldValue = getattr(self, name)
478 newFile=
'top level config'
479 if hasattr(value,
'_filename'):
480 newFile = value._filename
481 oldFile=
'top level config'
482 if hasattr(oldValue,
'_filename'):
483 oldFile = oldValue._filename
484 msg1 =
"Trying to override definition of "+name+
" with an EDAlias while it is used by the "
485 msg2 =
"\n new object defined in: "+newFile
486 msg2 +=
"\n existing object defined in: "+oldFile
489 raise ValueError(msg1+
"task "+s.label_()+msg2)
492 raise ValueError(msg1+
"sequence "+s.label_()+msg2)
495 raise ValueError(msg1+
"path "+s.label_()+msg2)
498 raise ValueError(msg1+
"endpath "+s.label_()+msg2)
501 self.__dict__[name]=newValue
502 if isinstance(newValue,_Labelable):
504 self._cloneToObjectDict[
id(value)] = newValue
505 self._cloneToObjectDict[
id(newValue)] = newValue
507 newValue._place(name,self)
509 """Given a container of sequences or tasks, find the first sequence or task
510 containing mod and return it. If none is found, return None"""
513 for seqOrTask
in six.itervalues(seqsOrTasks):
522 if not hasattr(self,name):
523 raise KeyError(
'process does not know about '+name)
524 elif name.startswith(
'_Process__'):
525 raise ValueError(
'this attribute cannot be deleted')
530 if name
in reg: del reg[name]
532 obj = getattr(self,name)
533 if isinstance(obj,_Labelable):
535 if isinstance(obj,Service):
536 obj._inProcess =
False
540 obj = getattr(self,name)
542 if not isinstance(obj, Sequence)
and not isinstance(obj, Task):
552 if obj._isTaskComponent():
555 if isinstance(obj, _Sequenceable)
or obj._isTaskComponent():
559 del self.__dict__[name]
564 """Similar to __delattr__ but we need different behavior when called from __setattr__"""
568 del self.__dict__[name]
573 """Allows addition of components that do not have to have a label, e.g. Services"""
574 if not isinstance(value,_ConfigureComponent):
576 if not isinstance(value,_Unlabelable):
581 newValue =value.copy()
585 newValue._place(
'',self)
588 if not self.__InExtendCall:
599 if d[name]._isModified:
610 if self.
__isStrict and isinstance(mod, _ModuleSequenceType):
611 d[name] = mod._postProcessFixup(self._cloneToObjectDict)
614 if isinstance(mod,_Labelable):
617 self.
_place(name, mod, self.__outputmodules)
619 self.
_place(name, mod, self.__producers)
621 self.
_place(name, mod, self.__switchproducers)
623 self.
_place(name, mod, self.__filters)
625 self.
_place(name, mod, self.__analyzers)
629 self.
_place(name, mod, self.__paths)
630 except ModuleCloneError
as msg:
632 raise Exception(
"%sThe module %s in path %s is unknown to the process %s." %(context, msg, name, self._Process__name))
636 self.
_place(name, mod, self.__endpaths)
637 except ModuleCloneError
as msg:
639 raise Exception(
"%sThe module %s in endpath %s is unknown to the process %s." %(context, msg, name, self._Process__name))
642 self.
_place(name, mod, self.__sequences)
644 self.
_place(name, mod, self.__esproducers)
646 self.
_place(name, mod, self.__esprefers)
648 self.
_place(name, mod, self.__essources)
651 self.
_place(name, task, self.__tasks)
653 self.
_place(name, mod, self.__aliases)
655 self.
_place(name, mod, self.__psets)
657 self.
_place(name, mod, self.__vpsets)
659 """Allow the source to be referenced by 'source' or by type name"""
661 raise ValueError(
"The label '"+name+
"' can not be used for a Source. Only 'source' is allowed.")
662 if self.__dict__[
'_Process__source']
is not None :
663 del self.__dict__[self.__dict__[
'_Process__source'].type_()]
664 self.__dict__[
'_Process__source'] = mod
665 self.__dict__[mod.type_()] = mod
668 raise ValueError(
"The label '"+name+
"' can not be used for a Looper. Only 'looper' is allowed.")
669 self.__dict__[
'_Process__looper'] = mod
670 self.__dict__[mod.type_()] = mod
672 self.__dict__[
'_Process__subProcess'] = mod
673 self.__dict__[mod.type_()] = mod
675 self.__subProcesses.
append(mod)
677 self.
_place(typeName, mod, self.__services)
678 if typeName
in self.__dict__:
679 self.__dict__[typeName]._inProcess =
False
680 self.__dict__[typeName]=mod
682 moduleName = moduleName.replace(
"/",
".")
683 module = __import__(moduleName)
684 self.
extend(sys.modules[moduleName])
686 """Look in other and find types that we can use"""
688 self.__dict__[
'_Process__InExtendCall'] =
True
691 tasksToAttach = dict()
693 for name
in dir(other):
695 if name.startswith(
'_'):
697 item = getattr(other,name)
698 if name ==
"source" or name ==
"looper":
702 elif isinstance(item,_ModuleSequenceType):
704 elif isinstance(item,Task):
705 tasksToAttach[name] = item
706 elif isinstance(item,_Labelable):
708 if not item.hasLabel_() :
710 elif isinstance(item,Schedule):
712 elif isinstance(item,_Unlabelable):
714 elif isinstance(item,ProcessModifier):
716 elif isinstance(item,ProcessFragment):
720 for name,seq
in six.iteritems(seqs):
721 if id(seq)
not in self._cloneToObjectDict:
724 newSeq = self._cloneToObjectDict[
id(seq)]
725 self.__dict__[name]=newSeq
728 newSeq._place(name,self)
730 for name, task
in six.iteritems(tasksToAttach):
737 self.__dict__[
'_Process__InExtendCall'] =
False
741 for name,item
in items:
742 returnValue +=options.indentation()+typeName+
' '+name+
' = '+item.dumpConfig(options)
747 for name,item
in items:
748 returnValue +=options.indentation()+typeName+
' = '+item.dumpConfig(options)
753 for name,item
in items:
754 if name == item.type_():
756 returnValue +=options.indentation()+typeName+
' '+name+
' = '+item.dumpConfig(options)
760 """return a string containing the equivalent process defined using the old configuration language"""
761 config =
"process "+self.__name+
" = {\n"
810 for name,item
in six.iteritems(self.
psets):
811 config +=options.indentation()+item.configTypeName()+
' '+name+
' = '+item.configValue(options)
812 for name,item
in six.iteritems(self.
vpsets):
813 config +=options.indentation()+
'VPSet '+name+
' = '+item.configValue(options)
815 pathNames = [p.label_()
for p
in self.
schedule]
816 config +=options.indentation()+
'schedule = {'+
','.
join(pathNames)+
'}\n'
828 result +=options.indentation()+
'es_prefer '+item.targetLabel_()+
' = '+item.dumpConfig(options)
834 returnValue += item.dumpPython(options)+
'\n\n'
840 for name,item
in d.items():
841 returnValue +=
'process.'+name+
' = '+item.dumpPython(options)+
'\n\n'
843 for name,item
in sorted(d.items()):
844 returnValue +=
'process.'+name+
' = '+item.dumpPython(options)+
'\n\n'
851 dependencies = item.directDependencies()
852 for module_subfolder, module
in dependencies:
853 module = module +
'_cfi'
854 if options.useSubdirectories
and module_subfolder:
855 module = module_subfolder +
'.' + module
856 if options.targetDirectory
is not None:
857 if options.useSubdirectories
and subfolder:
858 module =
'..' + module
860 module =
'.' + module
861 code +=
'from ' + module +
' import *\n'
864 code += name +
' = ' + item.dumpPython(options)
865 parts[name] = subfolder, code
873 sequence.visit(visitor)
875 raise RuntimeError(
"An entry in sequence "+label +
' has no label')
884 raise RuntimeError(
"An entry in task " + label +
' has not been attached to the process')
896 for label,item
in six.iteritems(processDictionaryOfItems):
898 if isinstance(item, Task):
905 if isinstance(item, Task):
906 raise RuntimeError(
"Failed in a Task visitor. Probably " \
907 "a circular dependency discovered in Task with label " + label)
909 raise RuntimeError(
"Failed in a Sequence visitor. Probably a " \
910 "circular dependency discovered in Sequence with label " + label)
911 for containedItem
in containedItems:
917 if containedItem.hasLabel_():
918 testItem = processDictionaryOfItems.get(containedItem.label_())
919 if testItem
is None or containedItem != testItem:
920 if isinstance(item, Task):
921 raise RuntimeError(
"Task has a label, but using its label to get an attribute" \
922 " from the process yields a different object or None\n"+
923 "label = " + containedItem.label_())
925 raise RuntimeError(
"Sequence has a label, but using its label to get an attribute" \
926 " from the process yields a different object or None\n"+
927 "label = " + containedItem.label_())
928 dependencies[label]=[dep.label_()
for dep
in containedItems
if dep.hasLabel_()]
932 oldDeps = dict(dependencies)
933 for label,deps
in six.iteritems(oldDeps):
935 returnValue[label]=processDictionaryOfItems[label]
937 del dependencies[label]
938 for lb2,deps2
in six.iteritems(dependencies):
939 while deps2.count(label):
945 for name, value
in sorted(six.iteritems(d)):
946 result += value.dumpPythonAs(name,options)+
'\n'
951 for name, value
in sorted(six.iteritems(d)):
952 result[name] = subfolder, value.dumpPythonAs(name, options) +
'\n'
956 """return a string containing the equivalent process defined using python"""
957 specialImportRegistry._reset()
958 header =
"import FWCore.ParameterSet.Config as cms"
959 result =
"process = cms.Process(\""+self.__name+
"\")\n\n"
983 imports = specialImportRegistry.getSpecialImports()
985 header +=
"\n" +
"\n".
join(imports)
990 """return a map of file names to python configuration fragments"""
991 specialImportRegistry._reset()
993 options.isCfg =
False
994 header =
"import FWCore.ParameterSet.Config as cms"
999 result =
'process = cms.Process("' + self.__name +
'")\n\n'
1012 sys.stderr.write(
"error: subprocesses are not supported yet\n\n")
1028 if options.targetDirectory
is not None:
1029 files[options.targetDirectory +
'/__init__.py'] =
''
1031 if options.useSubdirectories:
1032 for sub
in 'psets',
'modules',
'services',
'eventsetup',
'tasks',
'sequences',
'paths':
1033 if options.targetDirectory
is not None:
1034 sub = options.targetDirectory +
'/' + sub
1035 files[sub +
'/__init__.py'] =
''
1038 parts = sorted(parts.items(), key =
lambda nsc: (nsc[1][0].lower()
if nsc[1][0]
else '', nsc[0].lower()))
1040 for (name, (subfolder, code))
in parts:
1041 filename = name +
'_cfi'
1042 if options.useSubdirectories
and subfolder:
1043 filename = subfolder +
'/' + filename
1044 if options.targetDirectory
is not None:
1045 filename = options.targetDirectory +
'/' + filename
1046 result +=
'process.load("%s")\n' % filename
1047 files[filename +
'.py'] = header +
'\n\n' + code
1050 options.isCfg =
True
1053 imports = specialImportRegistry.getSpecialImports()
1054 if len(imports) > 0:
1055 header +=
'\n' +
'\n'.
join(imports)
1056 files[
'-'] = header +
'\n\n' + result
1060 old = getattr(self,label)
1066 for sequenceable
in six.itervalues(self.
sequences):
1067 sequenceable._replaceIfHeldDirectly(old,new)
1068 for sequenceable
in six.itervalues(self.
sequences):
1069 sequenceable.replace(old,new)
1070 for sequenceable
in six.itervalues(self.
paths):
1071 sequenceable.replace(old,new)
1072 for sequenceable
in six.itervalues(self.
endpaths):
1073 sequenceable.replace(old,new)
1075 old = getattr(self,label)
1076 for task
in six.itervalues(self.
tasks):
1077 task.replace(old, new)
1081 old = getattr(self,label)
1083 task.replace(old, new)
1085 """ Replace the item with label 'label' by object 'new' in the process and all sequences/paths/tasks"""
1086 if not hasattr(self,label):
1087 raise LookupError(
"process has no item of label "+label)
1088 setattr(self,label,new)
1090 for name,value
in six.iteritems(itemDict):
1091 value.insertInto(parameterSet, name)
1094 if not item ==
None:
1095 newlabel = item.nameInProcessDesc_(label)
1097 item.insertInto(parameterSet, newlabel)
1098 parameterSet.addVString(tracked, label, vitems)
1101 for name,value
in six.iteritems(itemDict):
1102 value.appendToProcessDescList_(l, name)
1103 value.insertInto(parameterSet, name)
1106 parameterSet.addVString(tracked, label, l)
1108 modules = parameterSet.getVString(tracked, labelModules)
1109 aliases = parameterSet.getVString(tracked, labelAliases)
1110 for name,value
in six.iteritems(itemDict):
1111 value.appendToProcessDescLists_(modules, aliases, name)
1112 value.insertInto(parameterSet, name)
1115 parameterSet.addVString(tracked, labelModules, modules)
1116 parameterSet.addVString(tracked, labelAliases, aliases)
1120 for value
in itemList:
1121 name = value.getProcessName()
1122 newLabel = value.nameInProcessDesc_(name)
1124 pset = value.getSubProcessPSet(parameterSet)
1125 subprocs.append(pset)
1128 parameterSet.addVString(tracked, label, l)
1129 parameterSet.addVPSet(
False,
"subProcesses",subprocs)
1136 for name
in self.
paths_():
1137 scheduledPaths.append(name)
1138 triggerPaths.append(name)
1140 scheduledPaths.append(name)
1141 endpaths.append(name)
1144 pathname = path.label_()
1145 scheduledPaths.append(pathname)
1147 endpaths.append(pathname)
1149 triggerPaths.append(pathname)
1151 task.resolve(self.__dict__)
1153 task.visit(scheduleTaskValidator)
1154 task.visit(nodeVisitor)
1155 processPSet.addVString(
True,
"@end_paths", endpaths)
1156 processPSet.addVString(
True,
"@paths", scheduledPaths)
1158 p = processPSet.newPSet()
1159 p.addVString(
True,
"@trigger_paths", triggerPaths)
1160 processPSet.addPSet(
True,
"@trigger_paths", p)
1166 pathCompositeVisitor =
CompositeVisitor(pathValidator, nodeVisitor, lister)
1167 endpathCompositeVisitor =
CompositeVisitor(endpathValidator, nodeVisitor, lister)
1168 for triggername
in triggerPaths:
1169 iPath = self.
paths_()[triggername]
1170 iPath.resolve(self.__dict__)
1171 pathValidator.setLabel(triggername)
1173 iPath.visit(pathCompositeVisitor)
1174 iPath.insertInto(processPSet, triggername, decoratedList)
1175 for endpathname
in endpaths:
1176 iEndPath = self.
endpaths_()[endpathname]
1177 iEndPath.resolve(self.__dict__)
1178 endpathValidator.setLabel(endpathname)
1180 iEndPath.visit(endpathCompositeVisitor)
1181 iEndPath.insertInto(processPSet, endpathname, decoratedList)
1182 processPSet.addVString(
False,
"@filters_on_endpaths", endpathValidator.filtersOnEndpaths)
1184 def resolve(self,keepUnresolvedSequencePlaceholders=False):
1185 for x
in six.itervalues(self.
paths):
1186 x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1187 for x
in six.itervalues(self.
endpaths):
1188 x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1191 task.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1193 def prune(self,verbose=False,keepUnresolvedSequencePlaceholders=False):
1194 """ Remove clutter from the process that we think is unnecessary:
1195 tracked PSets, VPSets and unused modules and sequences. If a Schedule has been set, then Paths and EndPaths
1196 not in the schedule will also be removed, along with an modules and sequences used only by
1197 those removed Paths and EndPaths. The keepUnresolvedSequencePlaceholders keeps also unresolved TaskPlaceholders."""
1206 self.
resolve(keepUnresolvedSequencePlaceholders)
1208 unneededPaths = set()
1212 usedModules=set(self.
schedule_().moduleNames())
1214 schedNames = set(( x.label_()
for x
in self.
schedule_()))
1215 names = set(self.
paths)
1217 unneededPaths = names - schedNames
1218 for n
in unneededPaths:
1226 pths.extend(six.itervalues(self.
endpaths))
1228 usedModules=set(temp.moduleNames())
1236 for p
in six.itervalues(self.
paths):
1239 for p
in six.itervalues(self.
endpaths):
1242 def removeUnneeded(seqOrTasks, allSequencesOrTasks):
1243 _keepSet = set(( s
for s
in seqOrTasks
if s.hasLabel_()))
1244 _availableSet = set(six.itervalues(allSequencesOrTasks))
1245 _unneededSet = _availableSet-_keepSet
1246 _unneededLabels = []
1247 for s
in _unneededSet:
1248 _unneededLabels.append(s.label_())
1249 delattr(self,s.label_())
1250 return _unneededLabels
1251 unneededSeqLabels = removeUnneeded(seqs, self.
sequences)
1252 unneededTaskLabels = removeUnneeded(tasks, self.
tasks)
1254 print(
"prune removed the following:")
1255 print(
" modules:"+
",".
join(unneededModules))
1256 print(
" tasks:"+
",".
join(unneededTaskLabels))
1257 print(
" sequences:"+
",".
join(unneededSeqLabels))
1258 print(
" paths/endpaths:"+
",".
join(unneededPaths))
1260 moduleNames = set(d.keys())
1261 junk = moduleNames - scheduledNames
1267 """Used by the framework to convert python to C++ objects"""
1268 class ServiceInjectorAdaptor(
object):
1279 class TopLevelPSetAcessorAdaptor(
object):
1283 def __getattr__(self,attr):
1284 return getattr(self.
__ppset,attr)
1285 def getTopPSet_(self,label):
1289 def addPSet(self,tracked,name,ppset):
1290 return self.
__ppset.addPSet(tracked,name,self.__extractPSet(ppset))
1291 def addVPSet(self,tracked,name,vpset):
1292 return self.
__ppset.addVPSet(tracked,name,[self.__extractPSet(x)
for x
in vpset])
1293 def __extractPSet(self,pset):
1294 if isinstance(pset,TopLevelPSetAcessorAdaptor):
1299 processPSet.addString(
True,
"@process_name", self.
name_())
1301 all_modules.update(self.
filters_())
1304 adaptor = TopLevelPSetAcessorAdaptor(processPSet,self)
1317 all_modules_onTasksOrScheduled = { key:value
for key, value
in six.iteritems(all_modules)
if value
in nodeVisitor.modules }
1318 self.
_insertManyInto(adaptor,
"@all_modules", all_modules_onTasksOrScheduled,
True)
1320 all_switches_onTasksOrScheduled = {key:value
for key, value
in six.iteritems(all_switches)
if value
in nodeVisitor.modules }
1325 for pTask
in six.itervalues(self.
tasks):
1326 pTask.visit(processNodeVisitor)
1327 esProducersToEnable = {}
1328 for esProducerName, esProducer
in six.iteritems(self.
es_producers_()):
1329 if esProducer
in nodeVisitor.esProducers
or not (esProducer
in processNodeVisitor.esProducers):
1330 esProducersToEnable[esProducerName] = esProducer
1331 self.
_insertManyInto(adaptor,
"@all_esmodules", esProducersToEnable,
True)
1332 esSourcesToEnable = {}
1333 for esSourceName, esSource
in six.iteritems(self.
es_sources_()):
1334 if esSource
in nodeVisitor.esSources
or not (esSource
in processNodeVisitor.esSources):
1335 esSourcesToEnable[esSourceName] = esSource
1336 self.
_insertManyInto(adaptor,
"@all_essources", esSourcesToEnable,
True)
1339 for serviceName, serviceObject
in six.iteritems(self.
services_()):
1340 if serviceObject
in nodeVisitor.services
or not (serviceObject
in processNodeVisitor.services):
1341 serviceObject.insertInto(ServiceInjectorAdaptor(adaptor,services))
1342 adaptor.addVPSet(
False,
"services",services)
1353 """Prefer this ES source or producer. The argument can
1354 either be an object label, e.g.,
1355 process.prefer(process.juicerProducer) (not supported yet)
1356 or a name of an ESSource or ESProducer
1357 process.prefer("juicer")
1358 or a type of unnamed ESSource or ESProducer
1359 process.prefer("JuicerProducer")
1360 In addition, you can pass as a labelled arguments the name of the Record you wish to
1361 prefer where the type passed is a cms.vstring and that vstring can contain the
1362 name of the C++ types in the Record that are being preferred, e.g.,
1363 #prefer all data in record 'OrangeRecord' from 'juicer'
1364 process.prefer("juicer", OrangeRecord=cms.vstring())
1366 #prefer only "Orange" data in "OrangeRecord" from "juicer"
1367 process.prefer("juicer", OrangeRecord=cms.vstring("Orange"))
1369 #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
1370 ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
1373 if isinstance(esmodule, ESSource)
or isinstance(esmodule, ESProducer):
1374 raise RuntimeError(
"Syntax of process.prefer(process.esmodule) not supported yet")
1375 elif self._findPreferred(esmodule, self.es_producers_(),*args,**kargs)
or \
1376 self._findPreferred(esmodule, self.es_sources_(),*args,**kargs):
1379 raise RuntimeError(
"Cannot resolve prefer for "+repr(esmodule))
1384 typ = d[esname].type_()
1393 for name, value
in six.iteritems(d):
1394 if value.type_() == esname:
1396 raise RuntimeError(
"More than one ES module for "+esname)
1404 if isinstance(process, Process):
1406 elif isinstance(process, str):
1413 raise TypeError(
'a ProcessFragment can only be constructed from an existig Process or from process name')
1415 return [ x
for x
in dir(self.
__process)
if isinstance(getattr(self.
__process, x), _ConfigureComponent) ]
1417 if name ==
'_ProcessFragment__process':
1418 return object.__getattribute__(self,
'_ProcessFragment__process')
1422 if name ==
'_ProcessFragment__process':
1423 object.__setattr__(self, name, value)
1427 if name ==
'_ProcessFragment__process':
1434 """a dictionary with fixed keys"""
1436 raise AttributeError(
"An FilteredStream defintion cannot be modified after creation.")
1437 _blocked_attribute = property(_blocked_attribute)
1438 __setattr__ = __delitem__ = __setitem__ = clear = _blocked_attribute
1439 pop = popitem = setdefault = update = _blocked_attribute
1441 new = dict.__new__(cls)
1442 dict.__init__(new, *args, **kw)
1443 keys = sorted(kw.keys())
1444 if keys != [
'content',
'dataTier',
'name',
'paths',
'responsible',
'selectEvents']:
1445 raise ValueError(
"The needed parameters are: content, dataTier, name, paths, responsible, selectEvents")
1446 if not isinstance(kw[
'name'],str):
1447 raise ValueError(
"name must be of type string")
1448 if not isinstance(kw[
'content'], vstring)
and not isinstance(kw[
'content'],str):
1449 raise ValueError(
"content must be of type vstring or string")
1450 if not isinstance(kw[
'dataTier'], string):
1451 raise ValueError(
"dataTier must be of type string")
1452 if not isinstance(kw[
'selectEvents'], PSet):
1453 raise ValueError(
"selectEvents must be of type PSet")
1454 if not isinstance(kw[
'paths'],(tuple, Path)):
1455 raise ValueError(
"'paths' must be a tuple of paths")
1460 return "FilteredStream object: %s" %self[
"name"]
1465 """Allows embedding another process within a parent process. This allows one to
1466 chain processes together directly in one cmsRun job rather than having to run
1467 separate jobs that are connected via a temporary file.
1469 def __init__(self,process, SelectEvents = untracked.PSet(), outputCommands = untracked.vstring()):
1472 if not isinstance(process, Process):
1473 raise ValueError(
"the 'process' argument must be of type cms.Process")
1474 if not isinstance(SelectEvents,PSet):
1475 raise ValueError(
"the 'SelectEvents' argument must be of type cms.untracked.PSet")
1476 if not isinstance(outputCommands,vstring):
1477 raise ValueError(
"the 'outputCommands' argument must be of type cms.untracked.vstring")
1482 out =
"parentProcess"+
str(
hash(self))+
" = process\n"
1484 out +=
"childProcess = process\n"
1485 out +=
"process = parentProcess"+
str(
hash(self))+
"\n"
1501 process._placeSubProcess(
'subProcess',self)
1503 topPSet = parameterSet.newPSet()
1505 subProcessPSet = parameterSet.newPSet()
1508 subProcessPSet.addPSet(
False,
"process",topPSet)
1509 return subProcessPSet
1512 """Helper class for Modifier that takes key/value pairs and uses them to reset parameters of the object"""
1517 for k
in six.iterkeys(self.
__args):
1519 params[k] = getattr(obj,k)
1521 for k
in six.iterkeys(self.
__args):
1523 setattr(obj,k,params[k])
1529 raise KeyError(
"Unknown parameter name "+key+
" specified while calling Modifier")
1532 """A helper base class for _AndModifier, _InvertModifier, and _OrModifier to contain the common code"""
1538 Modifier._toModifyCheck(obj,func,**kw)
1539 if not self._isChosen():
1541 Modifier._toModify(obj,func,**kw)
1543 Modifier._toReplaceWithCheck(toObj,fromObj)
1544 if not self._isChosen():
1546 Modifier._toReplaceWith(toObj,fromObj)
1548 """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1549 This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1550 In order to work, the value returned from this function must be assigned to a uniquely named variable."""
1560 """A modifier which only applies if multiple Modifiers are chosen"""
1562 super(_AndModifier,self).
__init__(lhs, rhs)
1567 """A modifier which only applies if a Modifier is not chosen"""
1569 super(_InvertModifier,self).
__init__(lhs)
1574 """A modifier which only applies if at least one of multiple Modifiers is chosen"""
1576 super(_OrModifier,self).
__init__(lhs, rhs)
1582 """This class is used to define standard modifications to a Process.
1583 An instance of this class is declared to denote a specific modification,e.g. era2017 could
1584 reconfigure items in a process to match our expectation of running in 2017. Once declared,
1585 these Modifier instances are imported into a configuration and items that need to be modified
1586 are then associated with the Modifier and with the action to do the modification.
1587 The registered modifications will only occur if the Modifier was passed to
1588 the cms.Process' constructor.
1594 """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1595 This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1596 In order to work, the value returned from this function must be assigned to a uniquely named variable.
1601 if func
is not None and len(kw) != 0:
1602 raise TypeError(
"toModify takes either two arguments or one argument and key/value pairs")
1604 """This is used to register an action to be performed on the specific object. Two different forms are allowed
1605 Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1606 that will be the object passed in as the first argument.
1607 Form 2: A list of parameter name, value pairs can be passed
1608 mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1609 This form can also be used to remove a parameter by passing the value of None
1610 #remove the parameter foo.fred
1611 mod.toModify(foo, fred = None)
1612 Additionally, parameters embedded within PSets can also be modified using a dictionary
1613 #change foo.fred.pebbles to 3 and foo.fred.friend to "barney"
1614 mod.toModify(foo, fred = dict(pebbles = 3, friend = "barney)) )
1616 Modifier._toModifyCheck(obj,func,**kw)
1619 Modifier._toModify(obj,func,**kw)
1622 if func
is not None:
1629 if not isinstance(fromObj, type(toObj)):
1630 raise TypeError(
"toReplaceWith requires both arguments to be the same class type")
1632 """If the Modifier is chosen the internals of toObj will be associated with the internals of fromObj
1634 Modifier._toReplaceWithCheck(toObj,fromObj)
1637 Modifier._toReplaceWith(toObj,fromObj)
1640 if isinstance(fromObj,_ModuleSequenceType):
1641 toObj._seq = fromObj._seq
1642 toObj._tasks = fromObj._tasks
1643 elif isinstance(fromObj,Task):
1644 toObj._collection = fromObj._collection
1645 elif isinstance(fromObj,_Parameterizable):
1647 for p
in toObj.parameterNames_():
1649 for p
in fromObj.parameterNames_():
1650 setattr(toObj,p,getattr(fromObj,p))
1651 if isinstance(fromObj,_TypedParameterizable):
1652 toObj._TypedParameterizable__type = fromObj._TypedParameterizable__type
1655 raise TypeError(
"toReplaceWith does not work with type "+
str(type(toObj)))
1658 """Should only be called by cms.Process instances"""
1669 return self == other
1673 """A Modifier made up of a list of Modifiers
1679 """Should only be called by cms.Process instances
1680 applies list of accumulated changes to the process"""
1682 m._applyNewProcessModifiers(process)
1684 """Should only be called by cms.Process instances"""
1691 """Creates a new ModifierChain which is a copy of
1692 this ModifierChain but excludes any Modifier or
1693 ModifierChain in the list toExclude.
1694 The exclusion is done recursively down the chain.
1698 if m
not in toExclude:
1700 if isinstance(m,ModifierChain):
1701 s = m.__copyIfExclude(toExclude)
1717 if m._isOrContains(other):
1722 """A class used by a Modifier to affect an entire Process instance.
1723 When a Process 'loads' a module containing a ProcessModifier, that
1724 ProcessModifier will be applied to the Process if and only if the
1725 Modifier passed to the constructor has been chosen.
1737 if __name__==
"__main__":
1742 newString = ( x
for x
in newString.split(
'\n')
if len(x) > 0)
1743 oldString = [ x
for x
in oldString.split(
'\n')
if len(x) > 0]
1747 if oldStringLine >= len(oldString):
1750 if l == oldString[oldStringLine]:
1754 return "\n".
join( diff )
1757 """Has same interface as the C++ object that creates PSets
1762 self.
values[label]=(tracked,value)
1764 pair = self.
values[label]
1765 if pair[0] != tracked:
1766 raise Exception(
"Asked for %s parameter '%s', but it is %s" % (
"tracked" if tracked
else "untracked",
1768 "tracked" if pair[0]
else "untracked"))
1829 super(SwitchProducerTest,self).
__init__(
1831 test1 =
lambda: (
True, -10),
1832 test2 =
lambda: (
True, -9),
1833 test3 =
lambda: (
True, -8),
1834 test4 =
lambda: (
True, -7)
1836 specialImportRegistry.registerSpecialImportForType(SwitchProducerTest,
"from test import SwitchProducerTest")
1840 """Nothing to do """
1844 self.assertEqual(len(p.parameterNames_()),0)
1846 self.assertTrue(
'a' in p.parameterNames_())
1847 self.assertEqual(p.a.value(), 1)
1849 self.assertEqual(p.a.value(), 10)
1851 self.assertEqual(p.a.value(), 1)
1852 self.assertFalse(p.a.isTracked())
1853 p.a = untracked.int32(1)
1854 self.assertEqual(p.a.value(), 1)
1855 self.assertFalse(p.a.isTracked())
1857 self.assertEqual(p.foo.value(), 10)
1858 self.assertEqual(p.bar.value(),1.0)
1859 self.assertFalse(p.bar.isTracked())
1860 self.assertRaises(TypeError,setattr,(p,
'c',1))
1862 self.assertEqual(p.a.foo.value(),10)
1863 self.assertEqual(p.a.bar.value(),1.0)
1865 self.assertEqual(p.b.fii.value(),1)
1866 self.assertFalse(p.b.isTracked())
1871 self.assertEqual(p.a.value(),11)
1873 self.assertEqual(p.a.value(),12)
1874 self.assertEqual(v.value(),12)
1880 self.assertNotEqual(p.b,other.b)
1885 self.assertTrue(
'a' in p.analyzers_() )
1886 self.assertTrue(
'a' in p.analyzers)
1887 p.add_(
Service(
"MessageLogger"))
1888 self.assertTrue(
'MessageLogger' in p.services_())
1889 self.assertEqual(p.MessageLogger.type_(),
"MessageLogger")
1891 self.assertTrue(
'Tracer' in p.services_())
1892 self.assertRaises(TypeError, setattr, *(p,
'b',
"this should fail"))
1893 self.assertRaises(TypeError, setattr, *(p,
'bad',
Service(
"MessageLogger")))
1894 self.assertRaises(ValueError, setattr, *(p,
'bad',
Source(
"PoolSource")))
1896 self.assertEqual(p.out.type_(),
'Outer')
1897 self.assertTrue(
'out' in p.outputModules_() )
1900 self.assertTrue(
'geom' in p.es_sources_())
1902 self.assertTrue(
'ConfigDB' in p.es_sources_())
1905 self.assertTrue(
'aliasfoo1' in p.aliases_())
1909 def __init__(self,*arg,**args):
1910 for name
in six.iterkeys(args):
1911 self.__dict__[name]=args[name]
1930 self.assertEqual(p.a.type_(),
"MyAnalyzer")
1931 self.assertEqual(p.a.label_(),
"a")
1932 self.assertRaises(AttributeError,getattr,p,
'b')
1933 self.assertEqual(p.Full.type_(),
"Full")
1934 self.assertEqual(
str(p.c),
'a')
1935 self.assertEqual(
str(p.d),
'a')
1950 self.assertRaises(ValueError, p1.extend, z1)
1959 aaa=copy.deepcopy(a),
1960 s4=copy.deepcopy(s3),
1967 self.assertEqual(p2.s4.label_(),
"s4")
1969 self.assertRaises(ValueError, p2.s4.setLabel,
"foo")
1970 p2.s4.setLabel(
"s4")
1971 p2.s4.setLabel(
None)
1972 p2.s4.setLabel(
"foo")
1973 p2._Process__setObjectLabel(p2.s4,
"foo")
1974 p2._Process__setObjectLabel(p2.s4,
None)
1975 p2._Process__setObjectLabel(p2.s4,
"bar")
1982 self.assertRaises(ValueError, p.extend, FromArg(a =
EDProducer(
"YourProducer")))
1983 self.assertRaises(ValueError, p.extend, FromArg(a =
EDAlias()))
1984 self.assertRaises(ValueError, p.__setattr__,
"a",
EDAlias())
1990 self.assertRaises(ValueError, p.extend, FromArg(a =
EDProducer(
"YourProducer")))
1991 self.assertRaises(ValueError, p.extend, FromArg(a =
EDAlias()))
1992 self.assertRaises(ValueError, p.__setattr__,
"a",
EDAlias())
1996 """import FWCore.ParameterSet.Config as cms\n\nprocess = cms.Process("test")
1998 process.maxEvents = cms.untracked.PSet(
1999 input = cms.optional.untracked.int32,
2000 output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
2003 process.maxLuminosityBlocks = cms.untracked.PSet(
2004 input = cms.untracked.int32(-1)
2007 process.options = cms.untracked.PSet(
2008 FailPath = cms.untracked.vstring(),
2009 IgnoreCompletely = cms.untracked.vstring(),
2010 Rethrow = cms.untracked.vstring(),
2011 SkipEvent = cms.untracked.vstring(),
2012 allowUnscheduled = cms.obsolete.untracked.bool,
2013 canDeleteEarly = cms.untracked.vstring(),
2014 emptyRunLumiMode = cms.obsolete.untracked.string,
2015 eventSetup = cms.untracked.PSet(
2016 forceNumberOfConcurrentIOVs = cms.untracked.PSet(
2019 numberOfConcurrentIOVs = cms.untracked.uint32(1)
2021 fileMode = cms.untracked.string('FULLMERGE'),
2022 forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
2023 makeTriggerResults = cms.obsolete.untracked.bool,
2024 numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1),
2025 numberOfConcurrentRuns = cms.untracked.uint32(1),
2026 numberOfStreams = cms.untracked.uint32(0),
2027 numberOfThreads = cms.untracked.uint32(1),
2028 printDependencies = cms.untracked.bool(False),
2029 sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
2030 throwIfIllegalParameter = cms.untracked.bool(True),
2031 wantSummary = cms.untracked.bool(False)
2044 """process.a = cms.EDAnalyzer("MyAnalyzer")
2045 process.s = cms.Sequence(process.a)
2046 process.r = cms.Sequence(process.s)
2047 process.p = cms.Path(process.a)
2048 process.p2 = cms.Path(process.s)
2049 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2061 """process.a = cms.EDAnalyzer("MyAnalyzer")
2062 process.b = cms.EDAnalyzer("YourAnalyzer")
2063 process.r = cms.Sequence(process.a)
2064 process.s = cms.Sequence(process.r)
2065 process.p = cms.Path(process.a)
2066 process.p2 = cms.Path(process.r)
2067 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2078 """process.a = cms.EDAnalyzer("MyAnalyzer")
2079 process.r = cms.Sequence((process.a))
2080 process.p = cms.Path(process.a)
2081 process.p2 = cms.Path(process.r)
2082 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2098 p.task3.add(p.task1)
2102 p.p2 =
Path(p.r, p.task1, p.task2)
2103 p.schedule =
Schedule(p.p2,p.p,tasks=[p.task3,p.task4, p.task5])
2106 """process.b = cms.EDProducer("bProducer")
2107 process.c = cms.EDProducer("cProducer")
2108 process.d = cms.EDProducer("dProducer")
2109 process.e = cms.EDProducer("eProducer")
2110 process.f = cms.EDProducer("fProducer")
2111 process.g = cms.EDProducer("gProducer")
2112 process.a = cms.EDAnalyzer("MyAnalyzer")
2113 process.task5 = cms.Task()
2114 process.task1 = cms.Task(process.task5)
2115 process.task3 = cms.Task(process.task1)
2116 process.task2 = cms.Task(process.c, process.task3)
2117 process.task4 = cms.Task(process.f, process.task2)
2118 process.r = cms.Sequence((process.a))
2119 process.p = cms.Path(process.a)
2120 process.p2 = cms.Path(process.r, process.task1, process.task2)
2121 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task3, process.task4, process.task5])""")
2128 p.task1 =
Task(p.d, p.e)
2129 task2 =
Task(p.f, p.g)
2130 p.schedule =
Schedule(tasks=[p.task1,task2])
2133 """process.d = cms.EDProducer("dProducer")
2134 process.e = cms.EDProducer("eProducer")
2135 process.f = cms.EDProducer("fProducer")
2136 process.g = cms.EDProducer("gProducer")
2137 process.task1 = cms.Task(process.d, process.e)
2138 process.schedule = cms.Schedule(tasks=[cms.Task(process.f, process.g), process.task1])""")
2144 """process.schedule = cms.Schedule()""")
2153 d=process.dumpPython()
2155 """process.a = cms.EDProducer("A")
2156 process.s2 = cms.Sequence(process.a)""")
2166 d=process.dumpPython()
2168 """process.a = cms.EDProducer("A")
2169 process.s2 = cms.Sequence(process.a+(process.a+process.a))""")
2194 p.p =
Path(p.c+s+p.a)
2195 p.p2 =
Path(p.c+p.s4+p.a)
2201 self.assertTrue(visitor1.modules == set([old,old2,p.b,p.c]))
2203 p.globalReplace(
"a",new)
2204 p.globalReplace(
"d",new2)
2207 self.assertTrue(visitor2.modules == set([new,new2,p.b,p.c]))
2208 self.assertEqual(p.p.dumpPython()[:-1],
"cms.Path(process.c+process.a+process.b+process.a, cms.Task(process.d))")
2210 p.p2.visit(visitor_p2)
2211 self.assertTrue(visitor_p2.modules == set([new,new2,p.b,p.c]))
2212 self.assertEqual(p.p2.dumpPython()[:-1],
"cms.Path(process.c+process.s4+process.a)")
2214 p.e3.visit(visitor3)
2215 self.assertTrue(visitor3.modules == set([new,new2,p.b,p.c]))
2217 p.s4.visit(visitor4)
2218 self.assertTrue(visitor4.modules == set([new,new2,p.b]))
2219 self.assertEqual(p.s4.dumpPython()[:-1],
"cms.Sequence(process.a+process.b, cms.Task(process.d))")
2221 p.t1.visit(visitor5)
2222 self.assertTrue(visitor5.modules == set([new2]))
2224 listOfTasks =
list(p.schedule._tasks)
2225 listOfTasks[0].visit(visitor6)
2226 self.assertTrue(visitor6.modules == set([new2]))
2234 self.assertEqual(
str(p.s),
'a+b')
2235 self.assertEqual(p.s.label_(),
's')
2236 path =
Path(p.c+p.s)
2237 self.assertEqual(
str(path),
'c+a+b')
2238 p._validateSequence(path,
'p1')
2240 p2 =
Path(p.c+p.s*notInProcess)
2241 self.assertRaises(RuntimeError, p._validateSequence, p2,
'p2')
2251 self.assertRaises(ValueError, p.__setattr__,
"y", testseq)
2255 self.assertFalse(service._inProcess)
2258 self.assertTrue(service._inProcess)
2260 process.d = service2
2261 self.assertFalse(service._inProcess)
2262 self.assertTrue(service2._inProcess)
2264 self.assertFalse(service2._inProcess)
2284 testTask1 =
Task(edproducer, edfilter)
2285 self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
2286 testTask1.add(essource, service)
2287 testTask1.add(essource, esproducer)
2288 testTask1.add(testTask2)
2289 coll = testTask1._collection
2290 self.assertTrue(edproducer
in coll)
2291 self.assertTrue(edfilter
in coll)
2292 self.assertTrue(service
in coll)
2293 self.assertTrue(essource
in coll)
2294 self.assertTrue(esproducer
in coll)
2295 self.assertTrue(testTask2
in coll)
2296 self.assertTrue(len(coll) == 6)
2297 self.assertTrue(len(testTask2._collection) == 0)
2301 taskContents.append(i)
2302 self.assertTrue(taskContents == [edproducer, edfilter, essource, service, esproducer, testTask2])
2307 process.mproducer = edproducer
2308 process.mproducer2 = edproducer2
2309 process.mfilter = edfilter
2310 process.messource = essource
2311 process.mesproducer = esproducer
2314 testTask3 =
Task(edproducer, edproducer2)
2315 testTask1.add(testTask3)
2316 process.myTask1 = testTask1
2323 testTask1.visit(visitor)
2324 self.assertTrue(l == set([
'mesproducer',
'mproducer',
'mproducer2',
'mfilter',
'd',
'messource']))
2325 l2 = testTask1.moduleNames
2326 self.assertTrue(l == set([
'mesproducer',
'mproducer',
'mproducer2',
'mfilter',
'd',
'messource']))
2328 testTask4 =
Task(edproducer3)
2330 self.assertRaises(RuntimeError, testTask4.visit, visitor)
2332 process.myTask4 = testTask4
2333 self.assertTrue(
False)
2334 except RuntimeError:
2337 testTask5 =
Task(service3)
2339 self.assertRaises(RuntimeError, testTask5.visit, visitor)
2341 process.myTask5 = testTask5
2342 self.assertTrue(
False)
2343 except RuntimeError:
2346 process.d = service3
2347 process.myTask5 = testTask5
2350 expectedDict = {
'myTask1' : testTask1,
'myTask5' : testTask5 }
2352 self.assertTrue(process.tasks == expectedFixedDict)
2353 self.assertTrue(process.tasks[
'myTask1'] == testTask1)
2354 self.assertTrue(process.myTask1 == testTask1)
2358 process.mproducer2 = edproducer4
2362 testTask1.visit(visitor1)
2363 l.sort(key=
lambda mod: mod.__str__())
2364 expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=
lambda mod: mod.__str__())
2365 self.assertTrue(expectedList == l)
2366 process.myTask6 =
Task()
2367 process.myTask7 =
Task()
2368 process.mproducer8 = edproducer8
2369 process.myTask8 =
Task(process.mproducer8)
2370 process.myTask6.add(process.myTask7)
2371 process.myTask7.add(process.myTask8)
2372 process.myTask1.add(process.myTask6)
2373 process.myTask8.add(process.myTask5)
2375 testDict = process._itemsInDependencyOrder(process.tasks)
2376 expectedLabels = [
"myTask5",
"myTask8",
"myTask7",
"myTask6",
"myTask1"]
2377 expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
2379 for testLabel, testTask
in testDict.items():
2380 self.assertTrue(testLabel == expectedLabels[index])
2381 self.assertTrue(testTask == expectedTasks[index])
2387 expectedPythonDump =
'cms.Task(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
2388 self.assertTrue(pythonDump == expectedPythonDump)
2390 process.myTask5 =
Task()
2391 process.myTask100 =
Task()
2392 process.mproducer9 = edproducer9
2393 sequence1 =
Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
2394 sequence2 =
Sequence(process.mproducer8 + process.mproducer9)
2395 process.sequence3 =
Sequence((process.mproducer8 + process.mfilter))
2397 process.path1 =
Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
2398 process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
2399 process.path11 =
Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
2400 process.path2 =
Path(process.mproducer)
2401 process.path3 =
Path(process.mproducer9+process.mproducer8,testTask2)
2403 self.assertTrue(process.path1.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask5)\n')
2405 self.assertTrue(process.path11.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask100, process.myTask5)\n')
2410 process.path1.visit(nameVisitor)
2411 self.assertTrue(l == set([
'mproducer',
'd',
'mesproducer',
None,
'mproducer9',
'mproducer8',
'messource',
'mproducer2',
'mfilter']))
2412 self.assertTrue(process.path1.moduleNames() == set([
'mproducer',
'd',
'mesproducer',
None,
'mproducer9',
'mproducer8',
'messource',
'mproducer2',
'mfilter']))
2416 process.path21 = process.path11.copy()
2417 process.path21.replace(process.mproducer, process.mproducer10)
2419 self.assertTrue(process.path11.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.Task(), cms.Task(process.None, process.mproducer), process.myTask1, process.myTask100, process.myTask5)\n')
2428 self.assertTrue(process.path21.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.sequence3, cms.Task(), cms.Task(process.None, process.mproducer10), cms.Task(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer10, process.mproducer2, process.myTask6), process.myTask100, process.myTask5)\n')
2430 process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
2431 self.assertTrue(process.path22.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.Task(), cms.Task(process.None, process.mproducer10), cms.Task(process.messource, process.mproducer10, process.mproducer2, process.myTask6), process.myTask100, process.myTask5)\n')
2433 process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
2434 self.assertTrue(process.path23.dumpPython(
PrintOptions()) ==
'cms.Path(process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.Task(), cms.Task(process.None), cms.Task(process.mproducer2, process.myTask6), process.myTask100, process.myTask5)\n')
2443 process.path24 =
Path(process.a+process.b+process.c+process.d)
2444 process.path25 = process.path24.copyAndExclude([process.a,process.b,process.c])
2445 self.assertTrue(process.path25.dumpPython() ==
'cms.Path(process.d)\n')
2450 process.path200.replace(process.c,process.b)
2451 process.path200.replace(process.e,process.f)
2452 self.assertEqual(process.path200.dumpPython(),
"cms.EndPath(process.b, cms.Task(process.f))\n")
2453 process.path200.replace(process.b,process.c)
2454 process.path200.replace(process.f,process.e)
2455 self.assertEqual(process.path200.dumpPython(),
"cms.EndPath(process.c, cms.Task(process.e))\n")
2456 process.path200.replace(process.c,process.a)
2457 process.path200.replace(process.e,process.g)
2458 self.assertEqual(process.path200.dumpPython(),
"cms.EndPath(process.a, cms.Task(process.g))\n")
2459 process.path200.replace(process.a,process.c)
2460 process.path200.replace(process.g,process.e)
2461 self.assertEqual(process.path200.dumpPython(),
"cms.EndPath(process.c, cms.Task(process.e))\n")
2472 self.assertEqual(
str(path),
'a+b+c')
2473 path =
Path(p.a*p.b+p.c)
2474 self.assertEqual(
str(path),
'a+b+c')
2477 path =
Path(p.a+ p.b*p.c)
2478 self.assertEqual(
str(path),
'a+b+c')
2479 path =
Path(p.a*(p.b+p.c))
2480 self.assertEqual(
str(path),
'a+b+c')
2481 path =
Path(p.a*(p.b+~p.c))
2483 self.assertEqual(
str(path),
'a+b+~c')
2485 self.assertRaises(TypeError,Path,p.es)
2488 self.assertTrue(t.dumpPython(
PrintOptions()) ==
'cms.Path()\n')
2491 self.assertTrue(t.dumpPython(
PrintOptions()) ==
'cms.Path(process.a)\n')
2494 self.assertTrue(t.dumpPython(
PrintOptions()) ==
'cms.Path(cms.Task())\n')
2497 self.assertTrue(t.dumpPython(
PrintOptions()) ==
'cms.Path(process.a, cms.Task())\n')
2502 self.assertTrue(t.dumpPython(
PrintOptions()) ==
'cms.Path(process.a, cms.Task(), process.t1)\n')
2513 p.path =
Path(p.a*p.b)
2514 lookuptable = {
id(a): p.a,
id(b): p.b}
2518 self.assertEqual(
str(path),
str(p.path))
2539 path =
Path(a * c * seq1, task1)
2541 self.assertTrue(path.contains(a))
2542 self.assertFalse(path.contains(b))
2543 self.assertTrue(path.contains(c))
2544 self.assertFalse(path.contains(d))
2545 self.assertTrue(path.contains(e))
2546 self.assertFalse(path.contains(f))
2547 self.assertTrue(path.contains(g))
2550 self.assertFalse(endpath.contains(b))
2551 self.assertTrue(endpath.contains(i))
2554 self.assertFalse(seq.contains(b))
2555 self.assertTrue(seq.contains(c))
2558 task =
Task(j, k, task2)
2559 self.assertFalse(task.contains(b))
2560 self.assertTrue(task.contains(j))
2561 self.assertTrue(task.contains(k))
2562 self.assertTrue(task.contains(l))
2566 sch =
Schedule(path, path2, tasks=[task,task3])
2567 self.assertFalse(sch.contains(b))
2568 self.assertTrue(sch.contains(a))
2569 self.assertTrue(sch.contains(c))
2570 self.assertTrue(sch.contains(e))
2571 self.assertTrue(sch.contains(g))
2572 self.assertTrue(sch.contains(n))
2573 self.assertTrue(sch.contains(j))
2574 self.assertTrue(sch.contains(k))
2575 self.assertTrue(sch.contains(l))
2576 self.assertTrue(sch.contains(m))
2589 self.assertEqual(s[0],p.path1)
2590 self.assertEqual(s[1],p.path2)
2592 self.assertTrue(
'b' in p.schedule.moduleNames())
2593 self.assertTrue(hasattr(p,
'b'))
2594 self.assertTrue(hasattr(p,
'c'))
2595 self.assertTrue(hasattr(p,
'd'))
2596 self.assertTrue(hasattr(p,
'path1'))
2597 self.assertTrue(hasattr(p,
'path2'))
2598 self.assertTrue(hasattr(p,
'path3'))
2600 self.assertTrue(
'b' in p.schedule.moduleNames())
2601 self.assertTrue(hasattr(p,
'b'))
2602 self.assertTrue(
not hasattr(p,
'c'))
2603 self.assertTrue(
not hasattr(p,
'd'))
2604 self.assertTrue(hasattr(p,
'path1'))
2605 self.assertTrue(hasattr(p,
'path2'))
2606 self.assertTrue(
not hasattr(p,
'path3'))
2608 self.assertTrue(len(p.schedule._tasks) == 0)
2622 p.task2 =
Task(p.f, p.Tracer)
2623 s =
Schedule(p.path1,p.path2,tasks=[p.task1,p.task2,p.task1])
2624 self.assertEqual(s[0],p.path1)
2625 self.assertEqual(s[1],p.path2)
2626 self.assertTrue(len(s._tasks) == 2)
2627 self.assertTrue(p.task1
in s._tasks)
2628 self.assertTrue(p.task2
in s._tasks)
2629 listOfTasks =
list(s._tasks)
2630 self.assertTrue(len(listOfTasks) == 2)
2631 self.assertTrue(p.task1 == listOfTasks[0])
2632 self.assertTrue(p.task2 == listOfTasks[1])
2634 self.assertTrue(
'b' in p.schedule.moduleNames())
2639 process2.path1 =
Path(process2.a)
2640 process2.task1 =
Task(process2.e)
2641 process2.schedule =
Schedule(process2.path1,tasks=process2.task1)
2642 listOfTasks =
list(process2.schedule._tasks)
2643 self.assertTrue(listOfTasks[0] == process2.task1)
2647 self.assertEqual(s2[0],p.path1)
2648 self.assertEqual(s2[1],p.path2)
2649 self.assertTrue(len(s2._tasks) == 2)
2650 self.assertTrue(p.task1
in s2._tasks)
2651 self.assertTrue(p.task2
in s2._tasks)
2652 listOfTasks =
list(s2._tasks)
2653 self.assertTrue(len(listOfTasks) == 2)
2654 self.assertTrue(p.task1 == listOfTasks[0])
2655 self.assertTrue(p.task2 == listOfTasks[1])
2657 names = s.moduleNames()
2658 self.assertTrue(names == set([
'a',
'b',
'e',
'Tracer',
'f']))
2664 self.assertRaises(RuntimeError,
lambda : p.setSchedule_(s) )
2673 self.assertTrue(
'a' in s.moduleNames())
2674 self.assertTrue(
'b' in s.moduleNames())
2675 self.assertTrue(
'c' in s.moduleNames())
2679 self.assertTrue(
'a' in s.moduleNames())
2680 self.assertTrue(
'b' in s.moduleNames())
2681 self.assertTrue(
'c' in s.moduleNames())
2690 self.assertTrue(p.schedule
is None)
2693 self.assertEqual(pths[keys[0]],p.path1)
2694 self.assertEqual(pths[keys[1]],p.path2)
2696 self.assertTrue(hasattr(p,
'a'))
2697 self.assertTrue(hasattr(p,
'b'))
2698 self.assertTrue(
not hasattr(p,
'c'))
2699 self.assertTrue(hasattr(p,
'path1'))
2700 self.assertTrue(hasattr(p,
'path2'))
2709 self.assertTrue(p.schedule
is None)
2712 self.assertEqual(pths[keys[1]],p.path1)
2713 self.assertEqual(pths[keys[0]],p.path2)
2720 self.assertEqual(p.modu.a.value(),1)
2721 self.assertEqual(p.modu.b.value(),2)
2726 self.assertTrue(
not a.isModified())
2728 self.assertTrue(a.isModified())
2730 self.assertEqual(p.a.a1.value(), 1)
2734 self.assertEqual(p.a.a1.value(), 2)
2743 self.assertRaises(ValueError, EDProducer,
'C', ps1, ps2)
2744 self.assertRaises(ValueError, EDProducer,
'C', ps1, a=
int32(3))
2748 self.assertEqual(p.options.numberOfThreads.value(),1)
2749 p.options.numberOfThreads = 8
2750 self.assertEqual(p.options.numberOfThreads.value(),8)
2752 self.assertEqual(p.options.numberOfThreads.value(),1)
2753 p.options = dict(numberOfStreams =2,
2755 self.assertEqual(p.options.numberOfThreads.value(),2)
2756 self.assertEqual(p.options.numberOfStreams.value(),2)
2760 p.maxEvents.input = 10
2761 self.assertEqual(p.maxEvents.input.value(),10)
2763 p.maxEvents.output = 10
2764 self.assertEqual(p.maxEvents.output.value(),10)
2766 p.maxEvents.output =
PSet(out=untracked.int32(10))
2767 self.assertEqual(p.maxEvents.output.out.value(), 10)
2769 p.maxEvents = untracked.PSet(input = untracked.int32(5))
2770 self.assertEqual(p.maxEvents.input.value(), 5)
2779 p.bars.foos =
'Foosball'
2780 self.assertEqual(p.bars.foos,
InputTag(
'Foosball'))
2781 p.p =
Path(p.foos*p.bars)
2783 p.add_(
Service(
"MessageLogger"))
2789 p.prefer(
"ForceSource")
2792 """process.juicer = cms.ESProducer("JuicerProducer")
2793 process.ForceSource = cms.ESSource("ForceSource")
2794 process.prefer("ForceSource")
2795 process.prefer("juicer")""")
2796 p.prefer(
"juicer",fooRcd=
vstring(
"Foo"))
2798 """process.juicer = cms.ESProducer("JuicerProducer")
2799 process.ForceSource = cms.ESSource("ForceSource")
2800 process.prefer("ForceSource")
2801 process.prefer("juicer",
2802 fooRcd = cms.vstring('Foo')
2817 self.assertEqual(process.m.p.i.value(), 4)
2827 subProcess.p =
Path(subProcess.a)
2828 subProcess.add_(
Service(
"Foo"))
2829 process.addSubProcess(
SubProcess(subProcess))
2830 d = process.dumpPython()
2831 equalD =
"""parentProcess = process
2832 process.a = cms.EDProducer("A")
2833 process.Foo = cms.Service("Foo")
2834 process.p = cms.Path(process.a)
2835 childProcess = process
2836 process = parentProcess
2837 process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = cms.untracked.PSet(
2838 ), outputCommands = cms.untracked.vstring()))"""
2839 equalD = equalD.replace(
"parentProcess",
"parentProcess"+
str(
hash(process.subProcesses_()[0])))
2842 process.fillProcessDesc(p)
2843 self.assertEqual((
True,[
'a']),p.values[
"subProcesses"][1][0].values[
"process"][1].values[
'@all_modules'])
2844 self.assertEqual((
True,[
'p']),p.values[
"subProcesses"][1][0].values[
"process"][1].values[
'@paths'])
2845 self.assertEqual({
'@service_type':(
True,
'Foo')}, p.values[
"subProcesses"][1][0].values[
"process"][1].values[
"services"][1][0].values)
2855 proc.fillProcessDesc(p)
2856 self.assertEqual((
True,1),p.values[
"ref"][1].values[
"a"])
2857 self.assertEqual((
True,1),p.values[
"ref3"][1].values[
"a"])
2858 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"a"])
2859 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"b"][1].values[
"a"])
2860 self.assertEqual((
True,1),p.values[
"ref4"][1][0].values[
"a"])
2861 self.assertEqual((
True,1),p.values[
"ref4"][1][1].values[
"a"])
2871 proc.s =
Sequence(proc.a + proc.sp)
2872 proc.t =
Task(proc.a, proc.sp)
2874 proc.p.associate(proc.t)
2876 proc.fillProcessDesc(p)
2877 self.assertEqual((
True,
"EDProducer"), p.values[
"sp"][1].values[
"@module_edm_type"])
2878 self.assertEqual((
True,
"SwitchProducer"), p.values[
"sp"][1].values[
"@module_type"])
2879 self.assertEqual((
True,
"sp"), p.values[
"sp"][1].values[
"@module_label"])
2880 all_cases = copy.deepcopy(p.values[
"sp"][1].values[
"@all_cases"])
2882 self.assertEqual((
True, [
"sp@test1",
"sp@test2"]), all_cases)
2883 self.assertEqual((
False,
"sp@test2"), p.values[
"sp"][1].values[
"@chosen_case"])
2884 self.assertEqual([
"a",
"sp",
"sp@test1",
"sp@test2"], p.values[
"@all_modules"][1])
2885 self.assertEqual((
True,
"EDProducer"), p.values[
"sp@test1"][1].values[
"@module_edm_type"])
2886 self.assertEqual((
True,
"Bar"), p.values[
"sp@test1"][1].values[
"@module_type"])
2887 self.assertEqual((
True,
"EDProducer"), p.values[
"sp@test2"][1].values[
"@module_edm_type"])
2888 self.assertEqual((
True,
"Foo"), p.values[
"sp@test2"][1].values[
"@module_type"])
2889 dump = proc.dumpPython()
2890 self.assertEqual(dump.find(
'@'), -1)
2891 self.assertEqual(specialImportRegistry.getSpecialImports(), [
"from test import SwitchProducerTest"])
2892 self.assertTrue(dump.find(
"\nfrom test import SwitchProducerTest\n") != -1)
2901 proc.s =
Sequence(proc.a + proc.sp)
2902 proc.t =
Task(proc.a, proc.sp)
2904 proc.p.associate(proc.t)
2906 proc.fillProcessDesc(p)
2907 self.assertEqual((
True,
"EDProducer"), p.values[
"sp"][1].values[
"@module_edm_type"])
2908 self.assertEqual((
True,
"SwitchProducer"), p.values[
"sp"][1].values[
"@module_type"])
2909 self.assertEqual((
True,
"sp"), p.values[
"sp"][1].values[
"@module_label"])
2910 all_cases = copy.deepcopy(p.values[
"sp"][1].values[
"@all_cases"])
2912 self.assertEqual((
True, [
"sp@test1",
"sp@test2"]), all_cases)
2913 self.assertEqual((
False,
"sp@test2"), p.values[
"sp"][1].values[
"@chosen_case"])
2914 self.assertEqual([
"a",
"sp",
"sp@test2"], p.values[
"@all_modules"][1])
2915 self.assertEqual([
"sp@test1"], p.values[
"@all_aliases"][1])
2916 self.assertEqual((
True,
"EDProducer"), p.values[
"sp@test2"][1].values[
"@module_edm_type"])
2917 self.assertEqual((
True,
"Foo"), p.values[
"sp@test2"][1].values[
"@module_type"])
2918 self.assertEqual((
True,
"EDAlias"), p.values[
"sp@test1"][1].values[
"@module_edm_type"])
2919 self.assertEqual((
True,
"Bar"), p.values[
"sp@test1"][1].values[
"a"][1][0].values[
"type"])
2928 proc.s =
Sequence(proc.a + proc.sp)
2929 proc.t =
Task(proc.a, proc.sp)
2931 proc.p.associate(proc.t)
2933 proc.fillProcessDesc(p)
2934 self.assertEqual((
True,
"EDProducer"), p.values[
"sp"][1].values[
"@module_edm_type"])
2935 self.assertEqual((
True,
"SwitchProducer"), p.values[
"sp"][1].values[
"@module_type"])
2936 self.assertEqual((
True,
"sp"), p.values[
"sp"][1].values[
"@module_label"])
2937 self.assertEqual((
True, [
"sp@test1",
"sp@test2"]), p.values[
"sp"][1].values[
"@all_cases"])
2938 self.assertEqual((
False,
"sp@test2"), p.values[
"sp"][1].values[
"@chosen_case"])
2939 self.assertEqual([
"a",
"sp",
"sp@test1"], p.values[
"@all_modules"][1])
2940 self.assertEqual([
"sp@test2"], p.values[
"@all_aliases"][1])
2941 self.assertEqual((
True,
"EDProducer"), p.values[
"sp@test1"][1].values[
"@module_edm_type"])
2942 self.assertEqual((
True,
"Foo"), p.values[
"sp@test1"][1].values[
"@module_type"])
2943 self.assertEqual((
True,
"EDAlias"), p.values[
"sp@test2"][1].values[
"@module_edm_type"])
2944 self.assertEqual((
True,
"Bar"), p.values[
"sp@test2"][1].values[
"a"][1][0].values[
"type"])
2958 p.t3 =
Task(p.g, p.t1)
2959 p.path1 =
Path(p.a, p.t3)
2961 self.assertTrue(p.schedule
is None)
2964 self.assertEqual(pths[keys[0]],p.path1)
2965 self.assertEqual(pths[keys[1]],p.path2)
2967 p.pset2 = untracked.PSet(parA =
string(
"pset2"))
2969 p.vpset2 = untracked.VPSet()
2971 self.assertTrue(hasattr(p,
'a'))
2972 self.assertTrue(hasattr(p,
'b'))
2973 self.assertTrue(
not hasattr(p,
'c'))
2974 self.assertTrue(
not hasattr(p,
'd'))
2975 self.assertTrue(hasattr(p,
'e'))
2976 self.assertTrue(
not hasattr(p,
'f'))
2977 self.assertTrue(hasattr(p,
'g'))
2978 self.assertTrue(
not hasattr(p,
's'))
2979 self.assertTrue(hasattr(p,
't1'))
2980 self.assertTrue(
not hasattr(p,
't2'))
2981 self.assertTrue(hasattr(p,
't3'))
2982 self.assertTrue(hasattr(p,
'path1'))
2983 self.assertTrue(hasattr(p,
'path2'))
3006 p.path1 =
Path(p.a, p.t3)
3008 p.path3 =
Path(p.b+p.s2)
3009 p.path4 =
Path(p.b+p.s3)
3010 p.schedule =
Schedule(p.path1,p.path2,p.path3)
3011 p.schedule.associate(p.t4)
3014 self.assertEqual(pths[keys[0]],p.path1)
3015 self.assertEqual(pths[keys[1]],p.path2)
3017 self.assertTrue(hasattr(p,
'a'))
3018 self.assertTrue(hasattr(p,
'b'))
3019 self.assertTrue(
not hasattr(p,
'c'))
3020 self.assertTrue(
not hasattr(p,
'd'))
3021 self.assertTrue(
not hasattr(p,
'e'))
3022 self.assertTrue(
not hasattr(p,
'f'))
3023 self.assertTrue(hasattr(p,
'g'))
3024 self.assertTrue(hasattr(p,
'h'))
3025 self.assertTrue(hasattr(p,
'i'))
3026 self.assertTrue(
not hasattr(p,
't1'))
3027 self.assertTrue(hasattr(p,
't2'))
3028 self.assertTrue(hasattr(p,
't3'))
3029 self.assertTrue(hasattr(p,
't4'))
3030 self.assertTrue(
not hasattr(p,
's'))
3031 self.assertTrue(hasattr(p,
's2'))
3032 self.assertTrue(
not hasattr(p,
's3'))
3033 self.assertTrue(hasattr(p,
'path1'))
3034 self.assertTrue(hasattr(p,
'path2'))
3035 self.assertTrue(hasattr(p,
'path3'))
3036 self.assertTrue(
not hasattr(p,
'path4'))
3044 self.assertTrue(hasattr(p,
'a'))
3045 self.assertTrue(hasattr(p,
'b'))
3046 self.assertTrue(hasattr(p,
's'))
3047 self.assertTrue(hasattr(p,
'pth'))
3053 p.prune(keepUnresolvedSequencePlaceholders=
True)
3054 self.assertTrue(hasattr(p,
'b'))
3055 self.assertTrue(hasattr(p,
's'))
3056 self.assertTrue(hasattr(p,
'pth'))
3057 self.assertEqual(p.s.dumpPython(),
'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
3065 self.assertTrue(hasattr(p,
'a'))
3066 self.assertTrue(hasattr(p,
'b'))
3067 self.assertTrue(hasattr(p,
's'))
3068 self.assertTrue(hasattr(p,
'pth'))
3074 p.prune(keepUnresolvedSequencePlaceholders=
True)
3075 self.assertTrue(hasattr(p,
'b'))
3076 self.assertTrue(hasattr(p,
's'))
3077 self.assertTrue(hasattr(p,
'pth'))
3078 self.assertEqual(p.s.dumpPython(),
'cms.Task(cms.TaskPlaceholder("a"), process.b)\n')
3086 p.path1 =
Path(p.b, p.t2, p.t3)
3089 p.endpath1 =
EndPath(p.b, p.t5)
3093 p.schedule =
Schedule(p.path1, p.endpath1,tasks=[p.t7,p.t8])
3103 """process.a = cms.EDProducer("ma")
3104 process.c = cms.EDProducer("mc")
3105 process.d = cms.EDProducer("md")
3106 process.e = cms.EDProducer("me")
3107 process.f = cms.EDProducer("mf")
3108 process.g = cms.EDProducer("mg")
3109 process.h = cms.EDProducer("mh")
3110 process.i = cms.EDProducer("mi")
3111 process.j = cms.EDProducer("mj")
3112 process.b = cms.EDAnalyzer("mb")
3113 process.t8 = cms.Task(cms.TaskPlaceholder("j"))
3114 process.t6 = cms.Task(cms.TaskPlaceholder("h"))
3115 process.t7 = cms.Task(cms.TaskPlaceholder("i"), process.a, process.t6)
3116 process.t4 = cms.Task(cms.TaskPlaceholder("f"))
3117 process.t5 = cms.Task(cms.TaskPlaceholder("g"), cms.TaskPlaceholder("t4"), process.a)
3118 process.t3 = cms.Task(cms.TaskPlaceholder("e"))
3119 process.t1 = cms.Task(cms.TaskPlaceholder("c"))
3120 process.t2 = cms.Task(cms.TaskPlaceholder("d"), process.a, process.t1)
3121 process.path1 = cms.Path(process.b, process.t2, process.t3)
3122 process.endpath1 = cms.EndPath(process.b, process.t5)
3123 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
3126 """process.a = cms.EDProducer("ma")
3127 process.c = cms.EDProducer("mc")
3128 process.d = cms.EDProducer("md")
3129 process.e = cms.EDProducer("me")
3130 process.f = cms.EDProducer("mf")
3131 process.g = cms.EDProducer("mg")
3132 process.h = cms.EDProducer("mh")
3133 process.i = cms.EDProducer("mi")
3134 process.j = cms.EDProducer("mj")
3135 process.b = cms.EDAnalyzer("mb")
3136 process.t8 = cms.Task(process.j)
3137 process.t6 = cms.Task(process.h)
3138 process.t7 = cms.Task(process.a, process.i, process.t6)
3139 process.t4 = cms.Task(process.f)
3140 process.t5 = cms.Task(process.a, process.g, process.t4)
3141 process.t3 = cms.Task(process.e)
3142 process.t1 = cms.Task(process.c)
3143 process.t2 = cms.Task(process.a, process.d, process.t1)
3144 process.path1 = cms.Path(process.b, process.t2, process.t3)
3145 process.endpath1 = cms.EndPath(process.b, process.t5)
3146 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
3158 p.t1 =
Task(p.g, p.h)
3162 p.path1 =
Path(p.a+p.f+p.s,t2)
3165 self.assertTrue(hasattr(p,
'f'))
3166 self.assertTrue(hasattr(p,
'g'))
3170 self.assertFalse(hasattr(p,
'f'))
3171 self.assertFalse(hasattr(p,
'g'))
3172 self.assertTrue(p.t1.dumpPython() ==
'cms.Task(process.h)\n')
3173 self.assertTrue(p.s.dumpPython() ==
'cms.Sequence(process.d)\n')
3174 self.assertTrue(p.path1.dumpPython() ==
'cms.Path(process.a+process.s, cms.Task(process.h))\n')
3175 self.assertTrue(p.endpath1.dumpPython() ==
'cms.EndPath(process.b)\n')
3177 self.assertTrue(p.path1.dumpPython() ==
'cms.Path(process.a+(process.d), cms.Task(process.h))\n')
3178 self.assertTrue(p.schedule_().
dumpPython() ==
'cms.Schedule(tasks=[cms.Task(process.h)])\n')
3185 m1.toModify(p.a,_mod_fred)
3186 self.assertEqual(p.a.fred.value(),2)
3188 m1.toModify(p.b, wilma = 2)
3189 self.assertEqual(p.b.wilma.value(),2)
3190 self.assertTrue(p.isUsingModifier(m1))
3195 m1.toModify(p.a,_mod_fred)
3197 m1.toModify(p.b, wilma = 2)
3198 self.assertEqual(p.a.fred.value(),1)
3199 self.assertEqual(p.b.wilma.value(),1)
3200 self.assertEqual(p.isUsingModifier(m1),
False)
3205 m1.toModify(p.a, fred =
int32(2))
3206 p.b = p.a.clone(wilma =
int32(3))
3207 self.assertEqual(p.a.fred.value(),2)
3208 self.assertEqual(p.a.wilma.value(),1)
3209 self.assertEqual(p.b.fred.value(),2)
3210 self.assertEqual(p.b.wilma.value(),3)
3215 m1.toModify(p.a, fred =
None, fintstones = dict(fred =
None))
3216 self.assertEqual(hasattr(p.a,
"fred"),
False)
3217 self.assertEqual(hasattr(p.a.fintstones,
"fred"),
False)
3218 self.assertEqual(p.a.wilma.value(),1)
3223 m1.toModify(p.a, wilma =
int32(2))
3224 self.assertEqual(p.a.fred.value(), 1)
3225 self.assertEqual(p.a.wilma.value(),2)
3230 m1.toModify(p.a, flintstones = dict(fred =
int32(2)))
3231 self.assertEqual(p.a.flintstones.fred.value(),2)
3232 self.assertEqual(p.a.flintstones.wilma.value(),1)
3237 self.assertRaises(KeyError,
lambda: m1.toModify(p.a, flintstones = dict(imnothere = dict(wilma=2))))
3238 self.assertRaises(KeyError,
lambda: m1.toModify(p.a, foo = 1))
3243 m1.toModify(p.a, flintstones = {1:dict(wilma =
int32(2))})
3244 self.assertEqual(p.a.flintstones[0].fred.value(),1)
3245 self.assertEqual(p.a.flintstones[1].wilma.value(),2)
3250 m1.toModify(p.a, fred = {1:7})
3251 self.assertEqual(p.a.fred[0],1)
3252 self.assertEqual(p.a.fred[1],7)
3253 self.assertEqual(p.a.fred[2],3)
3259 try: m1.toModify(p.a, fred = {5:7})
3260 except IndexError
as e: raised =
True
3261 self.assertEqual(raised,
True)
3267 try: m1.toModify(p.a, flintstones = dict(bogus =
int32(37)))
3268 except TypeError
as e: raised =
True
3269 self.assertEqual(raised,
True)
3273 class ProcModifierMod(
object):
3274 def __init__(self,modifier,func):
3279 testMod = DummyMod()
3281 self.assertTrue(hasattr(p,
"a"))
3284 testProcMod = ProcModifierMod(m1,_rem_a)
3286 p.extend(testProcMod)
3287 self.assertTrue(
not hasattr(p,
"a"))
3292 self.assertTrue(p.isUsingModifier(m1))
3293 self.assertTrue(p.isUsingModifier(mc))
3294 testMod = DummyMod()
3296 m1.toModify(p.b, fred =
int32(3))
3298 testProcMod = ProcModifierMod(m1,_rem_a)
3299 p.extend(testProcMod)
3300 self.assertTrue(
not hasattr(p,
"a"))
3301 self.assertEqual(p.b.fred.value(),3)
3306 mclone = mc.copyAndExclude([m2])
3307 self.assertTrue(
not mclone._isOrContains(m2))
3308 self.assertTrue(mclone._isOrContains(m1))
3311 mclone = mc2.copyAndExclude([m2])
3312 self.assertTrue(
not mclone._isOrContains(m2))
3313 self.assertTrue(mclone._isOrContains(m1))
3314 self.assertTrue(mclone._isOrContains(m3))
3320 (m1 & m2).toModify(p.a, fred =
int32(2))
3321 self.assertRaises(TypeError,
lambda: (m1 & m2).toModify(p.a, 1, wilma=2))
3322 self.assertEqual(p.a.fred, 1)
3327 (m1 & m2).toModify(p.a, fred =
int32(2))
3328 self.assertEqual(p.a.fred, 2)
3334 (m1 & m2 & m3).toModify(p.a, fred =
int32(2))
3335 self.assertEqual(p.a.fred, 2)
3336 (m1 & (m2 & m3)).toModify(p.a, fred =
int32(3))
3337 self.assertEqual(p.a.fred, 3)
3338 ((m1 & m2) & m3).toModify(p.a, fred =
int32(4))
3339 self.assertEqual(p.a.fred, 4)
3345 (~m1).toModify(p.a, fred=2)
3346 self.assertEqual(p.a.fred, 1)
3347 (~m2).toModify(p.a, wilma=2)
3348 self.assertEqual(p.a.wilma, 2)
3349 self.assertRaises(TypeError,
lambda: (~m1).toModify(p.a, 1, wilma=2))
3350 self.assertRaises(TypeError,
lambda: (~m2).toModify(p.a, 1, wilma=2))
3357 (m1 | m2).toModify(p.a, fred=2)
3358 self.assertEqual(p.a.fred, 2)
3359 (m1 | m2 | m3).toModify(p.a, fred=3)
3360 self.assertEqual(p.a.fred, 3)
3361 (m3 | m2 | m1).toModify(p.a, fred=4)
3362 self.assertEqual(p.a.fred, 4)
3363 ((m1 | m2) | m3).toModify(p.a, fred=5)
3364 self.assertEqual(p.a.fred, 5)
3365 (m1 | (m2 | m3)).toModify(p.a, fred=6)
3366 self.assertEqual(p.a.fred, 6)
3367 (m2 | m3).toModify(p.a, fred=7)
3368 self.assertEqual(p.a.fred, 6)
3369 self.assertRaises(TypeError,
lambda: (m1 | m2).toModify(p.a, 1, wilma=2))
3370 self.assertRaises(TypeError,
lambda: (m2 | m3).toModify(p.a, 1, wilma=2))
3378 (m1 & ~m2).toModify(p.a, fred=2)
3379 self.assertEqual(p.a.fred, 1)
3380 (m1 & ~m3).toModify(p.a, fred=2)
3381 self.assertEqual(p.a.fred, 2)
3382 (m1 | ~m2).toModify(p.a, fred=3)
3383 self.assertEqual(p.a.fred, 3)
3384 (~m1 | ~m2).toModify(p.a, fred=4)
3385 self.assertEqual(p.a.fred, 3)
3386 (~m3 & ~m4).toModify(p.a, fred=4)
3387 self.assertEqual(p.a.fred, 4)
3388 ((m1 & m3) | ~m4).toModify(p.a, fred=5)
3389 self.assertEqual(p.a.fred, 5)
3395 self.assertRaises(TypeError,
lambda: m1.toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3402 m1.toReplaceWith(p.s,
Sequence(p.a+p.b, p.td))
3403 self.assertEqual(p.a.wilma.value(),3)
3404 self.assertEqual(p.a.type_(),
"YourAnalyzer")
3405 self.assertEqual(hasattr(p,
"fred"),
False)
3406 self.assertTrue(p.s.dumpPython() ==
"cms.Sequence(process.a+process.b, process.td)\n")
3408 m1.toReplaceWith(p.td,
Task(p.e))
3409 self.assertTrue(p.td._collection ==
OrderedSet([p.e]))
3415 self.assertEqual(p.a.type_(),
"MyAnalyzer")
3423 self.assertRaises(TypeError,
lambda: (m1 & m2).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3424 self.assertRaises(TypeError,
lambda: (m3 & m4).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3425 self.assertRaises(TypeError,
lambda: (~m3).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3426 self.assertRaises(TypeError,
lambda: (~m1).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3427 self.assertRaises(TypeError,
lambda: (m1 | m3).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3428 self.assertRaises(TypeError,
lambda: (m3 | m4).toReplaceWith(p.a,
EDProducer(
"YourProducer")))
3429 (m1 & m2).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer1"))
3430 self.assertEqual(p.a.type_(),
"YourAnalyzer1")
3431 (m1 & m3).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer2"))
3432 self.assertEqual(p.a.type_(),
"YourAnalyzer1")
3433 (~m1).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer2"))
3434 self.assertEqual(p.a.type_(),
"YourAnalyzer1")
3435 (~m3).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer2"))
3436 self.assertEqual(p.a.type_(),
"YourAnalyzer2")
3437 (m1 | m3).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer3"))
3438 self.assertEqual(p.a.type_(),
"YourAnalyzer3")
3439 (m3 | m4).toReplaceWith(p.a,
EDAnalyzer(
"YourAnalyzer4"))
3440 self.assertEqual(p.a.type_(),
"YourAnalyzer3")
3447 m.toModify(a, foo2 = {0: dict(type =
"Foo3")})
3448 self.assertEqual(a.foo2[0].type,
"Foo3")
3451 self.assertEqual(a.foo2[0].type,
"Foo3")
3452 self.assertEqual(a.foo4[0].type,
"Foo4")
3454 m.toModify(a, foo2 =
None)
3455 self.assertFalse(hasattr(a,
"foo2"))
3456 self.assertEqual(a.foo4[0].type,
"Foo4")
3459 self.assertFalse(hasattr(a,
"foo2"))
3460 self.assertFalse(hasattr(a,
"foo4"))
3461 self.assertTrue(hasattr(a,
"bar"))
3462 self.assertEqual(a.bar[0].type,
"Bar")
3475 test1 = dict(a = 4, b = dict(c =
None)),
3476 test2 = dict(aa = 15, bb = dict(cc = 45, dd =
string(
"foo"))))
3477 self.assertEqual(sp.test1.a.value(), 4)
3478 self.assertEqual(sp.test1.b.hasParameter(
"c"),
False)
3479 self.assertEqual(sp.test2.aa.value(), 15)
3480 self.assertEqual(sp.test2.bb.cc.value(), 45)
3481 self.assertEqual(sp.test2.bb.dd.value(),
"foo")
3484 self.assertEqual(sp.test1.type_(),
"Fred")
3485 self.assertEqual(sp.test1.x.value(), 42)
3486 self.assertRaises(TypeError,
lambda: m.toReplaceWith(sp.test1,
EDAnalyzer(
"Foo")))
3489 self.assertEqual(sp.test2.type_(),
"Xyzzy")
3490 self.assertEqual(sp.test2.x.value(), 24)
3491 self.assertRaises(TypeError,
lambda: m.toModify(sp, test2 =
EDAnalyzer(
"Foo")))
3494 self.assertEqual(sp.test3.type_(),
"Wilma")
3495 self.assertEqual(sp.test3.y.value(), 24)
3496 self.assertRaises(TypeError,
lambda: m.toModify(sp, test4 =
EDAnalyzer(
"Foo")))
3498 m.toModify(sp, test2 =
None)
3499 self.assertEqual(hasattr(sp,
"test2"),
False)
3502 self.assertTrue(hasattr(sp.test2,
"foo"))
3505 self.assertTrue(hasattr(sp.test2,
"bar"))
3508 self.assertTrue(hasattr(sp.test2,
"xyzzy"))
3510 self.assertRaises(TypeError,
lambda: m.toReplaceWith(sp.test2,
EDProducer(
"Foo")))
3516 p.maxEvents.input = 10
3517 p.options.numberOfThreads = 4
3518 p.maxLuminosityBlocks.input = 2
3520 self.assertEqual(p.maxEvents.input.value(),10)
3521 self.assertEqual(p.options.numberOfThreads.value(), 4)
3522 self.assertEqual(p.maxLuminosityBlocks.input.value(),2)
3528 self.assertTrue(hasattr(p,
'fltr'))