CMS 3D CMS Logo

Config.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 
4 from __future__ import print_function
5 from __future__ import absolute_import
6 import os
7 from .Options import Options
8 options = Options()
9 
10 
11 
12 import sys
13 from .Mixins import PrintOptions,_ParameterTypeBase,_SimpleParameterTypeBase, _Parameterizable, _ConfigureComponent, _TypedParameterizable, _Labelable, _Unlabelable, _ValidatingListBase, _modifyParametersFromDict
14 from .Mixins import *
15 from .Types import *
16 from .Modules import *
17 from .Modules import _Module
18 from .SequenceTypes import *
19 from .SequenceTypes import _ModuleSequenceType, _Sequenceable #extend needs it
20 from .SequenceVisitors import PathValidator, EndPathValidator, FinalPathValidator, ScheduleTaskValidator, NodeVisitor, CompositeVisitor, ModuleNamesFromGlobalsVisitor
21 from .MessageLogger import MessageLogger
22 from . import DictTypes
23 
24 from .ExceptionHandling import *
25 
26 #when building RECO paths we have hit the default recursion limit
27 if sys.getrecursionlimit()<5000:
28  sys.setrecursionlimit(5000)
29 
30 class edm(object):
31  class errors(object):
32  #Allowed errors to be used within Python
33  Configuration = "{Configuration}"
34  UnavailableAccelerator = "{UnavailableAccelerator}"
35 
37  def __init__(self, error, message):
38  super().__init__(error+"\n"+message)
39 
40 
41 def checkImportPermission(minLevel = 2, allowedPatterns = []):
42  """
43  Raise an exception if called by special config files. This checks
44  the call or import stack for the importing file. An exception is raised if
45  the importing module is not in allowedPatterns and if it is called too deeply:
46  minLevel = 2: inclusion by top lvel cfg only
47  minLevel = 1: No inclusion allowed
48  allowedPatterns = ['Module1','Module2/SubModule1'] allows import
49  by any module in Module1 or Submodule1
50  """
51 
52  import inspect
53  import os
54 
55  ignorePatterns = ['FWCore/ParameterSet/Config.py', 'FWCore/ParameterSet/python/Config.py','<string>','<frozen ']
56  CMSSWPath = [os.environ['CMSSW_BASE'],os.environ['CMSSW_RELEASE_BASE']]
57 
58  # Filter the stack to things in CMSSWPath and not in ignorePatterns
59  trueStack = []
60  for item in inspect.stack():
61  inPath = False
62  ignore = False
63 
64  for pattern in CMSSWPath:
65  if item[1].find(pattern) != -1:
66  inPath = True
67  break
68  if item[1].find('/') == -1: # The base file, no path
69  inPath = True
70 
71  for pattern in ignorePatterns:
72  if item[1].find(pattern) != -1:
73  ignore = True
74  break
75 
76  if inPath and not ignore:
77  trueStack.append(item[1])
78 
79  importedFile = trueStack[0]
80  importedBy = ''
81  if len(trueStack) > 1:
82  importedBy = trueStack[1]
83 
84  for pattern in allowedPatterns:
85  if importedBy.find(pattern) > -1:
86  return True
87 
88  if len(trueStack) <= minLevel: # Imported directly
89  return True
90 
91  raise ImportError("Inclusion of %s is allowed only by cfg or specified cfi files."
92  % importedFile)
93 
94 def findProcess(module):
95  """Look inside the module and find the Processes it contains"""
96  class Temp(object):
97  pass
98  process = None
99  if isinstance(module,dict):
100  if 'process' in module:
101  p = module['process']
102  module = Temp()
103  module.process = p
104  if hasattr(module,'process'):
105  if isinstance(module.process,Process):
106  process = module.process
107  else:
108  raise RuntimeError("The attribute named 'process' does not inherit from the Process class")
109  else:
110  raise RuntimeError("no 'process' attribute found in the module, please add one")
111  return process
112 
114  """Root class for a CMS configuration process"""
115  _firstProcess = True
116  def __init__(self,name,*Mods):
117  """The argument 'name' will be the name applied to this Process
118  Can optionally pass as additional arguments cms.Modifier instances
119  that will be used to modify the Process as it is built
120  """
121  self.__dict__['_Process__name'] = name
122  if not name.isalnum():
123  raise RuntimeError("Error: The process name is an empty string or contains non-alphanumeric characters")
124  self.__dict__['_Process__filters'] = {}
125  self.__dict__['_Process__producers'] = {}
126  self.__dict__['_Process__switchproducers'] = {}
127  self.__dict__['_Process__source'] = None
128  self.__dict__['_Process__looper'] = None
129  self.__dict__['_Process__subProcesses'] = []
130  self.__dict__['_Process__schedule'] = None
131  self.__dict__['_Process__analyzers'] = {}
132  self.__dict__['_Process__outputmodules'] = {}
133  self.__dict__['_Process__paths'] = DictTypes.SortedKeysDict() # have to keep the order
134  self.__dict__['_Process__endpaths'] = DictTypes.SortedKeysDict() # of definition
135  self.__dict__['_Process__finalpaths'] = DictTypes.SortedKeysDict() # of definition
136  self.__dict__['_Process__sequences'] = {}
137  self.__dict__['_Process__tasks'] = {}
138  self.__dict__['_Process__conditionaltasks'] = {}
139  self.__dict__['_Process__services'] = {}
140  self.__dict__['_Process__essources'] = {}
141  self.__dict__['_Process__esproducers'] = {}
142  self.__dict__['_Process__esprefers'] = {}
143  self.__dict__['_Process__aliases'] = {}
144  self.__dict__['_Process__psets']={}
145  self.__dict__['_Process__vpsets']={}
146  self.__dict__['_cloneToObjectDict'] = {}
147  # policy switch to avoid object overwriting during extend/load
148  self.__dict__['_Process__InExtendCall'] = False
149  self.__dict__['_Process__partialschedules'] = {}
150  self.__isStrict = False
151  self.__dict__['_Process__modifiers'] = Mods
152  self.__dict__['_Process__accelerators'] = {}
153  self.__injectValidValue('options', Process.defaultOptions_())
154  self.__injectValidValue('maxEvents', Process.defaultMaxEvents_())
155  self.maxLuminosityBlocks = Process.defaultMaxLuminosityBlocks_()
156  # intentionally not cloned to ensure that everyone taking
157  # MessageLogger still via
158  # FWCore.Message(Logger|Service).MessageLogger_cfi
159  # use the very same MessageLogger object.
160  self.MessageLogger = MessageLogger
161  if Process._firstProcess:
162  Process._firstProcess = False
163  else:
164  if len(Mods) > 0:
165  for m in self.__modifiers:
166  if not m._isChosen():
167  raise RuntimeError("The Process {} tried to redefine which Modifiers to use after another Process was already started".format(name))
168  for m in self.__modifiers:
169  m._setChosen()
170 
171  def setStrict(self, value):
172  self.__isStrict = value
173  _Module.__isStrict__ = True
174 
175  # some user-friendly methods for command-line browsing
176  def producerNames(self):
177  """Returns a string containing all the EDProducer labels separated by a blank"""
178  return ' '.join(self.producers_().keys())
180  """Returns a string containing all the SwitchProducer labels separated by a blank"""
181  return ' '.join(self.switchProducers_().keys())
182  def analyzerNames(self):
183  """Returns a string containing all the EDAnalyzer labels separated by a blank"""
184  return ' '.join(self.analyzers_().keys())
185  def filterNames(self):
186  """Returns a string containing all the EDFilter labels separated by a blank"""
187  return ' '.join(self.filters_().keys())
188  def pathNames(self):
189  """Returns a string containing all the Path names separated by a blank"""
190  return ' '.join(self.paths_().keys())
191 
192  def __setstate__(self, pkldict):
193  """
194  Unpickling hook.
195 
196  Since cloneToObjectDict stores a hash of objects by their
197  id() it needs to be updated when unpickling to use the
198  new object id values instantiated during the unpickle.
199 
200  """
201  self.__dict__.update(pkldict)
202  tmpDict = {}
203  for value in self._cloneToObjectDict.values():
204  tmpDict[id(value)] = value
205  self.__dict__['_cloneToObjectDict'] = tmpDict
206 
207 
208 
209  def filters_(self):
210  """returns a dict of the filters that have been added to the Process"""
211  return DictTypes.FixedKeysDict(self.__filters)
212  filters = property(filters_, doc="dictionary containing the filters for the process")
213  def name_(self):
214  return self.__name
215  def setName_(self,name):
216  if not name.isalnum():
217  raise RuntimeError("Error: The process name is an empty string or contains non-alphanumeric characters")
218  self.__dict__['_Process__name'] = name
219  process = property(name_,setName_, doc="name of the process")
220  def producers_(self):
221  """returns a dict of the producers that have been added to the Process"""
222  return DictTypes.FixedKeysDict(self.__producers)
223  producers = property(producers_,doc="dictionary containing the producers for the process")
224  def switchProducers_(self):
225  """returns a dict of the SwitchProducers that have been added to the Process"""
226  return DictTypes.FixedKeysDict(self.__switchproducers)
227  switchProducers = property(switchProducers_,doc="dictionary containing the SwitchProducers for the process")
228  def source_(self):
229  """returns the source that has been added to the Process or None if none have been added"""
230  return self.__source
231  def setSource_(self,src):
232  self._placeSource('source',src)
233  source = property(source_,setSource_,doc='the main source or None if not set')
234  def looper_(self):
235  """returns the looper that has been added to the Process or None if none have been added"""
236  return self.__looper
237  def setLooper_(self,lpr):
238  self._placeLooper('looper',lpr)
239  looper = property(looper_,setLooper_,doc='the main looper or None if not set')
240  @staticmethod
242  return untracked.PSet(numberOfThreads = untracked.uint32(1),
243  numberOfStreams = untracked.uint32(0),
244  numberOfConcurrentRuns = untracked.uint32(1),
245  numberOfConcurrentLuminosityBlocks = untracked.uint32(0),
246  eventSetup = untracked.PSet(
247  numberOfConcurrentIOVs = untracked.uint32(0),
248  forceNumberOfConcurrentIOVs = untracked.PSet(
249  allowAnyLabel_ = required.untracked.uint32
250  )
251  ),
252  accelerators = untracked.vstring('*'),
253  wantSummary = untracked.bool(False),
254  fileMode = untracked.string('FULLMERGE'),
255  forceEventSetupCacheClearOnNewRun = untracked.bool(False),
256  throwIfIllegalParameter = untracked.bool(True),
257  printDependencies = untracked.bool(False),
258  deleteNonConsumedUnscheduledModules = untracked.bool(True),
259  sizeOfStackForThreadsInKB = optional.untracked.uint32,
260  Rethrow = untracked.vstring(),
261  SkipEvent = untracked.vstring(),
262  FailPath = untracked.vstring(),
263  IgnoreCompletely = untracked.vstring(),
264  canDeleteEarly = untracked.vstring(),
265  holdsReferencesToDeleteEarly = untracked.VPSet(),
266  modulesToIgnoreForDeleteEarly = untracked.vstring(),
267  dumpOptions = untracked.bool(False),
268  allowUnscheduled = obsolete.untracked.bool,
269  emptyRunLumiMode = obsolete.untracked.string,
270  makeTriggerResults = obsolete.untracked.bool,
271  )
272  def __updateOptions(self,opt):
273  newOpts = self.defaultOptions_()
274  if isinstance(opt,dict):
275  for k,v in opt.items():
276  setattr(newOpts,k,v)
277  else:
278  for p in opt.parameters_():
279  setattr(newOpts, p, getattr(opt,p))
280  return newOpts
281  @staticmethod
283  return untracked.PSet(input=optional.untracked.int32,
284  output=optional.untracked.allowed(int32,PSet))
285  def __updateMaxEvents(self,ps):
286  newMax = self.defaultMaxEvents_()
287  if isinstance(ps,dict):
288  for k,v in ps.items():
289  setattr(newMax,k,v)
290  else:
291  for p in ps.parameters_():
292  setattr(newMax, p, getattr(ps,p))
293  return newMax
294  @staticmethod
296  return untracked.PSet(input=untracked.int32(-1))
297  def subProcesses_(self):
298  """returns a list of the subProcesses that have been added to the Process"""
299  return self.__subProcesses
300  subProcesses = property(subProcesses_,doc='the SubProcesses that have been added to the Process')
301  def analyzers_(self):
302  """returns a dict of the analyzers that have been added to the Process"""
303  return DictTypes.FixedKeysDict(self.__analyzers)
304  analyzers = property(analyzers_,doc="dictionary containing the analyzers for the process")
305  def outputModules_(self):
306  """returns a dict of the output modules that have been added to the Process"""
307  return DictTypes.FixedKeysDict(self.__outputmodules)
308  outputModules = property(outputModules_,doc="dictionary containing the output_modules for the process")
309  def paths_(self):
310  """returns a dict of the paths that have been added to the Process"""
311  return DictTypes.SortedAndFixedKeysDict(self.__paths)
312  paths = property(paths_,doc="dictionary containing the paths for the process")
313  def endpaths_(self):
314  """returns a dict of the endpaths that have been added to the Process"""
315  return DictTypes.SortedAndFixedKeysDict(self.__endpaths)
316  endpaths = property(endpaths_,doc="dictionary containing the endpaths for the process")
317  def finalpaths_(self):
318  """returns a dict of the finalpaths that have been added to the Process"""
319  return DictTypes.SortedAndFixedKeysDict(self.__finalpaths)
320  finalpaths = property(finalpaths_,doc="dictionary containing the finalpaths for the process")
321  def sequences_(self):
322  """returns a dict of the sequences that have been added to the Process"""
323  return DictTypes.FixedKeysDict(self.__sequences)
324  sequences = property(sequences_,doc="dictionary containing the sequences for the process")
325  def tasks_(self):
326  """returns a dict of the tasks that have been added to the Process"""
327  return DictTypes.FixedKeysDict(self.__tasks)
328  tasks = property(tasks_,doc="dictionary containing the tasks for the process")
329  def conditionaltasks_(self):
330  """returns a dict of the conditionaltasks that have been added to the Process"""
331  return DictTypes.FixedKeysDict(self.__conditionaltasks)
332  conditionaltasks = property(conditionaltasks_,doc="dictionary containing the conditionatasks for the process")
333  def schedule_(self):
334  """returns the schedule that has been added to the Process or None if none have been added"""
335  return self.__schedule
336  def setPartialSchedule_(self,sch,label):
337  if label == "schedule":
338  self.setSchedule_(sch)
339  else:
340  self._place(label, sch, self.__partialschedules)
341  def setSchedule_(self,sch):
342  # See if every path and endpath has been inserted into the process
343  index = 0
344  try:
345  for p in sch:
346  p.label_()
347  index +=1
348  except:
349  raise RuntimeError("The path at index "+str(index)+" in the Schedule was not attached to the process.")
350  self.__dict__['_Process__schedule'] = sch
351  schedule = property(schedule_,setSchedule_,doc='the schedule or None if not set')
352  def services_(self):
353  """returns a dict of the services that have been added to the Process"""
354  return DictTypes.FixedKeysDict(self.__services)
355  services = property(services_,doc="dictionary containing the services for the process")
357  """returns a dict of the ProcessAccelerators that have been added to the Process"""
358  return DictTypes.FixedKeysDict(self.__accelerators)
359  processAccelerators = property(processAccelerators_,doc="dictionary containing the ProcessAccelerators for the process")
360  def es_producers_(self):
361  """returns a dict of the esproducers that have been added to the Process"""
362  return DictTypes.FixedKeysDict(self.__esproducers)
363  es_producers = property(es_producers_,doc="dictionary containing the es_producers for the process")
364  def es_sources_(self):
365  """returns a the es_sources that have been added to the Process"""
366  return DictTypes.FixedKeysDict(self.__essources)
367  es_sources = property(es_sources_,doc="dictionary containing the es_sources for the process")
368  def es_prefers_(self):
369  """returns a dict of the es_prefers that have been added to the Process"""
370  return DictTypes.FixedKeysDict(self.__esprefers)
371  es_prefers = property(es_prefers_,doc="dictionary containing the es_prefers for the process")
372  def aliases_(self):
373  """returns a dict of the aliases that have been added to the Process"""
374  return DictTypes.FixedKeysDict(self.__aliases)
375  aliases = property(aliases_,doc="dictionary containing the aliases for the process")
376  def psets_(self):
377  """returns a dict of the PSets that have been added to the Process"""
378  return DictTypes.FixedKeysDict(self.__psets)
379  psets = property(psets_,doc="dictionary containing the PSets for the process")
380  def vpsets_(self):
381  """returns a dict of the VPSets that have been added to the Process"""
382  return DictTypes.FixedKeysDict(self.__vpsets)
383  vpsets = property(vpsets_,doc="dictionary containing the PSets for the process")
384 
385  def isUsingModifier(self,mod):
386  """returns True if the Modifier is in used by this Process"""
387  if mod._isChosen():
388  for m in self.__modifiers:
389  if m._isOrContains(mod):
390  return True
391  return False
392 
393  def __setObjectLabel(self, object, newLabel) :
394  if not object.hasLabel_() :
395  object.setLabel(newLabel)
396  return
397  if newLabel == object.label_() :
398  return
399  if newLabel is None :
400  object.setLabel(None)
401  return
402  if (hasattr(self, object.label_()) and id(getattr(self, object.label_())) == id(object)) :
403  msg100 = "Attempting to change the label of an attribute of the Process\n"
404  msg101 = "Old label = "+object.label_()+" New label = "+newLabel+"\n"
405  msg102 = "Type = "+str(type(object))+"\n"
406  msg103 = "Some possible solutions:\n"
407  msg104 = " 1. Clone modules instead of using simple assignment. Cloning is\n"
408  msg105 = " also preferred for other types when possible.\n"
409  msg106 = " 2. Declare new names starting with an underscore if they are\n"
410  msg107 = " for temporaries you do not want propagated into the Process. The\n"
411  msg108 = " underscore tells \"from x import *\" and process.load not to import\n"
412  msg109 = " the name.\n"
413  msg110 = " 3. Reorganize so the assigment is not necessary. Giving a second\n"
414  msg111 = " name to the same object usually causes confusion and problems.\n"
415  msg112 = " 4. Compose Sequences: newName = cms.Sequence(oldName)\n"
416  raise ValueError(msg100+msg101+msg102+msg103+msg104+msg105+msg106+msg107+msg108+msg109+msg110+msg111+msg112)
417  object.setLabel(None)
418  object.setLabel(newLabel)
419 
420  def __setattr__(self,name,value):
421  # check if the name is well-formed (only _ and alphanumerics are allowed)
422  if not name.replace('_','').isalnum():
423  raise ValueError('The label '+name+' contains forbiden characters')
424 
425  if name == 'options':
426  value = self.__updateOptions(value)
427  if name == 'maxEvents':
428  value = self.__updateMaxEvents(value)
429 
430  # private variable exempt from all this
431  if name.startswith('_Process__'):
432  self.__dict__[name]=value
433  return
434  if not isinstance(value,_ConfigureComponent):
435  raise TypeError("can only assign labels to an object that inherits from '_ConfigureComponent'\n"
436  +"an instance of "+str(type(value))+" will not work - requested label is "+name)
437  if not isinstance(value,_Labelable) and not isinstance(value,Source) and not isinstance(value,Looper) and not isinstance(value,Schedule):
438  if name == value.type_():
439  if hasattr(self,name) and (getattr(self,name)!=value):
440  self._replaceInTasks(name, value)
441  self._replaceInConditionalTasks(name, value)
442  # Only Services get handled here
443  self.add_(value)
444  return
445  else:
446  raise TypeError("an instance of "+str(type(value))+" can not be assigned the label '"+name+"'.\n"+
447  "Please either use the label '"+value.type_()+" or use the 'add_' method instead.")
448  #clone the item
449  if self.__isStrict:
450  newValue =value.copy()
451  try:
452  newValue._filename = value._filename
453  except:
454  pass
455  value.setIsFrozen()
456  else:
457  newValue =value
458  if not self._okToPlace(name, value, self.__dict__):
459  newFile='top level config'
460  if hasattr(value,'_filename'):
461  newFile = value._filename
462  oldFile='top level config'
463  oldValue = getattr(self,name)
464  if hasattr(oldValue,'_filename'):
465  oldFile = oldValue._filename
466  msg = "Trying to override definition of process."+name
467  msg += "\n new object defined in: "+newFile
468  msg += "\n existing object defined in: "+oldFile
469  raise ValueError(msg)
470  # remove the old object of the name (if there is one)
471  if hasattr(self,name) and not (getattr(self,name)==newValue):
472  # Complain if items in sequences or tasks from load() statements have
473  # degenerate names, but if the user overwrites a name in the
474  # main config, replace it everywhere
475  if newValue._isTaskComponent():
476  if not self.__InExtendCall:
477  self._replaceInTasks(name, newValue)
478  self._replaceInConditionalTasks(name, newValue)
479  self._replaceInSchedule(name, newValue)
480  else:
481  if not isinstance(newValue, Task):
482  #should check to see if used in task before complaining
483  newFile='top level config'
484  if hasattr(value,'_filename'):
485  newFile = value._filename
486  oldFile='top level config'
487  oldValue = getattr(self,name)
488  if hasattr(oldValue,'_filename'):
489  oldFile = oldValue._filename
490  msg1 = "Trying to override definition of "+name+" while it is used by the task "
491  msg2 = "\n new object defined in: "+newFile
492  msg2 += "\n existing object defined in: "+oldFile
493  s = self.__findFirstUsingModule(self.tasks,oldValue)
494  if s is not None:
495  raise ValueError(msg1+s.label_()+msg2)
496 
497  if isinstance(newValue, _Sequenceable) or newValue._isTaskComponent() or isinstance(newValue, ConditionalTask):
498  if not self.__InExtendCall:
499  if isinstance(newValue, ConditionalTask):
500  self._replaceInConditionalTasks(name, newValue)
501  self._replaceInSequences(name, newValue)
502  else:
503  #should check to see if used in sequence before complaining
504  newFile='top level config'
505  if hasattr(value,'_filename'):
506  newFile = value._filename
507  oldFile='top level config'
508  oldValue = getattr(self,name)
509  if hasattr(oldValue,'_filename'):
510  oldFile = oldValue._filename
511  msg1 = "Trying to override definition of "+name+" while it is used by the "
512  msg2 = "\n new object defined in: "+newFile
513  msg2 += "\n existing object defined in: "+oldFile
514  s = self.__findFirstUsingModule(self.sequences,oldValue)
515  if s is not None:
516  raise ValueError(msg1+"sequence "+s.label_()+msg2)
517  s = self.__findFirstUsingModule(self.paths,oldValue)
518  if s is not None:
519  raise ValueError(msg1+"path "+s.label_()+msg2)
520  s = self.__findFirstUsingModule(self.endpaths,oldValue)
521  if s is not None:
522  raise ValueError(msg1+"endpath "+s.label_()+msg2)
523  s = self.__findFirstUsingModule(self.finalpaths,oldValue)
524  if s is not None:
525  raise ValueError(msg1+"finalpath "+s.label_()+msg2)
526 
527  # In case of EDAlias, raise Exception always to avoid surprises
528  if isinstance(newValue, EDAlias):
529  oldValue = getattr(self, name)
530  #should check to see if used in task/sequence before complaining
531  newFile='top level config'
532  if hasattr(value,'_filename'):
533  newFile = value._filename
534  oldFile='top level config'
535  if hasattr(oldValue,'_filename'):
536  oldFile = oldValue._filename
537  msg1 = "Trying to override definition of "+name+" with an EDAlias while it is used by the "
538  msg2 = "\n new object defined in: "+newFile
539  msg2 += "\n existing object defined in: "+oldFile
540  s = self.__findFirstUsingModule(self.tasks,oldValue)
541  if s is not None:
542  raise ValueError(msg1+"task "+s.label_()+msg2)
543  s = self.__findFirstUsingModule(self.sequences,oldValue)
544  if s is not None:
545  raise ValueError(msg1+"sequence "+s.label_()+msg2)
546  s = self.__findFirstUsingModule(self.paths,oldValue)
547  if s is not None:
548  raise ValueError(msg1+"path "+s.label_()+msg2)
549  s = self.__findFirstUsingModule(self.endpaths,oldValue)
550  if s is not None:
551  raise ValueError(msg1+"endpath "+s.label_()+msg2)
552  s = self.__findFirstUsingModule(self.finalpaths,oldValue)
553  if s is not None:
554  raise ValueError(msg1+"finalpath "+s.label_()+msg2)
555 
556  if not self.__InExtendCall and (Schedule._itemIsValid(newValue) or isinstance(newValue, Task)):
557  self._replaceInScheduleDirectly(name, newValue)
558 
559  self._delattrFromSetattr(name)
560  self.__injectValidValue(name, value, newValue)
561  def __injectValidValue(self, name, value, newValue = None):
562  if newValue is None:
563  newValue = value
564  self.__dict__[name]=newValue
565  if isinstance(newValue,_Labelable):
566  self.__setObjectLabel(newValue, name)
567  self._cloneToObjectDict[id(value)] = newValue
568  self._cloneToObjectDict[id(newValue)] = newValue
569  #now put in proper bucket
570  newValue._place(name,self)
571  def __findFirstUsingModule(self, seqsOrTasks, mod):
572  """Given a container of sequences or tasks, find the first sequence or task
573  containing mod and return it. If none is found, return None"""
574  from FWCore.ParameterSet.SequenceTypes import ModuleNodeVisitor
575  l = list()
576  for seqOrTask in seqsOrTasks.values():
577  l[:] = []
578  v = ModuleNodeVisitor(l)
579  seqOrTask.visit(v)
580  if mod in l:
581  return seqOrTask
582  return None
583 
584  def _delHelper(self,name):
585  if not hasattr(self,name):
586  raise KeyError('process does not know about '+name)
587  elif name.startswith('_Process__'):
588  raise ValueError('this attribute cannot be deleted')
589 
590  # we have to remove it from all dictionaries/registries
591  dicts = [item for item in self.__dict__.values() if (isinstance(item, dict) or isinstance(item, DictTypes.SortedKeysDict))]
592  for reg in dicts:
593  if name in reg: del reg[name]
594  # if it was a labelable object, the label needs to be removed
595  obj = getattr(self,name)
596  if isinstance(obj,_Labelable):
597  obj.setLabel(None)
598  if isinstance(obj,Service):
599  obj._inProcess = False
600 
601  def __delattr__(self,name):
602  self._delHelper(name)
603  obj = getattr(self,name)
604  if not obj is None:
605  if not isinstance(obj, Sequence) and not isinstance(obj, Task) and not isinstance(obj,ConditionalTask):
606  # For modules, ES modules and services we can also remove
607  # the deleted object from Sequences, Paths, EndPaths, and
608  # Tasks. Note that for Sequences and Tasks that cannot be done
609  # reliably as the places where the Sequence or Task was used
610  # might have been expanded so we do not even try. We considered
611  # raising an exception if a Sequences or Task was explicitly
612  # deleted, but did not because when done carefully deletion
613  # is sometimes OK (for example in the prune function where it
614  # has been checked that the deleted Sequence is not used).
615  if obj._isTaskComponent():
616  self._replaceInTasks(name, None)
617  self._replaceInConditionalTasks(name, None)
618  self._replaceInSchedule(name, None)
619  if isinstance(obj, _Sequenceable) or obj._isTaskComponent():
620  self._replaceInSequences(name, None)
621  if Schedule._itemIsValid(obj) or isinstance(obj, Task):
622  self._replaceInScheduleDirectly(name, None)
623  # now remove it from the process itself
624  try:
625  del self.__dict__[name]
626  except:
627  pass
628 
629  def _delattrFromSetattr(self,name):
630  """Similar to __delattr__ but we need different behavior when called from __setattr__"""
631  self._delHelper(name)
632  # now remove it from the process itself
633  try:
634  del self.__dict__[name]
635  except:
636  pass
637 
638  def add_(self,value):
639  """Allows addition of components that do not have to have a label, e.g. Services"""
640  if not isinstance(value,_ConfigureComponent):
641  raise TypeError
642  if not isinstance(value,_Unlabelable):
643  raise TypeError
644  #clone the item
645  if self.__isStrict:
646  newValue =value.copy()
647  value.setIsFrozen()
648  else:
649  newValue =value
650  newValue._place('',self)
651 
652  def _okToPlace(self, name, mod, d):
653  if not self.__InExtendCall:
654  # if going
655  return True
656  elif not self.__isStrict:
657  return True
658  elif name in d:
659  # if there's an old copy, and the new one
660  # hasn't been modified, we're done. Still
661  # not quite safe if something has been defined twice.
662  # Need to add checks
663  if mod._isModified:
664  if d[name]._isModified:
665  return False
666  else:
667  return True
668  else:
669  return True
670  else:
671  return True
672 
673  def _place(self, name, mod, d):
674  if self._okToPlace(name, mod, d):
675  if self.__isStrict and isinstance(mod, _ModuleSequenceType):
676  d[name] = mod._postProcessFixup(self._cloneToObjectDict)
677  else:
678  d[name] = mod
679  if isinstance(mod,_Labelable):
680  self.__setObjectLabel(mod, name)
681  def _placeOutputModule(self,name,mod):
682  self._place(name, mod, self.__outputmodules)
683  def _placeProducer(self,name,mod):
684  self._place(name, mod, self.__producers)
685  def _placeSwitchProducer(self,name,mod):
686  self._place(name, mod, self.__switchproducers)
687  def _placeFilter(self,name,mod):
688  self._place(name, mod, self.__filters)
689  def _placeAnalyzer(self,name,mod):
690  self._place(name, mod, self.__analyzers)
691  def _placePath(self,name,mod):
692  self._validateSequence(mod, name)
693  try:
694  self._place(name, mod, self.__paths)
695  except ModuleCloneError as msg:
696  context = format_outerframe(4)
697  raise Exception("%sThe module %s in path %s is unknown to the process %s." %(context, msg, name, self._Process__name))
698  def _placeEndPath(self,name,mod):
699  self._validateSequence(mod, name)
700  try:
701  self._place(name, mod, self.__endpaths)
702  except ModuleCloneError as msg:
703  context = format_outerframe(4)
704  raise Exception("%sThe module %s in endpath %s is unknown to the process %s." %(context, msg, name, self._Process__name))
705  def _placeFinalPath(self,name,mod):
706  self._validateSequence(mod, name)
707  try:
708  self._place(name, mod, self.__finalpaths)
709  except ModuleCloneError as msg:
710  context = format_outerframe(4)
711  raise Exception("%sThe module %s in finalpath %s is unknown to the process %s." %(context, msg, name, self._Process__name))
712  def _placeSequence(self,name,mod):
713  self._validateSequence(mod, name)
714  self._place(name, mod, self.__sequences)
715  def _placeESProducer(self,name,mod):
716  self._place(name, mod, self.__esproducers)
717  def _placeESPrefer(self,name,mod):
718  self._place(name, mod, self.__esprefers)
719  def _placeESSource(self,name,mod):
720  self._place(name, mod, self.__essources)
721  def _placeTask(self,name,task):
722  self._validateTask(task, name)
723  self._place(name, task, self.__tasks)
724  def _placeConditionalTask(self,name,task):
725  self._validateConditionalTask(task, name)
726  self._place(name, task, self.__conditionaltasks)
727  def _placeAlias(self,name,mod):
728  self._place(name, mod, self.__aliases)
729  def _placePSet(self,name,mod):
730  self._place(name, mod, self.__psets)
731  def _placeVPSet(self,name,mod):
732  self._place(name, mod, self.__vpsets)
733  def _placeSource(self,name,mod):
734  """Allow the source to be referenced by 'source' or by type name"""
735  if name != 'source':
736  raise ValueError("The label '"+name+"' can not be used for a Source. Only 'source' is allowed.")
737  if self.__dict__['_Process__source'] is not None :
738  del self.__dict__[self.__dict__['_Process__source'].type_()]
739  self.__dict__['_Process__source'] = mod
740  self.__dict__[mod.type_()] = mod
741  def _placeLooper(self,name,mod):
742  if name != 'looper':
743  raise ValueError("The label '"+name+"' can not be used for a Looper. Only 'looper' is allowed.")
744  self.__dict__['_Process__looper'] = mod
745  self.__dict__[mod.type_()] = mod
746  def _placeSubProcess(self,name,mod):
747  self.__dict__['_Process__subProcess'] = mod
748  self.__dict__[mod.type_()] = mod
749  def addSubProcess(self,mod):
750  self.__subProcesses.append(mod)
751  def _placeService(self,typeName,mod):
752  self._place(typeName, mod, self.__services)
753  if typeName in self.__dict__:
754  self.__dict__[typeName]._inProcess = False
755  self.__dict__[typeName]=mod
756  def _placeAccelerator(self,typeName,mod):
757  self._place(typeName, mod, self.__accelerators)
758  self.__dict__[typeName]=mod
759  def load(self, moduleName):
760  moduleName = moduleName.replace("/",".")
761  module = __import__(moduleName)
762  self.extend(sys.modules[moduleName])
763  def extend(self,other,items=()):
764  """Look in other and find types that we can use"""
765  # enable explicit check to avoid overwriting of existing objects
766  self.__dict__['_Process__InExtendCall'] = True
767 
768  seqs = dict()
769  tasksToAttach = dict()
770  mods = []
771  for name in dir(other):
772  #'from XX import *' ignores these, and so should we.
773  if name.startswith('_'):
774  continue
775  item = getattr(other,name)
776  if name == "source" or name == "looper":
777  # In these cases 'item' could be None if the specific object was not defined
778  if item is not None:
779  self.__setattr__(name,item)
780  elif isinstance(item,_ModuleSequenceType):
781  seqs[name]=item
782  elif isinstance(item,Task) or isinstance(item, ConditionalTask):
783  tasksToAttach[name] = item
784  elif isinstance(item,_Labelable):
785  self.__setattr__(name,item)
786  if not item.hasLabel_() :
787  item.setLabel(name)
788  elif isinstance(item,Schedule):
789  self.__setattr__(name,item)
790  elif isinstance(item,_Unlabelable):
791  self.add_(item)
792  elif isinstance(item,ProcessModifier):
793  mods.append(item)
794  elif isinstance(item,ProcessFragment):
795  self.extend(item)
796 
797  #now create a sequence that uses the newly made items
798  for name,seq in seqs.items():
799  if id(seq) not in self._cloneToObjectDict:
800  self.__setattr__(name,seq)
801  else:
802  newSeq = self._cloneToObjectDict[id(seq)]
803  self.__dict__[name]=newSeq
804  self.__setObjectLabel(newSeq, name)
805  #now put in proper bucket
806  newSeq._place(name,self)
807 
808  for name, task in tasksToAttach.items():
809  self.__setattr__(name, task)
810 
811  #apply modifiers now that all names have been added
812  for item in mods:
813  item.apply(self)
814 
815  self.__dict__['_Process__InExtendCall'] = False
816 
817  def _dumpConfigNamedList(self,items,typeName,options):
818  returnValue = ''
819  for name,item in items:
820  returnValue +=options.indentation()+typeName+' '+name+' = '+item.dumpConfig(options)
821  return returnValue
822 
823  def _dumpConfigUnnamedList(self,items,typeName,options):
824  returnValue = ''
825  for name,item in items:
826  returnValue +=options.indentation()+typeName+' = '+item.dumpConfig(options)
827  return returnValue
828 
829  def _dumpConfigOptionallyNamedList(self,items,typeName,options):
830  returnValue = ''
831  for name,item in items:
832  if name == item.type_():
833  name = ''
834  returnValue +=options.indentation()+typeName+' '+name+' = '+item.dumpConfig(options)
835  return returnValue
836 
837  def dumpConfig(self, options=PrintOptions()):
838  """return a string containing the equivalent process defined using the old configuration language"""
839  config = "process "+self.__name+" = {\n"
840  options.indent()
841  if self.source_():
842  config += options.indentation()+"source = "+self.source_().dumpConfig(options)
843  if self.looper_():
844  config += options.indentation()+"looper = "+self.looper_().dumpConfig(options)
845 
846  config+=self._dumpConfigNamedList(self.subProcesses_(),
847  'subProcess',
848  options)
849  config+=self._dumpConfigNamedList(self.producers_().items(),
850  'module',
851  options)
852  config+=self._dumpConfigNamedList(self.switchProducers_().items(),
853  'module',
854  options)
855  config+=self._dumpConfigNamedList(self.filters_().items(),
856  'module',
857  options)
858  config+=self._dumpConfigNamedList(self.analyzers_().items(),
859  'module',
860  options)
861  config+=self._dumpConfigNamedList(self.outputModules_().items(),
862  'module',
863  options)
864  config+=self._dumpConfigNamedList(self.sequences_().items(),
865  'sequence',
866  options)
867  config+=self._dumpConfigNamedList(self.paths_().items(),
868  'path',
869  options)
870  config+=self._dumpConfigNamedList(self.endpaths_().items(),
871  'endpath',
872  options)
873  config+=self._dumpConfigNamedList(self.finalpaths_().items(),
874  'finalpath',
875  options)
876  config+=self._dumpConfigUnnamedList(self.services_().items(),
877  'service',
878  options)
879  config+=self._dumpConfigNamedList(self.aliases_().items(),
880  'alias',
881  options)
882  config+=self._dumpConfigOptionallyNamedList(
883  self.es_producers_().items(),
884  'es_module',
885  options)
886  config+=self._dumpConfigOptionallyNamedList(
887  self.es_sources_().items(),
888  'es_source',
889  options)
890  config += self._dumpConfigESPrefers(options)
891  for name,item in self.psets.items():
892  config +=options.indentation()+item.configTypeName()+' '+name+' = '+item.configValue(options)
893  for name,item in self.vpsets.items():
894  config +=options.indentation()+'VPSet '+name+' = '+item.configValue(options)
895  if self.schedule:
896  pathNames = [p.label_() for p in self.schedule]
897  config +=options.indentation()+'schedule = {'+','.join(pathNames)+'}\n'
898 
899 # config+=self._dumpConfigNamedList(self.vpsets.items(),
900 # 'VPSet',
901 # options)
902  config += "}\n"
903  options.unindent()
904  return config
905 
906  def _dumpConfigESPrefers(self, options):
907  result = ''
908  for item in self.es_prefers_().values():
909  result +=options.indentation()+'es_prefer '+item.targetLabel_()+' = '+item.dumpConfig(options)
910  return result
911 
912  def _dumpPythonSubProcesses(self, l, options):
913  returnValue = ''
914  for item in l:
915  returnValue += item.dumpPython(options)+'\n\n'
916  return returnValue
917 
918  def _dumpPythonList(self, d, options):
919  returnValue = ''
920  if isinstance(d, DictTypes.SortedKeysDict):
921  for name,item in d.items():
922  returnValue +='process.'+name+' = '+item.dumpPython(options)+'\n\n'
923  else:
924  for name,item in sorted(d.items()):
925  returnValue +='process.'+name+' = '+item.dumpPython(options)+'\n\n'
926  return returnValue
927 
928  def _splitPythonList(self, subfolder, d, options):
929  parts = DictTypes.SortedKeysDict()
930  for name, item in d.items() if isinstance(d, DictTypes.SortedKeysDict) else sorted(d.items()):
931  code = ''
932  dependencies = item.directDependencies()
933  for module_subfolder, module in dependencies:
934  module = module + '_cfi'
935  if options.useSubdirectories and module_subfolder:
936  module = module_subfolder + '.' + module
937  if options.targetDirectory is not None:
938  if options.useSubdirectories and subfolder:
939  module = '..' + module
940  else:
941  module = '.' + module
942  code += 'from ' + module + ' import *\n'
943  if dependencies:
944  code += '\n'
945  code += name + ' = ' + item.dumpPython(options)
946  parts[name] = subfolder, code
947  return parts
948 
949  def _validateSequence(self, sequence, label):
950  # See if every module has been inserted into the process
951  try:
952  l = set()
953  visitor = NodeNameVisitor(l)
954  sequence.visit(visitor)
955  except Exception as e:
956  raise RuntimeError("An entry in sequence {} has no label\n Seen entries: {}\n Error: {}".format(label, l, e))
957 
958  def _validateTask(self, task, label):
959  # See if every module and service has been inserted into the process
960  try:
961  l = set()
962  visitor = NodeNameVisitor(l)
963  task.visit(visitor)
964  except:
965  raise RuntimeError("An entry in task " + label + ' has not been attached to the process')
966  def _validateConditionalTask(self, task, label):
967  # See if every module and service has been inserted into the process
968  try:
969  l = set()
970  visitor = NodeNameVisitor(l)
971  task.visit(visitor)
972  except:
973  raise RuntimeError("An entry in task " + label + ' has not been attached to the process')
974 
975  def _itemsInDependencyOrder(self, processDictionaryOfItems):
976  # The items can be Sequences or Tasks and the input
977  # argument should either be the dictionary of sequences
978  # or the dictionary of tasks from the process.
979 
980  returnValue=DictTypes.SortedKeysDict()
981 
982  # For each item, see what other items it depends upon
983  # For our purpose here, an item depends on the items it contains.
984  dependencies = {}
985  for label,item in processDictionaryOfItems.items():
986  containedItems = []
987  if isinstance(item, Task):
988  v = TaskVisitor(containedItems)
989  elif isinstance(item, ConditionalTask):
990  v = ConditionalTaskVisitor(containedItems)
991  else:
992  v = SequenceVisitor(containedItems)
993  try:
994  item.visit(v)
995  except RuntimeError:
996  if isinstance(item, Task):
997  raise RuntimeError("Failed in a Task visitor. Probably " \
998  "a circular dependency discovered in Task with label " + label)
999  elif isinstance(item, ConditionalTask):
1000  raise RuntimeError("Failed in a ConditionalTask visitor. Probably " \
1001  "a circular dependency discovered in ConditionalTask with label " + label)
1002  else:
1003  raise RuntimeError("Failed in a Sequence visitor. Probably a " \
1004  "circular dependency discovered in Sequence with label " + label)
1005  for containedItem in containedItems:
1006  # Check for items that both have labels and are not in the process.
1007  # This should not normally occur unless someone explicitly assigns a
1008  # label without putting the item in the process (which should not ever
1009  # be done). We check here because this problem could cause the code
1010  # in the 'while' loop below to go into an infinite loop.
1011  if containedItem.hasLabel_():
1012  testItem = processDictionaryOfItems.get(containedItem.label_())
1013  if testItem is None or containedItem != testItem:
1014  if isinstance(item, Task):
1015  raise RuntimeError("Task has a label, but using its label to get an attribute" \
1016  " from the process yields a different object or None\n"+
1017  "label = " + containedItem.label_())
1018  if isinstance(item, ConditionalTask):
1019  raise RuntimeError("ConditionalTask has a label, but using its label to get an attribute" \
1020  " from the process yields a different object or None\n"+
1021  "label = " + containedItem.label_())
1022  else:
1023  raise RuntimeError("Sequence has a label, but using its label to get an attribute" \
1024  " from the process yields a different object or None\n"+
1025  "label = " + containedItem.label_())
1026  dependencies[label]=[dep.label_() for dep in containedItems if dep.hasLabel_()]
1027 
1028  # keep looping until we get rid of all dependencies
1029  while dependencies:
1030  oldDeps = dict(dependencies)
1031  for label,deps in oldDeps.items():
1032  if len(deps)==0:
1033  returnValue[label]=processDictionaryOfItems[label]
1034  #remove this as a dependency for all other tasks
1035  del dependencies[label]
1036  for lb2,deps2 in dependencies.items():
1037  while deps2.count(label):
1038  deps2.remove(label)
1039  return returnValue
1040 
1041  def _dumpPython(self, d, options):
1042  result = ''
1043  for name, value in sorted(d.items()):
1044  result += value.dumpPythonAs(name,options)+'\n'
1045  return result
1046 
1047  def _splitPython(self, subfolder, d, options):
1048  result = {}
1049  for name, value in sorted(d.items()):
1050  result[name] = subfolder, value.dumpPythonAs(name, options) + '\n'
1051  return result
1052 
1053  def dumpPython(self, options=PrintOptions()):
1054  """return a string containing the equivalent process defined using python"""
1055  specialImportRegistry._reset()
1056  header = "import FWCore.ParameterSet.Config as cms"
1057  result = "process = cms.Process(\""+self.__name+"\")\n\n"
1058  if self.source_():
1059  result += "process.source = "+self.source_().dumpPython(options)
1060  if self.looper_():
1061  result += "process.looper = "+self.looper_().dumpPython()
1062  result+=self._dumpPythonList(self.psets, options)
1063  result+=self._dumpPythonList(self.vpsets, options)
1064  result+=self._dumpPythonSubProcesses(self.subProcesses_(), options)
1065  result+=self._dumpPythonList(self.producers_(), options)
1066  result+=self._dumpPythonList(self.switchProducers_(), options)
1067  result+=self._dumpPythonList(self.filters_() , options)
1068  result+=self._dumpPythonList(self.analyzers_(), options)
1069  result+=self._dumpPythonList(self.outputModules_(), options)
1070  result+=self._dumpPythonList(self.services_(), options)
1071  result+=self._dumpPythonList(self.processAccelerators_(), options)
1072  result+=self._dumpPythonList(self.es_producers_(), options)
1073  result+=self._dumpPythonList(self.es_sources_(), options)
1074  result+=self._dumpPython(self.es_prefers_(), options)
1075  result+=self._dumpPythonList(self._itemsInDependencyOrder(self.tasks), options)
1076  result+=self._dumpPythonList(self._itemsInDependencyOrder(self.conditionaltasks), options)
1077  result+=self._dumpPythonList(self._itemsInDependencyOrder(self.sequences), options)
1078  result+=self._dumpPythonList(self.paths_(), options)
1079  result+=self._dumpPythonList(self.endpaths_(), options)
1080  result+=self._dumpPythonList(self.finalpaths_(), options)
1081  result+=self._dumpPythonList(self.aliases_(), options)
1082  if not self.schedule_() == None:
1083  result += 'process.schedule = ' + self.schedule.dumpPython(options)
1084  imports = specialImportRegistry.getSpecialImports()
1085  if len(imports) > 0:
1086  header += "\n" + "\n".join(imports)
1087  header += "\n\n"
1088  return header+result
1089 
1090  def splitPython(self, options = PrintOptions()):
1091  """return a map of file names to python configuration fragments"""
1092  specialImportRegistry._reset()
1093  # extract individual fragments
1094  options.isCfg = False
1095  header = "import FWCore.ParameterSet.Config as cms"
1096  result = ''
1097  parts = {}
1098  files = {}
1099 
1100  result = 'process = cms.Process("' + self.__name + '")\n\n'
1101 
1102  if self.source_():
1103  parts['source'] = (None, 'source = ' + self.source_().dumpPython(options))
1104 
1105  if self.looper_():
1106  parts['looper'] = (None, 'looper = ' + self.looper_().dumpPython())
1107 
1108  parts.update(self._splitPythonList('psets', self.psets, options))
1109  parts.update(self._splitPythonList('psets', self.vpsets, options))
1110  # FIXME
1111  #parts.update(self._splitPythonSubProcesses(self.subProcesses_(), options))
1112  if len(self.subProcesses_()):
1113  sys.stderr.write("error: subprocesses are not supported yet\n\n")
1114  parts.update(self._splitPythonList('modules', self.producers_(), options))
1115  parts.update(self._splitPythonList('modules', self.switchProducers_(), options))
1116  parts.update(self._splitPythonList('modules', self.filters_() , options))
1117  parts.update(self._splitPythonList('modules', self.analyzers_(), options))
1118  parts.update(self._splitPythonList('modules', self.outputModules_(), options))
1119  parts.update(self._splitPythonList('services', self.services_(), options))
1120  parts.update(self._splitPythonList('eventsetup', self.es_producers_(), options))
1121  parts.update(self._splitPythonList('eventsetup', self.es_sources_(), options))
1122  parts.update(self._splitPython('eventsetup', self.es_prefers_(), options))
1123  parts.update(self._splitPythonList('tasks', self._itemsInDependencyOrder(self.tasks), options))
1124  parts.update(self._splitPythonList('sequences', self._itemsInDependencyOrder(self.sequences), options))
1125  parts.update(self._splitPythonList('paths', self.paths_(), options))
1126  parts.update(self._splitPythonList('paths', self.endpaths_(), options))
1127  parts.update(self._splitPythonList('paths', self.finalpaths_(), options))
1128  parts.update(self._splitPythonList('modules', self.aliases_(), options))
1129 
1130  if options.targetDirectory is not None:
1131  files[options.targetDirectory + '/__init__.py'] = ''
1132 
1133  if options.useSubdirectories:
1134  for sub in 'psets', 'modules', 'services', 'eventsetup', 'tasks', 'sequences', 'paths':
1135  if options.targetDirectory is not None:
1136  sub = options.targetDirectory + '/' + sub
1137  files[sub + '/__init__.py'] = ''
1138 
1139  # case insensitive sort by subfolder and module name
1140  parts = sorted(parts.items(), key = lambda nsc: (nsc[1][0].lower() if nsc[1][0] else '', nsc[0].lower()))
1141 
1142  for (name, (subfolder, code)) in parts:
1143  filename = name + '_cfi'
1144  if options.useSubdirectories and subfolder:
1145  filename = subfolder + '/' + filename
1146  if options.targetDirectory is not None:
1147  filename = options.targetDirectory + '/' + filename
1148  result += 'process.load("%s")\n' % filename
1149  files[filename + '.py'] = header + '\n\n' + code
1150 
1151  if self.schedule_() is not None:
1152  options.isCfg = True
1153  result += '\nprocess.schedule = ' + self.schedule.dumpPython(options)
1154 
1155  imports = specialImportRegistry.getSpecialImports()
1156  if len(imports) > 0:
1157  header += '\n' + '\n'.join(imports)
1158  files['-'] = header + '\n\n' + result
1159  return files
1160 
1161  def _replaceInSequences(self, label, new):
1162  old = getattr(self,label)
1163  #TODO - replace by iterator concatenation
1164  #to ovoid dependency problems between sequences, first modify
1165  # process known sequences to do a non-recursive change. Then do
1166  # a recursive change to get cases where a sub-sequence unknown to
1167  # the process has the item to be replaced
1168  for sequenceable in self.sequences.values():
1169  sequenceable._replaceIfHeldDirectly(old,new)
1170  for sequenceable in self.sequences.values():
1171  sequenceable.replace(old,new)
1172  for sequenceable in self.paths.values():
1173  sequenceable.replace(old,new)
1174  for sequenceable in self.endpaths.values():
1175  sequenceable.replace(old,new)
1176  for sequenceable in self.finalpaths.values():
1177  sequenceable.replace(old,new)
1178  def _replaceInTasks(self, label, new):
1179  old = getattr(self,label)
1180  for task in self.tasks.values():
1181  task.replace(old, new)
1182  def _replaceInConditionalTasks(self, label, new):
1183  old = getattr(self,label)
1184  for task in self.conditionaltasks.values():
1185  task.replace(old, new)
1186  def _replaceInSchedule(self, label, new):
1187  if self.schedule_() == None:
1188  return
1189  old = getattr(self,label)
1190  for task in self.schedule_()._tasks:
1191  task.replace(old, new)
1192  def _replaceInScheduleDirectly(self, label, new):
1193  if self.schedule_() == None:
1194  return
1195  old = getattr(self,label)
1196  self.schedule_()._replaceIfHeldDirectly(old, new)
1197  def globalReplace(self,label,new):
1198  """ Replace the item with label 'label' by object 'new' in the process and all sequences/paths/tasks"""
1199  if not hasattr(self,label):
1200  raise LookupError("process has no item of label "+label)
1201  setattr(self,label,new)
1202  def _insertInto(self, parameterSet, itemDict):
1203  for name,value in itemDict.items():
1204  value.insertInto(parameterSet, name)
1205  def _insertOneInto(self, parameterSet, label, item, tracked):
1206  vitems = []
1207  if not item == None:
1208  newlabel = item.nameInProcessDesc_(label)
1209  vitems = [newlabel]
1210  item.insertInto(parameterSet, newlabel)
1211  parameterSet.addVString(tracked, label, vitems)
1212  def _insertManyInto(self, parameterSet, label, itemDict, tracked):
1213  l = []
1214  for name,value in itemDict.items():
1215  value.appendToProcessDescList_(l, name)
1216  value.insertInto(parameterSet, name)
1217  # alphabetical order is easier to compare with old language
1218  l.sort()
1219  parameterSet.addVString(tracked, label, l)
1220  def _insertSwitchProducersInto(self, parameterSet, labelModules, labelAliases, itemDict, tracked):
1221  modules = parameterSet.getVString(tracked, labelModules)
1222  aliases = parameterSet.getVString(tracked, labelAliases)
1223  accelerators = parameterSet.getVString(False, "@selected_accelerators")
1224  for name,value in itemDict.items():
1225  value.appendToProcessDescLists_(modules, aliases, name)
1226  value.insertInto(parameterSet, name, accelerators)
1227  modules.sort()
1228  aliases.sort()
1229  parameterSet.addVString(tracked, labelModules, modules)
1230  parameterSet.addVString(tracked, labelAliases, aliases)
1231  def _insertSubProcessesInto(self, parameterSet, label, itemList, tracked):
1232  l = []
1233  subprocs = []
1234  for value in itemList:
1235  name = value.getProcessName()
1236  newLabel = value.nameInProcessDesc_(name)
1237  l.append(newLabel)
1238  pset = value.getSubProcessPSet(parameterSet)
1239  subprocs.append(pset)
1240  # alphabetical order is easier to compare with old language
1241  l.sort()
1242  parameterSet.addVString(tracked, label, l)
1243  parameterSet.addVPSet(False,"subProcesses",subprocs)
1244  def _insertPaths(self, processPSet, nodeVisitor):
1245  scheduledPaths = []
1246  triggerPaths = []
1247  endpaths = []
1248  finalpaths = []
1249  if self.schedule_() == None:
1250  # make one from triggerpaths & endpaths
1251  for name in self.paths_():
1252  scheduledPaths.append(name)
1253  triggerPaths.append(name)
1254  for name in self.endpaths_():
1255  scheduledPaths.append(name)
1256  endpaths.append(name)
1257  for name in self.finalpaths_():
1258  finalpaths.append(name)
1259  else:
1260  for path in self.schedule_():
1261  pathname = path.label_()
1262  if pathname in self.endpaths_():
1263  endpaths.append(pathname)
1264  scheduledPaths.append(pathname)
1265  elif pathname in self.finalpaths_():
1266  finalpaths.append(pathname)
1267  else:
1268  scheduledPaths.append(pathname)
1269  triggerPaths.append(pathname)
1270  for task in self.schedule_()._tasks:
1271  task.resolve(self.__dict__)
1272  scheduleTaskValidator = ScheduleTaskValidator()
1273  task.visit(scheduleTaskValidator)
1274  task.visit(nodeVisitor)
1275  # consolidate all final_paths into one EndPath
1276  endPathWithFinalPathModulesName ="@finalPath"
1277  finalPathEndPath = EndPath()
1278  if finalpaths:
1279  endpaths.append(endPathWithFinalPathModulesName)
1280  scheduledPaths.append(endPathWithFinalPathModulesName)
1281  finalpathValidator = FinalPathValidator()
1282  modulesOnFinalPath = []
1283  for finalpathname in finalpaths:
1284  iFinalPath = self.finalpaths_()[finalpathname]
1285  iFinalPath.resolve(self.__dict__)
1286  finalpathValidator.setLabel(finalpathname)
1287  iFinalPath.visit(finalpathValidator)
1288  if finalpathValidator.filtersOnFinalpaths or finalpathValidator.producersOnFinalpaths:
1289  names = [p.label_ for p in finalpathValidator.filtersOnFinalpaths]
1290  names.extend( [p.label_ for p in finalpathValidator.producersOnFinalpaths])
1291  raise RuntimeError("FinalPath %s has non OutputModules %s" % (finalpathname, ",".join(names)))
1292  modulesOnFinalPath.extend(iFinalPath.moduleNames())
1293  for m in modulesOnFinalPath:
1294  mod = getattr(self, m)
1295  setattr(mod, "@onFinalPath", untracked.bool(True))
1296  finalPathEndPath += mod
1297 
1298  processPSet.addVString(True, "@end_paths", endpaths)
1299  processPSet.addVString(True, "@paths", scheduledPaths)
1300  # trigger_paths are a little different
1301  p = processPSet.newPSet()
1302  p.addVString(True, "@trigger_paths", triggerPaths)
1303  processPSet.addPSet(True, "@trigger_paths", p)
1304  # add all these paths
1305  pathValidator = PathValidator()
1306  endpathValidator = EndPathValidator()
1307  decoratedList = []
1308  lister = DecoratedNodeNameVisitor(decoratedList)
1309  condTaskModules = []
1310  condTaskVistor = ModuleNodeOnConditionalTaskVisitor(condTaskModules)
1311  pathCompositeVisitor = CompositeVisitor(pathValidator, nodeVisitor, lister, condTaskVistor)
1312  endpathCompositeVisitor = CompositeVisitor(endpathValidator, nodeVisitor, lister)
1313  for triggername in triggerPaths:
1314  iPath = self.paths_()[triggername]
1315  iPath.resolve(self.__dict__)
1316  pathValidator.setLabel(triggername)
1317  lister.initialize()
1318  condTaskModules[:] = []
1319  iPath.visit(pathCompositeVisitor)
1320  if condTaskModules:
1321  decoratedList.append("#")
1322  l = list({x.label_() for x in condTaskModules})
1323  l.sort()
1324  decoratedList.extend(l)
1325  decoratedList.append("@")
1326  iPath.insertInto(processPSet, triggername, decoratedList[:])
1327  for endpathname in endpaths:
1328  if endpathname is not endPathWithFinalPathModulesName:
1329  iEndPath = self.endpaths_()[endpathname]
1330  else:
1331  iEndPath = finalPathEndPath
1332  iEndPath.resolve(self.__dict__)
1333  endpathValidator.setLabel(endpathname)
1334  lister.initialize()
1335  iEndPath.visit(endpathCompositeVisitor)
1336  iEndPath.insertInto(processPSet, endpathname, decoratedList[:])
1337  processPSet.addVString(False, "@filters_on_endpaths", endpathValidator.filtersOnEndpaths)
1338 
1339 
1340  def resolve(self,keepUnresolvedSequencePlaceholders=False):
1341  for x in self.paths.values():
1342  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1343  for x in self.endpaths.values():
1344  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1345  for x in self.finalpaths.values():
1346  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1347  if not self.schedule_() == None:
1348  for task in self.schedule_()._tasks:
1349  task.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1350 
1351  def prune(self,verbose=False,keepUnresolvedSequencePlaceholders=False):
1352  """ Remove clutter from the process that we think is unnecessary:
1353  tracked PSets, VPSets and unused modules and sequences. If a Schedule has been set, then Paths and EndPaths
1354  not in the schedule will also be removed, along with an modules and sequences used only by
1355  those removed Paths and EndPaths. The keepUnresolvedSequencePlaceholders keeps also unresolved TaskPlaceholders."""
1356 # need to update this to only prune psets not on refToPSets
1357 # but for now, remove the delattr
1358 # for name in self.psets_():
1359 # if getattr(self,name).isTracked():
1360 # delattr(self, name)
1361  for name in self.vpsets_():
1362  delattr(self, name)
1363  #first we need to resolve any SequencePlaceholders being used
1364  self.resolve(keepUnresolvedSequencePlaceholders)
1365  usedModules = set()
1366  unneededPaths = set()
1367  tasks = list()
1368  tv = TaskVisitor(tasks)
1369  if self.schedule_():
1370  usedModules=set(self.schedule_().moduleNames())
1371  #get rid of unused paths
1372  schedNames = set(( x.label_() for x in self.schedule_()))
1373  names = set(self.paths)
1374  names.update(set(self.endpaths))
1375  names.update(set(self.finalpaths))
1376  unneededPaths = names - schedNames
1377  for n in unneededPaths:
1378  delattr(self,n)
1379  for t in self.schedule_().tasks():
1380  tv.enter(t)
1381  t.visit(tv)
1382  tv.leave(t)
1383  else:
1384  pths = list(self.paths.values())
1385  pths.extend(self.endpaths.values())
1386  pths.extend(self.finalpaths.values())
1387  temp = Schedule(*pths)
1388  usedModules=set(temp.moduleNames())
1389  unneededModules = self._pruneModules(self.producers_(), usedModules)
1390  unneededModules.update(self._pruneModules(self.switchProducers_(), usedModules))
1391  unneededModules.update(self._pruneModules(self.filters_(), usedModules))
1392  unneededModules.update(self._pruneModules(self.analyzers_(), usedModules))
1393  #remove sequences and tasks that do not appear in remaining paths and endpaths
1394  seqs = list()
1395  sv = SequenceVisitor(seqs)
1396  for p in self.paths.values():
1397  p.visit(sv)
1398  p.visit(tv)
1399  for p in self.endpaths.values():
1400  p.visit(sv)
1401  p.visit(tv)
1402  for p in self.finalpaths.values():
1403  p.visit(sv)
1404  p.visit(tv)
1405  def removeUnneeded(seqOrTasks, allSequencesOrTasks):
1406  _keepSet = set(( s for s in seqOrTasks if s.hasLabel_()))
1407  _availableSet = set(allSequencesOrTasks.values())
1408  _unneededSet = _availableSet-_keepSet
1409  _unneededLabels = []
1410  for s in _unneededSet:
1411  _unneededLabels.append(s.label_())
1412  delattr(self,s.label_())
1413  return _unneededLabels
1414  unneededSeqLabels = removeUnneeded(seqs, self.sequences)
1415  unneededTaskLabels = removeUnneeded(tasks, self.tasks)
1416  if verbose:
1417  print("prune removed the following:")
1418  print(" modules:"+",".join(unneededModules))
1419  print(" tasks:"+",".join(unneededTaskLabels))
1420  print(" sequences:"+",".join(unneededSeqLabels))
1421  print(" paths/endpaths/finalpaths:"+",".join(unneededPaths))
1422  def _pruneModules(self, d, scheduledNames):
1423  moduleNames = set(d.keys())
1424  junk = moduleNames - scheduledNames
1425  for name in junk:
1426  delattr(self, name)
1427  return junk
1428 
1429  def fillProcessDesc(self, processPSet):
1430  """Used by the framework to convert python to C++ objects"""
1431  class ServiceInjectorAdaptor(object):
1432  def __init__(self,ppset,thelist):
1433  self.__thelist = thelist
1434  self.__processPSet = ppset
1435  def addService(self,pset):
1436  self.__thelist.append(pset)
1437  def newPSet(self):
1438  return self.__processPSet.newPSet()
1439  #This adaptor is used to 'add' the method 'getTopPSet_'
1440  # to the ProcessDesc and PythonParameterSet C++ classes.
1441  # This method is needed for the PSet refToPSet_ functionality.
1442  class TopLevelPSetAcessorAdaptor(object):
1443  def __init__(self,ppset,process):
1444  self.__ppset = ppset
1445  self.__process = process
1446  def __getattr__(self,attr):
1447  return getattr(self.__ppset,attr)
1448  def getTopPSet_(self,label):
1449  return getattr(self.__process,label)
1450  def newPSet(self):
1451  return TopLevelPSetAcessorAdaptor(self.__ppset.newPSet(),self.__process)
1452  def addPSet(self,tracked,name,ppset):
1453  return self.__ppset.addPSet(tracked,name,self.__extractPSet(ppset))
1454  def addVPSet(self,tracked,name,vpset):
1455  return self.__ppset.addVPSet(tracked,name,[self.__extractPSet(x) for x in vpset])
1456  def __extractPSet(self,pset):
1457  if isinstance(pset,TopLevelPSetAcessorAdaptor):
1458  return pset.__ppset
1459  return pset
1460 
1461  self.validate()
1462  processPSet.addString(True, "@process_name", self.name_())
1463  self.handleProcessAccelerators(processPSet)
1464  all_modules = self.producers_().copy()
1465  all_modules.update(self.filters_())
1466  all_modules.update(self.analyzers_())
1467  all_modules.update(self.outputModules_())
1468  adaptor = TopLevelPSetAcessorAdaptor(processPSet,self)
1469  self._insertInto(adaptor, self.psets_())
1470  self._insertInto(adaptor, self.vpsets_())
1471  self._insertOneInto(adaptor, "@all_sources", self.source_(), True)
1472  self._insertOneInto(adaptor, "@all_loopers", self.looper_(), True)
1473  self._insertSubProcessesInto(adaptor, "@all_subprocesses", self.subProcesses_(), False)
1474  self._insertManyInto(adaptor, "@all_esprefers", self.es_prefers_(), True)
1475  self._insertManyInto(adaptor, "@all_aliases", self.aliases_(), True)
1476  # This will visit all the paths and endpaths that are scheduled to run,
1477  # as well as the Tasks associated to them and the schedule. It remembers
1478  # the modules, ESSources, ESProducers, and services it visits.
1479  nodeVisitor = NodeVisitor()
1480  self._insertPaths(adaptor, nodeVisitor)
1481  all_modules_onTasksOrScheduled = { key:value for key, value in all_modules.items() if value in nodeVisitor.modules }
1482  self._insertManyInto(adaptor, "@all_modules", all_modules_onTasksOrScheduled, True)
1483  all_switches = self.switchProducers_().copy()
1484  all_switches_onTasksOrScheduled = {key:value for key, value in all_switches.items() if value in nodeVisitor.modules }
1485  self._insertSwitchProducersInto(adaptor, "@all_modules", "@all_aliases", all_switches_onTasksOrScheduled, True)
1486  # Same as nodeVisitor except this one visits all the Tasks attached
1487  # to the process.
1488  processNodeVisitor = NodeVisitor()
1489  for pTask in self.tasks.values():
1490  pTask.visit(processNodeVisitor)
1491  esProducersToEnable = {}
1492  for esProducerName, esProducer in self.es_producers_().items():
1493  if esProducer in nodeVisitor.esProducers or not (esProducer in processNodeVisitor.esProducers):
1494  esProducersToEnable[esProducerName] = esProducer
1495  self._insertManyInto(adaptor, "@all_esmodules", esProducersToEnable, True)
1496  esSourcesToEnable = {}
1497  for esSourceName, esSource in self.es_sources_().items():
1498  if esSource in nodeVisitor.esSources or not (esSource in processNodeVisitor.esSources):
1499  esSourcesToEnable[esSourceName] = esSource
1500  self._insertManyInto(adaptor, "@all_essources", esSourcesToEnable, True)
1501  #handle services differently
1502  services = []
1503  for serviceName, serviceObject in self.services_().items():
1504  if serviceObject in nodeVisitor.services or not (serviceObject in processNodeVisitor.services):
1505  serviceObject.insertInto(ServiceInjectorAdaptor(adaptor,services))
1506  adaptor.addVPSet(False,"services",services)
1507  return processPSet
1508 
1509  def validate(self):
1510  # check if there's some input
1511  # Breaks too many unit tests for now
1512  #if self.source_() == None and self.looper_() == None:
1513  # raise RuntimeError("No input source was found for this process")
1514  pass
1515 
1516  def handleProcessAccelerators(self, parameterSet):
1517  # 'cpu' accelerator is always implicitly there
1518  allAccelerators = set(["cpu"])
1519  availableAccelerators = set(["cpu"])
1520  for acc in self.__dict__['_Process__accelerators'].values():
1521  allAccelerators.update(acc.labels())
1522  availableAccelerators.update(acc.enabledLabels())
1523  availableAccelerators = sorted(list(availableAccelerators))
1524  parameterSet.addVString(False, "@available_accelerators", availableAccelerators)
1525 
1526  # Resolve wildcards
1527  selectedAccelerators = []
1528  if "*" in self.options.accelerators:
1529  if len(self.options.accelerators) >= 2:
1530  raise ValueError("process.options.accelerators may contain '*' only as the only element, now it has {} elements".format(len(self.options.accelerators)))
1531  selectedAccelerators = availableAccelerators
1532  else:
1533  import fnmatch
1534  resolved = set()
1535  invalid = []
1536  for pattern in self.options.accelerators:
1537  acc = [a for a in availableAccelerators if fnmatch.fnmatchcase(a, pattern)]
1538  if len(acc) == 0:
1539  if not any(fnmatch.fnmatchcase(a, pattern) for a in allAccelerators):
1540  invalid.append(pattern)
1541  else:
1542  resolved.update(acc)
1543  # Sanity check
1544  if len(invalid) != 0:
1545  raise ValueError("Invalid pattern{} of '{}' in process.options.accelerators, valid values are '{}' or a pattern matching some of them.".format(
1546  "s" if len(invalid) > 2 else "",
1547  "', '".join(invalid),
1548  "', '".join(sorted(list(allAccelerators)))))
1549  selectedAccelerators = sorted(list(resolved))
1550  parameterSet.addVString(False, "@selected_accelerators", selectedAccelerators)
1551 
1552  # Get and apply module type resolver
1553  moduleTypeResolver = None
1554  moduleTypeResolverPlugin = ""
1555  for acc in self.__dict__['_Process__accelerators'].values():
1556  resolver = acc.moduleTypeResolver(selectedAccelerators)
1557  if resolver is not None:
1558  if moduleTypeResolver is not None:
1559  raise RuntimeError("Module type resolver was already set to {} when {} tried to set it to {}. A job can have at most one ProcessAccelerator that sets module type resolver.".format(
1560  moduleTypeResolver.__class__.__name__,
1561  acc.__class__.__name__,
1562  resolver.__class__.__name__))
1563  moduleTypeResolver = resolver
1564  if moduleTypeResolver is not None:
1565  # Plugin name and its configuration
1566  moduleTypeResolverPlugin = moduleTypeResolver.plugin()
1567 
1568  # Customize modules
1569  for modlist in [self.producers_, self.filters_, self.analyzers_,
1570  self.es_producers_, self.es_sources_]:
1571  for module in modlist().values():
1572  moduleTypeResolver.setModuleVariant(module)
1573 
1574  parameterSet.addString(False, "@module_type_resolver", moduleTypeResolverPlugin)
1575 
1576  # Customize process
1577  wrapped = ProcessForProcessAccelerator(self)
1578  for acc in self.__dict__['_Process__accelerators'].values():
1579  acc.apply(wrapped, selectedAccelerators)
1580 
1581  def prefer(self, esmodule,*args,**kargs):
1582  """Prefer this ES source or producer. The argument can
1583  either be an object label, e.g.,
1584  process.prefer(process.juicerProducer) (not supported yet)
1585  or a name of an ESSource or ESProducer
1586  process.prefer("juicer")
1587  or a type of unnamed ESSource or ESProducer
1588  process.prefer("JuicerProducer")
1589  In addition, you can pass as a labelled arguments the name of the Record you wish to
1590  prefer where the type passed is a cms.vstring and that vstring can contain the
1591  name of the C++ types in the Record that are being preferred, e.g.,
1592  #prefer all data in record 'OrangeRecord' from 'juicer'
1593  process.prefer("juicer", OrangeRecord=cms.vstring())
1594  or
1595  #prefer only "Orange" data in "OrangeRecord" from "juicer"
1596  process.prefer("juicer", OrangeRecord=cms.vstring("Orange"))
1597  or
1598  #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
1599  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
1600  """
1601  # see if this refers to a named ESProducer
1602  if isinstance(esmodule, ESSource) or isinstance(esmodule, ESProducer):
1603  raise RuntimeError("Syntax of process.prefer(process.esmodule) not supported yet")
1604  elif self._findPreferred(esmodule, self.es_producers_(),*args,**kargs) or \
1605  self._findPreferred(esmodule, self.es_sources_(),*args,**kargs):
1606  pass
1607  else:
1608  raise RuntimeError("Cannot resolve prefer for "+repr(esmodule))
1609 
1610  def _findPreferred(self, esname, d,*args,**kargs):
1611  # is esname a name in the dictionary?
1612  if esname in d:
1613  typ = d[esname].type_()
1614  if typ == esname:
1615  self.__setattr__( esname+"_prefer", ESPrefer(typ,*args,**kargs) )
1616  else:
1617  self.__setattr__( esname+"_prefer", ESPrefer(typ, esname,*args,**kargs) )
1618  return True
1619  else:
1620  # maybe it's an unnamed ESModule?
1621  found = False
1622  for name, value in d.items():
1623  if value.type_() == esname:
1624  if found:
1625  raise RuntimeError("More than one ES module for "+esname)
1626  found = True
1627  self.__setattr__(esname+"_prefer", ESPrefer(d[esname].type_()) )
1628  return found
1629 
1630 
1632  def __init__(self, process):
1633  if isinstance(process, Process):
1634  self.__process = process
1635  elif isinstance(process, str):
1636  self.__process = Process(process)
1637  #make sure we do not override the defaults
1638  del self.__process.options
1639  del self.__process.maxEvents
1640  del self.__process.maxLuminosityBlocks
1641  else:
1642  raise TypeError('a ProcessFragment can only be constructed from an existig Process or from process name')
1643  def __dir__(self):
1644  return [ x for x in dir(self.__process) if isinstance(getattr(self.__process, x), _ConfigureComponent) ]
1645  def __getattribute__(self, name):
1646  if name == '_ProcessFragment__process':
1647  return object.__getattribute__(self, '_ProcessFragment__process')
1648  else:
1649  return getattr(self.__process, name)
1650  def __setattr__(self, name, value):
1651  if name == '_ProcessFragment__process':
1652  object.__setattr__(self, name, value)
1653  else:
1654  setattr(self.__process, name, value)
1655  def __delattr__(self, name):
1656  if name == '_ProcessFragment__process':
1657  pass
1658  else:
1659  return delattr(self.__process, name)
1660 
1661 
1662 class FilteredStream(dict):
1663  """a dictionary with fixed keys"""
1665  raise AttributeError("An FilteredStream defintion cannot be modified after creation.")
1666  _blocked_attribute = property(_blocked_attribute)
1667  __setattr__ = __delitem__ = __setitem__ = clear = _blocked_attribute
1668  pop = popitem = setdefault = update = _blocked_attribute
1669  def __new__(cls, *args, **kw):
1670  new = dict.__new__(cls)
1671  dict.__init__(new, *args, **kw)
1672  keys = sorted(kw.keys())
1673  if keys != ['content', 'dataTier', 'name', 'paths', 'responsible', 'selectEvents']:
1674  raise ValueError("The needed parameters are: content, dataTier, name, paths, responsible, selectEvents")
1675  if not isinstance(kw['name'],str):
1676  raise ValueError("name must be of type string")
1677  if not isinstance(kw['content'], vstring) and not isinstance(kw['content'],str):
1678  raise ValueError("content must be of type vstring or string")
1679  if not isinstance(kw['dataTier'], string):
1680  raise ValueError("dataTier must be of type string")
1681  if not isinstance(kw['selectEvents'], PSet):
1682  raise ValueError("selectEvents must be of type PSet")
1683  if not isinstance(kw['paths'],(tuple, Path)):
1684  raise ValueError("'paths' must be a tuple of paths")
1685  return new
1686  def __init__(self, *args, **kw):
1687  pass
1688  def __repr__(self):
1689  return "FilteredStream object: %s" %self["name"]
1690  def __getattr__(self,attr):
1691  return self[attr]
1692 
1694  """Allows embedding another process within a parent process. This allows one to
1695  chain processes together directly in one cmsRun job rather than having to run
1696  separate jobs that are connected via a temporary file.
1697  """
1698  def __init__(self,process, SelectEvents = untracked.PSet(), outputCommands = untracked.vstring()):
1699  """
1700  """
1701  if not isinstance(process, Process):
1702  raise ValueError("the 'process' argument must be of type cms.Process")
1703  if not isinstance(SelectEvents,PSet):
1704  raise ValueError("the 'SelectEvents' argument must be of type cms.untracked.PSet")
1705  if not isinstance(outputCommands,vstring):
1706  raise ValueError("the 'outputCommands' argument must be of type cms.untracked.vstring")
1707  self.__process = process
1708  self.__SelectEvents = SelectEvents
1709  self.__outputCommands = outputCommands
1710  # Need to remove MessageLogger from the subprocess now that MessageLogger is always present
1711  if self.__process.MessageLogger is not MessageLogger:
1712  print("""Warning: You have reconfigured service
1713 'edm::MessageLogger' in a subprocess.
1714 This service has already been configured.
1715 This particular service may not be reconfigured in a subprocess.
1716 The reconfiguration will be ignored.""")
1717  del self.__process.MessageLogger
1718  def dumpPython(self, options=PrintOptions()):
1719  out = "parentProcess"+str(hash(self))+" = process\n"
1720  out += self.__process.dumpPython()
1721  out += "childProcess = process\n"
1722  out += "process = parentProcess"+str(hash(self))+"\n"
1723  out += "process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = "+self.__SelectEvents.dumpPython(options) +", outputCommands = "+self.__outputCommands.dumpPython(options) +"))"
1724  return out
1725  def getProcessName(self):
1726  return self.__process.name_()
1727  def process(self):
1728  return self.__process
1729  def SelectEvents(self):
1730  return self.__SelectEvents
1731  def outputCommands(self):
1732  return self.__outputCommands
1733  def type_(self):
1734  return 'subProcess'
1735  def nameInProcessDesc_(self,label):
1736  return label
1737  def _place(self,label,process):
1738  process._placeSubProcess('subProcess',self)
1739  def getSubProcessPSet(self,parameterSet):
1740  topPSet = parameterSet.newPSet()
1741  self.__process.fillProcessDesc(topPSet)
1742  subProcessPSet = parameterSet.newPSet()
1743  self.__SelectEvents.insertInto(subProcessPSet,"SelectEvents")
1744  self.__outputCommands.insertInto(subProcessPSet,"outputCommands")
1745  subProcessPSet.addPSet(False,"process",topPSet)
1746  return subProcessPSet
1747 
1749  """Helper class for Modifier that takes key/value pairs and uses them to reset parameters of the object"""
1750  def __init__(self,args):
1751  self.__args = args
1752  def __call__(self,obj):
1753  params = {}
1754  for k in self.__args.keys():
1755  if hasattr(obj,k):
1756  params[k] = getattr(obj,k)
1758  for k in self.__args.keys():
1759  if k in params:
1760  setattr(obj,k,params[k])
1761  else:
1762  #the parameter must have been removed
1763  delattr(obj,k)
1764  @staticmethod
1766  raise KeyError("Unknown parameter name "+key+" specified while calling Modifier")
1767 
1769  """A helper base class for _AndModifier, _InvertModifier, and _OrModifier to contain the common code"""
1770  def __init__(self, lhs, rhs=None):
1771  self._lhs = lhs
1772  if rhs is not None:
1773  self._rhs = rhs
1774  def toModify(self,obj, func=None,**kw):
1775  Modifier._toModifyCheck(obj,func,**kw)
1776  if self._isChosen():
1777  Modifier._toModify(obj,func,**kw)
1778  return self
1779  def toReplaceWith(self,toObj,fromObj):
1780  Modifier._toReplaceWithCheck(toObj,fromObj)
1781  if self._isChosen():
1782  Modifier._toReplaceWith(toObj,fromObj)
1783  return self
1784  def makeProcessModifier(self,func):
1785  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1786  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1787  In order to work, the value returned from this function must be assigned to a uniquely named variable."""
1788  return ProcessModifier(self,func)
1789  def __and__(self, other):
1790  return _AndModifier(self,other)
1791  def __invert__(self):
1792  return _InvertModifier(self)
1793  def __or__(self, other):
1794  return _OrModifier(self,other)
1795 
1797  """A modifier which only applies if multiple Modifiers are chosen"""
1798  def __init__(self, lhs, rhs):
1799  super(_AndModifier,self).__init__(lhs, rhs)
1800  def _isChosen(self):
1801  return self._lhs._isChosen() and self._rhs._isChosen()
1802 
1804  """A modifier which only applies if a Modifier is not chosen"""
1805  def __init__(self, lhs):
1806  super(_InvertModifier,self).__init__(lhs)
1807  def _isChosen(self):
1808  return not self._lhs._isChosen()
1809 
1811  """A modifier which only applies if at least one of multiple Modifiers is chosen"""
1812  def __init__(self, lhs, rhs):
1813  super(_OrModifier,self).__init__(lhs, rhs)
1814  def _isChosen(self):
1815  return self._lhs._isChosen() or self._rhs._isChosen()
1816 
1817 
1819  """This class is used to define standard modifications to a Process.
1820  An instance of this class is declared to denote a specific modification,e.g. era2017 could
1821  reconfigure items in a process to match our expectation of running in 2017. Once declared,
1822  these Modifier instances are imported into a configuration and items that need to be modified
1823  are then associated with the Modifier and with the action to do the modification.
1824  The registered modifications will only occur if the Modifier was passed to
1825  the cms.Process' constructor.
1826  """
1827  def __init__(self):
1829  self.__chosen = False
1830  def makeProcessModifier(self,func):
1831  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1832  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1833  In order to work, the value returned from this function must be assigned to a uniquely named variable.
1834  """
1835  return ProcessModifier(self,func)
1836  @staticmethod
1837  def _toModifyCheck(obj,func,**kw):
1838  if func is not None and len(kw) != 0:
1839  raise TypeError("toModify takes either two arguments or one argument and key/value pairs")
1840  def toModify(self,obj, func=None,**kw):
1841  """This is used to register an action to be performed on the specific object. Two different forms are allowed
1842  Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1843  that will be the object passed in as the first argument.
1844  Form 2: A list of parameter name, value pairs can be passed
1845  mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1846  This form can also be used to remove a parameter by passing the value of None
1847  #remove the parameter foo.fred
1848  mod.toModify(foo, fred = None)
1849  Additionally, parameters embedded within PSets can also be modified using a dictionary
1850  #change foo.fred.pebbles to 3 and foo.fred.friend to "barney"
1851  mod.toModify(foo, fred = dict(pebbles = 3, friend = "barney)) )
1852  """
1853  Modifier._toModifyCheck(obj,func,**kw)
1854  if self._isChosen():
1855  Modifier._toModify(obj,func,**kw)
1856  return self
1857  @staticmethod
1858  def _toModify(obj,func,**kw):
1859  if func is not None:
1860  func(obj)
1861  else:
1862  temp =_ParameterModifier(kw)
1863  temp(obj)
1864  @staticmethod
1865  def _toReplaceWithCheck(toObj,fromObj):
1866  if not isinstance(fromObj, type(toObj)):
1867  raise TypeError("toReplaceWith requires both arguments to be the same class type")
1868  def toReplaceWith(self,toObj,fromObj):
1869  """If the Modifier is chosen the internals of toObj will be associated with the internals of fromObj
1870  """
1871  Modifier._toReplaceWithCheck(toObj,fromObj)
1872  if self._isChosen():
1873  Modifier._toReplaceWith(toObj,fromObj)
1874  return self
1875  @staticmethod
1876  def _toReplaceWith(toObj,fromObj):
1877  if isinstance(fromObj,_ModuleSequenceType):
1878  toObj._seq = fromObj._seq
1879  toObj._tasks = fromObj._tasks
1880  elif isinstance(fromObj,Task):
1881  toObj._collection = fromObj._collection
1882  elif isinstance(fromObj,ConditionalTask):
1883  toObj._collection = fromObj._collection
1884  elif isinstance(fromObj,_Parameterizable):
1885  #clear old items just incase fromObj is not a complete superset of toObj
1886  for p in toObj.parameterNames_():
1887  delattr(toObj,p)
1888  for p in fromObj.parameterNames_():
1889  setattr(toObj,p,getattr(fromObj,p))
1890  if isinstance(fromObj,_TypedParameterizable):
1891  toObj._TypedParameterizable__type = fromObj._TypedParameterizable__type
1892 
1893  else:
1894  raise TypeError("toReplaceWith does not work with type "+str(type(toObj)))
1895 
1896  def _setChosen(self):
1897  """Should only be called by cms.Process instances"""
1898  self.__chosen = True
1899  def _isChosen(self):
1900  return self.__chosen
1901  def __and__(self, other):
1902  return _AndModifier(self,other)
1903  def __invert__(self):
1904  return _InvertModifier(self)
1905  def __or__(self, other):
1906  return _OrModifier(self,other)
1907  def _isOrContains(self, other):
1908  return self == other
1909 
1910 
1912  """A Modifier made up of a list of Modifiers
1913  """
1914  def __init__(self, *chainedModifiers):
1915  self.__chosen = False
1916  self.__chain = chainedModifiers
1917  def _applyNewProcessModifiers(self,process):
1918  """Should only be called by cms.Process instances
1919  applies list of accumulated changes to the process"""
1920  for m in self.__chain:
1921  m._applyNewProcessModifiers(process)
1922  def _setChosen(self):
1923  """Should only be called by cms.Process instances"""
1924  self.__chosen = True
1925  for m in self.__chain:
1926  m._setChosen()
1927  def _isChosen(self):
1928  return self.__chosen
1929  def copyAndExclude(self, toExclude):
1930  """Creates a new ModifierChain which is a copy of
1931  this ModifierChain but excludes any Modifier or
1932  ModifierChain in the list toExclude.
1933  The exclusion is done recursively down the chain.
1934  """
1935  newMods = []
1936  for m in self.__chain:
1937  if m not in toExclude:
1938  s = m
1939  if isinstance(m,ModifierChain):
1940  s = m.__copyIfExclude(toExclude)
1941  newMods.append(s)
1942  return ModifierChain(*newMods)
1943  def __copyIfExclude(self,toExclude):
1944  shouldCopy = False
1945  for m in toExclude:
1946  if self._isOrContains(m):
1947  shouldCopy = True
1948  break
1949  if shouldCopy:
1950  return self.copyAndExclude(toExclude)
1951  return self
1952  def _isOrContains(self, other):
1953  if self is other:
1954  return True
1955  for m in self.__chain:
1956  if m._isOrContains(other):
1957  return True
1958  return False
1959 
1961  """A class used by a Modifier to affect an entire Process instance.
1962  When a Process 'loads' a module containing a ProcessModifier, that
1963  ProcessModifier will be applied to the Process if and only if the
1964  Modifier passed to the constructor has been chosen.
1965  """
1966  def __init__(self, modifier, func):
1967  self.__modifier = modifier
1968  self.__func = func
1969  self.__seenProcesses = set()
1970  def apply(self,process):
1971  if self.__modifier._isChosen():
1972  if process not in self.__seenProcesses:
1973  self.__func(process)
1974  self.__seenProcesses.add(process)
1975 
1977  """A class used to specify possible compute accelerators in a Process
1978  instance. It is intended to be derived for any
1979  accelerator/portability technology, and provides hooks such that a
1980  specific customization can be applied to the Process on a worker
1981  node at the point where the python configuration is serialized for C++.
1982 
1983  The customization must not change the configuration hash. To
1984  enforce this reuirement, the customization gets a
1985  ProcessForProcessAccelerator wrapper that gives access to only
1986  those parts of the configuration that can be changed. Nevertheless
1987  it would be good to have specific unit test for each deriving
1988  class to ensure that all combinations of the enabled accelerators
1989  give the same configuration hash.
1990 
1991  The deriving class must do its checks for hardware availability
1992  only in enabledLabels(), and possibly in apply() if any further
1993  fine-tuning is needed, because those two are the only functions
1994  that are guaranteed to be called at the worker node.
1995  """
1996  def __init__(self):
1997  pass
1998  def _place(self, name, proc):
1999  proc._placeAccelerator(self.type_(), self)
2000  def type_(self):
2001  return type(self).__name__
2002  def dumpPython(self, options=PrintOptions()):
2003  specialImportRegistry.registerUse(self)
2004  result = self.__class__.__name__+"(" # not including cms. since the deriving classes are not in cms "namespace"
2005  options.indent()
2006  res = self.dumpPythonImpl(options)
2007  options.unindent()
2008  if len(res) > 0:
2009  result += "\n"+res+"\n"
2010  result += ")\n"
2011  return result
2012 
2013  # The following methods are hooks to be overridden (if needed) in the deriving class
2014  def dumpPythonImpl(self, options):
2015  """Override if need to add any 'body' content to dumpPython(). Returns a string."""
2016  return ""
2017  def labels(self):
2018  """Override to return a list of strings for the accelerator labels."""
2019  return []
2020  def enabledLabels(self):
2021  """Override to return a list of strings for the accelerator labels
2022  that are enabled in the system the job is being run on."""
2023  return []
2024  def moduleTypeResolver(self, accelerators):
2025  """Override to return an object that implements "module type resolver"
2026  in python. The object should have the following methods
2027  - __init__(self, accelerators)
2028  * accelerators = list of selected accelerators
2029  - plugin(self):
2030  * should return a string for the type resolver plugin name
2031  - setModuleVariant(self, module):
2032  * Called for each ED and ES module. Should act only if
2033  module.type_() contains the magic identifier
2034 
2035  At most one of the ProcessAccelerators in a job can return a
2036 non-None object
2037  """
2038  return None
2039  def apply(self, process, accelerators):
2040  """Override if need to customize the Process at worker node. The
2041  selected available accelerator labels are given in the
2042  'accelerators' argument (the patterns, e.g. '*' have been
2043  expanded to concrete labels).
2044 
2045  This function may touch only untracked parameters.
2046  """
2047  pass
2048 
2049 class ProcessForProcessAccelerator(object):
2050  """This class is inteded to wrap the Process object to constrain the
2051  available functionality for ProcessAccelerator.apply()"""
2052  def __init__(self, process):
2053  self.__process = process
2054  def __getattr__(self, label):
2055  value = getattr(self.__process, label)
2056  if not isinstance(value, Service):
2057  raise TypeError("ProcessAccelerator.apply() can get only Services. Tried to get {} with label {}".format(str(type(value)), label))
2058  return value
2059  def __setattr__(self, label, value):
2060  if label == "_ProcessForProcessAccelerator__process":
2061  super().__setattr__(label, value)
2062  else:
2063  if not isinstance(value, Service):
2064  raise TypeError("ProcessAccelerator.apply() can only set Services. Tried to set {} with label {}".format(str(type(value)), label))
2065  setattr(self.__process, label, value)
2066  def __delattr__(self, label):
2067  value = getattr(self.__process, label)
2068  if not isinstance(value, Service):
2069  raise TypeError("ProcessAccelerator.apply() can delete only Services. Tried to del {} with label {}".format(str(type(value)), label))
2070  delattr(self.__process, label)
2071  def add_(self, value):
2072  if not isinstance(value, Service):
2073  raise TypeError("ProcessAccelerator.apply() can only add Services. Tried to set {} with label {}".format(str(type(value)), label))
2074  self.__process.add_(value)
2075 
2076 # Need to be a module-level function for the configuration with a
2077 # SwitchProducer to be pickleable.
2079  return ("test1" in accelerators, -10)
2081  return ("test2" in accelerators, -9)
2082 
2083 if __name__=="__main__":
2084  import unittest
2085  import copy
2086 
2087  def _lineDiff(newString, oldString):
2088  newString = ( x for x in newString.split('\n') if len(x) > 0)
2089  oldString = [ x for x in oldString.split('\n') if len(x) > 0]
2090  diff = []
2091  oldStringLine = 0
2092  for l in newString:
2093  if oldStringLine >= len(oldString):
2094  diff.append(l)
2095  continue
2096  if l == oldString[oldStringLine]:
2097  oldStringLine +=1
2098  continue
2099  diff.append(l)
2100  return "\n".join( diff )
2101 
2103  """Has same interface as the C++ object that creates PSets
2104  """
2105  def __init__(self):
2106  self.values = dict()
2107  def __insertValue(self,tracked,label,value):
2108  self.values[label]=(tracked,value)
2109  def __getValue(self,tracked,label):
2110  pair = self.values[label]
2111  if pair[0] != tracked:
2112  raise Exception("Asked for %s parameter '%s', but it is %s" % ("tracked" if tracked else "untracked",
2113  label,
2114  "tracked" if pair[0] else "untracked"))
2115  return pair[1]
2116  def addInt32(self,tracked,label,value):
2117  self.__insertValue(tracked,label,value)
2118  def addVInt32(self,tracked,label,value):
2119  self.__insertValue(tracked,label,value)
2120  def addUInt32(self,tracked,label,value):
2121  self.__insertValue(tracked,label,value)
2122  def addVUInt32(self,tracked,label,value):
2123  self.__insertValue(tracked,label,value)
2124  def addInt64(self,tracked,label,value):
2125  self.__insertValue(tracked,label,value)
2126  def addVInt64(self,tracked,label,value):
2127  self.__insertValue(tracked,label,value)
2128  def addUInt64(self,tracked,label,value):
2129  self.__insertValue(tracked,label,value)
2130  def addVUInt64(self,tracked,label,value):
2131  self.__insertValue(tracked,label,value)
2132  def addDouble(self,tracked,label,value):
2133  self.__insertValue(tracked,label,value)
2134  def addVDouble(self,tracked,label,value):
2135  self.__insertValue(tracked,label,value)
2136  def addBool(self,tracked,label,value):
2137  self.__insertValue(tracked,label,value)
2138  def addString(self,tracked,label,value):
2139  self.__insertValue(tracked,label,value)
2140  def addVString(self,tracked,label,value):
2141  self.__insertValue(tracked,label,value)
2142  def getVString(self,tracked,label):
2143  return self.__getValue(tracked, label)
2144  def addInputTag(self,tracked,label,value):
2145  self.__insertValue(tracked,label,value)
2146  def addVInputTag(self,tracked,label,value):
2147  self.__insertValue(tracked,label,value)
2148  def addESInputTag(self,tracked,label,value):
2149  self.__insertValue(tracked,label,value)
2150  def addVESInputTag(self,tracked,label,value):
2151  self.__insertValue(tracked,label,value)
2152  def addEventID(self,tracked,label,value):
2153  self.__insertValue(tracked,label,value)
2154  def addVEventID(self,tracked,label,value):
2155  self.__insertValue(tracked,label,value)
2156  def addLuminosityBlockID(self,tracked,label,value):
2157  self.__insertValue(tracked,label,value)
2158  def addLuminosityBlockID(self,tracked,label,value):
2159  self.__insertValue(tracked,label,value)
2160  def addEventRange(self,tracked,label,value):
2161  self.__insertValue(tracked,label,value)
2162  def addVEventRange(self,tracked,label,value):
2163  self.__insertValue(tracked,label,value)
2164  def addPSet(self,tracked,label,value):
2165  self.__insertValue(tracked,label,value)
2166  def addVPSet(self,tracked,label,value):
2167  self.__insertValue(tracked,label,value)
2168  def addFileInPath(self,tracked,label,value):
2169  self.__insertValue(tracked,label,value)
2170  def newPSet(self):
2171  return TestMakePSet()
2172 
2174  def __init__(self, **kargs):
2175  super(SwitchProducerTest,self).__init__(
2176  dict(
2177  test1 = lambda accelerators: (True, -10),
2178  test2 = lambda accelerators: (True, -9),
2179  test3 = lambda accelerators: (True, -8),
2180  test4 = lambda accelerators: (True, -7)
2181  ), **kargs)
2182  specialImportRegistry.registerSpecialImportForType(SwitchProducerTest, "from test import SwitchProducerTest")
2183 
2185  def __init__(self, **kargs):
2186  super(SwitchProducerTest2,self).__init__(
2187  dict(
2188  test1 = _switchproducer_test2_case1,
2189  test2 = _switchproducer_test2_case2,
2190  ), **kargs)
2191  specialImportRegistry.registerSpecialImportForType(SwitchProducerTest2, "from test import SwitchProducerTest2")
2192 
2194  def __init__(self, accelerators):
2195  # first element is used as the default is nothing is set
2197  if "test1" in accelerators:
2198  self._valid_backends.append("test1_backend")
2199  if "test2" in accelerators:
2200  self._valid_backends.append("test2_backend")
2201  if len(self._valid_backends) == 0:
2202  raise EDMException(edm.errors.UnavailableAccelerator, "Machine has no accelerators that Test supports (has {})".format(", ".join(accelerators)))
2203 
2204  def plugin(self):
2205  return "TestModuleTypeResolver"
2206 
2207  def setModuleVariant(self, module):
2208  if "@test" in module.type_():
2209  defaultBackend = self._valid_backends[0]
2210  if hasattr(module, "test"):
2211  if hasattr(module.test, "backend"):
2212  if module.test.backend.value() not in self._valid_backends:
2213  raise EDMException(edm.errors.UnavailableAccelerator, "Module {} has the Test backend set explicitly, but its accelerator is not available for the job".format(module.label_()))
2214  else:
2215  module.test.backend = untracked.string(defaultBackend)
2216  else:
2217  module.test = untracked.PSet(
2218  backend = untracked.string(defaultBackend)
2219  )
2220 
2222  def __init__(self, enabled=["test1", "test2", "anothertest3"], moduleTypeResolverMaker=None):
2223  super().__init__()
2224  self._labels = ["test1", "test2", "anothertest3"]
2225  self.setEnabled(enabled)
2226  self._moduleTypeResolverMaker = moduleTypeResolverMaker
2227  def setEnabled(self, enabled):
2228  invalid = set(enabled).difference(set(self._labels))
2229  if len(invalid) > 0:
2230  raise Exception("Tried to enabled nonexistent test accelerators {}".format(",".join(invalid)))
2231  self._enabled = enabled[:]
2232  def dumpPythonImpl(self,options):
2233  result = "{}enabled = [{}]".format(options.indentation(),
2234  ", ".join(["'{}'".format(e) for e in self._enabled]))
2235  return result
2236  def labels(self):
2237  return self._labels
2238  def enabledLabels(self):
2239  return self._enabled
2240  def moduleTypeResolver(self, accelerators):
2241  if not self._moduleTypeResolverMaker:
2242  return super().moduleTypeResolver(accelerators)
2243  return self._moduleTypeResolverMaker(accelerators)
2244  def apply(self, process, accelerators):
2245  process.AcceleratorTestService = Service("AcceleratorTestService")
2246  if hasattr(process, "AcceleratorTestServiceRemove"):
2247  del process.AcceleratorTestServiceRemove
2248  specialImportRegistry.registerSpecialImportForType(ProcessAcceleratorTest, "from test import ProcessAcceleratorTest")
2249 
2251  def __init__(self, enabled=["anothertest3", "anothertest4"], moduleTypeResolverMaker=None):
2252  super().__init__()
2253  self._labels = ["anothertest3", "anothertest4"]
2254  self.setEnabled(enabled)
2255  self._moduleTypeResolverMaker = moduleTypeResolverMaker
2256  def setEnabled(self, enabled):
2257  invalid = set(enabled).difference(set(self._labels))
2258  if len(invalid) > 0:
2259  raise Exception("Tried to enabled nonexistent test accelerators {}".format(",".join(invalid)))
2260  self._enabled = enabled[:]
2261  def dumpPythonImpl(self,options):
2262  result = "{}enabled = [{}]".format(options.indentation(),
2263  ", ".join(["'{}'".format(e) for e in self._enabled]))
2264  return result
2265  def labels(self):
2266  return self._labels
2267  def enabledLabels(self):
2268  return self._enabled
2269  def moduleTypeResolver(self, accelerators):
2270  if not self._moduleTypeResolverMaker:
2271  return super().moduleTypeResolver(accelerators)
2272  return self._moduleTypeResolverMaker(accelerators)
2273  def apply(self, process, accelerators):
2274  pass
2275  specialImportRegistry.registerSpecialImportForType(ProcessAcceleratorTest2, "from test import ProcessAcceleratorTest2")
2276 
2277  class TestModuleCommand(unittest.TestCase):
2278  def setUp(self):
2279  """Nothing to do """
2280  None
2282  p = _Parameterizable()
2283  self.assertEqual(len(p.parameterNames_()),0)
2284  p.a = int32(1)
2285  self.assertTrue('a' in p.parameterNames_())
2286  self.assertEqual(p.a.value(), 1)
2287  p.a = 10
2288  self.assertEqual(p.a.value(), 10)
2289  p.a = untracked(int32(1))
2290  self.assertEqual(p.a.value(), 1)
2291  self.assertFalse(p.a.isTracked())
2292  p.a = untracked.int32(1)
2293  self.assertEqual(p.a.value(), 1)
2294  self.assertFalse(p.a.isTracked())
2295  p = _Parameterizable(foo=int32(10), bar = untracked(double(1.0)))
2296  self.assertEqual(p.foo.value(), 10)
2297  self.assertEqual(p.bar.value(),1.0)
2298  self.assertFalse(p.bar.isTracked())
2299  self.assertRaises(TypeError,setattr,(p,'c',1))
2300  p = _Parameterizable(a=PSet(foo=int32(10), bar = untracked(double(1.0))))
2301  self.assertEqual(p.a.foo.value(),10)
2302  self.assertEqual(p.a.bar.value(),1.0)
2303  p.b = untracked(PSet(fii = int32(1)))
2304  self.assertEqual(p.b.fii.value(),1)
2305  self.assertFalse(p.b.isTracked())
2306  #test the fact that values can be shared
2307  v = int32(10)
2308  p=_Parameterizable(a=v)
2309  v.setValue(11)
2310  self.assertEqual(p.a.value(),11)
2311  p.a = 12
2312  self.assertEqual(p.a.value(),12)
2313  self.assertEqual(v.value(),12)
2315  p = _TypedParameterizable("blah", b=int32(1))
2316  #see if copy works deeply
2317  other = p.copy()
2318  other.b = 2
2319  self.assertNotEqual(p.b,other.b)
2320 
2322  p = Process("test")
2323  p.a = EDAnalyzer("MyAnalyzer")
2324  self.assertTrue( 'a' in p.analyzers_() )
2325  self.assertTrue( 'a' in p.analyzers)
2326  p.add_(Service("SomeService"))
2327  self.assertTrue('SomeService' in p.services_())
2328  self.assertEqual(p.SomeService.type_(), "SomeService")
2329  p.Tracer = Service("Tracer")
2330  self.assertTrue('Tracer' in p.services_())
2331  self.assertRaises(TypeError, setattr, *(p,'b',"this should fail"))
2332  self.assertRaises(TypeError, setattr, *(p,'bad',Service("MessageLogger")))
2333  self.assertRaises(ValueError, setattr, *(p,'bad',Source("PoolSource")))
2334  p.out = OutputModule("Outer")
2335  self.assertEqual(p.out.type_(), 'Outer')
2336  self.assertTrue( 'out' in p.outputModules_() )
2337 
2338  p.geom = ESSource("GeomProd")
2339  self.assertTrue('geom' in p.es_sources_())
2340  p.add_(ESSource("ConfigDB"))
2341  self.assertTrue('ConfigDB' in p.es_sources_())
2342 
2343  p.aliasfoo1 = EDAlias(foo1 = VPSet(PSet(type = string("Foo1"))))
2344  self.assertTrue('aliasfoo1' in p.aliases_())
2345 
2347  class FromArg(object):
2348  def __init__(self,*arg,**args):
2349  for name in args.keys():
2350  self.__dict__[name]=args[name]
2351 
2352  a=EDAnalyzer("MyAnalyzer")
2353  t=EDAnalyzer("MyAnalyzer")
2354  t.setLabel("foo")
2355  s1 = Sequence(a)
2356  s2 = Sequence(s1)
2357  s3 = Sequence(s2)
2358  d = FromArg(
2359  a=a,
2360  b=Service("Full"),
2361  c=Path(a),
2362  d=s2,
2363  e=s1,
2364  f=s3,
2365  g=Sequence(s1+s2+s3)
2366  )
2367  p = Process("Test")
2368  p.extend(d)
2369  self.assertEqual(p.a.type_(),"MyAnalyzer")
2370  self.assertEqual(p.a.label_(),"a")
2371  self.assertRaises(AttributeError,getattr,p,'b')
2372  self.assertEqual(p.Full.type_(),"Full")
2373  self.assertEqual(str(p.c),'a')
2374  self.assertEqual(str(p.d),'a')
2375 
2376  z1 = FromArg(
2377  a=a,
2378  b=Service("Full"),
2379  c=Path(a),
2380  d=s2,
2381  e=s1,
2382  f=s3,
2383  s4=s3,
2384  g=Sequence(s1+s2+s3)
2385  )
2386 
2387  p1 = Process("Test")
2388  #p1.extend(z1)
2389  self.assertRaises(ValueError, p1.extend, z1)
2390 
2391  z2 = FromArg(
2392  a=a,
2393  b=Service("Full"),
2394  c=Path(a),
2395  d=s2,
2396  e=s1,
2397  f=s3,
2398  aaa=copy.deepcopy(a),
2399  s4=copy.deepcopy(s3),
2400  g=Sequence(s1+s2+s3),
2401  t=t
2402  )
2403  p2 = Process("Test")
2404  p2.extend(z2)
2405  #self.assertRaises(ValueError, p2.extend, z2)
2406  self.assertEqual(p2.s4.label_(),"s4")
2407  #p2.s4.setLabel("foo")
2408  self.assertRaises(ValueError, p2.s4.setLabel, "foo")
2409  p2.s4.setLabel("s4")
2410  p2.s4.setLabel(None)
2411  p2.s4.setLabel("foo")
2412  p2._Process__setObjectLabel(p2.s4, "foo")
2413  p2._Process__setObjectLabel(p2.s4, None)
2414  p2._Process__setObjectLabel(p2.s4, "bar")
2415 
2416 
2417  p = Process('test')
2418  p.a = EDProducer("MyProducer")
2419  p.t = Task(p.a)
2420  p.p = Path(p.t)
2421  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2422  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2423  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2424 
2425  p = Process('test')
2426  p.a = EDProducer("MyProducer")
2427  p.t = ConditionalTask(p.a)
2428  p.p = Path(p.t)
2429  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2430  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2431  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2432 
2433  p = Process('test')
2434  p.a = EDProducer("MyProducer")
2435  p.s = Sequence(p.a)
2436  p.p = Path(p.s)
2437  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2438  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2439  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2440 
2442  self.assertEqual(Process("test").dumpPython(),
2443 """import FWCore.ParameterSet.Config as cms
2444 
2445 process = cms.Process("test")
2446 
2447 process.maxEvents = cms.untracked.PSet(
2448  input = cms.optional.untracked.int32,
2449  output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
2450 )
2451 
2452 process.maxLuminosityBlocks = cms.untracked.PSet(
2453  input = cms.untracked.int32(-1)
2454 )
2455 
2456 process.options = cms.untracked.PSet(
2457  FailPath = cms.untracked.vstring(),
2458  IgnoreCompletely = cms.untracked.vstring(),
2459  Rethrow = cms.untracked.vstring(),
2460  SkipEvent = cms.untracked.vstring(),
2461  accelerators = cms.untracked.vstring('*'),
2462  allowUnscheduled = cms.obsolete.untracked.bool,
2463  canDeleteEarly = cms.untracked.vstring(),
2464  deleteNonConsumedUnscheduledModules = cms.untracked.bool(True),
2465  dumpOptions = cms.untracked.bool(False),
2466  emptyRunLumiMode = cms.obsolete.untracked.string,
2467  eventSetup = cms.untracked.PSet(
2468  forceNumberOfConcurrentIOVs = cms.untracked.PSet(
2469  allowAnyLabel_=cms.required.untracked.uint32
2470  ),
2471  numberOfConcurrentIOVs = cms.untracked.uint32(0)
2472  ),
2473  fileMode = cms.untracked.string('FULLMERGE'),
2474  forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
2475  holdsReferencesToDeleteEarly = cms.untracked.VPSet(),
2476  makeTriggerResults = cms.obsolete.untracked.bool,
2477  modulesToIgnoreForDeleteEarly = cms.untracked.vstring(),
2478  numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0),
2479  numberOfConcurrentRuns = cms.untracked.uint32(1),
2480  numberOfStreams = cms.untracked.uint32(0),
2481  numberOfThreads = cms.untracked.uint32(1),
2482  printDependencies = cms.untracked.bool(False),
2483  sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
2484  throwIfIllegalParameter = cms.untracked.bool(True),
2485  wantSummary = cms.untracked.bool(False)
2486 )
2487 
2488 process.MessageLogger = cms.Service("MessageLogger",
2489  cerr = cms.untracked.PSet(
2490  FwkReport = cms.untracked.PSet(
2491  limit = cms.untracked.int32(10000000),
2492  reportEvery = cms.untracked.int32(1)
2493  ),
2494  FwkSummary = cms.untracked.PSet(
2495  limit = cms.untracked.int32(10000000),
2496  reportEvery = cms.untracked.int32(1)
2497  ),
2498  INFO = cms.untracked.PSet(
2499  limit = cms.untracked.int32(0)
2500  ),
2501  Root_NoDictionary = cms.untracked.PSet(
2502  limit = cms.untracked.int32(0)
2503  ),
2504  default = cms.untracked.PSet(
2505  limit = cms.untracked.int32(10000000)
2506  ),
2507  enable = cms.untracked.bool(True),
2508  enableStatistics = cms.untracked.bool(False),
2509  lineLength = cms.optional.untracked.int32,
2510  noLineBreaks = cms.optional.untracked.bool,
2511  noTimeStamps = cms.untracked.bool(False),
2512  resetStatistics = cms.untracked.bool(False),
2513  statisticsThreshold = cms.untracked.string('WARNING'),
2514  threshold = cms.untracked.string('INFO'),
2515  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2516  limit = cms.optional.untracked.int32,
2517  reportEvery = cms.untracked.int32(1),
2518  timespan = cms.optional.untracked.int32
2519  )
2520  ),
2521  cout = cms.untracked.PSet(
2522  enable = cms.untracked.bool(False),
2523  enableStatistics = cms.untracked.bool(False),
2524  lineLength = cms.optional.untracked.int32,
2525  noLineBreaks = cms.optional.untracked.bool,
2526  noTimeStamps = cms.optional.untracked.bool,
2527  resetStatistics = cms.untracked.bool(False),
2528  statisticsThreshold = cms.optional.untracked.string,
2529  threshold = cms.optional.untracked.string,
2530  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2531  limit = cms.optional.untracked.int32,
2532  reportEvery = cms.untracked.int32(1),
2533  timespan = cms.optional.untracked.int32
2534  )
2535  ),
2536  debugModules = cms.untracked.vstring(),
2537  default = cms.untracked.PSet(
2538  limit = cms.optional.untracked.int32,
2539  lineLength = cms.untracked.int32(80),
2540  noLineBreaks = cms.untracked.bool(False),
2541  noTimeStamps = cms.untracked.bool(False),
2542  reportEvery = cms.untracked.int32(1),
2543  statisticsThreshold = cms.untracked.string('INFO'),
2544  threshold = cms.untracked.string('INFO'),
2545  timespan = cms.optional.untracked.int32,
2546  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2547  limit = cms.optional.untracked.int32,
2548  reportEvery = cms.untracked.int32(1),
2549  timespan = cms.optional.untracked.int32
2550  )
2551  ),
2552  files = cms.untracked.PSet(
2553  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2554  enableStatistics = cms.untracked.bool(False),
2555  extension = cms.optional.untracked.string,
2556  filename = cms.optional.untracked.string,
2557  lineLength = cms.optional.untracked.int32,
2558  noLineBreaks = cms.optional.untracked.bool,
2559  noTimeStamps = cms.optional.untracked.bool,
2560  output = cms.optional.untracked.string,
2561  resetStatistics = cms.untracked.bool(False),
2562  statisticsThreshold = cms.optional.untracked.string,
2563  threshold = cms.optional.untracked.string,
2564  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2565  limit = cms.optional.untracked.int32,
2566  reportEvery = cms.untracked.int32(1),
2567  timespan = cms.optional.untracked.int32
2568  )
2569  )
2570  ),
2571  suppressDebug = cms.untracked.vstring(),
2572  suppressFwkInfo = cms.untracked.vstring(),
2573  suppressInfo = cms.untracked.vstring(),
2574  suppressWarning = cms.untracked.vstring(),
2575  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2576  limit = cms.optional.untracked.int32,
2577  reportEvery = cms.untracked.int32(1),
2578  timespan = cms.optional.untracked.int32
2579  )
2580 )
2581 
2582 
2583 """)
2584  p = Process("test")
2585  p.a = EDAnalyzer("MyAnalyzer")
2586  p.p = Path(p.a)
2587  p.s = Sequence(p.a)
2588  p.r = Sequence(p.s)
2589  p.p2 = Path(p.s)
2590  p.schedule = Schedule(p.p2,p.p)
2591  d=p.dumpPython()
2592  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2593 """process.a = cms.EDAnalyzer("MyAnalyzer")
2594 process.s = cms.Sequence(process.a)
2595 process.r = cms.Sequence(process.s)
2596 process.p = cms.Path(process.a)
2597 process.p2 = cms.Path(process.s)
2598 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2599  #Reverse order of 'r' and 's'
2600  p = Process("test")
2601  p.a = EDAnalyzer("MyAnalyzer")
2602  p.p = Path(p.a)
2603  p.r = Sequence(p.a)
2604  p.s = Sequence(p.r)
2605  p.p2 = Path(p.r)
2606  p.schedule = Schedule(p.p2,p.p)
2607  p.b = EDAnalyzer("YourAnalyzer")
2608  d=p.dumpPython()
2609  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2610 """process.a = cms.EDAnalyzer("MyAnalyzer")
2611 process.b = cms.EDAnalyzer("YourAnalyzer")
2612 process.r = cms.Sequence(process.a)
2613 process.s = cms.Sequence(process.r)
2614 process.p = cms.Path(process.a)
2615 process.p2 = cms.Path(process.r)
2616 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2617  #use an anonymous sequence
2618  p = Process("test")
2619  p.a = EDAnalyzer("MyAnalyzer")
2620  p.p = Path(p.a)
2621  s = Sequence(p.a)
2622  p.r = Sequence(s)
2623  p.p2 = Path(p.r)
2624  p.schedule = Schedule(p.p2,p.p)
2625  d=p.dumpPython()
2626  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2627 """process.a = cms.EDAnalyzer("MyAnalyzer")
2628 process.r = cms.Sequence((process.a))
2629 process.p = cms.Path(process.a)
2630 process.p2 = cms.Path(process.r)
2631 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2632 
2633  # include some tasks
2634  p = Process("test")
2635  p.a = EDAnalyzer("MyAnalyzer")
2636  p.b = EDProducer("bProducer")
2637  p.c = EDProducer("cProducer")
2638  p.d = EDProducer("dProducer")
2639  p.e = EDProducer("eProducer")
2640  p.f = EDProducer("fProducer")
2641  p.g = EDProducer("gProducer")
2642  p.task5 = Task()
2643  p.task3 = Task()
2644  p.task2 = Task(p.c, p.task3)
2645  p.task4 = Task(p.f, p.task2)
2646  p.task1 = Task(p.task5)
2647  p.task3.add(p.task1)
2648  p.p = Path(p.a)
2649  s = Sequence(p.a)
2650  p.r = Sequence(s)
2651  p.p2 = Path(p.r, p.task1, p.task2)
2652  p.schedule = Schedule(p.p2,p.p,tasks=[p.task3,p.task4, p.task5])
2653  d=p.dumpPython()
2654  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2655 """process.b = cms.EDProducer("bProducer")
2656 process.c = cms.EDProducer("cProducer")
2657 process.d = cms.EDProducer("dProducer")
2658 process.e = cms.EDProducer("eProducer")
2659 process.f = cms.EDProducer("fProducer")
2660 process.g = cms.EDProducer("gProducer")
2661 process.a = cms.EDAnalyzer("MyAnalyzer")
2662 process.task5 = cms.Task()
2663 process.task1 = cms.Task(process.task5)
2664 process.task3 = cms.Task(process.task1)
2665 process.task2 = cms.Task(process.c, process.task3)
2666 process.task4 = cms.Task(process.f, process.task2)
2667 process.r = cms.Sequence((process.a))
2668 process.p = cms.Path(process.a)
2669 process.p2 = cms.Path(process.r, process.task1, process.task2)
2670 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task3, process.task4, process.task5])""")
2671  # include some conditional tasks
2672  p = Process("test")
2673  p.a = EDAnalyzer("MyAnalyzer")
2674  p.b = EDProducer("bProducer")
2675  p.c = EDProducer("cProducer")
2676  p.d = EDProducer("dProducer")
2677  p.e = EDProducer("eProducer")
2678  p.f = EDProducer("fProducer")
2679  p.g = EDProducer("gProducer")
2680  p.task5 = Task()
2681  p.task3 = Task()
2682  p.task2 = ConditionalTask(p.c, p.task3)
2683  p.task1 = ConditionalTask(p.task5)
2684  p.p = Path(p.a)
2685  s = Sequence(p.a)
2686  p.r = Sequence(s)
2687  p.p2 = Path(p.r, p.task1, p.task2)
2688  p.schedule = Schedule(p.p2,p.p,tasks=[p.task5])
2689  d=p.dumpPython()
2690  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2691 """process.b = cms.EDProducer("bProducer")
2692 process.c = cms.EDProducer("cProducer")
2693 process.d = cms.EDProducer("dProducer")
2694 process.e = cms.EDProducer("eProducer")
2695 process.f = cms.EDProducer("fProducer")
2696 process.g = cms.EDProducer("gProducer")
2697 process.a = cms.EDAnalyzer("MyAnalyzer")
2698 process.task5 = cms.Task()
2699 process.task3 = cms.Task()
2700 process.task2 = cms.ConditionalTask(process.c, process.task3)
2701 process.task1 = cms.ConditionalTask(process.task5)
2702 process.r = cms.Sequence((process.a))
2703 process.p = cms.Path(process.a)
2704 process.p2 = cms.Path(process.r, process.task1, process.task2)
2705 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task5])""")
2706  # only tasks
2707  p = Process("test")
2708  p.d = EDProducer("dProducer")
2709  p.e = EDProducer("eProducer")
2710  p.f = EDProducer("fProducer")
2711  p.g = EDProducer("gProducer")
2712  p.task1 = Task(p.d, p.e)
2713  task2 = Task(p.f, p.g)
2714  p.schedule = Schedule(tasks=[p.task1,task2])
2715  d=p.dumpPython()
2716  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2717 """process.d = cms.EDProducer("dProducer")
2718 process.e = cms.EDProducer("eProducer")
2719 process.f = cms.EDProducer("fProducer")
2720 process.g = cms.EDProducer("gProducer")
2721 process.task1 = cms.Task(process.d, process.e)
2722 process.schedule = cms.Schedule(tasks=[cms.Task(process.f, process.g), process.task1])""")
2723  # empty schedule
2724  p = Process("test")
2725  p.schedule = Schedule()
2726  d=p.dumpPython()
2727  self.assertEqual(_lineDiff(d,Process('test').dumpPython()),
2728 """process.schedule = cms.Schedule()""")
2729 
2730  s = Sequence()
2731  a = EDProducer("A")
2732  s2 = Sequence(a)
2733  s2 += s
2734  process = Process("DUMP")
2735  process.a = a
2736  process.s2 = s2
2737  d=process.dumpPython()
2738  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2739 """process.a = cms.EDProducer("A")
2740 process.s2 = cms.Sequence(process.a)""")
2741  s = Sequence()
2742  s1 = Sequence(s)
2743  a = EDProducer("A")
2744  s3 = Sequence(a+a)
2745  s2 = Sequence(a+s3)
2746  s2 += s1
2747  process = Process("DUMP")
2748  process.a = a
2749  process.s2 = s2
2750  d=process.dumpPython()
2751  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2752 """process.a = cms.EDProducer("A")
2753 process.s2 = cms.Sequence(process.a+(process.a+process.a))""")
2754 
2755  def testSecSource(self):
2756  p = Process('test')
2757  p.a = SecSource("MySecSource")
2758  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),'process.a = cms.SecSource("MySecSource")')
2759 
2761  p = Process('test')
2762  p.a = EDAnalyzer("MyAnalyzer")
2763  old = p.a
2764  p.b = EDAnalyzer("YourAnalyzer")
2765  p.c = EDAnalyzer("OurAnalyzer")
2766  p.d = EDProducer("MyProducer")
2767  old2 = p.d
2768  p.t1 = Task(p.d)
2769  t2 = Task(p.d)
2770  t3 = Task(p.d)
2771  t4 = Task(p.d)
2772  t5 = Task(p.d)
2773  t6 = Task(p.d)
2774  p.ct1 = ConditionalTask(p.d)
2775  s = Sequence(p.a*p.b)
2776  p.s4 = Sequence(p.a*p.b, p.ct1)
2777  s.associate(t2)
2778  p.s4.associate(t2)
2779  p.p = Path(p.c+s+p.a)
2780  p.p2 = Path(p.c+p.s4+p.a, p.ct1)
2781  p.e3 = EndPath(p.c+s+p.a)
2782  new = EDAnalyzer("NewAnalyzer")
2783  new2 = EDProducer("NewProducer")
2784  visitor1 = NodeVisitor()
2785  p.p.visit(visitor1)
2786  self.assertTrue(visitor1.modules == set([old,old2,p.b,p.c]))
2787  p.schedule = Schedule(tasks=[t6])
2788  p.globalReplace("a",new)
2789  p.globalReplace("d",new2)
2790  visitor2 = NodeVisitor()
2791  p.p.visit(visitor2)
2792  self.assertTrue(visitor2.modules == set([new,new2,p.b,p.c]))
2793  self.assertEqual(p.p.dumpPython()[:-1], "cms.Path(process.c+process.a+process.b+process.a, cms.Task(process.d))")
2794  visitor_p2 = NodeVisitor()
2795  p.p2.visit(visitor_p2)
2796  self.assertTrue(visitor_p2.modules == set([new,new2,p.b,p.c]))
2797  self.assertEqual(p.p2.dumpPython()[:-1], "cms.Path(process.c+process.s4+process.a, process.ct1)")
2798  visitor3 = NodeVisitor()
2799  p.e3.visit(visitor3)
2800  self.assertTrue(visitor3.modules == set([new,new2,p.b,p.c]))
2801  visitor4 = NodeVisitor()
2802  p.s4.visit(visitor4)
2803  self.assertTrue(visitor4.modules == set([new,new2,p.b]))
2804  self.assertEqual(p.s4.dumpPython()[:-1],"cms.Sequence(process.a+process.b, cms.Task(process.d), process.ct1)")
2805  visitor5 = NodeVisitor()
2806  p.t1.visit(visitor5)
2807  self.assertTrue(visitor5.modules == set([new2]))
2808  visitor6 = NodeVisitor()
2809  listOfTasks = list(p.schedule._tasks)
2810  listOfTasks[0].visit(visitor6)
2811  self.assertTrue(visitor6.modules == set([new2]))
2812  visitor7 = NodeVisitor()
2813  p.ct1.visit(visitor7)
2814  self.assertTrue(visitor7.modules == set([new2]))
2815  visitor8 = NodeVisitor()
2816  listOfConditionalTasks = list(p.conditionaltasks.values())
2817  listOfConditionalTasks[0].visit(visitor8)
2818  self.assertTrue(visitor8.modules == set([new2]))
2819 
2820 
2821  p.d2 = EDProducer("YourProducer")
2822  p.schedule = Schedule(p.p, p.p2, p.e3, tasks=[p.t1])
2823  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2824  p.p = Path(p.c+s)
2825  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2826  p.e3 = EndPath(p.c)
2827  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2828  p.t1 = Task(p.d2)
2829  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2830 
2831  def testSequence(self):
2832  p = Process('test')
2833  p.a = EDAnalyzer("MyAnalyzer")
2834  p.b = EDAnalyzer("YourAnalyzer")
2835  p.c = EDAnalyzer("OurAnalyzer")
2836  p.s = Sequence(p.a*p.b)
2837  self.assertEqual(str(p.s),'a+b')
2838  self.assertEqual(p.s.label_(),'s')
2839  path = Path(p.c+p.s)
2840  self.assertEqual(str(path),'c+a+b')
2841  p._validateSequence(path, 'p1')
2842  notInProcess = EDAnalyzer('NotInProcess')
2843  p2 = Path(p.c+p.s*notInProcess)
2844  self.assertRaises(RuntimeError, p._validateSequence, p2, 'p2')
2845 
2846  def testSequence2(self):
2847  p = Process('test')
2848  p.a = EDAnalyzer("MyAnalyzer")
2849  p.b = EDAnalyzer("YourAnalyzer")
2850  p.c = EDAnalyzer("OurAnalyzer")
2851  testseq = Sequence(p.a*p.b)
2852  p.s = testseq
2853  #p.y = testseq
2854  self.assertRaises(ValueError, p.__setattr__, "y", testseq)
2855 
2857  service = Service("d")
2858  self.assertFalse(service._inProcess)
2859  process = Process("test")
2860  process.d = service
2861  self.assertTrue(service._inProcess)
2862  service2 = Service("d")
2863  process.d = service2
2864  self.assertFalse(service._inProcess)
2865  self.assertTrue(service2._inProcess)
2866  del process.d
2867  self.assertFalse(service2._inProcess)
2868 
2869  def testTask(self):
2870 
2871  # create some objects to use in tests
2872  edanalyzer = EDAnalyzer("a")
2873  edproducer = EDProducer("b")
2874  edproducer2 = EDProducer("b2")
2875  edproducer3 = EDProducer("b3")
2876  edproducer4 = EDProducer("b4")
2877  edproducer8 = EDProducer("b8")
2878  edproducer9 = EDProducer("b9")
2879  edfilter = EDFilter("c")
2880  service = Service("d")
2881  service3 = Service("d", v = untracked.uint32(3))
2882  essource = ESSource("e")
2883  esproducer = ESProducer("f")
2884  testTask2 = Task()
2885 
2886  # test adding things to Tasks
2887  testTask1 = Task(edproducer, edfilter)
2888  self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
2889  testTask1.add(essource, service)
2890  testTask1.add(essource, esproducer)
2891  testTask1.add(testTask2)
2892  coll = testTask1._collection
2893  self.assertTrue(edproducer in coll)
2894  self.assertTrue(edfilter in coll)
2895  self.assertTrue(service in coll)
2896  self.assertTrue(essource in coll)
2897  self.assertTrue(esproducer in coll)
2898  self.assertTrue(testTask2 in coll)
2899  self.assertTrue(len(coll) == 6)
2900  self.assertTrue(len(testTask2._collection) == 0)
2901 
2902  taskContents = []
2903  for i in testTask1:
2904  taskContents.append(i)
2905  self.assertTrue(taskContents == [edproducer, edfilter, essource, service, esproducer, testTask2])
2906 
2907  # test attaching Task to Process
2908  process = Process("test")
2909 
2910  process.mproducer = edproducer
2911  process.mproducer2 = edproducer2
2912  process.mfilter = edfilter
2913  process.messource = essource
2914  process.mesproducer = esproducer
2915  process.d = service
2916 
2917  testTask3 = Task(edproducer, edproducer2)
2918  testTask1.add(testTask3)
2919  process.myTask1 = testTask1
2920 
2921  # test the validation that occurs when attaching a Task to a Process
2922  # first a case that passes, then one the fails on an EDProducer
2923  # then one that fails on a service
2924  l = set()
2925  visitor = NodeNameVisitor(l)
2926  testTask1.visit(visitor)
2927  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2928  l2 = testTask1.moduleNames
2929  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2930 
2931  testTask4 = Task(edproducer3)
2932  l.clear()
2933  self.assertRaises(RuntimeError, testTask4.visit, visitor)
2934  try:
2935  process.myTask4 = testTask4
2936  self.assertTrue(False)
2937  except RuntimeError:
2938  pass
2939 
2940  testTask5 = Task(service3)
2941  l.clear()
2942  self.assertRaises(RuntimeError, testTask5.visit, visitor)
2943  try:
2944  process.myTask5 = testTask5
2945  self.assertTrue(False)
2946  except RuntimeError:
2947  pass
2948 
2949  process.d = service3
2950  process.myTask5 = testTask5
2951 
2952  # test placement into the Process and the tasks property
2953  expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 }
2954  expectedFixedDict = DictTypes.FixedKeysDict(expectedDict);
2955  self.assertTrue(process.tasks == expectedFixedDict)
2956  self.assertTrue(process.tasks['myTask1'] == testTask1)
2957  self.assertTrue(process.myTask1 == testTask1)
2958 
2959  # test replacing an EDProducer in a Task when calling __settattr__
2960  # for the EDProducer on the Process.
2961  process.mproducer2 = edproducer4
2962  process.d = service
2963  l = list()
2964  visitor1 = ModuleNodeVisitor(l)
2965  testTask1.visit(visitor1)
2966  l.sort(key=lambda mod: mod.__str__())
2967  expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__())
2968  self.assertTrue(expectedList == l)
2969  process.myTask6 = Task()
2970  process.myTask7 = Task()
2971  process.mproducer8 = edproducer8
2972  process.myTask8 = Task(process.mproducer8)
2973  process.myTask6.add(process.myTask7)
2974  process.myTask7.add(process.myTask8)
2975  process.myTask1.add(process.myTask6)
2976  process.myTask8.add(process.myTask5)
2977 
2978  testDict = process._itemsInDependencyOrder(process.tasks)
2979  expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"]
2980  expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
2981  index = 0
2982  for testLabel, testTask in testDict.items():
2983  self.assertTrue(testLabel == expectedLabels[index])
2984  self.assertTrue(testTask == expectedTasks[index])
2985  index += 1
2986 
2987  pythonDump = testTask1.dumpPython(PrintOptions())
2988 
2989 
2990  expectedPythonDump = 'cms.Task(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
2991  self.assertTrue(pythonDump == expectedPythonDump)
2992 
2993  process.myTask5 = Task()
2994  process.myTask100 = Task()
2995  process.mproducer9 = edproducer9
2996  sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
2997  sequence2 = Sequence(process.mproducer8 + process.mproducer9)
2998  process.sequence3 = Sequence((process.mproducer8 + process.mfilter))
2999  sequence4 = Sequence()
3000  process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
3001  process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
3002  process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
3003  process.path2 = Path(process.mproducer)
3004  process.path3 = Path(process.mproducer9+process.mproducer8,testTask2)
3005 
3006  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')
3007 
3008  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')
3009 
3010  # test NodeNameVisitor and moduleNames
3011  l = set()
3012  nameVisitor = NodeNameVisitor(l)
3013  process.path1.visit(nameVisitor)
3014  self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3015  self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3016 
3017  # test copy
3018  process.mproducer10 = EDProducer("b10")
3019  process.path21 = process.path11.copy()
3020  process.path21.replace(process.mproducer, process.mproducer10)
3021 
3022  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')
3023 
3024  # Some peculiarities of the way things work show up here. dumpPython sorts tasks and
3025  # removes duplication at the level of strings. The Task and Sequence objects themselves
3026  # remove duplicate tasks in their contents if the instances are the same (exact same python
3027  # object id which is not the same as the string representation being the same).
3028  # Also note that the mutating visitor replaces sequences and tasks that have
3029  # modified contents with their modified contents, it does not modify the sequence
3030  # or task itself.
3031  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.mproducer8, process.myTask5), process.myTask100, process.myTask5)\n')
3032 
3033  process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
3034  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.mproducer8, process.myTask5), process.myTask100, process.myTask5)\n')
3035 
3036  process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
3037  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.mproducer8, process.myTask5), process.myTask100, process.myTask5)\n')
3038 
3039  process.a = EDAnalyzer("MyAnalyzer")
3040  process.b = OutputModule("MyOutputModule")
3041  process.c = EDFilter("MyFilter")
3042  process.d = EDProducer("MyProducer")
3043  process.e = ESProducer("MyESProducer")
3044  process.f = ESSource("MyESSource")
3045  process.g = ESProducer("g")
3046  process.path24 = Path(process.a+process.b+process.c+process.d)
3047  process.path25 = process.path24.copyAndExclude([process.a,process.b,process.c])
3048  self.assertTrue(process.path25.dumpPython() == 'cms.Path(process.d)\n')
3049  #print process.path3
3050  #print process.dumpPython()
3051 
3052  process.path200 = EndPath(Sequence(process.c,Task(process.e)))
3053  process.path200.replace(process.c,process.b)
3054  process.path200.replace(process.e,process.f)
3055  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.b, cms.Task(process.f))\n")
3056  process.path200.replace(process.b,process.c)
3057  process.path200.replace(process.f,process.e)
3058  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
3059  process.path200.replace(process.c,process.a)
3060  process.path200.replace(process.e,process.g)
3061  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.a, cms.Task(process.g))\n")
3062  process.path200.replace(process.a,process.c)
3063  process.path200.replace(process.g,process.e)
3064  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
3065 
3067 
3068  # create some objects to use in tests
3069  edanalyzer = EDAnalyzer("a")
3070  edproducer = EDProducer("b")
3071  edproducer2 = EDProducer("b2")
3072  edproducer3 = EDProducer("b3")
3073  edproducer4 = EDProducer("b4")
3074  edproducer8 = EDProducer("b8")
3075  edproducer9 = EDProducer("b9")
3076  edfilter = EDFilter("c")
3077  service = Service("d")
3078  service3 = Service("d", v = untracked.uint32(3))
3079  essource = ESSource("e")
3080  esproducer = ESProducer("f")
3081  testTask2 = Task()
3082  testCTask2 = ConditionalTask()
3083 
3084  # test adding things to Tasks
3085  testTask1 = ConditionalTask(edproducer, edfilter)
3086  self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
3087  testTask1.add(essource, service)
3088  testTask1.add(essource, esproducer)
3089  testTask1.add(testTask2)
3090  testTask1.add(testCTask2)
3091  coll = testTask1._collection
3092  self.assertTrue(edproducer in coll)
3093  self.assertTrue(edfilter in coll)
3094  self.assertTrue(service in coll)
3095  self.assertTrue(essource in coll)
3096  self.assertTrue(esproducer in coll)
3097  self.assertTrue(testTask2 in coll)
3098  self.assertTrue(testCTask2 in coll)
3099  self.assertTrue(len(coll) == 7)
3100  self.assertTrue(len(testTask2._collection) == 0)
3101 
3102  taskContents = []
3103  for i in testTask1:
3104  taskContents.append(i)
3105  self.assertEqual(taskContents, [edproducer, edfilter, essource, service, esproducer, testTask2, testCTask2])
3106 
3107  # test attaching Task to Process
3108  process = Process("test")
3109 
3110  process.mproducer = edproducer
3111  process.mproducer2 = edproducer2
3112  process.mfilter = edfilter
3113  process.messource = essource
3114  process.mesproducer = esproducer
3115  process.d = service
3116 
3117  testTask3 = ConditionalTask(edproducer, edproducer2)
3118  testTask1.add(testTask3)
3119  process.myTask1 = testTask1
3120 
3121  # test the validation that occurs when attaching a ConditionalTask to a Process
3122  # first a case that passes, then one the fails on an EDProducer
3123  # then one that fails on a service
3124  l = set()
3125  visitor = NodeNameVisitor(l)
3126  testTask1.visit(visitor)
3127  self.assertEqual(l, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
3128  l2 = testTask1.moduleNames()
3129  self.assertEqual(l2, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
3130 
3131  testTask4 = ConditionalTask(edproducer3)
3132  l.clear()
3133  self.assertRaises(RuntimeError, testTask4.visit, visitor)
3134  try:
3135  process.myTask4 = testTask4
3136  self.assertTrue(False)
3137  except RuntimeError:
3138  pass
3139 
3140  testTask5 = ConditionalTask(service3)
3141  l.clear()
3142  self.assertRaises(RuntimeError, testTask5.visit, visitor)
3143  try:
3144  process.myTask5 = testTask5
3145  self.assertTrue(False)
3146  except RuntimeError:
3147  pass
3148 
3149  process.d = service3
3150  process.myTask5 = testTask5
3151 
3152  # test placement into the Process and the tasks property
3153  expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 }
3154  expectedFixedDict = DictTypes.FixedKeysDict(expectedDict);
3155  self.assertEqual(process.conditionaltasks, expectedFixedDict)
3156  self.assertEqual(process.conditionaltasks['myTask1'], testTask1)
3157  self.assertEqual(process.myTask1, testTask1)
3158 
3159  # test replacing an EDProducer in a ConditionalTask when calling __settattr__
3160  # for the EDProducer on the Process.
3161  process.mproducer2 = edproducer4
3162  process.d = service
3163  l = list()
3164  visitor1 = ModuleNodeVisitor(l)
3165  testTask1.visit(visitor1)
3166  l.sort(key=lambda mod: mod.__str__())
3167  expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__())
3168  self.assertEqual(expectedList, l)
3169  process.myTask6 = ConditionalTask()
3170  process.myTask7 = ConditionalTask()
3171  process.mproducer8 = edproducer8
3172  process.myTask8 = ConditionalTask(process.mproducer8)
3173  process.myTask6.add(process.myTask7)
3174  process.myTask7.add(process.myTask8)
3175  process.myTask1.add(process.myTask6)
3176  process.myTask8.add(process.myTask5)
3177  self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n")
3178 
3179  testDict = process._itemsInDependencyOrder(process.conditionaltasks)
3180  expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"]
3181  expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
3182  index = 0
3183  for testLabel, testTask in testDict.items():
3184  self.assertEqual(testLabel, expectedLabels[index])
3185  self.assertEqual(testTask, expectedTasks[index])
3186  index += 1
3187 
3188  pythonDump = testTask1.dumpPython(PrintOptions())
3189 
3190 
3191  expectedPythonDump = 'cms.ConditionalTask(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
3192  self.assertEqual(pythonDump, expectedPythonDump)
3193 
3194  process.myTask5 = ConditionalTask()
3195  self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n")
3196  process.myTask100 = ConditionalTask()
3197  process.mproducer9 = edproducer9
3198  sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
3199  sequence2 = Sequence(process.mproducer8 + process.mproducer9)
3200  process.sequence3 = Sequence((process.mproducer8 + process.mfilter))
3201  sequence4 = Sequence()
3202  process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
3203  process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
3204  process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
3205  process.path2 = Path(process.mproducer)
3206  process.path3 = Path(process.mproducer9+process.mproducer8,testTask2)
3207 
3208  self.assertEqual(process.path1.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)\n')
3209 
3210  self.assertEqual(process.path11.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask100, process.myTask5)\n')
3211 
3212  # test NodeNameVisitor and moduleNames
3213  l = set()
3214  nameVisitor = NodeNameVisitor(l)
3215  process.path1.visit(nameVisitor)
3216  self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3217  self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3218 
3219  # test copy
3220  process.mproducer10 = EDProducer("b10")
3221  process.path21 = process.path11.copy()
3222  process.path21.replace(process.mproducer, process.mproducer10)
3223 
3224  self.assertEqual(process.path11.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask100, process.myTask5)\n')
3225 
3226  # Some peculiarities of the way things work show up here. dumpPython sorts tasks and
3227  # removes duplication at the level of strings. The Task and Sequence objects themselves
3228  # remove duplicate tasks in their contents if the instances are the same (exact same python
3229  # object id which is not the same as the string representation being the same).
3230  # Also note that the mutating visitor replaces sequences and tasks that have
3231  # modified contents with their modified contents, it does not modify the sequence
3232  # or task itself.
3233  self.assertEqual(process.path21.dumpPython(PrintOptions()), 'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer10), cms.ConditionalTask(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer10, process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n')
3234 
3235  process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
3236  self.assertEqual(process.path22.dumpPython(PrintOptions()), 'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.ConditionalTask(process.None, process.mproducer10), cms.ConditionalTask(process.messource, process.mproducer10, process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n')
3237 
3238  process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
3239  self.assertEqual(process.path23.dumpPython(PrintOptions()), 'cms.Path(process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.ConditionalTask(process.None), cms.ConditionalTask(process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n')
3240 
3241  process = Process("Test")
3242 
3243  process.b = EDProducer("b")
3244  process.b2 = EDProducer("b2")
3245  process.b3 = EDProducer("b3")
3246  process.p = Path(process.b, ConditionalTask(process.b3, process.b2))
3247  p = TestMakePSet()
3248  process.fillProcessDesc(p)
3249  self.assertEqual(p.values["@all_modules"], (True, ['b', 'b2', 'b3']))
3250  self.assertEqual(p.values["@paths"], (True, ['p']))
3251  self.assertEqual(p.values["p"], (True, ['b','#','b2','b3','@']))
3252 
3253 
3254  def testPath(self):
3255  p = Process("test")
3256  p.a = EDAnalyzer("MyAnalyzer")
3257  p.b = EDAnalyzer("YourAnalyzer")
3258  p.c = EDAnalyzer("OurAnalyzer")
3259  path = Path(p.a)
3260  path *= p.b
3261  path += p.c
3262  self.assertEqual(str(path),'a+b+c')
3263  path = Path(p.a*p.b+p.c)
3264  self.assertEqual(str(path),'a+b+c')
3265 # path = Path(p.a)*p.b+p.c #This leads to problems with sequences
3266 # self.assertEqual(str(path),'((a*b)+c)')
3267  path = Path(p.a+ p.b*p.c)
3268  self.assertEqual(str(path),'a+b+c')
3269  path = Path(p.a*(p.b+p.c))
3270  self.assertEqual(str(path),'a+b+c')
3271  path = Path(p.a*(p.b+~p.c))
3272  pathx = Path(p.a*(p.b+ignore(p.c)))
3273  self.assertEqual(str(path),'a+b+~c')
3274  p.es = ESProducer("AnESProducer")
3275  self.assertRaises(TypeError,Path,p.es)
3276 
3277  t = Path()
3278  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path()\n')
3279 
3280  t = Path(p.a)
3281  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a)\n')
3282 
3283  t = Path(Task())
3284  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(cms.Task())\n')
3285 
3286  t = Path(p.a, Task())
3287  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task())\n')
3288 
3289  p.prod = EDProducer("prodName")
3290  p.t1 = Task(p.prod)
3291  t = Path(p.a, p.t1, Task(), p.t1)
3292  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n')
3293 
3294  t = Path(ConditionalTask())
3295  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(cms.ConditionalTask())\n')
3296 
3297  t = Path(p.a, ConditionalTask())
3298  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.ConditionalTask())\n')
3299 
3300  p.prod = EDProducer("prodName")
3301  p.t1 = ConditionalTask(p.prod)
3302  t = Path(p.a, p.t1, Task(), p.t1)
3303  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n')
3304 
3305  def testFinalPath(self):
3306  p = Process("test")
3307  p.a = OutputModule("MyOutputModule")
3308  p.b = OutputModule("YourOutputModule")
3309  p.c = OutputModule("OurOutputModule")
3310  path = FinalPath(p.a)
3311  path *= p.b
3312  path += p.c
3313  self.assertEqual(str(path),'a+b+c')
3314  path = FinalPath(p.a*p.b+p.c)
3315  self.assertEqual(str(path),'a+b+c')
3316  path = FinalPath(p.a+ p.b*p.c)
3317  self.assertEqual(str(path),'a+b+c')
3318  path = FinalPath(p.a*(p.b+p.c))
3319  self.assertEqual(str(path),'a+b+c')
3320  p.es = ESProducer("AnESProducer")
3321  self.assertRaises(TypeError,FinalPath,p.es)
3322 
3323  t = FinalPath()
3324  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.FinalPath()\n')
3325 
3326  t = FinalPath(p.a)
3327  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.FinalPath(process.a)\n')
3328 
3329  self.assertRaises(TypeError, FinalPath, Task())
3330  self.assertRaises(TypeError, FinalPath, p.a, Task())
3331 
3332  p.prod = EDProducer("prodName")
3333  p.t1 = Task(p.prod)
3334  self.assertRaises(TypeError, FinalPath, p.a, p.t1, Task(), p.t1)
3335 
3336  p.prod = EDProducer("prodName")
3337  p.t1 = ConditionalTask(p.prod)
3338  self.assertRaises(TypeError, FinalPath, p.a, p.t1, ConditionalTask(), p.t1)
3339 
3340  p.t = FinalPath(p.a)
3341  p.a = OutputModule("ReplacedOutputModule")
3342  self.assertEqual(p.t.dumpPython(PrintOptions()), 'cms.FinalPath(process.a)\n')
3343 
3345  p = Process("test")
3346  a = EDAnalyzer("MyAnalyzer")
3347  p.a = a
3348  a.setLabel("a")
3349  b = EDAnalyzer("YOurAnalyzer")
3350  p.b = b
3351  b.setLabel("b")
3352  path = Path(a * b)
3353  p.path = Path(p.a*p.b)
3354  lookuptable = {id(a): p.a, id(b): p.b}
3355  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
3356  #lookuptable = p._cloneToObjectDict
3357  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
3358  self.assertEqual(str(path),str(p.path))
3359 
3360  def testContains(self):
3361 
3362  a = EDProducer("a")
3363  b = EDProducer("b")
3364  c = EDProducer("c")
3365  d = EDProducer("d")
3366  e = EDProducer("e")
3367  f = EDProducer("f")
3368  g = EDProducer("g")
3369  h = EDProducer("h")
3370  i = EDProducer("i")
3371  j = EDProducer("j")
3372  k = EDProducer("k")
3373  l = EDProducer("l")
3374  m = EDProducer("m")
3375  n = EDProducer("n")
3376 
3377  seq1 = Sequence(e)
3378  task1 = Task(g)
3379  ctask1 = ConditionalTask(h)
3380  path = Path(a * c * seq1, task1, ctask1)
3381 
3382  self.assertTrue(path.contains(a))
3383  self.assertFalse(path.contains(b))
3384  self.assertTrue(path.contains(c))
3385  self.assertFalse(path.contains(d))
3386  self.assertTrue(path.contains(e))
3387  self.assertFalse(path.contains(f))
3388  self.assertTrue(path.contains(g))
3389  self.assertTrue(path.contains(h))
3390 
3391  endpath = EndPath(h * i)
3392  self.assertFalse(endpath.contains(b))
3393  self.assertTrue(endpath.contains(i))
3394 
3395  seq = Sequence(a * c)
3396  self.assertFalse(seq.contains(b))
3397  self.assertTrue(seq.contains(c))
3398 
3399  task2 = Task(l)
3400  task = Task(j, k, task2)
3401  self.assertFalse(task.contains(b))
3402  self.assertTrue(task.contains(j))
3403  self.assertTrue(task.contains(k))
3404  self.assertTrue(task.contains(l))
3405 
3406  task3 = Task(m)
3407  path2 = Path(n)
3408  sch = Schedule(path, path2, tasks=[task,task3])
3409  self.assertFalse(sch.contains(b))
3410  self.assertTrue(sch.contains(a))
3411  self.assertTrue(sch.contains(c))
3412  self.assertTrue(sch.contains(e))
3413  self.assertTrue(sch.contains(g))
3414  self.assertTrue(sch.contains(n))
3415  self.assertTrue(sch.contains(j))
3416  self.assertTrue(sch.contains(k))
3417  self.assertTrue(sch.contains(l))
3418  self.assertTrue(sch.contains(m))
3419 
3420  ctask2 = ConditionalTask(l, task1)
3421  ctask = ConditionalTask(j, k, ctask2)
3422  self.assertFalse(ctask.contains(b))
3423  self.assertTrue(ctask.contains(j))
3424  self.assertTrue(ctask.contains(k))
3425  self.assertTrue(ctask.contains(l))
3426  self.assertTrue(ctask.contains(g))
3427 
3428  def testSchedule(self):
3429  p = Process("test")
3430  p.a = EDAnalyzer("MyAnalyzer")
3431  p.b = EDAnalyzer("YourAnalyzer")
3432  p.c = EDAnalyzer("OurAnalyzer")
3433  p.d = EDAnalyzer("OurAnalyzer")
3434  p.path1 = Path(p.a)
3435  p.path2 = Path(p.b)
3436  p.path3 = Path(p.d)
3437 
3438  s = Schedule(p.path1,p.path2)
3439  self.assertEqual(s[0],p.path1)
3440  self.assertEqual(s[1],p.path2)
3441  p.schedule = s
3442  self.assertTrue('b' in p.schedule.moduleNames())
3443  self.assertTrue(hasattr(p, 'b'))
3444  self.assertTrue(hasattr(p, 'c'))
3445  self.assertTrue(hasattr(p, 'd'))
3446  self.assertTrue(hasattr(p, 'path1'))
3447  self.assertTrue(hasattr(p, 'path2'))
3448  self.assertTrue(hasattr(p, 'path3'))
3449  p.prune()
3450  self.assertTrue('b' in p.schedule.moduleNames())
3451  self.assertTrue(hasattr(p, 'b'))
3452  self.assertTrue(not hasattr(p, 'c'))
3453  self.assertTrue(not hasattr(p, 'd'))
3454  self.assertTrue(hasattr(p, 'path1'))
3455  self.assertTrue(hasattr(p, 'path2'))
3456  self.assertTrue(not hasattr(p, 'path3'))
3457 
3458  self.assertTrue(len(p.schedule._tasks) == 0)
3459 
3460  p = Process("test")
3461  p.a = EDAnalyzer("MyAnalyzer")
3462  p.b = EDAnalyzer("YourAnalyzer")
3463  p.c = EDAnalyzer("OurAnalyzer")
3464  p.d = EDAnalyzer("dAnalyzer")
3465  p.e = EDProducer("eProducer")
3466  p.f = EDProducer("fProducer")
3467  p.Tracer = Service("Tracer")
3468  p.path1 = Path(p.a)
3469  p.path2 = Path(p.b)
3470  p.path3 = Path(p.d)
3471  p.task1 = Task(p.e)
3472  p.task2 = Task(p.f, p.Tracer)
3473  s = Schedule(p.path1,p.path2,tasks=[p.task1,p.task2,p.task1])
3474  self.assertEqual(s[0],p.path1)
3475  self.assertEqual(s[1],p.path2)
3476  self.assertTrue(len(s._tasks) == 2)
3477  self.assertTrue(p.task1 in s._tasks)
3478  self.assertTrue(p.task2 in s._tasks)
3479  listOfTasks = list(s._tasks)
3480  self.assertTrue(len(listOfTasks) == 2)
3481  self.assertTrue(p.task1 == listOfTasks[0])
3482  self.assertTrue(p.task2 == listOfTasks[1])
3483  p.schedule = s
3484  self.assertTrue('b' in p.schedule.moduleNames())
3485 
3486  process2 = Process("test")
3487  process2.a = EDAnalyzer("MyAnalyzer")
3488  process2.e = EDProducer("eProducer")
3489  process2.path1 = Path(process2.a)
3490  process2.task1 = Task(process2.e)
3491  process2.schedule = Schedule(process2.path1,tasks=process2.task1)
3492  listOfTasks = list(process2.schedule._tasks)
3493  self.assertTrue(listOfTasks[0] == process2.task1)
3494 
3495  # test Schedule copy
3496  s2 = s.copy()
3497  self.assertEqual(s2[0],p.path1)
3498  self.assertEqual(s2[1],p.path2)
3499  self.assertTrue(len(s2._tasks) == 2)
3500  self.assertTrue(p.task1 in s2._tasks)
3501  self.assertTrue(p.task2 in s2._tasks)
3502  listOfTasks = list(s2._tasks)
3503  self.assertTrue(len(listOfTasks) == 2)
3504  self.assertTrue(p.task1 == listOfTasks[0])
3505  self.assertTrue(p.task2 == listOfTasks[1])
3506 
3507  names = s.moduleNames()
3508  self.assertTrue(names == set(['a', 'b', 'e', 'Tracer', 'f']))
3509  #adding a path not attached to the Process should cause an exception
3510  p = Process("test")
3511  p.a = EDAnalyzer("MyAnalyzer")
3512  path1 = Path(p.a)
3513  s = Schedule(path1)
3514  self.assertRaises(RuntimeError, lambda : p.setSchedule_(s) )
3515 
3516  #make sure anonymous sequences work
3517  p = Process("test")
3518  p.a = EDAnalyzer("MyAnalyzer")
3519  p.b = EDAnalyzer("MyOtherAnalyzer")
3520  p.c = EDProducer("MyProd")
3521  path1 = Path(p.c*Sequence(p.a+p.b))
3522  s = Schedule(path1)
3523  self.assertTrue('a' in s.moduleNames())
3524  self.assertTrue('b' in s.moduleNames())
3525  self.assertTrue('c' in s.moduleNames())
3526  p.path1 = path1
3527  p.schedule = s
3528  p.prune()
3529  self.assertTrue('a' in s.moduleNames())
3530  self.assertTrue('b' in s.moduleNames())
3531  self.assertTrue('c' in s.moduleNames())
3532 
3534  p = Process("test")
3535  p.a = EDAnalyzer("MyAnalyzer")
3536  p.b = EDAnalyzer("YourAnalyzer")
3537  p.c = EDAnalyzer("OurAnalyzer")
3538  p.path1 = Path(p.a)
3539  p.path2 = Path(p.b)
3540  self.assertTrue(p.schedule is None)
3541  pths = p.paths
3542  keys = pths.keys()
3543  self.assertEqual(pths[keys[0]],p.path1)
3544  self.assertEqual(pths[keys[1]],p.path2)
3545  p.prune()
3546  self.assertTrue(hasattr(p, 'a'))
3547  self.assertTrue(hasattr(p, 'b'))
3548  self.assertTrue(not hasattr(p, 'c'))
3549  self.assertTrue(hasattr(p, 'path1'))
3550  self.assertTrue(hasattr(p, 'path2'))
3551 
3552 
3553  p = Process("test")
3554  p.a = EDAnalyzer("MyAnalyzer")
3555  p.b = EDAnalyzer("YourAnalyzer")
3556  p.c = EDAnalyzer("OurAnalyzer")
3557  p.path2 = Path(p.b)
3558  p.path1 = Path(p.a)
3559  self.assertTrue(p.schedule is None)
3560  pths = p.paths
3561  keys = pths.keys()
3562  self.assertEqual(pths[keys[1]],p.path1)
3563  self.assertEqual(pths[keys[0]],p.path2)
3564 
3565 
3566  def testUsing(self):
3567  p = Process('test')
3568  p.block = PSet(a = int32(1))
3569  p.modu = EDAnalyzer('Analyzer', p.block, b = int32(2))
3570  self.assertEqual(p.modu.a.value(),1)
3571  self.assertEqual(p.modu.b.value(),2)
3572 
3573  def testOverride(self):
3574  p = Process('test')
3575  a = EDProducer("A", a1=int32(0))
3576  self.assertTrue(not a.isModified())
3577  a.a1 = 1
3578  self.assertTrue(a.isModified())
3579  p.a = a
3580  self.assertEqual(p.a.a1.value(), 1)
3581  # try adding an unmodified module.
3582  # should accept it
3583  p.a = EDProducer("A", a1=int32(2))
3584  self.assertEqual(p.a.a1.value(), 2)
3585  # try adding a modified module. Should throw
3586  # no longer, since the same (modified) say, geometry
3587  # could come from more than one cff
3588  b = EDProducer("A", a1=int32(3))
3589  b.a1 = 4
3590  #self.assertRaises(RuntimeError, setattr, *(p,'a',b))
3591  ps1 = PSet(a = int32(1))
3592  ps2 = PSet(a = int32(2))
3593  self.assertRaises(ValueError, EDProducer, 'C', ps1, ps2)
3594  self.assertRaises(ValueError, EDProducer, 'C', ps1, a=int32(3))
3595 
3596  def testOptions(self):
3597  p = Process('test')
3598  self.assertEqual(p.options.numberOfThreads.value(),1)
3599  p.options.numberOfThreads = 8
3600  self.assertEqual(p.options.numberOfThreads.value(),8)
3601  p.options = PSet()
3602  self.assertEqual(p.options.numberOfThreads.value(),1)
3603  p.options = dict(numberOfStreams =2,
3604  numberOfThreads =2)
3605  self.assertEqual(p.options.numberOfThreads.value(),2)
3606  self.assertEqual(p.options.numberOfStreams.value(),2)
3607  del p.options
3608  self.assertRaises(TypeError, setattr, p, 'options', untracked.PSet(numberOfThreads = int32(-1)))
3609  p.options = untracked.PSet(numberOfThreads = untracked.uint32(4))
3610  self.assertEqual(p.options.numberOfThreads.value(), 4)
3611 
3612  def testMaxEvents(self):
3613  p = Process("Test")
3614  p.maxEvents.input = 10
3615  self.assertEqual(p.maxEvents.input.value(),10)
3616  p = Process("Test")
3617  p.maxEvents.output = 10
3618  self.assertEqual(p.maxEvents.output.value(),10)
3619  p = Process("Test")
3620  p.maxEvents.output = PSet(out=untracked.int32(10))
3621  self.assertEqual(p.maxEvents.output.out.value(), 10)
3622  p = Process("Test")
3623  p.maxEvents = untracked.PSet(input = untracked.int32(5))
3624  self.assertEqual(p.maxEvents.input.value(), 5)
3625  del p.maxEvents
3626  self.assertRaises(TypeError, setattr, p, 'maxEvents', untracked.PSet(input = untracked.uint32(1)))
3627  p.maxEvents = untracked.PSet(input = untracked.int32(1))
3628  self.assertEqual(p.maxEvents.input.value(), 1)
3629 
3630  def testExamples(self):
3631  p = Process("Test")
3632  p.source = Source("PoolSource",fileNames = untracked(string("file:reco.root")))
3633  p.foos = EDProducer("FooProducer")
3634  p.bars = EDProducer("BarProducer", foos=InputTag("foos"))
3635  p.out = OutputModule("PoolOutputModule",fileName=untracked(string("file:foos.root")))
3636  p.bars.foos = 'Foosball'
3637  self.assertEqual(p.bars.foos, InputTag('Foosball'))
3638  p.p = Path(p.foos*p.bars)
3639  p.e = EndPath(p.out)
3640  p.add_(Service("MessageLogger"))
3641 
3642  def testPrefers(self):
3643  p = Process("Test")
3644  p.add_(ESSource("ForceSource"))
3645  p.juicer = ESProducer("JuicerProducer")
3646  p.prefer("ForceSource")
3647  p.prefer("juicer")
3648  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
3649 """process.juicer = cms.ESProducer("JuicerProducer")
3650 process.ForceSource = cms.ESSource("ForceSource")
3651 process.prefer("ForceSource")
3652 process.prefer("juicer")""")
3653  p.prefer("juicer",fooRcd=vstring("Foo"))
3654  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
3655 """process.juicer = cms.ESProducer("JuicerProducer")
3656 process.ForceSource = cms.ESSource("ForceSource")
3657 process.prefer("ForceSource")
3658 process.prefer("juicer",
3659  fooRcd = cms.vstring('Foo')
3660 )""")
3661 
3662  def testFreeze(self):
3663  process = Process("Freeze")
3664  m = EDProducer("M", p=PSet(i = int32(1)))
3665  m.p.i = 2
3666  process.m = m
3667  # should be frozen
3668  #self.assertRaises(ValueError, setattr, m.p, 'i', 3)
3669  #self.assertRaises(ValueError, setattr, m, 'p', PSet(i=int32(1)))
3670  #self.assertRaises(ValueError, setattr, m.p, 'j', 1)
3671  #self.assertRaises(ValueError, setattr, m, 'j', 1)
3672  # But OK to change through the process
3673  process.m.p.i = 4
3674  self.assertEqual(process.m.p.i.value(), 4)
3675  process.m.p = PSet(j=int32(1))
3676  # should work to clone it, though
3677  m2 = m.clone(p = PSet(i = int32(5)), j = int32(8))
3678  m2.p.i = 6
3679  m2.j = 8
3680  def testSubProcess(self):
3681  process = Process("Parent")
3682  subProcess = Process("Child")
3683  subProcess.a = EDProducer("A")
3684  subProcess.p = Path(subProcess.a)
3685  subProcess.add_(Service("Foo"))
3686  process.addSubProcess(SubProcess(subProcess))
3687  d = process.dumpPython()
3688  equalD ="""parentProcess = process
3689 process.a = cms.EDProducer("A")
3690 process.Foo = cms.Service("Foo")
3691 process.p = cms.Path(process.a)
3692 childProcess = process
3693 process = parentProcess
3694 process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = cms.untracked.PSet(
3695 ), outputCommands = cms.untracked.vstring()))"""
3696  equalD = equalD.replace("parentProcess","parentProcess"+str(hash(process.subProcesses_()[0])))
3697  # SubProcesses are dumped before Services, so in order to
3698  # craft the dump of the Parent and Child manually the dump
3699  # of the Parent needs to be split at the MessageLogger
3700  # boundary (now when it is part of Process by default),
3701  # and insert the dump of the Child between the top part of
3702  # the Parent (before MessageLogger) and the bottom part of
3703  # the Parent (after and including MessageLogger)
3704  messageLoggerSplit = 'process.MessageLogger = cms.Service'
3705  parentDumpSplit = Process('Parent').dumpPython().split(messageLoggerSplit)
3706  childProcess = Process('Child')
3707  del childProcess.MessageLogger
3708  combinedDump = parentDumpSplit[0] + childProcess.dumpPython() + messageLoggerSplit + parentDumpSplit[1]
3709  self.assertEqual(_lineDiff(d, combinedDump), equalD)
3710  p = TestMakePSet()
3711  process.fillProcessDesc(p)
3712  self.assertEqual((True,['a']),p.values["subProcesses"][1][0].values["process"][1].values['@all_modules'])
3713  self.assertEqual((True,['p']),p.values["subProcesses"][1][0].values["process"][1].values['@paths'])
3714  self.assertEqual({'@service_type':(True,'Foo')}, p.values["subProcesses"][1][0].values["process"][1].values["services"][1][0].values)
3715  def testRefToPSet(self):
3716  proc = Process("test")
3717  proc.top = PSet(a = int32(1))
3718  proc.ref = PSet(refToPSet_ = string("top"))
3719  proc.ref2 = PSet( a = int32(1), b = PSet( refToPSet_ = string("top")))
3720  proc.ref3 = PSet(refToPSet_ = string("ref"))
3721  proc.ref4 = VPSet(PSet(refToPSet_ = string("top")),
3722  PSet(refToPSet_ = string("ref2")))
3723  p = TestMakePSet()
3724  proc.fillProcessDesc(p)
3725  self.assertEqual((True,1),p.values["ref"][1].values["a"])
3726  self.assertEqual((True,1),p.values["ref3"][1].values["a"])
3727  self.assertEqual((True,1),p.values["ref2"][1].values["a"])
3728  self.assertEqual((True,1),p.values["ref2"][1].values["b"][1].values["a"])
3729  self.assertEqual((True,1),p.values["ref4"][1][0].values["a"])
3730  self.assertEqual((True,1),p.values["ref4"][1][1].values["a"])
3732  proc = Process("test")
3733  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
3734  a = int32(1),
3735  b = PSet(c = int32(2))),
3736  test1 = EDProducer("Bar",
3737  aa = int32(11),
3738  bb = PSet(cc = int32(12))))
3739  self.assertEqual(proc.sp.label_(), "sp")
3740  self.assertEqual(proc.sp.test1.label_(), "sp@test1")
3741  self.assertEqual(proc.sp.test2.label_(), "sp@test2")
3742 
3743  proc.a = EDProducer("A")
3744  proc.s = Sequence(proc.a + proc.sp)
3745  proc.t = Task(proc.a, proc.sp)
3746  proc.p = Path()
3747  proc.p.associate(proc.t)
3748  p = TestMakePSet()
3749  proc.fillProcessDesc(p)
3750  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
3751  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
3752  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
3753  all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"])
3754  all_cases[1].sort() # names of all cases come via dict, i.e. their order is undefined
3755  self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases)
3756  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3757  self.assertEqual(["a", "sp", "sp@test1", "sp@test2"], p.values["@all_modules"][1])
3758  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
3759  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["@module_type"])
3760  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
3761  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
3762  dump = proc.dumpPython()
3763  self.assertEqual(dump.find('@'), -1)
3764  self.assertEqual(specialImportRegistry.getSpecialImports(), ["from test import SwitchProducerTest"])
3765  self.assertTrue(dump.find("\nfrom test import SwitchProducerTest\n") != -1)
3766 
3767  # EDAlias as non-chosen case
3768  proc = Process("test")
3769  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
3770  a = int32(1),
3771  b = PSet(c = int32(2))),
3772  test1 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
3773  proc.a = EDProducer("A")
3774  proc.s = Sequence(proc.a + proc.sp)
3775  proc.t = Task(proc.a, proc.sp)
3776  proc.p = Path()
3777  proc.p.associate(proc.t)
3778  p = TestMakePSet()
3779  proc.fillProcessDesc(p)
3780  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
3781  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
3782  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
3783  all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"])
3784  all_cases[1].sort()
3785  self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases)
3786  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3787  self.assertEqual(["a", "sp", "sp@test2"], p.values["@all_modules"][1])
3788  self.assertEqual(["sp@test1"], p.values["@all_aliases"][1])
3789  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
3790  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
3791  self.assertEqual((True,"EDAlias"), p.values["sp@test1"][1].values["@module_edm_type"])
3792  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["a"][1][0].values["type"])
3793 
3794  # EDAlias as chosen case
3795  proc = Process("test")
3796  proc.sp = SwitchProducerTest(test1 = EDProducer("Foo",
3797  a = int32(1),
3798  b = PSet(c = int32(2))),
3799  test2 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
3800  proc.a = EDProducer("A")
3801  proc.s = Sequence(proc.a + proc.sp)
3802  proc.t = Task(proc.a, proc.sp)
3803  proc.p = Path()
3804  proc.p.associate(proc.t)
3805  p = TestMakePSet()
3806  proc.fillProcessDesc(p)
3807  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
3808  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
3809  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
3810  self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"])
3811  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3812  self.assertEqual(["a", "sp", "sp@test1"], p.values["@all_modules"][1])
3813  self.assertEqual(["sp@test2"], p.values["@all_aliases"][1])
3814  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
3815  self.assertEqual((True,"Foo"), p.values["sp@test1"][1].values["@module_type"])
3816  self.assertEqual((True,"EDAlias"), p.values["sp@test2"][1].values["@module_edm_type"])
3817  self.assertEqual((True,"Bar"), p.values["sp@test2"][1].values["a"][1][0].values["type"])
3818 
3819  # ConditionalTask
3820  proc = Process("test")
3821  proc.spct = SwitchProducerTest(test2 = EDProducer("Foo",
3822  a = int32(1),
3823  b = PSet(c = int32(2))),
3824  test1 = EDProducer("Bar",
3825  aa = int32(11),
3826  bb = PSet(cc = int32(12))),
3827  test3 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
3828  proc.spp = proc.spct.clone()
3829  proc.a = EDProducer("A")
3830  proc.ct = ConditionalTask(proc.spct)
3831  proc.p = Path(proc.a, proc.ct)
3832  proc.pp = Path(proc.a + proc.spp)
3833  p = TestMakePSet()
3834  proc.fillProcessDesc(p)
3835  self.assertEqual(["a", "spct", "spct@test1", "spct@test2", "spp", "spp@test1", "spp@test2"], p.values["@all_modules"][1])
3836  self.assertEqual(["a", "#", "spct", "spct@test1", "spct@test2", "@"], p.values["p"][1])
3837  self.assertEqual(["a", "spp", "#", "spp@test1", "spp@test2", "@"], p.values["pp"][1])
3838 
3839  def testPrune(self):
3840  p = Process("test")
3841  p.a = EDAnalyzer("MyAnalyzer")
3842  p.b = EDAnalyzer("YourAnalyzer")
3843  p.c = EDAnalyzer("OurAnalyzer")
3844  p.d = EDAnalyzer("OurAnalyzer")
3845  p.e = EDProducer("MyProducer")
3846  p.f = EDProducer("YourProducer")
3847  p.g = EDProducer("TheirProducer")
3848  p.h = EDProducer("OnesProducer")
3849  p.s = Sequence(p.d)
3850  p.t1 = Task(p.e)
3851  p.t2 = Task(p.f)
3852  p.t3 = Task(p.g, p.t1)
3853  p.ct1 = ConditionalTask(p.h)
3854  p.ct2 = ConditionalTask(p.f)
3855  p.ct3 = ConditionalTask(p.ct1)
3856  p.path1 = Path(p.a, p.t3, p.ct3)
3857  p.path2 = Path(p.b)
3858  self.assertTrue(p.schedule is None)
3859  pths = p.paths
3860  keys = pths.keys()
3861  self.assertEqual(pths[keys[0]],p.path1)
3862  self.assertEqual(pths[keys[1]],p.path2)
3863  p.pset1 = PSet(parA = string("pset1"))
3864  p.pset2 = untracked.PSet(parA = string("pset2"))
3865  p.vpset1 = VPSet()
3866  p.vpset2 = untracked.VPSet()
3867  p.prune()
3868  self.assertTrue(hasattr(p, 'a'))
3869  self.assertTrue(hasattr(p, 'b'))
3870  self.assertTrue(not hasattr(p, 'c'))
3871  self.assertTrue(not hasattr(p, 'd'))
3872  self.assertTrue(hasattr(p, 'e'))
3873  self.assertTrue(not hasattr(p, 'f'))
3874  self.assertTrue(hasattr(p, 'g'))
3875  self.assertTrue(hasattr(p, 'h'))
3876  self.assertTrue(not hasattr(p, 's'))
3877  self.assertTrue(hasattr(p, 't1'))
3878  self.assertTrue(not hasattr(p, 't2'))
3879  self.assertTrue(hasattr(p, 't3'))
3880  self.assertTrue(hasattr(p, 'path1'))
3881  self.assertTrue(hasattr(p, 'path2'))
3882 # self.assertTrue(not hasattr(p, 'pset1'))
3883 # self.assertTrue(hasattr(p, 'pset2'))
3884 # self.assertTrue(not hasattr(p, 'vpset1'))
3885 # self.assertTrue(not hasattr(p, 'vpset2'))
3886 
3887  p = Process("test")
3888  p.a = EDAnalyzer("MyAnalyzer")
3889  p.b = EDAnalyzer("YourAnalyzer")
3890  p.c = EDAnalyzer("OurAnalyzer")
3891  p.d = EDAnalyzer("OurAnalyzer")
3892  p.e = EDAnalyzer("OurAnalyzer")
3893  p.f = EDProducer("MyProducer")
3894  p.g = EDProducer("YourProducer")
3895  p.h = EDProducer("TheirProducer")
3896  p.i = EDProducer("OurProducer")
3897  p.j = EDProducer("OurProducer")
3898  p.k = EDProducer("OurProducer")
3899  p.l = EDProducer("OurProducer")
3900  p.t1 = Task(p.f)
3901  p.t2 = Task(p.g)
3902  p.t3 = Task(p.h)
3903  p.t4 = Task(p.i)
3904  p.ct1 = Task(p.f)
3905  p.ct2 = Task(p.j)
3906  p.ct3 = Task(p.k)
3907  p.ct4 = Task(p.l)
3908  p.s = Sequence(p.d, p.t1, p.ct1)
3909  p.s2 = Sequence(p.b, p.t2, p.ct2)
3910  p.s3 = Sequence(p.e)
3911  p.path1 = Path(p.a, p.t3, p.ct3)
3912  p.path2 = Path(p.b)
3913  p.path3 = Path(p.b+p.s2)
3914  p.path4 = Path(p.b+p.s3)
3915  p.schedule = Schedule(p.path1,p.path2,p.path3)
3916  p.schedule.associate(p.t4)
3917  pths = p.paths
3918  keys = pths.keys()
3919  self.assertEqual(pths[keys[0]],p.path1)
3920  self.assertEqual(pths[keys[1]],p.path2)
3921  p.prune()
3922  self.assertTrue(hasattr(p, 'a'))
3923  self.assertTrue(hasattr(p, 'b'))
3924  self.assertTrue(not hasattr(p, 'c'))
3925  self.assertTrue(not hasattr(p, 'd'))
3926  self.assertTrue(not hasattr(p, 'e'))
3927  self.assertTrue(not hasattr(p, 'f'))
3928  self.assertTrue(hasattr(p, 'g'))
3929  self.assertTrue(hasattr(p, 'h'))
3930  self.assertTrue(hasattr(p, 'i'))
3931  self.assertTrue(hasattr(p, 'j'))
3932  self.assertTrue(hasattr(p, 'k'))
3933  self.assertTrue(not hasattr(p, 'l'))
3934  self.assertTrue(not hasattr(p, 't1'))
3935  self.assertTrue(hasattr(p, 't2'))
3936  self.assertTrue(hasattr(p, 't3'))
3937  self.assertTrue(hasattr(p, 't4'))
3938  self.assertTrue(not hasattr(p, 'ct1'))
3939  self.assertTrue(hasattr(p, 'ct2'))
3940  self.assertTrue(hasattr(p, 'ct3'))
3941  self.assertTrue(not hasattr(p, 'ct4'))
3942  self.assertTrue(not hasattr(p, 's'))
3943  self.assertTrue(hasattr(p, 's2'))
3944  self.assertTrue(not hasattr(p, 's3'))
3945  self.assertTrue(hasattr(p, 'path1'))
3946  self.assertTrue(hasattr(p, 'path2'))
3947  self.assertTrue(hasattr(p, 'path3'))
3948  self.assertTrue(not hasattr(p, 'path4'))
3949  #test SequencePlaceholder
3950  p = Process("test")
3951  p.a = EDAnalyzer("MyAnalyzer")
3952  p.b = EDAnalyzer("YourAnalyzer")
3953  p.s = Sequence(SequencePlaceholder("a")+p.b)
3954  p.pth = Path(p.s)
3955  p.prune()
3956  self.assertTrue(hasattr(p, 'a'))
3957  self.assertTrue(hasattr(p, 'b'))
3958  self.assertTrue(hasattr(p, 's'))
3959  self.assertTrue(hasattr(p, 'pth'))
3960  #test unresolved SequencePlaceholder
3961  p = Process("test")
3962  p.b = EDAnalyzer("YourAnalyzer")
3963  p.s = Sequence(SequencePlaceholder("a")+p.b)
3964  p.pth = Path(p.s)
3965  p.prune(keepUnresolvedSequencePlaceholders=True)
3966  self.assertTrue(hasattr(p, 'b'))
3967  self.assertTrue(hasattr(p, 's'))
3968  self.assertTrue(hasattr(p, 'pth'))
3969  self.assertEqual(p.s.dumpPython(),'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
3970  #test TaskPlaceholder
3971  p = Process("test")
3972  p.a = EDProducer("MyProducer")
3973  p.b = EDProducer("YourProducer")
3974  p.s = Task(TaskPlaceholder("a"),p.b)
3975  p.pth = Path(p.s)
3976  p.prune()
3977  self.assertTrue(hasattr(p, 'a'))
3978  self.assertTrue(hasattr(p, 'b'))
3979  self.assertTrue(hasattr(p, 's'))
3980  self.assertTrue(hasattr(p, 'pth'))
3981  #test ConditionalTaskPlaceholder
3982  p = Process("test")
3983  p.a = EDProducer("MyProducer")
3984  p.b = EDProducer("YourProducer")
3986  p.pth = Path(p.s)
3987  p.prune()
3988  self.assertTrue(hasattr(p, 'a'))
3989  self.assertTrue(hasattr(p, 'b'))
3990  self.assertTrue(hasattr(p, 's'))
3991  self.assertTrue(hasattr(p, 'pth'))
3992  #test unresolved SequencePlaceholder
3993  p = Process("test")
3994  p.b = EDProducer("YourAnalyzer")
3995  p.s = Task(TaskPlaceholder("a"),p.b)
3996  p.pth = Path(p.s)
3997  p.prune(keepUnresolvedSequencePlaceholders=True)
3998  self.assertTrue(hasattr(p, 'b'))
3999  self.assertTrue(hasattr(p, 's'))
4000  self.assertTrue(hasattr(p, 'pth'))
4001  self.assertEqual(p.s.dumpPython(),'cms.Task(cms.TaskPlaceholder("a"), process.b)\n')
4003  p = Process("test")
4004  p.a = EDProducer("ma")
4005  p.b = EDAnalyzer("mb")
4006  p.t1 = Task(TaskPlaceholder("c"))
4007  p.t2 = Task(p.a, TaskPlaceholder("d"), p.t1)
4008  p.t3 = Task(TaskPlaceholder("e"))
4009  p.path1 = Path(p.b, p.t2, p.t3)
4010  p.t5 = Task(p.a, TaskPlaceholder("g"), TaskPlaceholder("t4"))
4011  p.t4 = Task(TaskPlaceholder("f"))
4012  p.endpath1 = EndPath(p.b, p.t5)
4013  p.t6 = Task(TaskPlaceholder("h"))
4014  p.t7 = Task(p.a, TaskPlaceholder("i"), p.t6)
4015  p.t8 = Task(TaskPlaceholder("j"))
4016  p.schedule = Schedule(p.path1, p.endpath1,tasks=[p.t7,p.t8])
4017  p.c = EDProducer("mc")
4018  p.d = EDProducer("md")
4019  p.e = EDProducer("me")
4020  p.f = EDProducer("mf")
4021  p.g = EDProducer("mg")
4022  p.h = EDProducer("mh")
4023  p.i = EDProducer("mi")
4024  p.j = EDProducer("mj")
4025  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4026 """process.a = cms.EDProducer("ma")
4027 process.c = cms.EDProducer("mc")
4028 process.d = cms.EDProducer("md")
4029 process.e = cms.EDProducer("me")
4030 process.f = cms.EDProducer("mf")
4031 process.g = cms.EDProducer("mg")
4032 process.h = cms.EDProducer("mh")
4033 process.i = cms.EDProducer("mi")
4034 process.j = cms.EDProducer("mj")
4035 process.b = cms.EDAnalyzer("mb")
4036 process.t1 = cms.Task(cms.TaskPlaceholder("c"))
4037 process.t2 = cms.Task(cms.TaskPlaceholder("d"), process.a, process.t1)
4038 process.t3 = cms.Task(cms.TaskPlaceholder("e"))
4039 process.t5 = cms.Task(cms.TaskPlaceholder("g"), cms.TaskPlaceholder("t4"), process.a)
4040 process.t4 = cms.Task(cms.TaskPlaceholder("f"))
4041 process.t6 = cms.Task(cms.TaskPlaceholder("h"))
4042 process.t7 = cms.Task(cms.TaskPlaceholder("i"), process.a, process.t6)
4043 process.t8 = cms.Task(cms.TaskPlaceholder("j"))
4044 process.path1 = cms.Path(process.b, process.t2, process.t3)
4045 process.endpath1 = cms.EndPath(process.b, process.t5)
4046 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
4047  p.resolve()
4048  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4049 """process.a = cms.EDProducer("ma")
4050 process.c = cms.EDProducer("mc")
4051 process.d = cms.EDProducer("md")
4052 process.e = cms.EDProducer("me")
4053 process.f = cms.EDProducer("mf")
4054 process.g = cms.EDProducer("mg")
4055 process.h = cms.EDProducer("mh")
4056 process.i = cms.EDProducer("mi")
4057 process.j = cms.EDProducer("mj")
4058 process.b = cms.EDAnalyzer("mb")
4059 process.t1 = cms.Task(process.c)
4060 process.t2 = cms.Task(process.a, process.d, process.t1)
4061 process.t3 = cms.Task(process.e)
4062 process.t4 = cms.Task(process.f)
4063 process.t6 = cms.Task(process.h)
4064 process.t7 = cms.Task(process.a, process.i, process.t6)
4065 process.t8 = cms.Task(process.j)
4066 process.t5 = cms.Task(process.a, process.g, process.t4)
4067 process.path1 = cms.Path(process.b, process.t2, process.t3)
4068 process.endpath1 = cms.EndPath(process.b, process.t5)
4069 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
4071  p = Process("test")
4072  p.a = EDProducer("ma")
4073  p.b = EDAnalyzer("mb")
4075  p.t2 = ConditionalTask(p.a, ConditionalTaskPlaceholder("d"), p.t1)
4077  p.path1 = Path(p.b, p.t2, p.t3)
4080  p.path2 = Path(p.b, p.t5)
4081  p.schedule = Schedule(p.path1, p.path2)
4082  p.c = EDProducer("mc")
4083  p.d = EDProducer("md")
4084  p.e = EDProducer("me")
4085  p.f = EDProducer("mf")
4086  p.g = EDProducer("mg")
4087  p.h = EDProducer("mh")
4088  p.i = EDProducer("mi")
4089  p.j = EDProducer("mj")
4090  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4091 """process.a = cms.EDProducer("ma")
4092 process.c = cms.EDProducer("mc")
4093 process.d = cms.EDProducer("md")
4094 process.e = cms.EDProducer("me")
4095 process.f = cms.EDProducer("mf")
4096 process.g = cms.EDProducer("mg")
4097 process.h = cms.EDProducer("mh")
4098 process.i = cms.EDProducer("mi")
4099 process.j = cms.EDProducer("mj")
4100 process.b = cms.EDAnalyzer("mb")
4101 process.t1 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("c"))
4102 process.t2 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("d"), process.a, process.t1)
4103 process.t3 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("e"))
4104 process.t5 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("g"), cms.ConditionalTaskPlaceholder("t4"), process.a)
4105 process.t4 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("f"))
4106 process.path1 = cms.Path(process.b, process.t2, process.t3)
4107 process.path2 = cms.Path(process.b, process.t5)
4108 process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""")
4109  p.resolve()
4110  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4111 """process.a = cms.EDProducer("ma")
4112 process.c = cms.EDProducer("mc")
4113 process.d = cms.EDProducer("md")
4114 process.e = cms.EDProducer("me")
4115 process.f = cms.EDProducer("mf")
4116 process.g = cms.EDProducer("mg")
4117 process.h = cms.EDProducer("mh")
4118 process.i = cms.EDProducer("mi")
4119 process.j = cms.EDProducer("mj")
4120 process.b = cms.EDAnalyzer("mb")
4121 process.t1 = cms.ConditionalTask(process.c)
4122 process.t2 = cms.ConditionalTask(process.a, process.d, process.t1)
4123 process.t3 = cms.ConditionalTask(process.e)
4124 process.t4 = cms.ConditionalTask(process.f)
4125 process.t5 = cms.ConditionalTask(process.a, process.g, process.t4)
4126 process.path1 = cms.Path(process.b, process.t2, process.t3)
4127 process.path2 = cms.Path(process.b, process.t5)
4128 process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""")
4129 
4130  def testDelete(self):
4131  p = Process("test")
4132  p.a = EDAnalyzer("MyAnalyzer")
4133  p.b = EDAnalyzer("YourAnalyzer")
4134  p.c = EDAnalyzer("OurAnalyzer")
4135  p.d = EDAnalyzer("OurAnalyzer")
4136  p.e = EDAnalyzer("OurAnalyzer")
4137  p.f = EDAnalyzer("OurAnalyzer")
4138  p.g = EDProducer("OurProducer")
4139  p.h = EDProducer("YourProducer")
4140  p.i = SwitchProducerTest(
4141  test1 = EDProducer("OneProducer"),
4142  test2 = EDProducer("TwoProducer")
4143  )
4144  p.t1 = Task(p.g, p.h, p.i)
4145  t2 = Task(p.g, p.h, p.i)
4146  t3 = Task(p.g, p.h)
4147  p.t4 = Task(p.h)
4148  p.ct1 = ConditionalTask(p.g, p.h, p.i)
4149  ct2 = ConditionalTask(p.g, p.h)
4150  ct3 = ConditionalTask(p.g, p.h)
4151  p.ct4 = ConditionalTask(p.h)
4152  p.s = Sequence(p.d+p.e)
4153  p.path1 = Path(p.a+p.f+p.s,t2,ct2)
4154  p.path2 = Path(p.a)
4155  p.path3 = Path(ct3, p.ct4)
4156  p.endpath2 = EndPath(p.b)
4157  p.endpath1 = EndPath(p.b+p.f)
4158  p.schedule = Schedule(p.path2, p.path3, p.endpath2, tasks=[t3, p.t4])
4159  self.assertTrue(hasattr(p, 'f'))
4160  self.assertTrue(hasattr(p, 'g'))
4161  self.assertTrue(hasattr(p, 'i'))
4162  del p.e
4163  del p.f
4164  del p.g
4165  del p.i
4166  self.assertFalse(hasattr(p, 'f'))
4167  self.assertFalse(hasattr(p, 'g'))
4168  self.assertEqual(p.t1.dumpPython(), 'cms.Task(process.h)\n')
4169  self.assertEqual(p.ct1.dumpPython(), 'cms.ConditionalTask(process.h)\n')
4170  self.assertEqual(p.s.dumpPython(), 'cms.Sequence(process.d)\n')
4171  self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+process.s, cms.ConditionalTask(process.h), cms.Task(process.h))\n')
4172  self.assertEqual(p.endpath1.dumpPython(), 'cms.EndPath(process.b)\n')
4173  self.assertEqual(p.path3.dumpPython(), 'cms.Path(cms.ConditionalTask(process.h), process.ct4)\n')
4174  del p.s
4175  self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+(process.d), cms.ConditionalTask(process.h), cms.Task(process.h))\n')
4176  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path2, process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4177  del p.path2
4178  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4179  del p.path3
4180  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4181  del p.endpath2
4182  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(tasks=[cms.Task(process.h), process.t4])\n')
4183  del p.t4
4184  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(tasks=[cms.Task(process.h)])\n')
4185  def testModifier(self):
4186  m1 = Modifier()
4187  Process._firstProcess = True
4188  p = Process("test")
4189  self.assertRaises(RuntimeError, lambda: Process("test2", m1))
4190  m1 = Modifier()
4191  Process._firstProcess = True
4192  p = Process("test",m1)
4193  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4194  def _mod_fred(obj):
4195  obj.fred = 2
4196  m1.toModify(p.a,_mod_fred)
4197  self.assertEqual(p.a.fred.value(),2)
4198  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
4199  m1.toModify(p.b, wilma = 2)
4200  self.assertEqual(p.b.wilma.value(),2)
4201  self.assertTrue(p.isUsingModifier(m1))
4202  #check that Modifier not attached to a process doesn't run
4203  m1 = Modifier()
4204  Process._firstProcess = True
4205  p = Process("test")
4206  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4207  m1.toModify(p.a,_mod_fred)
4208  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
4209  m1.toModify(p.b, wilma = 2)
4210  self.assertEqual(p.a.fred.value(),1)
4211  self.assertEqual(p.b.wilma.value(),1)
4212  self.assertEqual(p.isUsingModifier(m1),False)
4213  #make sure clones get the changes
4214  m1 = Modifier()
4215  Process._firstProcess = True
4216  p = Process("test",m1)
4217  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4218  m1.toModify(p.a, fred = int32(2))
4219  p.b = p.a.clone(wilma = int32(3))
4220  self.assertEqual(p.a.fred.value(),2)
4221  self.assertEqual(p.a.wilma.value(),1)
4222  self.assertEqual(p.b.fred.value(),2)
4223  self.assertEqual(p.b.wilma.value(),3)
4224  #test removal of parameter
4225  m1 = Modifier()
4226  Process._firstProcess = True
4227  p = Process("test",m1)
4228  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1), fintstones = PSet(fred = int32(1)))
4229  m1.toModify(p.a, fred = None, fintstones = dict(fred = None))
4230  self.assertEqual(hasattr(p.a, "fred"), False)
4231  self.assertEqual(hasattr(p.a.fintstones, "fred"), False)
4232  self.assertEqual(p.a.wilma.value(),1)
4233  #test adding a parameter
4234  m1 = Modifier()
4235  Process._firstProcess = True
4236  p = Process("test",m1)
4237  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4238  m1.toModify(p.a, wilma = int32(2))
4239  self.assertEqual(p.a.fred.value(), 1)
4240  self.assertEqual(p.a.wilma.value(),2)
4241  #test setting of value in PSet
4242  m1 = Modifier()
4243  Process._firstProcess = True
4244  p = Process("test",m1)
4245  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = int32(1), wilma = int32(1)))
4246  m1.toModify(p.a, flintstones = dict(fred = int32(2)))
4247  self.assertEqual(p.a.flintstones.fred.value(),2)
4248  self.assertEqual(p.a.flintstones.wilma.value(),1)
4249  #test proper exception from nonexisting parameter name
4250  m1 = Modifier()
4251  Process._firstProcess = True
4252  p = Process("test",m1)
4253  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = PSet(wilma = int32(1))))
4254  self.assertRaises(KeyError, lambda: m1.toModify(p.a, flintstones = dict(imnothere = dict(wilma=2))))
4255  self.assertRaises(KeyError, lambda: m1.toModify(p.a, foo = 1))
4256  #test setting a value in a VPSet
4257  m1 = Modifier()
4258  Process._firstProcess = True
4259  p = Process("test",m1)
4260  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
4261  m1.toModify(p.a, flintstones = {1:dict(wilma = int32(2))})
4262  self.assertEqual(p.a.flintstones[0].fred.value(),1)
4263  self.assertEqual(p.a.flintstones[1].wilma.value(),2)
4264  #test setting a value in a list of values
4265  m1 = Modifier()
4266  Process._firstProcess = True
4267  p = Process("test",m1)
4268  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
4269  m1.toModify(p.a, fred = {1:7})
4270  self.assertEqual(p.a.fred[0],1)
4271  self.assertEqual(p.a.fred[1],7)
4272  self.assertEqual(p.a.fred[2],3)
4273  #test IndexError setting a value in a list to an item key not in the list
4274  m1 = Modifier()
4275  Process._firstProcess = True
4276  p = Process("test",m1)
4277  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
4278  raised = False
4279  try: m1.toModify(p.a, fred = {5:7})
4280  except IndexError as e: raised = True
4281  self.assertEqual(raised, True)
4282  #test TypeError setting a value in a list using a key that is not an int
4283  m1 = Modifier()
4284  Process._firstProcess = True
4285  p = Process("test",m1)
4286  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
4287  raised = False
4288  try: m1.toModify(p.a, flintstones = dict(bogus = int32(37)))
4289  except TypeError as e: raised = True
4290  self.assertEqual(raised, True)
4291  #test that load causes process wide methods to run
4292  def _rem_a(proc):
4293  del proc.a
4294  class ProcModifierMod(object):
4295  def __init__(self,modifier,func):
4296  self.proc_mod_ = modifier.makeProcessModifier(func)
4297  class DummyMod(object):
4298  def __init__(self):
4299  self.a = EDAnalyzer("Dummy")
4300  testMod = DummyMod()
4301  p.extend(testMod)
4302  self.assertTrue(hasattr(p,"a"))
4303  m1 = Modifier()
4304  Process._firstProcess = True
4305  p = Process("test",m1)
4306  testProcMod = ProcModifierMod(m1,_rem_a)
4307  p.extend(testMod)
4308  p.extend(testProcMod)
4309  self.assertTrue(not hasattr(p,"a"))
4310  #test ModifierChain
4311  m1 = Modifier()
4312  mc = ModifierChain(m1)
4313  Process._firstProcess = True
4314  p = Process("test",mc)
4315  self.assertTrue(p.isUsingModifier(m1))
4316  self.assertTrue(p.isUsingModifier(mc))
4317  testMod = DummyMod()
4318  p.b = EDAnalyzer("Dummy2", fred = int32(1))
4319  m1.toModify(p.b, fred = int32(3))
4320  p.extend(testMod)
4321  testProcMod = ProcModifierMod(m1,_rem_a)
4322  p.extend(testProcMod)
4323  self.assertTrue(not hasattr(p,"a"))
4324  self.assertEqual(p.b.fred.value(),3)
4325  #check cloneAndExclude
4326  m1 = Modifier()
4327  m2 = Modifier()
4328  mc = ModifierChain(m1,m2)
4329  mclone = mc.copyAndExclude([m2])
4330  self.assertTrue(not mclone._isOrContains(m2))
4331  self.assertTrue(mclone._isOrContains(m1))
4332  m3 = Modifier()
4333  mc2 = ModifierChain(mc,m3)
4334  mclone = mc2.copyAndExclude([m2])
4335  self.assertTrue(not mclone._isOrContains(m2))
4336  self.assertTrue(mclone._isOrContains(m1))
4337  self.assertTrue(mclone._isOrContains(m3))
4338  #check combining
4339  m1 = Modifier()
4340  m2 = Modifier()
4341  Process._firstProcess = True
4342  p = Process("test",m1)
4343  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4344  (m1 & m2).toModify(p.a, fred = int32(2))
4345  self.assertRaises(TypeError, lambda: (m1 & m2).toModify(p.a, 1, wilma=2))
4346  self.assertEqual(p.a.fred, 1)
4347  m1 = Modifier()
4348  m2 = Modifier()
4349  Process._firstProcess = True
4350  p = Process("test",m1,m2)
4351  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4352  (m1 & m2).toModify(p.a, fred = int32(2))
4353  self.assertEqual(p.a.fred, 2)
4354  m1 = Modifier()
4355  m2 = Modifier()
4356  m3 = Modifier()
4357  Process._firstProcess = True
4358  p = Process("test",m1,m2,m3)
4359  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4360  (m1 & m2 & m3).toModify(p.a, fred = int32(2))
4361  self.assertEqual(p.a.fred, 2)
4362  (m1 & (m2 & m3)).toModify(p.a, fred = int32(3))
4363  self.assertEqual(p.a.fred, 3)
4364  ((m1 & m2) & m3).toModify(p.a, fred = int32(4))
4365  self.assertEqual(p.a.fred, 4)
4366  #check inverse
4367  m1 = Modifier()
4368  m2 = Modifier()
4369  Process._firstProcess = True
4370  p = Process("test", m1)
4371  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4372  (~m1).toModify(p.a, fred=2)
4373  self.assertEqual(p.a.fred, 1)
4374  (~m2).toModify(p.a, wilma=2)
4375  self.assertEqual(p.a.wilma, 2)
4376  self.assertRaises(TypeError, lambda: (~m1).toModify(p.a, 1, wilma=2))
4377  self.assertRaises(TypeError, lambda: (~m2).toModify(p.a, 1, wilma=2))
4378  # check or
4379  m1 = Modifier()
4380  m2 = Modifier()
4381  m3 = Modifier()
4382  Process._firstProcess = True
4383  p = Process("test", m1)
4384  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4385  (m1 | m2).toModify(p.a, fred=2)
4386  self.assertEqual(p.a.fred, 2)
4387  (m1 | m2 | m3).toModify(p.a, fred=3)
4388  self.assertEqual(p.a.fred, 3)
4389  (m3 | m2 | m1).toModify(p.a, fred=4)
4390  self.assertEqual(p.a.fred, 4)
4391  ((m1 | m2) | m3).toModify(p.a, fred=5)
4392  self.assertEqual(p.a.fred, 5)
4393  (m1 | (m2 | m3)).toModify(p.a, fred=6)
4394  self.assertEqual(p.a.fred, 6)
4395  (m2 | m3).toModify(p.a, fred=7)
4396  self.assertEqual(p.a.fred, 6)
4397  self.assertRaises(TypeError, lambda: (m1 | m2).toModify(p.a, 1, wilma=2))
4398  self.assertRaises(TypeError, lambda: (m2 | m3).toModify(p.a, 1, wilma=2))
4399  # check combinations
4400  m1 = Modifier()
4401  m2 = Modifier()
4402  m3 = Modifier()
4403  m4 = Modifier()
4404  Process._firstProcess = True
4405  p = Process("test", m1, m2)
4406  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4407  (m1 & ~m2).toModify(p.a, fred=2)
4408  self.assertEqual(p.a.fred, 1)
4409  (m1 & ~m3).toModify(p.a, fred=2)
4410  self.assertEqual(p.a.fred, 2)
4411  (m1 | ~m2).toModify(p.a, fred=3)
4412  self.assertEqual(p.a.fred, 3)
4413  (~m1 | ~m2).toModify(p.a, fred=4)
4414  self.assertEqual(p.a.fred, 3)
4415  (~m3 & ~m4).toModify(p.a, fred=4)
4416  self.assertEqual(p.a.fred, 4)
4417  ((m1 & m3) | ~m4).toModify(p.a, fred=5)
4418  self.assertEqual(p.a.fred, 5)
4419  #check toReplaceWith
4420  m1 = Modifier()
4421  Process._firstProcess = True
4422  p = Process("test",m1)
4423  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
4424  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
4425  self.assertRaises(TypeError, lambda: m1.toReplaceWith(p.a, EDProducer("YourProducer")))
4426  #Task
4427  p.b =EDAnalyzer("BAn")
4428  p.c =EDProducer("c")
4429  p.d =EDProducer("d")
4430  p.tc = Task(p.c)
4431  p.td = Task(p.d)
4432  p.s = Sequence(p.a, p.tc)
4433  m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td))
4434  self.assertEqual(p.a.wilma.value(),3)
4435  self.assertEqual(p.a.type_(),"YourAnalyzer")
4436  self.assertEqual(hasattr(p,"fred"),False)
4437  self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n")
4438  p.e =EDProducer("e")
4439  m1.toReplaceWith(p.td, Task(p.e))
4440  self.assertTrue(p.td._collection == OrderedSet([p.e]))
4441  #ConditionalTask
4442  p.b =EDAnalyzer("BAn")
4443  p.c =EDProducer("c")
4444  p.d =EDProducer("d")
4445  del p.tc
4446  del p.td
4447  p.tc = ConditionalTask(p.c)
4448  p.td = ConditionalTask(p.d)
4449  p.s = Sequence(p.a, p.tc)
4450  m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td))
4451  self.assertEqual(p.a.wilma.value(),3)
4452  self.assertEqual(p.a.type_(),"YourAnalyzer")
4453  self.assertEqual(hasattr(p,"fred"),False)
4454  self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n")
4455  p.e =EDProducer("e")
4456  m1.toReplaceWith(p.td, ConditionalTask(p.e))
4457  self.assertTrue(p.td._collection == OrderedSet([p.e]))
4458  #check toReplaceWith doesn't activate not chosen
4459  m1 = Modifier()
4460  Process._firstProcess = True
4461  p = Process("test")
4462  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
4463  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
4464  self.assertEqual(p.a.type_(),"MyAnalyzer")
4465  #check toReplaceWith and and/not/or combinations
4466  m1 = Modifier()
4467  m2 = Modifier()
4468  m3 = Modifier()
4469  m4 = Modifier()
4470  Process._firstProcess = True
4471  p = Process("test", m1, m2)
4472  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4473  self.assertRaises(TypeError, lambda: (m1 & m2).toReplaceWith(p.a, EDProducer("YourProducer")))
4474  self.assertRaises(TypeError, lambda: (m3 & m4).toReplaceWith(p.a, EDProducer("YourProducer")))
4475  self.assertRaises(TypeError, lambda: (~m3).toReplaceWith(p.a, EDProducer("YourProducer")))
4476  self.assertRaises(TypeError, lambda: (~m1).toReplaceWith(p.a, EDProducer("YourProducer")))
4477  self.assertRaises(TypeError, lambda: (m1 | m3).toReplaceWith(p.a, EDProducer("YourProducer")))
4478  self.assertRaises(TypeError, lambda: (m3 | m4).toReplaceWith(p.a, EDProducer("YourProducer")))
4479  (m1 & m2).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer1"))
4480  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4481  (m1 & m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4482  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4483  (~m1).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4484  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4485  (~m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4486  self.assertEqual(p.a.type_(), "YourAnalyzer2")
4487  (m1 | m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer3"))
4488  self.assertEqual(p.a.type_(), "YourAnalyzer3")
4489  (m3 | m4).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer4"))
4490  self.assertEqual(p.a.type_(), "YourAnalyzer3")
4491  #check chaining of toModify and toReplaceWith
4492  m1 = Modifier()
4493  m2 = Modifier()
4494  m3 = Modifier()
4495  Process._firstProcess = True
4496  p = Process("test", m1, m2)
4497  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4498  p.b = EDProducer("MyProducer", barney = int32(1), betty = int32(1))
4499  (m1 & m2).toModify(p.a, fred = 2).toModify(p.b, betty = 3)
4500  self.assertEqual(p.a.fred, 2)
4501  self.assertEqual(p.a.wilma, 1)
4502  self.assertEqual(p.b.barney, 1)
4503  self.assertEqual(p.b.betty, 3)
4504  (m1 | m3).toModify(p.a, wilma = 4).toModify(p.b, barney = 5)
4505  self.assertEqual(p.a.fred, 2)
4506  self.assertEqual(p.a.wilma, 4)
4507  self.assertEqual(p.b.barney, 5)
4508  self.assertEqual(p.b.betty, 3)
4509  (m2 & ~m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer")).toModify(p.b, barney = 6)
4510  self.assertEqual(p.a.type_(), "YourAnalyzer")
4511  self.assertEqual(p.b.barney, 6)
4512  self.assertEqual(p.b.betty, 3)
4513  (m1 & ~m3).toModify(p.a, param=int32(42)).toReplaceWith(p.b, EDProducer("YourProducer"))
4514  self.assertEqual(p.a.type_(), "YourAnalyzer")
4515  self.assertEqual(p.a.param, 42)
4516  self.assertEqual(p.b.type_(), "YourProducer")
4517 
4518  # EDAlias
4519  a = EDAlias(foo2 = VPSet(PSet(type = string("Foo2"))))
4520  m = Modifier()
4521  m._setChosen()
4522  # Modify parameters
4523  m.toModify(a, foo2 = {0: dict(type = "Foo3")})
4524  self.assertEqual(a.foo2[0].type, "Foo3")
4525  # Add an alias
4526  m.toModify(a, foo4 = VPSet(PSet(type = string("Foo4"))))
4527  self.assertEqual(a.foo2[0].type, "Foo3")
4528  self.assertEqual(a.foo4[0].type, "Foo4")
4529  # Remove an alias
4530  m.toModify(a, foo2 = None)
4531  self.assertFalse(hasattr(a, "foo2"))
4532  self.assertEqual(a.foo4[0].type, "Foo4")
4533  # Replace (doesn't work out of the box because EDAlias is not _Parameterizable
4534  m.toReplaceWith(a, EDAlias(bar = VPSet(PSet(type = string("Bar")))))
4535  self.assertFalse(hasattr(a, "foo2"))
4536  self.assertFalse(hasattr(a, "foo4"))
4537  self.assertTrue(hasattr(a, "bar"))
4538  self.assertEqual(a.bar[0].type, "Bar")
4539 
4540  # SwitchProducer
4541  sp = SwitchProducerTest(test1 = EDProducer("Foo",
4542  a = int32(1),
4543  b = PSet(c = int32(2))),
4544  test2 = EDProducer("Bar",
4545  aa = int32(11),
4546  bb = PSet(cc = int32(12))))
4547  m = Modifier()
4548  m._setChosen()
4549  # Modify parameters
4550  m.toModify(sp,
4551  test1 = dict(a = 4, b = dict(c = None)),
4552  test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo"))))
4553  self.assertEqual(sp.test1.a.value(), 4)
4554  self.assertEqual(sp.test1.b.hasParameter("c"), False)
4555  self.assertEqual(sp.test2.aa.value(), 15)
4556  self.assertEqual(sp.test2.bb.cc.value(), 45)
4557  self.assertEqual(sp.test2.bb.dd.value(), "foo")
4558  # Replace a producer
4559  m.toReplaceWith(sp.test1, EDProducer("Fred", x = int32(42)))
4560  self.assertEqual(sp.test1.type_(), "Fred")
4561  self.assertEqual(sp.test1.x.value(), 42)
4562  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test1, EDAnalyzer("Foo")))
4563  # Alternative way (only to be allow same syntax to be used as for adding)
4564  m.toModify(sp, test2 = EDProducer("Xyzzy", x = int32(24)))
4565  self.assertEqual(sp.test2.type_(), "Xyzzy")
4566  self.assertEqual(sp.test2.x.value(), 24)
4567  self.assertRaises(TypeError, lambda: m.toModify(sp, test2 = EDAnalyzer("Foo")))
4568  # Add a producer
4569  m.toModify(sp, test3 = EDProducer("Wilma", y = int32(24)))
4570  self.assertEqual(sp.test3.type_(), "Wilma")
4571  self.assertEqual(sp.test3.y.value(), 24)
4572  self.assertRaises(TypeError, lambda: m.toModify(sp, test4 = EDAnalyzer("Foo")))
4573  # Remove a producer
4574  m.toModify(sp, test2 = None)
4575  self.assertEqual(hasattr(sp, "test2"), False)
4576  # Add an alias
4577  m.toModify(sp, test2 = EDAlias(foo = VPSet(PSet(type = string("int")))))
4578  self.assertTrue(hasattr(sp.test2, "foo"))
4579  # Replace an alias
4580  m.toReplaceWith(sp.test2, EDAlias(bar = VPSet(PSet(type = string("int")))))
4581  self.assertTrue(hasattr(sp.test2, "bar"))
4582  # Alternative way
4583  m.toModify(sp, test2 = EDAlias(xyzzy = VPSet(PSet(type = string("int")))))
4584  self.assertTrue(hasattr(sp.test2, "xyzzy"))
4585  # Replace an alias with EDProducer
4586  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test2, EDProducer("Foo")))
4587  m.toModify(sp, test2 = EDProducer("Foo"))
4589  #check defaults are not overwritten
4590  f = ProcessFragment('Fragment')
4591  p = Process('PROCESS')
4592  p.maxEvents.input = 10
4593  p.options.numberOfThreads = 4
4594  p.maxLuminosityBlocks.input = 2
4595  p.extend(f)
4596  self.assertEqual(p.maxEvents.input.value(),10)
4597  self.assertEqual(p.options.numberOfThreads.value(), 4)
4598  self.assertEqual(p.maxLuminosityBlocks.input.value(),2)
4599  #general checks
4600  f = ProcessFragment("Fragment")
4601  f.fltr = EDFilter("Foo")
4602  p = Process('PROCESS')
4603  p.extend(f)
4604  self.assertTrue(hasattr(p,'fltr'))
4606  proc = Process("TEST")
4608  p.TestService = Service("TestService")
4609  self.assertTrue(hasattr(proc, "TestService"))
4610  self.assertEqual(proc.TestService.type_(), "TestService")
4611  self.assertRaises(TypeError, setattr, p, "a", EDProducer("Foo"))
4612  p.add_(Service("TestServiceTwo"))
4613  self.assertTrue(hasattr(proc, "TestServiceTwo"))
4614  self.assertEqual(proc.TestServiceTwo.type_(), "TestServiceTwo")
4615  p.TestService.foo = untracked.uint32(42)
4616  self.assertEqual(proc.TestService.foo.value(), 42)
4617  proc.mod = EDProducer("Producer")
4618  self.assertRaises(TypeError, getattr, p, "mod")
4620  proc = Process("TEST")
4621  p = TestMakePSet()
4622  proc.fillProcessDesc(p)
4623  self.assertTrue(["cpu"], p.values["@available_accelerators"][1])
4624  self.assertFalse(p.values["@selected_accelerators"][0])
4625  self.assertTrue(["cpu"], p.values["@selected_accelerators"][1])
4626  self.assertFalse(p.values["@module_type_resolver"][0])
4627  self.assertEqual("", p.values["@module_type_resolver"][1])
4628 
4629  proc = Process("TEST")
4630  self.assertRaises(TypeError, setattr, proc, "processAcceleratorTest", ProcessAcceleratorTest())
4631  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4632  del proc.MessageLogger # remove boilerplate unnecessary for this test case
4633  self.maxDiff = None
4634  self.assertEqual(proc.dumpPython(),
4635 """import FWCore.ParameterSet.Config as cms
4636 from test import ProcessAcceleratorTest
4637 
4638 process = cms.Process("TEST")
4639 
4640 process.maxEvents = cms.untracked.PSet(
4641  input = cms.optional.untracked.int32,
4642  output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
4643 )
4644 
4645 process.maxLuminosityBlocks = cms.untracked.PSet(
4646  input = cms.untracked.int32(-1)
4647 )
4648 
4649 process.options = cms.untracked.PSet(
4650  FailPath = cms.untracked.vstring(),
4651  IgnoreCompletely = cms.untracked.vstring(),
4652  Rethrow = cms.untracked.vstring(),
4653  SkipEvent = cms.untracked.vstring(),
4654  accelerators = cms.untracked.vstring('*'),
4655  allowUnscheduled = cms.obsolete.untracked.bool,
4656  canDeleteEarly = cms.untracked.vstring(),
4657  deleteNonConsumedUnscheduledModules = cms.untracked.bool(True),
4658  dumpOptions = cms.untracked.bool(False),
4659  emptyRunLumiMode = cms.obsolete.untracked.string,
4660  eventSetup = cms.untracked.PSet(
4661  forceNumberOfConcurrentIOVs = cms.untracked.PSet(
4662  allowAnyLabel_=cms.required.untracked.uint32
4663  ),
4664  numberOfConcurrentIOVs = cms.untracked.uint32(0)
4665  ),
4666  fileMode = cms.untracked.string('FULLMERGE'),
4667  forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
4668  holdsReferencesToDeleteEarly = cms.untracked.VPSet(),
4669  makeTriggerResults = cms.obsolete.untracked.bool,
4670  modulesToIgnoreForDeleteEarly = cms.untracked.vstring(),
4671  numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0),
4672  numberOfConcurrentRuns = cms.untracked.uint32(1),
4673  numberOfStreams = cms.untracked.uint32(0),
4674  numberOfThreads = cms.untracked.uint32(1),
4675  printDependencies = cms.untracked.bool(False),
4676  sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
4677  throwIfIllegalParameter = cms.untracked.bool(True),
4678  wantSummary = cms.untracked.bool(False)
4679 )
4680 
4681 process.ProcessAcceleratorTest = ProcessAcceleratorTest(
4682  enabled = ['test1', 'test2', 'anothertest3']
4683 )
4684 
4685 
4686 """)
4687  p = TestMakePSet()
4688  proc.fillProcessDesc(p)
4689  self.assertEqual(["*"], p.values["options"][1].values["accelerators"][1])
4690  self.assertFalse(p.values["options"][1].values["accelerators"][0])
4691  self.assertTrue(["anothertest3", "cpu", "test1", "test2"], p.values["@selected_accelerators"][1])
4692  self.assertEqual("AcceleratorTestService", p.values["services"][1][0].values["@service_type"][1])
4693  self.assertFalse(p.values["@available_accelerators"][0])
4694  self.assertTrue(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4695  self.assertFalse(p.values["@module_type_resolver"][0])
4696  self.assertEqual("", p.values["@module_type_resolver"][1])
4697 
4698  proc = Process("TEST")
4699  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4700  proc.add_(Service("AcceleratorTestServiceRemove"))
4701  p = TestMakePSet()
4702  proc.fillProcessDesc(p)
4703  services = [x.values["@service_type"][1] for x in p.values["services"][1]]
4704  self.assertTrue("AcceleratorTestService" in services)
4705  self.assertFalse("AcceleratorTestServiceRemove" in services)
4706 
4707  proc = Process("TEST")
4708  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4709  p = TestMakePSet()
4710  proc.fillProcessDesc(p)
4711  self.assertEqual(["cpu", "test1"], p.values["@selected_accelerators"][1])
4712  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4713 
4714  proc = Process("TEST")
4715  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4716  proc.options.accelerators = ["test2"]
4717  p = TestMakePSet()
4718  proc.fillProcessDesc(p)
4719  self.assertEqual(["test2"], p.values["@selected_accelerators"][1])
4720  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4721 
4722  proc = Process("TEST")
4723  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4724  proc.options.accelerators = ["test*"]
4725  proc.fillProcessDesc(p)
4726  self.assertEqual(["test1", "test2"], p.values["@selected_accelerators"][1])
4727  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4728 
4729  proc = Process("TEST")
4730  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4731  proc.options.accelerators = ["test2"]
4732  p = TestMakePSet()
4733  proc.fillProcessDesc(p)
4734  self.assertEqual([], p.values["@selected_accelerators"][1])
4735  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4736 
4737  proc = Process("TEST")
4738  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4739  proc.options.accelerators = ["cpu*"]
4740  p = TestMakePSet()
4741  proc.fillProcessDesc(p)
4742  self.assertEqual(["cpu"], p.values["@selected_accelerators"][1])
4743  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4744 
4745  proc = Process("TEST")
4746  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4747  proc.options.accelerators = ["test3"]
4748  p = TestMakePSet()
4749  self.assertRaises(ValueError, proc.fillProcessDesc, p)
4750 
4751  proc = Process("TEST")
4752  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4753  proc.options.accelerators = ["*", "test1"]
4754  p = TestMakePSet()
4755  self.assertRaises(ValueError, proc.fillProcessDesc, p)
4756 
4757  proc = Process("TEST")
4758  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4759  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4760  p = TestMakePSet()
4761  proc.fillProcessDesc(p)
4762  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@selected_accelerators"][1])
4763  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4764 
4765  proc = Process("TEST")
4766  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4767  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4768  proc.options.accelerators = ["*test3", "c*"]
4769  p = TestMakePSet()
4770  proc.fillProcessDesc(p)
4771  self.assertEqual(["anothertest3", "cpu"], p.values["@selected_accelerators"][1])
4772  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4773 
4774  proc = Process("TEST")
4775  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4776  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4777  a = int32(1),
4778  b = PSet(c = int32(2))),
4779  test1 = EDProducer("Bar",
4780  aa = int32(11),
4781  bb = PSet(cc = int32(12))))
4782  proc.p = Path(proc.sp)
4783  p = TestMakePSet()
4784  proc.fillProcessDesc(p)
4785  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
4786 
4787  proc = Process("TEST")
4788  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4789  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4790  a = int32(1),
4791  b = PSet(c = int32(2))),
4792  test1 = EDProducer("Bar",
4793  aa = int32(11),
4794  bb = PSet(cc = int32(12))))
4795  proc.p = Path(proc.sp)
4796  p = TestMakePSet()
4797  proc.fillProcessDesc(p)
4798  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4799 
4800  proc = Process("TEST")
4801  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4802  proc.options.accelerators = ["test1"]
4803  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4804  a = int32(1),
4805  b = PSet(c = int32(2))),
4806  test1 = EDProducer("Bar",
4807  aa = int32(11),
4808  bb = PSet(cc = int32(12))))
4809  proc.p = Path(proc.sp)
4810  p = TestMakePSet()
4811  proc.fillProcessDesc(p)
4812  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4813 
4814  proc = Process("TEST")
4815  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4816  proc.options.accelerators = ["test*"]
4817  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4818  a = int32(1),
4819  b = PSet(c = int32(2))),
4820  test1 = EDProducer("Bar",
4821  aa = int32(11),
4822  bb = PSet(cc = int32(12))))
4823  proc.p = Path(proc.sp)
4824  p = TestMakePSet()
4825  proc.fillProcessDesc(p)
4826  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
4827 
4828  proc = Process("TEST")
4829  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4830  proc.options.accelerators = ["anothertest3"]
4831  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4832  a = int32(1),
4833  b = PSet(c = int32(2))),
4834  test1 = EDProducer("Bar",
4835  aa = int32(11),
4836  bb = PSet(cc = int32(12))))
4837  proc.p = Path(proc.sp)
4838  p = TestMakePSet()
4839  self.assertRaises(RuntimeError, proc.fillProcessDesc, p)
4840 
4841  proc = Process("TEST")
4842  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4843  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4844  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4845  proc.normalProducer = EDProducer("FooProducer")
4846  proc.testProducer = EDProducer("BarProducer@test")
4847  proc.test2Producer = EDProducer("BarProducer@test", test=untracked.PSet(backend=untracked.string("test2_backend")))
4848  proc.testAnalyzer = EDAnalyzer("Analyzer@test")
4849  proc.testFilter = EDAnalyzer("Filter@test")
4850  proc.testESProducer = ESProducer("ESProducer@test")
4851  proc.testESSource = ESSource("ESSource@test")
4852  proc.p = Path(proc.normalProducer+proc.testProducer+proc.test2Producer+proc.testAnalyzer+proc.testFilter)
4853  p = TestMakePSet()
4854  proc.fillProcessDesc(p)
4855  self.assertEqual("TestModuleTypeResolver", p.values["@module_type_resolver"][1])
4856  self.assertEqual("FooProducer", p.values["normalProducer"][1].values["@module_type"][1])
4857  self.assertEqual(len(list(filter(lambda x: not "@" in x, p.values["normalProducer"][1].values.keys()))), 0)
4858  self.assertEqual("BarProducer@test", p.values["testProducer"][1].values["@module_type"][1])
4859  self.assertEqual(False, p.values["testProducer"][1].values["test"][0])
4860  self.assertEqual(False, p.values["testProducer"][1].values["test"][1].values["backend"][0])
4861  self.assertEqual("test1_backend", p.values["testProducer"][1].values["test"][1].values["backend"][1])
4862  self.assertEqual("BarProducer@test", p.values["test2Producer"][1].values["@module_type"][1])
4863  self.assertEqual("test2_backend", p.values["test2Producer"][1].values["test"][1].values["backend"][1])
4864  self.assertEqual("Analyzer@test", p.values["testAnalyzer"][1].values["@module_type"][1])
4865  self.assertEqual("test1_backend", p.values["testAnalyzer"][1].values["test"][1].values["backend"][1])
4866  self.assertEqual("Filter@test", p.values["testFilter"][1].values["@module_type"][1])
4867  self.assertEqual("test1_backend", p.values["testFilter"][1].values["test"][1].values["backend"][1])
4868  self.assertEqual("ESProducer@test", p.values["ESProducer@test@testESProducer"][1].values["@module_type"][1])
4869  self.assertEqual("test1_backend", p.values["ESProducer@test@testESProducer"][1].values["test"][1].values["backend"][1])
4870  self.assertEqual("ESSource@test", p.values["ESSource@test@testESSource"][1].values["@module_type"][1])
4871  self.assertEqual("test1_backend", p.values["ESSource@test@testESSource"][1].values["test"][1].values["backend"][1])
4872 
4873  # No required accelerators available
4874  proc = Process("Test")
4875  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4876  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4877  proc.options.accelerators = []
4878  self.assertRaises(EDMException, proc.fillProcessDesc, p)
4879 
4880  proc = Process("Test")
4881  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4882  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4883  proc.options.accelerators = ["test1"]
4884  proc.test2Producer = EDProducer("BarProducer@test", test=untracked.PSet(backend=untracked.string("test2_backend")))
4885  proc.p = Path(proc.test2Producer)
4886  self.assertRaises(EDMException, proc.fillProcessDesc, p)
4887 
4888  # Two ProcessAccelerators return type resolver
4889  proc = Process("TEST")
4890  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4891  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4892  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2(
4893  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4894  p = TestMakePSet()
4895  self.assertRaises(RuntimeError, proc.fillProcessDesc, p)
4896 
4897  import pickle
4898  proc = Process("TEST")
4899  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4900  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4901  a = int32(1),
4902  b = PSet(c = int32(2))),
4903  test1 = EDProducer("Bar",
4904  aa = int32(11),
4905  bb = PSet(cc = int32(12))))
4906  proc.p = Path(proc.sp)
4907  pkl = pickle.dumps(proc)
4908  unpkl = pickle.loads(pkl)
4909  p = TestMakePSet()
4910  unpkl.fillProcessDesc(p)
4911  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
4912  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4913  unpkl = pickle.loads(pkl)
4914  unpkl.ProcessAcceleratorTest.setEnabled(["test1"])
4915  p = TestMakePSet()
4916  unpkl.fillProcessDesc(p)
4917  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4918  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4919 
4920  unittest.main()
def __setstate__(self, pkldict)
Definition: Config.py:192
def conditionaltasks_(self)
Definition: Config.py:329
def addVString(self, tracked, label, value)
Definition: Config.py:2140
def testProcessAccelerator(self)
Definition: Config.py:4619
def _dumpConfigOptionallyNamedList(self, items, typeName, options)
Definition: Config.py:829
def testConditionalTaskPlaceholder(self)
Definition: Config.py:4070
def addEventRange(self, tracked, label, value)
Definition: Config.py:2160
def __init__(self, lhs, rhs)
Definition: Config.py:1812
def __init__(self, enabled=["anothertest3", anothertest4, moduleTypeResolverMaker=None)
Definition: Config.py:2251
def testExamples(self)
Definition: Config.py:3630
def __getattribute__(self, name)
Definition: Config.py:1645
def _place(self, label, process)
Definition: Config.py:1737
def getProcessName(self)
Definition: Config.py:1725
def testServiceInProcess(self)
Definition: Config.py:2856
def __or__(self, other)
Definition: Config.py:1905
def outputCommands(self)
Definition: Config.py:1731
def _setChosen(self)
Definition: Config.py:1922
def producerNames(self)
Definition: Config.py:176
def _dumpConfigUnnamedList(self, items, typeName, options)
Definition: Config.py:823
def newPSet(self)
Definition: Config.py:2170
def _placeAnalyzer(self, name, mod)
Definition: Config.py:689
def addString(self, tracked, label, value)
Definition: Config.py:2138
def __findFirstUsingModule(self, seqsOrTasks, mod)
Definition: Config.py:571
def subProcesses_(self)
Definition: Config.py:297
def __repr__(self)
Definition: Config.py:1688
def _pruneModules(self, d, scheduledNames)
Definition: Config.py:1422
def _modifyParametersFromDict(params, newParams, errorRaiser, keyDepth="")
Definition: Mixins.py:713
def vpsets_(self)
Definition: Config.py:380
def setName_(self, name)
Definition: Config.py:215
def _placeESPrefer(self, name, mod)
Definition: Config.py:717
def __init__(self, process)
Definition: Config.py:2052
def testSequence2(self)
Definition: Config.py:2846
def __updateMaxEvents(self, ps)
Definition: Config.py:285
def _placeSwitchProducer(self, name, mod)
Definition: Config.py:685
def _insertPaths(self, processPSet, nodeVisitor)
Definition: Config.py:1244
def es_producers_(self)
Definition: Config.py:360
def apply(self, process, accelerators)
Definition: Config.py:2039
def _placeESProducer(self, name, mod)
Definition: Config.py:715
def __invert__(self)
Definition: Config.py:1903
def _splitPythonList(self, subfolder, d, options)
Definition: Config.py:928
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:37
def pathNames(self)
Definition: Config.py:188
def addVESInputTag(self, tracked, label, value)
Definition: Config.py:2150
def _switchproducer_test2_case2(accelerators)
Definition: Config.py:2080
def __and__(self, other)
Definition: Config.py:1901
def _placeSequence(self, name, mod)
Definition: Config.py:712
def __call__(self, obj)
Definition: Config.py:1752
def _setChosen(self)
Definition: Config.py:1896
untracked
Definition: Types.py:34
def __init__(self, dataset, job_number, job_id, job_name, isDA, isMC, applyBOWS, applyEXTRACOND, extraconditions, runboundary, lumilist, intlumi, maxevents, gt, allFromGT, alignmentDB, alignmentTAG, apeDB, apeTAG, bowDB, bowTAG, vertextype, tracktype, refittertype, ttrhtype, applyruncontrol, ptcut, CMSSW_dir, the_dir)
def _validateSequence(self, sequence, label)
Definition: Config.py:949
def __getattr__(self, attr)
Definition: Config.py:1690
def tasks_(self)
Definition: Config.py:325
def setStrict(self, value)
Definition: Config.py:171
def addDouble(self, tracked, label, value)
Definition: Config.py:2132
def dumpPythonImpl(self, options)
Definition: Config.py:2014
def moduleTypeResolver(self, accelerators)
Definition: Config.py:2240
def producers_(self)
Definition: Config.py:220
def _findPreferred(self, esname, d, args, kargs)
Definition: Config.py:1610
def apply(self, process, accelerators)
Definition: Config.py:2273
def __init__(self, kargs)
Definition: Config.py:2185
def testModifier(self)
Definition: Config.py:4185
def apply(self, process, accelerators)
Definition: Config.py:2244
def _insertOneInto(self, parameterSet, label, item, tracked)
Definition: Config.py:1205
def __setattr__(self, label, value)
Definition: Config.py:2059
def _isChosen(self)
Definition: Config.py:1807
def filterNames(self)
Definition: Config.py:185
def __updateOptions(self, opt)
Definition: Config.py:272
def __delattr__(self, name)
Definition: Config.py:601
def _placePath(self, name, mod)
Definition: Config.py:691
def addVUInt64(self, tracked, label, value)
Definition: Config.py:2130
def _isChosen(self)
Definition: Config.py:1800
def _placeEndPath(self, name, mod)
Definition: Config.py:698
def testProcessForProcessAccelerator(self)
Definition: Config.py:4605
def es_sources_(self)
Definition: Config.py:364
def __init__(self, name, Mods)
Definition: Config.py:116
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
def testTypedParameterizable(self)
Definition: Config.py:2314
def addUInt64(self, tracked, label, value)
Definition: Config.py:2128
def _itemsInDependencyOrder(self, processDictionaryOfItems)
Definition: Config.py:975
def source_(self)
Definition: Config.py:228
def addVPSet(self, tracked, label, value)
Definition: Config.py:2166
def nameInProcessDesc_(self, label)
Definition: Config.py:1735
def __init__(self, accelerators)
Definition: Config.py:2194
def psets_(self)
Definition: Config.py:376
def _lineDiff(newString, oldString)
Definition: Config.py:2087
def testSecSource(self)
Definition: Config.py:2755
def dumpPythonImpl(self, options)
Definition: Config.py:2232
def __init__(self, args)
Definition: Config.py:1750
def format_outerframe(number)
def __init__(self, args, kw)
Definition: Config.py:1686
def load(self, moduleName)
Definition: Config.py:759
def _insertSubProcessesInto(self, parameterSet, label, itemList, tracked)
Definition: Config.py:1231
def addUInt32(self, tracked, label, value)
Definition: Config.py:2120
def __init__(self, error, message)
Definition: Config.py:37
def _dumpConfigESPrefers(self, options)
Definition: Config.py:906
def __setattr__(self, name, value)
Definition: Config.py:1650
def setLooper_(self, lpr)
Definition: Config.py:237
def setSource_(self, src)
Definition: Config.py:231
def __init__(self, process)
Definition: Config.py:1632
def extend(self, other, items=())
Definition: Config.py:763
def _okToPlace(self, name, mod, d)
Definition: Config.py:652
def __injectValidValue(self, name, value, newValue=None)
Definition: Config.py:561
def __or__(self, other)
Definition: Config.py:1793
def _replaceInTasks(self, label, new)
Definition: Config.py:1178
def addVInt32(self, tracked, label, value)
Definition: Config.py:2118
def _placeFilter(self, name, mod)
Definition: Config.py:687
def testFinalPath(self)
Definition: Config.py:3305
def handleProcessAccelerators(self, parameterSet)
Definition: Config.py:1516
def schedule_(self)
Definition: Config.py:333
def validate(self)
Definition: Config.py:1509
def addVInputTag(self, tracked, label, value)
Definition: Config.py:2146
def _applyNewProcessModifiers(self, process)
Definition: Config.py:1917
def analyzerNames(self)
Definition: Config.py:182
def testSchedule(self)
Definition: Config.py:3428
def addLuminosityBlockID(self, tracked, label, value)
Definition: Config.py:2156
def addESInputTag(self, tracked, label, value)
Definition: Config.py:2148
def __init__(self, lhs)
Definition: Config.py:1805
def __new__(cls, args, kw)
Definition: Config.py:1669
def testContains(self)
Definition: Config.py:3360
def endpaths_(self)
Definition: Config.py:313
def toModify(self, obj, func=None, kw)
Definition: Config.py:1774
def SelectEvents(self)
Definition: Config.py:1729
def setEnabled(self, enabled)
Definition: Config.py:2227
def __setattr__(self, name, value)
Definition: Config.py:420
def _placeESSource(self, name, mod)
Definition: Config.py:719
def addVInt64(self, tracked, label, value)
Definition: Config.py:2126
def addVEventID(self, tracked, label, value)
Definition: Config.py:2154
def setEnabled(self, enabled)
Definition: Config.py:2256
def toModify(self, obj, func=None, kw)
Definition: Config.py:1840
def testGlobalReplace(self)
Definition: Config.py:2760
def testSwitchProducer(self)
Definition: Config.py:3731
def getVString(self, tracked, label)
Definition: Config.py:2142
def moduleTypeResolver(self, accelerators)
Definition: Config.py:2024
def defaultMaxLuminosityBlocks_()
Definition: Config.py:295
def testProcessFragment(self)
Definition: Config.py:4588
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1779
def _placeOutputModule(self, name, mod)
Definition: Config.py:681
def addFileInPath(self, tracked, label, value)
Definition: Config.py:2168
def testRefToPSet(self)
Definition: Config.py:3715
def testOverride(self)
Definition: Config.py:3573
def _placeSource(self, name, mod)
Definition: Config.py:733
def __init__(self)
Definition: Config.py:1827
def __init__(self, lhs, rhs=None)
Definition: Config.py:1770
def _dumpPythonSubProcesses(self, l, options)
Definition: Config.py:912
def _insertSwitchProducersInto(self, parameterSet, labelModules, labelAliases, itemDict, tracked)
Definition: Config.py:1220
def moduleTypeResolver(self, accelerators)
Definition: Config.py:2269
def checkImportPermission(minLevel=2, allowedPatterns=[])
Definition: Config.py:41
def ignore(seq)
def _toModify(obj, func, kw)
Definition: Config.py:1858
def __init__(self, modifier, func)
Definition: Config.py:1966
def _toReplaceWith(toObj, fromObj)
Definition: Config.py:1876
def _toModifyCheck(obj, func, kw)
Definition: Config.py:1837
def isUsingModifier(self, mod)
Definition: Config.py:385
def dumpPython(self, options=PrintOptions())
Definition: Config.py:1718
def __copyIfExclude(self, toExclude)
Definition: Config.py:1943
def sequences_(self)
Definition: Config.py:321
def _validateTask(self, task, label)
Definition: Config.py:958
def testParameterizable(self)
Definition: Config.py:2281
def testSubProcess(self)
Definition: Config.py:3680
def _placeSubProcess(self, name, mod)
Definition: Config.py:746
def __init__(self, enabled=["test1", test2, anothertest3, moduleTypeResolverMaker=None)
Definition: Config.py:2222
def setPartialSchedule_(self, sch, label)
Definition: Config.py:336
def addPSet(self, tracked, label, value)
Definition: Config.py:2164
def testProcessDumpPython(self)
Definition: Config.py:2441
def _placeService(self, typeName, mod)
Definition: Config.py:751
def resolve(self, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1340
def looper_(self)
Definition: Config.py:234
def _switchproducer_test2_case1(accelerators)
Definition: Config.py:2078
def es_prefers_(self)
Definition: Config.py:368
static std::string join(char **cmd)
Definition: RemoteFile.cc:19
def _isChosen(self)
Definition: Config.py:1899
def _isOrContains(self, other)
Definition: Config.py:1907
def getSubProcessPSet(self, parameterSet)
Definition: Config.py:1739
def _validateConditionalTask(self, task, label)
Definition: Config.py:966
def copyAndExclude(self, toExclude)
Definition: Config.py:1929
def addVUInt32(self, tracked, label, value)
Definition: Config.py:2122
def addVEventRange(self, tracked, label, value)
Definition: Config.py:2162
def _splitPython(self, subfolder, d, options)
Definition: Config.py:1047
def defaultMaxEvents_()
Definition: Config.py:282
def __init__(self, lhs, rhs)
Definition: Config.py:1798
def filters_(self)
Definition: Config.py:209
def _placeAccelerator(self, typeName, mod)
Definition: Config.py:756
def dumpPython(process, name)
def __setObjectLabel(self, object, newLabel)
Definition: Config.py:393
def testConditionalTask(self)
Definition: Config.py:3066
def _delHelper(self, name)
Definition: Config.py:584
def _placeAlias(self, name, mod)
Definition: Config.py:727
def dumpPython(self, options=PrintOptions())
Definition: Config.py:1053
def _replaceInSequences(self, label, new)
Definition: Config.py:1161
def setSchedule_(self, sch)
Definition: Config.py:341
def analyzers_(self)
Definition: Config.py:301
def finalpaths_(self)
Definition: Config.py:317
def dumpPython(self, options=PrintOptions())
Definition: Config.py:2002
def _toReplaceWithCheck(toObj, fromObj)
Definition: Config.py:1865
def defaultOptions_()
Definition: Config.py:241
def testSequence(self)
Definition: Config.py:2831
def switchProducerNames(self)
Definition: Config.py:179
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1868
def _placeProducer(self, name, mod)
Definition: Config.py:683
def prefer(self, esmodule, args, kargs)
Definition: Config.py:1581
def __delattr__(self, name)
Definition: Config.py:1655
def _dumpConfigNamedList(self, items, typeName, options)
Definition: Config.py:817
void add(std::map< std::string, TH1 *> &h, TH1 *hist)
#define update(a, b)
def addInputTag(self, tracked, label, value)
Definition: Config.py:2144
def add_(self, value)
Definition: Config.py:638
def _isChosen(self)
Definition: Config.py:1814
def _insertManyInto(self, parameterSet, label, itemDict, tracked)
Definition: Config.py:1212
def dumpConfig(self, options=PrintOptions())
Definition: Config.py:837
def apply(self, process)
Definition: Config.py:1970
def testCloneSequence(self)
Definition: Config.py:3344
def process(self)
Definition: Config.py:1727
def _placeTask(self, name, task)
Definition: Config.py:721
def makeProcessModifier(self, func)
Definition: Config.py:1784
def addSubProcess(self, mod)
Definition: Config.py:749
def switchProducers_(self)
Definition: Config.py:224
def _placePSet(self, name, mod)
Definition: Config.py:729
def _placeFinalPath(self, name, mod)
Definition: Config.py:705
def _isOrContains(self, other)
Definition: Config.py:1952
def addInt64(self, tracked, label, value)
Definition: Config.py:2124
def addService(process, multirun=False)
Definition: FastTimer.py:3
def name_(self)
Definition: Config.py:213
def _place(self, name, mod, d)
Definition: Config.py:673
def testProcessExtend(self)
Definition: Config.py:2346
def _dumpPythonList(self, d, options)
Definition: Config.py:918
def __insertValue(self, tracked, label, value)
Definition: Config.py:2107
def splitPython(self, options=PrintOptions())
Definition: Config.py:1090
def __init__(self, kargs)
Definition: Config.py:2174
def setModuleVariant(self, module)
Definition: Config.py:2207
def __getValue(self, tracked, label)
Definition: Config.py:2109
def _place(self, name, proc)
Definition: Config.py:1998
def _placeVPSet(self, name, mod)
Definition: Config.py:731
def processAccelerators_(self)
Definition: Config.py:356
def __and__(self, other)
Definition: Config.py:1789
def globalReplace(self, label, new)
Definition: Config.py:1197
#define str(s)
def addBool(self, tracked, label, value)
Definition: Config.py:2136
def testMaxEvents(self)
Definition: Config.py:3612
def paths_(self)
Definition: Config.py:309
def addEventID(self, tracked, label, value)
Definition: Config.py:2152
def outputModules_(self)
Definition: Config.py:305
def _placeLooper(self, name, mod)
Definition: Config.py:741
def testImplicitSchedule(self)
Definition: Config.py:3533
def prune(self, verbose=False, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1351
def addVDouble(self, tracked, label, value)
Definition: Config.py:2134
def _insertInto(self, parameterSet, itemDict)
Definition: Config.py:1202
def _delattrFromSetattr(self, name)
Definition: Config.py:629
def _replaceInConditionalTasks(self, label, new)
Definition: Config.py:1182
def makeProcessModifier(self, func)
Definition: Config.py:1830
def __init__(self, process, SelectEvents=untracked.PSet(), outputCommands=untracked.vstring())
Definition: Config.py:1698
def _placeConditionalTask(self, name, task)
Definition: Config.py:724
def _replaceInScheduleDirectly(self, label, new)
Definition: Config.py:1192
def type_(self)
Definition: Config.py:1733
def __init__(self, chainedModifiers)
Definition: Config.py:1914
def testTaskPlaceholder(self)
Definition: Config.py:4002
def services_(self)
Definition: Config.py:352
def _replaceInSchedule(self, label, new)
Definition: Config.py:1186
def dumpPythonImpl(self, options)
Definition: Config.py:2261
def _dumpPython(self, d, options)
Definition: Config.py:1041
def addInt32(self, tracked, label, value)
Definition: Config.py:2116
def _isChosen(self)
Definition: Config.py:1927
def fillProcessDesc(self, processPSet)
Definition: Config.py:1429
def findProcess(module)
Definition: Config.py:94
def testProcessInsertion(self)
Definition: Config.py:2321
def __init__(self)
Definition: Config.py:2105
def aliases_(self)
Definition: Config.py:372