1 from __future__
import print_function
2 from builtins
import range
3 from copy
import deepcopy
7 ACTIVATE_INSPECTION=
True 12 if not ACTIVATE_INSPECTION:
13 return [(
"unknown",
"unknown",
"unknown")]
14 stack = inspect.stack()
15 while len(stack)>=1
and len(stack[0])>=2
and (
'FWCore/ParameterSet' in stack[0][1]
or 'FWCore/GuiBrowsers' in stack[0][1]):
17 if len(stack)>=1
and len(stack[0])>=3:
20 return [(
"unknown",
"unknown",
"unknown")]
24 import FWCore.ParameterSet.DictTypes
as typ
27 return self.__class__(self)
28 typ.SortedKeysDict.__copy__ = new_SortedKeysDict__copy__
31 from copy
import deepcopy
34 d = memo.get(
id(self),
None)
37 memo[
id(self)] = d = self.__class__()
38 d.__init__(deepcopy(self.items(), memo))
40 typ.SortedKeysDict.__deepcopy__ = new_SortedKeysDict__deepcopy__
44 import FWCore.ParameterSet.Config
as cms
47 self.old___init__(*l,**k)
48 self.__dict__[
'_Process__history'] = []
49 self.__dict__[
'_Process__enableRecording'] = 0
50 self.__dict__[
'_Process__modifiedobjects'] = []
51 self.__dict__[
'_Process__modifiedcheckpoint'] =
None 52 self.__dict__[
'_Process__modifications'] = []
53 cms.Process.old___init__=cms.Process.__init__
54 cms.Process.__init__=new___init__
57 return self.__dict__[
'_Process__modifiedobjects']
58 cms.Process.modifiedObjects=new_modifiedObjects
61 self.__dict__[
'_Process__modifiedobjects'] = []
62 cms.Process.resetModifiedObjects=new_resetModifiedObjects
65 self.old__place(name, mod, d)
66 if self._okToPlace(name, mod, d):
67 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
68 cms.Process.old__place=cms.Process._place
69 cms.Process._place=new__place
72 self.old__placeSource(name, mod)
73 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
74 cms.Process.old__placeSource=cms.Process._placeSource
75 cms.Process._placeSource=new__placeSource
78 self.old__placeLooper(name, mod)
79 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
80 cms.Process.old__placeLooper=cms.Process._placeLooper
81 cms.Process._placeLooper=new__placeLooper
84 self.old__placeService(typeName, mod)
85 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
86 cms.Process.old__placeService=cms.Process._placeService
87 cms.Process._placeService=new__placeService
90 self.old_setSchedule_(sch)
91 self.__dict__[
'_Process__modifiedobjects'].
append(sch)
92 cms.Process.old_setSchedule_=cms.Process.setSchedule_
93 cms.Process.setSchedule_=new_setSchedule_
96 self.old_setLooper_(lpr)
97 self.__dict__[
'_Process__modifiedobjects'].
append(lpr)
98 cms.Process.old_setLooper_=cms.Process.setLooper_
99 cms.Process.setLooper_=new_setLooper_
102 return self.__dict__[
'_Process__history']+self.dumpModificationsWithObjects(removeDuplicates)
103 cms.Process.history=new_history
106 self.__dict__[
'_Process__history'] = []
108 self.resetModifiedObjects()
109 cms.Process.resetHistory=new_resetHistory
113 for item,objects
in self.history():
114 if isinstance(item,(str,unicode)):
115 dumpHistory.append(item +
"\n")
118 dump=item.dumpPython()
119 if isinstance(dump,tuple):
120 if withImports
and dump[0]
not in dumpHistory:
121 dumpHistory.append(dump[0])
122 dumpHistory.append(dump[1] +
"\n")
124 dumpHistory.append(dump +
"\n")
126 return ''.
join(dumpHistory)
127 cms.Process.dumpHistory=new_dumpHistory
130 if self.__dict__[
'_Process__enableRecording'] == 0:
131 modifiedObjects=self.modifiedObjects()
132 for m,o
in self.dumpModificationsWithObjects():
134 self.__dict__[
'_Process__history'].
append((tool,modifiedObjects))
136 self.resetModifiedObjects()
137 cms.Process.addAction=new_addAction
140 del self.__dict__[
'_Process__history'][i]
141 cms.Process.deleteAction=new_deleteAction
144 if self.__dict__[
'_Process__enableRecording'] == 0:
146 self.__dict__[
'_Process__history']+=self.dumpModificationsWithObjects()
148 self.resetModifiedObjects()
149 self.__dict__[
'_Process__enableRecording'] += 1
150 cms.Process.disableRecording=new_disableRecording
153 self.__dict__[
'_Process__enableRecording'] -= 1
154 cms.Process.enableRecording=new_enableRecording
157 return self.__dict__[
'_Process__enableRecording']==0
158 cms.Process.checkRecording=new_checkRecording
162 This catches modifications that occur during process.load, 163 and only records a modification if there was an existing object 164 and the version after __setattr__ has a different id(). 165 This does not mean that the object is different, only redefined. 166 We still really need a recursive-comparison function for parameterizeable 167 objects to determine if a real change has been made. 171 if not name.startswith(
'_Process__'):
172 existing = hasattr(self, name)
174 old = getattr(self, name)
175 self.old__setattr__(name, value)
177 if id(getattr(self, name)) !=
id(old):
179 self.__dict__[
'_Process__modifications'] += [{
'name': name,
180 'old': deepcopy(old),
181 'new': deepcopy(getattr(self, name)),
182 'file':stack[0][1],
'line':stack[0][2],
183 'action':
'replace'}]
184 cms.Process.old__setattr__ = cms.Process.__setattr__
185 cms.Process.__setattr__ = new_setattr
189 Empty all the _modifications lists for 190 all objects beneath this one. 193 if isinstance(o, cms._ModuleSequenceType):
195 if isinstance(o, cms._Parameterizable):
197 for key
in o.parameterNames_():
198 value = getattr(o,key)
199 self.recurseResetModified_(value)
200 if isinstance(o, cms._ValidatingListBase):
201 for index,item
in enumerate(o):
202 self.recurseResetModified_(item)
203 cms.Process.recurseResetModified_=new_recurseResetModified_
207 Recursively return a standardised list of modifications 208 from the object hierarchy. 211 if isinstance(o, cms._ModuleSequenceType):
213 for mod
in o._modifications:
214 modifications.append({
'name':name,
215 'action':mod[
'action'],
220 'dump': o.dumpPython({}),
223 if isinstance(o, cms._Parameterizable):
224 for mod
in o._modifications:
225 paramname = mod[
'name']
226 if hasattr(o, paramname):
227 paramvalue = getattr(o, paramname)
230 if isinstance(paramvalue,cms._ParameterTypeBase):
231 dump = paramvalue.dumpPython()
234 modifications.append({
'name':
'%s.%s' %(name, paramname),
239 'action': mod[
'action'],
244 for key
in o.parameterNames_():
245 value = getattr(o,key)
246 modifications += self.recurseDumpModifications_(
"%s.%s" % (name, key), value)
248 if isinstance(o, cms._ValidatingListBase):
249 for index, item
in enumerate(o):
250 modifications += self.recurseDumpModifications_(
"%s[%s]" % (name, index), item)
251 if isinstance(o, cms.Process):
252 for mod
in o.__dict__[
'_Process__modifications']:
253 if hasattr(o, mod[
'name'])
and hasattr(getattr(o, mod[
'name']),
'dumpPython'):
257 modifications.append({
'name': mod[
'name'],
258 'action': mod[
'action'],
266 cms.Process.recurseDumpModifications_=new_recurseDumpModifications_
270 Set a checkpoint, ie get the current list of all known 271 top-level names and store them. Later, when we print out 272 modifications we ignore any modifications that do not affect 273 something in this list. 275 There is currently no way of clearing this, but I think this 276 is generally a use-once feature. 278 existing_names = set()
279 for item
in self.items_():
280 existing_names.add(item[0])
281 self.__dict__[
'_Process__modifiedcheckpoint'] =
list(existing_names)
282 cms.Process.modificationCheckpoint=new_modificationCheckpoint
286 Empty out all the modification lists, so we only see changes that 287 happen from now onwards. 289 self.__dict__[
'_Process__modified'] = []
290 for name, o
in self.items_():
291 self.recurseResetModified_(o)
292 cms.Process.resetModified=new_resetModified
294 def new_dumpModifications(self, comments=True, process=True, module=False, sequence=True, value=True, sort=True, group=True):
296 Return some text describing all the modifications that have been made. 298 * comments: print out comments describing the file and line which triggered 299 the modification, if determined. 300 * process: print "process." in front of every name 301 * module: only print out one entry per top-level module that has been 302 changed, rather than the details 303 * sequence: include changes to sequences 304 * value: print out the latest value of each name 305 * sort: whether to sort all the names before printing (otherwise they're in 306 more-or-less time order, within each category) 308 modifications = self.recurseDumpModifications_(
'', self)
310 for name, o
in self.items_():
311 modifications += self.recurseDumpModifications_(name, o)
313 modifications = [x
for x
in modifications
if not x[
'type'] ==
'seq']
314 checkpoint = self.__dict__[
'_Process__modifiedcheckpoint']
315 if not checkpoint ==
None:
316 modifications = [x
for x
in modifications
if any([x[
'name'].startswith(check)
for check
in checkpoint])]
320 modules =
list(set([m[
'name'].
split(
'.')[0]
for m
in modifications]))
322 modules = sorted(modules)
324 text = [
'process.%s' % m
for m
in modules]
329 modifications = sorted(modifications, key=
lambda x: x[
'name'])
330 for i, m
in enumerate(modifications):
333 if m[
'action'] ==
'replace':
334 t +=
'# %(file)s:%(line)s replace %(old)s->%(new)s\n' % m
335 elif m[
'action'] ==
'remove':
336 t +=
'# %(file)s:%(line)s remove %(old)s\n' % m
337 elif m[
'action'] ==
'append':
338 t +=
'# %(file)s:%(line)s append %(new)s\n' % m
339 if not group
or i==len(modifications)-1
or not modifications[i+1][
'name'] == m[
'name']:
340 if process
and value:
341 t +=
'process.%s = %s' % (m[
'name'], m[
'dump'])
343 t +=
'%s = %s' % (m[
'name'], m[
'dump'])
345 t +=
'process.%s' % (m[
'name'])
347 t +=
'%s' % (m[
'name'])
349 return '\n'.
join(text)+
'\n' 350 cms.Process.dumpModifications=new_dumpModifications
355 for name, o
in self.items_():
356 for m
in self.recurseDumpModifications_(name, o):
358 if removeDuplicates
and last_modification==m[
'name']:
360 last_modification=m[
'name']
362 text =
'process.%s = %s' % (m[
'name'], m[
'dump'])
363 modifications += [(text,[o])]
365 cms.Process.dumpModificationsWithObjects=new_dumpModificationsWithObjects
369 items += self.producers.items()
370 items += self.filters.items()
371 items += self.analyzers.items()
373 cms.Process.moduleItems_=new_moduleItems_
378 items += [(
"source", self.source)]
380 items += [(
"looper", self.looper)]
381 items += self.moduleItems_()
382 items += self.outputModules.items()
383 items += self.sequences.items()
384 items += six.iteritems(self.paths)
385 items += self.endpaths.items()
386 items += self.services.items()
387 items += self.es_producers.items()
388 items += self.es_sources.items()
389 items += self.es_prefers.items()
390 items += self.psets.items()
391 items += self.vpsets.items()
393 items += [(
"schedule", self.schedule)]
395 cms.Process.items_=new_items_
400 self.__dict__[
'_modifications'] = []
401 self.old__init__(*a,**k)
402 self._modifications = []
403 cms._Parameterizable.old__init__ = cms._Parameterizable.__init__
404 cms._Parameterizable.__init__ = new_Parameterizable_init
407 self.old__addParameter(name,value)
409 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':
None,
'new':deepcopy(value),
'action':
'add'})
410 cms._Parameterizable.old__addParameter = cms._Parameterizable._Parameterizable__addParameter
411 cms._Parameterizable._Parameterizable__addParameter = new_Parameterizable_addParameter
414 if (
not self.isFrozen())
and (
not name.startswith(
'_'))
and (name
in self.__dict__):
416 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':deepcopy(self.__dict__[name]),
'new':deepcopy(value),
'action':
'replace'})
417 self._isModified =
True 418 self.old__setattr__(name,value)
419 cms._Parameterizable.old__setattr__ = cms._Parameterizable.__setattr__
420 cms._Parameterizable.__setattr__ = new_Parameterizable_setattr
423 if not self.isFrozen():
425 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':deepcopy(self.__dict__[name]),
'new':
None,
'action':
'delete'})
426 self.old__delattr__(name)
427 cms._Parameterizable.old__delattr__ = cms._Parameterizable.__delattr__
428 cms._Parameterizable.__delattr__ = new_Parameterizeable_delattr
432 self._isModified=
False 433 self._modifications = []
434 for name
in self.parameterNames_():
435 param = self.__dict__[name]
436 if isinstance(param, cms._Parameterizable):
437 param.resetModified()
438 cms._Parameterizable.resetModified = new_Parameterizable_resetModified
441 self._isModified=
False 442 self._modifications = []
443 cms._ParameterTypeBase.resetModified = new_ParameterTypeBase_resetModified
449 cms._Sequenceable._name_ = new__Sequenceable_name
455 def new__SequenceOperator_name(self):
456 return str(self._left._name_())+
str(self._pySymbol)+
str(self._right._name_())
457 _SequenceOperator._name_ = new__SequenceOperator_name
465 SequencePlaceholder._name_ = new__SequencePlaceholder_name
469 return '~'+
str(self._operand._name_())
472 _SequenceNegation._name_ = new__SequenceNegation_name
476 return '-'+
str(self._operand._name_())
479 _SequenceIgnore._name_ = new__SequenceIgnore_name
483 return '('+
str(self._seq._name_())+
')' 486 cms.Sequence._name_ = new_Sequence_name
489 if hasattr(self,
'_Labelable__label'):
490 return getattr(self,
'_Labelable__label')
491 elif hasattr(self,
'_TypedParameterizable__type'):
492 return 'unnamed(%s)'%getattr(self,
'_TypedParameterizable__type')
493 return type(self).__name__
494 cms._Module._name_ = new__Module_name
497 self._modifications = []
498 self.old__init__(*arg,**argv)
499 cms._ModuleSequenceType.old__init__ = cms._ModuleSequenceType.__init__
500 cms._ModuleSequenceType.__init__ = new__ModuleSequenceType__init__
503 self._isModified=
False 504 self._modifications = []
505 cms._ModuleSequenceType.resetModified = new__ModuleSequenceType_resetModified
508 return self._isModified
509 cms._ModuleSequenceType.isModified = new__ModuleSequenceType_isModified
512 returnValue = cms._ModuleSequenceType.__new__(type(self))
513 returnValue.__init__(self._seq)
514 returnValue._isModified = self._isModified
515 returnValue._modifications = deepcopy(self._modifications)
517 cms._ModuleSequenceType.copy = new__ModuleSequenceType_copy
521 self._isModified=
True 522 if replacement
is None:
523 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'replace',
'old':original._name_(),
'new':
None})
525 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'replace',
'old':original._name_(),
'new':replacement._name_()})
526 return self.old_replace(original, replacement)
527 cms._ModuleSequenceType.old_replace = cms._ModuleSequenceType.replace
528 cms._ModuleSequenceType.replace = new__ModuleSequenceType_replace
532 self._isModified=
True 533 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'remove',
'old':original._name_(),
'new':
None})
534 return self.old_remove(original)
535 cms._ModuleSequenceType.old_remove = cms._ModuleSequenceType.remove
536 cms._ModuleSequenceType.remove = new__ModuleSequenceType_remove
540 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
541 self._isModified=
True 542 return self.old__iadd__(other)
543 cms._ModuleSequenceType.old__imul__ = cms._ModuleSequenceType.__imul__
544 cms._ModuleSequenceType.__imul__ = new__ModuleSequenceType__imul__
548 self._isModified=
True 549 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
550 return self.old__iadd__(other)
551 cms._ModuleSequenceType.old__iadd__ = cms._ModuleSequenceType.__iadd__
552 cms._ModuleSequenceType.__iadd__ = new__ModuleSequenceType__iadd__
554 from FWCore.ParameterSet.Modules
import Source
555 from FWCore.GuiBrowsers.editorTools
import changeSource
557 if __name__==
'__main__':
563 ex = cms.EDAnalyzer(
"Example",
565 two = cms.bool(
True),
567 three = cms.int32(10),
568 four = cms.string(
'abc')
572 five = cms.InputTag(
'alpha')
575 six = cms.vint32(1,2,3)
578 seven = cms.vstring(
'alpha',
'bravo',
'charlie'),
579 eight = cms.vuint32(
list(range(10))),
582 ex.zero = cms.string(
'hello')
583 self.assertEqual(ex._modifications[-1][
'name'],
'zero')
584 ex.one = cms.double(1)
585 ex.one = cms.double(2)
586 ex.one = cms.double(3)
587 self.assertEqual(ex._modifications[-1][
'name'],
'one')
588 self.assertEqual(ex._modifications[-2][
'name'],
'one')
589 self.assertEqual(ex._modifications[-3][
'name'],
'one')
591 self.assertEqual(ex._modifications[-1][
'name'],
'two')
592 ex.ps.three.setValue(100)
595 self.assertEqual(ex.ps._modifications[-1][
'name'],
'four')
596 ex.vps[0].five = cms.string(
'beta')
597 self.assertEqual(ex.vps[0]._modifications[-1][
'name'],
'five')
598 ex.vps[1].__dict__[
'six'] = cms.vint32(1,4,9)
600 ex.seven[0] =
'delta' 606 ex.newvpset = cms.VPSet()
607 self.assertEqual(ex._modifications[-1][
'name'],
'newvpset')
609 process = cms.Process(
'unittest')
611 mods = process.dumpModifications()
612 self.assert_(
'process.ex.zero' in mods)
613 self.assert_(
'process.ex.one' in mods)
614 self.assert_(
'process.ex.two' in mods)
616 self.assert_(
'process.ex.ps.four' in mods)
617 self.assert_(
'process.ex.vps[0].five' in mods)
621 self.assert_(
'process.ex.nine' in mods)
622 self.assert_(
'process.ex.newvpset' in mods)
627 process = cms.Process(
'unittest')
629 setattr(process,
'f%s'%i,cms.EDFilter(
'f%s'%i))
630 process.seq1 = cms.Sequence(process.f1*process.f2*process.f3)
631 self.assertEqual(process.seq1._modifications,[])
632 process.seq2 = cms.Sequence(process.f4+process.f5+process.f6)
633 self.assertEqual(process.seq2._modifications,[])
635 process.seq1.replace(process.f1,process.f0*process.f1)
636 self.assertEqual(process.seq1._modifications[-1][
'action'],
'replace')
638 process.seq2.remove(process.f5)
639 self.assertEqual(process.seq2._modifications[-1][
'action'],
'remove')
641 process.path = cms.Path(process.seq1*process.f7)
642 self.assertEqual(process.path._modifications,[])
644 process.path *= process.seq2
645 self.assertEqual(process.path._modifications[-1][
'action'],
'append')
646 process.path.remove(process.f6)
647 self.assertEqual(process.path._modifications[-1][
'action'],
'remove')
648 process.path.replace(process.f2,~process.f2)
649 self.assertEqual(process.path._modifications[-1][
'action'],
'replace')
651 mods = process.dumpModifications()
652 self.assert_(
'process.seq1' in mods)
653 self.assert_(
'process.seq2' in mods)
654 self.assert_(
'process.path' in mods)
657 process = cms.Process(
'unittest')
658 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
660 changeSource(process,
"file:filename.root")
661 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename.root")
663 changeSource(process,
"file:filename2.root")
664 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename2.root")
666 changeSource(process,
"file:filename3.root")
667 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename3.root")
669 self.assertEqual(process.dumpHistory(),
"\nfrom FWCore.GuiBrowsers.editorTools import *\n\nchangeSource(process , 'file:filename.root')\n\n\nchangeSource(process , 'file:filename2.root')\n\n\nchangeSource(process , 'file:filename3.root')\n\n")
671 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.root")
672 self.assertEqual(process.dumpHistory(),
"\nfrom FWCore.GuiBrowsers.editorTools import *\n\nchangeSource(process , 'file:filename.root')\n\n\nchangeSource(process , 'file:filename2.root')\n\n\nchangeSource(process , 'file:filename3.root')\n\nprocess.source.fileNames = cms.untracked.vstring('file:replacedfile.root')\n")
674 process.disableRecording()
675 changeSource.setParameter(
'source',
"file:filename4.root")
676 action=changeSource.__copy__()
677 process.addAction(action)
678 self.assertEqual(process.dumpHistory(),
"\nfrom FWCore.GuiBrowsers.editorTools import *\n\nchangeSource(process , 'file:filename.root')\n\n\nchangeSource(process , 'file:filename2.root')\n\n\nchangeSource(process , 'file:filename3.root')\n\nprocess.source.fileNames = cms.untracked.vstring('file:replacedfile.root')\n")
680 process.enableRecording()
681 changeSource.setParameter(
'source',
"file:filename5.root")
682 action=changeSource.__copy__()
683 process.addAction(action)
684 process.deleteAction(3)
685 self.assertEqual(process.dumpHistory(),
"\nfrom FWCore.GuiBrowsers.editorTools import *\n\nchangeSource(process , 'file:filename.root')\n\n\nchangeSource(process , 'file:filename2.root')\n\n\nchangeSource(process , 'file:filename3.root')\n\n\nchangeSource(process , 'file:filename5.root')\n\n")
687 process.deleteAction(0)
688 self.assertEqual(process.dumpHistory(),
"\nfrom FWCore.GuiBrowsers.editorTools import *\n\nchangeSource(process , 'file:filename2.root')\n\n\nchangeSource(process , 'file:filename3.root')\n\n\nchangeSource(process , 'file:filename5.root')\n\n")
691 process = cms.Process(
'unittest')
692 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
694 changeSource(process,
"file:filename.root")
695 self.assertEqual(len(process.history()[0][1]),1)
697 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.root")
698 self.assertEqual(len(process.history()[0][1]),1)
699 self.assertEqual(len(process.history()[1][1]),1)
701 process.source.fileNames=[
"test2"]
702 self.assertEqual(len(process.history()[0][1]),1)
703 self.assertEqual(len(process.history()[1][1]),1)
705 changeSource(process,
"file:filename2.root")
706 self.assertEqual(len(process.history()[0][1]),1)
707 self.assertEqual(len(process.history()[1][1]),1)
708 self.assertEqual(len(process.history()[2][1]),1)
710 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile2.root")
711 self.assertEqual(len(process.history()[0][1]),1)
712 self.assertEqual(len(process.history()[1][1]),1)
713 self.assertEqual(len(process.history()[2][1]),1)
714 self.assertEqual(len(process.history()[3][1]),1)
def new__placeLooper(self, name, mod)
def new__ModuleSequenceType_resetModified(self)
def testModifiedObjectsHistory(self)
def new_modificationCheckpoint(self)
def new__ModuleSequenceType__iadd__(self, other)
def new__Sequenceable_name(self)
sequence history ####
def new_dumpModifications(self, comments=True, process=True, module=False, sequence=True, value=True, sort=True, group=True)
def new_Parameterizeable_delattr(self, name)
bool any(const std::vector< T > &v, const T &what)
def new_resetHistory(self)
def new_modifiedObjects(self)
def new__ModuleSequenceType_copy(self)
def new_SortedKeysDict__copy__(self)
def new_Parameterizable_setattr(self, name, value)
def new_Parameterizable_resetModified(self)
S & print(S &os, JobReport::InputFile const &f)
def new_SortedKeysDict__deepcopy__(self, memo=None)
def new__ModuleSequenceType_replace(self, original, replacement)
def new_setLooper_(self, lpr)
def new_Parameterizable_init(self, a, k)
parameterizable history ####
def new__SequencePlaceholder_name(self)
def new__Module_name(self)
def new__SequenceNegation_name(self)
def new_enableRecording(self)
def new_recurseResetModified_(self, o)
def new_resetModifiedObjects(self)
def new_history(self, removeDuplicates=False)
def new_setSchedule_(self, sch)
def new_Sequence_name(self)
def new__ModuleSequenceType__imul__(self, other)
def new__SequenceIgnore_name(self)
def new_deleteAction(self, i)
def new__placeService(self, typeName, mod)
static std::string join(char **cmd)
def new__ModuleSequenceType_isModified(self)
def new_addAction(self, tool)
def new_disableRecording(self)
def new_checkRecording(self)
def dumpPython(process, name)
def new__ModuleSequenceType__init__(self, arg, argv)
def new_recurseDumpModifications_(self, name, o)
def new_ParameterTypeBase_resetModified(self)
def new_dumpModificationsWithObjects(self, removeDuplicates=False)
def new__ModuleSequenceType_remove(self, original)
def testdumpHistory(self)
def new_resetModified(self)
def new_setattr(self, name, value)
def auto_inspect()
helpers for inspection ####
def new__placeSource(self, name, mod)
def new_dumpHistory(self, withImports=True)
def new___init__(self, l, k)
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 new_moduleItems_(self)
def new_Parameterizable_addParameter(self, name, value)
def new__place(self, name, mod, d)