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  TryToContinue = untracked.vstring(),
262  IgnoreCompletely = untracked.vstring(),
263  modulesToCallForTryToContinue = 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  invalidModules = finalpathValidator.invalidModulesOnFinalpaths
1289  if invalidModules:
1290  raise RuntimeError("FinalPath %s has non OutputModules %s" % (finalpathname, ",".join(invalidModules)))
1291  modulesOnFinalPath.extend(iFinalPath.moduleNames())
1292  for m in modulesOnFinalPath:
1293  mod = getattr(self, m)
1294  setattr(mod, "@onFinalPath", untracked.bool(True))
1295  finalPathEndPath += mod
1296 
1297  processPSet.addVString(True, "@end_paths", endpaths)
1298  processPSet.addVString(True, "@paths", scheduledPaths)
1299  # trigger_paths are a little different
1300  p = processPSet.newPSet()
1301  p.addVString(True, "@trigger_paths", triggerPaths)
1302  processPSet.addPSet(True, "@trigger_paths", p)
1303  # add all these paths
1304  pathValidator = PathValidator()
1305  endpathValidator = EndPathValidator()
1306  decoratedList = []
1307  lister = DecoratedNodeNameVisitor(decoratedList)
1308  condTaskModules = []
1309  condTaskVistor = ModuleNodeOnConditionalTaskVisitor(condTaskModules)
1310  pathCompositeVisitor = CompositeVisitor(pathValidator, nodeVisitor, lister, condTaskVistor)
1311  endpathCompositeVisitor = CompositeVisitor(endpathValidator, nodeVisitor, lister)
1312  for triggername in triggerPaths:
1313  iPath = self.paths_()[triggername]
1314  iPath.resolve(self.__dict__)
1315  pathValidator.setLabel(triggername)
1316  lister.initialize()
1317  condTaskModules[:] = []
1318  iPath.visit(pathCompositeVisitor)
1319  if condTaskModules:
1320  decoratedList.append("#")
1321  l = list({x.label_() for x in condTaskModules})
1322  l.sort()
1323  decoratedList.extend(l)
1324  decoratedList.append("@")
1325  iPath.insertInto(processPSet, triggername, decoratedList[:])
1326  for endpathname in endpaths:
1327  if endpathname is not endPathWithFinalPathModulesName:
1328  iEndPath = self.endpaths_()[endpathname]
1329  else:
1330  iEndPath = finalPathEndPath
1331  iEndPath.resolve(self.__dict__)
1332  endpathValidator.setLabel(endpathname)
1333  lister.initialize()
1334  iEndPath.visit(endpathCompositeVisitor)
1335  iEndPath.insertInto(processPSet, endpathname, decoratedList[:])
1336  processPSet.addVString(False, "@filters_on_endpaths", endpathValidator.filtersOnEndpaths)
1337 
1338 
1339  def resolve(self,keepUnresolvedSequencePlaceholders=False):
1340  for x in self.paths.values():
1341  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1342  for x in self.endpaths.values():
1343  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1344  for x in self.finalpaths.values():
1345  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1346  if not self.schedule_() == None:
1347  for task in self.schedule_()._tasks:
1348  task.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1349 
1350  def prune(self,verbose=False,keepUnresolvedSequencePlaceholders=False):
1351  """ Remove clutter from the process that we think is unnecessary:
1352  tracked PSets, VPSets and unused modules and sequences. If a Schedule has been set, then Paths and EndPaths
1353  not in the schedule will also be removed, along with an modules and sequences used only by
1354  those removed Paths and EndPaths. The keepUnresolvedSequencePlaceholders keeps also unresolved TaskPlaceholders."""
1355 # need to update this to only prune psets not on refToPSets
1356 # but for now, remove the delattr
1357 # for name in self.psets_():
1358 # if getattr(self,name).isTracked():
1359 # delattr(self, name)
1360  for name in self.vpsets_():
1361  delattr(self, name)
1362  #first we need to resolve any SequencePlaceholders being used
1363  self.resolve(keepUnresolvedSequencePlaceholders)
1364  usedModules = set()
1365  unneededPaths = set()
1366  tasks = list()
1367  tv = TaskVisitor(tasks)
1368  if self.schedule_():
1369  usedModules=set(self.schedule_().moduleNames())
1370  #get rid of unused paths
1371  schedNames = set(( x.label_() for x in self.schedule_()))
1372  names = set(self.paths)
1373  names.update(set(self.endpaths))
1374  names.update(set(self.finalpaths))
1375  unneededPaths = names - schedNames
1376  for n in unneededPaths:
1377  delattr(self,n)
1378  for t in self.schedule_().tasks():
1379  tv.enter(t)
1380  t.visit(tv)
1381  tv.leave(t)
1382  else:
1383  pths = list(self.paths.values())
1384  pths.extend(self.endpaths.values())
1385  pths.extend(self.finalpaths.values())
1386  temp = Schedule(*pths)
1387  usedModules=set(temp.moduleNames())
1388  unneededModules = self._pruneModules(self.producers_(), usedModules)
1389  unneededModules.update(self._pruneModules(self.switchProducers_(), usedModules))
1390  unneededModules.update(self._pruneModules(self.filters_(), usedModules))
1391  unneededModules.update(self._pruneModules(self.analyzers_(), usedModules))
1392  #remove sequences and tasks that do not appear in remaining paths and endpaths
1393  seqs = list()
1394  sv = SequenceVisitor(seqs)
1395  for p in self.paths.values():
1396  p.visit(sv)
1397  p.visit(tv)
1398  for p in self.endpaths.values():
1399  p.visit(sv)
1400  p.visit(tv)
1401  for p in self.finalpaths.values():
1402  p.visit(sv)
1403  p.visit(tv)
1404  def removeUnneeded(seqOrTasks, allSequencesOrTasks):
1405  _keepSet = set(( s for s in seqOrTasks if s.hasLabel_()))
1406  _availableSet = set(allSequencesOrTasks.values())
1407  _unneededSet = _availableSet-_keepSet
1408  _unneededLabels = []
1409  for s in _unneededSet:
1410  _unneededLabels.append(s.label_())
1411  delattr(self,s.label_())
1412  return _unneededLabels
1413  unneededSeqLabels = removeUnneeded(seqs, self.sequences)
1414  unneededTaskLabels = removeUnneeded(tasks, self.tasks)
1415  if verbose:
1416  print("prune removed the following:")
1417  print(" modules:"+",".join(unneededModules))
1418  print(" tasks:"+",".join(unneededTaskLabels))
1419  print(" sequences:"+",".join(unneededSeqLabels))
1420  print(" paths/endpaths/finalpaths:"+",".join(unneededPaths))
1421  def _pruneModules(self, d, scheduledNames):
1422  moduleNames = set(d.keys())
1423  junk = moduleNames - scheduledNames
1424  for name in junk:
1425  delattr(self, name)
1426  return junk
1427 
1428  def fillProcessDesc(self, processPSet):
1429  """Used by the framework to convert python to C++ objects"""
1430  class ServiceInjectorAdaptor(object):
1431  def __init__(self,ppset,thelist):
1432  self.__thelist = thelist
1433  self.__processPSet = ppset
1434  def addService(self,pset):
1435  self.__thelist.append(pset)
1436  def newPSet(self):
1437  return self.__processPSet.newPSet()
1438  #This adaptor is used to 'add' the method 'getTopPSet_'
1439  # to the ProcessDesc and PythonParameterSet C++ classes.
1440  # This method is needed for the PSet refToPSet_ functionality.
1441  class TopLevelPSetAcessorAdaptor(object):
1442  def __init__(self,ppset,process):
1443  self.__ppset = ppset
1444  self.__process = process
1445  def __getattr__(self,attr):
1446  return getattr(self.__ppset,attr)
1447  def getTopPSet_(self,label):
1448  return getattr(self.__process,label)
1449  def newPSet(self):
1450  return TopLevelPSetAcessorAdaptor(self.__ppset.newPSet(),self.__process)
1451  def addPSet(self,tracked,name,ppset):
1452  return self.__ppset.addPSet(tracked,name,self.__extractPSet(ppset))
1453  def addVPSet(self,tracked,name,vpset):
1454  return self.__ppset.addVPSet(tracked,name,[self.__extractPSet(x) for x in vpset])
1455  def __extractPSet(self,pset):
1456  if isinstance(pset,TopLevelPSetAcessorAdaptor):
1457  return pset.__ppset
1458  return pset
1459 
1460  self.validate()
1461  processPSet.addString(True, "@process_name", self.name_())
1462  self.handleProcessAccelerators(processPSet)
1463  all_modules = self.producers_().copy()
1464  all_modules.update(self.filters_())
1465  all_modules.update(self.analyzers_())
1466  all_modules.update(self.outputModules_())
1467  if hasattr(self.options,"modulesToCallForTryToContinue") :
1468  shouldTryToContinue = set(self.options.modulesToCallForTryToContinue)
1469  for m in all_modules:
1470  if m in shouldTryToContinue:
1471  setattr(getattr(self,m),"@shouldTryToContinue",untracked.bool(True))
1472  missing = shouldTryToContinue.difference(all_modules)
1473  if missing:
1474  print("Warning: The following modules appear in options.modulesToCallForTryToContinue but are not in the Process: {} ".format(",".join(missing)))
1475  adaptor = TopLevelPSetAcessorAdaptor(processPSet,self)
1476  self._insertInto(adaptor, self.psets_())
1477  self._insertInto(adaptor, self.vpsets_())
1478  self._insertOneInto(adaptor, "@all_sources", self.source_(), True)
1479  self._insertOneInto(adaptor, "@all_loopers", self.looper_(), True)
1480  self._insertSubProcessesInto(adaptor, "@all_subprocesses", self.subProcesses_(), False)
1481  self._insertManyInto(adaptor, "@all_esprefers", self.es_prefers_(), True)
1482  self._insertManyInto(adaptor, "@all_aliases", self.aliases_(), True)
1483  # This will visit all the paths and endpaths that are scheduled to run,
1484  # as well as the Tasks associated to them and the schedule. It remembers
1485  # the modules, ESSources, ESProducers, and services it visits.
1486  nodeVisitor = NodeVisitor()
1487  self._insertPaths(adaptor, nodeVisitor)
1488  all_modules_onTasksOrScheduled = { key:value for key, value in all_modules.items() if value in nodeVisitor.modules }
1489  self._insertManyInto(adaptor, "@all_modules", all_modules_onTasksOrScheduled, True)
1490  all_switches = self.switchProducers_().copy()
1491  all_switches_onTasksOrScheduled = {key:value for key, value in all_switches.items() if value in nodeVisitor.modules }
1492  self._insertSwitchProducersInto(adaptor, "@all_modules", "@all_aliases", all_switches_onTasksOrScheduled, True)
1493  # Same as nodeVisitor except this one visits all the Tasks attached
1494  # to the process.
1495  processNodeVisitor = NodeVisitor()
1496  for pTask in self.tasks.values():
1497  pTask.visit(processNodeVisitor)
1498  esProducersToEnable = {}
1499  for esProducerName, esProducer in self.es_producers_().items():
1500  if esProducer in nodeVisitor.esProducers or not (esProducer in processNodeVisitor.esProducers):
1501  esProducersToEnable[esProducerName] = esProducer
1502  self._insertManyInto(adaptor, "@all_esmodules", esProducersToEnable, True)
1503  esSourcesToEnable = {}
1504  for esSourceName, esSource in self.es_sources_().items():
1505  if esSource in nodeVisitor.esSources or not (esSource in processNodeVisitor.esSources):
1506  esSourcesToEnable[esSourceName] = esSource
1507  self._insertManyInto(adaptor, "@all_essources", esSourcesToEnable, True)
1508  #handle services differently
1509  services = []
1510  for serviceName, serviceObject in self.services_().items():
1511  if serviceObject in nodeVisitor.services or not (serviceObject in processNodeVisitor.services):
1512  serviceObject.insertInto(ServiceInjectorAdaptor(adaptor,services))
1513  adaptor.addVPSet(False,"services",services)
1514  return processPSet
1515 
1516  def validate(self):
1517  # check if there's some input
1518  # Breaks too many unit tests for now
1519  #if self.source_() == None and self.looper_() == None:
1520  # raise RuntimeError("No input source was found for this process")
1521  pass
1522 
1523  def handleProcessAccelerators(self, parameterSet):
1524  # 'cpu' accelerator is always implicitly there
1525  allAccelerators = set(["cpu"])
1526  availableAccelerators = set(["cpu"])
1527  for acc in self.__dict__['_Process__accelerators'].values():
1528  allAccelerators.update(acc.labels())
1529  availableAccelerators.update(acc.enabledLabels())
1530  availableAccelerators = sorted(list(availableAccelerators))
1531  parameterSet.addVString(False, "@available_accelerators", availableAccelerators)
1532 
1533  # Resolve wildcards
1534  selectedAccelerators = []
1535  if "*" in self.options.accelerators:
1536  if len(self.options.accelerators) >= 2:
1537  raise ValueError("process.options.accelerators may contain '*' only as the only element, now it has {} elements".format(len(self.options.accelerators)))
1538  selectedAccelerators = availableAccelerators
1539  else:
1540  import fnmatch
1541  resolved = set()
1542  invalid = []
1543  for pattern in self.options.accelerators:
1544  acc = [a for a in availableAccelerators if fnmatch.fnmatchcase(a, pattern)]
1545  if len(acc) == 0:
1546  if not any(fnmatch.fnmatchcase(a, pattern) for a in allAccelerators):
1547  invalid.append(pattern)
1548  else:
1549  resolved.update(acc)
1550  # Sanity check
1551  if len(invalid) != 0:
1552  raise ValueError("Invalid pattern{} of '{}' in process.options.accelerators, valid values are '{}' or a pattern matching some of them.".format(
1553  "s" if len(invalid) > 2 else "",
1554  "', '".join(invalid),
1555  "', '".join(sorted(list(allAccelerators)))))
1556  selectedAccelerators = sorted(list(resolved))
1557  parameterSet.addVString(False, "@selected_accelerators", selectedAccelerators)
1558 
1559  # Get and apply module type resolver
1560  moduleTypeResolver = None
1561  moduleTypeResolverPlugin = ""
1562  for acc in self.__dict__['_Process__accelerators'].values():
1563  resolver = acc.moduleTypeResolver(selectedAccelerators)
1564  if resolver is not None:
1565  if moduleTypeResolver is not None:
1566  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(
1567  moduleTypeResolver.__class__.__name__,
1568  acc.__class__.__name__,
1569  resolver.__class__.__name__))
1570  moduleTypeResolver = resolver
1571  if moduleTypeResolver is not None:
1572  # Plugin name and its configuration
1573  moduleTypeResolverPlugin = moduleTypeResolver.plugin()
1574 
1575  # Customize modules
1576  for modlist in [self.producers_, self.filters_, self.analyzers_,
1577  self.es_producers_, self.es_sources_]:
1578  for module in modlist().values():
1579  moduleTypeResolver.setModuleVariant(module)
1580 
1581  parameterSet.addString(False, "@module_type_resolver", moduleTypeResolverPlugin)
1582 
1583  # Customize process
1584  wrapped = ProcessForProcessAccelerator(self)
1585  for acc in self.__dict__['_Process__accelerators'].values():
1586  acc.apply(wrapped, selectedAccelerators)
1587 
1588  def prefer(self, esmodule,*args,**kargs):
1589  """Prefer this ES source or producer. The argument can
1590  either be an object label, e.g.,
1591  process.prefer(process.juicerProducer) (not supported yet)
1592  or a name of an ESSource or ESProducer
1593  process.prefer("juicer")
1594  or a type of unnamed ESSource or ESProducer
1595  process.prefer("JuicerProducer")
1596  In addition, you can pass as a labelled arguments the name of the Record you wish to
1597  prefer where the type passed is a cms.vstring and that vstring can contain the
1598  name of the C++ types in the Record that are being preferred, e.g.,
1599  #prefer all data in record 'OrangeRecord' from 'juicer'
1600  process.prefer("juicer", OrangeRecord=cms.vstring())
1601  or
1602  #prefer only "Orange" data in "OrangeRecord" from "juicer"
1603  process.prefer("juicer", OrangeRecord=cms.vstring("Orange"))
1604  or
1605  #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
1606  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
1607  """
1608  # see if this refers to a named ESProducer
1609  if isinstance(esmodule, ESSource) or isinstance(esmodule, ESProducer):
1610  raise RuntimeError("Syntax of process.prefer(process.esmodule) not supported yet")
1611  elif self._findPreferred(esmodule, self.es_producers_(),*args,**kargs) or \
1612  self._findPreferred(esmodule, self.es_sources_(),*args,**kargs):
1613  pass
1614  else:
1615  raise RuntimeError("Cannot resolve prefer for "+repr(esmodule))
1616 
1617  def _findPreferred(self, esname, d,*args,**kargs):
1618  # is esname a name in the dictionary?
1619  if esname in d:
1620  typ = d[esname].type_()
1621  if typ == esname:
1622  self.__setattr__( esname+"_prefer", ESPrefer(typ,*args,**kargs) )
1623  else:
1624  self.__setattr__( esname+"_prefer", ESPrefer(typ, esname,*args,**kargs) )
1625  return True
1626  else:
1627  # maybe it's an unnamed ESModule?
1628  found = False
1629  for name, value in d.items():
1630  if value.type_() == esname:
1631  if found:
1632  raise RuntimeError("More than one ES module for "+esname)
1633  found = True
1634  self.__setattr__(esname+"_prefer", ESPrefer(d[esname].type_()) )
1635  return found
1636 
1637 
1639  def __init__(self, process):
1640  if isinstance(process, Process):
1641  self.__process = process
1642  elif isinstance(process, str):
1643  self.__process = Process(process)
1644  #make sure we do not override the defaults
1645  del self.__process.options
1646  del self.__process.maxEvents
1647  del self.__process.maxLuminosityBlocks
1648  else:
1649  raise TypeError('a ProcessFragment can only be constructed from an existig Process or from process name')
1650  def __dir__(self):
1651  return [ x for x in dir(self.__process) if isinstance(getattr(self.__process, x), _ConfigureComponent) ]
1652  def __getattribute__(self, name):
1653  if name == '_ProcessFragment__process':
1654  return object.__getattribute__(self, '_ProcessFragment__process')
1655  else:
1656  return getattr(self.__process, name)
1657  def __setattr__(self, name, value):
1658  if name == '_ProcessFragment__process':
1659  object.__setattr__(self, name, value)
1660  else:
1661  setattr(self.__process, name, value)
1662  def __delattr__(self, name):
1663  if name == '_ProcessFragment__process':
1664  pass
1665  else:
1666  return delattr(self.__process, name)
1667 
1668 
1669 class FilteredStream(dict):
1670  """a dictionary with fixed keys"""
1672  raise AttributeError("An FilteredStream defintion cannot be modified after creation.")
1673  _blocked_attribute = property(_blocked_attribute)
1674  __setattr__ = __delitem__ = __setitem__ = clear = _blocked_attribute
1675  pop = popitem = setdefault = update = _blocked_attribute
1676  def __new__(cls, *args, **kw):
1677  new = dict.__new__(cls)
1678  dict.__init__(new, *args, **kw)
1679  keys = sorted(kw.keys())
1680  if keys != ['content', 'dataTier', 'name', 'paths', 'responsible', 'selectEvents']:
1681  raise ValueError("The needed parameters are: content, dataTier, name, paths, responsible, selectEvents")
1682  if not isinstance(kw['name'],str):
1683  raise ValueError("name must be of type string")
1684  if not isinstance(kw['content'], vstring) and not isinstance(kw['content'],str):
1685  raise ValueError("content must be of type vstring or string")
1686  if not isinstance(kw['dataTier'], string):
1687  raise ValueError("dataTier must be of type string")
1688  if not isinstance(kw['selectEvents'], PSet):
1689  raise ValueError("selectEvents must be of type PSet")
1690  if not isinstance(kw['paths'],(tuple, Path)):
1691  raise ValueError("'paths' must be a tuple of paths")
1692  return new
1693  def __init__(self, *args, **kw):
1694  pass
1695  def __repr__(self):
1696  return "FilteredStream object: %s" %self["name"]
1697  def __getattr__(self,attr):
1698  return self[attr]
1699 
1701  """Allows embedding another process within a parent process. This allows one to
1702  chain processes together directly in one cmsRun job rather than having to run
1703  separate jobs that are connected via a temporary file.
1704  """
1705  def __init__(self,process, SelectEvents = untracked.PSet(), outputCommands = untracked.vstring()):
1706  """
1707  """
1708  if not isinstance(process, Process):
1709  raise ValueError("the 'process' argument must be of type cms.Process")
1710  if not isinstance(SelectEvents,PSet):
1711  raise ValueError("the 'SelectEvents' argument must be of type cms.untracked.PSet")
1712  if not isinstance(outputCommands,vstring):
1713  raise ValueError("the 'outputCommands' argument must be of type cms.untracked.vstring")
1714  self.__process = process
1715  self.__SelectEvents = SelectEvents
1716  self.__outputCommands = outputCommands
1717  # Need to remove MessageLogger from the subprocess now that MessageLogger is always present
1718  if self.__process.MessageLogger is not MessageLogger:
1719  print("""Warning: You have reconfigured service
1720 'edm::MessageLogger' in a subprocess.
1721 This service has already been configured.
1722 This particular service may not be reconfigured in a subprocess.
1723 The reconfiguration will be ignored.""")
1724  del self.__process.MessageLogger
1725  def dumpPython(self, options=PrintOptions()):
1726  out = "parentProcess"+str(hash(self))+" = process\n"
1727  out += self.__process.dumpPython()
1728  out += "childProcess = process\n"
1729  out += "process = parentProcess"+str(hash(self))+"\n"
1730  out += "process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = "+self.__SelectEvents.dumpPython(options) +", outputCommands = "+self.__outputCommands.dumpPython(options) +"))"
1731  return out
1732  def getProcessName(self):
1733  return self.__process.name_()
1734  def process(self):
1735  return self.__process
1736  def SelectEvents(self):
1737  return self.__SelectEvents
1738  def outputCommands(self):
1739  return self.__outputCommands
1740  def type_(self):
1741  return 'subProcess'
1742  def nameInProcessDesc_(self,label):
1743  return label
1744  def _place(self,label,process):
1745  process._placeSubProcess('subProcess',self)
1746  def getSubProcessPSet(self,parameterSet):
1747  topPSet = parameterSet.newPSet()
1748  self.__process.fillProcessDesc(topPSet)
1749  subProcessPSet = parameterSet.newPSet()
1750  self.__SelectEvents.insertInto(subProcessPSet,"SelectEvents")
1751  self.__outputCommands.insertInto(subProcessPSet,"outputCommands")
1752  subProcessPSet.addPSet(False,"process",topPSet)
1753  return subProcessPSet
1754 
1756  """Helper class for Modifier that takes key/value pairs and uses them to reset parameters of the object"""
1757  def __init__(self,args):
1758  self.__args = args
1759  def __call__(self,obj):
1760  params = {}
1761  for k in self.__args.keys():
1762  if hasattr(obj,k):
1763  params[k] = getattr(obj,k)
1765  for k in self.__args.keys():
1766  if k in params:
1767  setattr(obj,k,params[k])
1768  else:
1769  #the parameter must have been removed
1770  delattr(obj,k)
1771  @staticmethod
1773  raise KeyError("Unknown parameter name "+key+" specified while calling Modifier")
1774 
1776  """A helper base class for _AndModifier, _InvertModifier, and _OrModifier to contain the common code"""
1777  def __init__(self, lhs, rhs=None):
1778  self._lhs = lhs
1779  if rhs is not None:
1780  self._rhs = rhs
1781  def toModify(self,obj, func=None,**kw):
1782  Modifier._toModifyCheck(obj,func,**kw)
1783  if self._isChosen():
1784  Modifier._toModify(obj,func,**kw)
1785  return self
1786  def toReplaceWith(self,toObj,fromObj):
1787  Modifier._toReplaceWithCheck(toObj,fromObj)
1788  if self._isChosen():
1789  Modifier._toReplaceWith(toObj,fromObj)
1790  return self
1791  def makeProcessModifier(self,func):
1792  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1793  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1794  In order to work, the value returned from this function must be assigned to a uniquely named variable."""
1795  return ProcessModifier(self,func)
1796  def __and__(self, other):
1797  return _AndModifier(self,other)
1798  def __invert__(self):
1799  return _InvertModifier(self)
1800  def __or__(self, other):
1801  return _OrModifier(self,other)
1802 
1804  """A modifier which only applies if multiple Modifiers are chosen"""
1805  def __init__(self, lhs, rhs):
1806  super(_AndModifier,self).__init__(lhs, rhs)
1807  def _isChosen(self):
1808  return self._lhs._isChosen() and self._rhs._isChosen()
1809 
1811  """A modifier which only applies if a Modifier is not chosen"""
1812  def __init__(self, lhs):
1813  super(_InvertModifier,self).__init__(lhs)
1814  def _isChosen(self):
1815  return not self._lhs._isChosen()
1816 
1818  """A modifier which only applies if at least one of multiple Modifiers is chosen"""
1819  def __init__(self, lhs, rhs):
1820  super(_OrModifier,self).__init__(lhs, rhs)
1821  def _isChosen(self):
1822  return self._lhs._isChosen() or self._rhs._isChosen()
1823 
1824 
1826  """This class is used to define standard modifications to a Process.
1827  An instance of this class is declared to denote a specific modification,e.g. era2017 could
1828  reconfigure items in a process to match our expectation of running in 2017. Once declared,
1829  these Modifier instances are imported into a configuration and items that need to be modified
1830  are then associated with the Modifier and with the action to do the modification.
1831  The registered modifications will only occur if the Modifier was passed to
1832  the cms.Process' constructor.
1833  """
1834  def __init__(self):
1836  self.__chosen = False
1837  def makeProcessModifier(self,func):
1838  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1839  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1840  In order to work, the value returned from this function must be assigned to a uniquely named variable.
1841  """
1842  return ProcessModifier(self,func)
1843  @staticmethod
1844  def _toModifyCheck(obj,func,**kw):
1845  if func is not None and len(kw) != 0:
1846  raise TypeError("toModify takes either two arguments or one argument and key/value pairs")
1847  def toModify(self,obj, func=None,**kw):
1848  """This is used to register an action to be performed on the specific object. Two different forms are allowed
1849  Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1850  that will be the object passed in as the first argument.
1851  Form 2: A list of parameter name, value pairs can be passed
1852  mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1853  This form can also be used to remove a parameter by passing the value of None
1854  #remove the parameter foo.fred
1855  mod.toModify(foo, fred = None)
1856  Additionally, parameters embedded within PSets can also be modified using a dictionary
1857  #change foo.fred.pebbles to 3 and foo.fred.friend to "barney"
1858  mod.toModify(foo, fred = dict(pebbles = 3, friend = "barney)) )
1859  """
1860  Modifier._toModifyCheck(obj,func,**kw)
1861  if self._isChosen():
1862  Modifier._toModify(obj,func,**kw)
1863  return self
1864  @staticmethod
1865  def _toModify(obj,func,**kw):
1866  if func is not None:
1867  func(obj)
1868  else:
1869  temp =_ParameterModifier(kw)
1870  temp(obj)
1871  @staticmethod
1872  def _toReplaceWithCheck(toObj,fromObj):
1873  if not isinstance(fromObj, type(toObj)):
1874  raise TypeError("toReplaceWith requires both arguments to be the same class type")
1875  def toReplaceWith(self,toObj,fromObj):
1876  """If the Modifier is chosen the internals of toObj will be associated with the internals of fromObj
1877  """
1878  Modifier._toReplaceWithCheck(toObj,fromObj)
1879  if self._isChosen():
1880  Modifier._toReplaceWith(toObj,fromObj)
1881  return self
1882  @staticmethod
1883  def _toReplaceWith(toObj,fromObj):
1884  if isinstance(fromObj,_ModuleSequenceType):
1885  toObj._seq = fromObj._seq
1886  toObj._tasks = fromObj._tasks
1887  elif isinstance(fromObj,Task):
1888  toObj._collection = fromObj._collection
1889  elif isinstance(fromObj,ConditionalTask):
1890  toObj._collection = fromObj._collection
1891  elif isinstance(fromObj,_Parameterizable):
1892  #clear old items just incase fromObj is not a complete superset of toObj
1893  for p in toObj.parameterNames_():
1894  delattr(toObj,p)
1895  for p in fromObj.parameterNames_():
1896  setattr(toObj,p,getattr(fromObj,p))
1897  if isinstance(fromObj,_TypedParameterizable):
1898  toObj._TypedParameterizable__type = fromObj._TypedParameterizable__type
1899 
1900  else:
1901  raise TypeError("toReplaceWith does not work with type "+str(type(toObj)))
1902 
1903  def _setChosen(self):
1904  """Should only be called by cms.Process instances"""
1905  self.__chosen = True
1906  def _isChosen(self):
1907  return self.__chosen
1908  def __and__(self, other):
1909  return _AndModifier(self,other)
1910  def __invert__(self):
1911  return _InvertModifier(self)
1912  def __or__(self, other):
1913  return _OrModifier(self,other)
1914  def _isOrContains(self, other):
1915  return self == other
1916 
1917 
1919  """A Modifier made up of a list of Modifiers
1920  """
1921  def __init__(self, *chainedModifiers):
1922  self.__chosen = False
1923  self.__chain = chainedModifiers
1924  def _applyNewProcessModifiers(self,process):
1925  """Should only be called by cms.Process instances
1926  applies list of accumulated changes to the process"""
1927  for m in self.__chain:
1928  m._applyNewProcessModifiers(process)
1929  def _setChosen(self):
1930  """Should only be called by cms.Process instances"""
1931  self.__chosen = True
1932  for m in self.__chain:
1933  m._setChosen()
1934  def _isChosen(self):
1935  return self.__chosen
1936  def copyAndExclude(self, toExclude):
1937  """Creates a new ModifierChain which is a copy of
1938  this ModifierChain but excludes any Modifier or
1939  ModifierChain in the list toExclude.
1940  The exclusion is done recursively down the chain.
1941  """
1942  newMods = []
1943  for m in self.__chain:
1944  if m not in toExclude:
1945  s = m
1946  if isinstance(m,ModifierChain):
1947  s = m.__copyIfExclude(toExclude)
1948  newMods.append(s)
1949  return ModifierChain(*newMods)
1950  def __copyIfExclude(self,toExclude):
1951  shouldCopy = False
1952  for m in toExclude:
1953  if self._isOrContains(m):
1954  shouldCopy = True
1955  break
1956  if shouldCopy:
1957  return self.copyAndExclude(toExclude)
1958  return self
1959  def _isOrContains(self, other):
1960  if self is other:
1961  return True
1962  for m in self.__chain:
1963  if m._isOrContains(other):
1964  return True
1965  return False
1966 
1968  """A class used by a Modifier to affect an entire Process instance.
1969  When a Process 'loads' a module containing a ProcessModifier, that
1970  ProcessModifier will be applied to the Process if and only if the
1971  Modifier passed to the constructor has been chosen.
1972  """
1973  def __init__(self, modifier, func):
1974  self.__modifier = modifier
1975  self.__func = func
1976  self.__seenProcesses = set()
1977  def apply(self,process):
1978  if self.__modifier._isChosen():
1979  if process not in self.__seenProcesses:
1980  self.__func(process)
1981  self.__seenProcesses.add(process)
1982 
1984  """A class used to specify possible compute accelerators in a Process
1985  instance. It is intended to be derived for any
1986  accelerator/portability technology, and provides hooks such that a
1987  specific customization can be applied to the Process on a worker
1988  node at the point where the python configuration is serialized for C++.
1989 
1990  The customization must not change the configuration hash. To
1991  enforce this reuirement, the customization gets a
1992  ProcessForProcessAccelerator wrapper that gives access to only
1993  those parts of the configuration that can be changed. Nevertheless
1994  it would be good to have specific unit test for each deriving
1995  class to ensure that all combinations of the enabled accelerators
1996  give the same configuration hash.
1997 
1998  The deriving class must do its checks for hardware availability
1999  only in enabledLabels(), and possibly in apply() if any further
2000  fine-tuning is needed, because those two are the only functions
2001  that are guaranteed to be called at the worker node.
2002  """
2003  def __init__(self):
2004  pass
2005  def _place(self, name, proc):
2006  proc._placeAccelerator(self.type_(), self)
2007  def type_(self):
2008  return type(self).__name__
2009  def dumpPython(self, options=PrintOptions()):
2010  specialImportRegistry.registerUse(self)
2011  result = self.__class__.__name__+"(" # not including cms. since the deriving classes are not in cms "namespace"
2012  options.indent()
2013  res = self.dumpPythonImpl(options)
2014  options.unindent()
2015  if len(res) > 0:
2016  result += "\n"+res+"\n"
2017  result += ")\n"
2018  return result
2019 
2020  # The following methods are hooks to be overridden (if needed) in the deriving class
2021  def dumpPythonImpl(self, options):
2022  """Override if need to add any 'body' content to dumpPython(). Returns a string."""
2023  return ""
2024  def labels(self):
2025  """Override to return a list of strings for the accelerator labels."""
2026  return []
2027  def enabledLabels(self):
2028  """Override to return a list of strings for the accelerator labels
2029  that are enabled in the system the job is being run on."""
2030  return []
2031  def moduleTypeResolver(self, accelerators):
2032  """Override to return an object that implements "module type resolver"
2033  in python. The object should have the following methods
2034  - __init__(self, accelerators)
2035  * accelerators = list of selected accelerators
2036  - plugin(self):
2037  * should return a string for the type resolver plugin name
2038  - setModuleVariant(self, module):
2039  * Called for each ED and ES module. Should act only if
2040  module.type_() contains the magic identifier
2041 
2042  At most one of the ProcessAccelerators in a job can return a
2043 non-None object
2044  """
2045  return None
2046  def apply(self, process, accelerators):
2047  """Override if need to customize the Process at worker node. The
2048  selected available accelerator labels are given in the
2049  'accelerators' argument (the patterns, e.g. '*' have been
2050  expanded to concrete labels).
2051 
2052  This function may touch only untracked parameters.
2053  """
2054  pass
2055 
2056 class ProcessForProcessAccelerator(object):
2057  """This class is inteded to wrap the Process object to constrain the
2058  available functionality for ProcessAccelerator.apply()"""
2059  def __init__(self, process):
2060  self.__process = process
2061  def __getattr__(self, label):
2062  value = getattr(self.__process, label)
2063  if not isinstance(value, Service):
2064  raise TypeError("ProcessAccelerator.apply() can get only Services. Tried to get {} with label {}".format(str(type(value)), label))
2065  return value
2066  def __setattr__(self, label, value):
2067  if label == "_ProcessForProcessAccelerator__process":
2068  super().__setattr__(label, value)
2069  else:
2070  if not isinstance(value, Service):
2071  raise TypeError("ProcessAccelerator.apply() can only set Services. Tried to set {} with label {}".format(str(type(value)), label))
2072  setattr(self.__process, label, value)
2073  def __delattr__(self, label):
2074  value = getattr(self.__process, label)
2075  if not isinstance(value, Service):
2076  raise TypeError("ProcessAccelerator.apply() can delete only Services. Tried to del {} with label {}".format(str(type(value)), label))
2077  delattr(self.__process, label)
2078  def add_(self, value):
2079  if not isinstance(value, Service):
2080  raise TypeError("ProcessAccelerator.apply() can only add Services. Tried to set {} with label {}".format(str(type(value)), label))
2081  self.__process.add_(value)
2082 
2083 # Need to be a module-level function for the configuration with a
2084 # SwitchProducer to be pickleable.
2086  return ("test1" in accelerators, -10)
2088  return ("test2" in accelerators, -9)
2089 
2090 if __name__=="__main__":
2091  import unittest
2092  import copy
2093 
2094  def _lineDiff(newString, oldString):
2095  newString = ( x for x in newString.split('\n') if len(x) > 0)
2096  oldString = [ x for x in oldString.split('\n') if len(x) > 0]
2097  diff = []
2098  oldStringLine = 0
2099  for l in newString:
2100  if oldStringLine >= len(oldString):
2101  diff.append(l)
2102  continue
2103  if l == oldString[oldStringLine]:
2104  oldStringLine +=1
2105  continue
2106  diff.append(l)
2107  return "\n".join( diff )
2108 
2110  """Has same interface as the C++ object that creates PSets
2111  """
2112  def __init__(self):
2113  self.values = dict()
2114  def __insertValue(self,tracked,label,value):
2115  self.values[label]=(tracked,value)
2116  def __getValue(self,tracked,label):
2117  pair = self.values[label]
2118  if pair[0] != tracked:
2119  raise Exception("Asked for %s parameter '%s', but it is %s" % ("tracked" if tracked else "untracked",
2120  label,
2121  "tracked" if pair[0] else "untracked"))
2122  return pair[1]
2123  def addInt32(self,tracked,label,value):
2124  self.__insertValue(tracked,label,value)
2125  def addVInt32(self,tracked,label,value):
2126  self.__insertValue(tracked,label,value)
2127  def addUInt32(self,tracked,label,value):
2128  self.__insertValue(tracked,label,value)
2129  def addVUInt32(self,tracked,label,value):
2130  self.__insertValue(tracked,label,value)
2131  def addInt64(self,tracked,label,value):
2132  self.__insertValue(tracked,label,value)
2133  def addVInt64(self,tracked,label,value):
2134  self.__insertValue(tracked,label,value)
2135  def addUInt64(self,tracked,label,value):
2136  self.__insertValue(tracked,label,value)
2137  def addVUInt64(self,tracked,label,value):
2138  self.__insertValue(tracked,label,value)
2139  def addDouble(self,tracked,label,value):
2140  self.__insertValue(tracked,label,value)
2141  def addVDouble(self,tracked,label,value):
2142  self.__insertValue(tracked,label,value)
2143  def addBool(self,tracked,label,value):
2144  self.__insertValue(tracked,label,value)
2145  def addString(self,tracked,label,value):
2146  self.__insertValue(tracked,label,value)
2147  def addVString(self,tracked,label,value):
2148  self.__insertValue(tracked,label,value)
2149  def getVString(self,tracked,label):
2150  return self.__getValue(tracked, label)
2151  def addInputTag(self,tracked,label,value):
2152  self.__insertValue(tracked,label,value)
2153  def addVInputTag(self,tracked,label,value):
2154  self.__insertValue(tracked,label,value)
2155  def addESInputTag(self,tracked,label,value):
2156  self.__insertValue(tracked,label,value)
2157  def addVESInputTag(self,tracked,label,value):
2158  self.__insertValue(tracked,label,value)
2159  def addEventID(self,tracked,label,value):
2160  self.__insertValue(tracked,label,value)
2161  def addVEventID(self,tracked,label,value):
2162  self.__insertValue(tracked,label,value)
2163  def addLuminosityBlockID(self,tracked,label,value):
2164  self.__insertValue(tracked,label,value)
2165  def addLuminosityBlockID(self,tracked,label,value):
2166  self.__insertValue(tracked,label,value)
2167  def addEventRange(self,tracked,label,value):
2168  self.__insertValue(tracked,label,value)
2169  def addVEventRange(self,tracked,label,value):
2170  self.__insertValue(tracked,label,value)
2171  def addPSet(self,tracked,label,value):
2172  self.__insertValue(tracked,label,value)
2173  def addVPSet(self,tracked,label,value):
2174  self.__insertValue(tracked,label,value)
2175  def addFileInPath(self,tracked,label,value):
2176  self.__insertValue(tracked,label,value)
2177  def newPSet(self):
2178  return TestMakePSet()
2179 
2181  def __init__(self, **kargs):
2182  super(SwitchProducerTest,self).__init__(
2183  dict(
2184  test1 = lambda accelerators: (True, -10),
2185  test2 = lambda accelerators: (True, -9),
2186  test3 = lambda accelerators: (True, -8),
2187  test4 = lambda accelerators: (True, -7)
2188  ), **kargs)
2189  specialImportRegistry.registerSpecialImportForType(SwitchProducerTest, "from test import SwitchProducerTest")
2190 
2192  def __init__(self, **kargs):
2193  super(SwitchProducerTest2,self).__init__(
2194  dict(
2195  test1 = _switchproducer_test2_case1,
2196  test2 = _switchproducer_test2_case2,
2197  ), **kargs)
2198  specialImportRegistry.registerSpecialImportForType(SwitchProducerTest2, "from test import SwitchProducerTest2")
2199 
2201  def __init__(self, accelerators):
2202  # first element is used as the default is nothing is set
2204  if "test1" in accelerators:
2205  self._valid_backends.append("test1_backend")
2206  if "test2" in accelerators:
2207  self._valid_backends.append("test2_backend")
2208  if len(self._valid_backends) == 0:
2209  raise EDMException(edm.errors.UnavailableAccelerator, "Machine has no accelerators that Test supports (has {})".format(", ".join(accelerators)))
2210 
2211  def plugin(self):
2212  return "TestModuleTypeResolver"
2213 
2214  def setModuleVariant(self, module):
2215  if "@test" in module.type_():
2216  defaultBackend = self._valid_backends[0]
2217  if hasattr(module, "test"):
2218  if hasattr(module.test, "backend"):
2219  if module.test.backend.value() not in self._valid_backends:
2220  raise EDMException(edm.errors.UnavailableAccelerator, "Module {} has the Test backend set explicitly, but its accelerator is not available for the job".format(module.label_()))
2221  else:
2222  module.test.backend = untracked.string(defaultBackend)
2223  else:
2224  module.test = untracked.PSet(
2225  backend = untracked.string(defaultBackend)
2226  )
2227 
2229  def __init__(self, enabled=["test1", "test2", "anothertest3"], moduleTypeResolverMaker=None):
2230  super().__init__()
2231  self._labels = ["test1", "test2", "anothertest3"]
2232  self.setEnabled(enabled)
2233  self._moduleTypeResolverMaker = moduleTypeResolverMaker
2234  def setEnabled(self, enabled):
2235  invalid = set(enabled).difference(set(self._labels))
2236  if len(invalid) > 0:
2237  raise Exception("Tried to enabled nonexistent test accelerators {}".format(",".join(invalid)))
2238  self._enabled = enabled[:]
2239  def dumpPythonImpl(self,options):
2240  result = "{}enabled = [{}]".format(options.indentation(),
2241  ", ".join(["'{}'".format(e) for e in self._enabled]))
2242  return result
2243  def labels(self):
2244  return self._labels
2245  def enabledLabels(self):
2246  return self._enabled
2247  def moduleTypeResolver(self, accelerators):
2248  if not self._moduleTypeResolverMaker:
2249  return super().moduleTypeResolver(accelerators)
2250  return self._moduleTypeResolverMaker(accelerators)
2251  def apply(self, process, accelerators):
2252  process.AcceleratorTestService = Service("AcceleratorTestService")
2253  if hasattr(process, "AcceleratorTestServiceRemove"):
2254  del process.AcceleratorTestServiceRemove
2255  specialImportRegistry.registerSpecialImportForType(ProcessAcceleratorTest, "from test import ProcessAcceleratorTest")
2256 
2258  def __init__(self, enabled=["anothertest3", "anothertest4"], moduleTypeResolverMaker=None):
2259  super().__init__()
2260  self._labels = ["anothertest3", "anothertest4"]
2261  self.setEnabled(enabled)
2262  self._moduleTypeResolverMaker = moduleTypeResolverMaker
2263  def setEnabled(self, enabled):
2264  invalid = set(enabled).difference(set(self._labels))
2265  if len(invalid) > 0:
2266  raise Exception("Tried to enabled nonexistent test accelerators {}".format(",".join(invalid)))
2267  self._enabled = enabled[:]
2268  def dumpPythonImpl(self,options):
2269  result = "{}enabled = [{}]".format(options.indentation(),
2270  ", ".join(["'{}'".format(e) for e in self._enabled]))
2271  return result
2272  def labels(self):
2273  return self._labels
2274  def enabledLabels(self):
2275  return self._enabled
2276  def moduleTypeResolver(self, accelerators):
2277  if not self._moduleTypeResolverMaker:
2278  return super().moduleTypeResolver(accelerators)
2279  return self._moduleTypeResolverMaker(accelerators)
2280  def apply(self, process, accelerators):
2281  pass
2282  specialImportRegistry.registerSpecialImportForType(ProcessAcceleratorTest2, "from test import ProcessAcceleratorTest2")
2283 
2284  class TestModuleCommand(unittest.TestCase):
2285  def setUp(self):
2286  """Nothing to do """
2287  None
2289  p = _Parameterizable()
2290  self.assertEqual(len(p.parameterNames_()),0)
2291  p.a = int32(1)
2292  self.assertTrue('a' in p.parameterNames_())
2293  self.assertEqual(p.a.value(), 1)
2294  p.a = 10
2295  self.assertEqual(p.a.value(), 10)
2296  p.a = untracked(int32(1))
2297  self.assertEqual(p.a.value(), 1)
2298  self.assertFalse(p.a.isTracked())
2299  p.a = untracked.int32(1)
2300  self.assertEqual(p.a.value(), 1)
2301  self.assertFalse(p.a.isTracked())
2302  p = _Parameterizable(foo=int32(10), bar = untracked(double(1.0)))
2303  self.assertEqual(p.foo.value(), 10)
2304  self.assertEqual(p.bar.value(),1.0)
2305  self.assertFalse(p.bar.isTracked())
2306  self.assertRaises(TypeError,setattr,(p,'c',1))
2307  p = _Parameterizable(a=PSet(foo=int32(10), bar = untracked(double(1.0))))
2308  self.assertEqual(p.a.foo.value(),10)
2309  self.assertEqual(p.a.bar.value(),1.0)
2310  p.b = untracked(PSet(fii = int32(1)))
2311  self.assertEqual(p.b.fii.value(),1)
2312  self.assertFalse(p.b.isTracked())
2313  #test the fact that values can be shared
2314  v = int32(10)
2315  p=_Parameterizable(a=v)
2316  v.setValue(11)
2317  self.assertEqual(p.a.value(),11)
2318  p.a = 12
2319  self.assertEqual(p.a.value(),12)
2320  self.assertEqual(v.value(),12)
2322  p = _TypedParameterizable("blah", b=int32(1))
2323  #see if copy works deeply
2324  other = p.copy()
2325  other.b = 2
2326  self.assertNotEqual(p.b,other.b)
2327 
2329  p = Process("test")
2330  p.a = EDAnalyzer("MyAnalyzer")
2331  self.assertTrue( 'a' in p.analyzers_() )
2332  self.assertTrue( 'a' in p.analyzers)
2333  p.add_(Service("SomeService"))
2334  self.assertTrue('SomeService' in p.services_())
2335  self.assertEqual(p.SomeService.type_(), "SomeService")
2336  p.Tracer = Service("Tracer")
2337  self.assertTrue('Tracer' in p.services_())
2338  self.assertRaises(TypeError, setattr, *(p,'b',"this should fail"))
2339  self.assertRaises(TypeError, setattr, *(p,'bad',Service("MessageLogger")))
2340  self.assertRaises(ValueError, setattr, *(p,'bad',Source("PoolSource")))
2341  p.out = OutputModule("Outer")
2342  self.assertEqual(p.out.type_(), 'Outer')
2343  self.assertTrue( 'out' in p.outputModules_() )
2344 
2345  p.geom = ESSource("GeomProd")
2346  self.assertTrue('geom' in p.es_sources_())
2347  p.add_(ESSource("ConfigDB"))
2348  self.assertTrue('ConfigDB' in p.es_sources_())
2349 
2350  p.aliasfoo1 = EDAlias(foo1 = VPSet(PSet(type = string("Foo1"))))
2351  self.assertTrue('aliasfoo1' in p.aliases_())
2352 
2354  class FromArg(object):
2355  def __init__(self,*arg,**args):
2356  for name in args.keys():
2357  self.__dict__[name]=args[name]
2358 
2359  a=EDAnalyzer("MyAnalyzer")
2360  t=EDAnalyzer("MyAnalyzer")
2361  t.setLabel("foo")
2362  s1 = Sequence(a)
2363  s2 = Sequence(s1)
2364  s3 = Sequence(s2)
2365  d = FromArg(
2366  a=a,
2367  b=Service("Full"),
2368  c=Path(a),
2369  d=s2,
2370  e=s1,
2371  f=s3,
2372  g=Sequence(s1+s2+s3)
2373  )
2374  p = Process("Test")
2375  p.extend(d)
2376  self.assertEqual(p.a.type_(),"MyAnalyzer")
2377  self.assertEqual(p.a.label_(),"a")
2378  self.assertRaises(AttributeError,getattr,p,'b')
2379  self.assertEqual(p.Full.type_(),"Full")
2380  self.assertEqual(str(p.c),'a')
2381  self.assertEqual(str(p.d),'a')
2382 
2383  z1 = FromArg(
2384  a=a,
2385  b=Service("Full"),
2386  c=Path(a),
2387  d=s2,
2388  e=s1,
2389  f=s3,
2390  s4=s3,
2391  g=Sequence(s1+s2+s3)
2392  )
2393 
2394  p1 = Process("Test")
2395  #p1.extend(z1)
2396  self.assertRaises(ValueError, p1.extend, z1)
2397 
2398  z2 = FromArg(
2399  a=a,
2400  b=Service("Full"),
2401  c=Path(a),
2402  d=s2,
2403  e=s1,
2404  f=s3,
2405  aaa=copy.deepcopy(a),
2406  s4=copy.deepcopy(s3),
2407  g=Sequence(s1+s2+s3),
2408  t=t
2409  )
2410  p2 = Process("Test")
2411  p2.extend(z2)
2412  #self.assertRaises(ValueError, p2.extend, z2)
2413  self.assertEqual(p2.s4.label_(),"s4")
2414  #p2.s4.setLabel("foo")
2415  self.assertRaises(ValueError, p2.s4.setLabel, "foo")
2416  p2.s4.setLabel("s4")
2417  p2.s4.setLabel(None)
2418  p2.s4.setLabel("foo")
2419  p2._Process__setObjectLabel(p2.s4, "foo")
2420  p2._Process__setObjectLabel(p2.s4, None)
2421  p2._Process__setObjectLabel(p2.s4, "bar")
2422 
2423 
2424  p = Process('test')
2425  p.a = EDProducer("MyProducer")
2426  p.t = Task(p.a)
2427  p.p = Path(p.t)
2428  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2429  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2430  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2431 
2432  p = Process('test')
2433  p.a = EDProducer("MyProducer")
2434  p.t = ConditionalTask(p.a)
2435  p.p = Path(p.t)
2436  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2437  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2438  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2439 
2440  p = Process('test')
2441  p.a = EDProducer("MyProducer")
2442  p.s = Sequence(p.a)
2443  p.p = Path(p.s)
2444  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
2445  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
2446  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
2447 
2449  self.assertEqual(Process("test").dumpPython(),
2450 """import FWCore.ParameterSet.Config as cms
2451 
2452 process = cms.Process("test")
2453 
2454 process.maxEvents = cms.untracked.PSet(
2455  input = cms.optional.untracked.int32,
2456  output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
2457 )
2458 
2459 process.maxLuminosityBlocks = cms.untracked.PSet(
2460  input = cms.untracked.int32(-1)
2461 )
2462 
2463 process.options = cms.untracked.PSet(
2464  IgnoreCompletely = cms.untracked.vstring(),
2465  Rethrow = cms.untracked.vstring(),
2466  TryToContinue = cms.untracked.vstring(),
2467  accelerators = cms.untracked.vstring('*'),
2468  allowUnscheduled = cms.obsolete.untracked.bool,
2469  canDeleteEarly = cms.untracked.vstring(),
2470  deleteNonConsumedUnscheduledModules = cms.untracked.bool(True),
2471  dumpOptions = cms.untracked.bool(False),
2472  emptyRunLumiMode = cms.obsolete.untracked.string,
2473  eventSetup = cms.untracked.PSet(
2474  forceNumberOfConcurrentIOVs = cms.untracked.PSet(
2475  allowAnyLabel_=cms.required.untracked.uint32
2476  ),
2477  numberOfConcurrentIOVs = cms.untracked.uint32(0)
2478  ),
2479  fileMode = cms.untracked.string('FULLMERGE'),
2480  forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
2481  holdsReferencesToDeleteEarly = cms.untracked.VPSet(),
2482  makeTriggerResults = cms.obsolete.untracked.bool,
2483  modulesToCallForTryToContinue = cms.untracked.vstring(),
2484  modulesToIgnoreForDeleteEarly = cms.untracked.vstring(),
2485  numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0),
2486  numberOfConcurrentRuns = cms.untracked.uint32(1),
2487  numberOfStreams = cms.untracked.uint32(0),
2488  numberOfThreads = cms.untracked.uint32(1),
2489  printDependencies = cms.untracked.bool(False),
2490  sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
2491  throwIfIllegalParameter = cms.untracked.bool(True),
2492  wantSummary = cms.untracked.bool(False)
2493 )
2494 
2495 process.MessageLogger = cms.Service("MessageLogger",
2496  cerr = cms.untracked.PSet(
2497  FwkReport = cms.untracked.PSet(
2498  limit = cms.untracked.int32(10000000),
2499  reportEvery = cms.untracked.int32(1)
2500  ),
2501  FwkSummary = cms.untracked.PSet(
2502  limit = cms.untracked.int32(10000000),
2503  reportEvery = cms.untracked.int32(1)
2504  ),
2505  INFO = cms.untracked.PSet(
2506  limit = cms.untracked.int32(0)
2507  ),
2508  Root_NoDictionary = cms.untracked.PSet(
2509  limit = cms.untracked.int32(0)
2510  ),
2511  default = cms.untracked.PSet(
2512  limit = cms.untracked.int32(10000000)
2513  ),
2514  enable = cms.untracked.bool(True),
2515  enableStatistics = cms.untracked.bool(False),
2516  lineLength = cms.optional.untracked.int32,
2517  noLineBreaks = cms.optional.untracked.bool,
2518  noTimeStamps = cms.untracked.bool(False),
2519  resetStatistics = cms.untracked.bool(False),
2520  statisticsThreshold = cms.untracked.string('WARNING'),
2521  threshold = cms.untracked.string('INFO'),
2522  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2523  limit = cms.optional.untracked.int32,
2524  reportEvery = cms.untracked.int32(1),
2525  timespan = cms.optional.untracked.int32
2526  )
2527  ),
2528  cout = cms.untracked.PSet(
2529  enable = cms.untracked.bool(False),
2530  enableStatistics = cms.untracked.bool(False),
2531  lineLength = cms.optional.untracked.int32,
2532  noLineBreaks = cms.optional.untracked.bool,
2533  noTimeStamps = cms.optional.untracked.bool,
2534  resetStatistics = cms.untracked.bool(False),
2535  statisticsThreshold = cms.optional.untracked.string,
2536  threshold = cms.optional.untracked.string,
2537  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2538  limit = cms.optional.untracked.int32,
2539  reportEvery = cms.untracked.int32(1),
2540  timespan = cms.optional.untracked.int32
2541  )
2542  ),
2543  debugModules = cms.untracked.vstring(),
2544  default = cms.untracked.PSet(
2545  limit = cms.optional.untracked.int32,
2546  lineLength = cms.untracked.int32(80),
2547  noLineBreaks = cms.untracked.bool(False),
2548  noTimeStamps = cms.untracked.bool(False),
2549  reportEvery = cms.untracked.int32(1),
2550  statisticsThreshold = cms.untracked.string('INFO'),
2551  threshold = cms.untracked.string('INFO'),
2552  timespan = cms.optional.untracked.int32,
2553  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2554  limit = cms.optional.untracked.int32,
2555  reportEvery = cms.untracked.int32(1),
2556  timespan = cms.optional.untracked.int32
2557  )
2558  ),
2559  files = cms.untracked.PSet(
2560  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2561  enableStatistics = cms.untracked.bool(False),
2562  extension = cms.optional.untracked.string,
2563  filename = cms.optional.untracked.string,
2564  lineLength = cms.optional.untracked.int32,
2565  noLineBreaks = cms.optional.untracked.bool,
2566  noTimeStamps = cms.optional.untracked.bool,
2567  output = cms.optional.untracked.string,
2568  resetStatistics = cms.untracked.bool(False),
2569  statisticsThreshold = cms.optional.untracked.string,
2570  threshold = cms.optional.untracked.string,
2571  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2572  limit = cms.optional.untracked.int32,
2573  reportEvery = cms.untracked.int32(1),
2574  timespan = cms.optional.untracked.int32
2575  )
2576  )
2577  ),
2578  suppressDebug = cms.untracked.vstring(),
2579  suppressFwkInfo = cms.untracked.vstring(),
2580  suppressInfo = cms.untracked.vstring(),
2581  suppressWarning = cms.untracked.vstring(),
2582  allowAnyLabel_=cms.optional.untracked.PSetTemplate(
2583  limit = cms.optional.untracked.int32,
2584  reportEvery = cms.untracked.int32(1),
2585  timespan = cms.optional.untracked.int32
2586  )
2587 )
2588 
2589 
2590 """)
2591  p = Process("test")
2592  p.a = EDAnalyzer("MyAnalyzer")
2593  p.p = Path(p.a)
2594  p.s = Sequence(p.a)
2595  p.r = Sequence(p.s)
2596  p.p2 = Path(p.s)
2597  p.schedule = Schedule(p.p2,p.p)
2598  d=p.dumpPython()
2599  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2600 """process.a = cms.EDAnalyzer("MyAnalyzer")
2601 process.s = cms.Sequence(process.a)
2602 process.r = cms.Sequence(process.s)
2603 process.p = cms.Path(process.a)
2604 process.p2 = cms.Path(process.s)
2605 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2606  #Reverse order of 'r' and 's'
2607  p = Process("test")
2608  p.a = EDAnalyzer("MyAnalyzer")
2609  p.p = Path(p.a)
2610  p.r = Sequence(p.a)
2611  p.s = Sequence(p.r)
2612  p.p2 = Path(p.r)
2613  p.schedule = Schedule(p.p2,p.p)
2614  p.b = EDAnalyzer("YourAnalyzer")
2615  d=p.dumpPython()
2616  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2617 """process.a = cms.EDAnalyzer("MyAnalyzer")
2618 process.b = cms.EDAnalyzer("YourAnalyzer")
2619 process.r = cms.Sequence(process.a)
2620 process.s = cms.Sequence(process.r)
2621 process.p = cms.Path(process.a)
2622 process.p2 = cms.Path(process.r)
2623 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2624  #use an anonymous sequence
2625  p = Process("test")
2626  p.a = EDAnalyzer("MyAnalyzer")
2627  p.p = Path(p.a)
2628  s = Sequence(p.a)
2629  p.r = Sequence(s)
2630  p.p2 = Path(p.r)
2631  p.schedule = Schedule(p.p2,p.p)
2632  d=p.dumpPython()
2633  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2634 """process.a = cms.EDAnalyzer("MyAnalyzer")
2635 process.r = cms.Sequence((process.a))
2636 process.p = cms.Path(process.a)
2637 process.p2 = cms.Path(process.r)
2638 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2639 
2640  # include some tasks
2641  p = Process("test")
2642  p.a = EDAnalyzer("MyAnalyzer")
2643  p.b = EDProducer("bProducer")
2644  p.c = EDProducer("cProducer")
2645  p.d = EDProducer("dProducer")
2646  p.e = EDProducer("eProducer")
2647  p.f = EDProducer("fProducer")
2648  p.g = EDProducer("gProducer")
2649  p.task5 = Task()
2650  p.task3 = Task()
2651  p.task2 = Task(p.c, p.task3)
2652  p.task4 = Task(p.f, p.task2)
2653  p.task1 = Task(p.task5)
2654  p.task3.add(p.task1)
2655  p.p = Path(p.a)
2656  s = Sequence(p.a)
2657  p.r = Sequence(s)
2658  p.p2 = Path(p.r, p.task1, p.task2)
2659  p.schedule = Schedule(p.p2,p.p,tasks=[p.task3,p.task4, p.task5])
2660  d=p.dumpPython()
2661  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2662 """process.b = cms.EDProducer("bProducer")
2663 process.c = cms.EDProducer("cProducer")
2664 process.d = cms.EDProducer("dProducer")
2665 process.e = cms.EDProducer("eProducer")
2666 process.f = cms.EDProducer("fProducer")
2667 process.g = cms.EDProducer("gProducer")
2668 process.a = cms.EDAnalyzer("MyAnalyzer")
2669 process.task5 = cms.Task()
2670 process.task1 = cms.Task(process.task5)
2671 process.task3 = cms.Task(process.task1)
2672 process.task2 = cms.Task(process.c, process.task3)
2673 process.task4 = cms.Task(process.f, process.task2)
2674 process.r = cms.Sequence((process.a))
2675 process.p = cms.Path(process.a)
2676 process.p2 = cms.Path(process.r, process.task1, process.task2)
2677 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task3, process.task4, process.task5])""")
2678  # include some conditional tasks
2679  p = Process("test")
2680  p.a = EDAnalyzer("MyAnalyzer")
2681  p.b = EDProducer("bProducer")
2682  p.c = EDProducer("cProducer")
2683  p.d = EDProducer("dProducer")
2684  p.e = EDProducer("eProducer")
2685  p.f = EDProducer("fProducer")
2686  p.g = EDProducer("gProducer")
2687  p.task5 = Task()
2688  p.task3 = Task()
2689  p.task2 = ConditionalTask(p.c, p.task3)
2690  p.task1 = ConditionalTask(p.task5)
2691  p.p = Path(p.a)
2692  s = Sequence(p.a)
2693  p.r = Sequence(s)
2694  p.p2 = Path(p.r, p.task1, p.task2)
2695  p.schedule = Schedule(p.p2,p.p,tasks=[p.task5])
2696  d=p.dumpPython()
2697  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2698 """process.b = cms.EDProducer("bProducer")
2699 process.c = cms.EDProducer("cProducer")
2700 process.d = cms.EDProducer("dProducer")
2701 process.e = cms.EDProducer("eProducer")
2702 process.f = cms.EDProducer("fProducer")
2703 process.g = cms.EDProducer("gProducer")
2704 process.a = cms.EDAnalyzer("MyAnalyzer")
2705 process.task5 = cms.Task()
2706 process.task3 = cms.Task()
2707 process.task2 = cms.ConditionalTask(process.c, process.task3)
2708 process.task1 = cms.ConditionalTask(process.task5)
2709 process.r = cms.Sequence((process.a))
2710 process.p = cms.Path(process.a)
2711 process.p2 = cms.Path(process.r, process.task1, process.task2)
2712 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task5])""")
2713  # only tasks
2714  p = Process("test")
2715  p.d = EDProducer("dProducer")
2716  p.e = EDProducer("eProducer")
2717  p.f = EDProducer("fProducer")
2718  p.g = EDProducer("gProducer")
2719  p.task1 = Task(p.d, p.e)
2720  task2 = Task(p.f, p.g)
2721  p.schedule = Schedule(tasks=[p.task1,task2])
2722  d=p.dumpPython()
2723  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2724 """process.d = cms.EDProducer("dProducer")
2725 process.e = cms.EDProducer("eProducer")
2726 process.f = cms.EDProducer("fProducer")
2727 process.g = cms.EDProducer("gProducer")
2728 process.task1 = cms.Task(process.d, process.e)
2729 process.schedule = cms.Schedule(tasks=[cms.Task(process.f, process.g), process.task1])""")
2730  # empty schedule
2731  p = Process("test")
2732  p.schedule = Schedule()
2733  d=p.dumpPython()
2734  self.assertEqual(_lineDiff(d,Process('test').dumpPython()),
2735 """process.schedule = cms.Schedule()""")
2736 
2737  s = Sequence()
2738  a = EDProducer("A")
2739  s2 = Sequence(a)
2740  s2 += s
2741  process = Process("DUMP")
2742  process.a = a
2743  process.s2 = s2
2744  d=process.dumpPython()
2745  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2746 """process.a = cms.EDProducer("A")
2747 process.s2 = cms.Sequence(process.a)""")
2748  s = Sequence()
2749  s1 = Sequence(s)
2750  a = EDProducer("A")
2751  s3 = Sequence(a+a)
2752  s2 = Sequence(a+s3)
2753  s2 += s1
2754  process = Process("DUMP")
2755  process.a = a
2756  process.s2 = s2
2757  d=process.dumpPython()
2758  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2759 """process.a = cms.EDProducer("A")
2760 process.s2 = cms.Sequence(process.a+(process.a+process.a))""")
2761 
2762  def testSecSource(self):
2763  p = Process('test')
2764  p.a = SecSource("MySecSource")
2765  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),'process.a = cms.SecSource("MySecSource")')
2766 
2768  p = Process('test')
2769  p.a = EDAnalyzer("MyAnalyzer")
2770  old = p.a
2771  p.b = EDAnalyzer("YourAnalyzer")
2772  p.c = EDAnalyzer("OurAnalyzer")
2773  p.d = EDProducer("MyProducer")
2774  old2 = p.d
2775  p.t1 = Task(p.d)
2776  t2 = Task(p.d)
2777  t3 = Task(p.d)
2778  t4 = Task(p.d)
2779  t5 = Task(p.d)
2780  t6 = Task(p.d)
2781  p.ct1 = ConditionalTask(p.d)
2782  s = Sequence(p.a*p.b)
2783  p.s4 = Sequence(p.a*p.b, p.ct1)
2784  s.associate(t2)
2785  p.s4.associate(t2)
2786  p.p = Path(p.c+s+p.a)
2787  p.p2 = Path(p.c+p.s4+p.a, p.ct1)
2788  p.e3 = EndPath(p.c+s+p.a)
2789  new = EDAnalyzer("NewAnalyzer")
2790  new2 = EDProducer("NewProducer")
2791  visitor1 = NodeVisitor()
2792  p.p.visit(visitor1)
2793  self.assertTrue(visitor1.modules == set([old,old2,p.b,p.c]))
2794  p.schedule = Schedule(tasks=[t6])
2795  p.globalReplace("a",new)
2796  p.globalReplace("d",new2)
2797  visitor2 = NodeVisitor()
2798  p.p.visit(visitor2)
2799  self.assertTrue(visitor2.modules == set([new,new2,p.b,p.c]))
2800  self.assertEqual(p.p.dumpPython()[:-1], "cms.Path(process.c+process.a+process.b+process.a, cms.Task(process.d))")
2801  visitor_p2 = NodeVisitor()
2802  p.p2.visit(visitor_p2)
2803  self.assertTrue(visitor_p2.modules == set([new,new2,p.b,p.c]))
2804  self.assertEqual(p.p2.dumpPython()[:-1], "cms.Path(process.c+process.s4+process.a, process.ct1)")
2805  visitor3 = NodeVisitor()
2806  p.e3.visit(visitor3)
2807  self.assertTrue(visitor3.modules == set([new,new2,p.b,p.c]))
2808  visitor4 = NodeVisitor()
2809  p.s4.visit(visitor4)
2810  self.assertTrue(visitor4.modules == set([new,new2,p.b]))
2811  self.assertEqual(p.s4.dumpPython()[:-1],"cms.Sequence(process.a+process.b, cms.Task(process.d), process.ct1)")
2812  visitor5 = NodeVisitor()
2813  p.t1.visit(visitor5)
2814  self.assertTrue(visitor5.modules == set([new2]))
2815  visitor6 = NodeVisitor()
2816  listOfTasks = list(p.schedule._tasks)
2817  listOfTasks[0].visit(visitor6)
2818  self.assertTrue(visitor6.modules == set([new2]))
2819  visitor7 = NodeVisitor()
2820  p.ct1.visit(visitor7)
2821  self.assertTrue(visitor7.modules == set([new2]))
2822  visitor8 = NodeVisitor()
2823  listOfConditionalTasks = list(p.conditionaltasks.values())
2824  listOfConditionalTasks[0].visit(visitor8)
2825  self.assertTrue(visitor8.modules == set([new2]))
2826 
2827 
2828  p.d2 = EDProducer("YourProducer")
2829  p.schedule = Schedule(p.p, p.p2, p.e3, tasks=[p.t1])
2830  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2831  p.p = Path(p.c+s)
2832  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2833  p.e3 = EndPath(p.c)
2834  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2835  p.t1 = Task(p.d2)
2836  self.assertEqual(p.schedule.dumpPython()[:-1], "cms.Schedule(*[ process.p, process.p2, process.e3 ], tasks=[process.t1])")
2837 
2838  def testSequence(self):
2839  p = Process('test')
2840  p.a = EDAnalyzer("MyAnalyzer")
2841  p.b = EDAnalyzer("YourAnalyzer")
2842  p.c = EDAnalyzer("OurAnalyzer")
2843  p.s = Sequence(p.a*p.b)
2844  self.assertEqual(str(p.s),'a+b')
2845  self.assertEqual(p.s.label_(),'s')
2846  path = Path(p.c+p.s)
2847  self.assertEqual(str(path),'c+a+b')
2848  p._validateSequence(path, 'p1')
2849  notInProcess = EDAnalyzer('NotInProcess')
2850  p2 = Path(p.c+p.s*notInProcess)
2851  self.assertRaises(RuntimeError, p._validateSequence, p2, 'p2')
2852 
2853  def testSequence2(self):
2854  p = Process('test')
2855  p.a = EDAnalyzer("MyAnalyzer")
2856  p.b = EDAnalyzer("YourAnalyzer")
2857  p.c = EDAnalyzer("OurAnalyzer")
2858  testseq = Sequence(p.a*p.b)
2859  p.s = testseq
2860  #p.y = testseq
2861  self.assertRaises(ValueError, p.__setattr__, "y", testseq)
2862 
2864  service = Service("d")
2865  self.assertFalse(service._inProcess)
2866  process = Process("test")
2867  process.d = service
2868  self.assertTrue(service._inProcess)
2869  service2 = Service("d")
2870  process.d = service2
2871  self.assertFalse(service._inProcess)
2872  self.assertTrue(service2._inProcess)
2873  del process.d
2874  self.assertFalse(service2._inProcess)
2875 
2876  def testTask(self):
2877 
2878  # create some objects to use in tests
2879  edanalyzer = EDAnalyzer("a")
2880  edproducer = EDProducer("b")
2881  edproducer2 = EDProducer("b2")
2882  edproducer3 = EDProducer("b3")
2883  edproducer4 = EDProducer("b4")
2884  edproducer8 = EDProducer("b8")
2885  edproducer9 = EDProducer("b9")
2886  edfilter = EDFilter("c")
2887  service = Service("d")
2888  service3 = Service("d", v = untracked.uint32(3))
2889  essource = ESSource("e")
2890  esproducer = ESProducer("f")
2891  testTask2 = Task()
2892 
2893  # test adding things to Tasks
2894  testTask1 = Task(edproducer, edfilter)
2895  self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
2896  testTask1.add(essource, service)
2897  testTask1.add(essource, esproducer)
2898  testTask1.add(testTask2)
2899  coll = testTask1._collection
2900  self.assertTrue(edproducer in coll)
2901  self.assertTrue(edfilter in coll)
2902  self.assertTrue(service in coll)
2903  self.assertTrue(essource in coll)
2904  self.assertTrue(esproducer in coll)
2905  self.assertTrue(testTask2 in coll)
2906  self.assertTrue(len(coll) == 6)
2907  self.assertTrue(len(testTask2._collection) == 0)
2908 
2909  taskContents = []
2910  for i in testTask1:
2911  taskContents.append(i)
2912  self.assertTrue(taskContents == [edproducer, edfilter, essource, service, esproducer, testTask2])
2913 
2914  # test attaching Task to Process
2915  process = Process("test")
2916 
2917  process.mproducer = edproducer
2918  process.mproducer2 = edproducer2
2919  process.mfilter = edfilter
2920  process.messource = essource
2921  process.mesproducer = esproducer
2922  process.d = service
2923 
2924  testTask3 = Task(edproducer, edproducer2)
2925  testTask1.add(testTask3)
2926  process.myTask1 = testTask1
2927 
2928  # test the validation that occurs when attaching a Task to a Process
2929  # first a case that passes, then one the fails on an EDProducer
2930  # then one that fails on a service
2931  l = set()
2932  visitor = NodeNameVisitor(l)
2933  testTask1.visit(visitor)
2934  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2935  l2 = testTask1.moduleNames
2936  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2937 
2938  testTask4 = Task(edproducer3)
2939  l.clear()
2940  self.assertRaises(RuntimeError, testTask4.visit, visitor)
2941  try:
2942  process.myTask4 = testTask4
2943  self.assertTrue(False)
2944  except RuntimeError:
2945  pass
2946 
2947  testTask5 = Task(service3)
2948  l.clear()
2949  self.assertRaises(RuntimeError, testTask5.visit, visitor)
2950  try:
2951  process.myTask5 = testTask5
2952  self.assertTrue(False)
2953  except RuntimeError:
2954  pass
2955 
2956  process.d = service3
2957  process.myTask5 = testTask5
2958 
2959  # test placement into the Process and the tasks property
2960  expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 }
2961  expectedFixedDict = DictTypes.FixedKeysDict(expectedDict);
2962  self.assertTrue(process.tasks == expectedFixedDict)
2963  self.assertTrue(process.tasks['myTask1'] == testTask1)
2964  self.assertTrue(process.myTask1 == testTask1)
2965 
2966  # test replacing an EDProducer in a Task when calling __settattr__
2967  # for the EDProducer on the Process.
2968  process.mproducer2 = edproducer4
2969  process.d = service
2970  l = list()
2971  visitor1 = ModuleNodeVisitor(l)
2972  testTask1.visit(visitor1)
2973  l.sort(key=lambda mod: mod.__str__())
2974  expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__())
2975  self.assertTrue(expectedList == l)
2976  process.myTask6 = Task()
2977  process.myTask7 = Task()
2978  process.mproducer8 = edproducer8
2979  process.myTask8 = Task(process.mproducer8)
2980  process.myTask6.add(process.myTask7)
2981  process.myTask7.add(process.myTask8)
2982  process.myTask1.add(process.myTask6)
2983  process.myTask8.add(process.myTask5)
2984 
2985  testDict = process._itemsInDependencyOrder(process.tasks)
2986  expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"]
2987  expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
2988  index = 0
2989  for testLabel, testTask in testDict.items():
2990  self.assertTrue(testLabel == expectedLabels[index])
2991  self.assertTrue(testTask == expectedTasks[index])
2992  index += 1
2993 
2994  pythonDump = testTask1.dumpPython(PrintOptions())
2995 
2996 
2997  expectedPythonDump = 'cms.Task(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
2998  self.assertTrue(pythonDump == expectedPythonDump)
2999 
3000  process.myTask5 = Task()
3001  process.myTask100 = Task()
3002  process.mproducer9 = edproducer9
3003  sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
3004  sequence2 = Sequence(process.mproducer8 + process.mproducer9)
3005  process.sequence3 = Sequence((process.mproducer8 + process.mfilter))
3006  sequence4 = Sequence()
3007  process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
3008  process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
3009  process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
3010  process.path2 = Path(process.mproducer)
3011  process.path3 = Path(process.mproducer9+process.mproducer8,testTask2)
3012 
3013  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')
3014 
3015  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')
3016 
3017  # test NodeNameVisitor and moduleNames
3018  l = set()
3019  nameVisitor = NodeNameVisitor(l)
3020  process.path1.visit(nameVisitor)
3021  self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3022  self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3023 
3024  # test copy
3025  process.mproducer10 = EDProducer("b10")
3026  process.path21 = process.path11.copy()
3027  process.path21.replace(process.mproducer, process.mproducer10)
3028 
3029  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')
3030 
3031  # Some peculiarities of the way things work show up here. dumpPython sorts tasks and
3032  # removes duplication at the level of strings. The Task and Sequence objects themselves
3033  # remove duplicate tasks in their contents if the instances are the same (exact same python
3034  # object id which is not the same as the string representation being the same).
3035  # Also note that the mutating visitor replaces sequences and tasks that have
3036  # modified contents with their modified contents, it does not modify the sequence
3037  # or task itself.
3038  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')
3039 
3040  process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
3041  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')
3042 
3043  process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
3044  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')
3045 
3046  process.a = EDAnalyzer("MyAnalyzer")
3047  process.b = OutputModule("MyOutputModule")
3048  process.c = EDFilter("MyFilter")
3049  process.d = EDProducer("MyProducer")
3050  process.e = ESProducer("MyESProducer")
3051  process.f = ESSource("MyESSource")
3052  process.g = ESProducer("g")
3053  process.path24 = Path(process.a+process.b+process.c+process.d)
3054  process.path25 = process.path24.copyAndExclude([process.a,process.b,process.c])
3055  self.assertTrue(process.path25.dumpPython() == 'cms.Path(process.d)\n')
3056  #print process.path3
3057  #print process.dumpPython()
3058 
3059  process.path200 = EndPath(Sequence(process.c,Task(process.e)))
3060  process.path200.replace(process.c,process.b)
3061  process.path200.replace(process.e,process.f)
3062  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.b, cms.Task(process.f))\n")
3063  process.path200.replace(process.b,process.c)
3064  process.path200.replace(process.f,process.e)
3065  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
3066  process.path200.replace(process.c,process.a)
3067  process.path200.replace(process.e,process.g)
3068  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.a, cms.Task(process.g))\n")
3069  process.path200.replace(process.a,process.c)
3070  process.path200.replace(process.g,process.e)
3071  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
3072 
3074 
3075  # create some objects to use in tests
3076  edanalyzer = EDAnalyzer("a")
3077  edproducer = EDProducer("b")
3078  edproducer2 = EDProducer("b2")
3079  edproducer3 = EDProducer("b3")
3080  edproducer4 = EDProducer("b4")
3081  edproducer8 = EDProducer("b8")
3082  edproducer9 = EDProducer("b9")
3083  edfilter = EDFilter("c")
3084  service = Service("d")
3085  service3 = Service("d", v = untracked.uint32(3))
3086  essource = ESSource("e")
3087  esproducer = ESProducer("f")
3088  testTask2 = Task()
3089  testCTask2 = ConditionalTask()
3090 
3091  # test adding things to Tasks
3092  testTask1 = ConditionalTask(edproducer, edfilter)
3093  self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
3094  testTask1.add(essource, service)
3095  testTask1.add(essource, esproducer)
3096  testTask1.add(testTask2)
3097  testTask1.add(testCTask2)
3098  coll = testTask1._collection
3099  self.assertTrue(edproducer in coll)
3100  self.assertTrue(edfilter in coll)
3101  self.assertTrue(service in coll)
3102  self.assertTrue(essource in coll)
3103  self.assertTrue(esproducer in coll)
3104  self.assertTrue(testTask2 in coll)
3105  self.assertTrue(testCTask2 in coll)
3106  self.assertTrue(len(coll) == 7)
3107  self.assertTrue(len(testTask2._collection) == 0)
3108 
3109  taskContents = []
3110  for i in testTask1:
3111  taskContents.append(i)
3112  self.assertEqual(taskContents, [edproducer, edfilter, essource, service, esproducer, testTask2, testCTask2])
3113 
3114  # test attaching Task to Process
3115  process = Process("test")
3116 
3117  process.mproducer = edproducer
3118  process.mproducer2 = edproducer2
3119  process.mfilter = edfilter
3120  process.messource = essource
3121  process.mesproducer = esproducer
3122  process.d = service
3123 
3124  testTask3 = ConditionalTask(edproducer, edproducer2)
3125  testTask1.add(testTask3)
3126  process.myTask1 = testTask1
3127 
3128  # test the validation that occurs when attaching a ConditionalTask to a Process
3129  # first a case that passes, then one the fails on an EDProducer
3130  # then one that fails on a service
3131  l = set()
3132  visitor = NodeNameVisitor(l)
3133  testTask1.visit(visitor)
3134  self.assertEqual(l, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
3135  l2 = testTask1.moduleNames()
3136  self.assertEqual(l2, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
3137 
3138  testTask4 = ConditionalTask(edproducer3)
3139  l.clear()
3140  self.assertRaises(RuntimeError, testTask4.visit, visitor)
3141  try:
3142  process.myTask4 = testTask4
3143  self.assertTrue(False)
3144  except RuntimeError:
3145  pass
3146 
3147  testTask5 = ConditionalTask(service3)
3148  l.clear()
3149  self.assertRaises(RuntimeError, testTask5.visit, visitor)
3150  try:
3151  process.myTask5 = testTask5
3152  self.assertTrue(False)
3153  except RuntimeError:
3154  pass
3155 
3156  process.d = service3
3157  process.myTask5 = testTask5
3158 
3159  # test placement into the Process and the tasks property
3160  expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 }
3161  expectedFixedDict = DictTypes.FixedKeysDict(expectedDict);
3162  self.assertEqual(process.conditionaltasks, expectedFixedDict)
3163  self.assertEqual(process.conditionaltasks['myTask1'], testTask1)
3164  self.assertEqual(process.myTask1, testTask1)
3165 
3166  # test replacing an EDProducer in a ConditionalTask when calling __settattr__
3167  # for the EDProducer on the Process.
3168  process.mproducer2 = edproducer4
3169  process.d = service
3170  l = list()
3171  visitor1 = ModuleNodeVisitor(l)
3172  testTask1.visit(visitor1)
3173  l.sort(key=lambda mod: mod.__str__())
3174  expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__())
3175  self.assertEqual(expectedList, l)
3176  process.myTask6 = ConditionalTask()
3177  process.myTask7 = ConditionalTask()
3178  process.mproducer8 = edproducer8
3179  process.myTask8 = ConditionalTask(process.mproducer8)
3180  process.myTask6.add(process.myTask7)
3181  process.myTask7.add(process.myTask8)
3182  process.myTask1.add(process.myTask6)
3183  process.myTask8.add(process.myTask5)
3184  self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n")
3185 
3186  testDict = process._itemsInDependencyOrder(process.conditionaltasks)
3187  expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"]
3188  expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
3189  index = 0
3190  for testLabel, testTask in testDict.items():
3191  self.assertEqual(testLabel, expectedLabels[index])
3192  self.assertEqual(testTask, expectedTasks[index])
3193  index += 1
3194 
3195  pythonDump = testTask1.dumpPython(PrintOptions())
3196 
3197 
3198  expectedPythonDump = 'cms.ConditionalTask(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
3199  self.assertEqual(pythonDump, expectedPythonDump)
3200 
3201  process.myTask5 = ConditionalTask()
3202  self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n")
3203  process.myTask100 = ConditionalTask()
3204  process.mproducer9 = edproducer9
3205  sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
3206  sequence2 = Sequence(process.mproducer8 + process.mproducer9)
3207  process.sequence3 = Sequence((process.mproducer8 + process.mfilter))
3208  sequence4 = Sequence()
3209  process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
3210  process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
3211  process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
3212  process.path2 = Path(process.mproducer)
3213  process.path3 = Path(process.mproducer9+process.mproducer8,testTask2)
3214 
3215  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')
3216 
3217  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')
3218 
3219  # test NodeNameVisitor and moduleNames
3220  l = set()
3221  nameVisitor = NodeNameVisitor(l)
3222  process.path1.visit(nameVisitor)
3223  self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3224  self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
3225 
3226  # test copy
3227  process.mproducer10 = EDProducer("b10")
3228  process.path21 = process.path11.copy()
3229  process.path21.replace(process.mproducer, process.mproducer10)
3230 
3231  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')
3232 
3233  # Some peculiarities of the way things work show up here. dumpPython sorts tasks and
3234  # removes duplication at the level of strings. The Task and Sequence objects themselves
3235  # remove duplicate tasks in their contents if the instances are the same (exact same python
3236  # object id which is not the same as the string representation being the same).
3237  # Also note that the mutating visitor replaces sequences and tasks that have
3238  # modified contents with their modified contents, it does not modify the sequence
3239  # or task itself.
3240  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')
3241 
3242  process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
3243  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')
3244 
3245  process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
3246  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')
3247 
3248  process = Process("Test")
3249 
3250  process.b = EDProducer("b")
3251  process.b2 = EDProducer("b2")
3252  process.b3 = EDProducer("b3")
3253  process.p = Path(process.b, ConditionalTask(process.b3, process.b2))
3254  p = TestMakePSet()
3255  process.fillProcessDesc(p)
3256  self.assertEqual(p.values["@all_modules"], (True, ['b', 'b2', 'b3']))
3257  self.assertEqual(p.values["@paths"], (True, ['p']))
3258  self.assertEqual(p.values["p"], (True, ['b','#','b2','b3','@']))
3259 
3260 
3261  def testPath(self):
3262  p = Process("test")
3263  p.a = EDAnalyzer("MyAnalyzer")
3264  p.b = EDAnalyzer("YourAnalyzer")
3265  p.c = EDAnalyzer("OurAnalyzer")
3266  path = Path(p.a)
3267  path *= p.b
3268  path += p.c
3269  self.assertEqual(str(path),'a+b+c')
3270  path = Path(p.a*p.b+p.c)
3271  self.assertEqual(str(path),'a+b+c')
3272 # path = Path(p.a)*p.b+p.c #This leads to problems with sequences
3273 # self.assertEqual(str(path),'((a*b)+c)')
3274  path = Path(p.a+ p.b*p.c)
3275  self.assertEqual(str(path),'a+b+c')
3276  path = Path(p.a*(p.b+p.c))
3277  self.assertEqual(str(path),'a+b+c')
3278  path = Path(p.a*(p.b+~p.c))
3279  pathx = Path(p.a*(p.b+ignore(p.c)))
3280  self.assertEqual(str(path),'a+b+~c')
3281  p.es = ESProducer("AnESProducer")
3282  self.assertRaises(TypeError,Path,p.es)
3283 
3284  t = Path()
3285  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path()\n')
3286 
3287  t = Path(p.a)
3288  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a)\n')
3289 
3290  t = Path(Task())
3291  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(cms.Task())\n')
3292 
3293  t = Path(p.a, Task())
3294  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task())\n')
3295 
3296  p.prod = EDProducer("prodName")
3297  p.t1 = Task(p.prod)
3298  t = Path(p.a, p.t1, Task(), p.t1)
3299  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n')
3300 
3301  t = Path(ConditionalTask())
3302  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(cms.ConditionalTask())\n')
3303 
3304  t = Path(p.a, ConditionalTask())
3305  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.ConditionalTask())\n')
3306 
3307  p.prod = EDProducer("prodName")
3308  p.t1 = ConditionalTask(p.prod)
3309  t = Path(p.a, p.t1, Task(), p.t1)
3310  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n')
3311 
3312  def testFinalPath(self):
3313  p = Process("test")
3314  p.a = OutputModule("MyOutputModule")
3315  p.b = OutputModule("YourOutputModule")
3316  p.c = OutputModule("OurOutputModule")
3317  path = FinalPath(p.a)
3318  path *= p.b
3319  path += p.c
3320  self.assertEqual(str(path),'a+b+c')
3321  path = FinalPath(p.a*p.b+p.c)
3322  self.assertEqual(str(path),'a+b+c')
3323  path = FinalPath(p.a+ p.b*p.c)
3324  self.assertEqual(str(path),'a+b+c')
3325  path = FinalPath(p.a*(p.b+p.c))
3326  self.assertEqual(str(path),'a+b+c')
3327  p.es = ESProducer("AnESProducer")
3328  self.assertRaises(TypeError,FinalPath, p.es)
3329 
3330  t = FinalPath()
3331  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.FinalPath()\n')
3332 
3333  t = FinalPath(p.a)
3334  self.assertEqual(t.dumpPython(PrintOptions()), 'cms.FinalPath(process.a)\n')
3335 
3336  self.assertRaises(TypeError, FinalPath, Task())
3337  self.assertRaises(TypeError, FinalPath, p.a, Task())
3338 
3339  p.prod = EDProducer("prodName")
3340  p.t1 = Task(p.prod)
3341  self.assertRaises(TypeError, FinalPath, p.a, p.t1, Task(), p.t1)
3342 
3343  p.prod = EDProducer("prodName")
3344  p.t1 = ConditionalTask(p.prod)
3345  self.assertRaises(TypeError, FinalPath, p.a, p.t1, ConditionalTask(), p.t1)
3346 
3347  p.t = FinalPath(p.a)
3348  p.a = OutputModule("ReplacedOutputModule")
3349  self.assertEqual(p.t.dumpPython(PrintOptions()), 'cms.FinalPath(process.a)\n')
3350 
3351  p.anal = EDAnalyzer("MyAnalyzer")
3352  p.t = FinalPath(p.anal)
3353  pset = TestMakePSet()
3354  self.assertRaises(RuntimeError, p.fillProcessDesc, pset)
3355 
3356  p.prod = EDProducer("MyProducer")
3357  p.t = FinalPath(p.prod)
3358  pset = TestMakePSet()
3359  self.assertRaises(RuntimeError, p.fillProcessDesc, pset)
3360 
3361  p.filt = EDFilter("MyFilter")
3362  p.t = FinalPath(p.filt)
3363  pset = TestMakePSet()
3364  self.assertRaises(RuntimeError, p.fillProcessDesc, pset)
3365 
3366  p.outp = OutputModule("MyOutputModule")
3367  p.t = FinalPath(p.outp)
3368  pset = TestMakePSet()
3369  p.fillProcessDesc(pset)
3370 
3372  p = Process("test")
3373  a = EDAnalyzer("MyAnalyzer")
3374  p.a = a
3375  a.setLabel("a")
3376  b = EDAnalyzer("YOurAnalyzer")
3377  p.b = b
3378  b.setLabel("b")
3379  path = Path(a * b)
3380  p.path = Path(p.a*p.b)
3381  lookuptable = {id(a): p.a, id(b): p.b}
3382  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
3383  #lookuptable = p._cloneToObjectDict
3384  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
3385  self.assertEqual(str(path),str(p.path))
3386 
3387  def testContains(self):
3388 
3389  a = EDProducer("a")
3390  b = EDProducer("b")
3391  c = EDProducer("c")
3392  d = EDProducer("d")
3393  e = EDProducer("e")
3394  f = EDProducer("f")
3395  g = EDProducer("g")
3396  h = EDProducer("h")
3397  i = EDProducer("i")
3398  j = EDProducer("j")
3399  k = EDProducer("k")
3400  l = EDProducer("l")
3401  m = EDProducer("m")
3402  n = EDProducer("n")
3403 
3404  seq1 = Sequence(e)
3405  task1 = Task(g)
3406  ctask1 = ConditionalTask(h)
3407  path = Path(a * c * seq1, task1, ctask1)
3408 
3409  self.assertTrue(path.contains(a))
3410  self.assertFalse(path.contains(b))
3411  self.assertTrue(path.contains(c))
3412  self.assertFalse(path.contains(d))
3413  self.assertTrue(path.contains(e))
3414  self.assertFalse(path.contains(f))
3415  self.assertTrue(path.contains(g))
3416  self.assertTrue(path.contains(h))
3417 
3418  endpath = EndPath(h * i)
3419  self.assertFalse(endpath.contains(b))
3420  self.assertTrue(endpath.contains(i))
3421 
3422  seq = Sequence(a * c)
3423  self.assertFalse(seq.contains(b))
3424  self.assertTrue(seq.contains(c))
3425 
3426  task2 = Task(l)
3427  task = Task(j, k, task2)
3428  self.assertFalse(task.contains(b))
3429  self.assertTrue(task.contains(j))
3430  self.assertTrue(task.contains(k))
3431  self.assertTrue(task.contains(l))
3432 
3433  task3 = Task(m)
3434  path2 = Path(n)
3435  sch = Schedule(path, path2, tasks=[task,task3])
3436  self.assertFalse(sch.contains(b))
3437  self.assertTrue(sch.contains(a))
3438  self.assertTrue(sch.contains(c))
3439  self.assertTrue(sch.contains(e))
3440  self.assertTrue(sch.contains(g))
3441  self.assertTrue(sch.contains(n))
3442  self.assertTrue(sch.contains(j))
3443  self.assertTrue(sch.contains(k))
3444  self.assertTrue(sch.contains(l))
3445  self.assertTrue(sch.contains(m))
3446 
3447  ctask2 = ConditionalTask(l, task1)
3448  ctask = ConditionalTask(j, k, ctask2)
3449  self.assertFalse(ctask.contains(b))
3450  self.assertTrue(ctask.contains(j))
3451  self.assertTrue(ctask.contains(k))
3452  self.assertTrue(ctask.contains(l))
3453  self.assertTrue(ctask.contains(g))
3454 
3455  def testSchedule(self):
3456  p = Process("test")
3457  p.a = EDAnalyzer("MyAnalyzer")
3458  p.b = EDAnalyzer("YourAnalyzer")
3459  p.c = EDAnalyzer("OurAnalyzer")
3460  p.d = EDAnalyzer("OurAnalyzer")
3461  p.path1 = Path(p.a)
3462  p.path2 = Path(p.b)
3463  p.path3 = Path(p.d)
3464 
3465  s = Schedule(p.path1,p.path2)
3466  self.assertEqual(s[0],p.path1)
3467  self.assertEqual(s[1],p.path2)
3468  p.schedule = s
3469  self.assertTrue('b' in p.schedule.moduleNames())
3470  self.assertTrue(hasattr(p, 'b'))
3471  self.assertTrue(hasattr(p, 'c'))
3472  self.assertTrue(hasattr(p, 'd'))
3473  self.assertTrue(hasattr(p, 'path1'))
3474  self.assertTrue(hasattr(p, 'path2'))
3475  self.assertTrue(hasattr(p, 'path3'))
3476  p.prune()
3477  self.assertTrue('b' in p.schedule.moduleNames())
3478  self.assertTrue(hasattr(p, 'b'))
3479  self.assertTrue(not hasattr(p, 'c'))
3480  self.assertTrue(not hasattr(p, 'd'))
3481  self.assertTrue(hasattr(p, 'path1'))
3482  self.assertTrue(hasattr(p, 'path2'))
3483  self.assertTrue(not hasattr(p, 'path3'))
3484 
3485  self.assertTrue(len(p.schedule._tasks) == 0)
3486 
3487  p = Process("test")
3488  p.a = EDAnalyzer("MyAnalyzer")
3489  p.b = EDAnalyzer("YourAnalyzer")
3490  p.c = EDAnalyzer("OurAnalyzer")
3491  p.d = EDAnalyzer("dAnalyzer")
3492  p.e = EDProducer("eProducer")
3493  p.f = EDProducer("fProducer")
3494  p.Tracer = Service("Tracer")
3495  p.path1 = Path(p.a)
3496  p.path2 = Path(p.b)
3497  p.path3 = Path(p.d)
3498  p.task1 = Task(p.e)
3499  p.task2 = Task(p.f, p.Tracer)
3500  s = Schedule(p.path1,p.path2,tasks=[p.task1,p.task2,p.task1])
3501  self.assertEqual(s[0],p.path1)
3502  self.assertEqual(s[1],p.path2)
3503  self.assertTrue(len(s._tasks) == 2)
3504  self.assertTrue(p.task1 in s._tasks)
3505  self.assertTrue(p.task2 in s._tasks)
3506  listOfTasks = list(s._tasks)
3507  self.assertTrue(len(listOfTasks) == 2)
3508  self.assertTrue(p.task1 == listOfTasks[0])
3509  self.assertTrue(p.task2 == listOfTasks[1])
3510  p.schedule = s
3511  self.assertTrue('b' in p.schedule.moduleNames())
3512 
3513  process2 = Process("test")
3514  process2.a = EDAnalyzer("MyAnalyzer")
3515  process2.e = EDProducer("eProducer")
3516  process2.path1 = Path(process2.a)
3517  process2.task1 = Task(process2.e)
3518  process2.schedule = Schedule(process2.path1,tasks=process2.task1)
3519  listOfTasks = list(process2.schedule._tasks)
3520  self.assertTrue(listOfTasks[0] == process2.task1)
3521 
3522  # test Schedule copy
3523  s2 = s.copy()
3524  self.assertEqual(s2[0],p.path1)
3525  self.assertEqual(s2[1],p.path2)
3526  self.assertTrue(len(s2._tasks) == 2)
3527  self.assertTrue(p.task1 in s2._tasks)
3528  self.assertTrue(p.task2 in s2._tasks)
3529  listOfTasks = list(s2._tasks)
3530  self.assertTrue(len(listOfTasks) == 2)
3531  self.assertTrue(p.task1 == listOfTasks[0])
3532  self.assertTrue(p.task2 == listOfTasks[1])
3533 
3534  names = s.moduleNames()
3535  self.assertTrue(names == set(['a', 'b', 'e', 'Tracer', 'f']))
3536  #adding a path not attached to the Process should cause an exception
3537  p = Process("test")
3538  p.a = EDAnalyzer("MyAnalyzer")
3539  path1 = Path(p.a)
3540  s = Schedule(path1)
3541  self.assertRaises(RuntimeError, lambda : p.setSchedule_(s) )
3542 
3543  #make sure anonymous sequences work
3544  p = Process("test")
3545  p.a = EDAnalyzer("MyAnalyzer")
3546  p.b = EDAnalyzer("MyOtherAnalyzer")
3547  p.c = EDProducer("MyProd")
3548  path1 = Path(p.c*Sequence(p.a+p.b))
3549  s = Schedule(path1)
3550  self.assertTrue('a' in s.moduleNames())
3551  self.assertTrue('b' in s.moduleNames())
3552  self.assertTrue('c' in s.moduleNames())
3553  p.path1 = path1
3554  p.schedule = s
3555  p.prune()
3556  self.assertTrue('a' in s.moduleNames())
3557  self.assertTrue('b' in s.moduleNames())
3558  self.assertTrue('c' in s.moduleNames())
3559 
3561  p = Process("test")
3562  p.a = EDAnalyzer("MyAnalyzer")
3563  p.b = EDAnalyzer("YourAnalyzer")
3564  p.c = EDAnalyzer("OurAnalyzer")
3565  p.path1 = Path(p.a)
3566  p.path2 = Path(p.b)
3567  self.assertTrue(p.schedule is None)
3568  pths = p.paths
3569  keys = pths.keys()
3570  self.assertEqual(pths[keys[0]],p.path1)
3571  self.assertEqual(pths[keys[1]],p.path2)
3572  p.prune()
3573  self.assertTrue(hasattr(p, 'a'))
3574  self.assertTrue(hasattr(p, 'b'))
3575  self.assertTrue(not hasattr(p, 'c'))
3576  self.assertTrue(hasattr(p, 'path1'))
3577  self.assertTrue(hasattr(p, 'path2'))
3578 
3579 
3580  p = Process("test")
3581  p.a = EDAnalyzer("MyAnalyzer")
3582  p.b = EDAnalyzer("YourAnalyzer")
3583  p.c = EDAnalyzer("OurAnalyzer")
3584  p.path2 = Path(p.b)
3585  p.path1 = Path(p.a)
3586  self.assertTrue(p.schedule is None)
3587  pths = p.paths
3588  keys = pths.keys()
3589  self.assertEqual(pths[keys[1]],p.path1)
3590  self.assertEqual(pths[keys[0]],p.path2)
3591 
3592 
3593  def testUsing(self):
3594  p = Process('test')
3595  p.block = PSet(a = int32(1))
3596  p.modu = EDAnalyzer('Analyzer', p.block, b = int32(2))
3597  self.assertEqual(p.modu.a.value(),1)
3598  self.assertEqual(p.modu.b.value(),2)
3599 
3600  def testOverride(self):
3601  p = Process('test')
3602  a = EDProducer("A", a1=int32(0))
3603  self.assertTrue(not a.isModified())
3604  a.a1 = 1
3605  self.assertTrue(a.isModified())
3606  p.a = a
3607  self.assertEqual(p.a.a1.value(), 1)
3608  # try adding an unmodified module.
3609  # should accept it
3610  p.a = EDProducer("A", a1=int32(2))
3611  self.assertEqual(p.a.a1.value(), 2)
3612  # try adding a modified module. Should throw
3613  # no longer, since the same (modified) say, geometry
3614  # could come from more than one cff
3615  b = EDProducer("A", a1=int32(3))
3616  b.a1 = 4
3617  #self.assertRaises(RuntimeError, setattr, *(p,'a',b))
3618  ps1 = PSet(a = int32(1))
3619  ps2 = PSet(a = int32(2))
3620  self.assertRaises(ValueError, EDProducer, 'C', ps1, ps2)
3621  self.assertRaises(ValueError, EDProducer, 'C', ps1, a=int32(3))
3622 
3623  def testOptions(self):
3624  p = Process('test')
3625  self.assertEqual(p.options.numberOfThreads.value(),1)
3626  p.options.numberOfThreads = 8
3627  self.assertEqual(p.options.numberOfThreads.value(),8)
3628  p.options = PSet()
3629  self.assertEqual(p.options.numberOfThreads.value(),1)
3630  p.options = dict(numberOfStreams =2,
3631  numberOfThreads =2)
3632  self.assertEqual(p.options.numberOfThreads.value(),2)
3633  self.assertEqual(p.options.numberOfStreams.value(),2)
3634  del p.options
3635  self.assertRaises(TypeError, setattr, p, 'options', untracked.PSet(numberOfThreads = int32(-1)))
3636  p.options = untracked.PSet(numberOfThreads = untracked.uint32(4))
3637  self.assertEqual(p.options.numberOfThreads.value(), 4)
3638 
3639  def testMaxEvents(self):
3640  p = Process("Test")
3641  p.maxEvents.input = 10
3642  self.assertEqual(p.maxEvents.input.value(),10)
3643  p = Process("Test")
3644  p.maxEvents.output = 10
3645  self.assertEqual(p.maxEvents.output.value(),10)
3646  p = Process("Test")
3647  p.maxEvents.output = PSet(out=untracked.int32(10))
3648  self.assertEqual(p.maxEvents.output.out.value(), 10)
3649  p = Process("Test")
3650  p.maxEvents = untracked.PSet(input = untracked.int32(5))
3651  self.assertEqual(p.maxEvents.input.value(), 5)
3652  del p.maxEvents
3653  self.assertRaises(TypeError, setattr, p, 'maxEvents', untracked.PSet(input = untracked.uint32(1)))
3654  p.maxEvents = untracked.PSet(input = untracked.int32(1))
3655  self.assertEqual(p.maxEvents.input.value(), 1)
3656 
3657  def testExamples(self):
3658  p = Process("Test")
3659  p.source = Source("PoolSource",fileNames = untracked(string("file:reco.root")))
3660  p.foos = EDProducer("FooProducer")
3661  p.bars = EDProducer("BarProducer", foos=InputTag("foos"))
3662  p.out = OutputModule("PoolOutputModule",fileName=untracked(string("file:foos.root")))
3663  p.bars.foos = 'Foosball'
3664  self.assertEqual(p.bars.foos, InputTag('Foosball'))
3665  p.p = Path(p.foos*p.bars)
3666  p.e = EndPath(p.out)
3667  p.add_(Service("MessageLogger"))
3668 
3669  def testPrefers(self):
3670  p = Process("Test")
3671  p.add_(ESSource("ForceSource"))
3672  p.juicer = ESProducer("JuicerProducer")
3673  p.prefer("ForceSource")
3674  p.prefer("juicer")
3675  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
3676 """process.juicer = cms.ESProducer("JuicerProducer")
3677 process.ForceSource = cms.ESSource("ForceSource")
3678 process.prefer("ForceSource")
3679 process.prefer("juicer")""")
3680  p.prefer("juicer",fooRcd=vstring("Foo"))
3681  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
3682 """process.juicer = cms.ESProducer("JuicerProducer")
3683 process.ForceSource = cms.ESSource("ForceSource")
3684 process.prefer("ForceSource")
3685 process.prefer("juicer",
3686  fooRcd = cms.vstring('Foo')
3687 )""")
3688 
3689  def testFreeze(self):
3690  process = Process("Freeze")
3691  m = EDProducer("M", p=PSet(i = int32(1)))
3692  m.p.i = 2
3693  process.m = m
3694  # should be frozen
3695  #self.assertRaises(ValueError, setattr, m.p, 'i', 3)
3696  #self.assertRaises(ValueError, setattr, m, 'p', PSet(i=int32(1)))
3697  #self.assertRaises(ValueError, setattr, m.p, 'j', 1)
3698  #self.assertRaises(ValueError, setattr, m, 'j', 1)
3699  # But OK to change through the process
3700  process.m.p.i = 4
3701  self.assertEqual(process.m.p.i.value(), 4)
3702  process.m.p = PSet(j=int32(1))
3703  # should work to clone it, though
3704  m2 = m.clone(p = PSet(i = int32(5)), j = int32(8))
3705  m2.p.i = 6
3706  m2.j = 8
3707  def testSubProcess(self):
3708  process = Process("Parent")
3709  subProcess = Process("Child")
3710  subProcess.a = EDProducer("A")
3711  subProcess.p = Path(subProcess.a)
3712  subProcess.add_(Service("Foo"))
3713  process.addSubProcess(SubProcess(subProcess))
3714  d = process.dumpPython()
3715  equalD ="""parentProcess = process
3716 process.a = cms.EDProducer("A")
3717 process.Foo = cms.Service("Foo")
3718 process.p = cms.Path(process.a)
3719 childProcess = process
3720 process = parentProcess
3721 process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = cms.untracked.PSet(
3722 ), outputCommands = cms.untracked.vstring()))"""
3723  equalD = equalD.replace("parentProcess","parentProcess"+str(hash(process.subProcesses_()[0])))
3724  # SubProcesses are dumped before Services, so in order to
3725  # craft the dump of the Parent and Child manually the dump
3726  # of the Parent needs to be split at the MessageLogger
3727  # boundary (now when it is part of Process by default),
3728  # and insert the dump of the Child between the top part of
3729  # the Parent (before MessageLogger) and the bottom part of
3730  # the Parent (after and including MessageLogger)
3731  messageLoggerSplit = 'process.MessageLogger = cms.Service'
3732  parentDumpSplit = Process('Parent').dumpPython().split(messageLoggerSplit)
3733  childProcess = Process('Child')
3734  del childProcess.MessageLogger
3735  combinedDump = parentDumpSplit[0] + childProcess.dumpPython() + messageLoggerSplit + parentDumpSplit[1]
3736  self.assertEqual(_lineDiff(d, combinedDump), equalD)
3737  p = TestMakePSet()
3738  process.fillProcessDesc(p)
3739  self.assertEqual((True,['a']),p.values["subProcesses"][1][0].values["process"][1].values['@all_modules'])
3740  self.assertEqual((True,['p']),p.values["subProcesses"][1][0].values["process"][1].values['@paths'])
3741  self.assertEqual({'@service_type':(True,'Foo')}, p.values["subProcesses"][1][0].values["process"][1].values["services"][1][0].values)
3742  def testRefToPSet(self):
3743  proc = Process("test")
3744  proc.top = PSet(a = int32(1))
3745  proc.ref = PSet(refToPSet_ = string("top"))
3746  proc.ref2 = PSet( a = int32(1), b = PSet( refToPSet_ = string("top")))
3747  proc.ref3 = PSet(refToPSet_ = string("ref"))
3748  proc.ref4 = VPSet(PSet(refToPSet_ = string("top")),
3749  PSet(refToPSet_ = string("ref2")))
3750  p = TestMakePSet()
3751  proc.fillProcessDesc(p)
3752  self.assertEqual((True,1),p.values["ref"][1].values["a"])
3753  self.assertEqual((True,1),p.values["ref3"][1].values["a"])
3754  self.assertEqual((True,1),p.values["ref2"][1].values["a"])
3755  self.assertEqual((True,1),p.values["ref2"][1].values["b"][1].values["a"])
3756  self.assertEqual((True,1),p.values["ref4"][1][0].values["a"])
3757  self.assertEqual((True,1),p.values["ref4"][1][1].values["a"])
3759  proc = Process("test")
3760  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
3761  a = int32(1),
3762  b = PSet(c = int32(2))),
3763  test1 = EDProducer("Bar",
3764  aa = int32(11),
3765  bb = PSet(cc = int32(12))))
3766  self.assertEqual(proc.sp.label_(), "sp")
3767  self.assertEqual(proc.sp.test1.label_(), "sp@test1")
3768  self.assertEqual(proc.sp.test2.label_(), "sp@test2")
3769 
3770  proc.a = EDProducer("A")
3771  proc.s = Sequence(proc.a + proc.sp)
3772  proc.t = Task(proc.a, proc.sp)
3773  proc.p = Path()
3774  proc.p.associate(proc.t)
3775  p = TestMakePSet()
3776  proc.fillProcessDesc(p)
3777  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
3778  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
3779  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
3780  all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"])
3781  all_cases[1].sort() # names of all cases come via dict, i.e. their order is undefined
3782  self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases)
3783  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3784  self.assertEqual(["a", "sp", "sp@test1", "sp@test2"], p.values["@all_modules"][1])
3785  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
3786  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["@module_type"])
3787  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
3788  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
3789  dump = proc.dumpPython()
3790  self.assertEqual(dump.find('@'), -1)
3791  self.assertEqual(specialImportRegistry.getSpecialImports(), ["from test import SwitchProducerTest"])
3792  self.assertTrue(dump.find("\nfrom test import SwitchProducerTest\n") != -1)
3793 
3794  # EDAlias as non-chosen case
3795  proc = Process("test")
3796  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
3797  a = int32(1),
3798  b = PSet(c = int32(2))),
3799  test1 = 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  all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"])
3811  all_cases[1].sort()
3812  self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases)
3813  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3814  self.assertEqual(["a", "sp", "sp@test2"], p.values["@all_modules"][1])
3815  self.assertEqual(["sp@test1"], p.values["@all_aliases"][1])
3816  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
3817  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
3818  self.assertEqual((True,"EDAlias"), p.values["sp@test1"][1].values["@module_edm_type"])
3819  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["a"][1][0].values["type"])
3820 
3821  # EDAlias as chosen case
3822  proc = Process("test")
3823  proc.sp = SwitchProducerTest(test1 = EDProducer("Foo",
3824  a = int32(1),
3825  b = PSet(c = int32(2))),
3826  test2 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
3827  proc.a = EDProducer("A")
3828  proc.s = Sequence(proc.a + proc.sp)
3829  proc.t = Task(proc.a, proc.sp)
3830  proc.p = Path()
3831  proc.p.associate(proc.t)
3832  p = TestMakePSet()
3833  proc.fillProcessDesc(p)
3834  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
3835  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
3836  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
3837  self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"])
3838  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
3839  self.assertEqual(["a", "sp", "sp@test1"], p.values["@all_modules"][1])
3840  self.assertEqual(["sp@test2"], p.values["@all_aliases"][1])
3841  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
3842  self.assertEqual((True,"Foo"), p.values["sp@test1"][1].values["@module_type"])
3843  self.assertEqual((True,"EDAlias"), p.values["sp@test2"][1].values["@module_edm_type"])
3844  self.assertEqual((True,"Bar"), p.values["sp@test2"][1].values["a"][1][0].values["type"])
3845 
3846  # ConditionalTask
3847  proc = Process("test")
3848  proc.spct = SwitchProducerTest(test2 = EDProducer("Foo",
3849  a = int32(1),
3850  b = PSet(c = int32(2))),
3851  test1 = EDProducer("Bar",
3852  aa = int32(11),
3853  bb = PSet(cc = int32(12))),
3854  test3 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
3855  proc.spp = proc.spct.clone()
3856  proc.a = EDProducer("A")
3857  proc.ct = ConditionalTask(proc.spct)
3858  proc.p = Path(proc.a, proc.ct)
3859  proc.pp = Path(proc.a + proc.spp)
3860  p = TestMakePSet()
3861  proc.fillProcessDesc(p)
3862  self.assertEqual(["a", "spct", "spct@test1", "spct@test2", "spp", "spp@test1", "spp@test2"], p.values["@all_modules"][1])
3863  self.assertEqual(["a", "#", "spct", "spct@test1", "spct@test2", "@"], p.values["p"][1])
3864  self.assertEqual(["a", "spp", "#", "spp@test1", "spp@test2", "@"], p.values["pp"][1])
3865 
3866  def testPrune(self):
3867  p = Process("test")
3868  p.a = EDAnalyzer("MyAnalyzer")
3869  p.b = EDAnalyzer("YourAnalyzer")
3870  p.c = EDAnalyzer("OurAnalyzer")
3871  p.d = EDAnalyzer("OurAnalyzer")
3872  p.e = EDProducer("MyProducer")
3873  p.f = EDProducer("YourProducer")
3874  p.g = EDProducer("TheirProducer")
3875  p.h = EDProducer("OnesProducer")
3876  p.s = Sequence(p.d)
3877  p.t1 = Task(p.e)
3878  p.t2 = Task(p.f)
3879  p.t3 = Task(p.g, p.t1)
3880  p.ct1 = ConditionalTask(p.h)
3881  p.ct2 = ConditionalTask(p.f)
3882  p.ct3 = ConditionalTask(p.ct1)
3883  p.path1 = Path(p.a, p.t3, p.ct3)
3884  p.path2 = Path(p.b)
3885  self.assertTrue(p.schedule is None)
3886  pths = p.paths
3887  keys = pths.keys()
3888  self.assertEqual(pths[keys[0]],p.path1)
3889  self.assertEqual(pths[keys[1]],p.path2)
3890  p.pset1 = PSet(parA = string("pset1"))
3891  p.pset2 = untracked.PSet(parA = string("pset2"))
3892  p.vpset1 = VPSet()
3893  p.vpset2 = untracked.VPSet()
3894  p.prune()
3895  self.assertTrue(hasattr(p, 'a'))
3896  self.assertTrue(hasattr(p, 'b'))
3897  self.assertTrue(not hasattr(p, 'c'))
3898  self.assertTrue(not hasattr(p, 'd'))
3899  self.assertTrue(hasattr(p, 'e'))
3900  self.assertTrue(not hasattr(p, 'f'))
3901  self.assertTrue(hasattr(p, 'g'))
3902  self.assertTrue(hasattr(p, 'h'))
3903  self.assertTrue(not hasattr(p, 's'))
3904  self.assertTrue(hasattr(p, 't1'))
3905  self.assertTrue(not hasattr(p, 't2'))
3906  self.assertTrue(hasattr(p, 't3'))
3907  self.assertTrue(hasattr(p, 'path1'))
3908  self.assertTrue(hasattr(p, 'path2'))
3909 # self.assertTrue(not hasattr(p, 'pset1'))
3910 # self.assertTrue(hasattr(p, 'pset2'))
3911 # self.assertTrue(not hasattr(p, 'vpset1'))
3912 # self.assertTrue(not hasattr(p, 'vpset2'))
3913 
3914  p = Process("test")
3915  p.a = EDAnalyzer("MyAnalyzer")
3916  p.b = EDAnalyzer("YourAnalyzer")
3917  p.c = EDAnalyzer("OurAnalyzer")
3918  p.d = EDAnalyzer("OurAnalyzer")
3919  p.e = EDAnalyzer("OurAnalyzer")
3920  p.f = EDProducer("MyProducer")
3921  p.g = EDProducer("YourProducer")
3922  p.h = EDProducer("TheirProducer")
3923  p.i = EDProducer("OurProducer")
3924  p.j = EDProducer("OurProducer")
3925  p.k = EDProducer("OurProducer")
3926  p.l = EDProducer("OurProducer")
3927  p.t1 = Task(p.f)
3928  p.t2 = Task(p.g)
3929  p.t3 = Task(p.h)
3930  p.t4 = Task(p.i)
3931  p.ct1 = Task(p.f)
3932  p.ct2 = Task(p.j)
3933  p.ct3 = Task(p.k)
3934  p.ct4 = Task(p.l)
3935  p.s = Sequence(p.d, p.t1, p.ct1)
3936  p.s2 = Sequence(p.b, p.t2, p.ct2)
3937  p.s3 = Sequence(p.e)
3938  p.path1 = Path(p.a, p.t3, p.ct3)
3939  p.path2 = Path(p.b)
3940  p.path3 = Path(p.b+p.s2)
3941  p.path4 = Path(p.b+p.s3)
3942  p.schedule = Schedule(p.path1,p.path2,p.path3)
3943  p.schedule.associate(p.t4)
3944  pths = p.paths
3945  keys = pths.keys()
3946  self.assertEqual(pths[keys[0]],p.path1)
3947  self.assertEqual(pths[keys[1]],p.path2)
3948  p.prune()
3949  self.assertTrue(hasattr(p, 'a'))
3950  self.assertTrue(hasattr(p, 'b'))
3951  self.assertTrue(not hasattr(p, 'c'))
3952  self.assertTrue(not hasattr(p, 'd'))
3953  self.assertTrue(not hasattr(p, 'e'))
3954  self.assertTrue(not hasattr(p, 'f'))
3955  self.assertTrue(hasattr(p, 'g'))
3956  self.assertTrue(hasattr(p, 'h'))
3957  self.assertTrue(hasattr(p, 'i'))
3958  self.assertTrue(hasattr(p, 'j'))
3959  self.assertTrue(hasattr(p, 'k'))
3960  self.assertTrue(not hasattr(p, 'l'))
3961  self.assertTrue(not hasattr(p, 't1'))
3962  self.assertTrue(hasattr(p, 't2'))
3963  self.assertTrue(hasattr(p, 't3'))
3964  self.assertTrue(hasattr(p, 't4'))
3965  self.assertTrue(not hasattr(p, 'ct1'))
3966  self.assertTrue(hasattr(p, 'ct2'))
3967  self.assertTrue(hasattr(p, 'ct3'))
3968  self.assertTrue(not hasattr(p, 'ct4'))
3969  self.assertTrue(not hasattr(p, 's'))
3970  self.assertTrue(hasattr(p, 's2'))
3971  self.assertTrue(not hasattr(p, 's3'))
3972  self.assertTrue(hasattr(p, 'path1'))
3973  self.assertTrue(hasattr(p, 'path2'))
3974  self.assertTrue(hasattr(p, 'path3'))
3975  self.assertTrue(not hasattr(p, 'path4'))
3976  #test SequencePlaceholder
3977  p = Process("test")
3978  p.a = EDAnalyzer("MyAnalyzer")
3979  p.b = EDAnalyzer("YourAnalyzer")
3980  p.s = Sequence(SequencePlaceholder("a")+p.b)
3981  p.pth = Path(p.s)
3982  p.prune()
3983  self.assertTrue(hasattr(p, 'a'))
3984  self.assertTrue(hasattr(p, 'b'))
3985  self.assertTrue(hasattr(p, 's'))
3986  self.assertTrue(hasattr(p, 'pth'))
3987  #test unresolved SequencePlaceholder
3988  p = Process("test")
3989  p.b = EDAnalyzer("YourAnalyzer")
3990  p.s = Sequence(SequencePlaceholder("a")+p.b)
3991  p.pth = Path(p.s)
3992  p.prune(keepUnresolvedSequencePlaceholders=True)
3993  self.assertTrue(hasattr(p, 'b'))
3994  self.assertTrue(hasattr(p, 's'))
3995  self.assertTrue(hasattr(p, 'pth'))
3996  self.assertEqual(p.s.dumpPython(),'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
3997  #test TaskPlaceholder
3998  p = Process("test")
3999  p.a = EDProducer("MyProducer")
4000  p.b = EDProducer("YourProducer")
4001  p.s = Task(TaskPlaceholder("a"),p.b)
4002  p.pth = Path(p.s)
4003  p.prune()
4004  self.assertTrue(hasattr(p, 'a'))
4005  self.assertTrue(hasattr(p, 'b'))
4006  self.assertTrue(hasattr(p, 's'))
4007  self.assertTrue(hasattr(p, 'pth'))
4008  #test ConditionalTaskPlaceholder
4009  p = Process("test")
4010  p.a = EDProducer("MyProducer")
4011  p.b = EDProducer("YourProducer")
4013  p.pth = Path(p.s)
4014  p.prune()
4015  self.assertTrue(hasattr(p, 'a'))
4016  self.assertTrue(hasattr(p, 'b'))
4017  self.assertTrue(hasattr(p, 's'))
4018  self.assertTrue(hasattr(p, 'pth'))
4019  #test unresolved SequencePlaceholder
4020  p = Process("test")
4021  p.b = EDProducer("YourAnalyzer")
4022  p.s = Task(TaskPlaceholder("a"),p.b)
4023  p.pth = Path(p.s)
4024  p.prune(keepUnresolvedSequencePlaceholders=True)
4025  self.assertTrue(hasattr(p, 'b'))
4026  self.assertTrue(hasattr(p, 's'))
4027  self.assertTrue(hasattr(p, 'pth'))
4028  self.assertEqual(p.s.dumpPython(),'cms.Task(cms.TaskPlaceholder("a"), process.b)\n')
4030  p = Process("test")
4031  p.a = EDProducer("ma")
4032  p.b = EDAnalyzer("mb")
4033  p.t1 = Task(TaskPlaceholder("c"))
4034  p.t2 = Task(p.a, TaskPlaceholder("d"), p.t1)
4035  p.t3 = Task(TaskPlaceholder("e"))
4036  p.path1 = Path(p.b, p.t2, p.t3)
4037  p.t5 = Task(p.a, TaskPlaceholder("g"), TaskPlaceholder("t4"))
4038  p.t4 = Task(TaskPlaceholder("f"))
4039  p.endpath1 = EndPath(p.b, p.t5)
4040  p.t6 = Task(TaskPlaceholder("h"))
4041  p.t7 = Task(p.a, TaskPlaceholder("i"), p.t6)
4042  p.t8 = Task(TaskPlaceholder("j"))
4043  p.schedule = Schedule(p.path1, p.endpath1,tasks=[p.t7,p.t8])
4044  p.c = EDProducer("mc")
4045  p.d = EDProducer("md")
4046  p.e = EDProducer("me")
4047  p.f = EDProducer("mf")
4048  p.g = EDProducer("mg")
4049  p.h = EDProducer("mh")
4050  p.i = EDProducer("mi")
4051  p.j = EDProducer("mj")
4052  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4053 """process.a = cms.EDProducer("ma")
4054 process.c = cms.EDProducer("mc")
4055 process.d = cms.EDProducer("md")
4056 process.e = cms.EDProducer("me")
4057 process.f = cms.EDProducer("mf")
4058 process.g = cms.EDProducer("mg")
4059 process.h = cms.EDProducer("mh")
4060 process.i = cms.EDProducer("mi")
4061 process.j = cms.EDProducer("mj")
4062 process.b = cms.EDAnalyzer("mb")
4063 process.t1 = cms.Task(cms.TaskPlaceholder("c"))
4064 process.t2 = cms.Task(cms.TaskPlaceholder("d"), process.a, process.t1)
4065 process.t3 = cms.Task(cms.TaskPlaceholder("e"))
4066 process.t5 = cms.Task(cms.TaskPlaceholder("g"), cms.TaskPlaceholder("t4"), process.a)
4067 process.t4 = cms.Task(cms.TaskPlaceholder("f"))
4068 process.t6 = cms.Task(cms.TaskPlaceholder("h"))
4069 process.t7 = cms.Task(cms.TaskPlaceholder("i"), process.a, process.t6)
4070 process.t8 = cms.Task(cms.TaskPlaceholder("j"))
4071 process.path1 = cms.Path(process.b, process.t2, process.t3)
4072 process.endpath1 = cms.EndPath(process.b, process.t5)
4073 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
4074  p.resolve()
4075  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4076 """process.a = cms.EDProducer("ma")
4077 process.c = cms.EDProducer("mc")
4078 process.d = cms.EDProducer("md")
4079 process.e = cms.EDProducer("me")
4080 process.f = cms.EDProducer("mf")
4081 process.g = cms.EDProducer("mg")
4082 process.h = cms.EDProducer("mh")
4083 process.i = cms.EDProducer("mi")
4084 process.j = cms.EDProducer("mj")
4085 process.b = cms.EDAnalyzer("mb")
4086 process.t1 = cms.Task(process.c)
4087 process.t2 = cms.Task(process.a, process.d, process.t1)
4088 process.t3 = cms.Task(process.e)
4089 process.t4 = cms.Task(process.f)
4090 process.t6 = cms.Task(process.h)
4091 process.t7 = cms.Task(process.a, process.i, process.t6)
4092 process.t8 = cms.Task(process.j)
4093 process.t5 = cms.Task(process.a, process.g, process.t4)
4094 process.path1 = cms.Path(process.b, process.t2, process.t3)
4095 process.endpath1 = cms.EndPath(process.b, process.t5)
4096 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
4098  p = Process("test")
4099  p.a = EDProducer("ma")
4100  p.b = EDAnalyzer("mb")
4102  p.t2 = ConditionalTask(p.a, ConditionalTaskPlaceholder("d"), p.t1)
4104  p.path1 = Path(p.b, p.t2, p.t3)
4107  p.path2 = Path(p.b, p.t5)
4108  p.schedule = Schedule(p.path1, p.path2)
4109  p.c = EDProducer("mc")
4110  p.d = EDProducer("md")
4111  p.e = EDProducer("me")
4112  p.f = EDProducer("mf")
4113  p.g = EDProducer("mg")
4114  p.h = EDProducer("mh")
4115  p.i = EDProducer("mi")
4116  p.j = EDProducer("mj")
4117  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4118 """process.a = cms.EDProducer("ma")
4119 process.c = cms.EDProducer("mc")
4120 process.d = cms.EDProducer("md")
4121 process.e = cms.EDProducer("me")
4122 process.f = cms.EDProducer("mf")
4123 process.g = cms.EDProducer("mg")
4124 process.h = cms.EDProducer("mh")
4125 process.i = cms.EDProducer("mi")
4126 process.j = cms.EDProducer("mj")
4127 process.b = cms.EDAnalyzer("mb")
4128 process.t1 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("c"))
4129 process.t2 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("d"), process.a, process.t1)
4130 process.t3 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("e"))
4131 process.t5 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("g"), cms.ConditionalTaskPlaceholder("t4"), process.a)
4132 process.t4 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("f"))
4133 process.path1 = cms.Path(process.b, process.t2, process.t3)
4134 process.path2 = cms.Path(process.b, process.t5)
4135 process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""")
4136  p.resolve()
4137  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
4138 """process.a = cms.EDProducer("ma")
4139 process.c = cms.EDProducer("mc")
4140 process.d = cms.EDProducer("md")
4141 process.e = cms.EDProducer("me")
4142 process.f = cms.EDProducer("mf")
4143 process.g = cms.EDProducer("mg")
4144 process.h = cms.EDProducer("mh")
4145 process.i = cms.EDProducer("mi")
4146 process.j = cms.EDProducer("mj")
4147 process.b = cms.EDAnalyzer("mb")
4148 process.t1 = cms.ConditionalTask(process.c)
4149 process.t2 = cms.ConditionalTask(process.a, process.d, process.t1)
4150 process.t3 = cms.ConditionalTask(process.e)
4151 process.t4 = cms.ConditionalTask(process.f)
4152 process.t5 = cms.ConditionalTask(process.a, process.g, process.t4)
4153 process.path1 = cms.Path(process.b, process.t2, process.t3)
4154 process.path2 = cms.Path(process.b, process.t5)
4155 process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""")
4156 
4157  def testDelete(self):
4158  p = Process("test")
4159  p.a = EDAnalyzer("MyAnalyzer")
4160  p.b = EDAnalyzer("YourAnalyzer")
4161  p.c = EDAnalyzer("OurAnalyzer")
4162  p.d = EDAnalyzer("OurAnalyzer")
4163  p.e = EDAnalyzer("OurAnalyzer")
4164  p.f = EDAnalyzer("OurAnalyzer")
4165  p.g = EDProducer("OurProducer")
4166  p.h = EDProducer("YourProducer")
4167  p.i = SwitchProducerTest(
4168  test1 = EDProducer("OneProducer"),
4169  test2 = EDProducer("TwoProducer")
4170  )
4171  p.t1 = Task(p.g, p.h, p.i)
4172  t2 = Task(p.g, p.h, p.i)
4173  t3 = Task(p.g, p.h)
4174  p.t4 = Task(p.h)
4175  p.ct1 = ConditionalTask(p.g, p.h, p.i)
4176  ct2 = ConditionalTask(p.g, p.h)
4177  ct3 = ConditionalTask(p.g, p.h)
4178  p.ct4 = ConditionalTask(p.h)
4179  p.s = Sequence(p.d+p.e)
4180  p.path1 = Path(p.a+p.f+p.s,t2,ct2)
4181  p.path2 = Path(p.a)
4182  p.path3 = Path(ct3, p.ct4)
4183  p.endpath2 = EndPath(p.b)
4184  p.endpath1 = EndPath(p.b+p.f)
4185  p.schedule = Schedule(p.path2, p.path3, p.endpath2, tasks=[t3, p.t4])
4186  self.assertTrue(hasattr(p, 'f'))
4187  self.assertTrue(hasattr(p, 'g'))
4188  self.assertTrue(hasattr(p, 'i'))
4189  del p.e
4190  del p.f
4191  del p.g
4192  del p.i
4193  self.assertFalse(hasattr(p, 'f'))
4194  self.assertFalse(hasattr(p, 'g'))
4195  self.assertEqual(p.t1.dumpPython(), 'cms.Task(process.h)\n')
4196  self.assertEqual(p.ct1.dumpPython(), 'cms.ConditionalTask(process.h)\n')
4197  self.assertEqual(p.s.dumpPython(), 'cms.Sequence(process.d)\n')
4198  self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+process.s, cms.ConditionalTask(process.h), cms.Task(process.h))\n')
4199  self.assertEqual(p.endpath1.dumpPython(), 'cms.EndPath(process.b)\n')
4200  self.assertEqual(p.path3.dumpPython(), 'cms.Path(cms.ConditionalTask(process.h), process.ct4)\n')
4201  del p.s
4202  self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+(process.d), cms.ConditionalTask(process.h), cms.Task(process.h))\n')
4203  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path2, process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4204  del p.path2
4205  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4206  del p.path3
4207  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n')
4208  del p.endpath2
4209  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(tasks=[cms.Task(process.h), process.t4])\n')
4210  del p.t4
4211  self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(tasks=[cms.Task(process.h)])\n')
4212  def testModifier(self):
4213  m1 = Modifier()
4214  Process._firstProcess = True
4215  p = Process("test")
4216  self.assertRaises(RuntimeError, lambda: Process("test2", m1))
4217  m1 = Modifier()
4218  Process._firstProcess = True
4219  p = Process("test",m1)
4220  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4221  def _mod_fred(obj):
4222  obj.fred = 2
4223  m1.toModify(p.a,_mod_fred)
4224  self.assertEqual(p.a.fred.value(),2)
4225  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
4226  m1.toModify(p.b, wilma = 2)
4227  self.assertEqual(p.b.wilma.value(),2)
4228  self.assertTrue(p.isUsingModifier(m1))
4229  #check that Modifier not attached to a process doesn't run
4230  m1 = Modifier()
4231  Process._firstProcess = True
4232  p = Process("test")
4233  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4234  m1.toModify(p.a,_mod_fred)
4235  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
4236  m1.toModify(p.b, wilma = 2)
4237  self.assertEqual(p.a.fred.value(),1)
4238  self.assertEqual(p.b.wilma.value(),1)
4239  self.assertEqual(p.isUsingModifier(m1),False)
4240  #make sure clones get the changes
4241  m1 = Modifier()
4242  Process._firstProcess = True
4243  p = Process("test",m1)
4244  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4245  m1.toModify(p.a, fred = int32(2))
4246  p.b = p.a.clone(wilma = int32(3))
4247  self.assertEqual(p.a.fred.value(),2)
4248  self.assertEqual(p.a.wilma.value(),1)
4249  self.assertEqual(p.b.fred.value(),2)
4250  self.assertEqual(p.b.wilma.value(),3)
4251  #test removal of parameter
4252  m1 = Modifier()
4253  Process._firstProcess = True
4254  p = Process("test",m1)
4255  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1), fintstones = PSet(fred = int32(1)))
4256  m1.toModify(p.a, fred = None, fintstones = dict(fred = None))
4257  self.assertEqual(hasattr(p.a, "fred"), False)
4258  self.assertEqual(hasattr(p.a.fintstones, "fred"), False)
4259  self.assertEqual(p.a.wilma.value(),1)
4260  #test adding a parameter
4261  m1 = Modifier()
4262  Process._firstProcess = True
4263  p = Process("test",m1)
4264  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
4265  m1.toModify(p.a, wilma = int32(2))
4266  self.assertEqual(p.a.fred.value(), 1)
4267  self.assertEqual(p.a.wilma.value(),2)
4268  #test setting of value in PSet
4269  m1 = Modifier()
4270  Process._firstProcess = True
4271  p = Process("test",m1)
4272  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = int32(1), wilma = int32(1)))
4273  m1.toModify(p.a, flintstones = dict(fred = int32(2)))
4274  self.assertEqual(p.a.flintstones.fred.value(),2)
4275  self.assertEqual(p.a.flintstones.wilma.value(),1)
4276  #test proper exception from nonexisting parameter name
4277  m1 = Modifier()
4278  Process._firstProcess = True
4279  p = Process("test",m1)
4280  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = PSet(wilma = int32(1))))
4281  self.assertRaises(KeyError, lambda: m1.toModify(p.a, flintstones = dict(imnothere = dict(wilma=2))))
4282  self.assertRaises(KeyError, lambda: m1.toModify(p.a, foo = 1))
4283  #test setting a value in a VPSet
4284  m1 = Modifier()
4285  Process._firstProcess = True
4286  p = Process("test",m1)
4287  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
4288  m1.toModify(p.a, flintstones = {1:dict(wilma = int32(2))})
4289  self.assertEqual(p.a.flintstones[0].fred.value(),1)
4290  self.assertEqual(p.a.flintstones[1].wilma.value(),2)
4291  #test setting a value in a list of values
4292  m1 = Modifier()
4293  Process._firstProcess = True
4294  p = Process("test",m1)
4295  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
4296  m1.toModify(p.a, fred = {1:7})
4297  self.assertEqual(p.a.fred[0],1)
4298  self.assertEqual(p.a.fred[1],7)
4299  self.assertEqual(p.a.fred[2],3)
4300  #test IndexError setting a value in a list to an item key not in the list
4301  m1 = Modifier()
4302  Process._firstProcess = True
4303  p = Process("test",m1)
4304  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
4305  raised = False
4306  try: m1.toModify(p.a, fred = {5:7})
4307  except IndexError as e: raised = True
4308  self.assertEqual(raised, True)
4309  #test TypeError setting a value in a list using a key that is not an int
4310  m1 = Modifier()
4311  Process._firstProcess = True
4312  p = Process("test",m1)
4313  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
4314  raised = False
4315  try: m1.toModify(p.a, flintstones = dict(bogus = int32(37)))
4316  except TypeError as e: raised = True
4317  self.assertEqual(raised, True)
4318  #test that load causes process wide methods to run
4319  def _rem_a(proc):
4320  del proc.a
4321  class ProcModifierMod(object):
4322  def __init__(self,modifier,func):
4323  self.proc_mod_ = modifier.makeProcessModifier(func)
4324  class DummyMod(object):
4325  def __init__(self):
4326  self.a = EDAnalyzer("Dummy")
4327  testMod = DummyMod()
4328  p.extend(testMod)
4329  self.assertTrue(hasattr(p,"a"))
4330  m1 = Modifier()
4331  Process._firstProcess = True
4332  p = Process("test",m1)
4333  testProcMod = ProcModifierMod(m1,_rem_a)
4334  p.extend(testMod)
4335  p.extend(testProcMod)
4336  self.assertTrue(not hasattr(p,"a"))
4337  #test ModifierChain
4338  m1 = Modifier()
4339  mc = ModifierChain(m1)
4340  Process._firstProcess = True
4341  p = Process("test",mc)
4342  self.assertTrue(p.isUsingModifier(m1))
4343  self.assertTrue(p.isUsingModifier(mc))
4344  testMod = DummyMod()
4345  p.b = EDAnalyzer("Dummy2", fred = int32(1))
4346  m1.toModify(p.b, fred = int32(3))
4347  p.extend(testMod)
4348  testProcMod = ProcModifierMod(m1,_rem_a)
4349  p.extend(testProcMod)
4350  self.assertTrue(not hasattr(p,"a"))
4351  self.assertEqual(p.b.fred.value(),3)
4352  #check cloneAndExclude
4353  m1 = Modifier()
4354  m2 = Modifier()
4355  mc = ModifierChain(m1,m2)
4356  mclone = mc.copyAndExclude([m2])
4357  self.assertTrue(not mclone._isOrContains(m2))
4358  self.assertTrue(mclone._isOrContains(m1))
4359  m3 = Modifier()
4360  mc2 = ModifierChain(mc,m3)
4361  mclone = mc2.copyAndExclude([m2])
4362  self.assertTrue(not mclone._isOrContains(m2))
4363  self.assertTrue(mclone._isOrContains(m1))
4364  self.assertTrue(mclone._isOrContains(m3))
4365  #check combining
4366  m1 = Modifier()
4367  m2 = Modifier()
4368  Process._firstProcess = True
4369  p = Process("test",m1)
4370  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4371  (m1 & m2).toModify(p.a, fred = int32(2))
4372  self.assertRaises(TypeError, lambda: (m1 & m2).toModify(p.a, 1, wilma=2))
4373  self.assertEqual(p.a.fred, 1)
4374  m1 = Modifier()
4375  m2 = Modifier()
4376  Process._firstProcess = True
4377  p = Process("test",m1,m2)
4378  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4379  (m1 & m2).toModify(p.a, fred = int32(2))
4380  self.assertEqual(p.a.fred, 2)
4381  m1 = Modifier()
4382  m2 = Modifier()
4383  m3 = Modifier()
4384  Process._firstProcess = True
4385  p = Process("test",m1,m2,m3)
4386  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4387  (m1 & m2 & m3).toModify(p.a, fred = int32(2))
4388  self.assertEqual(p.a.fred, 2)
4389  (m1 & (m2 & m3)).toModify(p.a, fred = int32(3))
4390  self.assertEqual(p.a.fred, 3)
4391  ((m1 & m2) & m3).toModify(p.a, fred = int32(4))
4392  self.assertEqual(p.a.fred, 4)
4393  #check inverse
4394  m1 = Modifier()
4395  m2 = Modifier()
4396  Process._firstProcess = True
4397  p = Process("test", m1)
4398  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4399  (~m1).toModify(p.a, fred=2)
4400  self.assertEqual(p.a.fred, 1)
4401  (~m2).toModify(p.a, wilma=2)
4402  self.assertEqual(p.a.wilma, 2)
4403  self.assertRaises(TypeError, lambda: (~m1).toModify(p.a, 1, wilma=2))
4404  self.assertRaises(TypeError, lambda: (~m2).toModify(p.a, 1, wilma=2))
4405  # check or
4406  m1 = Modifier()
4407  m2 = Modifier()
4408  m3 = Modifier()
4409  Process._firstProcess = True
4410  p = Process("test", m1)
4411  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4412  (m1 | m2).toModify(p.a, fred=2)
4413  self.assertEqual(p.a.fred, 2)
4414  (m1 | m2 | m3).toModify(p.a, fred=3)
4415  self.assertEqual(p.a.fred, 3)
4416  (m3 | m2 | m1).toModify(p.a, fred=4)
4417  self.assertEqual(p.a.fred, 4)
4418  ((m1 | m2) | m3).toModify(p.a, fred=5)
4419  self.assertEqual(p.a.fred, 5)
4420  (m1 | (m2 | m3)).toModify(p.a, fred=6)
4421  self.assertEqual(p.a.fred, 6)
4422  (m2 | m3).toModify(p.a, fred=7)
4423  self.assertEqual(p.a.fred, 6)
4424  self.assertRaises(TypeError, lambda: (m1 | m2).toModify(p.a, 1, wilma=2))
4425  self.assertRaises(TypeError, lambda: (m2 | m3).toModify(p.a, 1, wilma=2))
4426  # check combinations
4427  m1 = Modifier()
4428  m2 = Modifier()
4429  m3 = Modifier()
4430  m4 = Modifier()
4431  Process._firstProcess = True
4432  p = Process("test", m1, m2)
4433  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4434  (m1 & ~m2).toModify(p.a, fred=2)
4435  self.assertEqual(p.a.fred, 1)
4436  (m1 & ~m3).toModify(p.a, fred=2)
4437  self.assertEqual(p.a.fred, 2)
4438  (m1 | ~m2).toModify(p.a, fred=3)
4439  self.assertEqual(p.a.fred, 3)
4440  (~m1 | ~m2).toModify(p.a, fred=4)
4441  self.assertEqual(p.a.fred, 3)
4442  (~m3 & ~m4).toModify(p.a, fred=4)
4443  self.assertEqual(p.a.fred, 4)
4444  ((m1 & m3) | ~m4).toModify(p.a, fred=5)
4445  self.assertEqual(p.a.fred, 5)
4446  #check toReplaceWith
4447  m1 = Modifier()
4448  Process._firstProcess = True
4449  p = Process("test",m1)
4450  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
4451  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
4452  self.assertRaises(TypeError, lambda: m1.toReplaceWith(p.a, EDProducer("YourProducer")))
4453  #Task
4454  p.b =EDAnalyzer("BAn")
4455  p.c =EDProducer("c")
4456  p.d =EDProducer("d")
4457  p.tc = Task(p.c)
4458  p.td = Task(p.d)
4459  p.s = Sequence(p.a, p.tc)
4460  m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td))
4461  self.assertEqual(p.a.wilma.value(),3)
4462  self.assertEqual(p.a.type_(),"YourAnalyzer")
4463  self.assertEqual(hasattr(p,"fred"),False)
4464  self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n")
4465  p.e =EDProducer("e")
4466  m1.toReplaceWith(p.td, Task(p.e))
4467  self.assertTrue(p.td._collection == OrderedSet([p.e]))
4468  #ConditionalTask
4469  p.b =EDAnalyzer("BAn")
4470  p.c =EDProducer("c")
4471  p.d =EDProducer("d")
4472  del p.tc
4473  del p.td
4474  p.tc = ConditionalTask(p.c)
4475  p.td = ConditionalTask(p.d)
4476  p.s = Sequence(p.a, p.tc)
4477  m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td))
4478  self.assertEqual(p.a.wilma.value(),3)
4479  self.assertEqual(p.a.type_(),"YourAnalyzer")
4480  self.assertEqual(hasattr(p,"fred"),False)
4481  self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n")
4482  p.e =EDProducer("e")
4483  m1.toReplaceWith(p.td, ConditionalTask(p.e))
4484  self.assertTrue(p.td._collection == OrderedSet([p.e]))
4485  #check toReplaceWith doesn't activate not chosen
4486  m1 = Modifier()
4487  Process._firstProcess = True
4488  p = Process("test")
4489  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
4490  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
4491  self.assertEqual(p.a.type_(),"MyAnalyzer")
4492  #check toReplaceWith and and/not/or combinations
4493  m1 = Modifier()
4494  m2 = Modifier()
4495  m3 = Modifier()
4496  m4 = Modifier()
4497  Process._firstProcess = True
4498  p = Process("test", m1, m2)
4499  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4500  self.assertRaises(TypeError, lambda: (m1 & m2).toReplaceWith(p.a, EDProducer("YourProducer")))
4501  self.assertRaises(TypeError, lambda: (m3 & m4).toReplaceWith(p.a, EDProducer("YourProducer")))
4502  self.assertRaises(TypeError, lambda: (~m3).toReplaceWith(p.a, EDProducer("YourProducer")))
4503  self.assertRaises(TypeError, lambda: (~m1).toReplaceWith(p.a, EDProducer("YourProducer")))
4504  self.assertRaises(TypeError, lambda: (m1 | m3).toReplaceWith(p.a, EDProducer("YourProducer")))
4505  self.assertRaises(TypeError, lambda: (m3 | m4).toReplaceWith(p.a, EDProducer("YourProducer")))
4506  (m1 & m2).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer1"))
4507  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4508  (m1 & m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4509  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4510  (~m1).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4511  self.assertEqual(p.a.type_(), "YourAnalyzer1")
4512  (~m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
4513  self.assertEqual(p.a.type_(), "YourAnalyzer2")
4514  (m1 | m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer3"))
4515  self.assertEqual(p.a.type_(), "YourAnalyzer3")
4516  (m3 | m4).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer4"))
4517  self.assertEqual(p.a.type_(), "YourAnalyzer3")
4518  #check chaining of toModify and toReplaceWith
4519  m1 = Modifier()
4520  m2 = Modifier()
4521  m3 = Modifier()
4522  Process._firstProcess = True
4523  p = Process("test", m1, m2)
4524  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
4525  p.b = EDProducer("MyProducer", barney = int32(1), betty = int32(1))
4526  (m1 & m2).toModify(p.a, fred = 2).toModify(p.b, betty = 3)
4527  self.assertEqual(p.a.fred, 2)
4528  self.assertEqual(p.a.wilma, 1)
4529  self.assertEqual(p.b.barney, 1)
4530  self.assertEqual(p.b.betty, 3)
4531  (m1 | m3).toModify(p.a, wilma = 4).toModify(p.b, barney = 5)
4532  self.assertEqual(p.a.fred, 2)
4533  self.assertEqual(p.a.wilma, 4)
4534  self.assertEqual(p.b.barney, 5)
4535  self.assertEqual(p.b.betty, 3)
4536  (m2 & ~m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer")).toModify(p.b, barney = 6)
4537  self.assertEqual(p.a.type_(), "YourAnalyzer")
4538  self.assertEqual(p.b.barney, 6)
4539  self.assertEqual(p.b.betty, 3)
4540  (m1 & ~m3).toModify(p.a, param=int32(42)).toReplaceWith(p.b, EDProducer("YourProducer"))
4541  self.assertEqual(p.a.type_(), "YourAnalyzer")
4542  self.assertEqual(p.a.param, 42)
4543  self.assertEqual(p.b.type_(), "YourProducer")
4544 
4545  # EDAlias
4546  a = EDAlias(foo2 = VPSet(PSet(type = string("Foo2"))))
4547  m = Modifier()
4548  m._setChosen()
4549  # Modify parameters
4550  m.toModify(a, foo2 = {0: dict(type = "Foo3")})
4551  self.assertEqual(a.foo2[0].type, "Foo3")
4552  # Add an alias
4553  m.toModify(a, foo4 = VPSet(PSet(type = string("Foo4"))))
4554  self.assertEqual(a.foo2[0].type, "Foo3")
4555  self.assertEqual(a.foo4[0].type, "Foo4")
4556  # Remove an alias
4557  m.toModify(a, foo2 = None)
4558  self.assertFalse(hasattr(a, "foo2"))
4559  self.assertEqual(a.foo4[0].type, "Foo4")
4560  # Replace (doesn't work out of the box because EDAlias is not _Parameterizable
4561  m.toReplaceWith(a, EDAlias(bar = VPSet(PSet(type = string("Bar")))))
4562  self.assertFalse(hasattr(a, "foo2"))
4563  self.assertFalse(hasattr(a, "foo4"))
4564  self.assertTrue(hasattr(a, "bar"))
4565  self.assertEqual(a.bar[0].type, "Bar")
4566 
4567  # SwitchProducer
4568  sp = SwitchProducerTest(test1 = EDProducer("Foo",
4569  a = int32(1),
4570  b = PSet(c = int32(2))),
4571  test2 = EDProducer("Bar",
4572  aa = int32(11),
4573  bb = PSet(cc = int32(12))))
4574  m = Modifier()
4575  m._setChosen()
4576  # Modify parameters
4577  m.toModify(sp,
4578  test1 = dict(a = 4, b = dict(c = None)),
4579  test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo"))))
4580  self.assertEqual(sp.test1.a.value(), 4)
4581  self.assertEqual(sp.test1.b.hasParameter("c"), False)
4582  self.assertEqual(sp.test2.aa.value(), 15)
4583  self.assertEqual(sp.test2.bb.cc.value(), 45)
4584  self.assertEqual(sp.test2.bb.dd.value(), "foo")
4585  # Replace a producer
4586  m.toReplaceWith(sp.test1, EDProducer("Fred", x = int32(42)))
4587  self.assertEqual(sp.test1.type_(), "Fred")
4588  self.assertEqual(sp.test1.x.value(), 42)
4589  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test1, EDAnalyzer("Foo")))
4590  # Alternative way (only to be allow same syntax to be used as for adding)
4591  m.toModify(sp, test2 = EDProducer("Xyzzy", x = int32(24)))
4592  self.assertEqual(sp.test2.type_(), "Xyzzy")
4593  self.assertEqual(sp.test2.x.value(), 24)
4594  self.assertRaises(TypeError, lambda: m.toModify(sp, test2 = EDAnalyzer("Foo")))
4595  # Add a producer
4596  m.toModify(sp, test3 = EDProducer("Wilma", y = int32(24)))
4597  self.assertEqual(sp.test3.type_(), "Wilma")
4598  self.assertEqual(sp.test3.y.value(), 24)
4599  self.assertRaises(TypeError, lambda: m.toModify(sp, test4 = EDAnalyzer("Foo")))
4600  # Remove a producer
4601  m.toModify(sp, test2 = None)
4602  self.assertEqual(hasattr(sp, "test2"), False)
4603  # Add an alias
4604  m.toModify(sp, test2 = EDAlias(foo = VPSet(PSet(type = string("int")))))
4605  self.assertTrue(hasattr(sp.test2, "foo"))
4606  # Replace an alias
4607  m.toReplaceWith(sp.test2, EDAlias(bar = VPSet(PSet(type = string("int")))))
4608  self.assertTrue(hasattr(sp.test2, "bar"))
4609  # Alternative way
4610  m.toModify(sp, test2 = EDAlias(xyzzy = VPSet(PSet(type = string("int")))))
4611  self.assertTrue(hasattr(sp.test2, "xyzzy"))
4612  # Replace an alias with EDProducer
4613  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test2, EDProducer("Foo")))
4614  m.toModify(sp, test2 = EDProducer("Foo"))
4616  #check defaults are not overwritten
4617  f = ProcessFragment('Fragment')
4618  p = Process('PROCESS')
4619  p.maxEvents.input = 10
4620  p.options.numberOfThreads = 4
4621  p.maxLuminosityBlocks.input = 2
4622  p.extend(f)
4623  self.assertEqual(p.maxEvents.input.value(),10)
4624  self.assertEqual(p.options.numberOfThreads.value(), 4)
4625  self.assertEqual(p.maxLuminosityBlocks.input.value(),2)
4626  #general checks
4627  f = ProcessFragment("Fragment")
4628  f.fltr = EDFilter("Foo")
4629  p = Process('PROCESS')
4630  p.extend(f)
4631  self.assertTrue(hasattr(p,'fltr'))
4633  proc = Process("TEST")
4635  p.TestService = Service("TestService")
4636  self.assertTrue(hasattr(proc, "TestService"))
4637  self.assertEqual(proc.TestService.type_(), "TestService")
4638  self.assertRaises(TypeError, setattr, p, "a", EDProducer("Foo"))
4639  p.add_(Service("TestServiceTwo"))
4640  self.assertTrue(hasattr(proc, "TestServiceTwo"))
4641  self.assertEqual(proc.TestServiceTwo.type_(), "TestServiceTwo")
4642  p.TestService.foo = untracked.uint32(42)
4643  self.assertEqual(proc.TestService.foo.value(), 42)
4644  proc.mod = EDProducer("Producer")
4645  self.assertRaises(TypeError, getattr, p, "mod")
4647  proc = Process("TEST")
4648  p = TestMakePSet()
4649  proc.fillProcessDesc(p)
4650  self.assertTrue(["cpu"], p.values["@available_accelerators"][1])
4651  self.assertFalse(p.values["@selected_accelerators"][0])
4652  self.assertTrue(["cpu"], p.values["@selected_accelerators"][1])
4653  self.assertFalse(p.values["@module_type_resolver"][0])
4654  self.assertEqual("", p.values["@module_type_resolver"][1])
4655 
4656  proc = Process("TEST")
4657  self.assertRaises(TypeError, setattr, proc, "processAcceleratorTest", ProcessAcceleratorTest())
4658  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4659  del proc.MessageLogger # remove boilerplate unnecessary for this test case
4660  self.maxDiff = None
4661  self.assertEqual(proc.dumpPython(),
4662 """import FWCore.ParameterSet.Config as cms
4663 from test import ProcessAcceleratorTest
4664 
4665 process = cms.Process("TEST")
4666 
4667 process.maxEvents = cms.untracked.PSet(
4668  input = cms.optional.untracked.int32,
4669  output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
4670 )
4671 
4672 process.maxLuminosityBlocks = cms.untracked.PSet(
4673  input = cms.untracked.int32(-1)
4674 )
4675 
4676 process.options = cms.untracked.PSet(
4677  IgnoreCompletely = cms.untracked.vstring(),
4678  Rethrow = cms.untracked.vstring(),
4679  TryToContinue = cms.untracked.vstring(),
4680  accelerators = cms.untracked.vstring('*'),
4681  allowUnscheduled = cms.obsolete.untracked.bool,
4682  canDeleteEarly = cms.untracked.vstring(),
4683  deleteNonConsumedUnscheduledModules = cms.untracked.bool(True),
4684  dumpOptions = cms.untracked.bool(False),
4685  emptyRunLumiMode = cms.obsolete.untracked.string,
4686  eventSetup = cms.untracked.PSet(
4687  forceNumberOfConcurrentIOVs = cms.untracked.PSet(
4688  allowAnyLabel_=cms.required.untracked.uint32
4689  ),
4690  numberOfConcurrentIOVs = cms.untracked.uint32(0)
4691  ),
4692  fileMode = cms.untracked.string('FULLMERGE'),
4693  forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
4694  holdsReferencesToDeleteEarly = cms.untracked.VPSet(),
4695  makeTriggerResults = cms.obsolete.untracked.bool,
4696  modulesToCallForTryToContinue = cms.untracked.vstring(),
4697  modulesToIgnoreForDeleteEarly = cms.untracked.vstring(),
4698  numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0),
4699  numberOfConcurrentRuns = cms.untracked.uint32(1),
4700  numberOfStreams = cms.untracked.uint32(0),
4701  numberOfThreads = cms.untracked.uint32(1),
4702  printDependencies = cms.untracked.bool(False),
4703  sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
4704  throwIfIllegalParameter = cms.untracked.bool(True),
4705  wantSummary = cms.untracked.bool(False)
4706 )
4707 
4708 process.ProcessAcceleratorTest = ProcessAcceleratorTest(
4709  enabled = ['test1', 'test2', 'anothertest3']
4710 )
4711 
4712 
4713 """)
4714  p = TestMakePSet()
4715  proc.fillProcessDesc(p)
4716  self.assertEqual(["*"], p.values["options"][1].values["accelerators"][1])
4717  self.assertFalse(p.values["options"][1].values["accelerators"][0])
4718  self.assertTrue(["anothertest3", "cpu", "test1", "test2"], p.values["@selected_accelerators"][1])
4719  self.assertEqual("AcceleratorTestService", p.values["services"][1][0].values["@service_type"][1])
4720  self.assertFalse(p.values["@available_accelerators"][0])
4721  self.assertTrue(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4722  self.assertFalse(p.values["@module_type_resolver"][0])
4723  self.assertEqual("", p.values["@module_type_resolver"][1])
4724 
4725  proc = Process("TEST")
4726  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4727  proc.add_(Service("AcceleratorTestServiceRemove"))
4728  p = TestMakePSet()
4729  proc.fillProcessDesc(p)
4730  services = [x.values["@service_type"][1] for x in p.values["services"][1]]
4731  self.assertTrue("AcceleratorTestService" in services)
4732  self.assertFalse("AcceleratorTestServiceRemove" in services)
4733 
4734  proc = Process("TEST")
4735  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4736  p = TestMakePSet()
4737  proc.fillProcessDesc(p)
4738  self.assertEqual(["cpu", "test1"], p.values["@selected_accelerators"][1])
4739  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4740 
4741  proc = Process("TEST")
4742  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4743  proc.options.accelerators = ["test2"]
4744  p = TestMakePSet()
4745  proc.fillProcessDesc(p)
4746  self.assertEqual(["test2"], p.values["@selected_accelerators"][1])
4747  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4748 
4749  proc = Process("TEST")
4750  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4751  proc.options.accelerators = ["test*"]
4752  proc.fillProcessDesc(p)
4753  self.assertEqual(["test1", "test2"], p.values["@selected_accelerators"][1])
4754  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4755 
4756  proc = Process("TEST")
4757  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4758  proc.options.accelerators = ["test2"]
4759  p = TestMakePSet()
4760  proc.fillProcessDesc(p)
4761  self.assertEqual([], p.values["@selected_accelerators"][1])
4762  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4763 
4764  proc = Process("TEST")
4765  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4766  proc.options.accelerators = ["cpu*"]
4767  p = TestMakePSet()
4768  proc.fillProcessDesc(p)
4769  self.assertEqual(["cpu"], p.values["@selected_accelerators"][1])
4770  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4771 
4772  proc = Process("TEST")
4773  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4774  proc.options.accelerators = ["test3"]
4775  p = TestMakePSet()
4776  self.assertRaises(ValueError, proc.fillProcessDesc, p)
4777 
4778  proc = Process("TEST")
4779  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4780  proc.options.accelerators = ["*", "test1"]
4781  p = TestMakePSet()
4782  self.assertRaises(ValueError, proc.fillProcessDesc, p)
4783 
4784  proc = Process("TEST")
4785  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4786  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4787  p = TestMakePSet()
4788  proc.fillProcessDesc(p)
4789  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@selected_accelerators"][1])
4790  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4791 
4792  proc = Process("TEST")
4793  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4794  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4795  proc.options.accelerators = ["*test3", "c*"]
4796  p = TestMakePSet()
4797  proc.fillProcessDesc(p)
4798  self.assertEqual(["anothertest3", "cpu"], p.values["@selected_accelerators"][1])
4799  self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4800 
4801  proc = Process("TEST")
4802  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
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@test2"), p.values["sp"][1].values["@chosen_case"])
4813 
4814  proc = Process("TEST")
4815  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"])
4816  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4817  a = int32(1),
4818  b = PSet(c = int32(2))),
4819  test1 = EDProducer("Bar",
4820  aa = int32(11),
4821  bb = PSet(cc = int32(12))))
4822  proc.p = Path(proc.sp)
4823  p = TestMakePSet()
4824  proc.fillProcessDesc(p)
4825  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4826 
4827  proc = Process("TEST")
4828  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4829  proc.options.accelerators = ["test1"]
4830  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4831  a = int32(1),
4832  b = PSet(c = int32(2))),
4833  test1 = EDProducer("Bar",
4834  aa = int32(11),
4835  bb = PSet(cc = int32(12))))
4836  proc.p = Path(proc.sp)
4837  p = TestMakePSet()
4838  proc.fillProcessDesc(p)
4839  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4840 
4841  proc = Process("TEST")
4842  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4843  proc.options.accelerators = ["test*"]
4844  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4845  a = int32(1),
4846  b = PSet(c = int32(2))),
4847  test1 = EDProducer("Bar",
4848  aa = int32(11),
4849  bb = PSet(cc = int32(12))))
4850  proc.p = Path(proc.sp)
4851  p = TestMakePSet()
4852  proc.fillProcessDesc(p)
4853  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
4854 
4855  proc = Process("TEST")
4856  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4857  proc.options.accelerators = ["anothertest3"]
4858  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4859  a = int32(1),
4860  b = PSet(c = int32(2))),
4861  test1 = EDProducer("Bar",
4862  aa = int32(11),
4863  bb = PSet(cc = int32(12))))
4864  proc.p = Path(proc.sp)
4865  p = TestMakePSet()
4866  self.assertRaises(RuntimeError, proc.fillProcessDesc, p)
4867 
4868  proc = Process("TEST")
4869  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4870  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4871  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2()
4872  proc.normalProducer = EDProducer("FooProducer")
4873  proc.testProducer = EDProducer("BarProducer@test")
4874  proc.test2Producer = EDProducer("BarProducer@test", test=untracked.PSet(backend=untracked.string("test2_backend")))
4875  proc.testAnalyzer = EDAnalyzer("Analyzer@test")
4876  proc.testFilter = EDAnalyzer("Filter@test")
4877  proc.testESProducer = ESProducer("ESProducer@test")
4878  proc.testESSource = ESSource("ESSource@test")
4879  proc.p = Path(proc.normalProducer+proc.testProducer+proc.test2Producer+proc.testAnalyzer+proc.testFilter)
4880  p = TestMakePSet()
4881  proc.fillProcessDesc(p)
4882  self.assertEqual("TestModuleTypeResolver", p.values["@module_type_resolver"][1])
4883  self.assertEqual("FooProducer", p.values["normalProducer"][1].values["@module_type"][1])
4884  self.assertEqual(len(list(filter(lambda x: not "@" in x, p.values["normalProducer"][1].values.keys()))), 0)
4885  self.assertEqual("BarProducer@test", p.values["testProducer"][1].values["@module_type"][1])
4886  self.assertEqual(False, p.values["testProducer"][1].values["test"][0])
4887  self.assertEqual(False, p.values["testProducer"][1].values["test"][1].values["backend"][0])
4888  self.assertEqual("test1_backend", p.values["testProducer"][1].values["test"][1].values["backend"][1])
4889  self.assertEqual("BarProducer@test", p.values["test2Producer"][1].values["@module_type"][1])
4890  self.assertEqual("test2_backend", p.values["test2Producer"][1].values["test"][1].values["backend"][1])
4891  self.assertEqual("Analyzer@test", p.values["testAnalyzer"][1].values["@module_type"][1])
4892  self.assertEqual("test1_backend", p.values["testAnalyzer"][1].values["test"][1].values["backend"][1])
4893  self.assertEqual("Filter@test", p.values["testFilter"][1].values["@module_type"][1])
4894  self.assertEqual("test1_backend", p.values["testFilter"][1].values["test"][1].values["backend"][1])
4895  self.assertEqual("ESProducer@test", p.values["ESProducer@test@testESProducer"][1].values["@module_type"][1])
4896  self.assertEqual("test1_backend", p.values["ESProducer@test@testESProducer"][1].values["test"][1].values["backend"][1])
4897  self.assertEqual("ESSource@test", p.values["ESSource@test@testESSource"][1].values["@module_type"][1])
4898  self.assertEqual("test1_backend", p.values["ESSource@test@testESSource"][1].values["test"][1].values["backend"][1])
4899 
4900  # No required accelerators available
4901  proc = Process("Test")
4902  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4903  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4904  proc.options.accelerators = []
4905  self.assertRaises(EDMException, proc.fillProcessDesc, p)
4906 
4907  proc = Process("Test")
4908  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4909  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4910  proc.options.accelerators = ["test1"]
4911  proc.test2Producer = EDProducer("BarProducer@test", test=untracked.PSet(backend=untracked.string("test2_backend")))
4912  proc.p = Path(proc.test2Producer)
4913  self.assertRaises(EDMException, proc.fillProcessDesc, p)
4914 
4915  # Two ProcessAccelerators return type resolver
4916  proc = Process("TEST")
4917  proc.ProcessAcceleratorTest = ProcessAcceleratorTest(
4918  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4919  proc.ProcessAcceleratorTest2 = ProcessAcceleratorTest2(
4920  moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators))
4921  p = TestMakePSet()
4922  self.assertRaises(RuntimeError, proc.fillProcessDesc, p)
4923 
4924  import pickle
4925  proc = Process("TEST")
4926  proc.ProcessAcceleratorTest = ProcessAcceleratorTest()
4927  proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo",
4928  a = int32(1),
4929  b = PSet(c = int32(2))),
4930  test1 = EDProducer("Bar",
4931  aa = int32(11),
4932  bb = PSet(cc = int32(12))))
4933  proc.p = Path(proc.sp)
4934  pkl = pickle.dumps(proc)
4935  unpkl = pickle.loads(pkl)
4936  p = TestMakePSet()
4937  unpkl.fillProcessDesc(p)
4938  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
4939  self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1])
4940  unpkl = pickle.loads(pkl)
4941  unpkl.ProcessAcceleratorTest.setEnabled(["test1"])
4942  p = TestMakePSet()
4943  unpkl.fillProcessDesc(p)
4944  self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"])
4945  self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1])
4946 
4947  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:2147
def testProcessAccelerator(self)
Definition: Config.py:4646
def _dumpConfigOptionallyNamedList(self, items, typeName, options)
Definition: Config.py:829
def testConditionalTaskPlaceholder(self)
Definition: Config.py:4097
def addEventRange(self, tracked, label, value)
Definition: Config.py:2167
def __init__(self, lhs, rhs)
Definition: Config.py:1819
def __init__(self, enabled=["anothertest3", anothertest4, moduleTypeResolverMaker=None)
Definition: Config.py:2258
def testExamples(self)
Definition: Config.py:3657
def __getattribute__(self, name)
Definition: Config.py:1652
def _place(self, label, process)
Definition: Config.py:1744
def getProcessName(self)
Definition: Config.py:1732
def testServiceInProcess(self)
Definition: Config.py:2863
def __or__(self, other)
Definition: Config.py:1912
def outputCommands(self)
Definition: Config.py:1738
def _setChosen(self)
Definition: Config.py:1929
def producerNames(self)
Definition: Config.py:176
def _dumpConfigUnnamedList(self, items, typeName, options)
Definition: Config.py:823
def newPSet(self)
Definition: Config.py:2177
def _placeAnalyzer(self, name, mod)
Definition: Config.py:689
def addString(self, tracked, label, value)
Definition: Config.py:2145
def __findFirstUsingModule(self, seqsOrTasks, mod)
Definition: Config.py:571
def subProcesses_(self)
Definition: Config.py:297
def __repr__(self)
Definition: Config.py:1695
def _pruneModules(self, d, scheduledNames)
Definition: Config.py:1421
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:2059
def testSequence2(self)
Definition: Config.py:2853
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:2046
def _placeESProducer(self, name, mod)
Definition: Config.py:715
def __invert__(self)
Definition: Config.py:1910
def _splitPythonList(self, subfolder, d, options)
Definition: Config.py:928
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:36
def pathNames(self)
Definition: Config.py:188
def addVESInputTag(self, tracked, label, value)
Definition: Config.py:2157
def _switchproducer_test2_case2(accelerators)
Definition: Config.py:2087
def __and__(self, other)
Definition: Config.py:1908
def _placeSequence(self, name, mod)
Definition: Config.py:712
def __call__(self, obj)
Definition: Config.py:1759
def _setChosen(self)
Definition: Config.py:1903
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:1697
def tasks_(self)
Definition: Config.py:325
def setStrict(self, value)
Definition: Config.py:171
def addDouble(self, tracked, label, value)
Definition: Config.py:2139
def dumpPythonImpl(self, options)
Definition: Config.py:2021
def moduleTypeResolver(self, accelerators)
Definition: Config.py:2247
def producers_(self)
Definition: Config.py:220
def _findPreferred(self, esname, d, args, kargs)
Definition: Config.py:1617
def apply(self, process, accelerators)
Definition: Config.py:2280
def __init__(self, kargs)
Definition: Config.py:2192
def testModifier(self)
Definition: Config.py:4212
def apply(self, process, accelerators)
Definition: Config.py:2251
def _insertOneInto(self, parameterSet, label, item, tracked)
Definition: Config.py:1205
def __setattr__(self, label, value)
Definition: Config.py:2066
def _isChosen(self)
Definition: Config.py:1814
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:2137
def _isChosen(self)
Definition: Config.py:1807
def _placeEndPath(self, name, mod)
Definition: Config.py:698
def testProcessForProcessAccelerator(self)
Definition: Config.py:4632
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:2321
def addUInt64(self, tracked, label, value)
Definition: Config.py:2135
def _itemsInDependencyOrder(self, processDictionaryOfItems)
Definition: Config.py:975
def source_(self)
Definition: Config.py:228
def addVPSet(self, tracked, label, value)
Definition: Config.py:2173
def nameInProcessDesc_(self, label)
Definition: Config.py:1742
def __init__(self, accelerators)
Definition: Config.py:2201
def psets_(self)
Definition: Config.py:376
def _lineDiff(newString, oldString)
Definition: Config.py:2094
def testSecSource(self)
Definition: Config.py:2762
def dumpPythonImpl(self, options)
Definition: Config.py:2239
def __init__(self, args)
Definition: Config.py:1757
def format_outerframe(number)
def __init__(self, args, kw)
Definition: Config.py:1693
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:2127
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:1657
def setLooper_(self, lpr)
Definition: Config.py:237
def setSource_(self, src)
Definition: Config.py:231
def __init__(self, process)
Definition: Config.py:1639
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:1800
def _replaceInTasks(self, label, new)
Definition: Config.py:1178
def addVInt32(self, tracked, label, value)
Definition: Config.py:2125
def _placeFilter(self, name, mod)
Definition: Config.py:687
def testFinalPath(self)
Definition: Config.py:3312
def handleProcessAccelerators(self, parameterSet)
Definition: Config.py:1523
def schedule_(self)
Definition: Config.py:333
def validate(self)
Definition: Config.py:1516
def addVInputTag(self, tracked, label, value)
Definition: Config.py:2153
def _applyNewProcessModifiers(self, process)
Definition: Config.py:1924
def analyzerNames(self)
Definition: Config.py:182
def testSchedule(self)
Definition: Config.py:3455
def addLuminosityBlockID(self, tracked, label, value)
Definition: Config.py:2163
def addESInputTag(self, tracked, label, value)
Definition: Config.py:2155
def __init__(self, lhs)
Definition: Config.py:1812
def __new__(cls, args, kw)
Definition: Config.py:1676
def testContains(self)
Definition: Config.py:3387
def endpaths_(self)
Definition: Config.py:313
def toModify(self, obj, func=None, kw)
Definition: Config.py:1781
def SelectEvents(self)
Definition: Config.py:1736
def setEnabled(self, enabled)
Definition: Config.py:2234
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:2133
def addVEventID(self, tracked, label, value)
Definition: Config.py:2161
def setEnabled(self, enabled)
Definition: Config.py:2263
def toModify(self, obj, func=None, kw)
Definition: Config.py:1847
def testGlobalReplace(self)
Definition: Config.py:2767
def testSwitchProducer(self)
Definition: Config.py:3758
def getVString(self, tracked, label)
Definition: Config.py:2149
def moduleTypeResolver(self, accelerators)
Definition: Config.py:2031
def defaultMaxLuminosityBlocks_()
Definition: Config.py:295
def testProcessFragment(self)
Definition: Config.py:4615
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1786
def _placeOutputModule(self, name, mod)
Definition: Config.py:681
def addFileInPath(self, tracked, label, value)
Definition: Config.py:2175
def testRefToPSet(self)
Definition: Config.py:3742
def testOverride(self)
Definition: Config.py:3600
def _placeSource(self, name, mod)
Definition: Config.py:733
def __init__(self)
Definition: Config.py:1834
def __init__(self, lhs, rhs=None)
Definition: Config.py:1777
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:2276
def checkImportPermission(minLevel=2, allowedPatterns=[])
Definition: Config.py:41
def ignore(seq)
def _toModify(obj, func, kw)
Definition: Config.py:1865
def __init__(self, modifier, func)
Definition: Config.py:1973
def _toReplaceWith(toObj, fromObj)
Definition: Config.py:1883
def _toModifyCheck(obj, func, kw)
Definition: Config.py:1844
def isUsingModifier(self, mod)
Definition: Config.py:385
def dumpPython(self, options=PrintOptions())
Definition: Config.py:1725
def __copyIfExclude(self, toExclude)
Definition: Config.py:1950
def sequences_(self)
Definition: Config.py:321
def _validateTask(self, task, label)
Definition: Config.py:958
def testParameterizable(self)
Definition: Config.py:2288
def testSubProcess(self)
Definition: Config.py:3707
def _placeSubProcess(self, name, mod)
Definition: Config.py:746
def __init__(self, enabled=["test1", test2, anothertest3, moduleTypeResolverMaker=None)
Definition: Config.py:2229
def setPartialSchedule_(self, sch, label)
Definition: Config.py:336
def addPSet(self, tracked, label, value)
Definition: Config.py:2171
def testProcessDumpPython(self)
Definition: Config.py:2448
def _placeService(self, typeName, mod)
Definition: Config.py:751
def resolve(self, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1339
def looper_(self)
Definition: Config.py:234
def _switchproducer_test2_case1(accelerators)
Definition: Config.py:2085
def es_prefers_(self)
Definition: Config.py:368
static std::string join(char **cmd)
Definition: RemoteFile.cc:19
def _isChosen(self)
Definition: Config.py:1906
def _isOrContains(self, other)
Definition: Config.py:1914
def getSubProcessPSet(self, parameterSet)
Definition: Config.py:1746
def _validateConditionalTask(self, task, label)
Definition: Config.py:966
def copyAndExclude(self, toExclude)
Definition: Config.py:1936
def addVUInt32(self, tracked, label, value)
Definition: Config.py:2129
def addVEventRange(self, tracked, label, value)
Definition: Config.py:2169
def _splitPython(self, subfolder, d, options)
Definition: Config.py:1047
def defaultMaxEvents_()
Definition: Config.py:282
def __init__(self, lhs, rhs)
Definition: Config.py:1805
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:3073
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:2009
def _toReplaceWithCheck(toObj, fromObj)
Definition: Config.py:1872
def defaultOptions_()
Definition: Config.py:241
def testSequence(self)
Definition: Config.py:2838
def switchProducerNames(self)
Definition: Config.py:179
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1875
def _placeProducer(self, name, mod)
Definition: Config.py:683
def prefer(self, esmodule, args, kargs)
Definition: Config.py:1588
def __delattr__(self, name)
Definition: Config.py:1662
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:2151
def add_(self, value)
Definition: Config.py:638
def _isChosen(self)
Definition: Config.py:1821
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:1977
def testCloneSequence(self)
Definition: Config.py:3371
def process(self)
Definition: Config.py:1734
def _placeTask(self, name, task)
Definition: Config.py:721
def makeProcessModifier(self, func)
Definition: Config.py:1791
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:1959
def addInt64(self, tracked, label, value)
Definition: Config.py:2131
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:2353
def _dumpPythonList(self, d, options)
Definition: Config.py:918
def __insertValue(self, tracked, label, value)
Definition: Config.py:2114
def splitPython(self, options=PrintOptions())
Definition: Config.py:1090
def __init__(self, kargs)
Definition: Config.py:2181
def setModuleVariant(self, module)
Definition: Config.py:2214
def __getValue(self, tracked, label)
Definition: Config.py:2116
def _place(self, name, proc)
Definition: Config.py:2005
def _placeVPSet(self, name, mod)
Definition: Config.py:731
def processAccelerators_(self)
Definition: Config.py:356
def __and__(self, other)
Definition: Config.py:1796
def globalReplace(self, label, new)
Definition: Config.py:1197
#define str(s)
def addBool(self, tracked, label, value)
Definition: Config.py:2143
def testMaxEvents(self)
Definition: Config.py:3639
def paths_(self)
Definition: Config.py:309
def addEventID(self, tracked, label, value)
Definition: Config.py:2159
def outputModules_(self)
Definition: Config.py:305
def _placeLooper(self, name, mod)
Definition: Config.py:741
def testImplicitSchedule(self)
Definition: Config.py:3560
def prune(self, verbose=False, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1350
def addVDouble(self, tracked, label, value)
Definition: Config.py:2141
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:1837
def __init__(self, process, SelectEvents=untracked.PSet(), outputCommands=untracked.vstring())
Definition: Config.py:1705
def _placeConditionalTask(self, name, task)
Definition: Config.py:724
def _replaceInScheduleDirectly(self, label, new)
Definition: Config.py:1192
def type_(self)
Definition: Config.py:1740
def __init__(self, chainedModifiers)
Definition: Config.py:1921
def testTaskPlaceholder(self)
Definition: Config.py:4029
def services_(self)
Definition: Config.py:352
def _replaceInSchedule(self, label, new)
Definition: Config.py:1186
def dumpPythonImpl(self, options)
Definition: Config.py:2268
def _dumpPython(self, d, options)
Definition: Config.py:1041
def addInt32(self, tracked, label, value)
Definition: Config.py:2123
def _isChosen(self)
Definition: Config.py:1934
def fillProcessDesc(self, processPSet)
Definition: Config.py:1428
def findProcess(module)
Definition: Config.py:94
def testProcessInsertion(self)
Definition: Config.py:2328
def __init__(self)
Definition: Config.py:2112
def aliases_(self)
Definition: Config.py:372