1 from copy
import deepcopy
4 ACTIVATE_INSPECTION=
True
9 if not ACTIVATE_INSPECTION:
10 return [(
"unknown",
"unknown",
"unknown")]
11 stack = inspect.stack()
12 while len(stack)>=1
and len(stack[0])>=2
and (
'FWCore/ParameterSet' in stack[0][1]
or 'FWCore/GuiBrowsers' in stack[0][1]):
14 if len(stack)>=1
and len(stack[0])>=3:
17 return [(
"unknown",
"unknown",
"unknown")]
21 import FWCore.ParameterSet.DictTypes
as typ
24 return self.__class__(self)
25 typ.SortedKeysDict.__copy__ = new_SortedKeysDict__copy__
28 from copy
import deepcopy
31 d = memo.get(id(self),
None)
34 memo[id(self)] = d = self.__class__()
35 d.__init__(deepcopy(self.items(), memo))
37 typ.SortedKeysDict.__deepcopy__ = new_SortedKeysDict__deepcopy__
41 import FWCore.ParameterSet.Config
as cms
44 self.old___init__(name)
45 self.__dict__[
'_Process__history'] = []
46 self.__dict__[
'_Process__enableRecording'] = 0
47 self.__dict__[
'_Process__modifiedobjects'] = []
48 self.__dict__[
'_Process__modifiedcheckpoint'] =
None
49 self.__dict__[
'_Process__modifications'] = []
50 cms.Process.old___init__=cms.Process.__init__
51 cms.Process.__init__=new___init__
54 return self.__dict__[
'_Process__modifiedobjects']
55 cms.Process.modifiedObjects=new_modifiedObjects
58 self.__dict__[
'_Process__modifiedobjects'] = []
59 cms.Process.resetModifiedObjects=new_resetModifiedObjects
62 self.old__place(name, mod, d)
63 if self._okToPlace(name, mod, d):
64 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
65 cms.Process.old__place=cms.Process._place
66 cms.Process._place=new__place
69 self.old__placeSource(name, mod)
70 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
71 cms.Process.old__placeSource=cms.Process._placeSource
72 cms.Process._placeSource=new__placeSource
75 self.old__placeLooper(name, mod)
76 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
77 cms.Process.old__placeLooper=cms.Process._placeLooper
78 cms.Process._placeLooper=new__placeLooper
81 self.old__placeService(typeName, mod)
82 self.__dict__[
'_Process__modifiedobjects'].
append(mod)
83 cms.Process.old__placeService=cms.Process._placeService
84 cms.Process._placeService=new__placeService
87 self.old_setSchedule_(sch)
88 self.__dict__[
'_Process__modifiedobjects'].
append(sch)
89 cms.Process.old_setSchedule_=cms.Process.setSchedule_
90 cms.Process.setSchedule_=new_setSchedule_
93 self.old_setLooper_(lpr)
94 self.__dict__[
'_Process__modifiedobjects'].
append(lpr)
95 cms.Process.old_setLooper_=cms.Process.setLooper_
96 cms.Process.setLooper_=new_setLooper_
99 return self.__dict__[
'_Process__history']+self.dumpModificationsWithObjects(removeDuplicates)
100 cms.Process.history=new_history
103 self.__dict__[
'_Process__history'] = []
105 self.resetModifiedObjects()
106 cms.Process.resetHistory=new_resetHistory
110 for item,objects
in self.history():
111 if isinstance(item,(str,unicode)):
112 dumpHistory.append(item +
"\n")
115 dump=item.dumpPython()
116 if isinstance(dump,tuple):
117 if withImports
and dump[0]
not in dumpHistory:
118 dumpHistory.append(dump[0])
119 dumpHistory.append(dump[1] +
"\n")
121 dumpHistory.append(dump +
"\n")
123 return ''.
join(dumpHistory)
124 cms.Process.dumpHistory=new_dumpHistory
127 if self.__dict__[
'_Process__enableRecording'] == 0:
128 modifiedObjects=self.modifiedObjects()
129 for m,o
in self.dumpModificationsWithObjects():
131 self.__dict__[
'_Process__history'].
append((tool,modifiedObjects))
133 self.resetModifiedObjects()
134 cms.Process.addAction=new_addAction
137 del self.__dict__[
'_Process__history'][i]
138 cms.Process.deleteAction=new_deleteAction
141 if self.__dict__[
'_Process__enableRecording'] == 0:
143 self.__dict__[
'_Process__history']+=self.dumpModificationsWithObjects()
145 self.resetModifiedObjects()
146 self.__dict__[
'_Process__enableRecording'] += 1
147 cms.Process.disableRecording=new_disableRecording
150 self.__dict__[
'_Process__enableRecording'] -= 1
151 cms.Process.enableRecording=new_enableRecording
154 return self.__dict__[
'_Process__enableRecording']==0
155 cms.Process.checkRecording=new_checkRecording
159 This catches modifications that occur during process.load,
160 and only records a modification if there was an existing object
161 and the version after __setattr__ has a different id().
162 This does not mean that the object is different, only redefined.
163 We still really need a recursive-comparison function for parameterizeable
164 objects to determine if a real change has been made.
168 if not name.startswith(
'_Process__'):
169 existing = hasattr(self, name)
171 old = getattr(self, name)
172 self.old__setattr__(name, value)
174 if id(getattr(self, name)) != id(old):
176 self.__dict__[
'_Process__modifications'] += [{
'name': name,
177 'old': deepcopy(old),
178 'new': deepcopy(getattr(self, name)),
179 'file':stack[0][1],
'line':stack[0][2],
180 'action':
'replace'}]
181 cms.Process.old__setattr__ = cms.Process.__setattr__
182 cms.Process.__setattr__ = new_setattr
186 Empty all the _modifications lists for
187 all objects beneath this one.
190 if isinstance(o, cms._ModuleSequenceType):
192 if isinstance(o, cms._Parameterizable):
194 for key
in o.parameterNames_():
195 value = getattr(o,key)
196 self.recurseResetModified_(value)
197 if isinstance(o, cms._ValidatingListBase):
198 for index,item
in enumerate(o):
199 self.recurseResetModified_(item)
200 cms.Process.recurseResetModified_=new_recurseResetModified_
204 Recursively return a standardised list of modifications
205 from the object hierarchy.
208 if isinstance(o, cms._ModuleSequenceType):
210 for mod
in o._modifications:
211 modifications.append({
'name':name,
212 'action':mod[
'action'],
217 'dump': o.dumpPython({}),
220 if isinstance(o, cms._Parameterizable):
221 for mod
in o._modifications:
222 paramname = mod[
'name']
223 if hasattr(o, paramname):
224 paramvalue = getattr(o, paramname)
227 if isinstance(paramvalue,cms._ParameterTypeBase):
228 dump = paramvalue.dumpPython()
231 modifications.append({
'name':
'%s.%s' %(name, paramname),
236 'action': mod[
'action'],
241 for key
in o.parameterNames_():
242 value = getattr(o,key)
243 modifications += self.recurseDumpModifications_(
"%s.%s" % (name, key), value)
245 if isinstance(o, cms._ValidatingListBase):
246 for index, item
in enumerate(o):
247 modifications += self.recurseDumpModifications_(
"%s[%s]" % (name, index), item)
248 if isinstance(o, cms.Process):
249 for mod
in o.__dict__[
'_Process__modifications']:
250 if hasattr(o, mod[
'name'])
and hasattr(getattr(o, mod[
'name']),
'dumpPython'):
254 modifications.append({
'name': mod[
'name'],
255 'action': mod[
'action'],
263 cms.Process.recurseDumpModifications_=new_recurseDumpModifications_
267 Set a checkpoint, ie get the current list of all known
268 top-level names and store them. Later, when we print out
269 modifications we ignore any modifications that do not affect
270 something in this list.
272 There is currently no way of clearing this, but I think this
273 is generally a use-once feature.
275 existing_names = set()
276 for item
in self.items_():
277 existing_names.add(item[0])
278 self.__dict__[
'_Process__modifiedcheckpoint'] =
list(existing_names)
279 cms.Process.modificationCheckpoint=new_modificationCheckpoint
283 Empty out all the modification lists, so we only see changes that
284 happen from now onwards.
286 self.__dict__[
'_Process__modified'] = []
287 for name, o
in self.items_():
288 self.recurseResetModified_(o)
289 cms.Process.resetModified=new_resetModified
291 def new_dumpModifications(self, comments=True, process=True, module=False, sequence=True, value=True, sort=True, group=True):
293 Return some text describing all the modifications that have been made.
295 * comments: print out comments describing the file and line which triggered
296 the modification, if determined.
297 * process: print "process." in front of every name
298 * module: only print out one entry per top-level module that has been
299 changed, rather than the details
300 * sequence: include changes to sequences
301 * value: print out the latest value of each name
302 * sort: whether to sort all the names before printing (otherwise they're in
303 more-or-less time order, within each category)
305 modifications = self.recurseDumpModifications_(
'', self)
307 for name, o
in self.items_():
308 modifications += self.recurseDumpModifications_(name, o)
310 modifications =
filter(
lambda x:
not x[
'type'] ==
'seq', modifications)
311 checkpoint = self.__dict__[
'_Process__modifiedcheckpoint']
312 if not checkpoint ==
None:
313 modifications =
filter(
lambda x:
any([x[
'name'].startswith(check)
for check
in checkpoint]), modifications)
317 modules =
list(set([m[
'name'].
split(
'.')[0]
for m
in modifications]))
319 modules = sorted(modules)
321 text = [
'process.%s' % m
for m
in modules]
326 modifications = sorted(modifications, key=
lambda x: x[
'name'])
327 for i, m
in enumerate(modifications):
330 if m[
'action'] ==
'replace':
331 t +=
'# %(file)s:%(line)s replace %(old)s->%(new)s\n' % m
332 elif m[
'action'] ==
'remove':
333 t +=
'# %(file)s:%(line)s remove %(old)s\n' % m
334 elif m[
'action'] ==
'append':
335 t +=
'# %(file)s:%(line)s append %(new)s\n' % m
336 if not group
or i==len(modifications)-1
or not modifications[i+1][
'name'] == m[
'name']:
337 if process
and value:
338 t +=
'process.%s = %s' % (m[
'name'], m[
'dump'])
340 t +=
'%s = %s' % (m[
'name'], m[
'dump'])
342 t +=
'process.%s' % (m[
'name'])
344 t +=
'%s' % (m[
'name'])
346 return '\n'.
join(text)+
'\n'
347 cms.Process.dumpModifications=new_dumpModifications
352 for name, o
in self.items_():
353 for m
in self.recurseDumpModifications_(name, o):
355 if removeDuplicates
and last_modification==m[
'name']:
357 last_modification=m[
'name']
359 text =
'process.%s = %s' % (m[
'name'], m[
'dump'])
360 modifications += [(text,[o])]
362 cms.Process.dumpModificationsWithObjects=new_dumpModificationsWithObjects
366 items += self.producers.items()
367 items += self.filters.items()
368 items += self.analyzers.items()
370 cms.Process.moduleItems_=new_moduleItems_
375 items += [(
"source", self.source)]
377 items += [(
"looper", self.looper)]
378 items += self.moduleItems_()
379 items += self.outputModules.items()
380 items += self.sequences.items()
381 items += self.paths.iteritems()
382 items += self.endpaths.items()
383 items += self.services.items()
384 items += self.es_producers.items()
385 items += self.es_sources.items()
386 items += self.es_prefers.items()
387 items += self.psets.items()
388 items += self.vpsets.items()
390 items += [(
"schedule", self.schedule)]
392 cms.Process.items_=new_items_
397 self.__dict__[
'_modifications'] = []
398 self.old__init__(*a,**k)
399 self._modifications = []
400 cms._Parameterizable.old__init__ = cms._Parameterizable.__init__
401 cms._Parameterizable.__init__ = new_Parameterizable_init
404 self.old__addParameter(name,value)
406 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':
None,
'new':deepcopy(value),
'action':
'add'})
407 cms._Parameterizable.old__addParameter = cms._Parameterizable._Parameterizable__addParameter
408 cms._Parameterizable._Parameterizable__addParameter = new_Parameterizable_addParameter
411 if (
not self.isFrozen())
and (
not name.startswith(
'_'))
and (name
in self.__dict__):
413 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':deepcopy(self.__dict__[name]),
'new':deepcopy(value),
'action':
'replace'})
414 self._isModified =
True
415 self.old__setattr__(name,value)
416 cms._Parameterizable.old__setattr__ = cms._Parameterizable.__setattr__
417 cms._Parameterizable.__setattr__ = new_Parameterizable_setattr
420 if not self.isFrozen():
422 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'name':name,
'old':deepcopy(self.__dict__[name]),
'new':
None,
'action':
'delete'})
423 self.old__delattr__(name)
424 cms._Parameterizable.old__delattr__ = cms._Parameterizable.__delattr__
425 cms._Parameterizable.__delattr__ = new_Parameterizeable_delattr
429 self._isModified=
False
430 self._modifications = []
431 for name
in self.parameterNames_():
432 param = self.__dict__[name]
433 if isinstance(param, cms._Parameterizable):
434 param.resetModified()
435 cms._Parameterizable.resetModified = new_Parameterizable_resetModified
438 self._isModified=
False
439 self._modifications = []
440 cms._ParameterTypeBase.resetModified = new_ParameterTypeBase_resetModified
446 cms._Sequenceable._name_ = new__Sequenceable_name
452 def new__SequenceOperator_name(self):
453 return str(self._left._name_())+str(self._pySymbol)+str(self._right._name_())
454 _SequenceOperator._name_ = new__SequenceOperator_name
462 SequencePlaceholder._name_ = new__SequencePlaceholder_name
466 return '~'+str(self._operand._name_())
469 _SequenceNegation._name_ = new__SequenceNegation_name
473 return '-'+str(self._operand._name_())
476 _SequenceIgnore._name_ = new__SequenceIgnore_name
480 return '('+str(self._seq._name_())+
')'
483 cms.Sequence._name_ = new_Sequence_name
486 if hasattr(self,
'_Labelable__label'):
487 return getattr(self,
'_Labelable__label')
488 elif hasattr(self,
'_TypedParameterizable__type'):
489 return 'unnamed(%s)'%getattr(self,
'_TypedParameterizable__type')
490 return type(self).__name__
491 cms._Module._name_ = new__Module_name
494 self._modifications = []
495 self.old__init__(*arg,**argv)
496 cms._ModuleSequenceType.old__init__ = cms._ModuleSequenceType.__init__
497 cms._ModuleSequenceType.__init__ = new__ModuleSequenceType__init__
500 self._isModified=
False
501 self._modifications = []
502 cms._ModuleSequenceType.resetModified = new__ModuleSequenceType_resetModified
505 return self._isModified
506 cms._ModuleSequenceType.isModified = new__ModuleSequenceType_isModified
509 returnValue = cms._ModuleSequenceType.__new__(type(self))
510 returnValue.__init__(self._seq)
511 returnValue._isModified = self._isModified
512 returnValue._modifications = deepcopy(self._modifications)
514 cms._ModuleSequenceType.copy = new__ModuleSequenceType_copy
518 self._isModified=
True
519 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'replace',
'old':original._name_(),
'new':replacement._name_()})
520 return self.old_replace(original, replacement)
521 cms._ModuleSequenceType.old_replace = cms._ModuleSequenceType.replace
522 cms._ModuleSequenceType.replace = new__ModuleSequenceType_replace
526 self._isModified=
True
527 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'remove',
'old':original._name_(),
'new':
None})
528 return self.old_remove(original)
529 cms._ModuleSequenceType.old_remove = cms._ModuleSequenceType.remove
530 cms._ModuleSequenceType.remove = new__ModuleSequenceType_remove
534 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
535 self._isModified=
True
536 return self.old__iadd__(other)
537 cms._ModuleSequenceType.old__imul__ = cms._ModuleSequenceType.__imul__
538 cms._ModuleSequenceType.__imul__ = new__ModuleSequenceType__imul__
542 self._isModified=
True
543 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
544 return self.old__iadd__(other)
545 cms._ModuleSequenceType.old__iadd__ = cms._ModuleSequenceType.__iadd__
546 cms._ModuleSequenceType.__iadd__ = new__ModuleSequenceType__iadd__
548 from FWCore.ParameterSet.Modules
import Source
549 from FWCore.GuiBrowsers.editorTools
import changeSource
551 if __name__==
'__main__':
557 ex = cms.EDAnalyzer(
"Example",
559 two = cms.bool(
True),
561 three = cms.int32(10),
562 four = cms.string(
'abc')
566 five = cms.InputTag(
'alpha')
569 six = cms.vint32(1,2,3)
572 seven = cms.vstring(
'alpha',
'bravo',
'charlie'),
573 eight = cms.vuint32(range(10)),
576 ex.zero = cms.string(
'hello')
577 self.assertEqual(ex._modifications[-1][
'name'],
'zero')
578 ex.one = cms.double(1)
579 ex.one = cms.double(2)
580 ex.one = cms.double(3)
581 self.assertEqual(ex._modifications[-1][
'name'],
'one')
582 self.assertEqual(ex._modifications[-2][
'name'],
'one')
583 self.assertEqual(ex._modifications[-3][
'name'],
'one')
585 self.assertEqual(ex._modifications[-1][
'name'],
'two')
586 ex.ps.three.setValue(100)
589 self.assertEqual(ex.ps._modifications[-1][
'name'],
'four')
590 ex.vps[0].five = cms.string(
'beta')
591 self.assertEqual(ex.vps[0]._modifications[-1][
'name'],
'five')
592 ex.vps[1].__dict__[
'six'] = cms.vint32(1,4,9)
594 ex.seven[0] =
'delta'
600 ex.newvpset = cms.VPSet()
601 self.assertEqual(ex._modifications[-1][
'name'],
'newvpset')
603 process = cms.Process(
'unittest')
605 mods = process.dumpModifications()
606 self.assert_(
'process.ex.zero' in mods)
607 self.assert_(
'process.ex.one' in mods)
608 self.assert_(
'process.ex.two' in mods)
610 self.assert_(
'process.ex.ps.four' in mods)
611 self.assert_(
'process.ex.vps[0].five' in mods)
615 self.assert_(
'process.ex.nine' in mods)
616 self.assert_(
'process.ex.newvpset' in mods)
621 process = cms.Process(
'unittest')
623 setattr(process,
'f%s'%i,cms.EDFilter(
'f%s'%i))
624 process.seq1 = cms.Sequence(process.f1*process.f2*process.f3)
625 self.assertEqual(process.seq1._modifications,[])
626 process.seq2 = cms.Sequence(process.f4+process.f5+process.f6)
627 self.assertEqual(process.seq2._modifications,[])
629 process.seq1.replace(process.f1,process.f0*process.f1)
630 self.assertEqual(process.seq1._modifications[-1][
'action'],
'replace')
632 process.seq2.remove(process.f5)
633 self.assertEqual(process.seq2._modifications[-1][
'action'],
'remove')
635 process.path = cms.Path(process.seq1*process.f7)
636 self.assertEqual(process.path._modifications,[])
638 process.path *= process.seq2
639 self.assertEqual(process.path._modifications[-1][
'action'],
'append')
640 process.path.remove(process.f6)
641 self.assertEqual(process.path._modifications[-1][
'action'],
'remove')
642 process.path.replace(process.f2,~process.f2)
643 self.assertEqual(process.path._modifications[-1][
'action'],
'replace')
645 mods = process.dumpModifications()
646 self.assert_(
'process.seq1' in mods)
647 self.assert_(
'process.seq2' in mods)
648 self.assert_(
'process.path' in mods)
651 process = cms.Process(
'unittest')
652 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
654 changeSource(process,
"file:filename.root")
655 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename.root")
657 changeSource(process,
"file:filename2.root")
658 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename2.root")
660 changeSource(process,
"file:filename3.root")
661 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename3.root")
663 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")
665 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.root")
666 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")
668 process.disableRecording()
669 changeSource.setParameter(
'source',
"file:filename4.root")
670 action=changeSource.__copy__()
671 process.addAction(action)
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.enableRecording()
675 changeSource.setParameter(
'source',
"file:filename5.root")
676 action=changeSource.__copy__()
677 process.addAction(action)
678 process.deleteAction(3)
679 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")
681 process.deleteAction(0)
682 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")
685 process = cms.Process(
'unittest')
686 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
688 changeSource(process,
"file:filename.root")
689 self.assertEqual(len(process.history()[0][1]),1)
691 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.root")
692 self.assertEqual(len(process.history()[0][1]),1)
693 self.assertEqual(len(process.history()[1][1]),1)
695 process.source.fileNames=[
"test2"]
696 self.assertEqual(len(process.history()[0][1]),1)
697 self.assertEqual(len(process.history()[1][1]),1)
699 changeSource(process,
"file:filename2.root")
700 self.assertEqual(len(process.history()[0][1]),1)
701 self.assertEqual(len(process.history()[1][1]),1)
702 self.assertEqual(len(process.history()[2][1]),1)
704 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile2.root")
705 self.assertEqual(len(process.history()[0][1]),1)
706 self.assertEqual(len(process.history()[1][1]),1)
707 self.assertEqual(len(process.history()[2][1]),1)
708 self.assertEqual(len(process.history()[3][1]),1)
def new__SequenceNegation_name
def new_resetModifiedObjects
def new__ModuleSequenceType_remove
def testModifiedObjectsHistory
def new__ModuleSequenceType__init__
bool any(const std::vector< T > &v, const T &what)
def new_Parameterizable_init
parameterizable history ####
boost::dynamic_bitset append(const boost::dynamic_bitset<> &bs1, const boost::dynamic_bitset<> &bs2)
this method takes two bitsets bs1 and bs2 and returns result of bs2 appended to the end of bs1 ...
def new_SortedKeysDict__copy__
def new__SequenceIgnore_name
def new__Sequenceable_name
sequence history ####
def new__ModuleSequenceType__iadd__
def new__ModuleSequenceType_isModified
def auto_inspect
helpers for inspection ####
def new_ParameterTypeBase_resetModified
def new_Parameterizable_addParameter
def new__SequencePlaceholder_name
def new__ModuleSequenceType_copy
def new_modificationCheckpoint
def new_Parameterizable_resetModified
def new_dumpModificationsWithObjects
def new__ModuleSequenceType_resetModified
def new__ModuleSequenceType__imul__
def new_recurseResetModified_
def new_Parameterizeable_delattr
def new_dumpModifications
def new_SortedKeysDict__deepcopy__
static std::string join(char **cmd)
def new_Parameterizable_setattr
def new__ModuleSequenceType_replace
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_recurseDumpModifications_