CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Modules.py
Go to the documentation of this file.
1 from __future__ import absolute_import
2 from .Mixins import _ConfigureComponent, saveOrigin
3 from .Mixins import _Unlabelable, _Labelable
4 from .Mixins import _TypedParameterizable, _Parameterizable, PrintOptions, specialImportRegistry
5 from .SequenceTypes import _SequenceLeaf
6 from .Types import vstring, EDAlias
7 
8 
9 import copy
10 from .ExceptionHandling import *
11 class Service(_ConfigureComponent,_TypedParameterizable,_Unlabelable):
12  def __init__(self,type_,*arg,**kargs):
13  super(Service,self).__init__(type_,*arg,**kargs)
14  self._inProcess = False
15  def _placeImpl(self,name,proc):
16  self._inProcess = True
17  proc._placeService(self.type_(),self)
18  def insertInto(self, processDesc):
19  newpset = processDesc.newPSet()
20  newpset.addString(True, "@service_type", self.type_())
21  self.insertContentsInto(newpset)
22  processDesc.addService(newpset)
23  def dumpSequencePython(self, options=PrintOptions()):
24  return "process." + self.type_()
25  def _isTaskComponent(self):
26  return True
27  def isLeaf(self):
28  return True
29  def __str__(self):
30  return str(self.type_())
31 
32 class ESSource(_ConfigureComponent,_TypedParameterizable,_Unlabelable,_Labelable):
33  def __init__(self,type_,*arg,**kargs):
34  super(ESSource,self).__init__(type_,*arg,**kargs)
35  saveOrigin(self, 1)
36  def _placeImpl(self,name,proc):
37  if name == '':
38  name=self.type_()
39  proc._placeESSource(name,self)
40  def moduleLabel_(self,myname):
41  result = myname
42  if self.type_() == myname:
43  result = ""
44  return result
45  def nameInProcessDesc_(self, myname):
46  result = self.type_() + "@" + self.moduleLabel_(myname)
47  return result
48  def _isTaskComponent(self):
49  return True
50  def isLeaf(self):
51  return True
52 
53 class ESProducer(_ConfigureComponent,_TypedParameterizable,_Unlabelable,_Labelable):
54  def __init__(self,type_,*arg,**kargs):
55  super(ESProducer,self).__init__(type_,*arg,**kargs)
56  def _placeImpl(self,name,proc):
57  if name == '':
58  name=self.type_()
59  proc._placeESProducer(name,self)
60  def moduleLabel_(self,myname):
61  result = myname
62  if self.type_() == myname:
63  result = ''
64  return result
65  def nameInProcessDesc_(self, myname):
66  result = self.type_() + "@" + self.moduleLabel_(myname)
67  return result
68  def _isTaskComponent(self):
69  return True
70  def isLeaf(self):
71  return True
72 
73 class ESPrefer(_ConfigureComponent,_TypedParameterizable,_Unlabelable,_Labelable):
74  """Used to set which EventSetup provider should provide a particular data item
75  in the case where multiple providers are capable of delivering the data.
76  The first argument specifies the C++ class type of the prodiver.
77  If the provider has been given a label, you must specify that label as the second argument.
78  Additional 'vstring' arguments maybe used to specify exactly which EventSetup Records
79  are being preferred and optionally which data items within that Record.
80  E.g.,
81  #prefer all data in record 'OrangeRecord' from 'juicer'
82  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring())
83  or
84  #prefer only "Orange" data in "OrangeRecord" from "juicer"
85  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("ExtraPulp"))
86  or
87  #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
88  ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
89  """
90  def __init__(self,type_,targetLabel='',*arg,**kargs):
91  super(ESPrefer,self).__init__(type_,*arg,**kargs)
92  self._targetLabel = targetLabel
93  if targetLabel is None:
94  self._targetLabel = str('')
95  if kargs:
96  for k,v in kargs.items():
97  if not isinstance(v,vstring):
98  raise RuntimeError('ESPrefer only allows vstring attributes. "'+k+'" is a '+str(type(v)))
99  def _placeImpl(self,name,proc):
100  proc._placeESPrefer(name,self)
101  def nameInProcessDesc_(self, myname):
102  # the C++ parser can give it a name like "label@prefer". Get rid of that.
103  return "esprefer_" + self.type_() + "@" + self._targetLabel
104  def copy(self):
105  returnValue = ESPrefer.__new__(type(self))
106  returnValue.__init__(self.type_(), self._targetLabel)
107  return returnValue
108  def moduleLabel_(self, myname):
109  return self._targetLabel
110  def targetLabel_(self):
111  return self._targetLabel
112  def dumpPythonAs(self, label, options=PrintOptions()):
113  result = options.indentation()
114  basename = self._targetLabel
115  if basename == '':
116  basename = self.type_()
117  if options.isCfg:
118  # do either type or label
119  result += 'process.prefer("'+basename+'"'
120  if self.parameterNames_():
121  result += ",\n"+_Parameterizable.dumpPython(self,options)+options.indentation()
122  result +=')\n'
123  else:
124  # use the base class Module
125  result += 'es_prefer_'+basename+' = cms.ESPrefer("'+self.type_()+'"'
126  if self._targetLabel != '':
127  result += ',"'+self._targetLabel+'"'
128  if self.parameterNames_():
129  result += ",\n"+_Parameterizable.dumpPython(self,options)+options.indentation()
130  result += ')\n'
131  return result
132 
133 class _Module(_ConfigureComponent,_TypedParameterizable,_Labelable,_SequenceLeaf):
134  """base class for classes which denote framework event based 'modules'"""
135  __isStrict__ = False
136  def __init__(self,type_,*arg,**kargs):
137  super(_Module,self).__init__(type_,*arg,**kargs)
138  if _Module.__isStrict__:
139  self.setIsFrozen()
140  saveOrigin(self, 2)
141  def _clonesequence(self, lookuptable):
142  try:
143  return lookuptable[id(self)]
144  except:
145  raise ModuleCloneError(self._errorstr())
146  def _errorstr(self):
147  # return something like "EDAnalyzer("foo", ...)"
148  typename = format_typename(self)
149  return "%s('%s', ...)" %(typename, self.type_())
150 
151  def setPrerequisites(self, *libs):
152  self.__dict__["libraries_"] = libs
153 
154  def insertInto(self, parameterSet, myname):
155  if "libraries_" in self.__dict__:
156  from ctypes import LibraryLoader, CDLL
157  import platform
158  loader = LibraryLoader(CDLL)
159  ext = platform.uname()[0] == "Darwin" and "dylib" or "so"
160  [loader.LoadLibrary("lib%s.%s" % (l, ext)) for l in self.libraries_]
161  super(_Module,self).insertInto(parameterSet,myname)
162 
164  def __init__(self,type_,*arg,**kargs):
165  super(EDProducer,self).__init__(type_,*arg,**kargs)
166  def _placeImpl(self,name,proc):
167  proc._placeProducer(name,self)
168  def _isTaskComponent(self):
169  return True
170 
172  def __init__(self,type_,*arg,**kargs):
173  super(EDFilter,self).__init__(type_,*arg,**kargs)
174  def _placeImpl(self,name,proc):
175  proc._placeFilter(name,self)
176  def _isTaskComponent(self):
177  return True
178 
180  def __init__(self,type_,*arg,**kargs):
181  super(EDAnalyzer,self).__init__(type_,*arg,**kargs)
182  def _placeImpl(self,name,proc):
183  proc._placeAnalyzer(name,self)
184 
185 
187  def __init__(self,type_,*arg,**kargs):
188  super(OutputModule,self).__init__(type_,*arg,**kargs)
189  def _placeImpl(self,name,proc):
190  proc._placeOutputModule(name,self)
191 
192 
193 class Source(_ConfigureComponent,_TypedParameterizable):
194  def __init__(self,type_,*arg,**kargs):
195  super(Source,self).__init__(type_,*arg,**kargs)
196  def _placeImpl(self,name,proc):
197  proc._placeSource(name,self)
198  def moduleLabel_(self,myname):
199  return "@main_input"
200  def nameInProcessDesc_(self,myname):
201  return "@main_input"
202 
203 
204 class Looper(_ConfigureComponent,_TypedParameterizable):
205  def __init__(self,type_,*arg,**kargs):
206  super(Looper,self).__init__(type_,*arg,**kargs)
207  def _placeImpl(self,name,proc):
208  proc._placeLooper(name,self)
209  def moduleLabel_(self,myname):
210  return "@main_looper"
211  def nameInProcessDesc_(self, myname):
212  return "@main_looper"
213 
214 
215 # Need to be a module-level function for the configuration with a
216 # SwitchProducer to be pickleable.
217 def _switch_cpu(accelerators):
218  return (True, 1)
219 
221  """This purpose class is to provide a switch of EDProducers for a single module/product label.
222 
223  The decision is done at the time when the python configuration is
224  translated to C++. This class is generic, and intended to be
225  inherited for concrete switches. Example:
226 
227  class SwitchProducerFoo(SwitchProducer):
228  def __init__(self, **kargs):
229  super(SwitchProducerFoo,self).__init__(
230  dict(case1 = case1Func, case2 = case2Func),
231  **kargs
232  )
233 
234  foo = SwitchProducerFoo(
235  case1 = EDProducer("Producer1"),
236  case2 = EDProducer("Producer2")
237  )
238 
239  Here case1Func and case2Func are functions that return a (bool,
240  int) tuple, where the bool tells whether that case is enabled or
241  not, and the int tells the priority of that case. The case with
242  the highest priority among those that are enabled will get chosen.
243 
244  The end result is that the product(s) labeled as "foo" will be
245  produced with one of the producers. It would be good if their
246  output product types and instance names would be the same (or very
247  close).
248  """
249  def __init__(self, caseFunctionDict, **kargs):
250  super(SwitchProducer,self).__init__(None)
251  self._caseFunctionDict = copy.copy(caseFunctionDict)
252  self.__setParameters(kargs)
253  self._isModified = False
254 
255  @staticmethod
256  def getCpu():
257  """Returns a function that returns the priority for a CPU "computing device". Intended to be used by deriving classes."""
258  return _switch_cpu
259 
260  def _chooseCase(self, accelerators):
261  """Returns the name of the chosen case."""
262  cases = self.parameterNames_()
263  bestCase = None
264  for case in cases:
265  (enabled, priority) = self._caseFunctionDict[case](accelerators)
266  if enabled and (bestCase is None or bestCase[0] < priority):
267  bestCase = (priority, case)
268  if bestCase is None:
269  raise RuntimeError("All cases '%s' were disabled" % (str(cases)))
270  return bestCase[1]
271 
272  def _getProducer(self, accelerators):
273  """Returns the EDroducer of the chosen case"""
274  return self.__dict__[self._chooseCase(accelerators)]
275 
276  @staticmethod
277  def __typeIsValid(typ):
278  return (isinstance(typ, EDProducer) and not isinstance(typ, SwitchProducer)) or isinstance(typ, EDAlias)
279 
280  def __addParameter(self, name, value):
281  if not self.__typeIsValid(value):
282  raise TypeError(name+" does not already exist, so it can only be set to a cms.EDProducer or cms.EDAlias")
283  if name not in self._caseFunctionDict:
284  raise ValueError("Case '%s' is not allowed (allowed ones are %s)" % (name, ",".join(self._caseFunctionDict.keys())))
285  if name in self.__dict__:
286  message = "Duplicate insert of member " + name
287  message += "\nThe original parameters are:\n"
288  message += self.dumpPython() + '\n'
289  raise ValueError(message)
290  self.__dict__[name]=value
291  self._Parameterizable__parameterNames.append(name)
292  self._isModified = True
293 
294  def __setParameters(self, parameters):
295  for name, value in parameters.items():
296  self.__addParameter(name, value)
297 
298  def __setattr__(self, name, value):
299  # Following snippet copied and customized from
300  # _Parameterizable in order to support Modifier.toModify
301  #
302  #since labels are not supposed to have underscores at the beginning
303  # I will assume that if we have such then we are setting an internal variable
304  if self.isFrozen() and not (name in ["_Labelable__label","_isFrozen"] or name.startswith('_')):
305  message = "Object already added to a process. It is read only now\n"
306  message += " %s = %s" %(name, value)
307  message += "\nThe original parameters are:\n"
308  message += self.dumpPython() + '\n'
309  raise ValueError(message)
310  # underscored names bypass checking for _ParameterTypeBase
311  if name[0]=='_':
312  super(SwitchProducer, self).__setattr__(name,value)
313  elif not name in self.__dict__:
314  self.__addParameter(name, value)
315  self._isModified = True
316  else:
317  if not self.__typeIsValid(value):
318  raise TypeError(name+" can only be set to a cms.EDProducer or cms.EDAlias")
319  # We should always receive an cms.EDProducer
320  self.__dict__[name] = value
321  self._isModified = True
322 
323  def clone(self, **params):
324  returnValue = SwitchProducer.__new__(type(self))
325 
326  # Need special treatment as cms.EDProducer is not a valid parameter type (except in this case)
327  myparams = dict()
328  for name, value in params.items():
329  if value is None:
330  continue
331  elif isinstance(value, dict):
332  myparams[name] = self.__dict__[name].clone(**value)
333  else: # value is an EDProducer
334  myparams[name] = value.clone()
335 
336  # Add the ones that were not customized
337  for name in self.parameterNames_():
338  if name not in params:
339  myparams[name] = self.__dict__[name].clone()
340  returnValue.__init__(**myparams)
341  returnValue._isModified = False
342  returnValue._isFrozen = False
343  saveOrigin(returnValue, 1)
344  return returnValue
345 
346  def dumpPython(self, options=PrintOptions()):
347  # Note that if anyone uses the generic SwitchProducer instead
348  # of a derived-one, the information on the functions for the
349  # producer decision is lost
350  specialImportRegistry.registerUse(self)
351  result = "%s(" % self.__class__.__name__ # not including cms. since the deriving classes are not in cms "namespace"
352  options.indent()
353  for resource in sorted(self.parameterNames_()):
354  result += "\n" + options.indentation() + resource + " = " + getattr(self, resource).dumpPython(options).rstrip() + ","
355  if result[-1] == ",":
356  result = result.rstrip(",")
357  options.unindent()
358  result += "\n)\n"
359  return result
360 
362  # XXX FIXME handle SwitchProducer dependencies
363  return []
364 
365  def nameInProcessDesc_(self, myname):
366  return myname
367  def moduleLabel_(self, myname):
368  return myname
369  def caseLabel_(self, name, case):
370  return name+"@"+case
371  def appendToProcessDescLists_(self, modules, aliases, myname):
372  # This way we can insert the chosen EDProducer to @all_modules
373  # so that we get easily a worker for it
374  modules.append(myname)
375  for case in self.parameterNames_():
376  if isinstance(self.__dict__[case], EDAlias):
377  aliases.append(self.caseLabel_(myname, case))
378  else:
379  modules.append(self.caseLabel_(myname, case))
380 
381  def insertInto(self, parameterSet, myname, accelerators):
382  for case in self.parameterNames_():
383  producer = self.__dict__[case]
384  producer.insertInto(parameterSet, self.caseLabel_(myname, case))
385  newpset = parameterSet.newPSet()
386  newpset.addString(True, "@module_label", self.moduleLabel_(myname))
387  newpset.addString(True, "@module_type", "SwitchProducer")
388  newpset.addString(True, "@module_edm_type", "EDProducer")
389  newpset.addVString(True, "@all_cases", [myname+"@"+p for p in self.parameterNames_()])
390  newpset.addString(False, "@chosen_case", myname+"@"+self._chooseCase(accelerators))
391  parameterSet.addPSet(True, self.nameInProcessDesc_(myname), newpset)
392 
393  def _placeImpl(self,name,proc):
394  proc._placeSwitchProducer(name,self)
395 # for case in self.parameterNames_():
396 # caseLabel = self.caseLabel_(name, case)
397 # caseObj = self.__dict__[case]
398 #
399 # if isinstance(caseObj, EDAlias):
400 # # EDAliases end up in @all_aliases automatically
401 # proc._placeAlias(caseLabel, caseObj)
402 # else:
403 # # Note that these don't end up in @all_modules
404 # # automatically because they're not part of any
405 # # Task/Sequence/Path
406 # proc._placeProducer(caseLabel, caseObj)
407 
408  def _clonesequence(self, lookuptable):
409  try:
410  return lookuptable[id(self)]
411  except:
412  raise ModuleCloneError(self._errorstr())
413  def _errorstr(self):
414  return "SwitchProducer"
415 
416 
417 if __name__ == "__main__":
418  import unittest
419  from .Types import *
420  from .SequenceTypes import *
421 
423  def __init__(self, **kargs):
424  super(SwitchProducerTest,self).__init__(
425  dict(
426  test1 = lambda accelerators: ("test1" in accelerators, -10),
427  test2 = lambda accelerators: ("test2" in accelerators, -9),
428  test3 = lambda accelerators: ("test3" in accelerators, -8)
429  ), **kargs)
431  def __init__(self, **kargs):
432  super(SwitchProducerPickleable,self).__init__(
433  dict(cpu = SwitchProducer.getCpu()), **kargs)
434 
435  class TestModules(unittest.TestCase):
436  def testEDAnalyzer(self):
437  empty = EDAnalyzer("Empty")
438  withParam = EDAnalyzer("Parameterized",foo=untracked(int32(1)), bar = untracked(string("it")))
439  self.assertEqual(withParam.foo.value(), 1)
440  self.assertEqual(withParam.bar.value(), "it")
441  aCopy = withParam.copy()
442  self.assertEqual(aCopy.foo.value(), 1)
443  self.assertEqual(aCopy.bar.value(), "it")
444  withType = EDAnalyzer("Test",type = int32(1))
445  self.assertEqual(withType.type.value(),1)
446  block = PSet(i = int32(9))
447  m = EDProducer("DumbProducer", block, j = int32(10))
448  self.assertEqual(9, m.i.value())
449  self.assertEqual(10, m.j.value())
450  def testESPrefer(self):
451  juicer = ESPrefer("JuiceProducer")
452  options = PrintOptions()
453  options.isCfg = True
454  self.assertEqual(juicer.dumpPythonAs("juicer", options), "process.prefer(\"JuiceProducer\")\n")
455  options.isCfg = False
456  self.assertEqual(juicer.dumpPythonAs("juicer", options), "es_prefer_JuiceProducer = cms.ESPrefer(\"JuiceProducer\")\n")
457 
458  juicer = ESPrefer("JuiceProducer","juicer")
459  options = PrintOptions()
460  options.isCfg = True
461  self.assertEqual(juicer.dumpPythonAs("juicer", options), 'process.prefer("juicer")\n')
462  options.isCfg = False
463  self.assertEqual(juicer.dumpPythonAs("juicer", options), 'es_prefer_juicer = cms.ESPrefer("JuiceProducer","juicer")\n')
464  juicer = ESPrefer("JuiceProducer",fooRcd=vstring())
465  self.assertEqual(juicer.dumpConfig(options),
466 """JuiceProducer {
467  vstring fooRcd = {
468  }
469 
470 }
471 """)
472  options = PrintOptions()
473  options.isCfg = True
474  self.assertEqual(juicer.dumpPythonAs("juicer"),
475 """process.prefer("JuiceProducer",
476  fooRcd = cms.vstring()
477 )
478 """)
479  options.isCfg = False
480  self.assertEqual(juicer.dumpPythonAs("juicer", options),
481 """es_prefer_JuiceProducer = cms.ESPrefer("JuiceProducer",
482  fooRcd = cms.vstring()
483 )
484 """)
485 
486  def testService(self):
487  empty = Service("Empty")
488  withParam = Service("Parameterized",foo=untracked(int32(1)), bar = untracked(string("it")))
489  self.assertEqual(withParam.foo.value(), 1)
490  self.assertEqual(withParam.bar.value(), "it")
491  self.assertEqual(empty.dumpPython(), "cms.Service(\"Empty\")\n")
492  self.assertEqual(withParam.dumpPython(), "cms.Service(\"Parameterized\",\n bar = cms.untracked.string(\'it\'),\n foo = cms.untracked.int32(1)\n)\n")
493  def testSequences(self):
494  m = EDProducer("MProducer")
495  n = EDProducer("NProducer")
496  m.setLabel("m")
497  n.setLabel("n")
498  s1 = Sequence(m*n)
499  options = PrintOptions()
500 
502  m = EDProducer("x")
503  self.assertTrue(m._isTaskComponent())
504  self.assertTrue(m.isLeaf())
505  m = SwitchProducerTest(test1=EDProducer("x"))
506  self.assertTrue(m._isTaskComponent())
507  self.assertTrue(m.isLeaf())
508  m = EDFilter("x")
509  self.assertTrue(m._isTaskComponent())
510  self.assertTrue(m.isLeaf())
511  m = OutputModule("x")
512  self.assertFalse(m._isTaskComponent())
513  self.assertTrue(m.isLeaf())
514  m = EDAnalyzer("x")
515  self.assertFalse(m._isTaskComponent())
516  self.assertTrue(m.isLeaf())
517  m = Service("x")
518  self.assertTrue(m._isTaskComponent())
519  self.assertTrue(m.isLeaf())
520  m = ESProducer("x")
521  self.assertTrue(m._isTaskComponent())
522  self.assertTrue(m.isLeaf())
523  m = ESSource("x")
524  self.assertTrue(m._isTaskComponent())
525  self.assertTrue(m.isLeaf())
526  m = Sequence()
527  self.assertFalse(m._isTaskComponent())
528  self.assertFalse(m.isLeaf())
529  m = Path()
530  self.assertFalse(m._isTaskComponent())
531  m = EndPath()
532  self.assertFalse(m._isTaskComponent())
533  m = Task()
534  self.assertTrue(m._isTaskComponent())
535  self.assertFalse(m.isLeaf())
536 
538  # Constructor
539  sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDProducer("Bar"))
540  self.assertEqual(sp.test1.type_(), "Foo")
541  self.assertEqual(sp.test2.type_(), "Bar")
542  self.assertRaises(ValueError, lambda: SwitchProducerTest(nonexistent = EDProducer("Foo")))
543  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = EDAnalyzer("Foo")))
544  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = EDFilter("Foo")))
545  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Source("Foo")))
546  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = OutputModule("Foo")))
547  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Looper("Foo")))
548  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Service("Foo")))
549  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESSource("Foo")))
550  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESProducer("Foo")))
551  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESPrefer("Foo")))
552  self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo"))))
553 
554  # Case decision
555  accelerators = ["test1", "test2", "test3"]
556  sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDProducer("Bar"))
557  self.assertEqual(sp._getProducer(["test1", "test2", "test3"]).type_(), "Bar")
558  self.assertEqual(sp._getProducer(["test2", "test3"]).type_(), "Bar")
559  self.assertEqual(sp._getProducer(["test1", "test3"]).type_(), "Foo")
560  sp = SwitchProducerTest(test1 = EDProducer("Bar"))
561  self.assertEqual(sp._getProducer(["test1", "test2", "test3"]).type_(), "Bar")
562  self.assertRaises(RuntimeError, sp._getProducer, ["test2", "test3"])
563 
564  # Mofications
565  from .Types import int32, string, PSet
566  sp = SwitchProducerTest(test1 = EDProducer("Foo",
567  a = int32(1),
568  b = PSet(c = int32(2))),
569  test2 = EDProducer("Bar",
570  aa = int32(11),
571  bb = PSet(cc = int32(12))))
572  # Simple clone
573  cl = sp.clone()
574  self.assertEqual(cl.test1.type_(), "Foo")
575  self.assertEqual(cl.test1.a.value(), 1)
576  self.assertEqual(cl.test1.b.c.value(), 2)
577  self.assertEqual(cl.test2.type_(), "Bar")
578  self.assertEqual(cl.test2.aa.value(), 11)
579  self.assertEqual(cl.test2.bb.cc.value(), 12)
580  self.assertEqual(sp._getProducer(accelerators).type_(), "Bar")
581  # Modify clone
582  cl.test1.a = 3
583  self.assertEqual(cl.test1.a.value(), 3)
584  cl.test1 = EDProducer("Fred")
585  self.assertEqual(cl.test1.type_(), "Fred")
586  def _assignEDAnalyzer():
587  cl.test1 = EDAnalyzer("Foo")
588  self.assertRaises(TypeError, _assignEDAnalyzer)
589  def _assignSwitchProducer():
590  cl.test1 = SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo")))
591  self.assertRaises(TypeError, _assignSwitchProducer)
592  # Modify values with a dict
593  cl = sp.clone(test1 = dict(a = 4, b = dict(c = None)),
594  test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo"))))
595  self.assertEqual(cl.test1.a.value(), 4)
596  self.assertEqual(cl.test1.b.hasParameter("c"), False)
597  self.assertEqual(cl.test2.aa.value(), 15)
598  self.assertEqual(cl.test2.bb.cc.value(), 45)
599  self.assertEqual(cl.test2.bb.dd.value(), "foo")
600  # Replace/add/remove EDProducers
601  cl = sp.clone(test1 = EDProducer("Fred", x = int32(42)),
602  test3 = EDProducer("Wilma", y = int32(24)),
603  test2 = None)
604  self.assertEqual(cl.test1.type_(), "Fred")
605  self.assertEqual(cl.test1.x.value(), 42)
606  self.assertEqual(cl.test3.type_(), "Wilma")
607  self.assertEqual(cl.test3.y.value(), 24)
608  self.assertEqual(hasattr(cl, "test2"), False)
609  self.assertRaises(TypeError, lambda: sp.clone(test1 = EDAnalyzer("Foo")))
610  self.assertRaises(TypeError, lambda: sp.clone(test1 = SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo")))))
611 
612  # Dump
613  sp = SwitchProducerTest(test2 = EDProducer("Foo",
614  a = int32(1),
615  b = PSet(c = int32(2))),
616  test1 = EDProducer("Bar",
617  aa = int32(11),
618  bb = PSet(cc = int32(12))))
619  self.assertEqual(sp.dumpPython(),
620 """SwitchProducerTest(
621  test1 = cms.EDProducer("Bar",
622  aa = cms.int32(11),
623  bb = cms.PSet(
624  cc = cms.int32(12)
625  )
626  ),
627  test2 = cms.EDProducer("Foo",
628  a = cms.int32(1),
629  b = cms.PSet(
630  c = cms.int32(2)
631  )
632  )
633 )
634 """)
635  # Pickle
636  import pickle
637  sp = SwitchProducerPickleable(cpu = EDProducer("Foo"))
638  pkl = pickle.dumps(sp)
639  unpkl = pickle.loads(pkl)
640  self.assertEqual(unpkl.cpu.type_(), "Foo")
641 
643  # Constructor
644  sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDAlias())
645  self.assertEqual(sp.test1.type_(), "Foo")
646  self.assertTrue(isinstance(sp.test2, EDAlias))
647 
648  # Modifications
649  from .Types import int32, string, PSet, VPSet
650  sp = SwitchProducerTest(test1 = EDProducer("Foo"),
651  test2 = EDAlias(foo = VPSet(PSet(type = string("Foo2")))))
652 
653  # Simple clone
654  cl = sp.clone()
655  self.assertTrue(hasattr(cl.test2, "foo"))
656  # Modify clone
657  cl.test2.foo[0].type = "Foo3"
658  self.assertEqual(cl.test2.foo[0].type, "Foo3")
659  # Modify values with a dict
660  cl = sp.clone(test2 = dict(foo = {0: dict(type = "Foo4")}))
661  self.assertEqual(cl.test2.foo[0].type, "Foo4")
662  # Replace or add EDAlias
663  cl = sp.clone(test1 = EDAlias(foo = VPSet(PSet(type = string("Foo5")))),
664  test3 = EDAlias(foo = VPSet(PSet(type = string("Foo6")))))
665  self.assertEqual(cl.test1.foo[0].type, "Foo5")
666  self.assertEqual(cl.test3.foo[0].type, "Foo6")
667  # Modify clone
668  cl.test1 = EDProducer("Xyzzy")
669  self.assertEqual(cl.test1.type_(), "Xyzzy")
670  cl.test1 = EDAlias(foo = VPSet(PSet(type = string("Foo7"))))
671  self.assertEqual(cl.test1.foo[0].type, "Foo7")
672 
673 
674  # Dump
675  from .Types import int32, string, PSet, VPSet
676  sp = SwitchProducerTest(test1 = EDProducer("Foo"),
677  test2 = EDAlias(foo = VPSet(PSet(type = string("Foo2")))))
678 
679  self.assertEqual(sp.dumpPython(),
680 """SwitchProducerTest(
681  test1 = cms.EDProducer("Foo"),
682  test2 = cms.EDAlias(
683  foo = cms.VPSet(cms.PSet(
684  type = cms.string('Foo2')
685  ))
686  )
687 )
688 """)
689 
690  # Pickle
691  import pickle
692  sp = SwitchProducerPickleable(cpu = EDAlias(foo = VPSet(PSet(type = string("Foo2")))))
693  pkl = pickle.dumps(sp)
694  unpkl = pickle.loads(pkl)
695  self.assertEqual(sp.cpu.foo[0].type, "Foo2")
696  unittest.main()
def _switch_cpu
Definition: Modules.py:217
def nameInProcessDesc_
Definition: Modules.py:45
tuple Path
Definition: mps_fire.py:298
uint16_t *__restrict__ id
def moduleLabel_
Definition: Modules.py:198
vector< string > vstring
Definition: ExoticaDQM.cc:8
def _isTaskComponent
Definition: Modules.py:176
def moduleLabel_
Definition: Modules.py:209
def _clonesequence
Definition: Modules.py:141
def nameInProcessDesc_
Definition: Modules.py:211
def _isTaskComponent
Definition: Modules.py:25
def _placeImpl
Definition: Modules.py:196
def setPrerequisites
Definition: Modules.py:151
def saveOrigin
Definition: Mixins.py:701
def _placeImpl
Definition: Modules.py:15
def _isTaskComponent
Definition: Modules.py:48
def dumpSequencePython
Definition: Modules.py:23
def testSwithProducerWithAlias
Definition: Modules.py:642
static std::string join(char **cmd)
Definition: RemoteFile.cc:19
def nameInProcessDesc_
Definition: Modules.py:65
def nameInProcessDesc_
Definition: Modules.py:101
def moduleLabel_
Definition: Modules.py:40
#define str(s)
def insertInto
Definition: Modules.py:18
tuple untracked
Definition: Types.py:34
def _placeImpl
Definition: Modules.py:207
def nameInProcessDesc_
Definition: Modules.py:200
def _isTaskComponent
Definition: Modules.py:68