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"
1070 return '@sub_process'
1072 process._placeSubProcess(
'subProcess',self)
1074 topPSet = parameterSet.newPSet()
1075 self.__process.fillProcessDesc(topPSet)
1076 subProcessPSet = parameterSet.newPSet()
1077 self.__SelectEvents.insertInto(subProcessPSet,
"SelectEvents")
1078 self.__outputCommands.insertInto(subProcessPSet,
"outputCommands")
1079 subProcessPSet.addPSet(
False,
"process",topPSet)
1083 """Helper class for Modifier which takes key/value pairs and uses them to reset parameters of the object"""
1087 for k,v
in self.__args.iteritems():
1091 """This class is used to define standard modifications to a Process.
1092 An instance of this class is declared to denote a specific modification,e.g. era2017 could
1093 reconfigure items in a process to match our expectation of running in 2017. Once declared,
1094 these Modifier instances are imported into a configuration and items which need to be modified
1095 are then associated with the Modifier and with the action to do the modification.
1096 The registered modifications will only occur if the Modifier was passed to
1097 the cms.Process' constructor.
1103 """This is used to create a ProcessModifer which can perform actions on the process as a whole.
1104 This takes as argument a callable object (e.g. function) which takes as its sole argument an instance of Process.
1105 In order to work, the value returned from this function must be assigned to a uniquely named variable.
1109 """This is used to register an action to be performed on the specific object. Two different forms are allowed
1110 Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1111 which will be the object passed in as the first argument.
1112 Form 2: A list of parameter name, value pairs can be passed
1113 mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1115 if func
is not None and len(kw) != 0:
1116 raise TypeError(
"toModify takes either two arguments or one argument and key/value pairs")
1119 if func
is not None:
1125 """Should only be called by cms.Process instances"""
1131 """A Modifier made up of a list of Modifiers
1137 """Should only be called by cms.Process instances
1138 applies list of accumulated changes to the process"""
1140 m._applyNewProcessModifiers(process)
1142 """Should only be called by cms.Process instances"""
1150 """A class used by a Modifier to affect an entire Process instance.
1151 When a Process 'loads' a module containing a ProcessModifier, that
1152 ProcessModifier will be applied to the Process if and only if the
1153 Modifier passed to the constructor has been chosen.
1160 if self.__modifier.isChosen():
1163 self.__seenProcesses.add(process)
1165 if __name__==
"__main__":
1170 """Has same interface as the C++ object which creates PSets
1175 self.
values[label]=(tracked,value)
1233 """Nothing to do """
1237 self.assertEqual(len(p.parameterNames_()),0)
1239 self.assert_(
'a' in p.parameterNames_())
1240 self.assertEqual(p.a.value(), 1)
1242 self.assertEqual(p.a.value(), 10)
1244 self.assertEqual(p.a.value(), 1)
1245 self.failIf(p.a.isTracked())
1246 p.a = untracked.int32(1)
1247 self.assertEqual(p.a.value(), 1)
1248 self.failIf(p.a.isTracked())
1250 self.assertEqual(p.foo.value(), 10)
1251 self.assertEqual(p.bar.value(),1.0)
1252 self.failIf(p.bar.isTracked())
1253 self.assertRaises(TypeError,setattr,(p,
'c',1))
1255 self.assertEqual(p.a.foo.value(),10)
1256 self.assertEqual(p.a.bar.value(),1.0)
1258 self.assertEqual(p.b.fii.value(),1)
1259 self.failIf(p.b.isTracked())
1264 self.assertEqual(p.a.value(),11)
1266 self.assertEqual(p.a.value(),12)
1267 self.assertEqual(v.value(),12)
1273 self.assertNotEqual(p.b,other.b)
1278 self.assert_(
'a' in p.analyzers_() )
1279 self.assert_(
'a' in p.analyzers)
1280 p.add_(
Service(
"MessageLogger"))
1281 self.assert_(
'MessageLogger' in p.services_())
1282 self.assertEqual(p.MessageLogger.type_(),
"MessageLogger")
1284 self.assert_(
'Tracer' in p.services_())
1285 self.assertRaises(TypeError, setattr, *(p,
'b',
"this should fail"))
1286 self.assertRaises(TypeError, setattr, *(p,
'bad',
Service(
"MessageLogger")))
1287 self.assertRaises(ValueError, setattr, *(p,
'bad',
Source(
"PoolSource")))
1289 self.assertEqual(p.out.type_(),
'Outer')
1290 self.assert_(
'out' in p.outputModules_() )
1293 self.assert_(
'geom' in p.es_sources_())
1295 self.assert_(
'ConfigDB' in p.es_sources_())
1298 self.assert_(
'aliasfoo1' in p.aliases_())
1303 for name
in args.iterkeys():
1304 self.__dict__[name]=args[name]
1323 self.assertEqual(p.a.type_(),
"MyAnalyzer")
1324 self.assertEqual(p.a.label_(),
"a")
1325 self.assertRaises(AttributeError,getattr,p,
'b')
1326 self.assertEqual(p.Full.type_(),
"Full")
1327 self.assertEqual(str(p.c),
'a')
1328 self.assertEqual(str(p.d),
'a')
1343 self.assertRaises(ValueError, p1.extend, z1)
1352 aaa=copy.deepcopy(a),
1353 s4=copy.deepcopy(s3),
1360 self.assertEqual(p2.s4.label_(),
"s4")
1362 self.assertRaises(ValueError, p2.s4.setLabel,
"foo")
1363 p2.s4.setLabel(
"s4")
1364 p2.s4.setLabel(
None)
1365 p2.s4.setLabel(
"foo")
1366 p2._Process__setObjectLabel(p2.s4,
"foo")
1367 p2._Process__setObjectLabel(p2.s4,
None)
1368 p2._Process__setObjectLabel(p2.s4,
"bar")
1380 """import FWCore.ParameterSet.Config as cms
1382 process = cms.Process("test")
1384 process.a = cms.EDAnalyzer("MyAnalyzer")
1387 process.s = cms.Sequence(process.a)
1390 process.r = cms.Sequence(process.s)
1393 process.p = cms.Path(process.a)
1396 process.p2 = cms.Path(process.s)
1399 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1412 """import FWCore.ParameterSet.Config as cms
1414 process = cms.Process("test")
1416 process.a = cms.EDAnalyzer("MyAnalyzer")
1419 process.b = cms.EDAnalyzer("YourAnalyzer")
1422 process.r = cms.Sequence(process.a)
1425 process.s = cms.Sequence(process.r)
1428 process.p = cms.Path(process.a)
1431 process.p2 = cms.Path(process.r)
1434 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1446 """import FWCore.ParameterSet.Config as cms
1448 process = cms.Process("test")
1450 process.a = cms.EDAnalyzer("MyAnalyzer")
1453 process.r = cms.Sequence((process.a))
1456 process.p = cms.Path(process.a)
1459 process.p2 = cms.Path(process.r)
1462 process.schedule = cms.Schedule(*[ process.p2, process.p ])
1468 self.assertEqual(p.dumpPython().
replace(
'\n',
''),
'import FWCore.ParameterSet.Config as cmsprocess = cms.Process("test")process.a = cms.SecSource("MySecSource")')
1476 p.p =
Path(p.c+p.s+p.a)
1478 p.globalReplace(
"a",new)
1486 self.assertEqual(str(p.s),
'a+b')
1487 self.assertEqual(p.s.label_(),
's')
1488 path =
Path(p.c+p.s)
1489 self.assertEqual(str(path),
'c+a+b')
1490 p._validateSequence(path,
'p1')
1492 p2 =
Path(p.c+p.s*notInProcess)
1493 self.assertRaises(RuntimeError, p._validateSequence, p2,
'p2')
1503 self.assertRaises(ValueError, p.__setattr__,
"y", testseq)
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')
1518 path =
Path(p.a+ p.b*p.c)
1519 self.assertEqual(str(path),
'a+b+c')
1520 path =
Path(p.a*(p.b+p.c))
1521 self.assertEqual(str(path),
'a+b+c')
1522 path =
Path(p.a*(p.b+~p.c))
1523 self.assertEqual(str(path),
'a+b+~c')
1525 self.assertRaises(TypeError,Path,p.es)
1536 p.path =
Path(p.a*p.b)
1537 lookuptable = {id(a): p.a, id(b): p.b}
1541 self.assertEqual(str(path),str(p.path))
1554 self.assertEqual(s[0],p.path1)
1555 self.assertEqual(s[1],p.path2)
1557 self.assert_(
'b' in p.schedule.moduleNames())
1558 self.assert_(hasattr(p,
'b'))
1559 self.assert_(hasattr(p,
'c'))
1560 self.assert_(hasattr(p,
'd'))
1561 self.assert_(hasattr(p,
'path1'))
1562 self.assert_(hasattr(p,
'path2'))
1563 self.assert_(hasattr(p,
'path3'))
1565 self.assert_(
'b' in p.schedule.moduleNames())
1566 self.assert_(hasattr(p,
'b'))
1567 self.assert_(
not hasattr(p,
'c'))
1568 self.assert_(
not hasattr(p,
'd'))
1569 self.assert_(hasattr(p,
'path1'))
1570 self.assert_(hasattr(p,
'path2'))
1571 self.assert_(
not hasattr(p,
'path3'))
1578 self.assertRaises(RuntimeError,
lambda : p.setSchedule_(s) )
1587 self.assert_(
'a' in s.moduleNames())
1588 self.assert_(
'b' in s.moduleNames())
1589 self.assert_(
'c' in s.moduleNames())
1593 self.assert_(
'a' in s.moduleNames())
1594 self.assert_(
'b' in s.moduleNames())
1595 self.assert_(
'c' in s.moduleNames())
1604 self.assert_(p.schedule
is None)
1607 self.assertEqual(pths[keys[0]],p.path1)
1608 self.assertEqual(pths[keys[1]],p.path2)
1610 self.assert_(hasattr(p,
'a'))
1611 self.assert_(hasattr(p,
'b'))
1612 self.assert_(
not hasattr(p,
'c'))
1613 self.assert_(hasattr(p,
'path1'))
1614 self.assert_(hasattr(p,
'path2'))
1623 self.assert_(p.schedule
is None)
1626 self.assertEqual(pths[keys[1]],p.path1)
1627 self.assertEqual(pths[keys[0]],p.path2)
1634 self.assertEqual(p.modu.a.value(),1)
1635 self.assertEqual(p.modu.b.value(),2)
1640 self.assert_(
not a.isModified())
1642 self.assert_(a.isModified())
1644 self.assertEqual(p.a.a1.value(), 1)
1648 self.assertEqual(p.a.a1.value(), 2)
1657 self.assertRaises(ValueError, EDProducer,
'C', ps1, ps2)
1658 self.assertRaises(ValueError, EDProducer,
'C', ps1, a=
int32(3))
1666 p.bars.foos =
'Foosball'
1667 self.assertEqual(p.bars.foos,
InputTag(
'Foosball'))
1668 p.p =
Path(p.foos*p.bars)
1670 p.add_(
Service(
"MessageLogger"))
1676 p.prefer(
"ForceSource")
1678 self.assertEqual(p.dumpConfig(),
1680 es_module juicer = JuicerProducer {
1682 es_source = ForceSource {
1684 es_prefer = ForceSource {
1686 es_prefer juicer = JuicerProducer {
1690 p.prefer(
"juicer",fooRcd=
vstring(
"Foo"))
1691 self.assertEqual(p.dumpConfig(),
1693 es_module juicer = JuicerProducer {
1695 es_source = ForceSource {
1697 es_prefer = ForceSource {
1699 es_prefer juicer = JuicerProducer {
1707 self.assertEqual(p.dumpPython(),
1708 """import FWCore.ParameterSet.Config as cms
1710 process = cms.Process("Test")
1712 process.juicer = cms.ESProducer("JuicerProducer")
1715 process.ForceSource = cms.ESSource("ForceSource")
1718 process.prefer("ForceSource")
1720 process.prefer("juicer",
1721 fooRcd = cms.vstring('Foo')
1738 self.assertEqual(process.m.p.i.value(), 4)
1748 subProcess.p =
Path(subProcess.a)
1749 subProcess.add_(
Service(
"Foo"))
1751 d = process.dumpPython()
1752 equalD =
"""import FWCore.ParameterSet.Config as cms
1754 process = cms.Process("Parent")
1756 parentProcess = process
1757 import FWCore.ParameterSet.Config as cms
1759 process = cms.Process("Child")
1761 process.a = cms.EDProducer("A")
1764 process.p = cms.Path(process.a)
1767 process.Foo = cms.Service("Foo")
1770 childProcess = process
1771 process = parentProcess
1772 process.subProcess = cms.SubProcess( process = childProcess, SelectEvents = cms.untracked.PSet(
1774 ), outputCommands = cms.untracked.vstring())
1776 equalD = equalD.replace(
"parentProcess",
"parentProcess"+str(
hash(process.subProcess)))
1777 self.assertEqual(d,equalD)
1779 process.subProcess.insertInto(p,
"dummy")
1780 self.assertEqual((
True,[
'a']),p.values[
"@sub_process"][1].values[
"process"][1].values[
'@all_modules'])
1781 self.assertEqual((
True,[
'p']),p.values[
"@sub_process"][1].values[
"process"][1].values[
'@paths'])
1782 self.assertEqual({
'@service_type':(
True,
'Foo')}, p.values[
"@sub_process"][1].values[
"process"][1].values[
"services"][1][0].values)
1792 proc.fillProcessDesc(p)
1793 self.assertEqual((
True,1),p.values[
"ref"][1].values[
"a"])
1794 self.assertEqual((
True,1),p.values[
"ref3"][1].values[
"a"])
1795 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"a"])
1796 self.assertEqual((
True,1),p.values[
"ref2"][1].values[
"b"][1].values[
"a"])
1797 self.assertEqual((
True,1),p.values[
"ref4"][1][0].values[
"a"])
1798 self.assertEqual((
True,1),p.values[
"ref4"][1][1].values[
"a"])
1808 self.assert_(p.schedule
is None)
1811 self.assertEqual(pths[keys[0]],p.path1)
1812 self.assertEqual(pths[keys[1]],p.path2)
1814 p.pset2 = untracked.PSet(parA =
string(
"pset2"))
1816 p.vpset2 = untracked.VPSet()
1818 self.assert_(hasattr(p,
'a'))
1819 self.assert_(hasattr(p,
'b'))
1820 self.assert_(
not hasattr(p,
'c'))
1821 self.assert_(
not hasattr(p,
'd'))
1822 self.assert_(
not hasattr(p,
's'))
1823 self.assert_(hasattr(p,
'path1'))
1824 self.assert_(hasattr(p,
'path2'))
1841 p.path3 =
Path(p.b+p.s2)
1842 p.path4 =
Path(p.b+p.s3)
1843 p.schedule =
Schedule(p.path1,p.path2,p.path3)
1846 self.assertEqual(pths[keys[0]],p.path1)
1847 self.assertEqual(pths[keys[1]],p.path2)
1849 self.assert_(hasattr(p,
'a'))
1850 self.assert_(hasattr(p,
'b'))
1851 self.assert_(
not hasattr(p,
'c'))
1852 self.assert_(
not hasattr(p,
'd'))
1853 self.assert_(
not hasattr(p,
'e'))
1854 self.assert_(
not hasattr(p,
's'))
1855 self.assert_(hasattr(p,
's2'))
1856 self.assert_(
not hasattr(p,
's3'))
1857 self.assert_(hasattr(p,
'path1'))
1858 self.assert_(hasattr(p,
'path2'))
1859 self.assert_(hasattr(p,
'path3'))
1860 self.assert_(
not hasattr(p,
'path4'))
1868 self.assert_(hasattr(p,
'a'))
1869 self.assert_(hasattr(p,
'b'))
1870 self.assert_(hasattr(p,
's'))
1871 self.assert_(hasattr(p,
'pth'))
1877 p.prune(keepUnresolvedSequencePlaceholders=
True)
1878 self.assert_(hasattr(p,
'b'))
1879 self.assert_(hasattr(p,
's'))
1880 self.assert_(hasattr(p,
'pth'))
1881 self.assertEqual(p.s.dumpPython(
''),
'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
1888 m1.toModify(p.a,_mod_fred)
1889 self.assertEqual(p.a.fred.value(),2)
1891 m1.toModify(p.b, wilma = 2)
1892 self.assertEqual(p.b.wilma.value(),2)
1897 m1.toModify(p.a,_mod_fred)
1899 m1.toModify(p.b, wilma = 2)
1900 self.assertEqual(p.a.fred.value(),1)
1901 self.assertEqual(p.b.wilma.value(),1)
1906 m1.toModify(p.a, fred =
int32(2))
1907 p.b = p.a.clone(wilma =
int32(3))
1908 self.assertEqual(p.a.fred.value(),2)
1909 self.assertEqual(p.a.wilma.value(),1)
1910 self.assertEqual(p.b.fred.value(),2)
1911 self.assertEqual(p.b.wilma.value(),3)
1915 class ProcModifierMod(
object):
1921 testMod = DummyMod()
1923 self.assert_(hasattr(p,
"a"))
1926 testProcMod = ProcModifierMod(m1,_rem_a)
1928 p.extend(testProcMod)
1929 self.assert_(
not hasattr(p,
"a"))
1934 testMod = DummyMod()
1936 m1.toModify(p.b, fred =
int32(3))
1938 testProcMod = ProcModifierMod(m1,_rem_a)
1939 p.extend(testProcMod)
1940 self.assert_(
not hasattr(p,
"a"))
1941 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