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
10 from .ExceptionHandling
import *
11 class Service(_ConfigureComponent,_TypedParameterizable,_Unlabelable):
13 super(Service,self).
__init__(type_,*arg,**kargs)
17 proc._placeService(self.type_(),self)
19 newpset = processDesc.newPSet()
20 newpset.addString(
True,
"@service_type", self.type_())
21 self.insertContentsInto(newpset)
22 processDesc.addService(newpset)
24 return "process." + self.type_()
30 return str(self.type_())
32 class ESSource(_ConfigureComponent,_TypedParameterizable,_Unlabelable,_Labelable):
34 super(ESSource,self).
__init__(type_,*arg,**kargs)
39 proc._placeESSource(name,self)
42 if self.type_() == myname:
53 class ESProducer(_ConfigureComponent,_TypedParameterizable,_Unlabelable,_Labelable):
55 super(ESProducer,self).
__init__(type_,*arg,**kargs)
59 proc._placeESProducer(name,self)
62 if self.type_() == myname:
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.
81 #prefer all data in record 'OrangeRecord' from 'juicer'
82 ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring())
84 #prefer only "Orange" data in "OrangeRecord" from "juicer"
85 ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("ExtraPulp"))
87 #prefer only "Orange" data with label "ExtraPulp" in "OrangeRecord" from "juicer"
88 ESPrefer("ESJuicerProd", OrangeRecord=cms.vstring("Orange/ExtraPulp"))
90 def __init__(self,type_,targetLabel='',*arg,**kargs):
91 super(ESPrefer,self).
__init__(type_,*arg,**kargs)
93 if targetLabel
is None:
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)))
100 proc._placeESPrefer(name,self)
103 return "esprefer_" + self.type_() +
"@" + self.
_targetLabel
105 returnValue = ESPrefer.__new__(type(self))
113 result = options.indentation()
116 basename = self.type_()
119 result +=
'process.prefer("'+basename+
'"'
120 if self.parameterNames_():
121 result +=
",\n"+_Parameterizable.dumpPython(self,options)+options.indentation()
125 result +=
'es_prefer_'+basename+
' = cms.ESPrefer("'+self.type_()+
'"'
128 if self.parameterNames_():
129 result +=
",\n"+_Parameterizable.dumpPython(self,options)+options.indentation()
133 class _Module(_ConfigureComponent,_TypedParameterizable,_Labelable,_SequenceLeaf):
134 """base class for classes which denote framework event based 'modules'"""
137 super(_Module,self).
__init__(type_,*arg,**kargs)
138 if _Module.__isStrict__:
143 return lookuptable[
id(self)]
149 return "%s('%s', ...)" %(typename, self.type_())
152 self.__dict__[
"libraries_"] = libs
155 if "libraries_" in self.__dict__:
156 from ctypes
import LibraryLoader, CDLL
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)
165 super(EDProducer,self).
__init__(type_,*arg,**kargs)
167 proc._placeProducer(name,self)
173 super(EDFilter,self).
__init__(type_,*arg,**kargs)
175 proc._placeFilter(name,self)
181 super(EDAnalyzer,self).
__init__(type_,*arg,**kargs)
183 proc._placeAnalyzer(name,self)
188 super(OutputModule,self).
__init__(type_,*arg,**kargs)
190 proc._placeOutputModule(name,self)
193 class Source(_ConfigureComponent,_TypedParameterizable):
195 super(Source,self).
__init__(type_,*arg,**kargs)
197 proc._placeSource(name,self)
204 class Looper(_ConfigureComponent,_TypedParameterizable):
206 super(Looper,self).
__init__(type_,*arg,**kargs)
208 proc._placeLooper(name,self)
210 return "@main_looper"
212 return "@main_looper"
221 """This purpose class is to provide a switch of EDProducers for a single module/product label.
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:
227 class SwitchProducerFoo(SwitchProducer):
228 def __init__(self, **kargs):
229 super(SwitchProducerFoo,self).__init__(
230 dict(case1 = case1Func, case2 = case2Func),
234 foo = SwitchProducerFoo(
235 case1 = EDProducer("Producer1"),
236 case2 = EDProducer("Producer2")
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.
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
250 super(SwitchProducer,self).
__init__(
None)
257 """Returns a function that returns the priority for a CPU "computing device". Intended to be used by deriving classes."""
261 """Returns the name of the chosen case."""
262 cases = self.parameterNames_()
266 if enabled
and (bestCase
is None or bestCase[0] < priority):
267 bestCase = (priority, case)
269 raise RuntimeError(
"All cases '%s' were disabled" % (
str(cases)))
273 """Returns the EDroducer of the chosen case"""
274 return self.__dict__[self.
_chooseCase(accelerators)]
278 return (isinstance(typ, EDProducer)
and not isinstance(typ, SwitchProducer))
or isinstance(typ, EDAlias)
282 raise TypeError(name+
" does not already exist, so it can only be set to a cms.EDProducer or cms.EDAlias")
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"
289 raise ValueError(message)
290 self.__dict__[name]=value
291 self._Parameterizable__parameterNames.append(name)
295 for name, value
in parameters.items():
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"
309 raise ValueError(message)
312 super(SwitchProducer, self).
__setattr__(name,value)
313 elif not name
in self.__dict__:
318 raise TypeError(name+
" can only be set to a cms.EDProducer or cms.EDAlias")
320 self.__dict__[name] = value
324 returnValue = SwitchProducer.__new__(type(self))
328 for name, value
in params.items():
331 elif isinstance(value, dict):
332 myparams[name] = self.__dict__[name].
clone(**value)
334 myparams[name] = value.clone()
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
350 specialImportRegistry.registerUse(self)
351 result =
"%s(" % self.__class__.__name__
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(
",")
374 modules.append(myname)
375 for case
in self.parameterNames_():
376 if isinstance(self.__dict__[case], EDAlias):
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))
394 proc._placeSwitchProducer(name,self)
410 return lookuptable[
id(self)]
414 return "SwitchProducer"
417 if __name__ ==
"__main__":
420 from .SequenceTypes
import *
424 super(SwitchProducerTest,self).
__init__(
426 test1 =
lambda accelerators: (
"test1" in accelerators, -10),
427 test2 =
lambda accelerators: (
"test2" in accelerators, -9),
428 test3 =
lambda accelerators: (
"test3" in accelerators, -8)
432 super(SwitchProducerPickleable,self).
__init__(
433 dict(cpu = SwitchProducer.getCpu()), **kargs)
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")
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())
452 options = PrintOptions()
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")
458 juicer =
ESPrefer(
"JuiceProducer",
"juicer")
459 options = PrintOptions()
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')
465 self.assertEqual(juicer.dumpConfig(options),
472 options = PrintOptions()
474 self.assertEqual(juicer.dumpPythonAs(
"juicer"),
475 """process.prefer("JuiceProducer",
476 fooRcd = cms.vstring()
479 options.isCfg =
False
480 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
481 """es_prefer_JuiceProducer = cms.ESPrefer("JuiceProducer",
482 fooRcd = cms.vstring()
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")
499 options = PrintOptions()
503 self.assertTrue(m._isTaskComponent())
504 self.assertTrue(m.isLeaf())
506 self.assertTrue(m._isTaskComponent())
507 self.assertTrue(m.isLeaf())
509 self.assertTrue(m._isTaskComponent())
510 self.assertTrue(m.isLeaf())
512 self.assertFalse(m._isTaskComponent())
513 self.assertTrue(m.isLeaf())
515 self.assertFalse(m._isTaskComponent())
516 self.assertTrue(m.isLeaf())
518 self.assertTrue(m._isTaskComponent())
519 self.assertTrue(m.isLeaf())
521 self.assertTrue(m._isTaskComponent())
522 self.assertTrue(m.isLeaf())
524 self.assertTrue(m._isTaskComponent())
525 self.assertTrue(m.isLeaf())
527 self.assertFalse(m._isTaskComponent())
528 self.assertFalse(m.isLeaf())
530 self.assertFalse(m._isTaskComponent())
532 self.assertFalse(m._isTaskComponent())
534 self.assertTrue(m._isTaskComponent())
535 self.assertFalse(m.isLeaf())
540 self.assertEqual(sp.test1.type_(),
"Foo")
541 self.assertEqual(sp.test2.type_(),
"Bar")
555 accelerators = [
"test1",
"test2",
"test3"]
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")
561 self.assertEqual(sp._getProducer([
"test1",
"test2",
"test3"]).type_(),
"Bar")
562 self.assertRaises(RuntimeError, sp._getProducer, [
"test2",
"test3"])
565 from .Types
import int32, string, PSet
568 b = PSet(c = int32(2))),
571 bb = PSet(cc = int32(12))))
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")
583 self.assertEqual(cl.test1.a.value(), 3)
585 self.assertEqual(cl.test1.type_(),
"Fred")
586 def _assignEDAnalyzer():
588 self.assertRaises(TypeError, _assignEDAnalyzer)
589 def _assignSwitchProducer():
591 self.assertRaises(TypeError, _assignSwitchProducer)
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")
601 cl = sp.clone(test1 =
EDProducer(
"Fred", x = int32(42)),
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")))
615 b = PSet(c = int32(2))),
618 bb = PSet(cc = int32(12))))
619 self.assertEqual(sp.dumpPython(),
620 """SwitchProducerTest(
621 test1 = cms.EDProducer("Bar",
627 test2 = cms.EDProducer("Foo",
638 pkl = pickle.dumps(sp)
639 unpkl = pickle.loads(pkl)
640 self.assertEqual(unpkl.cpu.type_(),
"Foo")
645 self.assertEqual(sp.test1.type_(),
"Foo")
646 self.assertTrue(isinstance(sp.test2, EDAlias))
649 from .Types
import int32, string, PSet, VPSet
651 test2 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo2")))))
655 self.assertTrue(hasattr(cl.test2,
"foo"))
657 cl.test2.foo[0].type =
"Foo3"
658 self.assertEqual(cl.test2.foo[0].type,
"Foo3")
660 cl = sp.clone(test2 = dict(foo = {0: dict(type =
"Foo4")}))
661 self.assertEqual(cl.test2.foo[0].type,
"Foo4")
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")
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")
675 from .Types
import int32, string, PSet, VPSet
677 test2 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo2")))))
679 self.assertEqual(sp.dumpPython(),
680 """SwitchProducerTest(
681 test1 = cms.EDProducer("Foo"),
683 foo = cms.VPSet(cms.PSet(
684 type = cms.string('Foo2')
693 pkl = pickle.dumps(sp)
694 unpkl = pickle.loads(pkl)
695 self.assertEqual(sp.cpu.foo[0].type,
"Foo2")
uint16_t *__restrict__ id
def testSwithProducerWithAlias
static std::string join(char **cmd)
def appendToProcessDescLists_