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