CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SequenceTypes.py
Go to the documentation of this file.
1 
2 from Mixins import _ConfigureComponent, PrintOptions
3 from Mixins import _Labelable, _Unlabelable
4 from Mixins import _ValidatingParameterListBase
5 from ExceptionHandling import *
6 
8  """Information relevant for when a hard dependency,
9  which uses the * operator, is found"""
10  def __init__(self, sequenceName, depSet):
11  self.sequenceName = sequenceName
12  self.depSet = depSet
13 
15  """Denotes an object which can be placed in a sequence"""
16  def __init__(self):
17  pass
18  def __mul__(self,rhs):
19  return _SequenceCollection(self,rhs)
20  def __add__(self,rhs):
21  return _SequenceCollection(self,rhs)
22  def __invert__(self):
23  return _SequenceNegation(self)
24  def _clonesequence(self, lookuptable):
25  try:
26  return lookuptable[id(self)]
27  except:
28  raise KeyError("no "+str(type(self))+" with id "+str(id(self))+" found")
29  def resolve(self, processDict,keepIfCannotResolve=False):
30  return self
31  def isOperation(self):
32  """Returns True if the object is an operator (e.g. *,+ or !) type"""
33  return False
34  def isLeaf(self):
35  return False
36  def _visitSubNodes(self,visitor):
37  pass
38  def visitNode(self,visitor):
39  visitor.enter(self)
40  self._visitSubNodes(visitor)
41  visitor.leave(self)
42  def _appendToCollection(self,collection):
43  collection.append(self)
44 
45 def _checkIfSequenceable(caller, v):
46  if not isinstance(v,_Sequenceable):
47  typename = format_typename(caller)
48  msg = format_outerframe(2)
49  msg += "%s only takes arguments of types which are allowed in a sequence, but was given:\n" %typename
50  msg +=format_typename(v)
51  msg +="\nPlease remove the problematic object from the argument list"
52  raise TypeError(msg)
53 
55  if not isinstance(v,_BooleanLogicSequenceable):
56  typename = format_typename(caller)
57  msg = format_outerframe(2)
58  msg += "%s only takes arguments of types which are allowed in a boolean logic sequence, but was given:\n" %typename
59  msg +=format_typename(v)
60  msg +="\nPlease remove the problematic object from the argument list"
61  raise TypeError(msg)
62 
64  """Denotes an object which can be used in a boolean logic sequence"""
65  def __init__(self):
66  super(_BooleanLogicSequenceable,self).__init__()
67  def __or__(self,other):
68  return _BooleanLogicExpression(_BooleanLogicExpression.OR,self,other)
69  def __and__(self,other):
70  return _BooleanLogicExpression(_BooleanLogicExpression.AND,self,other)
71 
72 
74  """Contains the operation of a boolean logic expression"""
75  OR = 0
76  AND = 1
77  def __init__(self,op,left,right):
80  self._op = op
81  self._items = list()
82  #if either the left or right side are the same kind of boolean expression
83  # then we can just add their items to our own. This keeps the expression
84  # tree more compact
85  if isinstance(left,_BooleanLogicExpression) and left._op == self._op:
86  self._items.extend(left._items)
87  else:
88  self._items.append(left)
89  if isinstance(right,_BooleanLogicExpression) and right._op == self._op:
90  self._items.extend(right._items)
91  else:
92  self._items.append(right)
93  def isOperation(self):
94  return True
95  def _visitSubNodes(self,visitor):
96  for i in self._items:
97  i.visitNode(visitor)
98  def dumpSequencePython(self):
99  returnValue = ''
100  join = ''
101  operatorJoin =self.operatorString()
102  for m in self._items:
103  returnValue +=join
104  join = operatorJoin
105  if not isinstance(m,_BooleanLogicSequenceLeaf):
106  returnValue += '('+m.dumpSequencePython()+')'
107  else:
108  returnValue += m.dumpSequencePython()
109  return returnValue
110  def operatorString(self):
111  returnValue ='|'
112  if self._op == self.AND:
113  returnValue = '&'
114  return returnValue
115 
116 
118  def __init__(self):
119  pass
120  def isLeaf(self):
121  return True
122 
123 
125  def __init__(self):
126  pass
127  def isLeaf(self):
128  return True
129 
131  """Holds representation of the operations without having to use recursion.
132  Operations are added to the beginning of the list and their operands are
133  added to the end of the list, with the left added before the right
134  """
135  def __init__(self,*seqList):
136  self._collection = list()
137  for s in seqList:
138  _checkIfSequenceable(self,s)
139  s._appendToCollection(self._collection)
140  def __mul__(self,rhs):
141  _checkIfSequenceable(self,rhs)
142  rhs._appendToCollection(self._collection)
143  return self
144  def __add__(self,rhs):
145  _checkIfSequenceable(self,rhs)
146  rhs._appendToCollection(self._collection)
147  return self
148  def __str__(self):
149  sep = ''
150  returnValue = ''
151  for m in self._collection:
152  if m is not None:
153  returnValue += sep+str(m)
154  sep = '+'
155  return returnValue
156  def _appendToCollection(self,collection):
157  collection.extend(self._collection)
159  returnValue = self._collection[0].dumpSequencePython()
160  for m in self._collection[1:]:
161  returnValue += '+'+m.dumpSequencePython()
162  return returnValue
164  returnValue = self._collection[0].dumpSequenceConfig()
165  for m in self._collection[1:]:
166  returnValue += '&'+m.dumpSequenceConfig()
167  return returnValue
168  def visitNode(self,visitor):
169  for m in self._collection:
170  m.visitNode(visitor)
171  def resolve(self, processDict,keepIfCannotResolve=False):
172  self._collection = [x.resolve(processDict,keepIfCannotResolve) for x in self._collection]
173  return self
174  def index(self,item):
175  return self._collection.index(item)
176  def insert(self,index,item):
177  self._collection.insert(index,item)
178 
179 
180 
182  """Base class for classes which define a sequence of modules"""
183  def __init__(self,*arg, **argv):
184  self.__dict__["_isFrozen"] = False
185  self._seq = None
186  if len(arg) > 1:
187  typename = format_typename(self)
188  msg = format_outerframe(2)
189  msg += "%s takes exactly one input value. But the following ones are given:\n" %typename
190  for item,i in zip(arg, xrange(1,20)):
191  msg += " %i) %s \n" %(i, item._errorstr())
192  msg += "Maybe you forgot to combine them via '*' or '+'."
193  raise TypeError(msg)
194  if len(arg)==1:
195  _checkIfSequenceable(self, arg[0])
196  self._seq = _SequenceCollection()
197  arg[0]._appendToCollection(self._seq._collection)
198  self._isModified = False
199  def isFrozen(self):
200  return self._isFrozen
201  def setIsFrozen(self):
202  self._isFrozen = True
203  def _place(self,name,proc):
204  self._placeImpl(name,proc)
205  def __imul__(self,rhs):
206  _checkIfSequenceable(self, rhs)
207  if self._seq is None:
208  self.__dict__["_seq"] = _SequenceCollection()
209  self._seq+=rhs
210  return self
211  def __iadd__(self,rhs):
212  _checkIfSequenceable(self, rhs)
213  if self._seq is None:
214  self.__dict__["_seq"] = _SequenceCollection()
215  self._seq += rhs
216  return self
217  def __str__(self):
218  return str(self._seq)
219  def dumpConfig(self, options):
220  s = ''
221  if self._seq is not None:
222  s = self._seq.dumpSequenceConfig()
223  return '{'+s+'}\n'
224  def dumpPython(self, options):
225  """Returns a string which is the python representation of the object"""
226  s=''
227  if self._seq is not None:
228  s =self._seq.dumpSequencePython()
229  return 'cms.'+type(self).__name__+'('+s+')\n'
231  """Returns a string which contains the python representation of just the internal sequence"""
232  # only dump the label, if possible
233  if self.hasLabel_():
234  return _Labelable.dumpSequencePython(self)
235  else:
236  # dump it verbose
237  if self._seq is None:
238  return ''
239  return '('+self._seq.dumpSequencePython()+')'
241  """Returns a string which contains the old config language representation of just the internal sequence"""
242  # only dump the label, if possible
243  if self.hasLabel_():
244  return _Labelable.dumpSequenceConfig(self)
245  else:
246  # dump it verbose
247  if self._seq is None:
248  return ''
249  return '('+self._seq.dumpSequenceConfig()+')'
250  def __repr__(self):
251  s = ''
252  if self._seq is not None:
253  s = str(self._seq)
254  return "cms."+type(self).__name__+'('+s+')\n'
255  def moduleNames(self):
256  """Returns a set containing the names of all modules being used"""
257  result = set()
258  visitor = NodeNameVisitor(result)
259  self.visit(visitor)
260  return result
261  def copy(self):
262  returnValue =_ModuleSequenceType.__new__(type(self))
263  if self._seq is not None:
264  returnValue.__init__(self._seq)
265  else:
266  returnValue.__init__()
267  return returnValue
268  def copyAndExclude(self,listOfModulesToExclude):
269  """Returns a copy of the sequence which exlcudes those module in 'listOfModulesToExclude'"""
270  v = _CopyAndExcludeSequenceVisitor(listOfModulesToExclude)
271  self.visit(v)
272  result = self.__new__(type(self))
273  result.__init__(v.result())
274  return result
275  def expandAndClone(self):
276  visitor = ExpandVisitor(type(self))
277  self.visit(visitor)
278  return visitor.result()
279  def _postProcessFixup(self,lookuptable):
280  self._seq = self._seq._clonesequence(lookuptable)
281  return self
282  def replace(self, original, replacement):
283  """Finds all instances of 'original' and substitutes 'replacement' for them.
284  Returns 'True' if a replacement occurs."""
285  if not isinstance(original,_Sequenceable) or not isinstance(replacement,_Sequenceable):
286  raise TypeError("replace only works with sequenceable objects")
287  else:
288  v = _CopyAndReplaceSequenceVisitor(original,replacement)
289  self.visit(v)
290  if v.didReplace():
291  self._seq = v.result()
292  return v.didReplace()
293  def index(self,item):
294  """Returns the index at which the item is found or raises an exception"""
295  if self._seq is not None:
296  return self._seq.index(item)
297  raise ValueError(str(item)+" is not in the sequence")
298  def insert(self,index,item):
299  """Inserts the item at the index specified"""
300  _checkIfSequenceable(self, item)
301  self._seq.insert(index,item)
302  def remove(self, something):
303  """Remove the first occurrence of 'something' (a sequence or a module)
304  Returns 'True' if the module has been removed, False if it was not found"""
306  self.visit(v)
307  if v.didRemove():
308  self._seq = v.result()
309  return v.didRemove()
310  def resolve(self, processDict,keepIfCannotResolve=False):
311  if self._seq is not None:
312  self._seq = self._seq.resolve(processDict,keepIfCannotResolve)
313  return self
314  def __setattr__(self,name,value):
315  if not name.startswith("_"):
316  raise AttributeError, "You cannot set parameters for sequence like objects."
317  else:
318  self.__dict__[name] = value
319  #def replace(self,old,new):
320  #"""Find all instances of old and replace with new"""
321  #def insertAfter(self,which,new):
322  #"""new will depend on which but nothing after which will depend on new"""
323  #((a*b)*c) >> insertAfter(b,N) >> ((a*b)*(N+c))
324  #def insertBefore(self,which,new):
325  #"""new will be independent of which"""
326  #((a*b)*c) >> insertBefore(b,N) >> ((a*(N+b))*c)
327  #def __contains__(self,item):
328  #"""returns whether or not 'item' is in the sequence"""
329  #def modules_(self):
330  def nameInProcessDesc_(self, myname):
331  return myname
332  def insertInto(self, parameterSet, myname, processDict):
333  # represented just as a list of names in the ParameterSet
334  l = []
335  #resolver = ResolveVisitor(processDict)
336  lister = DecoratedNodeNameVisitor(l)
337  #self.visit(resolver)
338  self.resolve(processDict)
339  self.visit(lister)
340  parameterSet.addVString(True, myname, l)
341  def visit(self,visitor):
342  """Passes to visitor's 'enter' and 'leave' method each item describing the module sequence.
343  If the item contains 'sub' items then visitor will see those 'sub' items between the
344  item's 'enter' and 'leave' calls.
345  """
346  if self._seq is not None:
347  self._seq.visitNode(visitor)
348 
350  """For ~ and - operators"""
351  def __init__(self, operand):
352  self._operand = operand
353  if isinstance(operand, _ModuleSequenceType):
354  raise RuntimeError("This operator cannot accept a sequence")
355  def __eq__(self, other):
356  # allows replace(~a, b)
357  return type(self) == type(other) and self._operand==other._operand
358  def __ne__(self, other):
359  return not self.__eq__(other)
360  def _findDependencies(self,knownDeps, presentDeps):
361  self._operand._findDependencies(knownDeps, presentDeps)
362  def _clonesequence(self, lookuptable):
363  return type(self)(self._operand._clonesequence(lookuptable))
364  def _replace(self, original, replacement):
365  if self._operand == original:
366  self._operand = replacement
367  else:
368  self._operand._replace(original, replacement)
369  def _remove(self, original):
370  if (self._operand == original): return (None, True)
371  (self._operand, found) = self._operand._remove(original)
372  if self._operand == None: return (None, True)
373  return (self, found)
374  def resolve(self, processDict,keepIfCannotResolve=False):
375  self._operand = self._operand.resolve(processDict,keepIfCannotResolve)
376  return self
377  def isOperation(self):
378  return True
379  def _visitSubNodes(self,visitor):
380  self._operand.visitNode(visitor)
381  def decoration(self):
382  self._operand.decoration()
383 
384 
386  """Used in the expression tree for a sequence as a stand in for the '!' operator"""
387  def __init__(self, operand):
388  super(_SequenceNegation,self).__init__(operand)
389  def __str__(self):
390  return '~%s' %self._operand
392  return '!%s' %self._operand.dumpSequenceConfig()
394  if self._operand.isOperation():
395  return '~(%s)' %self._operand.dumpSequencePython()
396  return '~%s' %self._operand.dumpSequencePython()
397  def decoration(self):
398  return '!'
399 
401  """Used in the expression tree for a sequence as a stand in for the '-' operator"""
402  def __init__(self, operand):
403  super(_SequenceIgnore,self).__init__(operand)
404  def __str__(self):
405  return 'cms.ignore(%s)' %self._operand
407  return '-%s' %self._operand.dumpSequenceConfig()
409  return 'cms.ignore(%s)' %self._operand.dumpSequencePython()
410  def decoration(self):
411  return '-'
412 
413 def ignore(seq):
414  """The EDFilter passed as an argument will be run but its filter value will be ignored
415  """
416  return _SequenceIgnore(seq)
417 
419  def __init__(self,*arg,**argv):
420  super(Path,self).__init__(*arg,**argv)
421  def _placeImpl(self,name,proc):
422  proc._placePath(name,self)
423 
425  def __init__(self,*arg,**argv):
426  super(EndPath,self).__init__(*arg,**argv)
427  def _placeImpl(self,name,proc):
428  proc._placeEndPath(name,self)
429 
431  def __init__(self,*arg,**argv):
432  super(Sequence,self).__init__(*arg,**argv)
433  def _placeImpl(self,name,proc):
434  proc._placeSequence(name,self)
435  def _clonesequence(self, lookuptable):
436  if id(self) not in lookuptable:
437  #for sequences held by sequences we need to clone
438  # on the first reference
439  if self._seq is not None:
440  clone = type(self)(self._seq._clonesequence(lookuptable))
441  else:
442  clone = type(self)()
443  lookuptable[id(self)]=clone
444  lookuptable[id(clone)]=clone
445  return lookuptable[id(self)]
446  def _visitSubNodes(self,visitor):
447  self.visit(visitor)
448 
450  def __init__(self, name):
451  self._name = name
452  def _placeImpl(self,name,proc):
453  pass
454  def __str__(self):
455  return self._name
456  def insertInto(self, parameterSet, myname):
457  raise RuntimeError("The SequencePlaceholder "+self._name
458  +" was never overridden")
459  def resolve(self, processDict,keepIfCannotResolve=False):
460  if not self._name in processDict:
461  #print str(processDict.keys())
462  if keepIfCannotResolve:
463  return self
464  raise RuntimeError("The SequencePlaceholder "+self._name+ " cannot be resolved.\n Known keys are:"+str(processDict.keys()))
465  o = processDict[self._name]
466  if not isinstance(o,_Sequenceable):
467  raise RuntimeError("The SequencePlaceholder "+self._name+ " refers to an object type which is not allowed to be on a sequence: "+str(type(o)))
468  return o.resolve(processDict)
469 
470  def _clonesequence(self, lookuptable):
471  if id(self) not in lookuptable:
472  #for sequences held by sequences we need to clone
473  # on the first reference
474  clone = type(self)(self._name)
475  lookuptable[id(self)]=clone
476  lookuptable[id(clone)]=clone
477  return lookuptable[id(self)]
478  def copy(self):
479  returnValue =SequencePlaceholder.__new__(type(self))
480  returnValue.__init__(self._name)
481  return returnValue
483  return 'cms.SequencePlaceholder("%s")' %self._name
485  return 'cms.SequencePlaceholder("%s")'%self._name
486  def dumpPython(self, options):
487  result = 'cms.SequencePlaceholder(\"'
488  if options.isCfg:
489  result += 'process.'
490  result += +self._name+'\")\n'
491 
492 
494  def __init__(self,*arg,**argv):
495  super(Schedule,self).__init__(*arg,**argv)
496  @staticmethod
497  def _itemIsValid(item):
498  return isinstance(item,Path) or isinstance(item,EndPath)
499  def copy(self):
500  import copy
501  return copy.copy(self)
502  def _place(self,label,process):
503  process.setPartialSchedule_(self,label)
504  def moduleNames(self):
505  result = set()
506  visitor = NodeNameVisitor(result)
507  for seq in self:
508  seq.visit(visitor)
509  return result
510 
511 
513  def __init__(self,d):
514  self.deps = d
515  def enter(self,visitee):
516  if isinstance(visitee,Sequence):
517  self.deps.append(visitee)
518  pass
519  def leave(self,visitee):
520  pass
521 
522 class ModuleNodeVisitor(object):
523  def __init__(self,l):
524  self.l = l
525  def enter(self,visitee):
526  if visitee.isLeaf():
527  self.l.append(visitee)
528  pass
529  def leave(self,visitee):
530  pass
531 
532 
533 class NodeNameVisitor(object):
534  """ takes a set as input"""
535  def __init__(self,l):
536  self.l = l
537  def enter(self,visitee):
538  if visitee.isLeaf():
539  self.l.add(visitee.label_())
540  pass
541  def leave(self,visitee):
542  pass
543 
544 
545 class ExpandVisitor(object):
546  """ Expands the sequence into leafs and UnaryOperators """
547  def __init__(self, type):
548  self._type = type
549  self.l = []
550  def enter(self,visitee):
551  if visitee.isLeaf():
552  self.l.append(visitee)
553  def leave(self, visitee):
554  if isinstance(visitee,_UnarySequenceOperator):
555  self.l[-1] = visitee
556  def result(self):
557  # why doesn't (sum(self.l) work?
558  seq = self.l[0]
559  if len(self.l) > 1:
560  for el in self.l[1:]:
561  seq += el
562  return self._type(seq)
563 
564 
565 
567  """ Adds any '!' or '-' needed. Takes a list """
568  def __init__(self,l):
569  self.l = l
570  self._decoration =''
571  def enter(self,visitee):
572  if visitee.isLeaf():
573  if hasattr(visitee, "_Labelable__label"):
574  self.l.append(self._decoration+visitee.label_())
575  else:
576  error = "An object in a sequence was not found in the process\n"
577  if hasattr(visitee, "_filename"):
578  error += "From file " + visitee._filename
579  else:
580  error += "Dump follows\n" + repr(visitee)
581  raise RuntimeError(error)
582  if isinstance(visitee,_BooleanLogicExpression):
583  self.l.append(self._decoration+visitee.operatorString())
584  if isinstance(visitee,_UnarySequenceOperator):
585  self._decoration=visitee.decoration()
586  else:
587  self._decoration=''
588 
589  def leave(self,visitee):
590  if isinstance(visitee,_BooleanLogicExpression):
591  #need to add the 'go back' command to keep track of where we are in the tree
592  self.l.append('@')
593 
594 
596  """ Doesn't seem to work """
597  def __init__(self,processDict):
598  self.processDict = processDict
599  def enter(self,visitee):
600  if isinstance(visitee, SequencePlaceholder):
601  if not visitee._name in self.processDict:
602  #print str(self.processDict.keys())
603  raise RuntimeError("The SequencePlaceholder "+visitee._name+ " cannot be resolved.\n Known keys are:"+str(self.processDict.keys()))
604  visitee = self.processDict[visitee._name]
605  def leave(self,visitee):
606  if isinstance(visitee, SequencePlaceholder):
607  pass
608 
609 
611  """Traverses a Sequence and constructs a new sequence which does not contain modules from the specified list"""
612  def __init__(self,modulesToRemove):
613  self.__modulesToIgnore = modulesToRemove
614  self.__stack = list()
615  self.__stack.append(list())
616  self.__result = None
617  self.__didExclude = False
618  def enter(self,visitee):
619  if len(self.__stack) > 0:
620  #add visitee to its parent's stack entry
621  self.__stack[-1].append([visitee,False])
622  if visitee.isLeaf():
623  if visitee in self.__modulesToIgnore:
624  self.__didExclude = True
625  self.__stack[-1][-1]=[None,True]
626  elif isinstance(visitee, Sequence):
627  if visitee in self.__modulesToIgnore:
628  self.__didExclude = True
629  self.__stack[-1][-1]=[None,True]
630  self.__stack.append(list())
631  else:
632  #need to add a stack entry to keep track of children
633  self.__stack.append(list())
634  def leave(self,visitee):
635  node = visitee
636  if not visitee.isLeaf():
637  #were any children changed?
638  l = self.__stack[-1]
639  changed = False
640  countNulls = 0
641  nonNulls = list()
642  for c in l:
643  if c[1] == True:
644  changed = True
645  if c[0] is None:
646  countNulls +=1
647  else:
648  nonNulls.append(c[0])
649  if changed:
650  self.__didExclude = True
651  if countNulls != 0:
652  #this node must go away
653  if len(nonNulls) == 0:
654  #all subnodes went away
655  node = None
656  else:
657  node = nonNulls[0]
658  for n in nonNulls[1:]:
659  node = node+n
660  else:
661  #some child was changed so we need to clone
662  # this node and replace it with one that holds
663  # the new child(ren)
664  children = [x[0] for x in l ]
665  if not isinstance(visitee,Sequence):
666  node = visitee.__new__(type(visitee))
667  node.__init__(*children)
668  else:
669  node = nonNulls[0]
670  if node != visitee:
671  #we had to replace this node so now we need to
672  # change parent's stack entry as well
673  if len(self.__stack) > 1:
674  p = self.__stack[-2]
675  #find visitee and replace
676  for i,c in enumerate(p):
677  if c[0]==visitee:
678  c[0]=node
679  c[1]=True
680  break
681  if not visitee.isLeaf():
682  self.__stack = self.__stack[:-1]
683  def result(self):
684  result = None
685  for n in (x[0] for x in self.__stack[0]):
686  if n is None:
687  continue
688  if result is None:
689  result = n
690  else:
691  result = result+n
692  return result
693  def didExclude(self):
694  return self.__didExclude
695 
696 
698  """Traverses a Sequence and constructs a new sequence by applying the operator to each element of the sequence"""
699  def __init__(self,operator):
700  self.__operator = operator
701  self.__stack = list()
702  self.__stack.append(list())
703  self.__result = None
704  self.__didApply = False
705  def enter(self,visitee):
706  if len(self.__stack) > 0:
707  #add visitee to its parent's stack entry
708  self.__stack[-1].append([visitee,False])
709  v = self.__operator(visitee)
710  if v is not visitee:
711  #was changed
712  self.__didApply = True
713  self.__stack[-1][-1]=[v,True]
714  if not isinstance(visitee, _SequenceLeaf):
715  #need to add a stack entry to keep track of children
716  self.__stack.append(list())
717  def leave(self,visitee):
718  node = visitee
719  if not visitee.isLeaf():
720  #were any children changed?
721  l = self.__stack[-1]
722  changed = False
723  countNulls = 0
724  nonNulls = list()
725  for c in l:
726  if c[1] == True:
727  changed = True
728  if c[0] is None:
729  countNulls +=1
730  else:
731  nonNulls.append(c[0])
732  if changed:
733  if countNulls != 0:
734  #this node must go away
735  if len(nonNulls) == 0:
736  #all subnodes went away
737  node = None
738  else:
739  node = nonNulls[0]
740  for n in nonNulls[1:]:
741  node = node+n
742  else:
743  #some child was changed so we need to clone
744  # this node and replace it with one that holds
745  # the new child(ren)
746  children = [x[0] for x in l ]
747  if not isinstance(visitee,Sequence):
748  node = visitee.__new__(type(visitee))
749  node.__init__(*children)
750  else:
751  node = nonNulls[0]
752  for n in nonNulls[1:]:
753  node = node+n
754 
755  if node != visitee:
756  #we had to replace this node so now we need to
757  # change parent's stack entry as well
758  if len(self.__stack) > 1:
759  p = self.__stack[-2]
760  #find visitee and replace
761  for i,c in enumerate(p):
762  if c[0]==visitee:
763  c[0]=node
764  c[1]=True
765  break
766  if not visitee.isLeaf():
767  self.__stack = self.__stack[:-1]
768  def result(self):
769  result = None
770  for n in (x[0] for x in self.__stack[0]):
771  if n is None:
772  continue
773  if result is None:
774  result = n
775  else:
776  result = result+n
777  return result
778  def _didApply(self):
779  return self.__didApply
780 
782  """Traverses a Sequence and constructs a new sequence which does not contain modules from the specified list"""
783  def __init__(self,moduleToRemove):
784  class _RemoveFirstOperator(object):
785  def __init__(self,moduleToRemove):
786  self.__moduleToRemove = moduleToRemove
787  self.__found = False
788  def __call__(self,test):
789  if not self.__found and test is self.__moduleToRemove:
790  self.__found = True
791  return None
792  return test
793  super(type(self),self).__init__(_RemoveFirstOperator(moduleToRemove))
794  def didRemove(self):
795  return self._didApply()
796 
798  """Traverses a Sequence and constructs a new sequence which does not contain the module specified"""
799  def __init__(self,modulesToRemove):
800  class _ExcludeOperator(object):
801  def __init__(self,modulesToRemove):
802  self.__modulesToIgnore = modulesToRemove
803  def __call__(self,test):
804  if test in modulesToRemove:
805  return None
806  return test
807  super(type(self),self).__init__(_ExcludeOperator(modulesToRemove))
808  def didExclude(self):
809  return self._didApply()
810 
812  """Traverses a Sequence and constructs a new sequence which replaces a specified module with a different module"""
813  def __init__(self,target,replace):
814  class _ReplaceOperator(object):
815  def __init__(self,target,replace):
816  self.__target = target
817  self.__replace = replace
818  def __call__(self,test):
819  if test == self.__target:
820  return self.__replace
821  return test
822  super(type(self),self).__init__(_ReplaceOperator(target,replace))
823  def didReplace(self):
824  return self._didApply()
825 
826 
827 
828 if __name__=="__main__":
829  import unittest
831  def __init__(self,name):
832  self.setLabel(name)
834  def __init__(self,name):
835  self.setLabel(name)
836  class TestModuleCommand(unittest.TestCase):
837  def setUp(self):
838  """Nothing to do """
839  pass
840  def testBoolean(self):
841  a = DummyBooleanModule("a")
842  b = DummyBooleanModule("b")
843  p = Path( a & b)
844  self.assertEqual(p.dumpPython(None),"cms.Path(process.a&process.b)\n")
845  l = list()
846  namesVisitor = DecoratedNodeNameVisitor(l)
847  p.visit(namesVisitor)
848  self.assertEqual(l,['&','a','b','@'])
849  p2 = Path( a | b)
850  self.assertEqual(p2.dumpPython(None),"cms.Path(process.a|process.b)\n")
851  l[:]=[]
852  p2.visit(namesVisitor)
853  self.assertEqual(l,['|','a','b','@'])
854  c = DummyBooleanModule("c")
855  d = DummyBooleanModule("d")
856  p3 = Path(a & b & c & d)
857  self.assertEqual(p3.dumpPython(None),"cms.Path(process.a&process.b&process.c&process.d)\n")
858  l[:]=[]
859  p3.visit(namesVisitor)
860  self.assertEqual(l,['&','a','b','c','d','@'])
861  p3 = Path(((a & b) & c) & d)
862  self.assertEqual(p3.dumpPython(None),"cms.Path(process.a&process.b&process.c&process.d)\n")
863  p3 = Path(a & (b & (c & d)))
864  self.assertEqual(p3.dumpPython(None),"cms.Path(process.a&process.b&process.c&process.d)\n")
865  p3 = Path((a & b) & (c & d))
866  self.assertEqual(p3.dumpPython(None),"cms.Path(process.a&process.b&process.c&process.d)\n")
867  p3 = Path(a & (b & c) & d)
868  self.assertEqual(p3.dumpPython(None),"cms.Path(process.a&process.b&process.c&process.d)\n")
869  p4 = Path(a | b | c | d)
870  self.assertEqual(p4.dumpPython(None),"cms.Path(process.a|process.b|process.c|process.d)\n")
871  p5 = Path(a | b & c & d )
872  self.assertEqual(p5.dumpPython(None),"cms.Path(process.a|(process.b&process.c&process.d))\n")
873  l[:]=[]
874  p5.visit(namesVisitor)
875  self.assertEqual(l,['|','a','&','b','c','d','@','@'])
876  p5 = Path(a & b | c & d )
877  self.assertEqual(p5.dumpPython(None),"cms.Path((process.a&process.b)|(process.c&process.d))\n")
878  l[:]=[]
879  p5.visit(namesVisitor)
880  self.assertEqual(l,['|','&','a','b','@','&','c','d','@','@'])
881  p5 = Path(a & (b | c) & d )
882  self.assertEqual(p5.dumpPython(None),"cms.Path(process.a&(process.b|process.c)&process.d)\n")
883  l[:]=[]
884  p5.visit(namesVisitor)
885  self.assertEqual(l,['&','a','|','b','c','@','d','@'])
886  p5 = Path(a & b & c | d )
887  self.assertEqual(p5.dumpPython(None),"cms.Path((process.a&process.b&process.c)|process.d)\n")
888  l[:]=[]
889  p5.visit(namesVisitor)
890  self.assertEqual(l,['|','&','a','b','c','@','d','@'])
891  p6 = Path( a & ~b)
892  self.assertEqual(p6.dumpPython(None),"cms.Path(process.a&(~process.b))\n")
893  l[:]=[]
894  p6.visit(namesVisitor)
895  self.assertEqual(l,['&','a','!b','@'])
896  p6 = Path( a & ignore(b))
897  self.assertEqual(p6.dumpPython(None),"cms.Path(process.a&(cms.ignore(process.b)))\n")
898  l[:]=[]
899  p6.visit(namesVisitor)
900  self.assertEqual(l,['&','a','-b','@'])
901  p6 = Path(~(a&b))
902  self.assertEqual(p6.dumpPython(None),"cms.Path(~(process.a&process.b))\n")
903  l[:]=[]
904  p6.visit(namesVisitor)
905  self.assertEqual(l,['!&','a','b','@'])
906 
907  def testDumpPython(self):
908  a = DummyModule("a")
909  b = DummyModule('b')
910  p = Path((a*b))
911  #print p.dumpConfig('')
912  self.assertEqual(p.dumpPython(None),"cms.Path(process.a+process.b)\n")
913  p2 = Path((b+a))
914  #print p2.dumpConfig('')
915  self.assertEqual(p2.dumpPython(None),"cms.Path(process.b+process.a)\n")
916  c = DummyModule('c')
917  p3 = Path(c*(a+b))
918  #print p3.dumpConfig('')
919  self.assertEqual(p3.dumpPython(None),"cms.Path(process.c+process.a+process.b)\n")
920  p4 = Path(c*a+b)
921  #print p4.dumpConfig('')
922  self.assertEqual(p4.dumpPython(None),"cms.Path(process.c+process.a+process.b)\n")
923  p5 = Path(a+ignore(b))
924  #print p5.dumpConfig('')
925  self.assertEqual(p5.dumpPython(None),"cms.Path(process.a+cms.ignore(process.b))\n")
926  p6 = Path(c+a*b)
927  #print p6.dumpConfig('')
928  self.assertEqual(p6.dumpPython(None),"cms.Path(process.c+process.a+process.b)\n")
929  p7 = Path(a+~b)
930  self.assertEqual(p7.dumpPython(None),"cms.Path(process.a+~process.b)\n")
931  p8 = Path((a+b)*c)
932  self.assertEqual(p8.dumpPython(None),"cms.Path(process.a+process.b+process.c)\n")
933  l = list()
934  namesVisitor = DecoratedNodeNameVisitor(l)
935  p.visit(namesVisitor)
936  self.assertEqual(l, ['a', 'b'])
937  l[:] = []
938  p5.visit(namesVisitor)
939  self.assertEqual(l, ['a', '-b'])
940  l[:] = []
941  p7.visit(namesVisitor)
942  self.assertEqual(l, ['a', '!b'])
943  l[:] = []
944  moduleVisitor = ModuleNodeVisitor(l)
945  p8.visit(moduleVisitor)
946  names = [m.label_() for m in l]
947  self.assertEqual(names, ['a', 'b', 'c'])
948  def testDumpConfig(self):
949  a = DummyModule("a")
950  b = DummyModule('b')
951  p = Path((a*b))
952  #print p.dumpConfig('')
953  self.assertEqual(p.dumpConfig(None),"{a&b}\n")
954  p2 = Path((b+a))
955  #print p2.dumpConfig('')
956  self.assertEqual(p2.dumpConfig(None),"{b&a}\n")
957  c = DummyModule('c')
958  p3 = Path(c*(a+b))
959  #print p3.dumpConfig('')
960  self.assertEqual(p3.dumpConfig(None),"{c&a&b}\n")
961  p4 = Path(c*a+b)
962  #print p4.dumpConfig('')
963  self.assertEqual(p4.dumpConfig(None),"{c&a&b}\n")
964  p5 = Path(a+ignore(b))
965  #print p5.dumpConfig('')
966  self.assertEqual(p5.dumpConfig(None),"{a&-b}\n")
967  p6 = Path(c+a*b)
968  #print p6.dumpConfig('')
969  self.assertEqual(p6.dumpConfig(None),"{c&a&b}\n")
970  p7 = Path(a+~b)
971  self.assertEqual(p7.dumpConfig(None),"{a&!b}\n")
972  p8 = Path((a+b)*c)
973  self.assertEqual(p8.dumpConfig(None),"{a&b&c}\n")
974  def testVisitor(self):
975  class TestVisitor(object):
976  def __init__(self, enters, leaves):
977  self._enters = enters
978  self._leaves = leaves
979  def enter(self,visitee):
980  #print visitee.dumpSequencePython()
981  if self._enters[0] != visitee:
982  raise RuntimeError("wrong node ("+str(visitee)+") on 'enter'")
983  else:
984  self._enters = self._enters[1:]
985  def leave(self,visitee):
986  if self._leaves[0] != visitee:
987  raise RuntimeError("wrong node ("+str(visitee)+") on 'leave'\n expected ("+str(self._leaves[0])+")")
988  else:
989  self._leaves = self._leaves[1:]
990  a = DummyModule("a")
991  b = DummyModule('b')
992  multAB = a*b
993  p = Path(multAB)
994  t = TestVisitor(enters=[a,b],
995  leaves=[a,b])
996  p.visit(t)
997 
998  plusAB = a+b
999  p = Path(plusAB)
1000  t = TestVisitor(enters=[a,b],
1001  leaves=[a,b])
1002  p.visit(t)
1003 
1004  s=Sequence(plusAB)
1005  c=DummyModule("c")
1006  multSC = s*c
1007  p=Path(multSC)
1008  t=TestVisitor(enters=[s,a,b,c],
1009  leaves=[a,b,s,c])
1010  p.visit(t)
1011 
1012  notA= ~a
1013  p=Path(notA)
1014  t=TestVisitor(enters=[notA,a],leaves=[a,notA])
1015  p.visit(t)
1016  def testResolve(self):
1017  m1 = DummyModule("m1")
1018  m2 = DummyModule("m2")
1019  s1 = Sequence(m1)
1020  s2 = SequencePlaceholder("s3")
1021  s3 = Sequence(m2)
1022  p = Path(s1*s2)
1023  l = list()
1024  d = dict()
1025  d['s1'] = s1
1026  d['s2'] = s2
1027  d['s3'] = s3
1028  #resolver = ResolveVisitor(d)
1029  #p.visit(resolver)
1030  namesVisitor = DecoratedNodeNameVisitor(l)
1031  p.visit(namesVisitor)
1032  self.assertEqual(l, ['m1'])
1033  p.resolve(d)
1034  l[:] = []
1035  p.visit(namesVisitor)
1036  self.assertEqual(l, ['m1', 'm2'])
1037  l[:]=[]
1038  s1 = Sequence(m1)
1039  s2 = SequencePlaceholder("s3")
1040  s3 = Sequence(m2)
1041  s4 = SequencePlaceholder("s2")
1042  p=Path(s1+s4)
1043  p.resolve(d)
1044  p.visit(namesVisitor)
1045  self.assertEqual(l, ['m1', 'm2'])
1046  def testReplace(self):
1047  m1 = DummyModule("m1")
1048  m2 = DummyModule("m2")
1049  m3 = DummyModule("m3")
1050  m4 = DummyModule("m4")
1051  m5 = DummyModule("m5")
1052 
1053  s1 = Sequence(m1*~m2*m1*m2*ignore(m2))
1054  s2 = Sequence(m1*m2)
1055  l = []
1056  namesVisitor = DecoratedNodeNameVisitor(l)
1057  s1.visit(namesVisitor)
1058  self.assertEqual(l,['m1', '!m2', 'm1', 'm2', '-m2'])
1059 
1060  s3 = Sequence(~m1*s2)
1061  s3.replace(~m1, m2)
1062  l[:] = []
1063  s3.visit(namesVisitor)
1064  self.assertEqual(l, ['m2', 'm1', 'm2'])
1065 
1066  s1.replace(m2,m3)
1067  l[:] = []
1068  s1.visit(namesVisitor)
1069  self.assertEqual(l,['m1', '!m3', 'm1', 'm3', '-m3'])
1070  s2 = Sequence(m1*m2)
1071  s3 = Sequence(~m1*s2)
1072  l[:] = []
1073  s3.visit(namesVisitor)
1074  self.assertEqual(l,['!m1', 'm1', 'm2'])
1075  l[:] = []
1076  s3.replace(s2,m1)
1077  s3.visit(namesVisitor)
1078  self.assertEqual(l,['!m1', 'm1'])
1079 
1080  s1 = Sequence(m1+m2)
1081  s2 = Sequence(m3+m4)
1082  s3 = Sequence(s1+s2)
1083  s3.replace(m3,m5)
1084  l[:] = []
1085  s3.visit(namesVisitor)
1086  self.assertEqual(l,['m1','m2','m5','m4'])
1087  def testIndex(self):
1088  m1 = DummyModule("a")
1089  m2 = DummyModule("b")
1090  m3 = DummyModule("c")
1091 
1092  s = Sequence(m1+m2+m3)
1093  self.assertEqual(s.index(m1),0)
1094  self.assertEqual(s.index(m2),1)
1095  self.assertEqual(s.index(m3),2)
1096 
1097  def testInsert(self):
1098  m1 = DummyModule("a")
1099  m2 = DummyModule("b")
1100  m3 = DummyModule("c")
1101  s = Sequence(m1+m3)
1102  s.insert(1,m2)
1103  self.assertEqual(s.index(m1),0)
1104  self.assertEqual(s.index(m2),1)
1105  self.assertEqual(s.index(m3),2)
1106 
1107 
1109  m1 = DummyModule("m1")
1110  m2 = DummyModule("m2")
1111  m3 = DummyModule("m3")
1112  m4 = DummyModule("m4")
1113  m5 = DummyModule("m5")
1114 
1115  s1 = Sequence(m1*~m2*m1*m2*ignore(m2))
1116  s2 = Sequence(m1*m2)
1117  s3 = Sequence(~m1*s2)
1118 
1119  p = Path(s1+s3)
1120  p2 = p.expandAndClone()
1121  l = []
1122  namesVisitor = DecoratedNodeNameVisitor(l)
1123  p2.visit(namesVisitor)
1124  self.assertEqual(l, ['m1', '!m2', 'm1', 'm2', '-m2', '!m1', 'm1', 'm2'])
1125 
1126  def testAdd(self):
1127  m1 = DummyModule("m1")
1128  m2 = DummyModule("m2")
1129  m3 = DummyModule("m3")
1130  m4 = DummyModule("m4")
1131  s1 = Sequence(m1)
1132  s3 = Sequence(m3+ignore(m4))
1133  p = Path(s1)
1134  p += ~m2
1135  p *= s3
1136 
1137  l = []
1138  namesVisitor = DecoratedNodeNameVisitor(l)
1139  p.visit(namesVisitor)
1140  self.assertEqual(l, ['m1', '!m2', 'm3', '-m4'])
1141 
1142  s4 = Sequence()
1143  s4 +=m1
1144  print s1._seq.dumpSequencePython()
1145  l[:]=[]; s1.visit(namesVisitor); self.assertEqual(l,['m1'])
1146  self.assertEqual(s4.dumpPython(None),"cms.Sequence(process.m1)\n")
1147  s4 = Sequence()
1148  s4 *=m1
1149  l[:]=[]; s1.visit(namesVisitor); self.assertEqual(l,['m1'])
1150  self.assertEqual(s4.dumpPython(None),"cms.Sequence(process.m1)\n")
1151 
1152 
1153  def testRemove(self):
1154  m1 = DummyModule("m1")
1155  m2 = DummyModule("m2")
1156  m3 = DummyModule("m3")
1157  s1 = Sequence(m1*m2+~m3)
1158  s2 = Sequence(m1*s1)
1159  l = []
1160  namesVisitor = DecoratedNodeNameVisitor(l)
1161  d = {'m1':m1 ,'m2':m2, 'm3':m3,'s1':s1, 's2':s2}
1162  l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,['m1', 'm2', '!m3'])
1163  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m1', 'm1', 'm2', '!m3'])
1164  s1.remove(m2)
1165  l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,['m1', '!m3'])
1166  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m1', 'm1', '!m3'])
1167  s2.remove(m3)
1168  l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,['m1', '!m3'])
1169  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m1', 'm1'])
1170  s1 = Sequence( m1 + m2 + m1 + m2 )
1171  l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,['m1', 'm2', 'm1', 'm2'])
1172  s1.remove(m2)
1173  l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,['m1', 'm1', 'm2'])
1174  s1 = Sequence( m1 + m3 )
1175  s2 = Sequence( m2 + ignore(m3) + s1 + m3 )
1176  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m2', '-m3', 'm1', 'm3', 'm3'])
1177  s2.remove(s1)
1178  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m2', '-m3', 'm3'])
1179  s2.remove(m3)
1180  l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,['m2','m3'])
1181  s1 = Sequence(m1*m2*m3)
1182  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m2+process.m3)\n")
1183  s1.remove(m2)
1184  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m3)\n")
1185  s1 = Sequence(m1+m2+m3)
1186  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m2+process.m3)\n")
1187  s1.remove(m2)
1188  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m3)\n")
1189  s1 = Sequence(m1*m2+m3)
1190  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m2+process.m3)\n")
1191  s1.remove(m2)
1192  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m3)\n")
1193  s1 = Sequence(m1+m2*m3)
1194  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m2+process.m3)\n")
1195  s1.remove(m2)
1196  self.assertEqual(s1.dumpPython(None), "cms.Sequence(process.m1+process.m3)\n")
1197  s1.remove(m1)
1198  s1.remove(m3)
1199  l[:]=[]; s1.visit(namesVisitor); self.assertEqual(l,[])
1200  self.assertEqual(s1.dumpPython(None), "cms.Sequence()\n")
1201  s3 = Sequence(m1)
1202  s3.remove(m1)
1203  l[:]=[]; s3.visit(namesVisitor); self.assertEqual(l,[])
1204  self.assertEqual(s3.dumpPython(None), "cms.Sequence()\n")
1205  s3 = Sequence(m1)
1206  s4 = Sequence(s3)
1207  s4.remove(m1)
1208  l[:]=[]; s4.visit(namesVisitor); self.assertEqual(l,[])
1209  self.assertEqual(s4.dumpPython(None), "cms.Sequence()\n")
1210 
1212  a = DummyModule("a")
1213  b = DummyModule("b")
1214  c = DummyModule("c")
1215  d = DummyModule("d")
1216  s = Sequence(a+b+c)
1217  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1218  s = Sequence(a+b+c+d)
1219  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1220  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1221  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+process.d)\n")
1222  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1223  s=Sequence(a*b+c+d)
1224  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1225  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1226  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+process.d)\n")
1227  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1228  s = Sequence(a+b*c+d)
1229  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1230  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1231  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+process.d)\n")
1232  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1233  s2 = Sequence(a+b)
1234  s = Sequence(c+s2+d)
1235  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.c+process.b+process.d)\n")
1236  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.c+process.a+process.d)\n")
1237  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence((process.a+process.b)+process.d)\n")
1238  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.c+(process.a+process.b))\n")
1239  self.assertEqual(s.copyAndExclude([a,b]).dumpPython(None),"cms.Sequence(process.c+process.d)\n")
1240  s2 = Sequence(a+b+c)
1241  s = Sequence(s2+d)
1242  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1243  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1244  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+process.d)\n")
1245  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence((process.a+process.b+process.c))\n")
1246  s2 = Sequence(a+b+c)
1247  s = Sequence(s2*d)
1248  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1249  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1250  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+process.d)\n")
1251  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence((process.a+process.b+process.c))\n")
1252  self.assertEqual(s.copyAndExclude([a,b,c]).dumpPython(None),"cms.Sequence(process.d)\n")
1253  s = Sequence(ignore(a)+b+c+d)
1254  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1255  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(cms.ignore(process.a)+process.c+process.d)\n")
1256  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(cms.ignore(process.a)+process.b+process.d)\n")
1257  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(cms.ignore(process.a)+process.b+process.c)\n")
1258  s = Sequence(a+ignore(b)+c+d)
1259  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(cms.ignore(process.b)+process.c+process.d)\n")
1260  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1261  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+cms.ignore(process.b)+process.d)\n")
1262  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+cms.ignore(process.b)+process.c)\n")
1263  s = Sequence(a+b+c+ignore(d))
1264  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+cms.ignore(process.d))\n")
1265  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+cms.ignore(process.d))\n")
1266  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+cms.ignore(process.d))\n")
1267  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1268  s = Sequence(~a+b+c+d)
1269  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+process.d)\n")
1270  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(~process.a+process.c+process.d)\n")
1271  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(~process.a+process.b+process.d)\n")
1272  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(~process.a+process.b+process.c)\n")
1273  s = Sequence(a+~b+c+d)
1274  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(~process.b+process.c+process.d)\n")
1275  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+process.d)\n")
1276  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+~process.b+process.d)\n")
1277  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+~process.b+process.c)\n")
1278  s = Sequence(a+b+c+~d)
1279  self.assertEqual(s.copyAndExclude([a]).dumpPython(None),"cms.Sequence(process.b+process.c+~process.d)\n")
1280  self.assertEqual(s.copyAndExclude([b]).dumpPython(None),"cms.Sequence(process.a+process.c+~process.d)\n")
1281  self.assertEqual(s.copyAndExclude([c]).dumpPython(None),"cms.Sequence(process.a+process.b+~process.d)\n")
1282  self.assertEqual(s.copyAndExclude([d]).dumpPython(None),"cms.Sequence(process.a+process.b+process.c)\n")
1284  m1 = DummyModule("m1")
1285  m2 = DummyModule("m2")
1286  s1 = Sequence(m1*m2)
1287  def testRaise():
1288  s1.something = 1
1289  self.assertRaises(AttributeError,testRaise)
1290  def testRaise2():
1291  s2 = Sequence(m1*None)
1292  self.assertRaises(TypeError,testRaise2)
1293  def testCopy(self):
1294  a = DummyModule("a")
1295  b = DummyModule("b")
1296  c = DummyModule("c")
1297  p1 = Path(a+b+c)
1298  p2 = p1.copy()
1299  e = DummyModule("e")
1300  p2.replace(b,e)
1301  self.assertEqual(p1.dumpPython(None),"cms.Path(process.a+process.b+process.c)\n")
1302  self.assertEqual(p2.dumpPython(None),"cms.Path(process.a+process.e+process.c)\n")
1303  p1 = Path(a+b+c)
1304  p2 = p1.copy()
1305  p1 += e
1306  self.assertEqual(p1.dumpPython(None),"cms.Path(process.a+process.b+process.c+process.e)\n")
1307  self.assertEqual(p2.dumpPython(None),"cms.Path(process.a+process.b+process.c)\n")
1308 
1309  def testInsertInto(self):
1310  from FWCore.ParameterSet.Types import vstring
1311  class TestPSet(object):
1312  def __init__(self):
1313  self._dict = dict()
1314  def addVString(self,isTracked,label,value):
1315  self._dict[label]=value
1316  a = DummyModule("a")
1317  b = DummyModule("b")
1318  c = DummyModule("c")
1319  d = DummyModule("d")
1320  p = Path(a+b+c+d)
1321  ps = TestPSet()
1322  p.insertInto(ps,"p",dict())
1323  self.assertEqual(ps._dict, {"p":vstring("a","b","c","d")})
1324  s = Sequence(b+c)
1325  p = Path(a+s+d)
1326  ps = TestPSet()
1327  p.insertInto(ps,"p",dict())
1328  self.assertEqual(ps._dict, {"p":vstring("a","b","c","d")})
1329 
1330  unittest.main()
1331 
1332 
1333 
1334 
1335 
1336 
1337 
1338 
def _checkIfBooleanLogicSequenceable
list object
Definition: dbtoconf.py:77
def _checkIfSequenceable
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