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"""
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())
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: (
True, -10),
427 test2 =
lambda: (
True, -9),
428 test3 =
lambda: (
True, -8)
432 super(SwitchProducerTest1Dis,self).
__init__(
434 test1 =
lambda: (
False, -10),
435 test2 =
lambda: (
True, -9)
439 super(SwitchProducerTest2Dis,self).
__init__(
441 test1 =
lambda: (
True, -10),
442 test2 =
lambda: (
False, -9)
446 super(SwitchProducerPickleable,self).
__init__(
447 dict(cpu = SwitchProducer.getCpu()), **kargs)
453 self.assertEqual(withParam.foo.value(), 1)
454 self.assertEqual(withParam.bar.value(),
"it")
455 aCopy = withParam.copy()
456 self.assertEqual(aCopy.foo.value(), 1)
457 self.assertEqual(aCopy.bar.value(),
"it")
459 self.assertEqual(withType.type.value(),1)
460 block = PSet(i = int32(9))
461 m =
EDProducer(
"DumbProducer", block, j = int32(10))
462 self.assertEqual(9, m.i.value())
463 self.assertEqual(10, m.j.value())
466 options = PrintOptions()
468 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
"process.prefer(\"JuiceProducer\")\n")
469 options.isCfg =
False
470 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
"es_prefer_JuiceProducer = cms.ESPrefer(\"JuiceProducer\")\n")
472 juicer =
ESPrefer(
"JuiceProducer",
"juicer")
473 options = PrintOptions()
475 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
'process.prefer("juicer")\n')
476 options.isCfg =
False
477 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
'es_prefer_juicer = cms.ESPrefer("JuiceProducer","juicer")\n')
479 self.assertEqual(juicer.dumpConfig(options),
486 options = PrintOptions()
488 self.assertEqual(juicer.dumpPythonAs(
"juicer"),
489 """process.prefer("JuiceProducer",
490 fooRcd = cms.vstring()
493 options.isCfg =
False
494 self.assertEqual(juicer.dumpPythonAs(
"juicer", options),
495 """es_prefer_JuiceProducer = cms.ESPrefer("JuiceProducer",
496 fooRcd = cms.vstring()
503 self.assertEqual(withParam.foo.value(), 1)
504 self.assertEqual(withParam.bar.value(),
"it")
505 self.assertEqual(empty.dumpPython(),
"cms.Service(\"Empty\")\n")
506 self.assertEqual(withParam.dumpPython(),
"cms.Service(\"Parameterized\",\n bar = cms.untracked.string(\'it\'),\n foo = cms.untracked.int32(1)\n)\n")
513 options = PrintOptions()
517 self.assertTrue(m._isTaskComponent())
518 self.assertTrue(m.isLeaf())
520 self.assertTrue(m._isTaskComponent())
521 self.assertTrue(m.isLeaf())
523 self.assertTrue(m._isTaskComponent())
524 self.assertTrue(m.isLeaf())
526 self.assertFalse(m._isTaskComponent())
527 self.assertTrue(m.isLeaf())
529 self.assertFalse(m._isTaskComponent())
530 self.assertTrue(m.isLeaf())
532 self.assertTrue(m._isTaskComponent())
533 self.assertTrue(m.isLeaf())
535 self.assertTrue(m._isTaskComponent())
536 self.assertTrue(m.isLeaf())
538 self.assertTrue(m._isTaskComponent())
539 self.assertTrue(m.isLeaf())
541 self.assertFalse(m._isTaskComponent())
542 self.assertFalse(m.isLeaf())
544 self.assertFalse(m._isTaskComponent())
546 self.assertFalse(m._isTaskComponent())
548 self.assertTrue(m._isTaskComponent())
549 self.assertFalse(m.isLeaf())
554 self.assertEqual(sp.test1.type_(),
"Foo")
555 self.assertEqual(sp.test2.type_(),
"Bar")
570 self.assertEqual(sp._getProducer().type_(),
"Bar")
572 self.assertEqual(sp._getProducer().type_(),
"Bar")
574 self.assertEqual(sp._getProducer().type_(),
"Foo")
576 self.assertEqual(sp._getProducer().type_(),
"Bar")
578 self.assertRaises(RuntimeError, sp._getProducer)
581 from .Types
import int32, string, PSet
584 b = PSet(c = int32(2))),
587 bb = PSet(cc = int32(12))))
590 self.assertEqual(cl.test1.type_(),
"Foo")
591 self.assertEqual(cl.test1.a.value(), 1)
592 self.assertEqual(cl.test1.b.c.value(), 2)
593 self.assertEqual(cl.test2.type_(),
"Bar")
594 self.assertEqual(cl.test2.aa.value(), 11)
595 self.assertEqual(cl.test2.bb.cc.value(), 12)
596 self.assertEqual(sp._getProducer().type_(),
"Bar")
599 self.assertEqual(cl.test1.a.value(), 3)
601 self.assertEqual(cl.test1.type_(),
"Fred")
602 def _assignEDAnalyzer():
604 self.assertRaises(TypeError, _assignEDAnalyzer)
605 def _assignSwitchProducer():
607 self.assertRaises(TypeError, _assignSwitchProducer)
609 cl = sp.clone(test1 = dict(a = 4, b = dict(c =
None)),
610 test2 = dict(aa = 15, bb = dict(cc = 45, dd =
string(
"foo"))))
611 self.assertEqual(cl.test1.a.value(), 4)
612 self.assertEqual(cl.test1.b.hasParameter(
"c"),
False)
613 self.assertEqual(cl.test2.aa.value(), 15)
614 self.assertEqual(cl.test2.bb.cc.value(), 45)
615 self.assertEqual(cl.test2.bb.dd.value(),
"foo")
617 cl = sp.clone(test1 =
EDProducer(
"Fred", x = int32(42)),
620 self.assertEqual(cl.test1.type_(),
"Fred")
621 self.assertEqual(cl.test1.x.value(), 42)
622 self.assertEqual(cl.test3.type_(),
"Wilma")
623 self.assertEqual(cl.test3.y.value(), 24)
624 self.assertEqual(hasattr(cl,
"test2"),
False)
625 self.assertRaises(TypeError,
lambda: sp.clone(test1 =
EDAnalyzer(
"Foo")))
631 b = PSet(c = int32(2))),
634 bb = PSet(cc = int32(12))))
635 self.assertEqual(sp.dumpPython(),
636 """SwitchProducerTest(
637 test1 = cms.EDProducer("Bar",
643 test2 = cms.EDProducer("Foo",
654 pkl = pickle.dumps(sp)
655 unpkl = pickle.loads(pkl)
656 self.assertEqual(unpkl.cpu.type_(),
"Foo")
661 self.assertEqual(sp.test1.type_(),
"Foo")
662 self.assertTrue(isinstance(sp.test2, EDAlias))
665 from .Types
import int32, string, PSet, VPSet
667 test2 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo2")))))
671 self.assertTrue(hasattr(cl.test2,
"foo"))
673 cl.test2.foo[0].type =
"Foo3"
674 self.assertEqual(cl.test2.foo[0].type,
"Foo3")
676 cl = sp.clone(test2 = dict(foo = {0: dict(type =
"Foo4")}))
677 self.assertEqual(cl.test2.foo[0].type,
"Foo4")
679 cl = sp.clone(test1 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo5")))),
680 test3 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo6")))))
681 self.assertEqual(cl.test1.foo[0].type,
"Foo5")
682 self.assertEqual(cl.test3.foo[0].type,
"Foo6")
685 self.assertEqual(cl.test1.type_(),
"Xyzzy")
686 cl.test1 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo7"))))
687 self.assertEqual(cl.test1.foo[0].type,
"Foo7")
691 from .Types
import int32, string, PSet, VPSet
693 test2 = EDAlias(foo =
VPSet(PSet(type =
string(
"Foo2")))))
695 self.assertEqual(sp.dumpPython(),
696 """SwitchProducerTest(
697 test1 = cms.EDProducer("Foo"),
699 foo = cms.VPSet(cms.PSet(
700 type = cms.string('Foo2')
709 pkl = pickle.dumps(sp)
710 unpkl = pickle.loads(pkl)
711 self.assertEqual(sp.cpu.foo[0].type,
"Foo2")
uint16_t *__restrict__ id
def testSwithProducerWithAlias
static std::string join(char **cmd)
def appendToProcessDescLists_