CMS 3D CMS Logo

EnablePSetHistory.py
Go to the documentation of this file.
1 from copy import deepcopy
2 import inspect
3 
4 ACTIVATE_INSPECTION=True
5 
6 #### helpers for inspection ####
7 
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]):
13  stack = stack[1:]
14  if len(stack)>=1 and len(stack[0])>=3:
15  return stack
16  else:
17  return [("unknown","unknown","unknown")]
18 
19 #### patches needed for deepcopy of process ####
20 
21 import FWCore.ParameterSet.DictTypes as typ
22 
24  return self.__class__(self)
25 typ.SortedKeysDict.__copy__ = new_SortedKeysDict__copy__
26 
27 def new_SortedKeysDict__deepcopy__(self, memo=None):
28  from copy import deepcopy
29  if memo is None:
30  memo = {}
31  d = memo.get(id(self), None)
32  if d is not None:
33  return d
34  memo[id(self)] = d = self.__class__()
35  d.__init__(deepcopy(self.items(), memo))
36  return d
37 typ.SortedKeysDict.__deepcopy__ = new_SortedKeysDict__deepcopy__
38 
39 #### process history ####
40 
41 import FWCore.ParameterSet.Config as cms
42 
43 def new___init__(self,*l,**k):
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__
52 
54  return self.__dict__['_Process__modifiedobjects']
55 cms.Process.modifiedObjects=new_modifiedObjects
56 
58  self.__dict__['_Process__modifiedobjects'] = []
59 cms.Process.resetModifiedObjects=new_resetModifiedObjects
60 
61 def new__place(self, name, mod, d):
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
67 
68 def new__placeSource(self, name, mod):
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
73 
74 def new__placeLooper(self, name, mod):
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
79 
80 def new__placeService(self, typeName, mod):
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
85 
86 def new_setSchedule_(self, sch):
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_
91 
92 def new_setLooper_(self, lpr):
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_
97 
98 def new_history(self, removeDuplicates=False):
99  return self.__dict__['_Process__history']+self.dumpModificationsWithObjects(removeDuplicates)
100 cms.Process.history=new_history
101 
103  self.__dict__['_Process__history'] = []
104  self.resetModified()
105  self.resetModifiedObjects()
106 cms.Process.resetHistory=new_resetHistory
107 
108 def new_dumpHistory(self,withImports=True):
109  dumpHistory=[]
110  for item,objects in self.history():
111  if isinstance(item,(str,unicode)):
112  dumpHistory.append(item +"\n")
113  else: # isTool
114  print item
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")
120  else:
121  dumpHistory.append(dump +"\n")
122 
123  return ''.join(dumpHistory)
124 cms.Process.dumpHistory=new_dumpHistory
125 
126 def new_addAction(self,tool):
127  if self.__dict__['_Process__enableRecording'] == 0:
128  modifiedObjects=self.modifiedObjects()
129  for m,o in self.dumpModificationsWithObjects():
130  modifiedObjects+=o
131  self.__dict__['_Process__history'].append((tool,modifiedObjects))
132  self.resetModified()
133  self.resetModifiedObjects()
134 cms.Process.addAction=new_addAction
135 
136 def new_deleteAction(self,i):
137  del self.__dict__['_Process__history'][i]
138 cms.Process.deleteAction=new_deleteAction
139 
141  if self.__dict__['_Process__enableRecording'] == 0:
142  # remember modifications in history
143  self.__dict__['_Process__history']+=self.dumpModificationsWithObjects()
144  self.resetModified()
145  self.resetModifiedObjects()
146  self.__dict__['_Process__enableRecording'] += 1
147 cms.Process.disableRecording=new_disableRecording
148 
150  self.__dict__['_Process__enableRecording'] -= 1
151 cms.Process.enableRecording=new_enableRecording
152 
154  return self.__dict__['_Process__enableRecording']==0
155 cms.Process.checkRecording=new_checkRecording
156 
157 def new_setattr(self, name, value):
158  """
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.
165  """
166  old = None
167  existing = False
168  if not name.startswith('_Process__'):
169  existing = hasattr(self, name)
170  if existing:
171  old = getattr(self, name)
172  self.old__setattr__(name, value)
173  if existing:
174  if id(getattr(self, name)) != id(old):
175  stack = auto_inspect()
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
183 
185  """
186  Empty all the _modifications lists for
187  all objects beneath this one.
188  """
189  properties = []
190  if isinstance(o, cms._ModuleSequenceType):
191  o.resetModified()
192  if isinstance(o, cms._Parameterizable):
193  o.resetModified()
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_
201 
202 def new_recurseDumpModifications_(self, name, o):
203  """
204  Recursively return a standardised list of modifications
205  from the object hierarchy.
206  """
207  modifications = []
208  if isinstance(o, cms._ModuleSequenceType):
209  if o._isModified:
210  for mod in o._modifications:
211  modifications.append({'name':name,
212  'action':mod['action'],
213  'old': mod['old'],
214  'new': mod['new'],
215  'file': mod['file'],
216  'line': mod['line'],
217  'dump': o.dumpPython({}),
218  'type': 'seq'})
219 
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)
225  else:
226  paramvalue = None
227  if isinstance(paramvalue,cms._ParameterTypeBase):
228  dump = paramvalue.dumpPython()
229  else:
230  dump = paramvalue
231  modifications.append({'name': '%s.%s' %(name, paramname),
232  'old': mod['old'],
233  'new': mod['new'],
234  'file': mod['file'],
235  'line': mod['line'],
236  'action': mod['action'],
237  'dump': dump,
238  'type': 'param'})
239 
240  # Loop over any child elements
241  for key in o.parameterNames_():
242  value = getattr(o,key)
243  modifications += self.recurseDumpModifications_("%s.%s" % (name, key), value)
244 
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'):
251  dump = getattr(o, mod['name']).dumpPython()
252  else:
253  dump = None
254  modifications.append({'name': mod['name'],
255  'action': mod['action'],
256  'old': mod['old'],
257  'new': mod['new'],
258  'dump': dump,
259  'file': mod['file'],
260  'line': mod['line'],
261  'type': 'process'})
262  return modifications
263 cms.Process.recurseDumpModifications_=new_recurseDumpModifications_
264 
266  """
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.
271 
272  There is currently no way of clearing this, but I think this
273  is generally a use-once feature.
274  """
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
280 
282  """
283  Empty out all the modification lists, so we only see changes that
284  happen from now onwards.
285  """
286  self.__dict__['_Process__modified'] = []
287  for name, o in self.items_():
288  self.recurseResetModified_(o)
289 cms.Process.resetModified=new_resetModified
290 
291 def new_dumpModifications(self, comments=True, process=True, module=False, sequence=True, value=True, sort=True, group=True):
292  """
293  Return some text describing all the modifications that have been made.
294 
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)
304  """
305  modifications = self.recurseDumpModifications_('', self)
306  text = []
307  for name, o in self.items_():
308  modifications += self.recurseDumpModifications_(name, o)
309  if not sequence:
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)
314  if module:
315  value = False
316  comments = False
317  modules = list(set([m['name'].split('.')[0] for m in modifications]))
318  if sort:
319  modules = sorted(modules)
320  if process:
321  text = ['process.%s' % m for m in modules]
322  else:
323  text = modules
324  else:
325  if sort:
326  modifications = sorted(modifications, key=lambda x: x['name'])
327  for i, m in enumerate(modifications):
328  t = ''
329  if comments:
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'])
339  elif value:
340  t += '%s = %s' % (m['name'], m['dump'])
341  elif process:
342  t += 'process.%s' % (m['name'])
343  else:
344  t += '%s' % (m['name'])
345  text += [t]
346  return '\n'.join(text)+'\n'
347 cms.Process.dumpModifications=new_dumpModifications
348 
349 def new_dumpModificationsWithObjects(self, removeDuplicates=False):
350  modifications = []
351  last_modification=""
352  for name, o in self.items_():
353  for m in self.recurseDumpModifications_(name, o):
354  # remove duplicate modifications
355  if removeDuplicates and last_modification==m['name']:
356  modifications.pop()
357  last_modification=m['name']
358  # add changes
359  text = 'process.%s = %s' % (m['name'], m['dump'])
360  modifications += [(text,[o])]
361  return modifications
362 cms.Process.dumpModificationsWithObjects=new_dumpModificationsWithObjects
363 
365  items = []
366  items += self.producers.items()
367  items += self.filters.items()
368  items += self.analyzers.items()
369  return tuple(items)
370 cms.Process.moduleItems_=new_moduleItems_
371 
372 def new_items_(self):
373  items = []
374  if self.source:
375  items += [("source", self.source)]
376  if self.looper:
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()
389  if self.schedule:
390  items += [("schedule", self.schedule)]
391  return tuple(items)
392 cms.Process.items_=new_items_
393 
394 #### parameterizable history ####
395 
396 def new_Parameterizable_init(self,*a,**k):
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
402 
403 def new_Parameterizable_addParameter(self, name, value):
404  self.old__addParameter(name,value)
405  stack = auto_inspect()
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
409 
410 def new_Parameterizable_setattr(self, name, value):
411  if (not self.isFrozen()) and (not name.startswith('_')) and (name in self.__dict__):
412  stack = auto_inspect()
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
418 
420  if not self.isFrozen():
421  stack = auto_inspect()
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
426 
427 
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
436 
438  self._isModified=False
439  self._modifications = []
440 cms._ParameterTypeBase.resetModified = new_ParameterTypeBase_resetModified
441 
442 #### sequence history ####
443 
445  return ''
446 cms._Sequenceable._name_ = new__Sequenceable_name
447 
448 try:
449  # for backwards-compatibility with CMSSW_3_10_X
450  from FWCore.ParameterSet.SequenceTypes import _SequenceOperator
451 
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
455 except:
456  pass
457 
458 from FWCore.ParameterSet.SequenceTypes import _SequenceNegation, _SequenceIgnore, SequencePlaceholder
459 
461  return self._name
462 SequencePlaceholder._name_ = new__SequencePlaceholder_name
463 
465  if self._operand:
466  return '~'+str(self._operand._name_())
467  else:
468  return '~()'
469 _SequenceNegation._name_ = new__SequenceNegation_name
470 
472  if self._operand:
473  return '-'+str(self._operand._name_())
474  else:
475  return '-()'
476 _SequenceIgnore._name_ = new__SequenceIgnore_name
477 
479  if self._seq:
480  return '('+str(self._seq._name_())+')'
481  else:
482  return '()'
483 cms.Sequence._name_ = new_Sequence_name
484 
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
492 
493 def new__ModuleSequenceType__init__(self,*arg,**argv):
494  self._modifications = []
495  self.old__init__(*arg,**argv)
496 cms._ModuleSequenceType.old__init__ = cms._ModuleSequenceType.__init__
497 cms._ModuleSequenceType.__init__ = new__ModuleSequenceType__init__
498 
500  self._isModified=False
501  self._modifications = []
502 cms._ModuleSequenceType.resetModified = new__ModuleSequenceType_resetModified
503 
505  return self._isModified
506 cms._ModuleSequenceType.isModified = new__ModuleSequenceType_isModified
507 
509  returnValue = cms._ModuleSequenceType.__new__(type(self))
510  returnValue.__init__(self._seq)
511  returnValue._isModified = self._isModified
512  returnValue._modifications = deepcopy(self._modifications)
513  return returnValue
514 cms._ModuleSequenceType.copy = new__ModuleSequenceType_copy
515 
516 def new__ModuleSequenceType_replace(self, original, replacement):
517  stack = auto_inspect()
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})
521  else:
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
526 
527 def new__ModuleSequenceType_remove(self, original):
528  stack = auto_inspect()
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
534 
536  stack = auto_inspect()
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__
542 
544  stack = auto_inspect()
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__
550 
551 from FWCore.ParameterSet.Modules import Source
552 from FWCore.GuiBrowsers.editorTools import changeSource
553 
554 if __name__=='__main__':
555  import unittest
556  class TestModificationTracking(unittest.TestCase):
557  def setUp(self):
558  pass
559  def testPSet(self):
560  ex = cms.EDAnalyzer("Example",
561  one = cms.double(0),
562  two = cms.bool(True),
563  ps = cms.PSet(
564  three = cms.int32(10),
565  four = cms.string('abc')
566  ),
567  vps = cms.VPSet(
568  cms.PSet(
569  five = cms.InputTag('alpha')
570  ),
571  cms.PSet(
572  six = cms.vint32(1,2,3)
573  )
574  ),
575  seven = cms.vstring('alpha','bravo','charlie'),
576  eight = cms.vuint32(range(10)),
577  nine = cms.int32(0)
578  )
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')
587  ex.two = False
588  self.assertEqual(ex._modifications[-1]['name'],'two')
589  ex.ps.three.setValue(100) # MISSED
590  #self.assertEqual(ex.ps._modifications.pop()['name'],'three')
591  ex.ps.four = 'def'
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) # MISSED
596  #self.assertEqual(ex.vps[1]._modifications[-1]['name'],'six')
597  ex.seven[0] = 'delta' # MISSED
598  #self.assertEqual(ex._modifications[-1]['name'],'seven')
599  ex.eight.pop() # MISSED
600  #self.assertEqual(ex._modifications[-1]['name'],'eight')
601  del ex.nine
602  #self.assertEqual(ex._modifications[-1]['name'],'nine')
603  ex.newvpset = cms.VPSet()
604  self.assertEqual(ex._modifications[-1]['name'],'newvpset')
605 
606  process = cms.Process('unittest')
607  process.ex = ex
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)
612  #self.assert_('process.ex.three' in mods)
613  self.assert_('process.ex.ps.four' in mods)
614  self.assert_('process.ex.vps[0].five' in mods)
615  #self.assert_('process.ex.vps[1].six' in mods)
616  #self.assert_('process.ex.seven[0]' in mods)
617  #self.assert_('process.ex.eight' in mods)
618  self.assert_('process.ex.nine' in mods)
619  self.assert_('process.ex.newvpset' in mods)
620 
621 
622 
623  def testSeq(self):
624  process = cms.Process('unittest')
625  for i in range(10):
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,[])
631 
632  process.seq1.replace(process.f1,process.f0*process.f1)
633  self.assertEqual(process.seq1._modifications[-1]['action'],'replace')
634 
635  process.seq2.remove(process.f5)
636  self.assertEqual(process.seq2._modifications[-1]['action'],'remove')
637 
638  process.path = cms.Path(process.seq1*process.f7)
639  self.assertEqual(process.path._modifications,[])
640 
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')
647 
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)
652 
653  def testdumpHistory(self):
654  process = cms.Process('unittest')
655  process.source=Source("PoolSource",fileNames = cms.untracked.string("file:file.root"))
656 
657  changeSource(process,"file:filename.root")
658  self.assertEqual(changeSource._parameters['source'].value,"file:filename.root")
659 
660  changeSource(process,"file:filename2.root")
661  self.assertEqual(changeSource._parameters['source'].value,"file:filename2.root")
662 
663  changeSource(process,"file:filename3.root")
664  self.assertEqual(changeSource._parameters['source'].value,"file:filename3.root")
665 
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")
667 
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")
670 
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")
676 
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")
683 
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")
686 
688  process = cms.Process('unittest')
689  process.source=Source("PoolSource",fileNames = cms.untracked.string("file:file.root"))
690 
691  changeSource(process,"file:filename.root")
692  self.assertEqual(len(process.history()[0][1]),1)
693 
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)
697 
698  process.source.fileNames=["test2"]
699  self.assertEqual(len(process.history()[0][1]),1)
700  self.assertEqual(len(process.history()[1][1]),1)
701 
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)
706 
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)
712 
713  unittest.main()
714 
def new__placeLooper(self, name, mod)
def new__ModuleSequenceType_resetModified(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)
Definition: ECalSD.cc:37
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__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__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)
Definition: RemoteFile.cc:18
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 new_setattr(self, name, value)
def auto_inspect()
helpers for inspection ####
def new__placeSource(self, name, mod)
double split
Definition: MVATrainer.cc:139
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_Parameterizable_addParameter(self, name, value)
def new__place(self, name, mod, d)