CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Mixins.py
Go to the documentation of this file.
1 import inspect
2 
4  """Denotes a class that can be used by the Processes class"""
5  pass
6 
8  def __init__(self):
9  self.indent_= 0
10  self.deltaIndent_ = 4
11  self.isCfg = True
12  def indentation(self):
13  return ' '*self.indent_
14  def indent(self):
15  self.indent_ += self.deltaIndent_
16  def unindent(self):
17  self.indent_ -= self.deltaIndent_
18 
20  """base class for classes which are used as the 'parameters' for a ParameterSet"""
21  def __init__(self):
22  self.__dict__["_isFrozen"] = False
23  self.__isTracked = True
24  self._isModified = False
25  def isModified(self):
26  return self._isModified
27  def resetModified(self):
28  self._isModified=False
29  def configTypeName(self):
30  if self.isTracked():
31  return type(self).__name__
32  return 'untracked '+type(self).__name__
33  def pythonTypeName(self):
34  if self.isTracked():
35  return 'cms.'+type(self).__name__
36  return 'cms.untracked.'+type(self).__name__
37  def dumpPython(self, options=PrintOptions()):
38  return self.pythonTypeName()+"("+self.pythonValue(options)+")"
39  def __repr__(self):
40  return self.dumpPython()
41  def isTracked(self):
42  return self.__isTracked
43  def setIsTracked(self,trackness):
44  self.__isTracked = trackness
45  def isFrozen(self):
46  return self._isFrozen
47  def setIsFrozen(self):
48  self._isFrozen = True
49 
51  """base class for parameter classes which only hold a single value"""
52  def __init__(self,value):
53  super(_SimpleParameterTypeBase,self).__init__()
54  self._value = value
55  if not self._isValid(value):
56  raise ValueError(str(value)+" is not a valid "+str(type(self)))
57  def value(self):
58  return self._value
59  def setValue(self,value):
60  if not self._isValid(value):
61  raise ValueError(str(value)+" is not a valid "+str(type(self)))
62  if value!=self._value:
63  self._isModified=True
64  self._value=value
65  def configValue(self, options=PrintOptions()):
66  return str(self._value)
67  def pythonValue(self, options=PrintOptions()):
68  return self.configValue(options)
69  def __eq__(self,other):
70  if isinstance(other,_SimpleParameterTypeBase):
71  return self._value == other._value
72  return self._value == other
73  def __ne__(self,other):
74  if isinstance(other,_SimpleParameterTypeBase):
75  return self._value != other._value
76  return self._value != other
77 
78 
80  """For injection purposes, pretend this is a new parameter type
81  then have a post process step which strips these out
82  """
83  def __init__(self,value, s='', loc=0, file=''):
84  super(UsingBlock,self).__init__(value)
85  self.s = s
86  self.loc = loc
87  self.file = file
88  self.isResolved = False
89  @staticmethod
90  def _isValid(value):
91  return isinstance(value,str)
92  def _valueFromString(value):
93  """only used for cfg-parsing"""
94  return string(value)
95  def insertInto(self, parameterSet, myname):
96  value = self.value()
97  # doesn't seem to handle \0 correctly
98  #if value == '\0':
99  # value = ''
100  parameterSet.addString(self.isTracked(), myname, value)
101  def dumpPython(self, options):
102  if options.isCfg:
103  return "process."+self.value()
104  else:
105  return self.value()
106 
107 
109  """Base class for classes which allow addition of _ParameterTypeBase data"""
110  def __init__(self,*arg,**kargs):
111  self.__dict__['_Parameterizable__parameterNames'] = []
112  self.__dict__["_isFrozen"] = False
113  """The named arguments are the 'parameters' which are added as 'python attributes' to the object"""
114  if len(arg) != 0:
115  #raise ValueError("unnamed arguments are not allowed. Please use the syntax 'name = value' when assigning arguments.")
116  for block in arg:
117  if type(block).__name__ != "PSet":
118  raise ValueError("Only PSets can be passed as unnamed argument blocks. This is a "+type(block).__name__)
119  self.__setParameters(block.parameters_())
120  self.__setParameters(kargs)
121  self._isModified = False
122 
123  def parameterNames_(self):
124  """Returns the name of the parameters"""
125  return self.__parameterNames[:]
126  def isModified(self):
127  if self._isModified:
128  return True
129  for name in self.parameterNames_():
130  param = self.__dict__[name]
131  if isinstance(param, _Parameterizable) and param.isModified():
132  self._isModified = True
133  return True
134  return False
135 
136  def hasParameter(self, params):
137  """
138  _hasParameter_
139 
140  check that pset provided has the attribute chain
141  specified.
142 
143  Eg, if params is [ 'attr1', 'attr2', 'attr3' ]
144  check for pset.attr1.attr2.attr3
145 
146  returns True if parameter exists, False if not
147  """
148  return (self.getParameter(params) != None)
149 
150  def getParameter(self, params):
151  """
152  _getParameter_
153 
154  Retrieve the specified parameter from the PSet Provided
155  given the attribute chain
156 
157  returns None if not found
158  """
159  lastParam = self
160  # Don't accidentally iterate over letters in a string
161  if type(params).__name__ == 'str':
162  return getattr(self, params, None)
163  for param in params:
164  lastParam = getattr(lastParam, param, None)
165  print str(lastParam)
166  if lastParam == None:
167  return None
168  return lastParam
169 
170  def parameters_(self):
171  """Returns a dictionary of copies of the user-set parameters"""
172  import copy
173  result = dict()
174  for name in self.parameterNames_():
175  result[name]=copy.deepcopy(self.__dict__[name])
176  return result
177 
178  def __addParameter(self, name, value):
179  if not isinstance(value,_ParameterTypeBase):
180  self.__raiseBadSetAttr(name)
181  if name in self.__dict__:
182  message = "Duplicate insert of member " + name
183  message += "\nThe original parameters are:\n"
184  message += self.dumpPython() + '\n'
185  raise ValueError(message)
186  self.__dict__[name]=value
187  self.__parameterNames.append(name)
188  self._isModified = True
189 
190  def __setParameters(self,parameters):
191  for name,value in parameters.iteritems():
192  self.__addParameter(name, value)
193 
194  def __setattr__(self,name,value):
195  #since labels are not supposed to have underscores at the beginning
196  # I will assume that if we have such then we are setting an internal variable
197  if self.isFrozen() and not (name in ["_Labelable__label","_isFrozen"] or name.startswith('_')):
198  message = "Object already added to a process. It is read only now\n"
199  message += " %s = %s" %(name, value)
200  message += "\nThe original parameters are:\n"
201  message += self.dumpPython() + '\n'
202  raise ValueError(message)
203  # underscored names bypass checking for _ParameterTypeBase
204  if name[0]=='_':
205  super(_Parameterizable,self).__setattr__(name,value)
206  elif not name in self.__dict__:
207  self.__addParameter(name, value)
208  self._isModified = True
209  else:
210  # handle the case where users just replace with a value, a = 12, rather than a = cms.int32(12)
211  if isinstance(value,_ParameterTypeBase):
212  self.__dict__[name] = value
213  else:
214  self.__dict__[name].setValue(value)
215  self._isModified = True
216 
217  def isFrozen(self):
218  return self._isFrozen
219  def setIsFrozen(self):
220  self._isFrozen = True
221  for name in self.parameterNames_():
222  self.__dict__[name].setIsFrozen()
223  def __delattr__(self,name):
224  if self.isFrozen():
225  raise ValueError("Object already added to a process. It is read only now")
226  super(_Parameterizable,self).__delattr__(name)
227  self.__parameterNames.remove(name)
228  @staticmethod
229  def __raiseBadSetAttr(name):
230  raise TypeError(name+" does not already exist, so it can only be set to a CMS python configuration type")
231  def dumpPython(self, options=PrintOptions()):
232  sortedNames = sorted(self.parameterNames_())
233  if len(sortedNames) > 200:
234  #Too many parameters for a python function call
235  # The solution is to create a temporary dictionary which
236  # is constructed by concatenating long lists (with maximum
237  # 200 entries each) together.
238  # This looks like
239  # **dict( [(...,...), ...] + [...] + ... )
240  others = []
241  usings = []
242  for name in sortedNames:
243  param = self.__dict__[name]
244  # we don't want minuses in names
245  name2 = name.replace('-','_')
246  options.indent()
247  #_UsingNodes don't get assigned variables
248  if name.startswith("using_"):
249  usings.append(options.indentation()+param.dumpPython(options))
250  else:
251  others.append((name2, param.dumpPython(options)))
252  options.unindent()
253 
254  resultList = ',\n'.join(usings)
255  longOthers = options.indentation()+"**dict(\n"
256  options.indent()
257  longOthers += options.indentation()+"[\n"
258  entriesInList = 0
259  options.indent()
260  for n,v in others:
261  entriesInList +=1
262  if entriesInList > 200:
263  #need to start a new list
264  options.unindent()
265  longOthers += options.indentation()+"] +\n"+options.indentation()+"[\n"
266  entriesInList = 0
267  options.indent()
268  longOthers += options.indentation()+'("'+n+'" , '+v+' ),\n'
269 
270  longOthers += options.indentation()+"]\n"
271  options.unindent()
272  longOthers +=options.indentation()+")\n"
273  options.unindent()
274  ret = []
275  if resultList:
276  ret.append(resultList)
277  if longOthers:
278  ret.append(longOthers)
279  return ",\n".join(ret)
280  #Standard case, small number of parameters
281  others = []
282  usings = []
283  for name in sortedNames:
284  param = self.__dict__[name]
285  # we don't want minuses in names
286  name2 = name.replace('-','_')
287  options.indent()
288  #_UsingNodes don't get assigned variables
289  if name.startswith("using_"):
290  usings.append(options.indentation()+param.dumpPython(options))
291  else:
292  others.append(options.indentation()+name2+' = '+param.dumpPython(options))
293  options.unindent()
294  # usings need to go first
295  resultList = usings
296  resultList.extend(others)
297  return ',\n'.join(resultList)+'\n'
298  def __repr__(self):
299  return self.dumpPython()
300  def insertContentsInto(self, parameterSet):
301  for name in self.parameterNames_():
302  param = getattr(self,name)
303  param.insertInto(parameterSet, name)
304 
305 
307  """Base class for classes which are Parameterizable and have a 'type' assigned"""
308  def __init__(self,type_,*arg,**kargs):
309  self.__dict__['_TypedParameterizable__type'] = type_
310  #the 'type' is also placed in the 'arg' list and we need to remove it
311  #if 'type_' not in kargs:
312  # arg = arg[1:]
313  #else:
314  # del args['type_']
315  arg = tuple([x for x in arg if x != None])
316  super(_TypedParameterizable,self).__init__(*arg,**kargs)
317  saveOrigin(self, 1)
318  def _place(self,name,proc):
319  self._placeImpl(name,proc)
320  def type_(self):
321  """returns the type of the object, e.g. 'FooProducer'"""
322  return self.__type
323  def copy(self):
324  returnValue =_TypedParameterizable.__new__(type(self))
325  params = self.parameters_()
326  args = list()
327  if len(params) == 0:
328  args.append(None)
329  returnValue.__init__(self.__type,*args,
330  **params)
331  returnValue._isModified = self._isModified
332  return returnValue
333  def clone(self, *args, **params):
334  """Copies the object and allows one to modify the parameters of the clone.
335  New parameters may be added by specify the exact type
336  Modifying existing parameters can be done by just specifying the new
337  value without having to specify the type.
338  """
339  returnValue =_TypedParameterizable.__new__(type(self))
340  myparams = self.parameters_()
341  if len(myparams) == 0 and len(params) and len(args):
342  args.append(None)
343  if len(params):
344  #need to treat items both in params and myparams specially
345  for key,value in params.iteritems():
346  if key in myparams:
347  if isinstance(value,_ParameterTypeBase):
348  myparams[key] =value
349  else:
350  myparams[key].setValue(value)
351  else:
352  if isinstance(value,_ParameterTypeBase):
353  myparams[key]=value
354  else:
355  self._Parameterizable__raiseBadSetAttr(key)
356 
357  returnValue.__init__(self.__type,*args,
358  **myparams)
359  returnValue._isModified = False
360  returnValue._isFrozen = False
361  saveOrigin(returnValue, 1)
362  return returnValue
363 
364  @staticmethod
365  def __findDefaultsFor(label,type):
366  #This routine is no longer used, but I might revive it in the future
367  import sys
368  import glob
369  choices = list()
370  for d in sys.path:
371  choices.extend(glob.glob(d+'/*/*/'+label+'.py'))
372  if not choices:
373  return None
374  #now see if any of them have what we want
375  #the use of __import__ is taken from an example
376  # from the www.python.org documentation on __import__
377  for c in choices:
378  #print " found file "+c
379  name='.'.join(c[:-3].split('/')[-3:])
380  #name = c[:-3].replace('/','.')
381  mod = __import__(name)
382  components = name.split('.')
383  for comp in components[1:]:
384  mod = getattr(mod,comp)
385  if hasattr(mod,label):
386  default = getattr(mod,label)
387  if isinstance(default,_TypedParameterizable):
388  if(default.type_() == type):
389  params = dict()
390  for name in default.parameterNames_():
391  params[name] = getattr(default,name)
392  return params
393  return None
394 
395  def dumpConfig(self, options=PrintOptions()):
396  config = self.__type +' { \n'
397  for name in self.parameterNames_():
398  param = self.__dict__[name]
399  options.indent()
400  config+=options.indentation()+param.configTypeName()+' '+name+' = '+param.configValue(options)+'\n'
401  options.unindent()
402  config += options.indentation()+'}\n'
403  return config
404 
405  def dumpPython(self, options=PrintOptions()):
406  result = "cms."+str(type(self).__name__)+'("'+self.type_()+'"'
407  nparam = len(self.parameterNames_())
408  if nparam == 0:
409  result += ")\n"
410  else:
411  result += ",\n"+_Parameterizable.dumpPython(self,options)+options.indentation() + ")\n"
412  return result
413 
414  def dumpPythonAttributes(self, myname, options):
415  """ dumps the object with all attributes declared after the constructor"""
416  result = ""
417  for name in sorted(self.parameterNames_()):
418  param = self.__dict__[name]
419  result += options.indentation() + myname + "." + name + " = " + param.dumpPython(options) + "\n"
420  return result
421 
422  def nameInProcessDesc_(self, myname):
423  return myname;
424  def moduleLabel_(self, myname):
425  return myname
426  def insertInto(self, parameterSet, myname):
427  newpset = parameterSet.newPSet()
428  newpset.addString(True, "@module_label", self.moduleLabel_(myname))
429  newpset.addString(True, "@module_type", self.type_())
430  newpset.addString(True, "@module_edm_type", type(self).__name__)
431  self.insertContentsInto(newpset)
432  parameterSet.addPSet(True, self.nameInProcessDesc_(myname), newpset)
433 
434 
435 
437  """A 'mixin' used to denote that the class can be paired with a label (e.g. an EDProducer)"""
438  def label_(self):
439  if not hasattr(self, "_Labelable__label"):
440  raise RuntimeError("module has no label. Perhaps it wasn't inserted into the process?")
441  return self.__label
442  def hasLabel_(self):
443  return hasattr(self, "_Labelable__label") and self.__label is not None
444  def setLabel(self,label):
445  if self.hasLabel_() :
446  if self.label_() != label and label is not None :
447  msg100 = "Attempting to change the label of a Labelable object, possibly an attribute of the Process\n"
448  msg101 = "Old label = "+self.label_()+" New label = "+label+"\n"
449  msg102 = "Type = "+str(type(self))+"\n"
450  msg103 = "Some possible solutions:\n"
451  msg104 = " 1. Clone modules instead of using simple assignment. Cloning is\n"
452  msg105 = " also preferred for other types when possible.\n"
453  msg106 = " 2. Declare new names starting with an underscore if they are\n"
454  msg107 = " for temporaries you do not want propagated into the Process. The\n"
455  msg108 = " underscore tells \"from x import *\" and process.load not to import\n"
456  msg109 = " the name.\n"
457  msg110 = " 3. Reorganize so the assigment is not necessary. Giving a second\n"
458  msg111 = " name to the same object usually causes confusion and problems.\n"
459  msg112 = " 4. Compose Sequences: newName = cms.Sequence(oldName)\n"
460  raise ValueError(msg100+msg101+msg102+msg103+msg104+msg105+msg106+msg107+msg108+msg109+msg110+msg111+msg112)
461  self.__label = label
462  def label(self):
463  #print "WARNING: _Labelable::label() needs to be changed to label_()"
464  return self.__label
465  def __str__(self):
466  #this is probably a bad idea
467  # I added this so that when we ask a path to print
468  # we will see the label that has been assigned
469  return str(self.__label)
471  return str(self.__label)
473  return 'process.'+str(self.__label)
474  def _findDependencies(self,knownDeps,presentDeps):
475  #print 'in labelled'
476  myDeps=knownDeps.get(self.label_(),None)
477  if myDeps!=None:
478  if presentDeps != myDeps:
479  raise RuntimeError("the module "+self.label_()+" has two dependencies \n"
480  +str(presentDeps)+"\n"
481  +str(myDeps)+"\n"
482  +"Please modify sequences to rectify this inconsistency")
483  else:
484  myDeps=set(presentDeps)
485  knownDeps[self.label_()]=myDeps
486  presentDeps.add(self.label_())
487 
488 
490  """A 'mixin' used to denote that the class can be used without a label (e.g. a Service)"""
491  pass
492 
493 class _ValidatingListBase(list):
494  """Base class for a list which enforces that its entries pass a 'validity' test"""
495  def __init__(self,*arg,**args):
496  super(_ValidatingListBase,self).__init__(arg)
497  if 0 != len(args):
498  raise SyntaxError("named arguments ("+','.join([x for x in args])+") passsed to "+str(type(self)))
499  if not self._isValid(iter(self)):
500  raise TypeError("wrong types ("+','.join([str(type(value)) for value in iter(self)])+
501  ") added to "+str(type(self)))
502  def __setitem__(self,key,value):
503  if isinstance(key,slice):
504  if not self._isValid(value):
505  raise TypeError("wrong type being inserted into this container "+self._labelIfAny())
506  else:
507  if not self._itemIsValid(value):
508  raise TypeError("can not insert the type "+str(type(value))+" in container "+self._labelIfAny())
509  super(_ValidatingListBase,self).__setitem__(key,value)
510  def _isValid(self,seq):
511  # see if strings get reinterpreted as lists
512  if isinstance(seq, str):
513  return False
514  for item in seq:
515  if not self._itemIsValid(item):
516  return False
517  return True
518  def append(self,x):
519  if not self._itemIsValid(x):
520  raise TypeError("wrong type being appended to container "+self._labelIfAny())
521  super(_ValidatingListBase,self).append(x)
522  def extend(self,x):
523  if not self._isValid(x):
524  raise TypeError("wrong type being extended to container "+self._labelIfAny())
525  super(_ValidatingListBase,self).extend(x)
526  def __add__(self,rhs):
527  if not self._isValid(rhs):
528  raise TypeError("wrong type being added to container "+self._labelIfAny())
529  import copy
530  value = copy.copy(self)
531  value.extend(rhs)
532  return value
533  def insert(self,i,x):
534  if not self._itemIsValid(x):
535  raise TypeError("wrong type being inserted to container "+self._labelIfAny())
536  super(_ValidatingListBase,self).insert(i,x)
537  def _labelIfAny(self):
538  result = type(self).__name__
539  if hasattr(self, '__label'):
540  result += ' ' + self.__label
541  return result
542 
544  def __init__(self,*arg,**args):
545  _ParameterTypeBase.__init__(self)
546  if len (arg) == 1 and not isinstance(arg[0],str):
547  try:
548  arg = iter(arg[0])
549  except TypeError:
550  pass
551  super(_ValidatingParameterListBase,self).__init__(*arg,**args)
552  def value(self):
553  return list(self)
554  def setValue(self,v):
555  self[:] = []
556  self.extend(v)
557  self._isModified=True
558  def configValue(self, options=PrintOptions()):
559  config = '{\n'
560  first = True
561  for value in iter(self):
562  options.indent()
563  config += options.indentation()
564  if not first:
565  config+=', '
566  config+= self.configValueForItem(value, options)+'\n'
567  first = False
568  options.unindent()
569  config += options.indentation()+'}\n'
570  return config
571  def configValueForItem(self,item, options):
572  return str(item)
573  def pythonValueForItem(self,item, options):
574  return self.configValueForItem(item, options)
575  def __repr__(self):
576  return self.dumpPython()
577  def dumpPython(self, options=PrintOptions()):
578  result = self.pythonTypeName()+"("
579  n = len(self)
580  if n>=256:
581  #wrap in a tuple since they don't have a size constraint
582  result+=" ("
583  indented = False
584  for i, v in enumerate(self):
585  if i == 0:
586  if hasattr(self, "_nPerLine"):
587  nPerLine = self._nPerLine
588  else:
589  nPerLine = 5
590  else:
591  if not indented:
592  indented = True
593  options.indent()
594  result += ', '
595  if i % nPerLine == 0:
596  result += '\n'+options.indentation()
597  result += self.pythonValueForItem(v,options)
598  if indented:
599  options.unindent()
600  #result+=', '.join((self.pythonValueForItem(v,options) for v in iter(self)))
601  if n>=256:
602  result +=' ) '
603  result += ')'
604  return result
605  @staticmethod
606  def _itemsFromStrings(strings,converter):
607  return (converter(x).value() for x in strings)
608 
609 def saveOrigin(obj, level):
610  #frame = inspect.stack()[level+1]
611  frame = inspect.getframeinfo(inspect.currentframe(level+1))
612  # not safe under old python versions
613  #obj._filename = frame.filename
614  #obj._lineNumber = frame.lineno
615  obj._filename = frame[0]
616  obj._lineNumber = frame[1]
617 
618 if __name__ == "__main__":
619 
620  import unittest
622  def _itemIsValid(self,item):
623  return True
624  class testMixins(unittest.TestCase):
626  t = TestList(1)
627  self.assertEqual(t,[1])
628  t = TestList((1,))
629  self.assertEqual(t,[1])
630  t = TestList("one")
631  self.assertEqual(t,["one"])
632  t = TestList( [1,])
633  self.assertEqual(t,[1])
634  t = TestList( (x for x in [1]) )
635  self.assertEqual(t,[1])
636 
637  t = TestList(1,2)
638  self.assertEqual(t,[1,2])
639  t = TestList((1,2))
640  self.assertEqual(t,[1,2])
641  t = TestList("one","two")
642  self.assertEqual(t,["one","two"])
643  t = TestList(("one","two"))
644  self.assertEqual(t,["one","two"])
645  t = TestList( [1,2])
646  self.assertEqual(t,[1,2])
647  t = TestList( (x for x in [1,2]) )
648  self.assertEqual(t,[1,2])
649  t = TestList( iter((1,2)) )
650  self.assertEqual(t,[1,2])
651 
652 
653  def testLargeList(self):
654  #lists larger than 255 entries can not be initialized
655  #using the constructor
656  args = [i for i in xrange(0,300)]
657 
658  t = TestList(*args)
659  pdump= t.dumpPython()
660  class cms(object):
661  def __init__(self):
662  self.TestList = TestList
663  pythonized = eval( pdump, globals(),{'cms':cms()} )
664  self.assertEqual(t,pythonized)
665  def testUsingBlock(self):
666  a = UsingBlock("a")
667  self.assert_(isinstance(a, _ParameterTypeBase))
668  def testCopy(self):
669  class __Test(_TypedParameterizable):
670  pass
671  class __TestType(_SimpleParameterTypeBase):
672  def _isValid(self,value):
673  return True
674  a = __Test("MyType",t=__TestType(1), u=__TestType(2))
675  b = a.copy()
676  self.assertEqual(b.t.value(),1)
677  self.assertEqual(b.u.value(),2)
678  def testClone(self):
679  class __Test(_TypedParameterizable):
680  pass
681  class __TestType(_SimpleParameterTypeBase):
682  def _isValid(self,value):
683  return True
684  a = __Test("MyType",t=__TestType(1), u=__TestType(2))
685  b = a.clone(t=3, v=__TestType(4))
686  self.assertEqual(a.t.value(),1)
687  self.assertEqual(a.u.value(),2)
688  self.assertEqual(b.t.value(),3)
689  self.assertEqual(b.u.value(),2)
690  self.assertEqual(b.v.value(),4)
691  self.assertRaises(TypeError,a.clone,None,**{"v":1})
692  def testModified(self):
693  class __TestType(_SimpleParameterTypeBase):
694  def _isValid(self,value):
695  return True
696  a = __TestType(1)
697  self.assertEqual(a.isModified(),False)
698  a.setValue(1)
699  self.assertEqual(a.isModified(),False)
700  a.setValue(2)
701  self.assertEqual(a.isModified(),True)
702  a.resetModified()
703  self.assertEqual(a.isModified(),False)
706  pass
708  def _isValid(self,value):
709  return True
710  class __DummyModule(object):
711  def __init__(self):
712  self.tLPTest = tLPTest
713  self.tLPTestType = tLPTestType
714  p = tLPTest("MyType",** dict( [ ("a"+str(x), tLPTestType(x)) for x in xrange(0,300) ] ) )
715  #check they are the same
716  self.assertEqual(p.dumpPython(), eval(p.dumpPython(),{"cms": __DummyModule()}).dumpPython())
717  unittest.main()
def _valueFromString
Definition: Mixins.py:92
def testUsingBlock
Definition: Mixins.py:665
bool setValue(Container &, const reco::JetBaseRef &, const JetExtendedData &)
associate jet with value. Returns false and associate nothing if jet is already associated ...
def dumpSequenceConfig
Definition: Mixins.py:470
def saveOrigin
Definition: Mixins.py:609
def testListConstruction
Definition: Mixins.py:625
Definition: value.py:1
def dumpSequencePython
Definition: Mixins.py:472
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def _itemIsValid
Definition: Mixins.py:622
list object
Definition: dbtoconf.py:77
def _findDependencies
Definition: Mixins.py:474
def testLargeParameterizable
Definition: Mixins.py:704
if(conf.exists("allCellsPositionCalc"))
double split
Definition: MVATrainer.cc:139
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