CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
__init__.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 import ROOT
4 import inspect
5 import sys
6 import optparse
7 from FWCore.ParameterSet.VarParsing import VarParsing
8 
9 
10 ROOT.gSystem.Load("libFWCoreFWLite")
11 ROOT.FWLiteEnabler.enable()
12 
13 # Whether warn() should print anythingg
14 quietWarn = False
15 
16 def setQuietWarn (quiet = True):
17  global quietWarn
18  quietWarn = quiet
19 
20 def warn (*args, **kwargs):
21  """print out warning with line number and rest of arguments"""
22  if quietWarn: return
23  frame = inspect.stack()[1]
24  filename = frame[1]
25  lineNum = frame[2]
26  #print "after '%s'" % filename
27  blankLines = kwargs.get('blankLines', 0)
28  if blankLines:
29  print '\n' * blankLines
30  spaces = kwargs.get('spaces', 0)
31  if spaces:
32  print ' ' * spaces,
33  if len (args):
34  print "%s (%s): " % (filename, lineNum),
35  for arg in args:
36  print arg,
37  print
38  else:
39  print "%s (%s):" % (filename, lineNum)
40 
41 ########################
42 ## ################## ##
43 ## ## ############ ## ##
44 ## ## ## Handle ## ## ##
45 ## ## ############ ## ##
46 ## ################## ##
47 ########################
48 
49 class Handle:
50  """Python interface to FWLite Handle class"""
51 
52  def __init__ (self,
53  typeString,
54  **kwargs):
55  """Initialize python handle wrapper """
56  # turn off warnings
57  oldWarningLevel = ROOT.gErrorIgnoreLevel
58  ROOT.gErrorIgnoreLevel = ROOT.kError
59  self._nodel = False
60  if kwargs.get ('noDelete'):
61  print "Not deleting wrapper"
62  del kwargs['noDelete']
63  else:
64  self._nodel = True
65  self._type = typeString
66  self._resetWrapper()
67  self._exception = RuntimeError ("getByLabel not called for '%s'", self)
68  # restore warning state
69  ROOT.gErrorIgnoreLevel = oldWarningLevel
70  # Since we deleted the options as we used them, that means
71  # that kwargs should be empty. If it's not, that means that
72  # somebody passed in an argument that we're not using and we
73  # should complain.
74  if len (kwargs):
75  raise RuntimeError, "Unknown arguments %s" % kwargs
76 
77  def isValid (self):
78  """Returns true if getByLabel call was successful and data is
79  present in handle."""
80  return not self._exception
81 
82 
83  def product (self):
84  """Returns product stored in handle."""
85  if self._exception:
86  raise self._exception
87  return self._wrapper.product()
88 
89 
90  def __str__ (self):
91  return "%s" % (self._type)
92 
93 
94  ## Private member functions ##
95 
96  def _resetWrapper (self):
97  """(Internal) reset the edm wrapper"""
98  self._wrapper = ROOT.edm.Wrapper (self._type)()
99  self._typeInfo = self._wrapper.typeInfo()
100  ROOT.SetOwnership (self._wrapper, False)
101  # O.k. This is a little weird. We want a pointer to an EDM
102  # wrapper, but we don't want the memory it is pointing to.
103  # So, we've created it and grabbed the type info. Since we
104  # don't want a memory leak, we destroy it.
105  if not self._nodel :
106  ROOT.TClass.GetClass("edm::Wrapper<"+self._type+">").Destructor( self._wrapper )
107 
108  def _typeInfoGetter (self):
109  """(Internal) Return the type info"""
110  return self._typeInfo
111 
112 
113  def _addressOf (self):
114  """(Internal) Return address of edm wrapper"""
115  return ROOT.AddressOf (self._wrapper)
116 
117 
118  def _setStatus (self, getByLabelSuccess, labelString):
119  """(Internal) To be called by Events.getByLabel"""
120  if not getByLabelSuccess:
121  self._exception = RuntimeError ("getByLabel (%s, %s) failed" \
122  % (self, labelString))
123  return
124  if not self._wrapper.isPresent():
125  self._exception = RuntimeError ("getByLabel (%s, %s) not present this event" \
126  % (self, labelString))
127  return
128  # if we're still here, then everything is happy. Clear the exception
129  self._exception = None
130 
131 
132 #######################
133 ## ################# ##
134 ## ## ########### ## ##
135 ## ## ## Lumis ## ## ##
136 ## ## ########### ## ##
137 ## ################# ##
138 #######################
139 
140 class Lumis:
141  """Python interface to FWLite LuminosityBlock"""
142  def __init__ (self, inputFiles = '', **kwargs):
143  self._lumi = None
144  self._lumiCounts = 0
145  self._tfile = None
146  self._maxLumis = 0
147  if isinstance (inputFiles, list):
148  # it's a list
149  self._filenames = inputFiles[:]
150  elif isinstance (inputFiles, VarParsing):
151  # it's a VarParsing object
152  options = inputFiles
153  self._maxLumis = options.maxEvents
154  self._filenames = options.inputFiles
155  else:
156  # it's probably a single string
157  self._filenames = [inputFiles]
158  ##############################
159  ## Parse optional arguments ##
160  ##############################
161  if kwargs.has_key ('maxEvents'):
162  self._maxLumis = kwargs['maxEvents']
163  del kwargs['maxEvents']
164  if kwargs.has_key ('options'):
165  options = kwargs ['options']
166  self._maxLumis = options.maxEvents
167  self._filenames = options.inputFiles
168  self._secondaryFilenames = options.secondaryInputFiles
169  del kwargs['options']
170  # Since we deleted the options as we used them, that means
171  # that kwargs should be empty. If it's not, that means that
172  # somebody passed in an argument that we're not using and we
173  # should complain.
174  if len (kwargs):
175  raise RuntimeError, "Unknown arguments %s" % kwargs
176  if not self._filenames:
177  raise RuntimeError, "No input files given"
178  if not self._createFWLiteLumi():
179  # this shouldn't happen as you are getting nothing the
180  # very first time out, but let's at least check to
181  # avoid problems.
182  raise RuntimeError, "Never and information about Lumi"
183 
184 
185  def __del__ (self):
186  """(Internal) Destructor"""
187  # print "Goodbye cruel world, I'm leaving you today."
188  del self._lumi
189  # print "Goodbye, goodbye, goodbye."
190 
191 
192  def __iter__ (self):
193  return self._next()
194 
195 
196  def aux (self):
197  try:
198  return self._lumi.luminosityBlockAuxiliary()
199  except:
200  raise RuntimeError, "Lumis.aux() called on object in invalid state"
201 
202 
204  try:
205  return self._lumi.luminosityBlockAuxiliary()
206  except:
207  raise RuntimeError, "Lumis.luminosityBlockAuxiliary() called on object in invalid state"
208 
209 
210  def getByLabel (self, *args):
211  """Calls FWLite's getByLabel. Called:
212  getByLabel (moduleLabel, handle)
213  getByLabel (moduleLabel, productInstanceLabel, handle),
214  getByLabel (moduleLabel, productInstanceLabel, processLabel, handle),
215  or
216  getByLabel ( (mL, pIL,pL), handle)
217  """
218  length = len (args)
219  if length < 2 or length > 4:
220  # not called correctly
221  raise RuntimeError, "Incorrect number of arguments"
222  # handle is always the last argument
223  argsList = list (args)
224  handle = argsList.pop()
225  if len(argsList)==1 :
226  if( isinstance (argsList[0], tuple) or
227  isinstance (argsList[0], list) ) :
228  if len (argsList[0]) > 3:
229  raise RuntimeError, "getByLabel Error: label tuple has too " \
230  "many arguments '%s'" % argsList[0]
231  argsList = list(argsList[0])
232  if( type(argsList[0]) is str and ":" in argsList[0] ):
233  if argsList[0].count(":") > 3:
234  raise RuntimeError, "getByLabel Error: label tuple has too " \
235  "many arguments '%s'" % argsList[0].split(":")
236  argsList = argsList[0].split(":")
237  while len(argsList) < 3:
238  argsList.append ('')
239  (moduleLabel, productInstanceLabel, processLabel) = argsList
240  labelString = "'" + "', '".join(argsList) + "'"
241  if not handle._wrapper :
242  handle._resetWrapper()
243  handle._setStatus ( self._lumi.getByLabel( handle._typeInfoGetter(),
244  moduleLabel,
245  productInstanceLabel,
246  processLabel,
247  handle._addressOf() ),
248  labelString )
249  return handle.isValid()
250 
251 
252  ##############################
253  ## Private Member Functions ##
254  ##############################
255 
256  def _createFWLiteLumi (self):
257  """(Internal) Creates an FWLite Lumi"""
258  # are there any files left?
259  if not self._filenames:
260  return False
261  if self._lumi:
262  del self._lumi
263  self._lumi = None
264  self._veryFirstTime = False
265  self._currFilename = self._filenames.pop(0)
266  #print "Opening file", self._currFilename
267  if self._tfile:
268  del self._tfile
269  self._tfile = ROOT.TFile.Open (self._currFilename)
270  self._lumi = ROOT.fwlite.LuminosityBlock (self._tfile);
271  self._lumi.toBegin()
272  return True
273 
274 
275  def _next (self):
276  """(Internal) Iterator internals"""
277  while True:
278  if self._lumi.atEnd():
279  if not self._createFWLiteLumi():
280  # there are no more files here, so we are done
281  break
282  yield self
283  self._lumiCounts += 1
284  if self._maxLumis > 0 and self._lumiCounts >= self._maxLumis:
285  break
286  self._lumi.__preinc__()
287 
288 
289 
290 ######################
291 ## ################ ##
292 ## ## ########## ## ##
293 ## ## ## Runs ## ## ##
294 ## ## ########## ## ##
295 ## ################ ##
296 ######################
297 
298 class Runs:
299  """Python interface to FWLite LuminosityBlock"""
300  def __init__ (self, inputFiles = '', **kwargs):
301  self._run = None
302  self._runCounts = 0
303  self._tfile = None
304  self._maxRuns = 0
305  if isinstance (inputFiles, list):
306  # it's a list
307  self._filenames = inputFiles[:]
308  elif isinstance (inputFiles, VarParsing):
309  # it's a VarParsing object
310  options = inputFiles
311  self._maxRuns = options.maxEvents
312  self._filenames = options.inputFiles
313  else:
314  # it's probably a single string
315  self._filenames = [inputFiles]
316  ##############################
317  ## Parse optional arguments ##
318  ##############################
319  if kwargs.has_key ('maxEvents'):
320  self._maxRuns = kwargs['maxEvents']
321  del kwargs['maxEvents']
322  if kwargs.has_key ('options'):
323  options = kwargs ['options']
324  self._maxRuns = options.maxEvents
325  self._filenames = options.inputFiles
326  self._secondaryFilenames = options.secondaryInputFiles
327  del kwargs['options']
328  # Since we deleted the options as we used them, that means
329  # that kwargs should be empty. If it's not, that means that
330  # somebody passed in an argument that we're not using and we
331  # should complain.
332  if len (kwargs):
333  raise RuntimeError, "Unknown arguments %s" % kwargs
334  if not self._filenames:
335  raise RuntimeError, "No input files given"
336  if not self._createFWLiteRun():
337  # this shouldn't happen as you are getting nothing the
338  # very first time out, but let's at least check to
339  # avoid problems.
340  raise RuntimeError, "Never and information about Run"
341 
342 
343  def __del__ (self):
344  """(Internal) Destructor"""
345  # print "Goodbye cruel world, I'm leaving you today."
346  del self._run
347  # print "Goodbye, goodbye, goodbye."
348 
349 
350  def __iter__ (self):
351  return self._next()
352 
353 
354  def aux (self):
355  try:
356  return self._run.runAuxiliary()
357  except:
358  raise RuntimeError, "Runs.aux() called on object in invalid state"
359 
360 
361  def runAuxiliary (self):
362  try:
363  return self._run.runAuxiliary()
364  except:
365  raise RuntimeError, "Runs.runAuxiliary() called on object in invalid state"
366 
367 
368  def getByLabel (self, *args):
369  """Calls FWLite's getByLabel. Called:
370  getByLabel (moduleLabel, handle)
371  getByLabel (moduleLabel, productInstanceLabel, handle),
372  getByLabel (moduleLabel, productInstanceLabel, processLabel, handle),
373  or
374  getByLabel ( (mL, pIL,pL), handle)
375  """
376  length = len (args)
377  if length < 2 or length > 4:
378  # not called correctly
379  raise RuntimeError, "Incorrect number of arguments"
380  # handle is always the last argument
381  argsList = list (args)
382  handle = argsList.pop()
383  if len(argsList)==1 :
384  if( isinstance (argsList[0], tuple) or
385  isinstance (argsList[0], list) ) :
386  if len (argsList[0]) > 3:
387  raise RuntimeError, "getByLabel Error: label tuple has too " \
388  "many arguments '%s'" % argsList[0]
389  argsList = list(argsList[0])
390  if( type(argsList[0]) is str and ":" in argsList[0] ):
391  if argsList[0].count(":") > 3:
392  raise RuntimeError, "getByLabel Error: label tuple has too " \
393  "many arguments '%s'" % argsList[0].split(":")
394  argsList = argsList[0].split(":")
395  while len(argsList) < 3:
396  argsList.append ('')
397  (moduleLabel, productInstanceLabel, processLabel) = argsList
398  labelString = "'" + "', '".join(argsList) + "'"
399  if not handle._wrapper :
400  handle._resetWrapper()
401  handle._setStatus ( self._run.getByLabel( handle._typeInfoGetter(),
402  moduleLabel,
403  productInstanceLabel,
404  processLabel,
405  handle._addressOf() ),
406  labelString )
407  return handle.isValid()
408 
409 
410 
411 
412  ##############################
413  ## Private Member Functions ##
414  ##############################
415 
416  def _createFWLiteRun (self):
417  """(Internal) Creates an FWLite Run"""
418  # are there any files left?
419  if not self._filenames:
420  return False
421  if self._run:
422  del self._run
423  self._run = None
424  self._veryFirstTime = False
425  self._currFilename = self._filenames.pop(0)
426  #print "Opening file", self._currFilename
427  if self._tfile:
428  del self._tfile
429  self._tfile = ROOT.TFile.Open (self._currFilename)
430  self._run = ROOT.fwlite.Run (self._tfile);
431  self._run.toBegin()
432  return True
433 
434 
435  def _next (self):
436  """(Internal) Iterator internals"""
437  while True:
438  if self._run.atEnd():
439  if not self._createFWLiteRun():
440  # there are no more files here, so we are done
441  break
442  yield self
443  self._runCounts += 1
444  if self._maxRuns > 0 and self._runCounts >= self._maxRuns:
445  break
446  self._run.__preinc__()
447 
448 
449 ########################
450 ## ################## ##
451 ## ## ############ ## ##
452 ## ## ## Events ## ## ##
453 ## ## ############ ## ##
454 ## ################## ##
455 ########################
456 
457 class Events:
458  """Python interface to FWLite ChainEvent class"""
459 
460  def __init__(self, inputFiles = '', **kwargs):
461  """inputFiles => Either a single filename or a list of filenames
462  Optional arguments:
463  forceEvent => Use fwlite::Event IF there is only one file
464  maxEvents => Maximum number of events to process
465  """
466  self._veryFirstTime = True
467  self._event = 0
468  self._eventCounts = 0
469  self._maxEvents = 0
470  self._forceEvent = False
471  self._mode = None
473  if isinstance (inputFiles, list):
474  # it's a list
475  self._filenames = inputFiles[:]
476  elif isinstance (inputFiles, VarParsing):
477  # it's a VarParsing object
478  options = inputFiles
479  self._maxEvents = options.maxEvents
480  self._filenames = options.inputFiles
481  self._secondaryFilenames = options.secondaryInputFiles
482  else:
483  # it's probably a single string
484  self._filenames = [inputFiles]
485  ##############################
486  ## Parse optional arguments ##
487  ##############################
488  if kwargs.has_key ('maxEvents'):
489  self._maxEvents = kwargs['maxEvents']
490  del kwargs['maxEvents']
491  if kwargs.has_key ('forceEvent'):
492  self._forceEvent = kwargs['forceEvent']
493  del kwargs['forceEvent']
494  if kwargs.has_key ('options'):
495  options = kwargs ['options']
496  self._maxEvents = options.maxEvents
497  self._filenames = options.inputFiles
498  self._secondaryFilenames = options.secondaryInputFiles
499  del kwargs['options']
500  # Since we deleted the options as we used them, that means
501  # that kwargs should be empty. If it's not, that means that
502  # somebody passed in an argument that we're not using and we
503  # should complain.
504  if len (kwargs):
505  raise RuntimeError, "Unknown arguments %s" % kwargs
506  if not self._filenames:
507  raise RuntimeError, "No input files given"
508 
509 
510  def to (self, entryIndex):
511  """Jumps to event entryIndex"""
512  if self._veryFirstTime:
513  self._createFWLiteEvent()
514  return self._event.to ( long(entryIndex) )
515 
516 
517  def toBegin (self):
518  """Called to reset event loop to first event."""
519  self._toBegin = True
520 
521 
522  def size (self):
523  """Returns number of events"""
524  if self._veryFirstTime:
525  self._createFWLiteEvent()
526  return self._event.size()
527 
528 
529  def eventAuxiliary (self):
530  """Returns eventAuxiliary object"""
531  if self._veryFirstTime:
532  raise RuntimeError, "eventAuxiliary() called before "\
533  "toBegin() or to()"
534  return self._event.eventAuxiliary()
535 
536 
537  def object (self):
538  """Returns event object"""
539  return self._event
540 
541 
542  def getByLabel (self, *args):
543  """Calls FWLite's getByLabel. Called:
544  getByLabel (moduleLabel, handle)
545  getByLabel (moduleLabel, productInstanceLabel, handle),
546  getByLabel (moduleLabel, productInstanceLabel, processLabel, handle),
547  or
548  getByLabel ( (mL, pIL,pL), handle)
549  """
550  if self._veryFirstTime:
551  self._createFWLiteEvent()
552  length = len (args)
553  if length < 2 or length > 4:
554  # not called correctly
555  raise RuntimeError, "Incorrect number of arguments"
556  # handle is always the last argument
557  argsList = list (args)
558  handle = argsList.pop()
559  if len(argsList)==1 :
560  if( isinstance (argsList[0], tuple) or
561  isinstance (argsList[0], list) ) :
562  if len (argsList[0]) > 3:
563  raise RuntimeError, "getByLabel Error: label tuple has too " \
564  "many arguments '%s'" % argsList[0]
565  argsList = list(argsList[0])
566  if( type(argsList[0]) is str and ":" in argsList[0] ):
567  if argsList[0].count(":") > 3:
568  raise RuntimeError, "getByLabel Error: label tuple has too " \
569  "many arguments '%s'" % argsList[0].split(":")
570  argsList = argsList[0].split(":")
571  while len(argsList) < 3:
572  argsList.append ('')
573  (moduleLabel, productInstanceLabel, processLabel) = argsList
574  labelString = "'" + "', '".join(argsList) + "'"
575  if not handle._wrapper :
576  handle._resetWrapper()
577  handle._setStatus ( self._event.getByLabel( handle._typeInfoGetter(),
578  moduleLabel,
579  productInstanceLabel,
580  processLabel,
581  handle._addressOf() ),
582  labelString )
583  return handle.isValid()
584 
585 
586  def __iter__ (self):
587  return self._next()
588 
589 
590  def fileIndex (self):
591  if self._event:
592  return self._event.fileIndex()
593  else:
594  # default non-existant value is -1. Return something else
595  return -2
596 
597 
598  def secondaryFileIndex (self):
599  if self._event:
600  return self._event.secondaryFileIndex()
601  else:
602  # default non-existant value is -1. Return something else
603  return -2
604 
605 
606  def fileIndicies (self):
607  return (self.fileIndex(), self.secondaryFileIndex())
608 
609 
610  ## Private Member Functions ##
611 
612 
613  def _parseOptions (self, options):
614  """(Internal) Parse options"""
615 
616 
617  def _toBeginCode (self):
618  """(Internal) Does actual work of toBegin() call"""
619  self._toBegin = False
620  self._event.toBegin()
621  self._eventCounts = 0
622 
623 
624  def __del__ (self):
625  """(Internal) Destructor"""
626  # print "Goodbye cruel world, I'm leaving you today."
627  del self._event
628  # print "Goodbye, goodbye, goodbye."
629 
630 
631  def _createFWLiteEvent (self):
632  """(Internal) Creates an FWLite Event"""
633  self._veryFirstTime = False
634  self._toBegin = True
635  if isinstance (self._filenames[0], ROOT.TFile):
636  self._event = ROOT.fwlite.Event (self._filenames[0])
637  self._mode = 'single'
638  return self._mode
639  if len (self._filenames) == 1 and self._forceEvent:
640  self._tfile = ROOT.TFile.Open (self._filenames[0])
641  self._event = ROOT.fwlite.Event (self._tfile)
642  self._mode = 'single'
643  return self._mode
644  filenamesSVec = ROOT.vector("string") ()
645  for name in self._filenames:
646  filenamesSVec.push_back (name)
647  if self._secondaryFilenames:
648  secondarySVec = ROOT.vector("string") ()
649  for name in self._secondaryFilenames:
650  secondarySVec.push_back (name)
651  self._event = ROOT.fwlite.MultiChainEvent (filenamesSVec,
652  secondarySVec)
653  self._mode = 'multi'
654  else:
655  self._event = ROOT.fwlite.ChainEvent (filenamesSVec)
656  self._mode = 'chain'
657  return self._mode
658 
659 
660  def _next (self):
661  """(Internal) Iterator internals"""
662  if self._veryFirstTime:
663  self._createFWLiteEvent()
664  if self._toBegin:
665  self._toBeginCode()
666  while not self._event.atEnd() :
667  yield self
668  self._eventCounts += 1
669  if self._maxEvents > 0 and self._eventCounts >= self._maxEvents:
670  break
671  # Have we been asked to go to the first event?
672  if self._toBegin:
673  self._toBeginCode()
674  else:
675  # if not, lets go to the next event
676  self._event.__preinc__()
677 
678 
679 
680 if __name__ == "__main__":
681  # test code can go here
682  pass
_secondaryFilenames
Definition: __init__.py:326
## Events
Definition: __init__.py:457
def _typeInfoGetter
Definition: __init__.py:108
def _setStatus
Definition: __init__.py:118
def eventAuxiliary
Definition: __init__.py:529
def _createFWLiteEvent
Definition: __init__.py:631
def _resetWrapper
Private member functions ##.
Definition: __init__.py:96
## Runs
Definition: __init__.py:298
def getByLabel
Definition: __init__.py:210
def _createFWLiteLumi
Private Member Functions ##.
Definition: __init__.py:256
def luminosityBlockAuxiliary
Definition: __init__.py:203
def _parseOptions
Private Member Functions ##.
Definition: __init__.py:613
_maxRuns
Parse optional arguments ##.
Definition: __init__.py:304
def getByLabel
Definition: __init__.py:542
def __iter__
Definition: __init__.py:192
## Handle
Definition: __init__.py:49
if(c.getParameter< edm::InputTag >("puppiValueMap").label().size()!=0)
def getByLabel
Definition: __init__.py:368
def __init__
Definition: __init__.py:54
def fileIndicies
Definition: __init__.py:606
def _createFWLiteRun
Private Member Functions ##.
Definition: __init__.py:416
_maxLumis
Parse optional arguments ##.
Definition: __init__.py:146
## Lumis
Definition: __init__.py:140
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def __init__
Definition: __init__.py:142
def _toBeginCode
Definition: __init__.py:617
def __del__
Definition: __init__.py:343
def secondaryFileIndex
Definition: __init__.py:598
def __init__
Definition: __init__.py:300
def warn
Definition: __init__.py:20
_maxEvents
Parse optional arguments ##.
Definition: __init__.py:469
def _addressOf
Definition: __init__.py:113
double split
Definition: MVATrainer.cc:139
def __iter__
Definition: __init__.py:350
def setQuietWarn
Definition: __init__.py:16
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
def runAuxiliary
Definition: __init__.py:361