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__(*l,**k)
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 if replacement
is None:
520 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'replace',
'old':original._name_(),
'new':
None})
522 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'replace',
'old':original._name_(),
'new':replacement._name_()})
523 return self.old_replace(original, replacement)
524 cms._ModuleSequenceType.old_replace = cms._ModuleSequenceType.replace
525 cms._ModuleSequenceType.replace = new__ModuleSequenceType_replace
529 self._isModified=
True 530 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'remove',
'old':original._name_(),
'new':
None})
531 return self.old_remove(original)
532 cms._ModuleSequenceType.old_remove = cms._ModuleSequenceType.remove
533 cms._ModuleSequenceType.remove = new__ModuleSequenceType_remove
537 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
538 self._isModified=
True 539 return self.old__iadd__(other)
540 cms._ModuleSequenceType.old__imul__ = cms._ModuleSequenceType.__imul__
541 cms._ModuleSequenceType.__imul__ = new__ModuleSequenceType__imul__
545 self._isModified=
True 546 self._modifications.append({
'file':stack[0][1],
'line':stack[0][2],
'action':
'append',
'new':other._name_(),
'old':
None})
547 return self.old__iadd__(other)
548 cms._ModuleSequenceType.old__iadd__ = cms._ModuleSequenceType.__iadd__
549 cms._ModuleSequenceType.__iadd__ = new__ModuleSequenceType__iadd__
551 from FWCore.ParameterSet.Modules
import Source
552 from FWCore.GuiBrowsers.editorTools
import changeSource
554 if __name__==
'__main__':
560 ex = cms.EDAnalyzer(
"Example",
562 two = cms.bool(
True),
564 three = cms.int32(10),
565 four = cms.string(
'abc')
569 five = cms.InputTag(
'alpha')
572 six = cms.vint32(1,2,3)
575 seven = cms.vstring(
'alpha',
'bravo',
'charlie'),
576 eight = cms.vuint32(range(10)),
579 ex.zero = cms.string(
'hello')
580 self.assertEqual(ex._modifications[-1][
'name'],
'zero')
581 ex.one = cms.double(1)
582 ex.one = cms.double(2)
583 ex.one = cms.double(3)
584 self.assertEqual(ex._modifications[-1][
'name'],
'one')
585 self.assertEqual(ex._modifications[-2][
'name'],
'one')
586 self.assertEqual(ex._modifications[-3][
'name'],
'one')
588 self.assertEqual(ex._modifications[-1][
'name'],
'two')
589 ex.ps.three.setValue(100)
592 self.assertEqual(ex.ps._modifications[-1][
'name'],
'four')
593 ex.vps[0].five = cms.string(
'beta')
594 self.assertEqual(ex.vps[0]._modifications[-1][
'name'],
'five')
595 ex.vps[1].__dict__[
'six'] = cms.vint32(1,4,9)
597 ex.seven[0] =
'delta' 603 ex.newvpset = cms.VPSet()
604 self.assertEqual(ex._modifications[-1][
'name'],
'newvpset')
606 process = cms.Process(
'unittest')
608 mods = process.dumpModifications()
609 self.assert_(
'process.ex.zero' in mods)
610 self.assert_(
'process.ex.one' in mods)
611 self.assert_(
'process.ex.two' in mods)
613 self.assert_(
'process.ex.ps.four' in mods)
614 self.assert_(
'process.ex.vps[0].five' in mods)
618 self.assert_(
'process.ex.nine' in mods)
619 self.assert_(
'process.ex.newvpset' in mods)
624 process = cms.Process(
'unittest')
626 setattr(process,
'f%s'%i,cms.EDFilter(
'f%s'%i))
627 process.seq1 = cms.Sequence(process.f1*process.f2*process.f3)
628 self.assertEqual(process.seq1._modifications,[])
629 process.seq2 = cms.Sequence(process.f4+process.f5+process.f6)
630 self.assertEqual(process.seq2._modifications,[])
632 process.seq1.replace(process.f1,process.f0*process.f1)
633 self.assertEqual(process.seq1._modifications[-1][
'action'],
'replace')
635 process.seq2.remove(process.f5)
636 self.assertEqual(process.seq2._modifications[-1][
'action'],
'remove')
638 process.path = cms.Path(process.seq1*process.f7)
639 self.assertEqual(process.path._modifications,[])
641 process.path *= process.seq2
642 self.assertEqual(process.path._modifications[-1][
'action'],
'append')
643 process.path.remove(process.f6)
644 self.assertEqual(process.path._modifications[-1][
'action'],
'remove')
645 process.path.replace(process.f2,~process.f2)
646 self.assertEqual(process.path._modifications[-1][
'action'],
'replace')
648 mods = process.dumpModifications()
649 self.assert_(
'process.seq1' in mods)
650 self.assert_(
'process.seq2' in mods)
651 self.assert_(
'process.path' in mods)
654 process = cms.Process(
'unittest')
655 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
657 changeSource(process,
"file:filename.root")
658 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename.root")
660 changeSource(process,
"file:filename2.root")
661 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename2.root")
663 changeSource(process,
"file:filename3.root")
664 self.assertEqual(changeSource._parameters[
'source'].value,
"file:filename3.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\n")
668 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.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\nprocess.source.fileNames = cms.untracked.vstring('file:replacedfile.root')\n")
671 process.disableRecording()
672 changeSource.setParameter(
'source',
"file:filename4.root")
673 action=changeSource.__copy__()
674 process.addAction(action)
675 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")
677 process.enableRecording()
678 changeSource.setParameter(
'source',
"file:filename5.root")
679 action=changeSource.__copy__()
680 process.addAction(action)
681 process.deleteAction(3)
682 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")
684 process.deleteAction(0)
685 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")
688 process = cms.Process(
'unittest')
689 process.source=
Source(
"PoolSource",fileNames = cms.untracked.string(
"file:file.root"))
691 changeSource(process,
"file:filename.root")
692 self.assertEqual(len(process.history()[0][1]),1)
694 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile.root")
695 self.assertEqual(len(process.history()[0][1]),1)
696 self.assertEqual(len(process.history()[1][1]),1)
698 process.source.fileNames=[
"test2"]
699 self.assertEqual(len(process.history()[0][1]),1)
700 self.assertEqual(len(process.history()[1][1]),1)
702 changeSource(process,
"file:filename2.root")
703 self.assertEqual(len(process.history()[0][1]),1)
704 self.assertEqual(len(process.history()[1][1]),1)
705 self.assertEqual(len(process.history()[2][1]),1)
707 process.source.fileNames=cms.untracked.vstring(
"file:replacedfile2.root")
708 self.assertEqual(len(process.history()[0][1]),1)
709 self.assertEqual(len(process.history()[1][1]),1)
710 self.assertEqual(len(process.history()[2][1]),1)
711 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)
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)