2 from Mixins
import _ConfigureComponent, PrintOptions
3 from Mixins
import _Labelable, _Unlabelable
4 from Mixins
import _ValidatingParameterListBase
5 from ExceptionHandling
import *
8 """Information relevant for when a hard dependency,
9 which uses the * operator, is found"""
15 """Denotes an object which can be placed in a sequence"""
26 return lookuptable[id(self)]
28 raise KeyError(
"no "+str(type(self))+
" with id "+str(id(self))+
" found")
29 def resolve(self, processDict,keepIfCannotResolve=False):
32 """Returns True if the object is an operator (e.g. *,+ or !) type"""
40 self._visitSubNodes(visitor)
43 collection.append(self)
46 if not isinstance(v,_Sequenceable):
49 msg +=
"%s only takes arguments of types which are allowed in a sequence, but was given:\n" %typename
51 msg +=
"\nPlease remove the problematic object from the argument list"
55 if not isinstance(v,_BooleanLogicSequenceable):
58 msg +=
"%s only takes arguments of types which are allowed in a boolean logic sequence, but was given:\n" %typename
60 msg +=
"\nPlease remove the problematic object from the argument list"
64 """Denotes an object which can be used in a boolean logic sequence"""
66 super(_BooleanLogicSequenceable,self).
__init__()
74 """Contains the operation of a boolean logic expression"""
85 if isinstance(left,_BooleanLogicExpression)
and left._op == self.
_op:
86 self._items.extend(left._items)
88 self._items.append(left)
89 if isinstance(right,_BooleanLogicExpression)
and right._op == self.
_op:
90 self._items.extend(right._items)
92 self._items.append(right)
105 if not isinstance(m,_BooleanLogicSequenceLeaf):
106 returnValue +=
'('+m.dumpSequencePython()+
')'
108 returnValue += m.dumpSequencePython()
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
153 returnValue += sep+str(m)
161 returnValue +=
'+'+m.dumpSequencePython()
166 returnValue +=
'&'+m.dumpSequenceConfig()
171 def resolve(self, processDict,keepIfCannotResolve=False):
175 return self._collection.index(item)
177 self._collection.insert(index,item)
182 """Base class for classes which define a sequence of modules"""
184 self.__dict__[
"_isFrozen"] =
False
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 '+'."
197 arg[0]._appendToCollection(self._seq._collection)
204 self._placeImpl(name,proc)
207 if self.
_seq is None:
213 if self.
_seq is None:
218 return str(self.
_seq)
221 if self.
_seq is not None:
222 s = self._seq.dumpSequenceConfig()
225 """Returns a string which is the python representation of the object"""
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"""
234 return _Labelable.dumpSequencePython(self)
237 if self.
_seq is None:
239 return '('+self._seq.dumpSequencePython()+
')'
241 """Returns a string which contains the old config language representation of just the internal sequence"""
244 return _Labelable.dumpSequenceConfig(self)
247 if self.
_seq is None:
249 return '('+self._seq.dumpSequenceConfig()+
')'
252 if self.
_seq is not None:
254 return "cms."+type(self).__name__+
'('+s+
')\n'
256 """Returns a set containing the names of all modules being used"""
262 returnValue =_ModuleSequenceType.__new__(type(self))
263 if self.
_seq is not None:
264 returnValue.__init__(self.
_seq)
266 returnValue.__init__()
269 """Returns a copy of the sequence which exlcudes those module in 'listOfModulesToExclude'"""
272 result = self.__new__(type(self))
273 result.__init__(v.result())
278 return visitor.result()
280 self.
_seq = self._seq._clonesequence(lookuptable)
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")
291 self.
_seq = v.result()
292 return v.didReplace()
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")
299 """Inserts the item at the index specified"""
301 self._seq.insert(index,item)
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"""
308 self.
_seq = v.result()
310 def resolve(self, processDict,keepIfCannotResolve=False):
311 if self.
_seq is not None:
312 self.
_seq = self._seq.resolve(processDict,keepIfCannotResolve)
315 if not name.startswith(
"_"):
316 raise AttributeError,
"You cannot set parameters for sequence like objects."
318 self.__dict__[name] = value
340 parameterSet.addVString(
True, myname, l)
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.
346 if self.
_seq is not None:
347 self._seq.visitNode(visitor)
350 """For ~ and - operators"""
353 if isinstance(operand, _ModuleSequenceType):
354 raise RuntimeError(
"This operator cannot accept a sequence")
357 return type(self) == type(other)
and self.
_operand==other._operand
359 return not self.
__eq__(other)
361 self._operand._findDependencies(knownDeps, presentDeps)
363 return type(self)(self._operand._clonesequence(lookuptable))
368 self._operand._replace(original, replacement)
370 if (self.
_operand == original):
return (
None,
True)
371 (self.
_operand, found) = self._operand._remove(original)
372 if self.
_operand ==
None:
return (
None,
True)
374 def resolve(self, processDict,keepIfCannotResolve=False):
375 self.
_operand = self._operand.resolve(processDict,keepIfCannotResolve)
380 self._operand.visitNode(visitor)
382 self._operand.decoration()
386 """Used in the expression tree for a sequence as a stand in for the '!' operator"""
388 super(_SequenceNegation,self).
__init__(operand)
392 return '!%s' %self._operand.dumpSequenceConfig()
394 if self._operand.isOperation():
395 return '~(%s)' %self._operand.dumpSequencePython()
396 return '~%s' %self._operand.dumpSequencePython()
401 """Used in the expression tree for a sequence as a stand in for the '-' operator"""
403 super(_SequenceIgnore,self).
__init__(operand)
405 return 'cms.ignore(%s)' %self.
_operand
407 return '-%s' %self._operand.dumpSequenceConfig()
409 return 'cms.ignore(%s)' %self._operand.dumpSequencePython()
414 """The EDFilter passed as an argument will be run but its filter value will be ignored
420 super(Path,self).
__init__(*arg,**argv)
422 proc._placePath(name,self)
426 super(EndPath,self).
__init__(*arg,**argv)
428 proc._placeEndPath(name,self)
432 super(Sequence,self).
__init__(*arg,**argv)
434 proc._placeSequence(name,self)
436 if id(self)
not in lookuptable:
439 if self.
_seq is not None:
440 clone = type(self)(self._seq._clonesequence(lookuptable))
443 lookuptable[id(self)]=clone
444 lookuptable[id(clone)]=clone
445 return lookuptable[id(self)]
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:
462 if keepIfCannotResolve:
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)
471 if id(self)
not in lookuptable:
474 clone = type(self)(self.
_name)
475 lookuptable[id(self)]=clone
476 lookuptable[id(clone)]=clone
477 return lookuptable[id(self)]
479 returnValue =SequencePlaceholder.__new__(type(self))
480 returnValue.__init__(self.
_name)
483 return 'cms.SequencePlaceholder("%s")' %self.
_name
485 return 'cms.SequencePlaceholder("%s")'%self.
_name
487 result =
'cms.SequencePlaceholder(\"'
490 result += +self.
_name+
'\")\n'
495 super(Schedule,self).
__init__(*arg,**argv)
498 return isinstance(item,Path)
or isinstance(item,EndPath)
501 return copy.copy(self)
503 process.setPartialSchedule_(self,label)
516 if isinstance(visitee,Sequence):
517 self.deps.append(visitee)
527 self.l.append(visitee)
534 """ takes a set as input"""
539 self.l.add(visitee.label_())
546 """ Expands the sequence into leafs and UnaryOperators """
552 self.l.append(visitee)
554 if isinstance(visitee,_UnarySequenceOperator):
560 for el
in self.
l[1:]:
562 return self.
_type(seq)
567 """ Adds any '!' or '-' needed. Takes a list """
573 if hasattr(visitee,
"_Labelable__label"):
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
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):
590 if isinstance(visitee,_BooleanLogicExpression):
596 """ Doesn't seem to work """
600 if isinstance(visitee, SequencePlaceholder):
603 raise RuntimeError(
"The SequencePlaceholder "+visitee._name+
" cannot be resolved.\n Known keys are:"+str(self.processDict.keys()))
606 if isinstance(visitee, SequencePlaceholder):
611 """Traverses a Sequence and constructs a new sequence which does not contain modules from the specified list"""
615 self.__stack.append(
list())
625 self.
__stack[-1][-1]=[
None,
True]
626 elif isinstance(visitee, Sequence):
629 self.
__stack[-1][-1]=[
None,
True]
630 self.__stack.append(
list())
633 self.__stack.append(
list())
636 if not visitee.isLeaf():
648 nonNulls.append(c[0])
653 if len(nonNulls) == 0:
658 for n
in nonNulls[1:]:
664 children = [x[0]
for x
in l ]
665 if not isinstance(visitee,Sequence):
666 node = visitee.__new__(type(visitee))
667 node.__init__(*children)
676 for i,c
in enumerate(p):
681 if not visitee.isLeaf():
685 for n
in (x[0]
for x
in self.
__stack[0]):
698 """Traverses a Sequence and constructs a new sequence by applying the operator to each element of the sequence"""
702 self.__stack.append(
list())
714 if not isinstance(visitee, _SequenceLeaf):
716 self.__stack.append(
list())
719 if not visitee.isLeaf():
731 nonNulls.append(c[0])
735 if len(nonNulls) == 0:
740 for n
in nonNulls[1:]:
746 children = [x[0]
for x
in l ]
747 if not isinstance(visitee,Sequence):
748 node = visitee.__new__(type(visitee))
749 node.__init__(*children)
752 for n
in nonNulls[1:]:
761 for i,c
in enumerate(p):
766 if not visitee.isLeaf():
770 for n
in (x[0]
for x
in self.
__stack[0]):
782 """Traverses a Sequence and constructs a new sequence which does not contain modules from the specified list"""
784 class _RemoveFirstOperator(
object):
793 super(type(self),self).
__init__(_RemoveFirstOperator(moduleToRemove))
798 """Traverses a Sequence and constructs a new sequence which does not contain the module specified"""
800 class _ExcludeOperator(
object):
804 if test
in modulesToRemove:
807 super(type(self),self).
__init__(_ExcludeOperator(modulesToRemove))
812 """Traverses a Sequence and constructs a new sequence which replaces a specified module with a different module"""
814 class _ReplaceOperator(
object):
822 super(type(self),self).
__init__(_ReplaceOperator(target,replace))
828 if __name__==
"__main__":
844 self.assertEqual(p.dumpPython(
None),
"cms.Path(process.a&process.b)\n")
847 p.visit(namesVisitor)
848 self.assertEqual(l,[
'&',
'a',
'b',
'@'])
850 self.assertEqual(p2.dumpPython(
None),
"cms.Path(process.a|process.b)\n")
852 p2.visit(namesVisitor)
853 self.assertEqual(l,[
'|',
'a',
'b',
'@'])
856 p3 =
Path(a & b & c & d)
857 self.assertEqual(p3.dumpPython(
None),
"cms.Path(process.a&process.b&process.c&process.d)\n")
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")
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")
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")
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")
889 p5.visit(namesVisitor)
890 self.assertEqual(l,[
'|',
'&',
'a',
'b',
'c',
'@',
'd',
'@'])
892 self.assertEqual(p6.dumpPython(
None),
"cms.Path(process.a&(~process.b))\n")
894 p6.visit(namesVisitor)
895 self.assertEqual(l,[
'&',
'a',
'!b',
'@'])
897 self.assertEqual(p6.dumpPython(
None),
"cms.Path(process.a&(cms.ignore(process.b)))\n")
899 p6.visit(namesVisitor)
900 self.assertEqual(l,[
'&',
'a',
'-b',
'@'])
902 self.assertEqual(p6.dumpPython(
None),
"cms.Path(~(process.a&process.b))\n")
904 p6.visit(namesVisitor)
905 self.assertEqual(l,[
'!&',
'a',
'b',
'@'])
912 self.assertEqual(p.dumpPython(
None),
"cms.Path(process.a+process.b)\n")
915 self.assertEqual(p2.dumpPython(
None),
"cms.Path(process.b+process.a)\n")
919 self.assertEqual(p3.dumpPython(
None),
"cms.Path(process.c+process.a+process.b)\n")
922 self.assertEqual(p4.dumpPython(
None),
"cms.Path(process.c+process.a+process.b)\n")
925 self.assertEqual(p5.dumpPython(
None),
"cms.Path(process.a+cms.ignore(process.b))\n")
928 self.assertEqual(p6.dumpPython(
None),
"cms.Path(process.c+process.a+process.b)\n")
930 self.assertEqual(p7.dumpPython(
None),
"cms.Path(process.a+~process.b)\n")
932 self.assertEqual(p8.dumpPython(
None),
"cms.Path(process.a+process.b+process.c)\n")
935 p.visit(namesVisitor)
936 self.assertEqual(l, [
'a',
'b'])
938 p5.visit(namesVisitor)
939 self.assertEqual(l, [
'a',
'-b'])
941 p7.visit(namesVisitor)
942 self.assertEqual(l, [
'a',
'!b'])
945 p8.visit(moduleVisitor)
946 names = [m.label_()
for m
in l]
947 self.assertEqual(names, [
'a',
'b',
'c'])
953 self.assertEqual(p.dumpConfig(
None),
"{a&b}\n")
956 self.assertEqual(p2.dumpConfig(
None),
"{b&a}\n")
960 self.assertEqual(p3.dumpConfig(
None),
"{c&a&b}\n")
963 self.assertEqual(p4.dumpConfig(
None),
"{c&a&b}\n")
966 self.assertEqual(p5.dumpConfig(
None),
"{a&-b}\n")
969 self.assertEqual(p6.dumpConfig(
None),
"{c&a&b}\n")
971 self.assertEqual(p7.dumpConfig(
None),
"{a&!b}\n")
973 self.assertEqual(p8.dumpConfig(
None),
"{a&b&c}\n")
975 class TestVisitor(
object):
979 def enter(self,visitee):
982 raise RuntimeError(
"wrong node ("+str(visitee)+
") on 'enter'")
985 def leave(self,visitee):
987 raise RuntimeError(
"wrong node ("+str(visitee)+
") on 'leave'\n expected ("+str(self.
_leaves[0])+
")")
994 t = TestVisitor(enters=[a,b],
1000 t = TestVisitor(enters=[a,b],
1008 t=TestVisitor(enters=[s,a,b,c],
1014 t=TestVisitor(enters=[notA,a],leaves=[a,notA])
1031 p.visit(namesVisitor)
1032 self.assertEqual(l, [
'm1'])
1035 p.visit(namesVisitor)
1036 self.assertEqual(l, [
'm1',
'm2'])
1044 p.visit(namesVisitor)
1045 self.assertEqual(l, [
'm1',
'm2'])
1057 s1.visit(namesVisitor)
1058 self.assertEqual(l,[
'm1',
'!m2',
'm1',
'm2',
'-m2'])
1063 s3.visit(namesVisitor)
1064 self.assertEqual(l, [
'm2',
'm1',
'm2'])
1068 s1.visit(namesVisitor)
1069 self.assertEqual(l,[
'm1',
'!m3',
'm1',
'm3',
'-m3'])
1073 s3.visit(namesVisitor)
1074 self.assertEqual(l,[
'!m1',
'm1',
'm2'])
1077 s3.visit(namesVisitor)
1078 self.assertEqual(l,[
'!m1',
'm1'])
1085 s3.visit(namesVisitor)
1086 self.assertEqual(l,[
'm1',
'm2',
'm5',
'm4'])
1093 self.assertEqual(s.index(m1),0)
1094 self.assertEqual(s.index(m2),1)
1095 self.assertEqual(s.index(m3),2)
1103 self.assertEqual(s.index(m1),0)
1104 self.assertEqual(s.index(m2),1)
1105 self.assertEqual(s.index(m3),2)
1120 p2 = p.expandAndClone()
1123 p2.visit(namesVisitor)
1124 self.assertEqual(l, [
'm1',
'!m2',
'm1',
'm2',
'-m2',
'!m1',
'm1',
'm2'])
1139 p.visit(namesVisitor)
1140 self.assertEqual(l, [
'm1',
'!m2',
'm3',
'-m4'])
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")
1149 l[:]=[]; s1.visit(namesVisitor); self.assertEqual(l,[
'm1'])
1150 self.assertEqual(s4.dumpPython(
None),
"cms.Sequence(process.m1)\n")
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'])
1165 l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,[
'm1',
'!m3'])
1166 l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,[
'm1',
'm1',
'!m3'])
1168 l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,[
'm1',
'!m3'])
1169 l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,[
'm1',
'm1'])
1171 l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,[
'm1',
'm2',
'm1',
'm2'])
1173 l[:] = []; s1.visit(namesVisitor); self.assertEqual(l,[
'm1',
'm1',
'm2'])
1176 l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,[
'm2',
'-m3',
'm1',
'm3',
'm3'])
1178 l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,[
'm2',
'-m3',
'm3'])
1180 l[:] = []; s2.visit(namesVisitor); self.assertEqual(l,[
'm2',
'm3'])
1182 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m2+process.m3)\n")
1184 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m3)\n")
1186 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m2+process.m3)\n")
1188 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m3)\n")
1190 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m2+process.m3)\n")
1192 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m3)\n")
1194 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m2+process.m3)\n")
1196 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence(process.m1+process.m3)\n")
1199 l[:]=[]; s1.visit(namesVisitor); self.assertEqual(l,[])
1200 self.assertEqual(s1.dumpPython(
None),
"cms.Sequence()\n")
1203 l[:]=[]; s3.visit(namesVisitor); self.assertEqual(l,[])
1204 self.assertEqual(s3.dumpPython(
None),
"cms.Sequence()\n")
1208 l[:]=[]; s4.visit(namesVisitor); self.assertEqual(l,[])
1209 self.assertEqual(s4.dumpPython(
None),
"cms.Sequence()\n")
1217 self.assertEqual(s.copyAndExclude([d]).
dumpPython(
None),
"cms.Sequence(process.a+process.b+process.c)\n")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
1289 self.assertRaises(AttributeError,testRaise)
1292 self.assertRaises(TypeError,testRaise2)
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")
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")
1310 from FWCore.ParameterSet.Types
import vstring
1314 def addVString(self,isTracked,label,value):
1315 self.
_dict[label]=value
1322 p.insertInto(ps,
"p",
dict())
1323 self.assertEqual(ps._dict, {
"p":vstring(
"a",
"b",
"c",
"d")})
1327 p.insertInto(ps,
"p",
dict())
1328 self.assertEqual(ps._dict, {
"p":vstring(
"a",
"b",
"c",
"d")})
def testSequenceTypeChecks
def _checkIfBooleanLogicSequenceable
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