CMS 3D CMS Logo

Config.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 ### command line options helper
4 from __future__ import print_function
5 from __future__ import absolute_import
6 import six
7 import os
8 from .Options import Options
9 options = Options()
10 
11 
12 ## imports
13 import sys
14 from .Mixins import PrintOptions,_ParameterTypeBase,_SimpleParameterTypeBase, _Parameterizable, _ConfigureComponent, _TypedParameterizable, _Labelable, _Unlabelable, _ValidatingListBase, _modifyParametersFromDict
15 from .Mixins import *
16 from .Types import *
17 from .Modules import *
18 from .Modules import _Module
19 from .SequenceTypes import *
20 from .SequenceTypes import _ModuleSequenceType, _Sequenceable #extend needs it
21 from .SequenceVisitors import PathValidator, EndPathValidator, ScheduleTaskValidator, NodeVisitor, CompositeVisitor, ModuleNamesFromGlobalsVisitor
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 def checkImportPermission(minLevel = 2, allowedPatterns = []):
31  """
32  Raise an exception if called by special config files. This checks
33  the call or import stack for the importing file. An exception is raised if
34  the importing module is not in allowedPatterns and if it is called too deeply:
35  minLevel = 2: inclusion by top lvel cfg only
36  minLevel = 1: No inclusion allowed
37  allowedPatterns = ['Module1','Module2/SubModule1'] allows import
38  by any module in Module1 or Submodule1
39  """
40 
41  import inspect
42  import os
43 
44  ignorePatterns = ['FWCore/ParameterSet/Config.py','<string>','<frozen ']
45  CMSSWPath = [os.environ['CMSSW_BASE'],os.environ['CMSSW_RELEASE_BASE']]
46 
47  # Filter the stack to things in CMSSWPath and not in ignorePatterns
48  trueStack = []
49  for item in inspect.stack():
50  inPath = False
51  ignore = False
52 
53  for pattern in CMSSWPath:
54  if item[1].find(pattern) != -1:
55  inPath = True
56  break
57  if item[1].find('/') == -1: # The base file, no path
58  inPath = True
59 
60  for pattern in ignorePatterns:
61  if item[1].find(pattern) != -1:
62  ignore = True
63  break
64 
65  if inPath and not ignore:
66  trueStack.append(item[1])
67 
68  importedFile = trueStack[0]
69  importedBy = ''
70  if len(trueStack) > 1:
71  importedBy = trueStack[1]
72 
73  for pattern in allowedPatterns:
74  if importedBy.find(pattern) > -1:
75  return True
76 
77  if len(trueStack) <= minLevel: # Imported directly
78  return True
79 
80  raise ImportError("Inclusion of %s is allowed only by cfg or specified cfi files."
81  % importedFile)
82 
83 def findProcess(module):
84  """Look inside the module and find the Processes it contains"""
85  class Temp(object):
86  pass
87  process = None
88  if isinstance(module,dict):
89  if 'process' in module:
90  p = module['process']
91  module = Temp()
92  module.process = p
93  if hasattr(module,'process'):
94  if isinstance(module.process,Process):
95  process = module.process
96  else:
97  raise RuntimeError("The attribute named 'process' does not inherit from the Process class")
98  else:
99  raise RuntimeError("no 'process' attribute found in the module, please add one")
100  return process
101 
103  """Root class for a CMS configuration process"""
104  def __init__(self,name,*Mods):
105  """The argument 'name' will be the name applied to this Process
106  Can optionally pass as additional arguments cms.Modifier instances
107  that will be used to modify the Process as it is built
108  """
109  self.__dict__['_Process__name'] = name
110  if not name.isalnum():
111  raise RuntimeError("Error: The process name is an empty string or contains non-alphanumeric characters")
112  self.__dict__['_Process__filters'] = {}
113  self.__dict__['_Process__producers'] = {}
114  self.__dict__['_Process__switchproducers'] = {}
115  self.__dict__['_Process__source'] = None
116  self.__dict__['_Process__looper'] = None
117  self.__dict__['_Process__subProcesses'] = []
118  self.__dict__['_Process__schedule'] = None
119  self.__dict__['_Process__analyzers'] = {}
120  self.__dict__['_Process__outputmodules'] = {}
121  self.__dict__['_Process__paths'] = DictTypes.SortedKeysDict() # have to keep the order
122  self.__dict__['_Process__endpaths'] = DictTypes.SortedKeysDict() # of definition
123  self.__dict__['_Process__sequences'] = {}
124  self.__dict__['_Process__tasks'] = {}
125  self.__dict__['_Process__services'] = {}
126  self.__dict__['_Process__essources'] = {}
127  self.__dict__['_Process__esproducers'] = {}
128  self.__dict__['_Process__esprefers'] = {}
129  self.__dict__['_Process__aliases'] = {}
130  self.__dict__['_Process__psets']={}
131  self.__dict__['_Process__vpsets']={}
132  self.__dict__['_cloneToObjectDict'] = {}
133  # policy switch to avoid object overwriting during extend/load
134  self.__dict__['_Process__InExtendCall'] = False
135  self.__dict__['_Process__partialschedules'] = {}
136  self.__isStrict = False
137  self.__dict__['_Process__modifiers'] = Mods
138  self.options = Process.defaultOptions_()
139  self.maxEvents = Process.defaultMaxEvents_()
140  self.maxLuminosityBlocks = Process.defaultMaxLuminosityBlocks_()
141  for m in self.__modifiers:
142  m._setChosen()
143 
144  def setStrict(self, value):
145  self.__isStrict = value
146  _Module.__isStrict__ = True
147 
148  # some user-friendly methods for command-line browsing
149  def producerNames(self):
150  """Returns a string containing all the EDProducer labels separated by a blank"""
151  return ' '.join(self.producers_().keys())
153  """Returns a string containing all the SwitchProducer labels separated by a blank"""
154  return ' '.join(self.switchProducers_().keys())
155  def analyzerNames(self):
156  """Returns a string containing all the EDAnalyzer labels separated by a blank"""
157  return ' '.join(self.analyzers_().keys())
158  def filterNames(self):
159  """Returns a string containing all the EDFilter labels separated by a blank"""
160  return ' '.join(self.filters_().keys())
161  def pathNames(self):
162  """Returns a string containing all the Path names separated by a blank"""
163  return ' '.join(self.paths_().keys())
164 
165  def __setstate__(self, pkldict):
166  """
167  Unpickling hook.
168 
169  Since cloneToObjectDict stores a hash of objects by their
170  id() it needs to be updated when unpickling to use the
171  new object id values instantiated during the unpickle.
172 
173  """
174  self.__dict__.update(pkldict)
175  tmpDict = {}
176  for value in self._cloneToObjectDict.values():
177  tmpDict[id(value)] = value
178  self.__dict__['_cloneToObjectDict'] = tmpDict
179 
180 
181 
182  def filters_(self):
183  """returns a dict of the filters that have been added to the Process"""
184  return DictTypes.FixedKeysDict(self.__filters)
185  filters = property(filters_, doc="dictionary containing the filters for the process")
186  def name_(self):
187  return self.__name
188  def setName_(self,name):
189  if not name.isalnum():
190  raise RuntimeError("Error: The process name is an empty string or contains non-alphanumeric characters")
191  self.__dict__['_Process__name'] = name
192  process = property(name_,setName_, doc="name of the process")
193  def producers_(self):
194  """returns a dict of the producers that have been added to the Process"""
195  return DictTypes.FixedKeysDict(self.__producers)
196  producers = property(producers_,doc="dictionary containing the producers for the process")
197  def switchProducers_(self):
198  """returns a dict of the SwitchProducers that have been added to the Process"""
199  return DictTypes.FixedKeysDict(self.__switchproducers)
200  switchProducers = property(switchProducers_,doc="dictionary containing the SwitchProducers for the process")
201  def source_(self):
202  """returns the source that has been added to the Process or None if none have been added"""
203  return self.__source
204  def setSource_(self,src):
205  self._placeSource('source',src)
206  source = property(source_,setSource_,doc='the main source or None if not set')
207  def looper_(self):
208  """returns the looper that has been added to the Process or None if none have been added"""
209  return self.__looper
210  def setLooper_(self,lpr):
211  self._placeLooper('looper',lpr)
212  looper = property(looper_,setLooper_,doc='the main looper or None if not set')
213  @staticmethod
215  return untracked.PSet(numberOfThreads = untracked.uint32(1),
216  numberOfStreams = untracked.uint32(0),
217  numberOfConcurrentRuns = untracked.uint32(1),
218  numberOfConcurrentLuminosityBlocks = untracked.uint32(1),
219  eventSetup = untracked.PSet(
220  numberOfConcurrentIOVs = untracked.uint32(1),
221  forceNumberOfConcurrentIOVs = untracked.PSet(
222  allowAnyLabel_ = required.untracked.uint32
223  )
224  ),
225  wantSummary = untracked.bool(False),
226  fileMode = untracked.string('FULLMERGE'),
227  forceEventSetupCacheClearOnNewRun = untracked.bool(False),
228  throwIfIllegalParameter = untracked.bool(True),
229  printDependencies = untracked.bool(False),
230  sizeOfStackForThreadsInKB = optional.untracked.uint32,
231  Rethrow = untracked.vstring(),
232  SkipEvent = untracked.vstring(),
233  FailPath = untracked.vstring(),
234  IgnoreCompletely = untracked.vstring(),
235  canDeleteEarly = untracked.vstring(),
236  allowUnscheduled = obsolete.untracked.bool,
237  emptyRunLumiMode = obsolete.untracked.string,
238  makeTriggerResults = obsolete.untracked.bool
239  )
240  def __updateOptions(self,opt):
241  newOpts = self.defaultOptions_()
242  if isinstance(opt,dict):
243  for k,v in six.iteritems(opt):
244  setattr(newOpts,k,v)
245  else:
246  for p in opt.parameters_():
247  setattr(newOpts, p, getattr(opt,p))
248  return newOpts
249  @staticmethod
251  return untracked.PSet(input=optional.untracked.int32,
252  output=optional.untracked.allowed(int32,PSet))
253  def __updateMaxEvents(self,ps):
254  newMax = self.defaultMaxEvents_()
255  if isinstance(ps,dict):
256  for k,v in six.iteritems(ps):
257  setattr(newMax,k,v)
258  else:
259  for p in ps.parameters_():
260  setattr(newMax, p, getattr(ps,p))
261  return newMax
262  @staticmethod
264  return untracked.PSet(input=untracked.int32(-1))
265  def subProcesses_(self):
266  """returns a list of the subProcesses that have been added to the Process"""
267  return self.__subProcesses
268  subProcesses = property(subProcesses_,doc='the SubProcesses that have been added to the Process')
269  def analyzers_(self):
270  """returns a dict of the analyzers that have been added to the Process"""
271  return DictTypes.FixedKeysDict(self.__analyzers)
272  analyzers = property(analyzers_,doc="dictionary containing the analyzers for the process")
273  def outputModules_(self):
274  """returns a dict of the output modules that have been added to the Process"""
275  return DictTypes.FixedKeysDict(self.__outputmodules)
276  outputModules = property(outputModules_,doc="dictionary containing the output_modules for the process")
277  def paths_(self):
278  """returns a dict of the paths that have been added to the Process"""
279  return DictTypes.SortedAndFixedKeysDict(self.__paths)
280  paths = property(paths_,doc="dictionary containing the paths for the process")
281  def endpaths_(self):
282  """returns a dict of the endpaths that have been added to the Process"""
283  return DictTypes.SortedAndFixedKeysDict(self.__endpaths)
284  endpaths = property(endpaths_,doc="dictionary containing the endpaths for the process")
285  def sequences_(self):
286  """returns a dict of the sequences that have been added to the Process"""
287  return DictTypes.FixedKeysDict(self.__sequences)
288  sequences = property(sequences_,doc="dictionary containing the sequences for the process")
289  def tasks_(self):
290  """returns a dict of the tasks that have been added to the Process"""
291  return DictTypes.FixedKeysDict(self.__tasks)
292  tasks = property(tasks_,doc="dictionary containing the tasks for the process")
293  def schedule_(self):
294  """returns the schedule that has been added to the Process or None if none have been added"""
295  return self.__schedule
296  def setPartialSchedule_(self,sch,label):
297  if label == "schedule":
298  self.setSchedule_(sch)
299  else:
300  self._place(label, sch, self.__partialschedules)
301  def setSchedule_(self,sch):
302  # See if every path and endpath has been inserted into the process
303  index = 0
304  try:
305  for p in sch:
306  p.label_()
307  index +=1
308  except:
309  raise RuntimeError("The path at index "+str(index)+" in the Schedule was not attached to the process.")
310  self.__dict__['_Process__schedule'] = sch
311  schedule = property(schedule_,setSchedule_,doc='the schedule or None if not set')
312  def services_(self):
313  """returns a dict of the services that have been added to the Process"""
314  return DictTypes.FixedKeysDict(self.__services)
315  services = property(services_,doc="dictionary containing the services for the process")
316  def es_producers_(self):
317  """returns a dict of the esproducers that have been added to the Process"""
318  return DictTypes.FixedKeysDict(self.__esproducers)
319  es_producers = property(es_producers_,doc="dictionary containing the es_producers for the process")
320  def es_sources_(self):
321  """returns a the es_sources that have been added to the Process"""
322  return DictTypes.FixedKeysDict(self.__essources)
323  es_sources = property(es_sources_,doc="dictionary containing the es_sources for the process")
324  def es_prefers_(self):
325  """returns a dict of the es_prefers that have been added to the Process"""
326  return DictTypes.FixedKeysDict(self.__esprefers)
327  es_prefers = property(es_prefers_,doc="dictionary containing the es_prefers for the process")
328  def aliases_(self):
329  """returns a dict of the aliases that have been added to the Process"""
330  return DictTypes.FixedKeysDict(self.__aliases)
331  aliases = property(aliases_,doc="dictionary containing the aliases for the process")
332  def psets_(self):
333  """returns a dict of the PSets that have been added to the Process"""
334  return DictTypes.FixedKeysDict(self.__psets)
335  psets = property(psets_,doc="dictionary containing the PSets for the process")
336  def vpsets_(self):
337  """returns a dict of the VPSets that have been added to the Process"""
338  return DictTypes.FixedKeysDict(self.__vpsets)
339  vpsets = property(vpsets_,doc="dictionary containing the PSets for the process")
340 
341  def isUsingModifier(self,mod):
342  """returns True if the Modifier is in used by this Process"""
343  if mod._isChosen():
344  for m in self.__modifiers:
345  if m._isOrContains(mod):
346  return True
347  return False
348 
349  def __setObjectLabel(self, object, newLabel) :
350  if not object.hasLabel_() :
351  object.setLabel(newLabel)
352  return
353  if newLabel == object.label_() :
354  return
355  if newLabel is None :
356  object.setLabel(None)
357  return
358  if (hasattr(self, object.label_()) and id(getattr(self, object.label_())) == id(object)) :
359  msg100 = "Attempting to change the label of an attribute of the Process\n"
360  msg101 = "Old label = "+object.label_()+" New label = "+newLabel+"\n"
361  msg102 = "Type = "+str(type(object))+"\n"
362  msg103 = "Some possible solutions:\n"
363  msg104 = " 1. Clone modules instead of using simple assignment. Cloning is\n"
364  msg105 = " also preferred for other types when possible.\n"
365  msg106 = " 2. Declare new names starting with an underscore if they are\n"
366  msg107 = " for temporaries you do not want propagated into the Process. The\n"
367  msg108 = " underscore tells \"from x import *\" and process.load not to import\n"
368  msg109 = " the name.\n"
369  msg110 = " 3. Reorganize so the assigment is not necessary. Giving a second\n"
370  msg111 = " name to the same object usually causes confusion and problems.\n"
371  msg112 = " 4. Compose Sequences: newName = cms.Sequence(oldName)\n"
372  raise ValueError(msg100+msg101+msg102+msg103+msg104+msg105+msg106+msg107+msg108+msg109+msg110+msg111+msg112)
373  object.setLabel(None)
374  object.setLabel(newLabel)
375 
376  def __setattr__(self,name,value):
377  # check if the name is well-formed (only _ and alphanumerics are allowed)
378  if not name.replace('_','').isalnum():
379  raise ValueError('The label '+name+' contains forbiden characters')
380 
381  if name == 'options':
382  value = self.__updateOptions(value)
383  if name == 'maxEvents':
384  value = self.__updateMaxEvents(value)
385 
386  # private variable exempt from all this
387  if name.startswith('_Process__'):
388  self.__dict__[name]=value
389  return
390  if not isinstance(value,_ConfigureComponent):
391  raise TypeError("can only assign labels to an object that inherits from '_ConfigureComponent'\n"
392  +"an instance of "+str(type(value))+" will not work - requested label is "+name)
393  if not isinstance(value,_Labelable) and not isinstance(value,Source) and not isinstance(value,Looper) and not isinstance(value,Schedule):
394  if name == value.type_():
395  # Only Services get handled here
396  self.add_(value)
397  return
398  else:
399  raise TypeError("an instance of "+str(type(value))+" can not be assigned the label '"+name+"'.\n"+
400  "Please either use the label '"+value.type_()+" or use the 'add_' method instead.")
401  #clone the item
402  if self.__isStrict:
403  newValue =value.copy()
404  try:
405  newValue._filename = value._filename
406  except:
407  pass
408  value.setIsFrozen()
409  else:
410  newValue =value
411  if not self._okToPlace(name, value, self.__dict__):
412  newFile='top level config'
413  if hasattr(value,'_filename'):
414  newFile = value._filename
415  oldFile='top level config'
416  oldValue = getattr(self,name)
417  if hasattr(oldValue,'_filename'):
418  oldFile = oldValue._filename
419  msg = "Trying to override definition of process."+name
420  msg += "\n new object defined in: "+newFile
421  msg += "\n existing object defined in: "+oldFile
422  raise ValueError(msg)
423  # remove the old object of the name (if there is one)
424  if hasattr(self,name) and not (getattr(self,name)==newValue):
425  # Complain if items in sequences or tasks from load() statements have
426  # degenerate names, but if the user overwrites a name in the
427  # main config, replace it everywhere
428  if newValue._isTaskComponent():
429  if not self.__InExtendCall:
430  self._replaceInTasks(name, newValue)
431  self._replaceInSchedule(name, newValue)
432  else:
433  if not isinstance(newValue, Task):
434  #should check to see if used in task before complaining
435  newFile='top level config'
436  if hasattr(value,'_filename'):
437  newFile = value._filename
438  oldFile='top level config'
439  oldValue = getattr(self,name)
440  if hasattr(oldValue,'_filename'):
441  oldFile = oldValue._filename
442  msg1 = "Trying to override definition of "+name+" while it is used by the task "
443  msg2 = "\n new object defined in: "+newFile
444  msg2 += "\n existing object defined in: "+oldFile
445  s = self.__findFirstUsingModule(self.tasks,oldValue)
446  if s is not None:
447  raise ValueError(msg1+s.label_()+msg2)
448 
449  if isinstance(newValue, _Sequenceable) or newValue._isTaskComponent():
450  if not self.__InExtendCall:
451  self._replaceInSequences(name, newValue)
452  else:
453  #should check to see if used in sequence before complaining
454  newFile='top level config'
455  if hasattr(value,'_filename'):
456  newFile = value._filename
457  oldFile='top level config'
458  oldValue = getattr(self,name)
459  if hasattr(oldValue,'_filename'):
460  oldFile = oldValue._filename
461  msg1 = "Trying to override definition of "+name+" while it is used by the "
462  msg2 = "\n new object defined in: "+newFile
463  msg2 += "\n existing object defined in: "+oldFile
464  s = self.__findFirstUsingModule(self.sequences,oldValue)
465  if s is not None:
466  raise ValueError(msg1+"sequence "+s.label_()+msg2)
467  s = self.__findFirstUsingModule(self.paths,oldValue)
468  if s is not None:
469  raise ValueError(msg1+"path "+s.label_()+msg2)
470  s = self.__findFirstUsingModule(self.endpaths,oldValue)
471  if s is not None:
472  raise ValueError(msg1+"endpath "+s.label_()+msg2)
473 
474  # In case of EDAlias, raise Exception always to avoid surprises
475  if isinstance(newValue, EDAlias):
476  oldValue = getattr(self, name)
477  #should check to see if used in task/sequence before complaining
478  newFile='top level config'
479  if hasattr(value,'_filename'):
480  newFile = value._filename
481  oldFile='top level config'
482  if hasattr(oldValue,'_filename'):
483  oldFile = oldValue._filename
484  msg1 = "Trying to override definition of "+name+" with an EDAlias while it is used by the "
485  msg2 = "\n new object defined in: "+newFile
486  msg2 += "\n existing object defined in: "+oldFile
487  s = self.__findFirstUsingModule(self.tasks,oldValue)
488  if s is not None:
489  raise ValueError(msg1+"task "+s.label_()+msg2)
490  s = self.__findFirstUsingModule(self.sequences,oldValue)
491  if s is not None:
492  raise ValueError(msg1+"sequence "+s.label_()+msg2)
493  s = self.__findFirstUsingModule(self.paths,oldValue)
494  if s is not None:
495  raise ValueError(msg1+"path "+s.label_()+msg2)
496  s = self.__findFirstUsingModule(self.endpaths,oldValue)
497  if s is not None:
498  raise ValueError(msg1+"endpath "+s.label_()+msg2)
499 
500  self._delattrFromSetattr(name)
501  self.__dict__[name]=newValue
502  if isinstance(newValue,_Labelable):
503  self.__setObjectLabel(newValue, name)
504  self._cloneToObjectDict[id(value)] = newValue
505  self._cloneToObjectDict[id(newValue)] = newValue
506  #now put in proper bucket
507  newValue._place(name,self)
508  def __findFirstUsingModule(self, seqsOrTasks, mod):
509  """Given a container of sequences or tasks, find the first sequence or task
510  containing mod and return it. If none is found, return None"""
511  from FWCore.ParameterSet.SequenceTypes import ModuleNodeVisitor
512  l = list()
513  for seqOrTask in six.itervalues(seqsOrTasks):
514  l[:] = []
515  v = ModuleNodeVisitor(l)
516  seqOrTask.visit(v)
517  if mod in l:
518  return seqOrTask
519  return None
520 
521  def _delHelper(self,name):
522  if not hasattr(self,name):
523  raise KeyError('process does not know about '+name)
524  elif name.startswith('_Process__'):
525  raise ValueError('this attribute cannot be deleted')
526 
527  # we have to remove it from all dictionaries/registries
528  dicts = [item for item in self.__dict__.values() if (isinstance(item, dict) or isinstance(item, DictTypes.SortedKeysDict))]
529  for reg in dicts:
530  if name in reg: del reg[name]
531  # if it was a labelable object, the label needs to be removed
532  obj = getattr(self,name)
533  if isinstance(obj,_Labelable):
534  obj.setLabel(None)
535  if isinstance(obj,Service):
536  obj._inProcess = False
537 
538  def __delattr__(self,name):
539  self._delHelper(name)
540  obj = getattr(self,name)
541  if not obj is None:
542  if not isinstance(obj, Sequence) and not isinstance(obj, Task):
543  # For modules, ES modules and services we can also remove
544  # the deleted object from Sequences, Paths, EndPaths, and
545  # Tasks. Note that for Sequences and Tasks that cannot be done
546  # reliably as the places where the Sequence or Task was used
547  # might have been expanded so we do not even try. We considered
548  # raising an exception if a Sequences or Task was explicitly
549  # deleted, but did not because when done carefully deletion
550  # is sometimes OK (for example in the prune function where it
551  # has been checked that the deleted Sequence is not used).
552  if obj._isTaskComponent():
553  self._replaceInTasks(name, None)
554  self._replaceInSchedule(name, None)
555  if isinstance(obj, _Sequenceable) or obj._isTaskComponent():
556  self._replaceInSequences(name, None)
557  # now remove it from the process itself
558  try:
559  del self.__dict__[name]
560  except:
561  pass
562 
563  def _delattrFromSetattr(self,name):
564  """Similar to __delattr__ but we need different behavior when called from __setattr__"""
565  self._delHelper(name)
566  # now remove it from the process itself
567  try:
568  del self.__dict__[name]
569  except:
570  pass
571 
572  def add_(self,value):
573  """Allows addition of components that do not have to have a label, e.g. Services"""
574  if not isinstance(value,_ConfigureComponent):
575  raise TypeError
576  if not isinstance(value,_Unlabelable):
577  raise TypeError
578  #clone the item
579  #clone the item
580  if self.__isStrict:
581  newValue =value.copy()
582  value.setIsFrozen()
583  else:
584  newValue =value
585  newValue._place('',self)
586 
587  def _okToPlace(self, name, mod, d):
588  if not self.__InExtendCall:
589  # if going
590  return True
591  elif not self.__isStrict:
592  return True
593  elif name in d:
594  # if there's an old copy, and the new one
595  # hasn't been modified, we're done. Still
596  # not quite safe if something has been defined twice.
597  # Need to add checks
598  if mod._isModified:
599  if d[name]._isModified:
600  return False
601  else:
602  return True
603  else:
604  return True
605  else:
606  return True
607 
608  def _place(self, name, mod, d):
609  if self._okToPlace(name, mod, d):
610  if self.__isStrict and isinstance(mod, _ModuleSequenceType):
611  d[name] = mod._postProcessFixup(self._cloneToObjectDict)
612  else:
613  d[name] = mod
614  if isinstance(mod,_Labelable):
615  self.__setObjectLabel(mod, name)
616  def _placeOutputModule(self,name,mod):
617  self._place(name, mod, self.__outputmodules)
618  def _placeProducer(self,name,mod):
619  self._place(name, mod, self.__producers)
620  def _placeSwitchProducer(self,name,mod):
621  self._place(name, mod, self.__switchproducers)
622  def _placeFilter(self,name,mod):
623  self._place(name, mod, self.__filters)
624  def _placeAnalyzer(self,name,mod):
625  self._place(name, mod, self.__analyzers)
626  def _placePath(self,name,mod):
627  self._validateSequence(mod, name)
628  try:
629  self._place(name, mod, self.__paths)
630  except ModuleCloneError as msg:
631  context = format_outerframe(4)
632  raise Exception("%sThe module %s in path %s is unknown to the process %s." %(context, msg, name, self._Process__name))
633  def _placeEndPath(self,name,mod):
634  self._validateSequence(mod, name)
635  try:
636  self._place(name, mod, self.__endpaths)
637  except ModuleCloneError as msg:
638  context = format_outerframe(4)
639  raise Exception("%sThe module %s in endpath %s is unknown to the process %s." %(context, msg, name, self._Process__name))
640  def _placeSequence(self,name,mod):
641  self._validateSequence(mod, name)
642  self._place(name, mod, self.__sequences)
643  def _placeESProducer(self,name,mod):
644  self._place(name, mod, self.__esproducers)
645  def _placeESPrefer(self,name,mod):
646  self._place(name, mod, self.__esprefers)
647  def _placeESSource(self,name,mod):
648  self._place(name, mod, self.__essources)
649  def _placeTask(self,name,task):
650  self._validateTask(task, name)
651  self._place(name, task, self.__tasks)
652  def _placeAlias(self,name,mod):
653  self._place(name, mod, self.__aliases)
654  def _placePSet(self,name,mod):
655  self._place(name, mod, self.__psets)
656  def _placeVPSet(self,name,mod):
657  self._place(name, mod, self.__vpsets)
658  def _placeSource(self,name,mod):
659  """Allow the source to be referenced by 'source' or by type name"""
660  if name != 'source':
661  raise ValueError("The label '"+name+"' can not be used for a Source. Only 'source' is allowed.")
662  if self.__dict__['_Process__source'] is not None :
663  del self.__dict__[self.__dict__['_Process__source'].type_()]
664  self.__dict__['_Process__source'] = mod
665  self.__dict__[mod.type_()] = mod
666  def _placeLooper(self,name,mod):
667  if name != 'looper':
668  raise ValueError("The label '"+name+"' can not be used for a Looper. Only 'looper' is allowed.")
669  self.__dict__['_Process__looper'] = mod
670  self.__dict__[mod.type_()] = mod
671  def _placeSubProcess(self,name,mod):
672  self.__dict__['_Process__subProcess'] = mod
673  self.__dict__[mod.type_()] = mod
674  def addSubProcess(self,mod):
675  self.__subProcesses.append(mod)
676  def _placeService(self,typeName,mod):
677  self._place(typeName, mod, self.__services)
678  if typeName in self.__dict__:
679  self.__dict__[typeName]._inProcess = False
680  self.__dict__[typeName]=mod
681  def load(self, moduleName):
682  moduleName = moduleName.replace("/",".")
683  module = __import__(moduleName)
684  self.extend(sys.modules[moduleName])
685  def extend(self,other,items=()):
686  """Look in other and find types that we can use"""
687  # enable explicit check to avoid overwriting of existing objects
688  self.__dict__['_Process__InExtendCall'] = True
689 
690  seqs = dict()
691  tasksToAttach = dict()
692  mods = []
693  for name in dir(other):
694  #'from XX import *' ignores these, and so should we.
695  if name.startswith('_'):
696  continue
697  item = getattr(other,name)
698  if name == "source" or name == "looper":
699  # In these cases 'item' could be None if the specific object was not defined
700  if item is not None:
701  self.__setattr__(name,item)
702  elif isinstance(item,_ModuleSequenceType):
703  seqs[name]=item
704  elif isinstance(item,Task):
705  tasksToAttach[name] = item
706  elif isinstance(item,_Labelable):
707  self.__setattr__(name,item)
708  if not item.hasLabel_() :
709  item.setLabel(name)
710  elif isinstance(item,Schedule):
711  self.__setattr__(name,item)
712  elif isinstance(item,_Unlabelable):
713  self.add_(item)
714  elif isinstance(item,ProcessModifier):
715  mods.append(item)
716  elif isinstance(item,ProcessFragment):
717  self.extend(item)
718 
719  #now create a sequence that uses the newly made items
720  for name,seq in six.iteritems(seqs):
721  if id(seq) not in self._cloneToObjectDict:
722  self.__setattr__(name,seq)
723  else:
724  newSeq = self._cloneToObjectDict[id(seq)]
725  self.__dict__[name]=newSeq
726  self.__setObjectLabel(newSeq, name)
727  #now put in proper bucket
728  newSeq._place(name,self)
729 
730  for name, task in six.iteritems(tasksToAttach):
731  self.__setattr__(name, task)
732 
733  #apply modifiers now that all names have been added
734  for item in mods:
735  item.apply(self)
736 
737  self.__dict__['_Process__InExtendCall'] = False
738 
739  def _dumpConfigNamedList(self,items,typeName,options):
740  returnValue = ''
741  for name,item in items:
742  returnValue +=options.indentation()+typeName+' '+name+' = '+item.dumpConfig(options)
743  return returnValue
744 
745  def _dumpConfigUnnamedList(self,items,typeName,options):
746  returnValue = ''
747  for name,item in items:
748  returnValue +=options.indentation()+typeName+' = '+item.dumpConfig(options)
749  return returnValue
750 
751  def _dumpConfigOptionallyNamedList(self,items,typeName,options):
752  returnValue = ''
753  for name,item in items:
754  if name == item.type_():
755  name = ''
756  returnValue +=options.indentation()+typeName+' '+name+' = '+item.dumpConfig(options)
757  return returnValue
758 
759  def dumpConfig(self, options=PrintOptions()):
760  """return a string containing the equivalent process defined using the old configuration language"""
761  config = "process "+self.__name+" = {\n"
762  options.indent()
763  if self.source_():
764  config += options.indentation()+"source = "+self.source_().dumpConfig(options)
765  if self.looper_():
766  config += options.indentation()+"looper = "+self.looper_().dumpConfig(options)
767 
768  config+=self._dumpConfigNamedList(self.subProcesses_(),
769  'subProcess',
770  options)
771  config+=self._dumpConfigNamedList(six.iteritems(self.producers_()),
772  'module',
773  options)
774  config+=self._dumpConfigNamedList(six.iteritems(self.switchProducers_()),
775  'module',
776  options)
777  config+=self._dumpConfigNamedList(six.iteritems(self.filters_()),
778  'module',
779  options)
780  config+=self._dumpConfigNamedList(six.iteritems(self.analyzers_()),
781  'module',
782  options)
783  config+=self._dumpConfigNamedList(six.iteritems(self.outputModules_()),
784  'module',
785  options)
786  config+=self._dumpConfigNamedList(six.iteritems(self.sequences_()),
787  'sequence',
788  options)
789  config+=self._dumpConfigNamedList(six.iteritems(self.paths_()),
790  'path',
791  options)
792  config+=self._dumpConfigNamedList(six.iteritems(self.endpaths_()),
793  'endpath',
794  options)
795  config+=self._dumpConfigUnnamedList(six.iteritems(self.services_()),
796  'service',
797  options)
798  config+=self._dumpConfigNamedList(six.iteritems(self.aliases_()),
799  'alias',
800  options)
801  config+=self._dumpConfigOptionallyNamedList(
802  six.iteritems(self.es_producers_()),
803  'es_module',
804  options)
805  config+=self._dumpConfigOptionallyNamedList(
806  six.iteritems(self.es_sources_()),
807  'es_source',
808  options)
809  config += self._dumpConfigESPrefers(options)
810  for name,item in six.iteritems(self.psets):
811  config +=options.indentation()+item.configTypeName()+' '+name+' = '+item.configValue(options)
812  for name,item in six.iteritems(self.vpsets):
813  config +=options.indentation()+'VPSet '+name+' = '+item.configValue(options)
814  if self.schedule:
815  pathNames = [p.label_() for p in self.schedule]
816  config +=options.indentation()+'schedule = {'+','.join(pathNames)+'}\n'
817 
818 # config+=self._dumpConfigNamedList(six.iteritems(self.vpsets),
819 # 'VPSet',
820 # options)
821  config += "}\n"
822  options.unindent()
823  return config
824 
825  def _dumpConfigESPrefers(self, options):
826  result = ''
827  for item in six.itervalues(self.es_prefers_()):
828  result +=options.indentation()+'es_prefer '+item.targetLabel_()+' = '+item.dumpConfig(options)
829  return result
830 
831  def _dumpPythonSubProcesses(self, l, options):
832  returnValue = ''
833  for item in l:
834  returnValue += item.dumpPython(options)+'\n\n'
835  return returnValue
836 
837  def _dumpPythonList(self, d, options):
838  returnValue = ''
839  if isinstance(d, DictTypes.SortedKeysDict):
840  for name,item in d.items():
841  returnValue +='process.'+name+' = '+item.dumpPython(options)+'\n\n'
842  else:
843  for name,item in sorted(d.items()):
844  returnValue +='process.'+name+' = '+item.dumpPython(options)+'\n\n'
845  return returnValue
846 
847  def _splitPythonList(self, subfolder, d, options):
848  parts = DictTypes.SortedKeysDict()
849  for name, item in d.items() if isinstance(d, DictTypes.SortedKeysDict) else sorted(d.items()):
850  code = ''
851  dependencies = item.directDependencies()
852  for module_subfolder, module in dependencies:
853  module = module + '_cfi'
854  if options.useSubdirectories and module_subfolder:
855  module = module_subfolder + '.' + module
856  if options.targetDirectory is not None:
857  if options.useSubdirectories and subfolder:
858  module = '..' + module
859  else:
860  module = '.' + module
861  code += 'from ' + module + ' import *\n'
862  if dependencies:
863  code += '\n'
864  code += name + ' = ' + item.dumpPython(options)
865  parts[name] = subfolder, code
866  return parts
867 
868  def _validateSequence(self, sequence, label):
869  # See if every module has been inserted into the process
870  try:
871  l = set()
872  visitor = NodeNameVisitor(l)
873  sequence.visit(visitor)
874  except:
875  raise RuntimeError("An entry in sequence "+label + ' has no label')
876 
877  def _validateTask(self, task, label):
878  # See if every module and service has been inserted into the process
879  try:
880  l = set()
881  visitor = NodeNameVisitor(l)
882  task.visit(visitor)
883  except:
884  raise RuntimeError("An entry in task " + label + ' has not been attached to the process')
885 
886  def _itemsInDependencyOrder(self, processDictionaryOfItems):
887  # The items can be Sequences or Tasks and the input
888  # argument should either be the dictionary of sequences
889  # or the dictionary of tasks from the process.
890 
891  returnValue=DictTypes.SortedKeysDict()
892 
893  # For each item, see what other items it depends upon
894  # For our purpose here, an item depends on the items it contains.
895  dependencies = {}
896  for label,item in six.iteritems(processDictionaryOfItems):
897  containedItems = []
898  if isinstance(item, Task):
899  v = TaskVisitor(containedItems)
900  else:
901  v = SequenceVisitor(containedItems)
902  try:
903  item.visit(v)
904  except RuntimeError:
905  if isinstance(item, Task):
906  raise RuntimeError("Failed in a Task visitor. Probably " \
907  "a circular dependency discovered in Task with label " + label)
908  else:
909  raise RuntimeError("Failed in a Sequence visitor. Probably a " \
910  "circular dependency discovered in Sequence with label " + label)
911  for containedItem in containedItems:
912  # Check for items that both have labels and are not in the process.
913  # This should not normally occur unless someone explicitly assigns a
914  # label without putting the item in the process (which should not ever
915  # be done). We check here because this problem could cause the code
916  # in the 'while' loop below to go into an infinite loop.
917  if containedItem.hasLabel_():
918  testItem = processDictionaryOfItems.get(containedItem.label_())
919  if testItem is None or containedItem != testItem:
920  if isinstance(item, Task):
921  raise RuntimeError("Task has a label, but using its label to get an attribute" \
922  " from the process yields a different object or None\n"+
923  "label = " + containedItem.label_())
924  else:
925  raise RuntimeError("Sequence has a label, but using its label to get an attribute" \
926  " from the process yields a different object or None\n"+
927  "label = " + containedItem.label_())
928  dependencies[label]=[dep.label_() for dep in containedItems if dep.hasLabel_()]
929 
930  # keep looping until we get rid of all dependencies
931  while dependencies:
932  oldDeps = dict(dependencies)
933  for label,deps in six.iteritems(oldDeps):
934  if len(deps)==0:
935  returnValue[label]=processDictionaryOfItems[label]
936  #remove this as a dependency for all other tasks
937  del dependencies[label]
938  for lb2,deps2 in six.iteritems(dependencies):
939  while deps2.count(label):
940  deps2.remove(label)
941  return returnValue
942 
943  def _dumpPython(self, d, options):
944  result = ''
945  for name, value in sorted(six.iteritems(d)):
946  result += value.dumpPythonAs(name,options)+'\n'
947  return result
948 
949  def _splitPython(self, subfolder, d, options):
950  result = {}
951  for name, value in sorted(six.iteritems(d)):
952  result[name] = subfolder, value.dumpPythonAs(name, options) + '\n'
953  return result
954 
955  def dumpPython(self, options=PrintOptions()):
956  """return a string containing the equivalent process defined using python"""
957  specialImportRegistry._reset()
958  header = "import FWCore.ParameterSet.Config as cms"
959  result = "process = cms.Process(\""+self.__name+"\")\n\n"
960  if self.source_():
961  result += "process.source = "+self.source_().dumpPython(options)
962  if self.looper_():
963  result += "process.looper = "+self.looper_().dumpPython()
964  result+=self._dumpPythonList(self.psets, options)
965  result+=self._dumpPythonList(self.vpsets, options)
966  result+=self._dumpPythonSubProcesses(self.subProcesses_(), options)
967  result+=self._dumpPythonList(self.producers_(), options)
968  result+=self._dumpPythonList(self.switchProducers_(), options)
969  result+=self._dumpPythonList(self.filters_() , options)
970  result+=self._dumpPythonList(self.analyzers_(), options)
971  result+=self._dumpPythonList(self.outputModules_(), options)
972  result+=self._dumpPythonList(self.services_(), options)
973  result+=self._dumpPythonList(self.es_producers_(), options)
974  result+=self._dumpPythonList(self.es_sources_(), options)
975  result+=self._dumpPython(self.es_prefers_(), options)
976  result+=self._dumpPythonList(self._itemsInDependencyOrder(self.tasks), options)
977  result+=self._dumpPythonList(self._itemsInDependencyOrder(self.sequences), options)
978  result+=self._dumpPythonList(self.paths_(), options)
979  result+=self._dumpPythonList(self.endpaths_(), options)
980  result+=self._dumpPythonList(self.aliases_(), options)
981  if not self.schedule_() == None:
982  result += 'process.schedule = ' + self.schedule.dumpPython(options)
983  imports = specialImportRegistry.getSpecialImports()
984  if len(imports) > 0:
985  header += "\n" + "\n".join(imports)
986  header += "\n\n"
987  return header+result
988 
989  def splitPython(self, options = PrintOptions()):
990  """return a map of file names to python configuration fragments"""
991  specialImportRegistry._reset()
992  # extract individual fragments
993  options.isCfg = False
994  header = "import FWCore.ParameterSet.Config as cms"
995  result = ''
996  parts = {}
997  files = {}
998 
999  result = 'process = cms.Process("' + self.__name + '")\n\n'
1000 
1001  if self.source_():
1002  parts['source'] = (None, 'source = ' + self.source_().dumpPython(options))
1003 
1004  if self.looper_():
1005  parts['looper'] = (None, 'looper = ' + self.looper_().dumpPython())
1006 
1007  parts.update(self._splitPythonList('psets', self.psets, options))
1008  parts.update(self._splitPythonList('psets', self.vpsets, options))
1009  # FIXME
1010  #parts.update(self._splitPythonSubProcesses(self.subProcesses_(), options))
1011  if len(self.subProcesses_()):
1012  sys.stderr.write("error: subprocesses are not supported yet\n\n")
1013  parts.update(self._splitPythonList('modules', self.producers_(), options))
1014  parts.update(self._splitPythonList('modules', self.switchProducers_(), options))
1015  parts.update(self._splitPythonList('modules', self.filters_() , options))
1016  parts.update(self._splitPythonList('modules', self.analyzers_(), options))
1017  parts.update(self._splitPythonList('modules', self.outputModules_(), options))
1018  parts.update(self._splitPythonList('services', self.services_(), options))
1019  parts.update(self._splitPythonList('eventsetup', self.es_producers_(), options))
1020  parts.update(self._splitPythonList('eventsetup', self.es_sources_(), options))
1021  parts.update(self._splitPython('eventsetup', self.es_prefers_(), options))
1022  parts.update(self._splitPythonList('tasks', self._itemsInDependencyOrder(self.tasks), options))
1023  parts.update(self._splitPythonList('sequences', self._itemsInDependencyOrder(self.sequences), options))
1024  parts.update(self._splitPythonList('paths', self.paths_(), options))
1025  parts.update(self._splitPythonList('paths', self.endpaths_(), options))
1026  parts.update(self._splitPythonList('modules', self.aliases_(), options))
1027 
1028  if options.targetDirectory is not None:
1029  files[options.targetDirectory + '/__init__.py'] = ''
1030 
1031  if options.useSubdirectories:
1032  for sub in 'psets', 'modules', 'services', 'eventsetup', 'tasks', 'sequences', 'paths':
1033  if options.targetDirectory is not None:
1034  sub = options.targetDirectory + '/' + sub
1035  files[sub + '/__init__.py'] = ''
1036 
1037  for (name, (subfolder, code)) in six.iteritems(parts):
1038  filename = name + '_cfi'
1039  if options.useSubdirectories and subfolder:
1040  filename = subfolder + '/' + filename
1041  if options.targetDirectory is not None:
1042  filename = options.targetDirectory + '/' + filename
1043  result += 'process.load("%s")\n' % filename
1044  files[filename + '.py'] = header + '\n\n' + code
1045 
1046  if self.schedule_() is not None:
1047  options.isCfg = True
1048  result += 'process.schedule = ' + self.schedule.dumpPython(options)
1049 
1050  imports = specialImportRegistry.getSpecialImports()
1051  if len(imports) > 0:
1052  header += '\n' + '\n'.join(imports)
1053  files['-'] = header + '\n\n' + result
1054  return files
1055 
1056  def _replaceInSequences(self, label, new):
1057  old = getattr(self,label)
1058  #TODO - replace by iterator concatenation
1059  #to ovoid dependency problems between sequences, first modify
1060  # process known sequences to do a non-recursive change. Then do
1061  # a recursive change to get cases where a sub-sequence unknown to
1062  # the process has the item to be replaced
1063  for sequenceable in six.itervalues(self.sequences):
1064  sequenceable._replaceIfHeldDirectly(old,new)
1065  for sequenceable in six.itervalues(self.sequences):
1066  sequenceable.replace(old,new)
1067  for sequenceable in six.itervalues(self.paths):
1068  sequenceable.replace(old,new)
1069  for sequenceable in six.itervalues(self.endpaths):
1070  sequenceable.replace(old,new)
1071  def _replaceInTasks(self, label, new):
1072  old = getattr(self,label)
1073  for task in six.itervalues(self.tasks):
1074  task.replace(old, new)
1075  def _replaceInSchedule(self, label, new):
1076  if self.schedule_() == None:
1077  return
1078  old = getattr(self,label)
1079  for task in self.schedule_()._tasks:
1080  task.replace(old, new)
1081  def globalReplace(self,label,new):
1082  """ Replace the item with label 'label' by object 'new' in the process and all sequences/paths/tasks"""
1083  if not hasattr(self,label):
1084  raise LookupError("process has no item of label "+label)
1085  setattr(self,label,new)
1086  def _insertInto(self, parameterSet, itemDict):
1087  for name,value in six.iteritems(itemDict):
1088  value.insertInto(parameterSet, name)
1089  def _insertOneInto(self, parameterSet, label, item, tracked):
1090  vitems = []
1091  if not item == None:
1092  newlabel = item.nameInProcessDesc_(label)
1093  vitems = [newlabel]
1094  item.insertInto(parameterSet, newlabel)
1095  parameterSet.addVString(tracked, label, vitems)
1096  def _insertManyInto(self, parameterSet, label, itemDict, tracked):
1097  l = []
1098  for name,value in six.iteritems(itemDict):
1099  value.appendToProcessDescList_(l, name)
1100  value.insertInto(parameterSet, name)
1101  # alphabetical order is easier to compare with old language
1102  l.sort()
1103  parameterSet.addVString(tracked, label, l)
1104  def _insertSwitchProducersInto(self, parameterSet, labelModules, labelAliases, itemDict, tracked):
1105  modules = parameterSet.getVString(tracked, labelModules)
1106  aliases = parameterSet.getVString(tracked, labelAliases)
1107  for name,value in six.iteritems(itemDict):
1108  value.appendToProcessDescLists_(modules, aliases, name)
1109  value.insertInto(parameterSet, name)
1110  modules.sort()
1111  aliases.sort()
1112  parameterSet.addVString(tracked, labelModules, modules)
1113  parameterSet.addVString(tracked, labelAliases, aliases)
1114  def _insertSubProcessesInto(self, parameterSet, label, itemList, tracked):
1115  l = []
1116  subprocs = []
1117  for value in itemList:
1118  name = value.getProcessName()
1119  newLabel = value.nameInProcessDesc_(name)
1120  l.append(newLabel)
1121  pset = value.getSubProcessPSet(parameterSet)
1122  subprocs.append(pset)
1123  # alphabetical order is easier to compare with old language
1124  l.sort()
1125  parameterSet.addVString(tracked, label, l)
1126  parameterSet.addVPSet(False,"subProcesses",subprocs)
1127  def _insertPaths(self, processPSet, nodeVisitor):
1128  scheduledPaths = []
1129  triggerPaths = []
1130  endpaths = []
1131  if self.schedule_() == None:
1132  # make one from triggerpaths & endpaths
1133  for name in self.paths_():
1134  scheduledPaths.append(name)
1135  triggerPaths.append(name)
1136  for name in self.endpaths_():
1137  scheduledPaths.append(name)
1138  endpaths.append(name)
1139  else:
1140  for path in self.schedule_():
1141  pathname = path.label_()
1142  scheduledPaths.append(pathname)
1143  if pathname in self.endpaths_():
1144  endpaths.append(pathname)
1145  else:
1146  triggerPaths.append(pathname)
1147  for task in self.schedule_()._tasks:
1148  task.resolve(self.__dict__)
1149  scheduleTaskValidator = ScheduleTaskValidator()
1150  task.visit(scheduleTaskValidator)
1151  task.visit(nodeVisitor)
1152  processPSet.addVString(True, "@end_paths", endpaths)
1153  processPSet.addVString(True, "@paths", scheduledPaths)
1154  # trigger_paths are a little different
1155  p = processPSet.newPSet()
1156  p.addVString(True, "@trigger_paths", triggerPaths)
1157  processPSet.addPSet(True, "@trigger_paths", p)
1158  # add all these paths
1159  pathValidator = PathValidator()
1160  endpathValidator = EndPathValidator()
1161  decoratedList = []
1162  lister = DecoratedNodeNameVisitor(decoratedList)
1163  pathCompositeVisitor = CompositeVisitor(pathValidator, nodeVisitor, lister)
1164  endpathCompositeVisitor = CompositeVisitor(endpathValidator, nodeVisitor, lister)
1165  for triggername in triggerPaths:
1166  iPath = self.paths_()[triggername]
1167  iPath.resolve(self.__dict__)
1168  pathValidator.setLabel(triggername)
1169  lister.initialize()
1170  iPath.visit(pathCompositeVisitor)
1171  iPath.insertInto(processPSet, triggername, decoratedList)
1172  for endpathname in endpaths:
1173  iEndPath = self.endpaths_()[endpathname]
1174  iEndPath.resolve(self.__dict__)
1175  endpathValidator.setLabel(endpathname)
1176  lister.initialize()
1177  iEndPath.visit(endpathCompositeVisitor)
1178  iEndPath.insertInto(processPSet, endpathname, decoratedList)
1179  processPSet.addVString(False, "@filters_on_endpaths", endpathValidator.filtersOnEndpaths)
1180 
1181  def resolve(self,keepUnresolvedSequencePlaceholders=False):
1182  for x in six.itervalues(self.paths):
1183  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1184  for x in six.itervalues(self.endpaths):
1185  x.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1186  if not self.schedule_() == None:
1187  for task in self.schedule_()._tasks:
1188  task.resolve(self.__dict__,keepUnresolvedSequencePlaceholders)
1189 
1190  def prune(self,verbose=False,keepUnresolvedSequencePlaceholders=False):
1191  """ Remove clutter from the process that we think is unnecessary:
1192  tracked PSets, VPSets and unused modules and sequences. If a Schedule has been set, then Paths and EndPaths
1193  not in the schedule will also be removed, along with an modules and sequences used only by
1194  those removed Paths and EndPaths. The keepUnresolvedSequencePlaceholders keeps also unresolved TaskPlaceholders."""
1195 # need to update this to only prune psets not on refToPSets
1196 # but for now, remove the delattr
1197 # for name in self.psets_():
1198 # if getattr(self,name).isTracked():
1199 # delattr(self, name)
1200  for name in self.vpsets_():
1201  delattr(self, name)
1202  #first we need to resolve any SequencePlaceholders being used
1203  self.resolve(keepUnresolvedSequencePlaceholders)
1204  usedModules = set()
1205  unneededPaths = set()
1206  tasks = list()
1207  tv = TaskVisitor(tasks)
1208  if self.schedule_():
1209  usedModules=set(self.schedule_().moduleNames())
1210  #get rid of unused paths
1211  schedNames = set(( x.label_() for x in self.schedule_()))
1212  names = set(self.paths)
1213  names.update(set(self.endpaths))
1214  unneededPaths = names - schedNames
1215  for n in unneededPaths:
1216  delattr(self,n)
1217  for t in self.schedule_().tasks():
1218  tv.enter(t)
1219  t.visit(tv)
1220  tv.leave(t)
1221  else:
1222  pths = list(six.itervalues(self.paths))
1223  pths.extend(six.itervalues(self.endpaths))
1224  temp = Schedule(*pths)
1225  usedModules=set(temp.moduleNames())
1226  unneededModules = self._pruneModules(self.producers_(), usedModules)
1227  unneededModules.update(self._pruneModules(self.switchProducers_(), usedModules))
1228  unneededModules.update(self._pruneModules(self.filters_(), usedModules))
1229  unneededModules.update(self._pruneModules(self.analyzers_(), usedModules))
1230  #remove sequences and tasks that do not appear in remaining paths and endpaths
1231  seqs = list()
1232  sv = SequenceVisitor(seqs)
1233  for p in six.itervalues(self.paths):
1234  p.visit(sv)
1235  p.visit(tv)
1236  for p in six.itervalues(self.endpaths):
1237  p.visit(sv)
1238  p.visit(tv)
1239  def removeUnneeded(seqOrTasks, allSequencesOrTasks):
1240  _keepSet = set(( s for s in seqOrTasks if s.hasLabel_()))
1241  _availableSet = set(six.itervalues(allSequencesOrTasks))
1242  _unneededSet = _availableSet-_keepSet
1243  _unneededLabels = []
1244  for s in _unneededSet:
1245  _unneededLabels.append(s.label_())
1246  delattr(self,s.label_())
1247  return _unneededLabels
1248  unneededSeqLabels = removeUnneeded(seqs, self.sequences)
1249  unneededTaskLabels = removeUnneeded(tasks, self.tasks)
1250  if verbose:
1251  print("prune removed the following:")
1252  print(" modules:"+",".join(unneededModules))
1253  print(" tasks:"+",".join(unneededTaskLabels))
1254  print(" sequences:"+",".join(unneededSeqLabels))
1255  print(" paths/endpaths:"+",".join(unneededPaths))
1256  def _pruneModules(self, d, scheduledNames):
1257  moduleNames = set(d.keys())
1258  junk = moduleNames - scheduledNames
1259  for name in junk:
1260  delattr(self, name)
1261  return junk
1262 
1263  def fillProcessDesc(self, processPSet):
1264  """Used by the framework to convert python to C++ objects"""
1265  class ServiceInjectorAdaptor(object):
1266  def __init__(self,ppset,thelist):
1267  self.__thelist = thelist
1268  self.__processPSet = ppset
1269  def addService(self,pset):
1270  self.__thelist.append(pset)
1271  def newPSet(self):
1272  return self.__processPSet.newPSet()
1273  #This adaptor is used to 'add' the method 'getTopPSet_'
1274  # to the ProcessDesc and PythonParameterSet C++ classes.
1275  # This method is needed for the PSet refToPSet_ functionality.
1276  class TopLevelPSetAcessorAdaptor(object):
1277  def __init__(self,ppset,process):
1278  self.__ppset = ppset
1279  self.__process = process
1280  def __getattr__(self,attr):
1281  return getattr(self.__ppset,attr)
1282  def getTopPSet_(self,label):
1283  return getattr(self.__process,label)
1284  def newPSet(self):
1285  return TopLevelPSetAcessorAdaptor(self.__ppset.newPSet(),self.__process)
1286  def addPSet(self,tracked,name,ppset):
1287  return self.__ppset.addPSet(tracked,name,self.__extractPSet(ppset))
1288  def addVPSet(self,tracked,name,vpset):
1289  return self.__ppset.addVPSet(tracked,name,[self.__extractPSet(x) for x in vpset])
1290  def __extractPSet(self,pset):
1291  if isinstance(pset,TopLevelPSetAcessorAdaptor):
1292  return pset.__ppset
1293  return pset
1294 
1295  self.validate()
1296  processPSet.addString(True, "@process_name", self.name_())
1297  all_modules = self.producers_().copy()
1298  all_modules.update(self.filters_())
1299  all_modules.update(self.analyzers_())
1300  all_modules.update(self.outputModules_())
1301  adaptor = TopLevelPSetAcessorAdaptor(processPSet,self)
1302  self._insertInto(adaptor, self.psets_())
1303  self._insertInto(adaptor, self.vpsets_())
1304  self._insertOneInto(adaptor, "@all_sources", self.source_(), True)
1305  self._insertOneInto(adaptor, "@all_loopers", self.looper_(), True)
1306  self._insertSubProcessesInto(adaptor, "@all_subprocesses", self.subProcesses_(), False)
1307  self._insertManyInto(adaptor, "@all_esprefers", self.es_prefers_(), True)
1308  self._insertManyInto(adaptor, "@all_aliases", self.aliases_(), True)
1309  # This will visit all the paths and endpaths that are scheduled to run,
1310  # as well as the Tasks associated to them and the schedule. It remembers
1311  # the modules, ESSources, ESProducers, and services it visits.
1312  nodeVisitor = NodeVisitor()
1313  self._insertPaths(adaptor, nodeVisitor)
1314  all_modules_onTasksOrScheduled = { key:value for key, value in six.iteritems(all_modules) if value in nodeVisitor.modules }
1315  self._insertManyInto(adaptor, "@all_modules", all_modules_onTasksOrScheduled, True)
1316  all_switches = self.switchProducers_().copy()
1317  all_switches_onTasksOrScheduled = {key:value for key, value in six.iteritems(all_switches) if value in nodeVisitor.modules }
1318  self._insertSwitchProducersInto(adaptor, "@all_modules", "@all_aliases", all_switches_onTasksOrScheduled, True)
1319  # Same as nodeVisitor except this one visits all the Tasks attached
1320  # to the process.
1321  processNodeVisitor = NodeVisitor()
1322  for pTask in six.itervalues(self.tasks):
1323  pTask.visit(processNodeVisitor)
1324  esProducersToEnable = {}
1325  for esProducerName, esProducer in six.iteritems(self.es_producers_()):
1326  if esProducer in nodeVisitor.esProducers or not (esProducer in processNodeVisitor.esProducers):
1327  esProducersToEnable[esProducerName] = esProducer
1328  self._insertManyInto(adaptor, "@all_esmodules", esProducersToEnable, True)
1329  esSourcesToEnable = {}
1330  for esSourceName, esSource in six.iteritems(self.es_sources_()):
1331  if esSource in nodeVisitor.esSources or not (esSource in processNodeVisitor.esSources):
1332  esSourcesToEnable[esSourceName] = esSource
1333  self._insertManyInto(adaptor, "@all_essources", esSourcesToEnable, True)
1334  #handle services differently
1335  services = []
1336  for serviceName, serviceObject in six.iteritems(self.services_()):
1337  if serviceObject in nodeVisitor.services or not (serviceObject in processNodeVisitor.services):
1338  serviceObject.insertInto(ServiceInjectorAdaptor(adaptor,services))
1339  adaptor.addVPSet(False,"services",services)
1340  return processPSet
1341 
1342  def validate(self):
1343  # check if there's some input
1344  # Breaks too many unit tests for now
1345  #if self.source_() == None and self.looper_() == None:
1346  # raise RuntimeError("No input source was found for this process")
1347  pass
1348 
1349  def prefer(self, esmodule,*args,**kargs):
1350  """Prefer this ES source or producer. The argument can
1351  either be an object label, e.g.,
1352  process.prefer(process.juicerProducer) (not supported yet)
1353  or a name of an ESSource or ESProducer
1354  process.prefer("juicer")
1355  or a type of unnamed ESSource or ESProducer
1356  process.prefer("JuicerProducer")
1357  In addition, you can pass as a labelled arguments the name of the Record you wish to
1358  prefer where the type passed is a cms.vstring and that vstring can contain the
1359  name of the C++ types in the Record that are being preferred, e.g.,
1360  #prefer all data in record 'OrangeRecord' from 'juicer'
1361  process.prefer("juicer", OrangeRecord=cms.vstring())
1362  or
1363  #prefer only "Orange" data in "OrangeRecord" from "juicer"
1364  process.prefer("juicer", OrangeRecord=cms.vstring("Orange"))
1365  or
1366  #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
1367  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
1368  """
1369  # see if this refers to a named ESProducer
1370  if isinstance(esmodule, ESSource) or isinstance(esmodule, ESProducer):
1371  raise RuntimeError("Syntax of process.prefer(process.esmodule) not supported yet")
1372  elif self._findPreferred(esmodule, self.es_producers_(),*args,**kargs) or \
1373  self._findPreferred(esmodule, self.es_sources_(),*args,**kargs):
1374  pass
1375  else:
1376  raise RuntimeError("Cannot resolve prefer for "+repr(esmodule))
1377 
1378  def _findPreferred(self, esname, d,*args,**kargs):
1379  # is esname a name in the dictionary?
1380  if esname in d:
1381  typ = d[esname].type_()
1382  if typ == esname:
1383  self.__setattr__( esname+"_prefer", ESPrefer(typ,*args,**kargs) )
1384  else:
1385  self.__setattr__( esname+"_prefer", ESPrefer(typ, esname,*args,**kargs) )
1386  return True
1387  else:
1388  # maybe it's an unnamed ESModule?
1389  found = False
1390  for name, value in six.iteritems(d):
1391  if value.type_() == esname:
1392  if found:
1393  raise RuntimeError("More than one ES module for "+esname)
1394  found = True
1395  self.__setattr__(esname+"_prefer", ESPrefer(d[esname].type_()) )
1396  return found
1397 
1398 
1400  def __init__(self, process):
1401  if isinstance(process, Process):
1402  self.__process = process
1403  elif isinstance(process, str):
1404  self.__process = Process(process)
1405  #make sure we do not override the defaults
1406  del self.__process.options
1407  del self.__process.maxEvents
1408  del self.__process.maxLuminosityBlocks
1409  else:
1410  raise TypeError('a ProcessFragment can only be constructed from an existig Process or from process name')
1411  def __dir__(self):
1412  return [ x for x in dir(self.__process) if isinstance(getattr(self.__process, x), _ConfigureComponent) ]
1413  def __getattribute__(self, name):
1414  if name == '_ProcessFragment__process':
1415  return object.__getattribute__(self, '_ProcessFragment__process')
1416  else:
1417  return getattr(self.__process, name)
1418  def __setattr__(self, name, value):
1419  if name == '_ProcessFragment__process':
1420  object.__setattr__(self, name, value)
1421  else:
1422  setattr(self.__process, name, value)
1423  def __delattr__(self, name):
1424  if name == '_ProcessFragment__process':
1425  pass
1426  else:
1427  return delattr(self.__process, name)
1428 
1429 
1430 class FilteredStream(dict):
1431  """a dictionary with fixed keys"""
1433  raise AttributeError("An FilteredStream defintion cannot be modified after creation.")
1434  _blocked_attribute = property(_blocked_attribute)
1435  __setattr__ = __delitem__ = __setitem__ = clear = _blocked_attribute
1436  pop = popitem = setdefault = update = _blocked_attribute
1437  def __new__(cls, *args, **kw):
1438  new = dict.__new__(cls)
1439  dict.__init__(new, *args, **kw)
1440  keys = sorted(kw.keys())
1441  if keys != ['content', 'dataTier', 'name', 'paths', 'responsible', 'selectEvents']:
1442  raise ValueError("The needed parameters are: content, dataTier, name, paths, responsible, selectEvents")
1443  if not isinstance(kw['name'],str):
1444  raise ValueError("name must be of type string")
1445  if not isinstance(kw['content'], vstring) and not isinstance(kw['content'],str):
1446  raise ValueError("content must be of type vstring or string")
1447  if not isinstance(kw['dataTier'], string):
1448  raise ValueError("dataTier must be of type string")
1449  if not isinstance(kw['selectEvents'], PSet):
1450  raise ValueError("selectEvents must be of type PSet")
1451  if not isinstance(kw['paths'],(tuple, Path)):
1452  raise ValueError("'paths' must be a tuple of paths")
1453  return new
1454  def __init__(self, *args, **kw):
1455  pass
1456  def __repr__(self):
1457  return "FilteredStream object: %s" %self["name"]
1458  def __getattr__(self,attr):
1459  return self[attr]
1460 
1462  """Allows embedding another process within a parent process. This allows one to
1463  chain processes together directly in one cmsRun job rather than having to run
1464  separate jobs that are connected via a temporary file.
1465  """
1466  def __init__(self,process, SelectEvents = untracked.PSet(), outputCommands = untracked.vstring()):
1467  """
1468  """
1469  if not isinstance(process, Process):
1470  raise ValueError("the 'process' argument must be of type cms.Process")
1471  if not isinstance(SelectEvents,PSet):
1472  raise ValueError("the 'SelectEvents' argument must be of type cms.untracked.PSet")
1473  if not isinstance(outputCommands,vstring):
1474  raise ValueError("the 'outputCommands' argument must be of type cms.untracked.vstring")
1475  self.__process = process
1476  self.__SelectEvents = SelectEvents
1477  self.__outputCommands = outputCommands
1478  def dumpPython(self, options=PrintOptions()):
1479  out = "parentProcess"+str(hash(self))+" = process\n"
1480  out += self.__process.dumpPython()
1481  out += "childProcess = process\n"
1482  out += "process = parentProcess"+str(hash(self))+"\n"
1483  out += "process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = "+self.__SelectEvents.dumpPython(options) +", outputCommands = "+self.__outputCommands.dumpPython(options) +"))"
1484  return out
1485  def getProcessName(self):
1486  return self.__process.name_()
1487  def process(self):
1488  return self.__process
1489  def SelectEvents(self):
1490  return self.__SelectEvents
1491  def outputCommands(self):
1492  return self.__outputCommands
1493  def type_(self):
1494  return 'subProcess'
1495  def nameInProcessDesc_(self,label):
1496  return label
1497  def _place(self,label,process):
1498  process._placeSubProcess('subProcess',self)
1499  def getSubProcessPSet(self,parameterSet):
1500  topPSet = parameterSet.newPSet()
1501  self.__process.fillProcessDesc(topPSet)
1502  subProcessPSet = parameterSet.newPSet()
1503  self.__SelectEvents.insertInto(subProcessPSet,"SelectEvents")
1504  self.__outputCommands.insertInto(subProcessPSet,"outputCommands")
1505  subProcessPSet.addPSet(False,"process",topPSet)
1506  return subProcessPSet
1507 
1509  """Helper class for Modifier that takes key/value pairs and uses them to reset parameters of the object"""
1510  def __init__(self,args):
1511  self.__args = args
1512  def __call__(self,obj):
1513  params = {}
1514  for k in six.iterkeys(self.__args):
1515  if hasattr(obj,k):
1516  params[k] = getattr(obj,k)
1518  for k in six.iterkeys(self.__args):
1519  if k in params:
1520  setattr(obj,k,params[k])
1521  else:
1522  #the parameter must have been removed
1523  delattr(obj,k)
1524  @staticmethod
1526  raise KeyError("Unknown parameter name "+key+" specified while calling Modifier")
1527 
1529  """A helper base class for _AndModifier, _InvertModifier, and _OrModifier to contain the common code"""
1530  def __init__(self, lhs, rhs=None):
1531  self._lhs = lhs
1532  if rhs is not None:
1533  self._rhs = rhs
1534  def toModify(self,obj, func=None,**kw):
1535  Modifier._toModifyCheck(obj,func,**kw)
1536  if not self._isChosen():
1537  return
1538  Modifier._toModify(obj,func,**kw)
1539  def toReplaceWith(self,toObj,fromObj):
1540  Modifier._toReplaceWithCheck(toObj,fromObj)
1541  if not self._isChosen():
1542  return
1543  Modifier._toReplaceWith(toObj,fromObj)
1544  def makeProcessModifier(self,func):
1545  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1546  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1547  In order to work, the value returned from this function must be assigned to a uniquely named variable."""
1548  return ProcessModifier(self,func)
1549  def __and__(self, other):
1550  return _AndModifier(self,other)
1551  def __invert__(self):
1552  return _InvertModifier(self)
1553  def __or__(self, other):
1554  return _OrModifier(self,other)
1555 
1557  """A modifier which only applies if multiple Modifiers are chosen"""
1558  def __init__(self, lhs, rhs):
1559  super(_AndModifier,self).__init__(lhs, rhs)
1560  def _isChosen(self):
1561  return self._lhs._isChosen() and self._rhs._isChosen()
1562 
1564  """A modifier which only applies if a Modifier is not chosen"""
1565  def __init__(self, lhs):
1566  super(_InvertModifier,self).__init__(lhs)
1567  def _isChosen(self):
1568  return not self._lhs._isChosen()
1569 
1571  """A modifier which only applies if at least one of multiple Modifiers is chosen"""
1572  def __init__(self, lhs, rhs):
1573  super(_OrModifier,self).__init__(lhs, rhs)
1574  def _isChosen(self):
1575  return self._lhs._isChosen() or self._rhs._isChosen()
1576 
1577 
1579  """This class is used to define standard modifications to a Process.
1580  An instance of this class is declared to denote a specific modification,e.g. era2017 could
1581  reconfigure items in a process to match our expectation of running in 2017. Once declared,
1582  these Modifier instances are imported into a configuration and items that need to be modified
1583  are then associated with the Modifier and with the action to do the modification.
1584  The registered modifications will only occur if the Modifier was passed to
1585  the cms.Process' constructor.
1586  """
1587  def __init__(self):
1589  self.__chosen = False
1590  def makeProcessModifier(self,func):
1591  """This is used to create a ProcessModifer that can perform actions on the process as a whole.
1592  This takes as argument a callable object (e.g. function) that takes as its sole argument an instance of Process.
1593  In order to work, the value returned from this function must be assigned to a uniquely named variable.
1594  """
1595  return ProcessModifier(self,func)
1596  @staticmethod
1597  def _toModifyCheck(obj,func,**kw):
1598  if func is not None and len(kw) != 0:
1599  raise TypeError("toModify takes either two arguments or one argument and key/value pairs")
1600  def toModify(self,obj, func=None,**kw):
1601  """This is used to register an action to be performed on the specific object. Two different forms are allowed
1602  Form 1: A callable object (e.g. function) can be passed as the second. This callable object is expected to take one argument
1603  that will be the object passed in as the first argument.
1604  Form 2: A list of parameter name, value pairs can be passed
1605  mod.toModify(foo, fred=cms.int32(7), barney = cms.double(3.14))
1606  This form can also be used to remove a parameter by passing the value of None
1607  #remove the parameter foo.fred
1608  mod.toModify(foo, fred = None)
1609  Additionally, parameters embedded within PSets can also be modified using a dictionary
1610  #change foo.fred.pebbles to 3 and foo.fred.friend to "barney"
1611  mod.toModify(foo, fred = dict(pebbles = 3, friend = "barney)) )
1612  """
1613  Modifier._toModifyCheck(obj,func,**kw)
1614  if not self._isChosen():
1615  return
1616  Modifier._toModify(obj,func,**kw)
1617  @staticmethod
1618  def _toModify(obj,func,**kw):
1619  if func is not None:
1620  func(obj)
1621  else:
1622  temp =_ParameterModifier(kw)
1623  temp(obj)
1624  @staticmethod
1625  def _toReplaceWithCheck(toObj,fromObj):
1626  if not isinstance(fromObj, type(toObj)):
1627  raise TypeError("toReplaceWith requires both arguments to be the same class type")
1628  def toReplaceWith(self,toObj,fromObj):
1629  """If the Modifier is chosen the internals of toObj will be associated with the internals of fromObj
1630  """
1631  Modifier._toReplaceWithCheck(toObj,fromObj)
1632  if not self._isChosen():
1633  return
1634  Modifier._toReplaceWith(toObj,fromObj)
1635  @staticmethod
1636  def _toReplaceWith(toObj,fromObj):
1637  if isinstance(fromObj,_ModuleSequenceType):
1638  toObj._seq = fromObj._seq
1639  toObj._tasks = fromObj._tasks
1640  elif isinstance(fromObj,Task):
1641  toObj._collection = fromObj._collection
1642  elif isinstance(fromObj,_Parameterizable):
1643  #clear old items just incase fromObj is not a complete superset of toObj
1644  for p in toObj.parameterNames_():
1645  delattr(toObj,p)
1646  for p in fromObj.parameterNames_():
1647  setattr(toObj,p,getattr(fromObj,p))
1648  if isinstance(fromObj,_TypedParameterizable):
1649  toObj._TypedParameterizable__type = fromObj._TypedParameterizable__type
1650 
1651  else:
1652  raise TypeError("toReplaceWith does not work with type "+str(type(toObj)))
1653 
1654  def _setChosen(self):
1655  """Should only be called by cms.Process instances"""
1656  self.__chosen = True
1657  def _isChosen(self):
1658  return self.__chosen
1659  def __and__(self, other):
1660  return _AndModifier(self,other)
1661  def __invert__(self):
1662  return _InvertModifier(self)
1663  def __or__(self, other):
1664  return _OrModifier(self,other)
1665  def _isOrContains(self, other):
1666  return self == other
1667 
1668 
1670  """A Modifier made up of a list of Modifiers
1671  """
1672  def __init__(self, *chainedModifiers):
1673  self.__chosen = False
1674  self.__chain = chainedModifiers
1675  def _applyNewProcessModifiers(self,process):
1676  """Should only be called by cms.Process instances
1677  applies list of accumulated changes to the process"""
1678  for m in self.__chain:
1679  m._applyNewProcessModifiers(process)
1680  def _setChosen(self):
1681  """Should only be called by cms.Process instances"""
1682  self.__chosen = True
1683  for m in self.__chain:
1684  m._setChosen()
1685  def _isChosen(self):
1686  return self.__chosen
1687  def copyAndExclude(self, toExclude):
1688  """Creates a new ModifierChain which is a copy of
1689  this ModifierChain but excludes any Modifier or
1690  ModifierChain in the list toExclude.
1691  The exclusion is done recursively down the chain.
1692  """
1693  newMods = []
1694  for m in self.__chain:
1695  if m not in toExclude:
1696  s = m
1697  if isinstance(m,ModifierChain):
1698  s = m.__copyIfExclude(toExclude)
1699  newMods.append(s)
1700  return ModifierChain(*newMods)
1701  def __copyIfExclude(self,toExclude):
1702  shouldCopy = False
1703  for m in toExclude:
1704  if self._isOrContains(m):
1705  shouldCopy = True
1706  break
1707  if shouldCopy:
1708  return self.copyAndExclude(toExclude)
1709  return self
1710  def _isOrContains(self, other):
1711  if self is other:
1712  return True
1713  for m in self.__chain:
1714  if m._isOrContains(other):
1715  return True
1716  return False
1717 
1719  """A class used by a Modifier to affect an entire Process instance.
1720  When a Process 'loads' a module containing a ProcessModifier, that
1721  ProcessModifier will be applied to the Process if and only if the
1722  Modifier passed to the constructor has been chosen.
1723  """
1724  def __init__(self, modifier, func):
1725  self.__modifier = modifier
1726  self.__func = func
1727  self.__seenProcesses = set()
1728  def apply(self,process):
1729  if self.__modifier._isChosen():
1730  if process not in self.__seenProcesses:
1731  self.__func(process)
1732  self.__seenProcesses.add(process)
1733 
1734 if __name__=="__main__":
1735  import unittest
1736  import copy
1737 
1738  def _lineDiff(newString, oldString):
1739  newString = ( x for x in newString.split('\n') if len(x) > 0)
1740  oldString = [ x for x in oldString.split('\n') if len(x) > 0]
1741  diff = []
1742  oldStringLine = 0
1743  for l in newString:
1744  if oldStringLine >= len(oldString):
1745  diff.append(l)
1746  continue
1747  if l == oldString[oldStringLine]:
1748  oldStringLine +=1
1749  continue
1750  diff.append(l)
1751  return "\n".join( diff )
1752 
1754  """Has same interface as the C++ object that creates PSets
1755  """
1756  def __init__(self):
1757  self.values = dict()
1758  def __insertValue(self,tracked,label,value):
1759  self.values[label]=(tracked,value)
1760  def __getValue(self,tracked,label):
1761  pair = self.values[label]
1762  if pair[0] != tracked:
1763  raise Exception("Asked for %s parameter '%s', but it is %s" % ("tracked" if tracked else "untracked",
1764  label,
1765  "tracked" if pair[0] else "untracked"))
1766  return pair[1]
1767  def addInt32(self,tracked,label,value):
1768  self.__insertValue(tracked,label,value)
1769  def addVInt32(self,tracked,label,value):
1770  self.__insertValue(tracked,label,value)
1771  def addUInt32(self,tracked,label,value):
1772  self.__insertValue(tracked,label,value)
1773  def addVUInt32(self,tracked,label,value):
1774  self.__insertValue(tracked,label,value)
1775  def addInt64(self,tracked,label,value):
1776  self.__insertValue(tracked,label,value)
1777  def addVInt64(self,tracked,label,value):
1778  self.__insertValue(tracked,label,value)
1779  def addUInt64(self,tracked,label,value):
1780  self.__insertValue(tracked,label,value)
1781  def addVUInt64(self,tracked,label,value):
1782  self.__insertValue(tracked,label,value)
1783  def addDouble(self,tracked,label,value):
1784  self.__insertValue(tracked,label,value)
1785  def addVDouble(self,tracked,label,value):
1786  self.__insertValue(tracked,label,value)
1787  def addBool(self,tracked,label,value):
1788  self.__insertValue(tracked,label,value)
1789  def addString(self,tracked,label,value):
1790  self.__insertValue(tracked,label,value)
1791  def addVString(self,tracked,label,value):
1792  self.__insertValue(tracked,label,value)
1793  def getVString(self,tracked,label):
1794  return self.__getValue(tracked, label)
1795  def addInputTag(self,tracked,label,value):
1796  self.__insertValue(tracked,label,value)
1797  def addVInputTag(self,tracked,label,value):
1798  self.__insertValue(tracked,label,value)
1799  def addESInputTag(self,tracked,label,value):
1800  self.__insertValue(tracked,label,value)
1801  def addVESInputTag(self,tracked,label,value):
1802  self.__insertValue(tracked,label,value)
1803  def addEventID(self,tracked,label,value):
1804  self.__insertValue(tracked,label,value)
1805  def addVEventID(self,tracked,label,value):
1806  self.__insertValue(tracked,label,value)
1807  def addLuminosityBlockID(self,tracked,label,value):
1808  self.__insertValue(tracked,label,value)
1809  def addLuminosityBlockID(self,tracked,label,value):
1810  self.__insertValue(tracked,label,value)
1811  def addEventRange(self,tracked,label,value):
1812  self.__insertValue(tracked,label,value)
1813  def addVEventRange(self,tracked,label,value):
1814  self.__insertValue(tracked,label,value)
1815  def addPSet(self,tracked,label,value):
1816  self.__insertValue(tracked,label,value)
1817  def addVPSet(self,tracked,label,value):
1818  self.__insertValue(tracked,label,value)
1819  def addFileInPath(self,tracked,label,value):
1820  self.__insertValue(tracked,label,value)
1821  def newPSet(self):
1822  return TestMakePSet()
1823 
1825  def __init__(self, **kargs):
1826  super(SwitchProducerTest,self).__init__(
1827  dict(
1828  test1 = lambda: (True, -10),
1829  test2 = lambda: (True, -9),
1830  test3 = lambda: (True, -8),
1831  test4 = lambda: (True, -7)
1832  ), **kargs)
1833  specialImportRegistry.registerSpecialImportForType(SwitchProducerTest, "from test import SwitchProducerTest")
1834 
1835  class TestModuleCommand(unittest.TestCase):
1836  def setUp(self):
1837  """Nothing to do """
1838  None
1840  p = _Parameterizable()
1841  self.assertEqual(len(p.parameterNames_()),0)
1842  p.a = int32(1)
1843  self.assertTrue('a' in p.parameterNames_())
1844  self.assertEqual(p.a.value(), 1)
1845  p.a = 10
1846  self.assertEqual(p.a.value(), 10)
1847  p.a = untracked(int32(1))
1848  self.assertEqual(p.a.value(), 1)
1849  self.assertFalse(p.a.isTracked())
1850  p.a = untracked.int32(1)
1851  self.assertEqual(p.a.value(), 1)
1852  self.assertFalse(p.a.isTracked())
1853  p = _Parameterizable(foo=int32(10), bar = untracked(double(1.0)))
1854  self.assertEqual(p.foo.value(), 10)
1855  self.assertEqual(p.bar.value(),1.0)
1856  self.assertFalse(p.bar.isTracked())
1857  self.assertRaises(TypeError,setattr,(p,'c',1))
1858  p = _Parameterizable(a=PSet(foo=int32(10), bar = untracked(double(1.0))))
1859  self.assertEqual(p.a.foo.value(),10)
1860  self.assertEqual(p.a.bar.value(),1.0)
1861  p.b = untracked(PSet(fii = int32(1)))
1862  self.assertEqual(p.b.fii.value(),1)
1863  self.assertFalse(p.b.isTracked())
1864  #test the fact that values can be shared
1865  v = int32(10)
1866  p=_Parameterizable(a=v)
1867  v.setValue(11)
1868  self.assertEqual(p.a.value(),11)
1869  p.a = 12
1870  self.assertEqual(p.a.value(),12)
1871  self.assertEqual(v.value(),12)
1873  p = _TypedParameterizable("blah", b=int32(1))
1874  #see if copy works deeply
1875  other = p.copy()
1876  other.b = 2
1877  self.assertNotEqual(p.b,other.b)
1878 
1880  p = Process("test")
1881  p.a = EDAnalyzer("MyAnalyzer")
1882  self.assertTrue( 'a' in p.analyzers_() )
1883  self.assertTrue( 'a' in p.analyzers)
1884  p.add_(Service("MessageLogger"))
1885  self.assertTrue('MessageLogger' in p.services_())
1886  self.assertEqual(p.MessageLogger.type_(), "MessageLogger")
1887  p.Tracer = Service("Tracer")
1888  self.assertTrue('Tracer' in p.services_())
1889  self.assertRaises(TypeError, setattr, *(p,'b',"this should fail"))
1890  self.assertRaises(TypeError, setattr, *(p,'bad',Service("MessageLogger")))
1891  self.assertRaises(ValueError, setattr, *(p,'bad',Source("PoolSource")))
1892  p.out = OutputModule("Outer")
1893  self.assertEqual(p.out.type_(), 'Outer')
1894  self.assertTrue( 'out' in p.outputModules_() )
1895 
1896  p.geom = ESSource("GeomProd")
1897  self.assertTrue('geom' in p.es_sources_())
1898  p.add_(ESSource("ConfigDB"))
1899  self.assertTrue('ConfigDB' in p.es_sources_())
1900 
1901  p.aliasfoo1 = EDAlias(foo1 = VPSet(PSet(type = string("Foo1"))))
1902  self.assertTrue('aliasfoo1' in p.aliases_())
1903 
1905  class FromArg(object):
1906  def __init__(self,*arg,**args):
1907  for name in six.iterkeys(args):
1908  self.__dict__[name]=args[name]
1909 
1910  a=EDAnalyzer("MyAnalyzer")
1911  t=EDAnalyzer("MyAnalyzer")
1912  t.setLabel("foo")
1913  s1 = Sequence(a)
1914  s2 = Sequence(s1)
1915  s3 = Sequence(s2)
1916  d = FromArg(
1917  a=a,
1918  b=Service("Full"),
1919  c=Path(a),
1920  d=s2,
1921  e=s1,
1922  f=s3,
1923  g=Sequence(s1+s2+s3)
1924  )
1925  p = Process("Test")
1926  p.extend(d)
1927  self.assertEqual(p.a.type_(),"MyAnalyzer")
1928  self.assertEqual(p.a.label_(),"a")
1929  self.assertRaises(AttributeError,getattr,p,'b')
1930  self.assertEqual(p.Full.type_(),"Full")
1931  self.assertEqual(str(p.c),'a')
1932  self.assertEqual(str(p.d),'a')
1933 
1934  z1 = FromArg(
1935  a=a,
1936  b=Service("Full"),
1937  c=Path(a),
1938  d=s2,
1939  e=s1,
1940  f=s3,
1941  s4=s3,
1942  g=Sequence(s1+s2+s3)
1943  )
1944 
1945  p1 = Process("Test")
1946  #p1.extend(z1)
1947  self.assertRaises(ValueError, p1.extend, z1)
1948 
1949  z2 = FromArg(
1950  a=a,
1951  b=Service("Full"),
1952  c=Path(a),
1953  d=s2,
1954  e=s1,
1955  f=s3,
1956  aaa=copy.deepcopy(a),
1957  s4=copy.deepcopy(s3),
1958  g=Sequence(s1+s2+s3),
1959  t=t
1960  )
1961  p2 = Process("Test")
1962  p2.extend(z2)
1963  #self.assertRaises(ValueError, p2.extend, z2)
1964  self.assertEqual(p2.s4.label_(),"s4")
1965  #p2.s4.setLabel("foo")
1966  self.assertRaises(ValueError, p2.s4.setLabel, "foo")
1967  p2.s4.setLabel("s4")
1968  p2.s4.setLabel(None)
1969  p2.s4.setLabel("foo")
1970  p2._Process__setObjectLabel(p2.s4, "foo")
1971  p2._Process__setObjectLabel(p2.s4, None)
1972  p2._Process__setObjectLabel(p2.s4, "bar")
1973 
1974 
1975  p = Process('test')
1976  p.a = EDProducer("MyProducer")
1977  p.t = Task(p.a)
1978  p.p = Path(p.t)
1979  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
1980  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
1981  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
1982 
1983  p = Process('test')
1984  p.a = EDProducer("MyProducer")
1985  p.s = Sequence(p.a)
1986  p.p = Path(p.s)
1987  self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer")))
1988  self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias()))
1989  self.assertRaises(ValueError, p.__setattr__, "a", EDAlias())
1990 
1992  self.assertEqual(Process("test").dumpPython(),
1993 """import FWCore.ParameterSet.Config as cms\n\nprocess = cms.Process("test")
1994 
1995 process.maxEvents = cms.untracked.PSet(
1996  input = cms.optional.untracked.int32,
1997  output = cms.optional.untracked.allowed(cms.int32,cms.PSet)
1998 )
1999 
2000 process.maxLuminosityBlocks = cms.untracked.PSet(
2001  input = cms.untracked.int32(-1)
2002 )
2003 
2004 process.options = cms.untracked.PSet(
2005  FailPath = cms.untracked.vstring(),
2006  IgnoreCompletely = cms.untracked.vstring(),
2007  Rethrow = cms.untracked.vstring(),
2008  SkipEvent = cms.untracked.vstring(),
2009  allowUnscheduled = cms.obsolete.untracked.bool,
2010  canDeleteEarly = cms.untracked.vstring(),
2011  emptyRunLumiMode = cms.obsolete.untracked.string,
2012  eventSetup = cms.untracked.PSet(
2013  forceNumberOfConcurrentIOVs = cms.untracked.PSet(
2014 
2015  ),
2016  numberOfConcurrentIOVs = cms.untracked.uint32(1)
2017  ),
2018  fileMode = cms.untracked.string('FULLMERGE'),
2019  forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False),
2020  makeTriggerResults = cms.obsolete.untracked.bool,
2021  numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1),
2022  numberOfConcurrentRuns = cms.untracked.uint32(1),
2023  numberOfStreams = cms.untracked.uint32(0),
2024  numberOfThreads = cms.untracked.uint32(1),
2025  printDependencies = cms.untracked.bool(False),
2026  sizeOfStackForThreadsInKB = cms.optional.untracked.uint32,
2027  throwIfIllegalParameter = cms.untracked.bool(True),
2028  wantSummary = cms.untracked.bool(False)
2029 )
2030 
2031 """)
2032  p = Process("test")
2033  p.a = EDAnalyzer("MyAnalyzer")
2034  p.p = Path(p.a)
2035  p.s = Sequence(p.a)
2036  p.r = Sequence(p.s)
2037  p.p2 = Path(p.s)
2038  p.schedule = Schedule(p.p2,p.p)
2039  d=p.dumpPython()
2040  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2041 """process.a = cms.EDAnalyzer("MyAnalyzer")
2042 process.s = cms.Sequence(process.a)
2043 process.r = cms.Sequence(process.s)
2044 process.p = cms.Path(process.a)
2045 process.p2 = cms.Path(process.s)
2046 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2047  #Reverse order of 'r' and 's'
2048  p = Process("test")
2049  p.a = EDAnalyzer("MyAnalyzer")
2050  p.p = Path(p.a)
2051  p.r = Sequence(p.a)
2052  p.s = Sequence(p.r)
2053  p.p2 = Path(p.r)
2054  p.schedule = Schedule(p.p2,p.p)
2055  p.b = EDAnalyzer("YourAnalyzer")
2056  d=p.dumpPython()
2057  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2058 """process.a = cms.EDAnalyzer("MyAnalyzer")
2059 process.b = cms.EDAnalyzer("YourAnalyzer")
2060 process.r = cms.Sequence(process.a)
2061 process.s = cms.Sequence(process.r)
2062 process.p = cms.Path(process.a)
2063 process.p2 = cms.Path(process.r)
2064 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2065  #use an anonymous sequence
2066  p = Process("test")
2067  p.a = EDAnalyzer("MyAnalyzer")
2068  p.p = Path(p.a)
2069  s = Sequence(p.a)
2070  p.r = Sequence(s)
2071  p.p2 = Path(p.r)
2072  p.schedule = Schedule(p.p2,p.p)
2073  d=p.dumpPython()
2074  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2075 """process.a = cms.EDAnalyzer("MyAnalyzer")
2076 process.r = cms.Sequence((process.a))
2077 process.p = cms.Path(process.a)
2078 process.p2 = cms.Path(process.r)
2079 process.schedule = cms.Schedule(*[ process.p2, process.p ])""")
2080 
2081  # include some tasks
2082  p = Process("test")
2083  p.a = EDAnalyzer("MyAnalyzer")
2084  p.b = EDProducer("bProducer")
2085  p.c = EDProducer("cProducer")
2086  p.d = EDProducer("dProducer")
2087  p.e = EDProducer("eProducer")
2088  p.f = EDProducer("fProducer")
2089  p.g = EDProducer("gProducer")
2090  p.task5 = Task()
2091  p.task3 = Task()
2092  p.task2 = Task(p.c, p.task3)
2093  p.task4 = Task(p.f, p.task2)
2094  p.task1 = Task(p.task5)
2095  p.task3.add(p.task1)
2096  p.p = Path(p.a)
2097  s = Sequence(p.a)
2098  p.r = Sequence(s)
2099  p.p2 = Path(p.r, p.task1, p.task2)
2100  p.schedule = Schedule(p.p2,p.p,tasks=[p.task3,p.task4, p.task5])
2101  d=p.dumpPython()
2102  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2103 """process.b = cms.EDProducer("bProducer")
2104 process.c = cms.EDProducer("cProducer")
2105 process.d = cms.EDProducer("dProducer")
2106 process.e = cms.EDProducer("eProducer")
2107 process.f = cms.EDProducer("fProducer")
2108 process.g = cms.EDProducer("gProducer")
2109 process.a = cms.EDAnalyzer("MyAnalyzer")
2110 process.task5 = cms.Task()
2111 process.task1 = cms.Task(process.task5)
2112 process.task3 = cms.Task(process.task1)
2113 process.task2 = cms.Task(process.c, process.task3)
2114 process.task4 = cms.Task(process.f, process.task2)
2115 process.r = cms.Sequence((process.a))
2116 process.p = cms.Path(process.a)
2117 process.p2 = cms.Path(process.r, process.task1, process.task2)
2118 process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task3, process.task4, process.task5])""")
2119  # only tasks
2120  p = Process("test")
2121  p.d = EDProducer("dProducer")
2122  p.e = EDProducer("eProducer")
2123  p.f = EDProducer("fProducer")
2124  p.g = EDProducer("gProducer")
2125  p.task1 = Task(p.d, p.e)
2126  task2 = Task(p.f, p.g)
2127  p.schedule = Schedule(tasks=[p.task1,task2])
2128  d=p.dumpPython()
2129  self.assertEqual(_lineDiff(d,Process("test").dumpPython()),
2130 """process.d = cms.EDProducer("dProducer")
2131 process.e = cms.EDProducer("eProducer")
2132 process.f = cms.EDProducer("fProducer")
2133 process.g = cms.EDProducer("gProducer")
2134 process.task1 = cms.Task(process.d, process.e)
2135 process.schedule = cms.Schedule(tasks=[cms.Task(process.f, process.g), process.task1])""")
2136  # empty schedule
2137  p = Process("test")
2138  p.schedule = Schedule()
2139  d=p.dumpPython()
2140  self.assertEqual(_lineDiff(d,Process('test').dumpPython()),
2141 """process.schedule = cms.Schedule()""")
2142 
2143  s = Sequence()
2144  a = EDProducer("A")
2145  s2 = Sequence(a)
2146  s2 += s
2147  process = Process("DUMP")
2148  process.a = a
2149  process.s2 = s2
2150  d=process.dumpPython()
2151  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2152 """process.a = cms.EDProducer("A")
2153 process.s2 = cms.Sequence(process.a)""")
2154  s = Sequence()
2155  s1 = Sequence(s)
2156  a = EDProducer("A")
2157  s3 = Sequence(a+a)
2158  s2 = Sequence(a+s3)
2159  s2 += s1
2160  process = Process("DUMP")
2161  process.a = a
2162  process.s2 = s2
2163  d=process.dumpPython()
2164  self.assertEqual(_lineDiff(d,Process('DUMP').dumpPython()),
2165 """process.a = cms.EDProducer("A")
2166 process.s2 = cms.Sequence(process.a+(process.a+process.a))""")
2167 
2168  def testSecSource(self):
2169  p = Process('test')
2170  p.a = SecSource("MySecSource")
2171  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),'process.a = cms.SecSource("MySecSource")')
2172 
2174  p = Process('test')
2175  p.a = EDAnalyzer("MyAnalyzer")
2176  old = p.a
2177  p.b = EDAnalyzer("YourAnalyzer")
2178  p.c = EDAnalyzer("OurAnalyzer")
2179  p.d = EDProducer("MyProducer")
2180  old2 = p.d
2181  p.t1 = Task(p.d)
2182  t2 = Task(p.d)
2183  t3 = Task(p.d)
2184  t4 = Task(p.d)
2185  t5 = Task(p.d)
2186  t6 = Task(p.d)
2187  s = Sequence(p.a*p.b)
2188  p.s4 = Sequence(p.a*p.b)
2189  s.associate(t2)
2190  p.s4.associate(t2)
2191  p.p = Path(p.c+s+p.a)
2192  p.p2 = Path(p.c+p.s4+p.a)
2193  p.e3 = EndPath(p.c+s+p.a)
2194  new = EDAnalyzer("NewAnalyzer")
2195  new2 = EDProducer("NewProducer")
2196  visitor1 = NodeVisitor()
2197  p.p.visit(visitor1)
2198  self.assertTrue(visitor1.modules == set([old,old2,p.b,p.c]))
2199  p.schedule = Schedule(tasks=[t6])
2200  p.globalReplace("a",new)
2201  p.globalReplace("d",new2)
2202  visitor2 = NodeVisitor()
2203  p.p.visit(visitor2)
2204  self.assertTrue(visitor2.modules == set([new,new2,p.b,p.c]))
2205  self.assertEqual(p.p.dumpPython()[:-1], "cms.Path(process.c+process.a+process.b+process.a, cms.Task(process.d))")
2206  visitor_p2 = NodeVisitor()
2207  p.p2.visit(visitor_p2)
2208  self.assertTrue(visitor_p2.modules == set([new,new2,p.b,p.c]))
2209  self.assertEqual(p.p2.dumpPython()[:-1], "cms.Path(process.c+process.s4+process.a)")
2210  visitor3 = NodeVisitor()
2211  p.e3.visit(visitor3)
2212  self.assertTrue(visitor3.modules == set([new,new2,p.b,p.c]))
2213  visitor4 = NodeVisitor()
2214  p.s4.visit(visitor4)
2215  self.assertTrue(visitor4.modules == set([new,new2,p.b]))
2216  self.assertEqual(p.s4.dumpPython()[:-1],"cms.Sequence(process.a+process.b, cms.Task(process.d))")
2217  visitor5 = NodeVisitor()
2218  p.t1.visit(visitor5)
2219  self.assertTrue(visitor5.modules == set([new2]))
2220  visitor6 = NodeVisitor()
2221  listOfTasks = list(p.schedule._tasks)
2222  listOfTasks[0].visit(visitor6)
2223  self.assertTrue(visitor6.modules == set([new2]))
2224 
2225  def testSequence(self):
2226  p = Process('test')
2227  p.a = EDAnalyzer("MyAnalyzer")
2228  p.b = EDAnalyzer("YourAnalyzer")
2229  p.c = EDAnalyzer("OurAnalyzer")
2230  p.s = Sequence(p.a*p.b)
2231  self.assertEqual(str(p.s),'a+b')
2232  self.assertEqual(p.s.label_(),'s')
2233  path = Path(p.c+p.s)
2234  self.assertEqual(str(path),'c+a+b')
2235  p._validateSequence(path, 'p1')
2236  notInProcess = EDAnalyzer('NotInProcess')
2237  p2 = Path(p.c+p.s*notInProcess)
2238  self.assertRaises(RuntimeError, p._validateSequence, p2, 'p2')
2239 
2240  def testSequence2(self):
2241  p = Process('test')
2242  p.a = EDAnalyzer("MyAnalyzer")
2243  p.b = EDAnalyzer("YourAnalyzer")
2244  p.c = EDAnalyzer("OurAnalyzer")
2245  testseq = Sequence(p.a*p.b)
2246  p.s = testseq
2247  #p.y = testseq
2248  self.assertRaises(ValueError, p.__setattr__, "y", testseq)
2249 
2251  service = Service("d")
2252  self.assertFalse(service._inProcess)
2253  process = Process("test")
2254  process.d = service
2255  self.assertTrue(service._inProcess)
2256  service2 = Service("d")
2257  process.d = service2
2258  self.assertFalse(service._inProcess)
2259  self.assertTrue(service2._inProcess)
2260  del process.d
2261  self.assertFalse(service2._inProcess)
2262 
2263  def testTask(self):
2264 
2265  # create some objects to use in tests
2266  edanalyzer = EDAnalyzer("a")
2267  edproducer = EDProducer("b")
2268  edproducer2 = EDProducer("b2")
2269  edproducer3 = EDProducer("b3")
2270  edproducer4 = EDProducer("b4")
2271  edproducer8 = EDProducer("b8")
2272  edproducer9 = EDProducer("b9")
2273  edfilter = EDFilter("c")
2274  service = Service("d")
2275  service3 = Service("d")
2276  essource = ESSource("e")
2277  esproducer = ESProducer("f")
2278  testTask2 = Task()
2279 
2280  # test adding things to Tasks
2281  testTask1 = Task(edproducer, edfilter)
2282  self.assertRaises(RuntimeError, testTask1.add, edanalyzer)
2283  testTask1.add(essource, service)
2284  testTask1.add(essource, esproducer)
2285  testTask1.add(testTask2)
2286  coll = testTask1._collection
2287  self.assertTrue(edproducer in coll)
2288  self.assertTrue(edfilter in coll)
2289  self.assertTrue(service in coll)
2290  self.assertTrue(essource in coll)
2291  self.assertTrue(esproducer in coll)
2292  self.assertTrue(testTask2 in coll)
2293  self.assertTrue(len(coll) == 6)
2294  self.assertTrue(len(testTask2._collection) == 0)
2295 
2296  taskContents = []
2297  for i in testTask1:
2298  taskContents.append(i)
2299  self.assertTrue(taskContents == [edproducer, edfilter, essource, service, esproducer, testTask2])
2300 
2301  # test attaching Task to Process
2302  process = Process("test")
2303 
2304  process.mproducer = edproducer
2305  process.mproducer2 = edproducer2
2306  process.mfilter = edfilter
2307  process.messource = essource
2308  process.mesproducer = esproducer
2309  process.d = service
2310 
2311  testTask3 = Task(edproducer, edproducer2)
2312  testTask1.add(testTask3)
2313  process.myTask1 = testTask1
2314 
2315  # test the validation that occurs when attaching a Task to a Process
2316  # first a case that passes, then one the fails on an EDProducer
2317  # then one that fails on a service
2318  l = set()
2319  visitor = NodeNameVisitor(l)
2320  testTask1.visit(visitor)
2321  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2322  l2 = testTask1.moduleNames
2323  self.assertTrue(l == set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource']))
2324 
2325  testTask4 = Task(edproducer3)
2326  l.clear()
2327  self.assertRaises(RuntimeError, testTask4.visit, visitor)
2328  try:
2329  process.myTask4 = testTask4
2330  self.assertTrue(False)
2331  except RuntimeError:
2332  pass
2333 
2334  testTask5 = Task(service3)
2335  l.clear()
2336  self.assertRaises(RuntimeError, testTask5.visit, visitor)
2337  try:
2338  process.myTask5 = testTask5
2339  self.assertTrue(False)
2340  except RuntimeError:
2341  pass
2342 
2343  process.d = service3
2344  process.myTask5 = testTask5
2345 
2346  # test placement into the Process and the tasks property
2347  expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 }
2348  expectedFixedDict = DictTypes.FixedKeysDict(expectedDict);
2349  self.assertTrue(process.tasks == expectedFixedDict)
2350  self.assertTrue(process.tasks['myTask1'] == testTask1)
2351  self.assertTrue(process.myTask1 == testTask1)
2352 
2353  # test replacing an EDProducer in a Task when calling __settattr__
2354  # for the EDProducer on the Process.
2355  process.mproducer2 = edproducer4
2356  process.d = service
2357  l = list()
2358  visitor1 = ModuleNodeVisitor(l)
2359  testTask1.visit(visitor1)
2360  l.sort(key=lambda mod: mod.__str__())
2361  expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__())
2362  self.assertTrue(expectedList == l)
2363  process.myTask6 = Task()
2364  process.myTask7 = Task()
2365  process.mproducer8 = edproducer8
2366  process.myTask8 = Task(process.mproducer8)
2367  process.myTask6.add(process.myTask7)
2368  process.myTask7.add(process.myTask8)
2369  process.myTask1.add(process.myTask6)
2370  process.myTask8.add(process.myTask5)
2371 
2372  testDict = process._itemsInDependencyOrder(process.tasks)
2373  expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"]
2374  expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1]
2375  index = 0
2376  for testLabel, testTask in testDict.items():
2377  self.assertTrue(testLabel == expectedLabels[index])
2378  self.assertTrue(testTask == expectedTasks[index])
2379  index += 1
2380 
2381  pythonDump = testTask1.dumpPython(PrintOptions())
2382 
2383 
2384  expectedPythonDump = 'cms.Task(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n'
2385  self.assertTrue(pythonDump == expectedPythonDump)
2386 
2387  process.myTask5 = Task()
2388  process.myTask100 = Task()
2389  process.mproducer9 = edproducer9
2390  sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3)
2391  sequence2 = Sequence(process.mproducer8 + process.mproducer9)
2392  process.sequence3 = Sequence((process.mproducer8 + process.mfilter))
2393  sequence4 = Sequence()
2394  process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4)
2395  process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3)
2396  process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100)
2397  process.path2 = Path(process.mproducer)
2398  process.path3 = Path(process.mproducer9+process.mproducer8,testTask2)
2399 
2400  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')
2401 
2402  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')
2403 
2404  # test NodeNameVisitor and moduleNames
2405  l = set()
2406  nameVisitor = NodeNameVisitor(l)
2407  process.path1.visit(nameVisitor)
2408  self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
2409  self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter']))
2410 
2411  # test copy
2412  process.mproducer10 = EDProducer("b10")
2413  process.path21 = process.path11.copy()
2414  process.path21.replace(process.mproducer, process.mproducer10)
2415 
2416  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')
2417 
2418  # Some peculiarities of the way things work show up here. dumpPython sorts tasks and
2419  # removes duplication at the level of strings. The Task and Sequence objects themselves
2420  # remove duplicate tasks in their contents if the instances are the same (exact same python
2421  # object id which is not the same as the string representation being the same).
2422  # Also note that the mutating visitor replaces sequences and tasks that have
2423  # modified contents with their modified contents, it does not modify the sequence
2424  # or task itself.
2425  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.myTask6), process.myTask100, process.myTask5)\n')
2426 
2427  process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter])
2428  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.myTask6), process.myTask100, process.myTask5)\n')
2429 
2430  process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10])
2431  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.myTask6), process.myTask100, process.myTask5)\n')
2432 
2433  process.a = EDAnalyzer("MyAnalyzer")
2434  process.b = OutputModule("MyOutputModule")
2435  process.c = EDFilter("MyFilter")
2436  process.d = EDProducer("MyProducer")
2437  process.e = ESProducer("MyESProducer")
2438  process.f = ESSource("MyESSource")
2439  process.g = ESProducer("g")
2440  process.path24 = Path(process.a+process.b+process.c+process.d)
2441  process.path25 = process.path24.copyAndExclude([process.a,process.b,process.c])
2442  self.assertTrue(process.path25.dumpPython() == 'cms.Path(process.d)\n')
2443  #print process.path3
2444  #print process.dumpPython()
2445 
2446  process.path200 = EndPath(Sequence(process.c,Task(process.e)))
2447  process.path200.replace(process.c,process.b)
2448  process.path200.replace(process.e,process.f)
2449  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.b, cms.Task(process.f))\n")
2450  process.path200.replace(process.b,process.c)
2451  process.path200.replace(process.f,process.e)
2452  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
2453  process.path200.replace(process.c,process.a)
2454  process.path200.replace(process.e,process.g)
2455  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.a, cms.Task(process.g))\n")
2456  process.path200.replace(process.a,process.c)
2457  process.path200.replace(process.g,process.e)
2458  self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n")
2459 
2460 
2461  def testPath(self):
2462  p = Process("test")
2463  p.a = EDAnalyzer("MyAnalyzer")
2464  p.b = EDAnalyzer("YourAnalyzer")
2465  p.c = EDAnalyzer("OurAnalyzer")
2466  path = Path(p.a)
2467  path *= p.b
2468  path += p.c
2469  self.assertEqual(str(path),'a+b+c')
2470  path = Path(p.a*p.b+p.c)
2471  self.assertEqual(str(path),'a+b+c')
2472 # path = Path(p.a)*p.b+p.c #This leads to problems with sequences
2473 # self.assertEqual(str(path),'((a*b)+c)')
2474  path = Path(p.a+ p.b*p.c)
2475  self.assertEqual(str(path),'a+b+c')
2476  path = Path(p.a*(p.b+p.c))
2477  self.assertEqual(str(path),'a+b+c')
2478  path = Path(p.a*(p.b+~p.c))
2479  pathx = Path(p.a*(p.b+ignore(p.c)))
2480  self.assertEqual(str(path),'a+b+~c')
2481  p.es = ESProducer("AnESProducer")
2482  self.assertRaises(TypeError,Path,p.es)
2483 
2484  t = Path()
2485  self.assertTrue(t.dumpPython(PrintOptions()) == 'cms.Path()\n')
2486 
2487  t = Path(p.a)
2488  self.assertTrue(t.dumpPython(PrintOptions()) == 'cms.Path(process.a)\n')
2489 
2490  t = Path(Task())
2491  self.assertTrue(t.dumpPython(PrintOptions()) == 'cms.Path(cms.Task())\n')
2492 
2493  t = Path(p.a, Task())
2494  self.assertTrue(t.dumpPython(PrintOptions()) == 'cms.Path(process.a, cms.Task())\n')
2495 
2496  p.prod = EDProducer("prodName")
2497  p.t1 = Task(p.prod)
2498  t = Path(p.a, p.t1, Task(), p.t1)
2499  self.assertTrue(t.dumpPython(PrintOptions()) == 'cms.Path(process.a, cms.Task(), process.t1)\n')
2500 
2502  p = Process("test")
2503  a = EDAnalyzer("MyAnalyzer")
2504  p.a = a
2505  a.setLabel("a")
2506  b = EDAnalyzer("YOurAnalyzer")
2507  p.b = b
2508  b.setLabel("b")
2509  path = Path(a * b)
2510  p.path = Path(p.a*p.b)
2511  lookuptable = {id(a): p.a, id(b): p.b}
2512  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
2513  #lookuptable = p._cloneToObjectDict
2514  #self.assertEqual(str(path),str(path._postProcessFixup(lookuptable)))
2515  self.assertEqual(str(path),str(p.path))
2516 
2517  def testContains(self):
2518 
2519  a = EDProducer("a")
2520  b = EDProducer("b")
2521  c = EDProducer("c")
2522  d = EDProducer("d")
2523  e = EDProducer("e")
2524  f = EDProducer("f")
2525  g = EDProducer("g")
2526  h = EDProducer("h")
2527  i = EDProducer("i")
2528  j = EDProducer("j")
2529  k = EDProducer("k")
2530  l = EDProducer("l")
2531  m = EDProducer("m")
2532  n = EDProducer("n")
2533 
2534  seq1 = Sequence(e)
2535  task1 = Task(g)
2536  path = Path(a * c * seq1, task1)
2537 
2538  self.assertTrue(path.contains(a))
2539  self.assertFalse(path.contains(b))
2540  self.assertTrue(path.contains(c))
2541  self.assertFalse(path.contains(d))
2542  self.assertTrue(path.contains(e))
2543  self.assertFalse(path.contains(f))
2544  self.assertTrue(path.contains(g))
2545 
2546  endpath = EndPath(h * i)
2547  self.assertFalse(endpath.contains(b))
2548  self.assertTrue(endpath.contains(i))
2549 
2550  seq = Sequence(a * c)
2551  self.assertFalse(seq.contains(b))
2552  self.assertTrue(seq.contains(c))
2553 
2554  task2 = Task(l)
2555  task = Task(j, k, task2)
2556  self.assertFalse(task.contains(b))
2557  self.assertTrue(task.contains(j))
2558  self.assertTrue(task.contains(k))
2559  self.assertTrue(task.contains(l))
2560 
2561  task3 = Task(m)
2562  path2 = Path(n)
2563  sch = Schedule(path, path2, tasks=[task,task3])
2564  self.assertFalse(sch.contains(b))
2565  self.assertTrue(sch.contains(a))
2566  self.assertTrue(sch.contains(c))
2567  self.assertTrue(sch.contains(e))
2568  self.assertTrue(sch.contains(g))
2569  self.assertTrue(sch.contains(n))
2570  self.assertTrue(sch.contains(j))
2571  self.assertTrue(sch.contains(k))
2572  self.assertTrue(sch.contains(l))
2573  self.assertTrue(sch.contains(m))
2574 
2575  def testSchedule(self):
2576  p = Process("test")
2577  p.a = EDAnalyzer("MyAnalyzer")
2578  p.b = EDAnalyzer("YourAnalyzer")
2579  p.c = EDAnalyzer("OurAnalyzer")
2580  p.d = EDAnalyzer("OurAnalyzer")
2581  p.path1 = Path(p.a)
2582  p.path2 = Path(p.b)
2583  p.path3 = Path(p.d)
2584 
2585  s = Schedule(p.path1,p.path2)
2586  self.assertEqual(s[0],p.path1)
2587  self.assertEqual(s[1],p.path2)
2588  p.schedule = s
2589  self.assertTrue('b' in p.schedule.moduleNames())
2590  self.assertTrue(hasattr(p, 'b'))
2591  self.assertTrue(hasattr(p, 'c'))
2592  self.assertTrue(hasattr(p, 'd'))
2593  self.assertTrue(hasattr(p, 'path1'))
2594  self.assertTrue(hasattr(p, 'path2'))
2595  self.assertTrue(hasattr(p, 'path3'))
2596  p.prune()
2597  self.assertTrue('b' in p.schedule.moduleNames())
2598  self.assertTrue(hasattr(p, 'b'))
2599  self.assertTrue(not hasattr(p, 'c'))
2600  self.assertTrue(not hasattr(p, 'd'))
2601  self.assertTrue(hasattr(p, 'path1'))
2602  self.assertTrue(hasattr(p, 'path2'))
2603  self.assertTrue(not hasattr(p, 'path3'))
2604 
2605  self.assertTrue(len(p.schedule._tasks) == 0)
2606 
2607  p = Process("test")
2608  p.a = EDAnalyzer("MyAnalyzer")
2609  p.b = EDAnalyzer("YourAnalyzer")
2610  p.c = EDAnalyzer("OurAnalyzer")
2611  p.d = EDAnalyzer("dAnalyzer")
2612  p.e = EDProducer("eProducer")
2613  p.f = EDProducer("fProducer")
2614  p.Tracer = Service("Tracer")
2615  p.path1 = Path(p.a)
2616  p.path2 = Path(p.b)
2617  p.path3 = Path(p.d)
2618  p.task1 = Task(p.e)
2619  p.task2 = Task(p.f, p.Tracer)
2620  s = Schedule(p.path1,p.path2,tasks=[p.task1,p.task2,p.task1])
2621  self.assertEqual(s[0],p.path1)
2622  self.assertEqual(s[1],p.path2)
2623  self.assertTrue(len(s._tasks) == 2)
2624  self.assertTrue(p.task1 in s._tasks)
2625  self.assertTrue(p.task2 in s._tasks)
2626  listOfTasks = list(s._tasks)
2627  self.assertTrue(len(listOfTasks) == 2)
2628  self.assertTrue(p.task1 == listOfTasks[0])
2629  self.assertTrue(p.task2 == listOfTasks[1])
2630  p.schedule = s
2631  self.assertTrue('b' in p.schedule.moduleNames())
2632 
2633  process2 = Process("test")
2634  process2.a = EDAnalyzer("MyAnalyzer")
2635  process2.e = EDProducer("eProducer")
2636  process2.path1 = Path(process2.a)
2637  process2.task1 = Task(process2.e)
2638  process2.schedule = Schedule(process2.path1,tasks=process2.task1)
2639  listOfTasks = list(process2.schedule._tasks)
2640  self.assertTrue(listOfTasks[0] == process2.task1)
2641 
2642  # test Schedule copy
2643  s2 = s.copy()
2644  self.assertEqual(s2[0],p.path1)
2645  self.assertEqual(s2[1],p.path2)
2646  self.assertTrue(len(s2._tasks) == 2)
2647  self.assertTrue(p.task1 in s2._tasks)
2648  self.assertTrue(p.task2 in s2._tasks)
2649  listOfTasks = list(s2._tasks)
2650  self.assertTrue(len(listOfTasks) == 2)
2651  self.assertTrue(p.task1 == listOfTasks[0])
2652  self.assertTrue(p.task2 == listOfTasks[1])
2653 
2654  names = s.moduleNames()
2655  self.assertTrue(names == set(['a', 'b', 'e', 'Tracer', 'f']))
2656  #adding a path not attached to the Process should cause an exception
2657  p = Process("test")
2658  p.a = EDAnalyzer("MyAnalyzer")
2659  path1 = Path(p.a)
2660  s = Schedule(path1)
2661  self.assertRaises(RuntimeError, lambda : p.setSchedule_(s) )
2662 
2663  #make sure anonymous sequences work
2664  p = Process("test")
2665  p.a = EDAnalyzer("MyAnalyzer")
2666  p.b = EDAnalyzer("MyOtherAnalyzer")
2667  p.c = EDProducer("MyProd")
2668  path1 = Path(p.c*Sequence(p.a+p.b))
2669  s = Schedule(path1)
2670  self.assertTrue('a' in s.moduleNames())
2671  self.assertTrue('b' in s.moduleNames())
2672  self.assertTrue('c' in s.moduleNames())
2673  p.path1 = path1
2674  p.schedule = s
2675  p.prune()
2676  self.assertTrue('a' in s.moduleNames())
2677  self.assertTrue('b' in s.moduleNames())
2678  self.assertTrue('c' in s.moduleNames())
2679 
2681  p = Process("test")
2682  p.a = EDAnalyzer("MyAnalyzer")
2683  p.b = EDAnalyzer("YourAnalyzer")
2684  p.c = EDAnalyzer("OurAnalyzer")
2685  p.path1 = Path(p.a)
2686  p.path2 = Path(p.b)
2687  self.assertTrue(p.schedule is None)
2688  pths = p.paths
2689  keys = pths.keys()
2690  self.assertEqual(pths[keys[0]],p.path1)
2691  self.assertEqual(pths[keys[1]],p.path2)
2692  p.prune()
2693  self.assertTrue(hasattr(p, 'a'))
2694  self.assertTrue(hasattr(p, 'b'))
2695  self.assertTrue(not hasattr(p, 'c'))
2696  self.assertTrue(hasattr(p, 'path1'))
2697  self.assertTrue(hasattr(p, 'path2'))
2698 
2699 
2700  p = Process("test")
2701  p.a = EDAnalyzer("MyAnalyzer")
2702  p.b = EDAnalyzer("YourAnalyzer")
2703  p.c = EDAnalyzer("OurAnalyzer")
2704  p.path2 = Path(p.b)
2705  p.path1 = Path(p.a)
2706  self.assertTrue(p.schedule is None)
2707  pths = p.paths
2708  keys = pths.keys()
2709  self.assertEqual(pths[keys[1]],p.path1)
2710  self.assertEqual(pths[keys[0]],p.path2)
2711 
2712 
2713  def testUsing(self):
2714  p = Process('test')
2715  p.block = PSet(a = int32(1))
2716  p.modu = EDAnalyzer('Analyzer', p.block, b = int32(2))
2717  self.assertEqual(p.modu.a.value(),1)
2718  self.assertEqual(p.modu.b.value(),2)
2719 
2720  def testOverride(self):
2721  p = Process('test')
2722  a = EDProducer("A", a1=int32(0))
2723  self.assertTrue(not a.isModified())
2724  a.a1 = 1
2725  self.assertTrue(a.isModified())
2726  p.a = a
2727  self.assertEqual(p.a.a1.value(), 1)
2728  # try adding an unmodified module.
2729  # should accept it
2730  p.a = EDProducer("A", a1=int32(2))
2731  self.assertEqual(p.a.a1.value(), 2)
2732  # try adding a modified module. Should throw
2733  # no longer, since the same (modified) say, geometry
2734  # could come from more than one cff
2735  b = EDProducer("A", a1=int32(3))
2736  b.a1 = 4
2737  #self.assertRaises(RuntimeError, setattr, *(p,'a',b))
2738  ps1 = PSet(a = int32(1))
2739  ps2 = PSet(a = int32(2))
2740  self.assertRaises(ValueError, EDProducer, 'C', ps1, ps2)
2741  self.assertRaises(ValueError, EDProducer, 'C', ps1, a=int32(3))
2742 
2743  def testOptions(self):
2744  p = Process('test')
2745  self.assertEqual(p.options.numberOfThreads.value(),1)
2746  p.options.numberOfThreads = 8
2747  self.assertEqual(p.options.numberOfThreads.value(),8)
2748  p.options = PSet()
2749  self.assertEqual(p.options.numberOfThreads.value(),1)
2750  p.options = dict(numberOfStreams =2,
2751  numberOfThreads =2)
2752  self.assertEqual(p.options.numberOfThreads.value(),2)
2753  self.assertEqual(p.options.numberOfStreams.value(),2)
2754 
2755  def testMaxEvents(self):
2756  p = Process("Test")
2757  p.maxEvents.input = 10
2758  self.assertEqual(p.maxEvents.input.value(),10)
2759  p = Process("Test")
2760  p.maxEvents.output = 10
2761  self.assertEqual(p.maxEvents.output.value(),10)
2762  p = Process("Test")
2763  p.maxEvents.output = PSet(out=untracked.int32(10))
2764  self.assertEqual(p.maxEvents.output.out.value(), 10)
2765  p = Process("Test")
2766  p.maxEvents = untracked.PSet(input = untracked.int32(5))
2767  self.assertEqual(p.maxEvents.input.value(), 5)
2768 
2769 
2770  def testExamples(self):
2771  p = Process("Test")
2772  p.source = Source("PoolSource",fileNames = untracked(string("file:reco.root")))
2773  p.foos = EDProducer("FooProducer")
2774  p.bars = EDProducer("BarProducer", foos=InputTag("foos"))
2775  p.out = OutputModule("PoolOutputModule",fileName=untracked(string("file:foos.root")))
2776  p.bars.foos = 'Foosball'
2777  self.assertEqual(p.bars.foos, InputTag('Foosball'))
2778  p.p = Path(p.foos*p.bars)
2779  p.e = EndPath(p.out)
2780  p.add_(Service("MessageLogger"))
2781 
2782  def testPrefers(self):
2783  p = Process("Test")
2784  p.add_(ESSource("ForceSource"))
2785  p.juicer = ESProducer("JuicerProducer")
2786  p.prefer("ForceSource")
2787  p.prefer("juicer")
2788  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
2789 """process.juicer = cms.ESProducer("JuicerProducer")
2790 process.ForceSource = cms.ESSource("ForceSource")
2791 process.prefer("ForceSource")
2792 process.prefer("juicer")""")
2793  p.prefer("juicer",fooRcd=vstring("Foo"))
2794  self.assertEqual(_lineDiff(p.dumpPython(), Process('Test').dumpPython()),
2795 """process.juicer = cms.ESProducer("JuicerProducer")
2796 process.ForceSource = cms.ESSource("ForceSource")
2797 process.prefer("ForceSource")
2798 process.prefer("juicer",
2799  fooRcd = cms.vstring('Foo')
2800 )""")
2801 
2802  def testFreeze(self):
2803  process = Process("Freeze")
2804  m = EDProducer("M", p=PSet(i = int32(1)))
2805  m.p.i = 2
2806  process.m = m
2807  # should be frozen
2808  #self.assertRaises(ValueError, setattr, m.p, 'i', 3)
2809  #self.assertRaises(ValueError, setattr, m, 'p', PSet(i=int32(1)))
2810  #self.assertRaises(ValueError, setattr, m.p, 'j', 1)
2811  #self.assertRaises(ValueError, setattr, m, 'j', 1)
2812  # But OK to change through the process
2813  process.m.p.i = 4
2814  self.assertEqual(process.m.p.i.value(), 4)
2815  process.m.p = PSet(j=int32(1))
2816  # should work to clone it, though
2817  m2 = m.clone(p = PSet(i = int32(5)), j = int32(8))
2818  m2.p.i = 6
2819  m2.j = 8
2820  def testSubProcess(self):
2821  process = Process("Parent")
2822  subProcess = Process("Child")
2823  subProcess.a = EDProducer("A")
2824  subProcess.p = Path(subProcess.a)
2825  subProcess.add_(Service("Foo"))
2826  process.addSubProcess(SubProcess(subProcess))
2827  d = process.dumpPython()
2828  equalD ="""parentProcess = process
2829 process.a = cms.EDProducer("A")
2830 process.Foo = cms.Service("Foo")
2831 process.p = cms.Path(process.a)
2832 childProcess = process
2833 process = parentProcess
2834 process.addSubProcess(cms.SubProcess(process = childProcess, SelectEvents = cms.untracked.PSet(
2835 ), outputCommands = cms.untracked.vstring()))"""
2836  equalD = equalD.replace("parentProcess","parentProcess"+str(hash(process.subProcesses_()[0])))
2837  self.assertEqual(_lineDiff(d,Process('Parent').dumpPython()+Process('Child').dumpPython()),equalD)
2838  p = TestMakePSet()
2839  process.fillProcessDesc(p)
2840  self.assertEqual((True,['a']),p.values["subProcesses"][1][0].values["process"][1].values['@all_modules'])
2841  self.assertEqual((True,['p']),p.values["subProcesses"][1][0].values["process"][1].values['@paths'])
2842  self.assertEqual({'@service_type':(True,'Foo')}, p.values["subProcesses"][1][0].values["process"][1].values["services"][1][0].values)
2843  def testRefToPSet(self):
2844  proc = Process("test")
2845  proc.top = PSet(a = int32(1))
2846  proc.ref = PSet(refToPSet_ = string("top"))
2847  proc.ref2 = PSet( a = int32(1), b = PSet( refToPSet_ = string("top")))
2848  proc.ref3 = PSet(refToPSet_ = string("ref"))
2849  proc.ref4 = VPSet(PSet(refToPSet_ = string("top")),
2850  PSet(refToPSet_ = string("ref2")))
2851  p = TestMakePSet()
2852  proc.fillProcessDesc(p)
2853  self.assertEqual((True,1),p.values["ref"][1].values["a"])
2854  self.assertEqual((True,1),p.values["ref3"][1].values["a"])
2855  self.assertEqual((True,1),p.values["ref2"][1].values["a"])
2856  self.assertEqual((True,1),p.values["ref2"][1].values["b"][1].values["a"])
2857  self.assertEqual((True,1),p.values["ref4"][1][0].values["a"])
2858  self.assertEqual((True,1),p.values["ref4"][1][1].values["a"])
2860  proc = Process("test")
2861  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
2862  a = int32(1),
2863  b = PSet(c = int32(2))),
2864  test1 = EDProducer("Bar",
2865  aa = int32(11),
2866  bb = PSet(cc = int32(12))))
2867  proc.a = EDProducer("A")
2868  proc.s = Sequence(proc.a + proc.sp)
2869  proc.t = Task(proc.a, proc.sp)
2870  proc.p = Path()
2871  proc.p.associate(proc.t)
2872  p = TestMakePSet()
2873  proc.fillProcessDesc(p)
2874  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
2875  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
2876  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
2877  self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"])
2878  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
2879  self.assertEqual(["a", "sp", "sp@test1", "sp@test2"], p.values["@all_modules"][1])
2880  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
2881  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["@module_type"])
2882  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
2883  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
2884  dump = proc.dumpPython()
2885  self.assertEqual(dump.find('@'), -1)
2886  self.assertEqual(specialImportRegistry.getSpecialImports(), ["from test import SwitchProducerTest"])
2887  self.assertTrue(dump.find("\nfrom test import SwitchProducerTest\n") != -1)
2888 
2889  # EDAlias as non-chosen case
2890  proc = Process("test")
2891  proc.sp = SwitchProducerTest(test2 = EDProducer("Foo",
2892  a = int32(1),
2893  b = PSet(c = int32(2))),
2894  test1 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
2895  proc.a = EDProducer("A")
2896  proc.s = Sequence(proc.a + proc.sp)
2897  proc.t = Task(proc.a, proc.sp)
2898  proc.p = Path()
2899  proc.p.associate(proc.t)
2900  p = TestMakePSet()
2901  proc.fillProcessDesc(p)
2902  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
2903  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
2904  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
2905  self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"])
2906  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
2907  self.assertEqual(["a", "sp", "sp@test2"], p.values["@all_modules"][1])
2908  self.assertEqual(["sp@test1"], p.values["@all_aliases"][1])
2909  self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"])
2910  self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"])
2911  self.assertEqual((True,"EDAlias"), p.values["sp@test1"][1].values["@module_edm_type"])
2912  self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["a"][1][0].values["type"])
2913 
2914  # EDAlias as chosen case
2915  proc = Process("test")
2916  proc.sp = SwitchProducerTest(test1 = EDProducer("Foo",
2917  a = int32(1),
2918  b = PSet(c = int32(2))),
2919  test2 = EDAlias(a = VPSet(PSet(type = string("Bar")))))
2920  proc.a = EDProducer("A")
2921  proc.s = Sequence(proc.a + proc.sp)
2922  proc.t = Task(proc.a, proc.sp)
2923  proc.p = Path()
2924  proc.p.associate(proc.t)
2925  p = TestMakePSet()
2926  proc.fillProcessDesc(p)
2927  self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"])
2928  self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"])
2929  self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"])
2930  self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"])
2931  self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"])
2932  self.assertEqual(["a", "sp", "sp@test1"], p.values["@all_modules"][1])
2933  self.assertEqual(["sp@test2"], p.values["@all_aliases"][1])
2934  self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"])
2935  self.assertEqual((True,"Foo"), p.values["sp@test1"][1].values["@module_type"])
2936  self.assertEqual((True,"EDAlias"), p.values["sp@test2"][1].values["@module_edm_type"])
2937  self.assertEqual((True,"Bar"), p.values["sp@test2"][1].values["a"][1][0].values["type"])
2938 
2939  def testPrune(self):
2940  p = Process("test")
2941  p.a = EDAnalyzer("MyAnalyzer")
2942  p.b = EDAnalyzer("YourAnalyzer")
2943  p.c = EDAnalyzer("OurAnalyzer")
2944  p.d = EDAnalyzer("OurAnalyzer")
2945  p.e = EDProducer("MyProducer")
2946  p.f = EDProducer("YourProducer")
2947  p.g = EDProducer("TheirProducer")
2948  p.s = Sequence(p.d)
2949  p.t1 = Task(p.e)
2950  p.t2 = Task(p.f)
2951  p.t3 = Task(p.g, p.t1)
2952  p.path1 = Path(p.a, p.t3)
2953  p.path2 = Path(p.b)
2954  self.assertTrue(p.schedule is None)
2955  pths = p.paths
2956  keys = pths.keys()
2957  self.assertEqual(pths[keys[0]],p.path1)
2958  self.assertEqual(pths[keys[1]],p.path2)
2959  p.pset1 = PSet(parA = string("pset1"))
2960  p.pset2 = untracked.PSet(parA = string("pset2"))
2961  p.vpset1 = VPSet()
2962  p.vpset2 = untracked.VPSet()
2963  p.prune()
2964  self.assertTrue(hasattr(p, 'a'))
2965  self.assertTrue(hasattr(p, 'b'))
2966  self.assertTrue(not hasattr(p, 'c'))
2967  self.assertTrue(not hasattr(p, 'd'))
2968  self.assertTrue(hasattr(p, 'e'))
2969  self.assertTrue(not hasattr(p, 'f'))
2970  self.assertTrue(hasattr(p, 'g'))
2971  self.assertTrue(not hasattr(p, 's'))
2972  self.assertTrue(hasattr(p, 't1'))
2973  self.assertTrue(not hasattr(p, 't2'))
2974  self.assertTrue(hasattr(p, 't3'))
2975  self.assertTrue(hasattr(p, 'path1'))
2976  self.assertTrue(hasattr(p, 'path2'))
2977 # self.assertTrue(not hasattr(p, 'pset1'))
2978 # self.assertTrue(hasattr(p, 'pset2'))
2979 # self.assertTrue(not hasattr(p, 'vpset1'))
2980 # self.assertTrue(not hasattr(p, 'vpset2'))
2981 
2982  p = Process("test")
2983  p.a = EDAnalyzer("MyAnalyzer")
2984  p.b = EDAnalyzer("YourAnalyzer")
2985  p.c = EDAnalyzer("OurAnalyzer")
2986  p.d = EDAnalyzer("OurAnalyzer")
2987  p.e = EDAnalyzer("OurAnalyzer")
2988  p.f = EDProducer("MyProducer")
2989  p.g = EDProducer("YourProducer")
2990  p.h = EDProducer("TheirProducer")
2991  p.i = EDProducer("OurProducer")
2992  p.t1 = Task(p.f)
2993  p.t2 = Task(p.g)
2994  p.t3 = Task(p.h)
2995  p.t4 = Task(p.i)
2996  p.s = Sequence(p.d, p.t1)
2997  p.s2 = Sequence(p.b, p.t2)
2998  p.s3 = Sequence(p.e)
2999  p.path1 = Path(p.a, p.t3)
3000  p.path2 = Path(p.b)
3001  p.path3 = Path(p.b+p.s2)
3002  p.path4 = Path(p.b+p.s3)
3003  p.schedule = Schedule(p.path1,p.path2,p.path3)
3004  p.schedule.associate(p.t4)
3005  pths = p.paths
3006  keys = pths.keys()
3007  self.assertEqual(pths[keys[0]],p.path1)
3008  self.assertEqual(pths[keys[1]],p.path2)
3009  p.prune()
3010  self.assertTrue(hasattr(p, 'a'))
3011  self.assertTrue(hasattr(p, 'b'))
3012  self.assertTrue(not hasattr(p, 'c'))
3013  self.assertTrue(not hasattr(p, 'd'))
3014  self.assertTrue(not hasattr(p, 'e'))
3015  self.assertTrue(not hasattr(p, 'f'))
3016  self.assertTrue(hasattr(p, 'g'))
3017  self.assertTrue(hasattr(p, 'h'))
3018  self.assertTrue(hasattr(p, 'i'))
3019  self.assertTrue(not hasattr(p, 't1'))
3020  self.assertTrue(hasattr(p, 't2'))
3021  self.assertTrue(hasattr(p, 't3'))
3022  self.assertTrue(hasattr(p, 't4'))
3023  self.assertTrue(not hasattr(p, 's'))
3024  self.assertTrue(hasattr(p, 's2'))
3025  self.assertTrue(not hasattr(p, 's3'))
3026  self.assertTrue(hasattr(p, 'path1'))
3027  self.assertTrue(hasattr(p, 'path2'))
3028  self.assertTrue(hasattr(p, 'path3'))
3029  self.assertTrue(not hasattr(p, 'path4'))
3030  #test SequencePlaceholder
3031  p = Process("test")
3032  p.a = EDAnalyzer("MyAnalyzer")
3033  p.b = EDAnalyzer("YourAnalyzer")
3034  p.s = Sequence(SequencePlaceholder("a")+p.b)
3035  p.pth = Path(p.s)
3036  p.prune()
3037  self.assertTrue(hasattr(p, 'a'))
3038  self.assertTrue(hasattr(p, 'b'))
3039  self.assertTrue(hasattr(p, 's'))
3040  self.assertTrue(hasattr(p, 'pth'))
3041  #test unresolved SequencePlaceholder
3042  p = Process("test")
3043  p.b = EDAnalyzer("YourAnalyzer")
3044  p.s = Sequence(SequencePlaceholder("a")+p.b)
3045  p.pth = Path(p.s)
3046  p.prune(keepUnresolvedSequencePlaceholders=True)
3047  self.assertTrue(hasattr(p, 'b'))
3048  self.assertTrue(hasattr(p, 's'))
3049  self.assertTrue(hasattr(p, 'pth'))
3050  self.assertEqual(p.s.dumpPython(),'cms.Sequence(cms.SequencePlaceholder("a")+process.b)\n')
3051  #test TaskPlaceholder
3052  p = Process("test")
3053  p.a = EDProducer("MyProducer")
3054  p.b = EDProducer("YourProducer")
3055  p.s = Task(TaskPlaceholder("a"),p.b)
3056  p.pth = Path(p.s)
3057  p.prune()
3058  self.assertTrue(hasattr(p, 'a'))
3059  self.assertTrue(hasattr(p, 'b'))
3060  self.assertTrue(hasattr(p, 's'))
3061  self.assertTrue(hasattr(p, 'pth'))
3062  #test unresolved SequencePlaceholder
3063  p = Process("test")
3064  p.b = EDProducer("YourAnalyzer")
3065  p.s = Task(TaskPlaceholder("a"),p.b)
3066  p.pth = Path(p.s)
3067  p.prune(keepUnresolvedSequencePlaceholders=True)
3068  self.assertTrue(hasattr(p, 'b'))
3069  self.assertTrue(hasattr(p, 's'))
3070  self.assertTrue(hasattr(p, 'pth'))
3071  self.assertEqual(p.s.dumpPython(),'cms.Task(cms.TaskPlaceholder("a"), process.b)\n')
3073  p = Process("test")
3074  p.a = EDProducer("ma")
3075  p.b = EDAnalyzer("mb")
3076  p.t1 = Task(TaskPlaceholder("c"))
3077  p.t2 = Task(p.a, TaskPlaceholder("d"), p.t1)
3078  p.t3 = Task(TaskPlaceholder("e"))
3079  p.path1 = Path(p.b, p.t2, p.t3)
3080  p.t5 = Task(p.a, TaskPlaceholder("g"), TaskPlaceholder("t4"))
3081  p.t4 = Task(TaskPlaceholder("f"))
3082  p.endpath1 = EndPath(p.b, p.t5)
3083  p.t6 = Task(TaskPlaceholder("h"))
3084  p.t7 = Task(p.a, TaskPlaceholder("i"), p.t6)
3085  p.t8 = Task(TaskPlaceholder("j"))
3086  p.schedule = Schedule(p.path1, p.endpath1,tasks=[p.t7,p.t8])
3087  p.c = EDProducer("mc")
3088  p.d = EDProducer("md")
3089  p.e = EDProducer("me")
3090  p.f = EDProducer("mf")
3091  p.g = EDProducer("mg")
3092  p.h = EDProducer("mh")
3093  p.i = EDProducer("mi")
3094  p.j = EDProducer("mj")
3095  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
3096 """process.a = cms.EDProducer("ma")
3097 process.c = cms.EDProducer("mc")
3098 process.d = cms.EDProducer("md")
3099 process.e = cms.EDProducer("me")
3100 process.f = cms.EDProducer("mf")
3101 process.g = cms.EDProducer("mg")
3102 process.h = cms.EDProducer("mh")
3103 process.i = cms.EDProducer("mi")
3104 process.j = cms.EDProducer("mj")
3105 process.b = cms.EDAnalyzer("mb")
3106 process.t8 = cms.Task(cms.TaskPlaceholder("j"))
3107 process.t6 = cms.Task(cms.TaskPlaceholder("h"))
3108 process.t7 = cms.Task(cms.TaskPlaceholder("i"), process.a, process.t6)
3109 process.t4 = cms.Task(cms.TaskPlaceholder("f"))
3110 process.t5 = cms.Task(cms.TaskPlaceholder("g"), cms.TaskPlaceholder("t4"), process.a)
3111 process.t3 = cms.Task(cms.TaskPlaceholder("e"))
3112 process.t1 = cms.Task(cms.TaskPlaceholder("c"))
3113 process.t2 = cms.Task(cms.TaskPlaceholder("d"), process.a, process.t1)
3114 process.path1 = cms.Path(process.b, process.t2, process.t3)
3115 process.endpath1 = cms.EndPath(process.b, process.t5)
3116 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
3117  p.resolve()
3118  self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()),
3119 """process.a = cms.EDProducer("ma")
3120 process.c = cms.EDProducer("mc")
3121 process.d = cms.EDProducer("md")
3122 process.e = cms.EDProducer("me")
3123 process.f = cms.EDProducer("mf")
3124 process.g = cms.EDProducer("mg")
3125 process.h = cms.EDProducer("mh")
3126 process.i = cms.EDProducer("mi")
3127 process.j = cms.EDProducer("mj")
3128 process.b = cms.EDAnalyzer("mb")
3129 process.t8 = cms.Task(process.j)
3130 process.t6 = cms.Task(process.h)
3131 process.t7 = cms.Task(process.a, process.i, process.t6)
3132 process.t4 = cms.Task(process.f)
3133 process.t5 = cms.Task(process.a, process.g, process.t4)
3134 process.t3 = cms.Task(process.e)
3135 process.t1 = cms.Task(process.c)
3136 process.t2 = cms.Task(process.a, process.d, process.t1)
3137 process.path1 = cms.Path(process.b, process.t2, process.t3)
3138 process.endpath1 = cms.EndPath(process.b, process.t5)
3139 process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""")
3140 
3141  def testDelete(self):
3142  p = Process("test")
3143  p.a = EDAnalyzer("MyAnalyzer")
3144  p.b = EDAnalyzer("YourAnalyzer")
3145  p.c = EDAnalyzer("OurAnalyzer")
3146  p.d = EDAnalyzer("OurAnalyzer")
3147  p.e = EDAnalyzer("OurAnalyzer")
3148  p.f = EDAnalyzer("OurAnalyzer")
3149  p.g = EDProducer("OurProducer")
3150  p.h = EDProducer("YourProducer")
3151  p.t1 = Task(p.g, p.h)
3152  t2 = Task(p.g, p.h)
3153  t3 = Task(p.g, p.h)
3154  p.s = Sequence(p.d+p.e)
3155  p.path1 = Path(p.a+p.f+p.s,t2)
3156  p.endpath1 = EndPath(p.b+p.f)
3157  p.schedule = Schedule(tasks=[t3])
3158  self.assertTrue(hasattr(p, 'f'))
3159  self.assertTrue(hasattr(p, 'g'))
3160  del p.e
3161  del p.f
3162  del p.g
3163  self.assertFalse(hasattr(p, 'f'))
3164  self.assertFalse(hasattr(p, 'g'))
3165  self.assertTrue(p.t1.dumpPython() == 'cms.Task(process.h)\n')
3166  self.assertTrue(p.s.dumpPython() == 'cms.Sequence(process.d)\n')
3167  self.assertTrue(p.path1.dumpPython() == 'cms.Path(process.a+process.s, cms.Task(process.h))\n')
3168  self.assertTrue(p.endpath1.dumpPython() == 'cms.EndPath(process.b)\n')
3169  del p.s
3170  self.assertTrue(p.path1.dumpPython() == 'cms.Path(process.a+(process.d), cms.Task(process.h))\n')
3171  self.assertTrue(p.schedule_().dumpPython() == 'cms.Schedule(tasks=[cms.Task(process.h)])\n')
3172  def testModifier(self):
3173  m1 = Modifier()
3174  p = Process("test",m1)
3175  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
3176  def _mod_fred(obj):
3177  obj.fred = 2
3178  m1.toModify(p.a,_mod_fred)
3179  self.assertEqual(p.a.fred.value(),2)
3180  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
3181  m1.toModify(p.b, wilma = 2)
3182  self.assertEqual(p.b.wilma.value(),2)
3183  self.assertTrue(p.isUsingModifier(m1))
3184  #check that Modifier not attached to a process doesn't run
3185  m1 = Modifier()
3186  p = Process("test")
3187  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
3188  m1.toModify(p.a,_mod_fred)
3189  p.b = EDAnalyzer("YourAnalyzer", wilma = int32(1))
3190  m1.toModify(p.b, wilma = 2)
3191  self.assertEqual(p.a.fred.value(),1)
3192  self.assertEqual(p.b.wilma.value(),1)
3193  self.assertEqual(p.isUsingModifier(m1),False)
3194  #make sure clones get the changes
3195  m1 = Modifier()
3196  p = Process("test",m1)
3197  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3198  m1.toModify(p.a, fred = int32(2))
3199  p.b = p.a.clone(wilma = int32(3))
3200  self.assertEqual(p.a.fred.value(),2)
3201  self.assertEqual(p.a.wilma.value(),1)
3202  self.assertEqual(p.b.fred.value(),2)
3203  self.assertEqual(p.b.wilma.value(),3)
3204  #test removal of parameter
3205  m1 = Modifier()
3206  p = Process("test",m1)
3207  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1), fintstones = PSet(fred = int32(1)))
3208  m1.toModify(p.a, fred = None, fintstones = dict(fred = None))
3209  self.assertEqual(hasattr(p.a, "fred"), False)
3210  self.assertEqual(hasattr(p.a.fintstones, "fred"), False)
3211  self.assertEqual(p.a.wilma.value(),1)
3212  #test adding a parameter
3213  m1 = Modifier()
3214  p = Process("test",m1)
3215  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1))
3216  m1.toModify(p.a, wilma = int32(2))
3217  self.assertEqual(p.a.fred.value(), 1)
3218  self.assertEqual(p.a.wilma.value(),2)
3219  #test setting of value in PSet
3220  m1 = Modifier()
3221  p = Process("test",m1)
3222  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = int32(1), wilma = int32(1)))
3223  m1.toModify(p.a, flintstones = dict(fred = int32(2)))
3224  self.assertEqual(p.a.flintstones.fred.value(),2)
3225  self.assertEqual(p.a.flintstones.wilma.value(),1)
3226  #test proper exception from nonexisting parameter name
3227  m1 = Modifier()
3228  p = Process("test",m1)
3229  p.a = EDAnalyzer("MyAnalyzer", flintstones = PSet(fred = PSet(wilma = int32(1))))
3230  self.assertRaises(KeyError, lambda: m1.toModify(p.a, flintstones = dict(imnothere = dict(wilma=2))))
3231  self.assertRaises(KeyError, lambda: m1.toModify(p.a, foo = 1))
3232  #test setting a value in a VPSet
3233  m1 = Modifier()
3234  p = Process("test",m1)
3235  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
3236  m1.toModify(p.a, flintstones = {1:dict(wilma = int32(2))})
3237  self.assertEqual(p.a.flintstones[0].fred.value(),1)
3238  self.assertEqual(p.a.flintstones[1].wilma.value(),2)
3239  #test setting a value in a list of values
3240  m1 = Modifier()
3241  p = Process("test",m1)
3242  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
3243  m1.toModify(p.a, fred = {1:7})
3244  self.assertEqual(p.a.fred[0],1)
3245  self.assertEqual(p.a.fred[1],7)
3246  self.assertEqual(p.a.fred[2],3)
3247  #test IndexError setting a value in a list to an item key not in the list
3248  m1 = Modifier()
3249  p = Process("test",m1)
3250  p.a = EDAnalyzer("MyAnalyzer", fred = vuint32(1,2,3))
3251  raised = False
3252  try: m1.toModify(p.a, fred = {5:7})
3253  except IndexError as e: raised = True
3254  self.assertEqual(raised, True)
3255  #test TypeError setting a value in a list using a key that is not an int
3256  m1 = Modifier()
3257  p = Process("test",m1)
3258  p.a = EDAnalyzer("MyAnalyzer", flintstones = VPSet(PSet(fred = int32(1)), PSet(wilma = int32(1))))
3259  raised = False
3260  try: m1.toModify(p.a, flintstones = dict(bogus = int32(37)))
3261  except TypeError as e: raised = True
3262  self.assertEqual(raised, True)
3263  #test that load causes process wide methods to run
3264  def _rem_a(proc):
3265  del proc.a
3266  class ProcModifierMod(object):
3267  def __init__(self,modifier,func):
3268  self.proc_mod_ = modifier.makeProcessModifier(func)
3269  class DummyMod(object):
3270  def __init__(self):
3271  self.a = EDAnalyzer("Dummy")
3272  testMod = DummyMod()
3273  p.extend(testMod)
3274  self.assertTrue(hasattr(p,"a"))
3275  m1 = Modifier()
3276  p = Process("test",m1)
3277  testProcMod = ProcModifierMod(m1,_rem_a)
3278  p.extend(testMod)
3279  p.extend(testProcMod)
3280  self.assertTrue(not hasattr(p,"a"))
3281  #test ModifierChain
3282  m1 = Modifier()
3283  mc = ModifierChain(m1)
3284  p = Process("test",mc)
3285  self.assertTrue(p.isUsingModifier(m1))
3286  self.assertTrue(p.isUsingModifier(mc))
3287  testMod = DummyMod()
3288  p.b = EDAnalyzer("Dummy2", fred = int32(1))
3289  m1.toModify(p.b, fred = int32(3))
3290  p.extend(testMod)
3291  testProcMod = ProcModifierMod(m1,_rem_a)
3292  p.extend(testProcMod)
3293  self.assertTrue(not hasattr(p,"a"))
3294  self.assertEqual(p.b.fred.value(),3)
3295  #check cloneAndExclude
3296  m1 = Modifier()
3297  m2 = Modifier()
3298  mc = ModifierChain(m1,m2)
3299  mclone = mc.copyAndExclude([m2])
3300  self.assertTrue(not mclone._isOrContains(m2))
3301  self.assertTrue(mclone._isOrContains(m1))
3302  m3 = Modifier()
3303  mc2 = ModifierChain(mc,m3)
3304  mclone = mc2.copyAndExclude([m2])
3305  self.assertTrue(not mclone._isOrContains(m2))
3306  self.assertTrue(mclone._isOrContains(m1))
3307  self.assertTrue(mclone._isOrContains(m3))
3308  #check combining
3309  m1 = Modifier()
3310  m2 = Modifier()
3311  p = Process("test",m1)
3312  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3313  (m1 & m2).toModify(p.a, fred = int32(2))
3314  self.assertRaises(TypeError, lambda: (m1 & m2).toModify(p.a, 1, wilma=2))
3315  self.assertEqual(p.a.fred, 1)
3316  m1 = Modifier()
3317  m2 = Modifier()
3318  p = Process("test",m1,m2)
3319  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3320  (m1 & m2).toModify(p.a, fred = int32(2))
3321  self.assertEqual(p.a.fred, 2)
3322  m1 = Modifier()
3323  m2 = Modifier()
3324  m3 = Modifier()
3325  p = Process("test",m1,m2,m3)
3326  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3327  (m1 & m2 & m3).toModify(p.a, fred = int32(2))
3328  self.assertEqual(p.a.fred, 2)
3329  (m1 & (m2 & m3)).toModify(p.a, fred = int32(3))
3330  self.assertEqual(p.a.fred, 3)
3331  ((m1 & m2) & m3).toModify(p.a, fred = int32(4))
3332  self.assertEqual(p.a.fred, 4)
3333  #check inverse
3334  m1 = Modifier()
3335  m2 = Modifier()
3336  p = Process("test", m1)
3337  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3338  (~m1).toModify(p.a, fred=2)
3339  self.assertEqual(p.a.fred, 1)
3340  (~m2).toModify(p.a, wilma=2)
3341  self.assertEqual(p.a.wilma, 2)
3342  self.assertRaises(TypeError, lambda: (~m1).toModify(p.a, 1, wilma=2))
3343  self.assertRaises(TypeError, lambda: (~m2).toModify(p.a, 1, wilma=2))
3344  # check or
3345  m1 = Modifier()
3346  m2 = Modifier()
3347  m3 = Modifier()
3348  p = Process("test", m1)
3349  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3350  (m1 | m2).toModify(p.a, fred=2)
3351  self.assertEqual(p.a.fred, 2)
3352  (m1 | m2 | m3).toModify(p.a, fred=3)
3353  self.assertEqual(p.a.fred, 3)
3354  (m3 | m2 | m1).toModify(p.a, fred=4)
3355  self.assertEqual(p.a.fred, 4)
3356  ((m1 | m2) | m3).toModify(p.a, fred=5)
3357  self.assertEqual(p.a.fred, 5)
3358  (m1 | (m2 | m3)).toModify(p.a, fred=6)
3359  self.assertEqual(p.a.fred, 6)
3360  (m2 | m3).toModify(p.a, fred=7)
3361  self.assertEqual(p.a.fred, 6)
3362  self.assertRaises(TypeError, lambda: (m1 | m2).toModify(p.a, 1, wilma=2))
3363  self.assertRaises(TypeError, lambda: (m2 | m3).toModify(p.a, 1, wilma=2))
3364  # check combinations
3365  m1 = Modifier()
3366  m2 = Modifier()
3367  m3 = Modifier()
3368  m4 = Modifier()
3369  p = Process("test", m1, m2)
3370  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3371  (m1 & ~m2).toModify(p.a, fred=2)
3372  self.assertEqual(p.a.fred, 1)
3373  (m1 & ~m3).toModify(p.a, fred=2)
3374  self.assertEqual(p.a.fred, 2)
3375  (m1 | ~m2).toModify(p.a, fred=3)
3376  self.assertEqual(p.a.fred, 3)
3377  (~m1 | ~m2).toModify(p.a, fred=4)
3378  self.assertEqual(p.a.fred, 3)
3379  (~m3 & ~m4).toModify(p.a, fred=4)
3380  self.assertEqual(p.a.fred, 4)
3381  ((m1 & m3) | ~m4).toModify(p.a, fred=5)
3382  self.assertEqual(p.a.fred, 5)
3383  #check toReplaceWith
3384  m1 = Modifier()
3385  p = Process("test",m1)
3386  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
3387  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
3388  self.assertRaises(TypeError, lambda: m1.toReplaceWith(p.a, EDProducer("YourProducer")))
3389  p.b =EDAnalyzer("BAn")
3390  p.c =EDProducer("c")
3391  p.d =EDProducer("d")
3392  p.tc = Task(p.c)
3393  p.td = Task(p.d)
3394  p.s = Sequence(p.a, p.tc)
3395  m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td))
3396  self.assertEqual(p.a.wilma.value(),3)
3397  self.assertEqual(p.a.type_(),"YourAnalyzer")
3398  self.assertEqual(hasattr(p,"fred"),False)
3399  self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n")
3400  p.e =EDProducer("e")
3401  m1.toReplaceWith(p.td, Task(p.e))
3402  self.assertTrue(p.td._collection == OrderedSet([p.e]))
3403  #check toReplaceWith doesn't activate not chosen
3404  m1 = Modifier()
3405  p = Process("test")
3406  p.a =EDAnalyzer("MyAnalyzer", fred = int32(1))
3407  m1.toReplaceWith(p.a, EDAnalyzer("YourAnalyzer", wilma = int32(3)))
3408  self.assertEqual(p.a.type_(),"MyAnalyzer")
3409  #check toReplaceWith and and/not/or combinations
3410  m1 = Modifier()
3411  m2 = Modifier()
3412  m3 = Modifier()
3413  m4 = Modifier()
3414  p = Process("test", m1, m2)
3415  p.a = EDAnalyzer("MyAnalyzer", fred = int32(1), wilma = int32(1))
3416  self.assertRaises(TypeError, lambda: (m1 & m2).toReplaceWith(p.a, EDProducer("YourProducer")))
3417  self.assertRaises(TypeError, lambda: (m3 & m4).toReplaceWith(p.a, EDProducer("YourProducer")))
3418  self.assertRaises(TypeError, lambda: (~m3).toReplaceWith(p.a, EDProducer("YourProducer")))
3419  self.assertRaises(TypeError, lambda: (~m1).toReplaceWith(p.a, EDProducer("YourProducer")))
3420  self.assertRaises(TypeError, lambda: (m1 | m3).toReplaceWith(p.a, EDProducer("YourProducer")))
3421  self.assertRaises(TypeError, lambda: (m3 | m4).toReplaceWith(p.a, EDProducer("YourProducer")))
3422  (m1 & m2).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer1"))
3423  self.assertEqual(p.a.type_(), "YourAnalyzer1")
3424  (m1 & m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
3425  self.assertEqual(p.a.type_(), "YourAnalyzer1")
3426  (~m1).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
3427  self.assertEqual(p.a.type_(), "YourAnalyzer1")
3428  (~m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer2"))
3429  self.assertEqual(p.a.type_(), "YourAnalyzer2")
3430  (m1 | m3).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer3"))
3431  self.assertEqual(p.a.type_(), "YourAnalyzer3")
3432  (m3 | m4).toReplaceWith(p.a, EDAnalyzer("YourAnalyzer4"))
3433  self.assertEqual(p.a.type_(), "YourAnalyzer3")
3434 
3435  # EDAlias
3436  a = EDAlias(foo2 = VPSet(PSet(type = string("Foo2"))))
3437  m = Modifier()
3438  m._setChosen()
3439  # Modify parameters
3440  m.toModify(a, foo2 = {0: dict(type = "Foo3")})
3441  self.assertEqual(a.foo2[0].type, "Foo3")
3442  # Add an alias
3443  m.toModify(a, foo4 = VPSet(PSet(type = string("Foo4"))))
3444  self.assertEqual(a.foo2[0].type, "Foo3")
3445  self.assertEqual(a.foo4[0].type, "Foo4")
3446  # Remove an alias
3447  m.toModify(a, foo2 = None)
3448  self.assertFalse(hasattr(a, "foo2"))
3449  self.assertEqual(a.foo4[0].type, "Foo4")
3450  # Replace (doesn't work out of the box because EDAlias is not _Parameterizable
3451  m.toReplaceWith(a, EDAlias(bar = VPSet(PSet(type = string("Bar")))))
3452  self.assertFalse(hasattr(a, "foo2"))
3453  self.assertFalse(hasattr(a, "foo4"))
3454  self.assertTrue(hasattr(a, "bar"))
3455  self.assertEqual(a.bar[0].type, "Bar")
3456 
3457  # SwitchProducer
3458  sp = SwitchProducerTest(test1 = EDProducer("Foo",
3459  a = int32(1),
3460  b = PSet(c = int32(2))),
3461  test2 = EDProducer("Bar",
3462  aa = int32(11),
3463  bb = PSet(cc = int32(12))))
3464  m = Modifier()
3465  m._setChosen()
3466  # Modify parameters
3467  m.toModify(sp,
3468  test1 = dict(a = 4, b = dict(c = None)),
3469  test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo"))))
3470  self.assertEqual(sp.test1.a.value(), 4)
3471  self.assertEqual(sp.test1.b.hasParameter("c"), False)
3472  self.assertEqual(sp.test2.aa.value(), 15)
3473  self.assertEqual(sp.test2.bb.cc.value(), 45)
3474  self.assertEqual(sp.test2.bb.dd.value(), "foo")
3475  # Replace a producer
3476  m.toReplaceWith(sp.test1, EDProducer("Fred", x = int32(42)))
3477  self.assertEqual(sp.test1.type_(), "Fred")
3478  self.assertEqual(sp.test1.x.value(), 42)
3479  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test1, EDAnalyzer("Foo")))
3480  # Alternative way (only to be allow same syntax to be used as for adding)
3481  m.toModify(sp, test2 = EDProducer("Xyzzy", x = int32(24)))
3482  self.assertEqual(sp.test2.type_(), "Xyzzy")
3483  self.assertEqual(sp.test2.x.value(), 24)
3484  self.assertRaises(TypeError, lambda: m.toModify(sp, test2 = EDAnalyzer("Foo")))
3485  # Add a producer
3486  m.toModify(sp, test3 = EDProducer("Wilma", y = int32(24)))
3487  self.assertEqual(sp.test3.type_(), "Wilma")
3488  self.assertEqual(sp.test3.y.value(), 24)
3489  self.assertRaises(TypeError, lambda: m.toModify(sp, test4 = EDAnalyzer("Foo")))
3490  # Remove a producer
3491  m.toModify(sp, test2 = None)
3492  self.assertEqual(hasattr(sp, "test2"), False)
3493  # Add an alias
3494  m.toModify(sp, test2 = EDAlias(foo = VPSet(PSet(type = string("int")))))
3495  self.assertTrue(hasattr(sp.test2, "foo"))
3496  # Replace an alias
3497  m.toReplaceWith(sp.test2, EDAlias(bar = VPSet(PSet(type = string("int")))))
3498  self.assertTrue(hasattr(sp.test2, "bar"))
3499  # Alternative way
3500  m.toModify(sp, test2 = EDAlias(xyzzy = VPSet(PSet(type = string("int")))))
3501  self.assertTrue(hasattr(sp.test2, "xyzzy"))
3502  # Replace an alias with EDProducer
3503  self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test2, EDProducer("Foo")))
3504  m.toModify(sp, test2 = EDProducer("Foo"))
3506  #check defaults are not overwritten
3507  f = ProcessFragment('Fragment')
3508  p = Process('PROCESS')
3509  p.maxEvents.input = 10
3510  p.options.numberOfThreads = 4
3511  p.maxLuminosityBlocks.input = 2
3512  p.extend(f)
3513  self.assertEqual(p.maxEvents.input.value(),10)
3514  self.assertEqual(p.options.numberOfThreads.value(), 4)
3515  self.assertEqual(p.maxLuminosityBlocks.input.value(),2)
3516  #general checks
3517  f = ProcessFragment("Fragment")
3518  f.fltr = EDFilter("Foo")
3519  p = Process('PROCESS')
3520  p.extend(f)
3521  self.assertTrue(hasattr(p,'fltr'))
3522 
3523  unittest.main()
def __setstate__(self, pkldict)
Definition: Config.py:165
def addVString(self, tracked, label, value)
Definition: Config.py:1791
def _dumpConfigOptionallyNamedList(self, items, typeName, options)
Definition: Config.py:751
def addEventRange(self, tracked, label, value)
Definition: Config.py:1811
def __init__(self, lhs, rhs)
Definition: Config.py:1572
def testExamples(self)
Definition: Config.py:2770
def __getattribute__(self, name)
Definition: Config.py:1413
def _place(self, label, process)
Definition: Config.py:1497
def getProcessName(self)
Definition: Config.py:1485
def testServiceInProcess(self)
Definition: Config.py:2250
def __or__(self, other)
Definition: Config.py:1663
def outputCommands(self)
Definition: Config.py:1491
def _setChosen(self)
Definition: Config.py:1680
def producerNames(self)
Definition: Config.py:149
def _dumpConfigUnnamedList(self, items, typeName, options)
Definition: Config.py:745
def newPSet(self)
Definition: Config.py:1821
def _placeAnalyzer(self, name, mod)
Definition: Config.py:624
def addString(self, tracked, label, value)
Definition: Config.py:1789
def __findFirstUsingModule(self, seqsOrTasks, mod)
Definition: Config.py:508
def subProcesses_(self)
Definition: Config.py:265
def __repr__(self)
Definition: Config.py:1456
def _pruneModules(self, d, scheduledNames)
Definition: Config.py:1256
def _modifyParametersFromDict(params, newParams, errorRaiser, keyDepth="")
Definition: Mixins.py:688
def vpsets_(self)
Definition: Config.py:336
def setName_(self, name)
Definition: Config.py:188
def _placeESPrefer(self, name, mod)
Definition: Config.py:645
def testSequence2(self)
Definition: Config.py:2240
def __updateMaxEvents(self, ps)
Definition: Config.py:253
def _placeSwitchProducer(self, name, mod)
Definition: Config.py:620
def _insertPaths(self, processPSet, nodeVisitor)
Definition: Config.py:1127
def es_producers_(self)
Definition: Config.py:316
def _placeESProducer(self, name, mod)
Definition: Config.py:643
def __invert__(self)
Definition: Config.py:1661
def _splitPythonList(self, subfolder, d, options)
Definition: Config.py:847
def pathNames(self)
Definition: Config.py:161
def addVESInputTag(self, tracked, label, value)
Definition: Config.py:1801
def __and__(self, other)
Definition: Config.py:1659
def _placeSequence(self, name, mod)
Definition: Config.py:640
def __call__(self, obj)
Definition: Config.py:1512
def _setChosen(self)
Definition: Config.py:1654
untracked
Definition: Types.py:35
def _validateSequence(self, sequence, label)
Definition: Config.py:868
def __getattr__(self, attr)
Definition: Config.py:1458
def tasks_(self)
Definition: Config.py:289
def setStrict(self, value)
Definition: Config.py:144
def addDouble(self, tracked, label, value)
Definition: Config.py:1783
def producers_(self)
Definition: Config.py:193
def _findPreferred(self, esname, d, args, kargs)
Definition: Config.py:1378
def testModifier(self)
Definition: Config.py:3172
def _insertOneInto(self, parameterSet, label, item, tracked)
Definition: Config.py:1089
def _isChosen(self)
Definition: Config.py:1567
def filterNames(self)
Definition: Config.py:158
def __updateOptions(self, opt)
Definition: Config.py:240
def __delattr__(self, name)
Definition: Config.py:538
def _placePath(self, name, mod)
Definition: Config.py:626
def addVUInt64(self, tracked, label, value)
Definition: Config.py:1781
def _isChosen(self)
Definition: Config.py:1560
def _placeEndPath(self, name, mod)
Definition: Config.py:633
def es_sources_(self)
Definition: Config.py:320
def __init__(self, name, Mods)
Definition: Config.py:104
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
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:1872
def addUInt64(self, tracked, label, value)
Definition: Config.py:1779
def _itemsInDependencyOrder(self, processDictionaryOfItems)
Definition: Config.py:886
def source_(self)
Definition: Config.py:201
def addVPSet(self, tracked, label, value)
Definition: Config.py:1817
def nameInProcessDesc_(self, label)
Definition: Config.py:1495
def psets_(self)
Definition: Config.py:332
def _lineDiff(newString, oldString)
Definition: Config.py:1738
def testSecSource(self)
Definition: Config.py:2168
def __init__(self, args)
Definition: Config.py:1510
def format_outerframe(number)
def __init__(self, args, kw)
Definition: Config.py:1454
def load(self, moduleName)
Definition: Config.py:681
def _insertSubProcessesInto(self, parameterSet, label, itemList, tracked)
Definition: Config.py:1114
def addUInt32(self, tracked, label, value)
Definition: Config.py:1771
def _dumpConfigESPrefers(self, options)
Definition: Config.py:825
def __setattr__(self, name, value)
Definition: Config.py:1418
def setLooper_(self, lpr)
Definition: Config.py:210
def setSource_(self, src)
Definition: Config.py:204
def __init__(self, process)
Definition: Config.py:1400
def extend(self, other, items=())
Definition: Config.py:685
def _okToPlace(self, name, mod, d)
Definition: Config.py:587
def __or__(self, other)
Definition: Config.py:1553
def _replaceInTasks(self, label, new)
Definition: Config.py:1071
def addVInt32(self, tracked, label, value)
Definition: Config.py:1769
def _placeFilter(self, name, mod)
Definition: Config.py:622
def schedule_(self)
Definition: Config.py:293
def validate(self)
Definition: Config.py:1342
def addVInputTag(self, tracked, label, value)
Definition: Config.py:1797
def _applyNewProcessModifiers(self, process)
Definition: Config.py:1675
def analyzerNames(self)
Definition: Config.py:155
def testSchedule(self)
Definition: Config.py:2575
def addLuminosityBlockID(self, tracked, label, value)
Definition: Config.py:1807
def addESInputTag(self, tracked, label, value)
Definition: Config.py:1799
def __init__(self, lhs)
Definition: Config.py:1565
def __new__(cls, args, kw)
Definition: Config.py:1437
def testContains(self)
Definition: Config.py:2517
def endpaths_(self)
Definition: Config.py:281
def toModify(self, obj, func=None, kw)
Definition: Config.py:1534
def SelectEvents(self)
Definition: Config.py:1489
def __setattr__(self, name, value)
Definition: Config.py:376
def _placeESSource(self, name, mod)
Definition: Config.py:647
def addVInt64(self, tracked, label, value)
Definition: Config.py:1777
def addVEventID(self, tracked, label, value)
Definition: Config.py:1805
def toModify(self, obj, func=None, kw)
Definition: Config.py:1600
def testGlobalReplace(self)
Definition: Config.py:2173
def testSwitchProducer(self)
Definition: Config.py:2859
def getVString(self, tracked, label)
Definition: Config.py:1793
def defaultMaxLuminosityBlocks_()
Definition: Config.py:263
def testProcessFragment(self)
Definition: Config.py:3505
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1539
def _placeOutputModule(self, name, mod)
Definition: Config.py:616
def addFileInPath(self, tracked, label, value)
Definition: Config.py:1819
def testRefToPSet(self)
Definition: Config.py:2843
def testOverride(self)
Definition: Config.py:2720
def _placeSource(self, name, mod)
Definition: Config.py:658
def __init__(self)
Definition: Config.py:1587
def __init__(self, lhs, rhs=None)
Definition: Config.py:1530
def _dumpPythonSubProcesses(self, l, options)
Definition: Config.py:831
def _insertSwitchProducersInto(self, parameterSet, labelModules, labelAliases, itemDict, tracked)
Definition: Config.py:1104
def checkImportPermission(minLevel=2, allowedPatterns=[])
Definition: Config.py:30
def ignore(seq)
def _toModify(obj, func, kw)
Definition: Config.py:1618
def __init__(self, modifier, func)
Definition: Config.py:1724
def _toReplaceWith(toObj, fromObj)
Definition: Config.py:1636
def _toModifyCheck(obj, func, kw)
Definition: Config.py:1597
def isUsingModifier(self, mod)
Definition: Config.py:341
def dumpPython(self, options=PrintOptions())
Definition: Config.py:1478
def __copyIfExclude(self, toExclude)
Definition: Config.py:1701
def sequences_(self)
Definition: Config.py:285
def _validateTask(self, task, label)
Definition: Config.py:877
def testParameterizable(self)
Definition: Config.py:1839
def testSubProcess(self)
Definition: Config.py:2820
def _placeSubProcess(self, name, mod)
Definition: Config.py:671
def setPartialSchedule_(self, sch, label)
Definition: Config.py:296
def addPSet(self, tracked, label, value)
Definition: Config.py:1815
def testProcessDumpPython(self)
Definition: Config.py:1991
def _placeService(self, typeName, mod)
Definition: Config.py:676
def resolve(self, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1181
def looper_(self)
Definition: Config.py:207
def es_prefers_(self)
Definition: Config.py:324
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
def _isChosen(self)
Definition: Config.py:1657
def _isOrContains(self, other)
Definition: Config.py:1665
def getSubProcessPSet(self, parameterSet)
Definition: Config.py:1499
def copyAndExclude(self, toExclude)
Definition: Config.py:1687
def addVUInt32(self, tracked, label, value)
Definition: Config.py:1773
def addVEventRange(self, tracked, label, value)
Definition: Config.py:1813
def _splitPython(self, subfolder, d, options)
Definition: Config.py:949
def defaultMaxEvents_()
Definition: Config.py:250
def __init__(self, lhs, rhs)
Definition: Config.py:1558
def filters_(self)
Definition: Config.py:182
def dumpPython(process, name)
def __setObjectLabel(self, object, newLabel)
Definition: Config.py:349
def _delHelper(self, name)
Definition: Config.py:521
def _placeAlias(self, name, mod)
Definition: Config.py:652
def dumpPython(self, options=PrintOptions())
Definition: Config.py:955
def _replaceInSequences(self, label, new)
Definition: Config.py:1056
def setSchedule_(self, sch)
Definition: Config.py:301
def analyzers_(self)
Definition: Config.py:269
def _toReplaceWithCheck(toObj, fromObj)
Definition: Config.py:1625
def defaultOptions_()
Definition: Config.py:214
def testSequence(self)
Definition: Config.py:2225
def switchProducerNames(self)
Definition: Config.py:152
def toReplaceWith(self, toObj, fromObj)
Definition: Config.py:1628
def _placeProducer(self, name, mod)
Definition: Config.py:618
def prefer(self, esmodule, args, kargs)
Definition: Config.py:1349
def __delattr__(self, name)
Definition: Config.py:1423
def _dumpConfigNamedList(self, items, typeName, options)
Definition: Config.py:739
def addInputTag(self, tracked, label, value)
Definition: Config.py:1795
def add_(self, value)
Definition: Config.py:572
def _isChosen(self)
Definition: Config.py:1574
def _insertManyInto(self, parameterSet, label, itemDict, tracked)
Definition: Config.py:1096
def dumpConfig(self, options=PrintOptions())
Definition: Config.py:759
def apply(self, process)
Definition: Config.py:1728
def testCloneSequence(self)
Definition: Config.py:2501
def process(self)
Definition: Config.py:1487
def _placeTask(self, name, task)
Definition: Config.py:649
def makeProcessModifier(self, func)
Definition: Config.py:1544
def addSubProcess(self, mod)
Definition: Config.py:674
def switchProducers_(self)
Definition: Config.py:197
def _placePSet(self, name, mod)
Definition: Config.py:654
def _isOrContains(self, other)
Definition: Config.py:1710
def addInt64(self, tracked, label, value)
Definition: Config.py:1775
def name_(self)
Definition: Config.py:186
def _place(self, name, mod, d)
Definition: Config.py:608
def testProcessExtend(self)
Definition: Config.py:1904
def _dumpPythonList(self, d, options)
Definition: Config.py:837
def __insertValue(self, tracked, label, value)
Definition: Config.py:1758
def splitPython(self, options=PrintOptions())
Definition: Config.py:989
def __init__(self, kargs)
Definition: Config.py:1825
def __getValue(self, tracked, label)
Definition: Config.py:1760
def _placeVPSet(self, name, mod)
Definition: Config.py:656
def __and__(self, other)
Definition: Config.py:1549
def globalReplace(self, label, new)
Definition: Config.py:1081
#define str(s)
def addBool(self, tracked, label, value)
Definition: Config.py:1787
def testMaxEvents(self)
Definition: Config.py:2755
def paths_(self)
Definition: Config.py:277
def addEventID(self, tracked, label, value)
Definition: Config.py:1803
def outputModules_(self)
Definition: Config.py:273
def _placeLooper(self, name, mod)
Definition: Config.py:666
def testImplicitSchedule(self)
Definition: Config.py:2680
def prune(self, verbose=False, keepUnresolvedSequencePlaceholders=False)
Definition: Config.py:1190
def addVDouble(self, tracked, label, value)
Definition: Config.py:1785
def _insertInto(self, parameterSet, itemDict)
Definition: Config.py:1086
def _delattrFromSetattr(self, name)
Definition: Config.py:563
def makeProcessModifier(self, func)
Definition: Config.py:1590
def __init__(self, process, SelectEvents=untracked.PSet(), outputCommands=untracked.vstring())
Definition: Config.py:1466
def type_(self)
Definition: Config.py:1493
def __init__(self, chainedModifiers)
Definition: Config.py:1672
def testTaskPlaceholder(self)
Definition: Config.py:3072
def services_(self)
Definition: Config.py:312
def _replaceInSchedule(self, label, new)
Definition: Config.py:1075
def _dumpPython(self, d, options)
Definition: Config.py:943
def addInt32(self, tracked, label, value)
Definition: Config.py:1767
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
def _isChosen(self)
Definition: Config.py:1685
def fillProcessDesc(self, processPSet)
Definition: Config.py:1263
def findProcess(module)
Definition: Config.py:83
def testProcessInsertion(self)
Definition: Config.py:1879
def __init__(self)
Definition: Config.py:1756
def aliases_(self)
Definition: Config.py:328