4 from Options
import Options
10 from Mixins
import PrintOptions,_ParameterTypeBase,_SimpleParameterTypeBase, _Parameterizable, _ConfigureComponent, _TypedParameterizable, _Labelable, _Unlabelable, _ValidatingListBase
14 from Modules
import _Module
15 from SequenceTypes
import *
16 from SequenceTypes
import _ModuleSequenceType, _Sequenceable
17 from SequenceVisitors
import PathValidator, EndPathValidator
18 from Utilities
import *
21 from ExceptionHandling
import *
24 if sys.getrecursionlimit()<5000:
25 sys.setrecursionlimit(5000)
29 Raise an exception if called by special config files. This checks
30 the call or import stack for the importing file. An exception is raised if
31 the importing module is not in allowedPatterns and if it is called too deeply:
32 minLevel = 2: inclusion by top lvel cfg only
33 minLevel = 1: No inclusion allowed
34 allowedPatterns = ['Module1','Module2/SubModule1'] allows import
35 by any module in Module1 or Submodule1
41 ignorePatterns = [
'FWCore/ParameterSet/Config.py',
'<string>']
42 CMSSWPath = [os.environ[
'CMSSW_BASE'],os.environ[
'CMSSW_RELEASE_BASE']]
46 for item
in inspect.stack():
50 for pattern
in CMSSWPath:
51 if item[1].
find(pattern) != -1:
54 if item[1].
find(
'/') == -1:
57 for pattern
in ignorePatterns:
58 if item[1].
find(pattern) != -1:
62 if inPath
and not ignore:
63 trueStack.append(item[1])
65 importedFile = trueStack[0]
67 if len(trueStack) > 1:
68 importedBy = trueStack[1]
70 for pattern
in allowedPatterns:
71 if importedBy.find(pattern) > -1:
74 if len(trueStack) <= minLevel:
77 raise ImportError(
"Inclusion of %s is allowed only by cfg or specified cfi files."
81 """Look inside the module and find the Processes it contains"""
85 if isinstance(module,dict):
86 if 'process' in module:
90 if hasattr(module,
'process'):
91 if isinstance(module.process,Process):
92 process = module.process
94 raise RuntimeError(
"The attribute named 'process' does not inherit from the Process class")
96 raise RuntimeError(
"no 'process' attribute found in the module, please add one")
101 """Root class for a CMS configuration process"""
103 """The argument 'name' will be the name applied to this Process
104 Can optionally pass as additional arguments cms.Modifier instances
105 which will be used ot modify the Process as it is built
107 self.__dict__[
'_Process__name'] = name
108 if not name.isalnum():
109 raise RuntimeError(
"Error: The process name is an empty string or contains non-alphanumeric characters")
110 self.__dict__[
'_Process__filters'] = {}
111 self.__dict__[
'_Process__producers'] = {}
112 self.__dict__[
'_Process__source'] =
None
113 self.__dict__[
'_Process__looper'] =
None
114 self.__dict__[
'_Process__subProcess'] =
None
115 self.__dict__[
'_Process__schedule'] =
None
116 self.__dict__[
'_Process__analyzers'] = {}
117 self.__dict__[
'_Process__outputmodules'] = {}
120 self.__dict__[
'_Process__sequences'] = {}
121 self.__dict__[
'_Process__services'] = {}
122 self.__dict__[
'_Process__essources'] = {}
123 self.__dict__[
'_Process__esproducers'] = {}
124 self.__dict__[
'_Process__esprefers'] = {}
125 self.__dict__[
'_Process__aliases'] = {}
126 self.__dict__[
'_Process__psets']={}
127 self.__dict__[
'_Process__vpsets']={}
128 self.__dict__[
'_cloneToObjectDict'] = {}
130 self.__dict__[
'_Process__InExtendCall'] =
False
131 self.__dict__[
'_Process__partialschedules'] = {}
133 self.__dict__[
'_Process__modifiers'] = Mods
134 for m
in self.__modifiers:
139 _Module.__isStrict__ =
True
143 """Returns a string containing all the EDProducer labels separated by a blank"""
146 """Returns a string containing all the EDAnalyzer labels separated by a blank"""
149 """Returns a string containing all the EDFilter labels separated by a blank"""
152 """Returns a string containing all the Path names separated by a blank"""
159 Since cloneToObjectDict stores a hash of objects by their
160 id() it needs to be updated when unpickling to use the
161 new object id values instantiated during the unpickle.
164 self.__dict__.update(pkldict)
166 for value
in self._cloneToObjectDict.values():
167 tmpDict[id(value)] = value
168 self.__dict__[
'_cloneToObjectDict'] = tmpDict
173 """returns a dict of the filters which have been added to the Process"""
175 filters = property(filters_, doc=
"dictionary containing the filters for the process")
179 if not name.isalnum():
180 raise RuntimeError(
"Error: The process name is an empty string or contains non-alphanumeric characters")
181 self.__dict__[
'_Process__name'] = name
182 process = property(name_,setName_, doc=
"name of the process")
184 """returns a dict of the producers which have been added to the Process"""
186 producers = property(producers_,doc=
"dictionary containing the producers for the process")
188 """returns the source which has been added to the Process or None if none have been added"""
192 source = property(source_,setSource_,doc=
'the main source or None if not set')
194 """returns the looper which has been added to the Process or None if none have been added"""
198 looper = property(looper_,setLooper_,doc=
'the main looper or None if not set')
200 """returns the sub-process which has been added to the Process or None if none have been added"""
201 return self.__subProcess
204 subProcess = property(subProcess_,setSubProcess_,doc=
'the SubProcess or None if not set')
206 """returns a dict of the analyzers which have been added to the Process"""
208 analyzers = property(analyzers_,doc=
"dictionary containing the analyzers for the process")
210 """returns a dict of the output modules which have been added to the Process"""
212 outputModules = property(outputModules_,doc=
"dictionary containing the output_modules for the process")
214 """returns a dict of the paths which have been added to the Process"""
216 paths = property(paths_,doc=
"dictionary containing the paths for the process")
218 """returns a dict of the endpaths which have been added to the Process"""
220 endpaths = property(endpaths_,doc=
"dictionary containing the endpaths for the process")
222 """returns a dict of the sequences which have been added to the Process"""
224 sequences = property(sequences_,doc=
"dictionary containing the sequences for the process")
226 """returns the schedule which has been added to the Process or None if none have been added"""
227 return self.__schedule
229 if label ==
"schedule":
232 self.
_place(label, sch, self.__partialschedules)
241 raise RuntimeError(
"The path at index "+str(index)+
" in the Schedule was not attached to the process.")
243 self.__dict__[
'_Process__schedule'] = sch
244 schedule = property(schedule_,setSchedule_,doc=
'the schedule or None if not set')
246 """returns a dict of the services which have been added to the Process"""
248 services = property(services_,doc=
"dictionary containing the services for the process")
250 """returns a dict of the esproducers which have been added to the Process"""
252 es_producers = property(es_producers_,doc=
"dictionary containing the es_producers for the process")
254 """returns a the es_sources which have been added to the Process"""
256 es_sources = property(es_sources_,doc=
"dictionary containing the es_sources for the process")
258 """returns a dict of the es_prefers which have been added to the Process"""
260 es_prefers = property(es_prefers_,doc=
"dictionary containing the es_prefers for the process")
262 """returns a dict of the aliases that have been added to the Process"""
264 aliases = property(aliases_,doc=
"dictionary containing the aliases for the process")
266 """returns a dict of the PSets which have been added to the Process"""
268 psets = property(psets_,doc=
"dictionary containing the PSets for the process")
270 """returns a dict of the VPSets which have been added to the Process"""
272 vpsets = property(vpsets_,doc=
"dictionary containing the PSets for the process")
275 if not object.hasLabel_() :
276 object.setLabel(newLabel)
278 if newLabel == object.label_() :
280 if newLabel
is None :
281 object.setLabel(
None)
283 if (hasattr(self, object.label_())
and id(getattr(self, object.label_())) == id(object)) :
284 msg100 =
"Attempting to change the label of an attribute of the Process\n"
285 msg101 =
"Old label = "+object.label_()+
" New label = "+newLabel+
"\n"
286 msg102 =
"Type = "+str(type(object))+
"\n"
287 msg103 =
"Some possible solutions:\n"
288 msg104 =
" 1. Clone modules instead of using simple assignment. Cloning is\n"
289 msg105 =
" also preferred for other types when possible.\n"
290 msg106 =
" 2. Declare new names starting with an underscore if they are\n"
291 msg107 =
" for temporaries you do not want propagated into the Process. The\n"
292 msg108 =
" underscore tells \"from x import *\" and process.load not to import\n"
293 msg109 =
" the name.\n"
294 msg110 =
" 3. Reorganize so the assigment is not necessary. Giving a second\n"
295 msg111 =
" name to the same object usually causes confusion and problems.\n"
296 msg112 =
" 4. Compose Sequences: newName = cms.Sequence(oldName)\n"
297 raise ValueError(msg100+msg101+msg102+msg103+msg104+msg105+msg106+msg107+msg108+msg109+msg110+msg111+msg112)
298 object.setLabel(
None)
299 object.setLabel(newLabel)
303 if not name.replace(
'_',
'').isalnum():
304 raise ValueError(
'The label '+name+
' contains forbiden characters')
307 if name.startswith(
'_Process__'):
308 self.__dict__[name]=value
310 if not isinstance(value,_ConfigureComponent):
311 raise TypeError(
"can only assign labels to an object which inherits from '_ConfigureComponent'\n"
312 +
"an instance of "+str(type(value))+
" will not work - requested label is "+name)
313 if not isinstance(value,_Labelable)
and not isinstance(value,Source)
and not isinstance(value,Looper)
and not isinstance(value,Schedule):
314 if name == value.type_():
318 raise TypeError(
"an instance of "+str(type(value))+
" can not be assigned the label '"+name+
"'.\n"+
319 "Please either use the label '"+value.type_()+
" or use the 'add_' method instead.")
322 newValue =value.copy()
324 newValue._filename = value._filename
330 if not self.
_okToPlace(name, value, self.__dict__):
331 newFile=
'top level config'
332 if hasattr(value,
'_filename'):
333 newFile = value._filename
334 oldFile=
'top level config'
335 oldValue = getattr(self,name)
336 if hasattr(oldValue,
'_filename'):
337 oldFile = oldValue._filename
338 msg =
"Trying to override definition of process."+name
339 msg +=
"\n new object defined in: "+newFile
340 msg +=
"\n existing object defined in: "+oldFile
341 raise ValueError(msg)
343 if hasattr(self,name)
and not (getattr(self,name)==newValue):
347 if isinstance(newValue, _Sequenceable):
348 if not self.__InExtendCall:
352 newFile=
'top level config'
353 if hasattr(value,
'_filename'):
354 newFile = value._filename
355 oldFile=
'top level config'
356 oldValue = getattr(self,name)
357 if hasattr(oldValue,
'_filename'):
358 oldFile = oldValue._filename
359 msg1 =
"Trying to override definition of "+name+
" while it is used by the sequence "
360 msg2 =
"\n new object defined in: "+newFile
361 msg2 +=
"\n existing object defined in: "+oldFile
364 raise ValueError(msg1+s.label_()+msg2)
367 raise ValueError(msg1+s.label_()+msg2)
370 raise ValueError(msg1+s.label_()+msg2)
372 self.__dict__[name]=newValue
373 if isinstance(newValue,_Labelable):
375 self._cloneToObjectDict[id(value)] = newValue
376 self._cloneToObjectDict[id(newValue)] = newValue
378 newValue._place(name,self)
380 """Given a container of sequences, find the first sequence containing mod
381 and return the sequence. If no sequence is found, return None"""
383 for sequenceable
in seqs.itervalues():
386 sequenceable.visit(v)
391 if not hasattr(self,name):
392 raise KeyError(
'process does not know about '+name)
393 elif name.startswith(
'_Process__'):
394 raise ValueError(
'this attribute cannot be deleted')
399 if reg.has_key(name): del reg[name]
401 obj = getattr(self,name)
402 if isinstance(obj,_Labelable):
403 getattr(self,name).setLabel(
None)
406 del self.__dict__[name]
411 """Allows addition of components which do not have to have a label, e.g. Services"""
412 if not isinstance(value,_ConfigureComponent):
414 if not isinstance(value,_Unlabelable):
419 newValue =value.copy()
423 newValue._place(
'',self)
426 if not self.__InExtendCall:
437 if d[name]._isModified:
448 if self.
__isStrict and isinstance(mod, _ModuleSequenceType):
449 d[name] = mod._postProcessFixup(self._cloneToObjectDict)
452 if isinstance(mod,_Labelable):
455 self.
_place(name, mod, self.__outputmodules)
457 self.
_place(name, mod, self.__producers)
459 self.
_place(name, mod, self.__filters)
461 self.
_place(name, mod, self.__analyzers)
465 self.
_place(name, mod, self.__paths)
466 except ModuleCloneError, msg:
468 raise Exception(
"%sThe module %s in path %s is unknown to the process %s." %(context, msg, name, self._Process__name))
472 self.
_place(name, mod, self.__endpaths)
473 except ModuleCloneError, msg:
475 raise Exception(
"%sThe module %s in endpath %s is unknown to the process %s." %(context, msg, name, self._Process__name))
478 self.
_place(name, mod, self.__sequences)
480 self.
_place(name, mod, self.__esproducers)
482 self.
_place(name, mod, self.__esprefers)
484 self.
_place(name, mod, self.__essources)
486 self.
_place(name, mod, self.__aliases)
488 self.
_place(name, mod, self.__psets)
490 self.
_place(name, mod, self.__vpsets)
492 """Allow the source to be referenced by 'source' or by type name"""
494 raise ValueError(
"The label '"+name+
"' can not be used for a Source. Only 'source' is allowed.")
495 if self.__dict__[
'_Process__source']
is not None :
496 del self.__dict__[self.__dict__[
'_Process__source'].type_()]
497 self.__dict__[
'_Process__source'] = mod
498 self.__dict__[mod.type_()] = mod
501 raise ValueError(
"The label '"+name+
"' can not be used for a Looper. Only 'looper' is allowed.")
502 self.__dict__[
'_Process__looper'] = mod
503 self.__dict__[mod.type_()] = mod
505 if name !=
'subProcess':
506 raise ValueError(
"The label '"+name+
"' can not be used for a SubProcess. Only 'subProcess' is allowed.")
507 self.__dict__[
'_Process__subProcess'] = mod
508 self.__dict__[mod.type_()] = mod
510 self.
_place(typeName, mod, self.__services)
511 self.__dict__[typeName]=mod
513 moduleName = moduleName.replace(
"/",
".")
514 module = __import__(moduleName)
515 self.
extend(sys.modules[moduleName])
517 """Look in other and find types which we can use"""
519 self.__dict__[
'_Process__InExtendCall'] =
True
522 for name
in dir(other):
524 if name.startswith(
'_'):
526 item = getattr(other,name)
527 if name ==
"source" or name ==
"looper" or name ==
"subProcess":
531 elif isinstance(item,_ModuleSequenceType):
533 elif isinstance(item,_Labelable):
535 if not item.hasLabel_() :
537 elif isinstance(item,Schedule):
539 elif isinstance(item,_Unlabelable):
541 elif isinstance(item,ProcessModifier):
543 elif isinstance(item,ProcessFragment):
547 for name
in seqs.iterkeys():
551 if id(seq)
not in self._cloneToObjectDict:
554 newSeq = self._cloneToObjectDict[id(seq)]
555 self.__dict__[name]=newSeq
558 newSeq._place(name,self)
559 self.__dict__[
'_Process__InExtendCall'] =
False
563 for name,item
in items:
564 returnValue +=options.indentation()+typeName+
' '+name+
' = '+item.dumpConfig(options)
568 for name,item
in items:
569 returnValue +=options.indentation()+typeName+
' = '+item.dumpConfig(options)
573 for name,item
in items:
574 if name == item.type_():
576 returnValue +=options.indentation()+typeName+
' '+name+
' = '+item.dumpConfig(options)
579 """return a string containing the equivalent process defined using the old configuration language"""
580 config =
"process "+self.__name+
" = {\n"
625 for name,item
in self.psets.iteritems():
626 config +=options.indentation()+item.configTypeName()+
' '+name+
' = '+item.configValue(options)
627 for name,item
in self.vpsets.iteritems():
628 config +=options.indentation()+
'VPSet '+name+
' = '+item.configValue(options)
630 pathNames = [p.label_()
for p
in self.
schedule]
631 config +=options.indentation()+
'schedule = {'+
','.
join(pathNames)+
'}\n'
642 result +=options.indentation()+
'es_prefer '+item.targetLabel_()+
' = '+item.dumpConfig(options)
647 for name,item
in d.items():
648 returnValue +=
'process.'+name+
' = '+item.dumpPython(options)+
'\n\n'
650 for name,item
in sorted(d.items()):
651 returnValue +=
'process.'+name+
' = '+item.dumpPython(options)+
'\n\n'
658 sequence.visit(nameVisitor)
660 raise RuntimeError(
"An entry in sequence "+label +
' has no label')
665 for label,seq
in self.sequences.iteritems():
669 dependencies[label]=[dep.label_()
for dep
in d
if dep.hasLabel_()]
670 resolvedDependencies=
True
674 while resolvedDependencies:
676 resolvedDependencies = (0 != len(dependencies))
677 oldDeps =
dict(dependencies)
678 for label,deps
in oldDeps.iteritems():
680 if len(deps)==0
or iterCount > 100:
682 resolvedDependencies=
True
685 del dependencies[label]
686 for lb2,deps2
in dependencies.iteritems():
687 while deps2.count(label):
689 if len(dependencies):
690 raise RuntimeError(
"circular sequence dependency discovered \n"+
691 ",".
join([label
for label,junk
in dependencies.iteritems()]))
695 for name, value
in sorted(d.iteritems()):
696 result += value.dumpPythonAs(name,options)+
'\n'
699 """return a string containing the equivalent process defined using python"""
700 result =
"import FWCore.ParameterSet.Config as cms\n\n"
701 result +=
"process = cms.Process(\""+self.__name+
"\")\n\n"
723 pathNames = [
'process.'+p.label_()
for p
in self.
schedule]
724 result +=
'process.schedule = cms.Schedule(*[ ' +
', '.
join(pathNames) +
' ])\n'
728 old = getattr(self,label)
730 for sequenceable
in self.sequences.itervalues():
731 sequenceable.replace(old,new)
732 for sequenceable
in self.paths.itervalues():
733 sequenceable.replace(old,new)
734 for sequenceable
in self.endpaths.itervalues():
735 sequenceable.replace(old,new)
737 """ Replace the item with label 'label' by object 'new' in the process and all sequences/paths"""
738 if not hasattr(self,label):
739 raise LookupError(
"process has no item of label "+label)
741 setattr(self,label,new)
743 for name,value
in itemDict.iteritems():
744 value.insertInto(parameterSet, name)
748 newlabel = item.nameInProcessDesc_(label)
750 item.insertInto(parameterSet, newlabel)
751 parameterSet.addVString(tracked, label, vitems)
754 for name,value
in itemDict.iteritems():
755 newLabel = value.nameInProcessDesc_(name)
757 value.insertInto(parameterSet, name)
760 parameterSet.addVString(tracked, label, l)
767 for name,value
in self.
paths_().iteritems():
768 scheduledPaths.append(name)
769 triggerPaths.append(name)
770 for name,value
in self.
endpaths_().iteritems():
771 scheduledPaths.append(name)
772 endpaths.append(name)
775 pathname = path.label_()
776 scheduledPaths.append(pathname)
778 endpaths.append(pathname)
780 triggerPaths.append(pathname)
781 processPSet.addVString(
True,
"@end_paths", endpaths)
782 processPSet.addVString(
True,
"@paths", scheduledPaths)
784 p = processPSet.newPSet()
785 p.addVString(
True,
"@trigger_paths", triggerPaths)
786 processPSet.addPSet(
True,
"@trigger_paths", p)
790 for triggername
in triggerPaths:
792 pathValidator.setLabel(triggername)
794 self.
paths_()[triggername].insertInto(processPSet, triggername, self.__dict__)
795 for endpathname
in endpaths:
797 endpathValidator.setLabel(endpathname)
799 self.
endpaths_()[endpathname].insertInto(processPSet, endpathname, self.__dict__)
800 processPSet.addVString(
False,
"@filters_on_endpaths", endpathValidator.filtersOnEndpaths)
802 def prune(self,verbose=False,keepUnresolvedSequencePlaceholders=False):
803 """ Remove clutter from the process which we think is unnecessary:
804 tracked PSets, VPSets and unused modules and sequences. If a Schedule has been set, then Paths and EndPaths
805 not in the schedule will also be removed, along with an modules and sequences used only by
806 those removed Paths and EndPaths."""
815 for x
in self.paths.itervalues():
816 x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
817 for x
in self.endpaths.itervalues():
818 x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
820 unneededPaths = set()
822 usedModules=set(self.
schedule_().moduleNames())
824 schedNames = set(( x.label_()
for x
in self.
schedule_()))
825 names = set(self.
paths)
827 unneededPaths = names - schedNames
828 for n
in unneededPaths:
831 pths =
list(self.paths.itervalues())
832 pths.extend(self.endpaths.itervalues())
834 usedModules=set(temp.moduleNames())
841 for p
in self.paths.itervalues():
843 for p
in self.endpaths.itervalues():
845 keepSeqSet = set(( s
for s
in seqs
if s.hasLabel_()))
846 availableSeqs = set(self.sequences.itervalues())
847 unneededSeqs = availableSeqs-keepSeqSet
848 unneededSeqLabels = []
849 for s
in unneededSeqs:
850 unneededSeqLabels.append(s.label_())
851 delattr(self,s.label_())
853 print "prune removed the following:"
854 print " modules:"+
",".
join(unneededModules)
855 print " sequences:"+
",".
join(unneededSeqLabels)
856 print " paths/endpaths:"+
",".
join(unneededPaths)
858 moduleNames = set(d.keys())
859 junk = moduleNames - scheduledNames
865 """Used by the framework to convert python to C++ objects"""
866 class ServiceInjectorAdaptor(
object):
870 def addService(self,pset):
871 self.__thelist.append(pset)
873 return self.__processPSet.newPSet()
877 class TopLevelPSetAcessorAdaptor(
object):
881 def __getattr__(self,attr):
882 return getattr(self.
__ppset,attr)
883 def getTopPSet_(self,label):
886 return TopLevelPSetAcessorAdaptor(self.__ppset.newPSet(),self.
__process)
887 def addPSet(self,tracked,name,ppset):
888 return self.__ppset.addPSet(tracked,name,self.__extractPSet(ppset))
889 def addVPSet(self,tracked,name,vpset):
890 return self.__ppset.addVPSet(tracked,name,[self.__extractPSet(x)
for x
in vpset])
891 def __extractPSet(self,pset):
892 if isinstance(pset,TopLevelPSetAcessorAdaptor):
897 processPSet.addString(
True,
"@process_name", self.
name_())
902 adaptor = TopLevelPSetAcessorAdaptor(processPSet,self)
917 getattr(self,n).insertInto(ServiceInjectorAdaptor(adaptor,services))
918 adaptor.addVPSet(
False,
"services",services)
928 def prefer(self, esmodule,*args,**kargs):
929 """Prefer this ES source or producer. The argument can
930 either be an object label, e.g.,
931 process.prefer(process.juicerProducer) (not supported yet)
932 or a name of an ESSource or ESProducer
933 process.prefer("juicer")
934 or a type of unnamed ESSource or ESProducer
935 process.prefer("JuicerProducer")
936 In addition, you can pass as a labelled arguments the name of the Record you wish to
937 prefer where the type passed is a cms.vstring and that vstring can contain the
938 name of the C++ types in the Record which are being preferred, e.g.,
939 #prefer all data in record 'OrangeRecord' from 'juicer'
940 process.prefer("juicer", OrangeRecord=cms.vstring())
942 #prefer only "Orange" data in "OrangeRecord" from "juicer"
943 process.prefer("juicer", OrangeRecord=cms.vstring("Orange"))
945 #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
946 ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
949 if isinstance(esmodule, ESSource)
or isinstance(esmodule, ESProducer):
950 raise RuntimeError(
"Syntax of process.prefer(process.esmodule) not supported yet")
951 elif self._findPreferred(esmodule, self.es_producers_(),*args,**kargs)
or \
952 self._findPreferred(esmodule, self.es_sources_(),*args,**kargs):
955 raise RuntimeError(
"Cannot resolve prefer for "+repr(esmodule))
960 typ = d[esname].type_()
969 for name, value
in d.iteritems():
970 if value.type_() == esname:
972 raise RuntimeError(
"More than one ES module for "+esname)
980 if isinstance(process, Process):
982 elif isinstance(process, str):
985 raise TypeError(
'a ProcessFragment can only be constructed from an existig Process or from process name')
987 return [ x
for x
in dir(self.
__process)
if isinstance(getattr(self.
__process, x), _ConfigureComponent) ]
989 if name ==
'_ProcessFragment__process':
990 return object.__getattribute__(self,
'_ProcessFragment__process')
994 if name ==
'_ProcessFragment__process':
995 object.__setattr__(self, name, value)
999 if name ==
'_ProcessFragment__process':
1006 """a dictionary with fixed keys"""
1008 raise AttributeError,
"An FilteredStream defintion cannot be modified after creation."
1009 _blocked_attribute = property(_blocked_attribute)
1010 __setattr__ = __delitem__ = __setitem__ = clear = _blocked_attribute
1011 pop = popitem = setdefault = update = _blocked_attribute
1013 new = dict.__new__(cls)
1014 dict.__init__(new, *args, **kw)
1017 if keys != [
'content',
'dataTier',
'name',
'paths',
'responsible',
'selectEvents']:
1018 raise ValueError(
"The needed parameters are: content, dataTier, name, paths, responsible, selectEvents")
1019 if not isinstance(kw[
'name'],str):
1020 raise ValueError(
"name must be of type string")
1021 if not isinstance(kw[
'content'], vstring)
and not isinstance(kw[
'content'],str):
1022 raise ValueError(
"content must be of type vstring or string")
1023 if not isinstance(kw[
'dataTier'], string):
1024 raise ValueError(
"dataTier must be of type string")
1025 if not isinstance(kw[
'selectEvents'], PSet):
1026 raise ValueError(
"selectEvents must be of type PSet")
1027 if not isinstance(kw[
'paths'],(tuple, Path)):
1028 raise ValueError(
"'paths' must be a tuple of paths")
1033 return "FilteredStream object: %s" %self[
"name"]
1038 """Allows embedding another process within a parent process. This allows one to
1039 chain processes together directly in one cmsRun job rather than having to run
1040 separate jobs which are connected via a temporary file.
1042 def __init__(self,process, SelectEvents = untracked.PSet(), outputCommands = untracked.vstring()):
1045 if not isinstance(process, Process):
1046 raise ValueError(
"the 'process' argument must be of type cms.Process")
1047 if not isinstance(SelectEvents,PSet):
1048 raise ValueError(
"the 'SelectEvents' argument must be of type cms.untracked.PSet")
1049 if not isinstance(outputCommands,vstring):
1050 raise ValueError(
"the 'outputCommands' argument must be of type cms.untracked.vstring")
1055 out =
"parentProcess"+str(
hash(self))+
" = process\n"
1056 out += self.__process.dumpPython()
1057 out +=
"childProcess = process\n"
1058 out +=
"process = parentProcess"+str(
hash(self))+
"\n"
1059 out +=
"process.subProcess = cms.SubProcess( process = childProcess, SelectEvents = "+self.__SelectEvents.dumpPython(options) +
", outputCommands = "+self.__outputCommands.dumpPython(options) +
")\n"
1064 return '@sub_process'
1066 process._placeSubProcess(
'subProcess',self)
1068 topPSet = parameterSet.newPSet()
1069 self.__process.fillProcessDesc(topPSet)
1070 subProcessPSet = parameterSet.newPSet()
1071 self.__SelectEvents.insertInto(subProcessPSet,
"SelectEvents")
1072 self.__outputCommands.insertInto(subProcessPSet,
"outputCommands")
1073 subProcessPSet.addPSet(
False,
"process",topPSet)
1077 """Helper class for Modifier which takes key/value pairs and uses them to reset parameters of the object"""
1081 for k,v
in self.__args.iteritems():
1085 """This class is used to define standard modifications to a Process.
1086 An instance of this class is declared to denote a specific modification,e.g. era2017 could
1087 reconfigure items in a process to match our expectation of running in 2017. Once declared,
1088 these Modifier instances are imported into a configuration and items which need to be modified
1089 are then associated with the Modifier and with the action to do the modification.
1090 The registered modifications will only occur if the Modifier was passed to
1091 the cms.Process' constructor.
1097 """This is used to create a ProcessModifer which can perform actions on the process as a whole.
1098 This takes as argument a callable object (e.g. function) which takes as its sole argument an instance of Process.
1099 In order to work, the value returned from this function must be assigned to a uniquely named variable.
1103 """This is used to register an action to be performed on the specific object. Two different forms are allowed
1104 Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1105 which will be the object passed in as the first argument.
1106 Form 2: A list of parameter name, value pairs can be passed
1107 mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1109 if func
is not None and len(kw) != 0:
1110 raise TypeError(
"toModify takes either two arguments or one argument and key/value pairs")
1113 if func
is not None:
1119 """Should only be called by cms.Process instances"""
1125 """A Modifier made up of a list of Modifiers
1131 """Should only be called by cms.Process instances
1132 applies list of accumulated changes to the process"""
1134 m._applyNewProcessModifiers(process)
1136 """Should only be called by cms.Process instances"""
1144 """A class used by a Modifier to affect an entire Process instance.
1145 When a Process 'loads' a module containing a ProcessModifier, that
1146 ProcessModifier will be applied to the Process if and only if the
1147 Modifier passed to the constructor has been chosen.
1154 if self.__modifier.isChosen():
1157 self.__seenProcesses.add(process)
1159 if __name__==
"__main__":
1164 """Has same interface as the C++ object which creates PSets
1169 self.
values[label]=(tracked,value)
1227 """Nothing to do """
1231 self.assertEqual(len(p.parameterNames_()),0)
1233 self.assert_(
'a' in p.parameterNames_())
1234 self.assertEqual(p.a.value(), 1)
1236 self.assertEqual(p.a.value(), 10)
1238 self.assertEqual(p.a.value(), 1)
1239 self.failIf(p.a.isTracked())
1240 p.a = untracked.int32(1)
1241 self.assertEqual(p.a.value(), 1)
1242 self.failIf(p.a.isTracked())
1244 self.assertEqual(p.foo.value(), 10)
1245 self.assertEqual(p.bar.value(),1.0)
1246 self.failIf(p.bar.isTracked())
1247 self.assertRaises(TypeError,setattr,(p,
'c',1))
1249 self.assertEqual(p.a.foo.value(),10)
1250 self.assertEqual(p.a.bar.value(),1.0)
1252 self.assertEqual(p.b.fii.value(),1)
1253 self.failIf(p.b.isTracked())
1258 self.assertEqual(p.a.value(),11)
1260 self.assertEqual(p.a.value(),12)
1261 self.assertEqual(v.value(),12)
1267 self.assertNotEqual(p.b,other.b)
1272 self.assert_(
'a' in p.analyzers_() )
1273 self.assert_(
'a' in p.analyzers)
1274 p.add_(
Service(
"MessageLogger"))
1275 self.assert_(
'MessageLogger' in p.services_())
1276 self.assertEqual(p.MessageLogger.type_(),
"MessageLogger")
1278 self.assert_(
'Tracer' in p.services_())
1279 self.assertRaises(TypeError, setattr, *(p,
'b',
"this should fail"))
1280 self.assertRaises(TypeError, setattr, *(p,
'bad',
Service(
"MessageLogger")))
1281 self.assertRaises(ValueError, setattr, *(p,
'bad',
Source(
"PoolSource")))
1283 self.assertEqual(p.out.type_(),
'Outer')
1284 self.assert_(
'out' in p.outputModules_() )
1287 self.assert_(
'geom' in p.es_sources_())
1289 self.assert_(
'ConfigDB' in p.es_sources_())
1292 self.assert_(
'aliasfoo1' in p.aliases_())
1297 for name
in args.iterkeys():
1298 self.__dict__[name]=args[name]
1317 self.assertEqual(p.a.type_(),
"MyAnalyzer")
1318 self.assertEqual(p.a.label_(),
"a")
1319 self.assertRaises(AttributeError,getattr,p,
'b')
1320 self.assertEqual(p.Full.type_(),
"Full")
1321 self.assertEqual(str(p.c),
'a')
1322 self.assertEqual(str(p.d),
'a')
1337 self.assertRaises(ValueError, p1.extend, z1)
1346 aaa=copy.deepcopy(a),
1347 s4=copy.deepcopy(s3),
1354 self.assertEqual(p2.s4.label_(),
"s4")
1356 self.assertRaises(ValueError, p2.s4.setLabel,
"foo")
1357 p2.s4.setLabel(
"s4")
1358 p2.s4.setLabel(
None)
1359 p2.s4.setLabel(
"foo")
1360 p2._Process__setObjectLabel(p2.s4,
"foo")
1361 p2._Process__setObjectLabel(p2.s4,
None)
1362 p2._Process__setObjectLabel(p2.s4,
"bar")
1374 """import FWCore.ParameterSet.Config as cms
1376 process = cms.Process("test")
1378 process.a = cms.EDAnalyzer("MyAnalyzer")
1381 process.s = cms.Sequence(process.a)
1384 process.r = cms.Sequence(process.s)
1387 process.p = cms.Path(process.a)
1390 process.p2 = cms.Path(process.s)
1393 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1406 """import FWCore.ParameterSet.Config as cms
1408 process = cms.Process("test")
1410 process.a = cms.EDAnalyzer("MyAnalyzer")
1413 process.b = cms.EDAnalyzer("YourAnalyzer")
1416 process.r = cms.Sequence(process.a)
1419 process.s = cms.Sequence(process.r)
1422 process.p = cms.Path(process.a)
1425 process.p2 = cms.Path(process.r)
1428 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1440 """import FWCore.ParameterSet.Config as cms
1442 process = cms.Process("test")
1444 process.a = cms.EDAnalyzer("MyAnalyzer")
1447 process.r = cms.Sequence((process.a))
1450 process.p = cms.Path(process.a)
1453 process.p2 = cms.Path(process.r)
1456 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1462 self.assertEqual(p.dumpPython().
replace(
'\n',
''),
'import FWCore.ParameterSet.Config as cmsprocess = cms.Process("test")process.a = cms.SecSource("MySecSource")')
1470 p.p =
Path(p.c+p.s+p.a)
1472 p.globalReplace(
"a",new)
1480 self.assertEqual(str(p.s),
'a+b')
1481 self.assertEqual(p.s.label_(),
's')
1482 path =
Path(p.c+p.s)
1483 self.assertEqual(str(path),
'c+a+b')
1484 p._validateSequence(path,
'p1')
1486 p2 =
Path(p.c+p.s*notInProcess)
1487 self.assertRaises(RuntimeError, p._validateSequence, p2,
'p2')
1497 self.assertRaises(ValueError, p.__setattr__,
"y", testseq)
1507 self.assertEqual(str(path),
'a+b+c')
1508 path =
Path(p.a*p.b+p.c)
1509 self.assertEqual(str(path),
'a+b+c')
1512 path =
Path(p.a+ p.b*p.c)
1513 self.assertEqual(str(path),
'a+b+c')
1514 path =
Path(p.a*(p.b+p.c))
1515 self.assertEqual(str(path),
'a+b+c')
1516 path =
Path(p.a*(p.b+~p.c))
1517 self.assertEqual(str(path),
'a+b+~c')
1519 self.assertRaises(TypeError,Path,p.es)
1530 p.path =
Path(p.a*p.b)
1531 lookuptable = {id(a): p.a, id(b): p.b}
1535 self.assertEqual(str(path),str(p.path))
1548 self.assertEqual(s[0],p.path1)
1549 self.assertEqual(s[1],p.path2)
1551 self.assert_(
'b' in p.schedule.moduleNames())
1552 self.assert_(hasattr(p,
'b'))
1553 self.assert_(hasattr(p,
'c'))
1554 self.assert_(hasattr(p,
'd'))
1555 self.assert_(hasattr(p,
'path1'))
1556 self.assert_(hasattr(p,
'path2'))
1557 self.assert_(hasattr(p,
'path3'))
1559 self.assert_(
'b' in p.schedule.moduleNames())
1560 self.assert_(hasattr(p,
'b'))
1561 self.assert_(
not hasattr(p,
'c'))
1562 self.assert_(
not hasattr(p,
'd'))
1563 self.assert_(hasattr(p,
'path1'))
1564 self.assert_(hasattr(p,
'path2'))
1565 self.assert_(
not hasattr(p,
'path3'))
1572 self.assertRaises(RuntimeError,
lambda : p.setSchedule_(s) )
1581 self.assert_(
'a' in s.moduleNames())
1582 self.assert_(
'b' in s.moduleNames())
1583 self.assert_(
'c' in s.moduleNames())
1587 self.assert_(
'a' in s.moduleNames())
1588 self.assert_(
'b' in s.moduleNames())
1589 self.assert_(
'c' in s.moduleNames())
1598 self.assert_(p.schedule
is None)
1601 self.assertEqual(pths[keys[0]],p.path1)
1602 self.assertEqual(pths[keys[1]],p.path2)
1604 self.assert_(hasattr(p,
'a'))
1605 self.assert_(hasattr(p,
'b'))
1606 self.assert_(
not hasattr(p,
'c'))
1607 self.assert_(hasattr(p,
'path1'))
1608 self.assert_(hasattr(p,
'path2'))
1617 self.assert_(p.schedule
is None)
1620 self.assertEqual(pths[keys[1]],p.path1)
1621 self.assertEqual(pths[keys[0]],p.path2)
1628 self.assertEqual(p.modu.a.value(),1)
1629 self.assertEqual(p.modu.b.value(),2)
1634 self.assert_(
not a.isModified())
1636 self.assert_(a.isModified())
1638 self.assertEqual(p.a.a1.value(), 1)
1642 self.assertEqual(p.a.a1.value(), 2)
1651 self.assertRaises(ValueError, EDProducer,
'C', ps1, ps2)
1652 self.assertRaises(ValueError, EDProducer,
'C', ps1, a=
int32(3))
1660 p.bars.foos =
'Foosball'
1661 self.assertEqual(p.bars.foos,
InputTag(
'Foosball'))
1662 p.p =
Path(p.foos*p.bars)
1664 p.add_(
Service(
"MessageLogger"))
1670 p.prefer(
"ForceSource")
1672 self.assertEqual(p.dumpConfig(),
1674 es_module juicer = JuicerProducer {
1676 es_source = ForceSource {
1678 es_prefer = ForceSource {
1680 es_prefer juicer = JuicerProducer {
1684 p.prefer(
"juicer",fooRcd=
vstring(
"Foo"))
1685 self.assertEqual(p.dumpConfig(),
1687 es_module juicer = JuicerProducer {
1689 es_source = ForceSource {
1691 es_prefer = ForceSource {
1693 es_prefer juicer = JuicerProducer {
1701 self.assertEqual(p.dumpPython(),
1702 """import FWCore.ParameterSet.Config as cms
1704 process = cms.Process("Test")
1706 process.juicer = cms.ESProducer("JuicerProducer")
1709 process.ForceSource = cms.ESSource("ForceSource")
1712 process.prefer("ForceSource")
1714 process.prefer("juicer",
1715 fooRcd = cms.vstring('Foo')
1732 self.assertEqual(process.m.p.i.value(), 4)
1742 subProcess.p =
Path(subProcess.a)
1743 subProcess.add_(
Service(
"Foo"))
1745 d = process.dumpPython()
1746 equalD =
"""import FWCore.ParameterSet.Config as cms
1748 process = cms.Process("Parent")
1750 parentProcess = process
1751 import FWCore.ParameterSet.Config as cms
1753 process = cms.Process("Child")
1755 process.a = cms.EDProducer("A")
1758 process.p = cms.Path(process.a)
1761 process.Foo = cms.Service("Foo")
1764 childProcess = process
1765 process = parentProcess
1766 process.subProcess = cms.SubProcess( process = childProcess, SelectEvents = cms.untracked.PSet(
1768 ), outputCommands = cms.untracked.vstring())
1770 equalD = equalD.replace(
"parentProcess",
"parentProcess"+str(
hash(process.subProcess)))
1771 self.assertEqual(d,equalD)
1773 process.subProcess.insertInto(p,
"dummy")
1774 self.assertEqual((
True,[
'a']),p.values[
"@sub_process"][1].values[
"process"][1].values[
'@all_modules'])
1775 self.assertEqual((
True,[
'p']),p.values[
"@sub_process"][1].values[
"process"][1].values[
'@paths'])
1776 self.assertEqual({
'@service_type':(
True,
'Foo')}, p.values[
"@sub_process"][1].values[
"process"][1].values[
"services"][1][0].values)
1786 proc.fillProcessDesc(p)
1787 self.assertEqual((
True,1),p.values[
"ref"][1].values[
"a"])
1788 self.assertEqual((
True,1),p.values[
"ref3"][1].values[
"a"])
1789 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"a"])
1790 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"b"][1].values[
"a"])
1791 self.assertEqual((
True,1),p.values[
"ref4"][1][0].values[
"a"])
1792 self.assertEqual((
True,1),p.values[
"ref4"][1][1].values[
"a"])
1802 self.assert_(p.schedule
is None)
1805 self.assertEqual(pths[keys[0]],p.path1)
1806 self.assertEqual(pths[keys[1]],p.path2)
1808 p.pset2 = untracked.PSet(parA =
string(
"pset2"))
1810 p.vpset2 = untracked.VPSet()
1812 self.assert_(hasattr(p,
'a'))
1813 self.assert_(hasattr(p,
'b'))
1814 self.assert_(
not hasattr(p,
'c'))
1815 self.assert_(
not hasattr(p,
'd'))
1816 self.assert_(
not hasattr(p,
's'))
1817 self.assert_(hasattr(p,
'path1'))
1818 self.assert_(hasattr(p,
'path2'))
1835 p.path3 =
Path(p.b+p.s2)
1836 p.path4 =
Path(p.b+p.s3)
1837 p.schedule =
Schedule(p.path1,p.path2,p.path3)
1840 self.assertEqual(pths[keys[0]],p.path1)
1841 self.assertEqual(pths[keys[1]],p.path2)
1843 self.assert_(hasattr(p,
'a'))
1844 self.assert_(hasattr(p,
'b'))
1845 self.assert_(
not hasattr(p,
'c'))
1846 self.assert_(
not hasattr(p,
'd'))
1847 self.assert_(
not hasattr(p,
'e'))
1848 self.assert_(
not hasattr(p,
's'))
1849 self.assert_(hasattr(p,
's2'))
1850 self.assert_(
not hasattr(p,
's3'))
1851 self.assert_(hasattr(p,
'path1'))
1852 self.assert_(hasattr(p,
'path2'))
1853 self.assert_(hasattr(p,
'path3'))
1854 self.assert_(
not hasattr(p,
'path4'))
1862 self.assert_(hasattr(p,
'a'))
1863 self.assert_(hasattr(p,
'b'))
1864 self.assert_(hasattr(p,
's'))
1865 self.assert_(hasattr(p,
'pth'))
1871 p.prune(keepUnresolvedSequencePlaceholders=
True)
1872 self.assert_(hasattr(p,
'b'))
1873 self.assert_(hasattr(p,
's'))
1874 self.assert_(hasattr(p,
'pth'))
1875 self.assertEqual(p.s.dumpPython(
''),
'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
1882 m1.toModify(p.a,_mod_fred)
1883 self.assertEqual(p.a.fred.value(),2)
1885 m1.toModify(p.b, wilma = 2)
1886 self.assertEqual(p.b.wilma.value(),2)
1891 m1.toModify(p.a,_mod_fred)
1893 m1.toModify(p.b, wilma = 2)
1894 self.assertEqual(p.a.fred.value(),1)
1895 self.assertEqual(p.b.wilma.value(),1)
1900 m1.toModify(p.a, fred =
int32(2))
1901 p.b = p.a.clone(wilma =
int32(3))
1902 self.assertEqual(p.a.fred.value(),2)
1903 self.assertEqual(p.a.wilma.value(),1)
1904 self.assertEqual(p.b.fred.value(),2)
1905 self.assertEqual(p.b.wilma.value(),3)
1909 class ProcModifierMod(
object):
1915 testMod = DummyMod()
1917 self.assert_(hasattr(p,
"a"))
1920 testProcMod = ProcModifierMod(m1,_rem_a)
1922 p.extend(testProcMod)
1923 self.assert_(
not hasattr(p,
"a"))
1928 testMod = DummyMod()
1930 m1.toModify(p.b, fred =
int32(3))
1932 testProcMod = ProcModifierMod(m1,_rem_a)
1933 p.extend(testProcMod)
1934 self.assert_(
not hasattr(p,
"a"))
1935 self.assertEqual(p.b.fred.value(),3)
def _dumpConfigUnnamedList
def testProcessDumpPython
def _dumpConfigOptionallyNamedList
def visit
Retrieve data from a perf suite output (sub) directory, only examines TimeSize at the moment...
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
def _sequencesInDependencyOrder
def __findFirstSequenceUsingModule
static std::string join(char **cmd)
def _applyNewProcessModifiers
def checkImportPermission
def testTypedParameterizable
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run