7 from pipe
import pipe
as _pipe
8 from options
import globalTag
9 from itertools
import islice
12 i = iterator.__iter__()
14 l =
list(islice(i, n))
41 if self.config.fragment:
42 self.
labels[
'process'] =
'fragment' 43 self.
labels[
'dict'] =
'fragment.__dict__' 45 self.
labels[
'process'] =
'process' 46 self.
labels[
'dict'] =
'process.__dict__' 48 if self.config.prescale
and (self.config.prescale.lower() !=
'none'):
49 self.
labels[
'prescale'] = self.config.prescale
52 from confdbOfflineConverter
import OfflineConverter
53 self.
converter = OfflineConverter(version = self.config.menu.version, database = self.config.menu.database)
61 if not self.config.setup:
64 if ".py" in self.config.setup:
65 self.config.setupFile = self.config.setup.split(
".py")[0]
67 args = [
'--configName', self.config.setup ]
68 args.append(
'--noedsources')
69 args.append(
'--nopaths')
70 for key, vals
in self.options.iteritems():
72 args.extend((
'--'+key,
','.
join(vals)))
74 data, err = self.converter.query( *args )
75 if 'ERROR' in err
or 'Exhausted Resultset' in err
or 'CONFIG_NOT_FOUND' in err:
76 sys.stderr.write(
"%s: error while retrieving the HLT setup menu\n\n" % os.path.basename(sys.argv[0]))
77 sys.stderr.write(err +
"\n\n")
79 self.config.setupFile =
"setup_"+self.config.setup[1:].
replace(
"/",
"_")+
"_cff" 80 file(self.config.setupFile+
".py",
"w+").
write(
"# This file is automatically generated by hltGetConfiguration.\n" + data)
83 if self.config.menu.run:
84 args = [
'--runNumber', self.config.menu.run]
86 args = [
'--configName', self.config.menu.name ]
87 args.append(
'--noedsources')
88 for key, vals
in self.options.iteritems():
90 args.extend((
'--'+key,
','.
join(vals)))
92 data, err = self.converter.query( *args )
93 if 'ERROR' in err
or 'Exhausted Resultset' in err
or 'CONFIG_NOT_FOUND' in err:
94 sys.stderr.write(
"%s: error while retrieving the HLT menu\n\n" % os.path.basename(sys.argv[0]))
95 sys.stderr.write(err +
"\n\n")
100 if self.config.menu.run:
101 args = [
'--runNumber', self.config.menu.run]
103 args = [
'--configName', self.config.menu.name]
113 data, err = self.converter.query( *args )
114 if 'ERROR' in err
or 'Exhausted Resultset' in err
or 'CONFIG_NOT_FOUND' in err:
115 sys.stderr.write(
"%s: error while retrieving the list of paths from the HLT menu\n\n" % os.path.basename(sys.argv[0]))
116 sys.stderr.write(err +
"\n\n")
118 filter = re.compile(
r' *= *cms.(End)?Path.*')
119 paths = [ filter.sub(
'', line)
for line
in data.splitlines()
if filter.search(line) ]
134 filter = re.compile(
r'^' + glob.replace(
'?',
'.').
replace(
'*',
'.*').
replace(
'[!',
'[^') +
r'$')
135 matches.extend( negate + element
for element
in collection
if filter.match(element) )
144 for element
in elements:
145 if element[0] ==
'-':
146 result.add( element )
148 result.discard(
'-' + element )
149 return sorted( element
for element
in result )
156 for element
in elements:
157 if element[0] ==
'-':
158 result.discard( element[1:] )
160 result.add( element )
161 return sorted( element
for element
in result )
167 if self.config.fragment:
168 self.
data = re.sub(
r'\bprocess\b',
'fragment', self.
data )
169 self.
data = re.sub(
r'\bProcess\b',
'ProcessFragment', self.
data )
176 if self.config.fragment:
178 # add specific customizations 179 from HLTrigger.Configuration.customizeHLTforALL import customizeHLTforAll 180 fragment = customizeHLTforAll(fragment,"%s") 181 """ % (self.config.type)
183 if self.config.type==
"Fake":
187 _gtData =
"auto:"+prefix+
"_hlt_"+self.config.type
188 _gtMc =
"auto:"+prefix+
"_mc_" +self.config.type
190 # add specific customizations 192 _customInfo['menuType' ]= "%s" 193 _customInfo['globalTags']= {} 194 _customInfo['globalTags'][True ] = "%s" 195 _customInfo['globalTags'][False] = "%s" 196 _customInfo['inputFiles']={} 197 _customInfo['inputFiles'][True] = "file:RelVal_Raw_%s_DATA.root" 198 _customInfo['inputFiles'][False] = "file:RelVal_Raw_%s_MC.root" 199 _customInfo['maxEvents' ]= %s 200 _customInfo['globalTag' ]= "%s" 201 _customInfo['inputFile' ]= %s 202 _customInfo['realData' ]= %s 203 from HLTrigger.Configuration.customizeHLTforALL import customizeHLTforAll 204 %%(process)s = customizeHLTforAll(%%(process)s,"%s",_customInfo) 205 """ % (self.config.type,_gtData,_gtMc,self.config.type,self.config.type,self.config.events,self.config.globaltag,self.
source,self.config.data,self.config.type)
208 from HLTrigger.Configuration.customizeHLTforCMSSW import customizeHLTforCMSSW 209 %%(process)s = customizeHLTforCMSSW(%%(process)s,"%s") 210 """ % (self.config.type)
214 # Eras-based customisations 215 from HLTrigger.Configuration.Eras import modifyHLTforEras 216 modifyHLTforEras(%(process)s) 219 if self.config.customise:
221 self.
data +=
"#User-defined customization functions\n" 222 for customise
in self.config.customise.split(
","):
223 customiseValues = customise.split(
".")
224 if len(customiseValues)>=3:
raise Exception(
"--customise option cannot contain more than one dot.")
225 if len(customiseValues)==1:
226 customiseValues.append(
"customise")
227 customiseValues[0] = customiseValues[0].
replace(
"/",
".")
228 self.
data +=
"from "+customiseValues[0]+
" import "+customiseValues[1]+
"\n" 229 self.
data +=
"process = "+customiseValues[1]+
"(process)\n" 235 if not self.config.fragment:
239 if self.config.type
in (
'HIon', ):
241 if not self.config.fragment:
242 self.
_fix_parameter( type =
'InputTag', value =
'rawDataCollector', replace =
'rawDataRepacker')
265 if self.config.fragment:
267 # dummyfy hltGetConditions in cff's 268 if 'hltGetConditions' in %(dict)s and 'HLTriggerFirstPath' in %(dict)s : 269 %(process)s.hltDummyConditions = cms.EDFilter( "HLTBool", 270 result = cms.bool( True ) 272 %(process)s.HLTriggerFirstPath.replace(%(process)s.hltGetConditions,%(process)s.hltDummyConditions) 277 match = re.match(
r'(Scouting\w+)Output$', path)
279 module =
'hltOutput' + match.group(1)
280 self.
data = self.data.replace(path+
' = cms.EndPath', path+
' = cms.Path')
281 self.
data = self.data.replace(
' + process.'+module,
'')
313 # limit the number of events to be processed 314 %%(process)s.maxEvents = cms.untracked.PSet( 315 input = cms.untracked.int32( %d ) 317 """ % self.config.events
320 # enable TrigReport, TimeReport and MultiThreading 321 %(process)s.options = cms.untracked.PSet( 322 wantSummary = cms.untracked.bool( True ), 323 numberOfThreads = cms.untracked.uint32( 4 ), 324 numberOfStreams = cms.untracked.uint32( 0 ), 325 sizeOfStackForThreadsInKB = cms.untracked.uint32( 10*1024 ) 331 name: parameter name (optional) 332 type: parameter type (look for tracked and untracked variants) 333 value: original value 334 replace: replacement value 338 r'%(name)s = cms(?P<tracked>(?:\.untracked)?)\.%(type)s\( (?P<quote>["\']?)%(value)s(?P=quote)' % args,
339 r'%(name)s = cms\g<tracked>.%(type)s( \g<quote>%(replace)s\g<quote>' % args,
343 r'cms(?P<tracked>(?:\.untracked)?)\.%(type)s\( (?P<quote>["\']?)%(value)s(?P=quote)' % args,
344 r'cms\g<tracked>.%(type)s( \g<quote>%(replace)s\g<quote>' % args,
351 if self.
options[
'paths'][0][0] ==
'-':
353 for minuspath
in self.
options[
'paths']:
355 self.
data = re.sub(
r' cms.PSet\( pathName = cms.string\( "%s" \),\n prescales = cms.vuint32\( .* \)\n \),?\n' % path,
'', self.
data)
359 if path
not in self.
options[
'paths']:
360 self.
data = re.sub(
r' cms.PSet\( pathName = cms.string\( "%s" \),\n prescales = cms.vuint32\( .* \)\n \),?\n' % path,
'', self.
data)
362 if self.config.prescale
and (self.config.prescale.lower() !=
'none'):
365 # force the use of a specific HLT prescale column 366 if 'PrescaleService' in %(dict)s: 367 %(process)s.PrescaleService.forceDefault = True 368 %(process)s.PrescaleService.lvl1DefaultLabel = '%(prescale)s' 375 filters = [ match[1]
for match
in re.findall(
r'(process\.)?\b(\w+) = cms.EDFilter', self.
data) ]
376 re_sequence = re.compile(
r'cms\.(Path|Sequence)\((.*)\)' )
378 self.
data = re_sequence.sub(
lambda line: re.sub(
r'cms\.ignore *\( *((process\.)?\b(\w+)) *\)',
r'\1', line.group(0) ), self.
data )
379 self.
data = re_sequence.sub(
lambda line: re.sub(
r'~',
'', line.group(0) ), self.
data )
381 for some
in splitter(filters, 1000):
382 re_filters = re.compile(
r'\b((process\.)?(' +
r'|'.
join(some) +
r'))\b' )
383 self.
data = re_sequence.sub(
lambda line: re_filters.sub(
r'cms.ignore( \1 )', line.group(0) ), self.
data )
387 if self.config.errortype:
389 self.
_fix_parameter(name =
'SelectedTriggerType', type =
'int32', value =
'1', replace =
'0')
390 self.
_fix_parameter(name =
'SelectedTriggerType', type =
'int32', value =
'2', replace =
'0')
391 self.
_fix_parameter(name =
'SelectedTriggerType', type =
'int32', value =
'3', replace =
'0')
407 if not self.config.data
and not self.config.globaltag:
408 if self.config.type
in globalTag:
409 self.config.globaltag = globalTag[self.config.type]
411 self.config.globaltag = globalTag[
'GRun']
414 if self.config.l1.override:
415 self.config.l1.tag = self.config.l1.override
416 self.config.l1.record =
'L1TUtmTriggerMenuRcd' 417 self.config.l1.connect =
'' 418 self.config.l1.label =
'' 419 if not self.config.l1.snapshotTime:
420 self.config.l1.snapshotTime =
'9999-12-31 23:59:59.000' 421 self.config.l1cond =
'%(tag)s,%(record)s,%(connect)s,%(label)s,%(snapshotTime)s' % self.config.l1.__dict__
423 self.config.l1cond =
None 425 if self.config.globaltag
or self.config.l1cond:
427 # override the GlobalTag, connection string and pfnPrefix 428 if 'GlobalTag' in %(dict)s: 429 from Configuration.AlCa.GlobalTag import GlobalTag as customiseGlobalTag 430 %(process)s.GlobalTag = customiseGlobalTag(%(process)s.GlobalTag""" 431 if self.config.globaltag:
432 text +=
", globaltag = %s" % repr(self.config.globaltag)
433 if self.config.l1cond:
434 text +=
", conditions = %s" % repr(self.config.l1cond)
440 if self.config.l1Xml.XmlFile:
442 # override the GlobalTag's L1T menu from an Xml file 443 from HLTrigger.Configuration.CustomConfigs import L1XML 444 %%(process)s = L1XML(%%(process)s,"%s") 445 """ % (self.config.l1Xml.XmlFile)
450 if self.config.emulator:
452 # run the Full L1T emulator, then repack the data into a new RAW collection, to be used by the HLT 453 from HLTrigger.Configuration.CustomConfigs import L1REPACK 454 %%(process)s = L1REPACK(%%(process)s,"%s") 455 """ % (self.config.emulator)
461 r'\b(process\.)?hltOutput(\w+) *= *cms\.OutputModule\( *"ShmStreamConsumer" *,',
462 r'%(process)s.hltOutput\2 = cms.OutputModule( "PoolOutputModule",\n fileName = cms.untracked.string( "output\2.root" ),\n fastCloning = cms.untracked.bool( False ),\n dataset = cms.untracked.PSet(\n filterName = cms.untracked.string( "" ),\n dataTier = cms.untracked.string( "RAW" )\n ),',
466 if not self.config.fragment
and self.config.output ==
'minimal':
469 # add a single "keep *" output 470 %(process)s.hltOutputMinimal = cms.OutputModule( "PoolOutputModule", 471 fileName = cms.untracked.string( "output.root" ), 472 fastCloning = cms.untracked.bool( False ), 473 dataset = cms.untracked.PSet( 474 dataTier = cms.untracked.string( 'AOD' ), 475 filterName = cms.untracked.string( '' ) 477 outputCommands = cms.untracked.vstring( 'drop *', 478 'keep edmTriggerResults_*_*_*', 479 'keep triggerTriggerEvent_*_*_*' 482 %(process)s.MinimalOutput = cms.EndPath( %(process)s.hltOutputMinimal ) 484 elif not self.config.fragment
and self.config.output ==
'full':
487 # add a single "keep *" output 488 %(process)s.hltOutputFull = cms.OutputModule( "PoolOutputModule", 489 fileName = cms.untracked.string( "output.root" ), 490 fastCloning = cms.untracked.bool( False ), 491 dataset = cms.untracked.PSet( 492 dataTier = cms.untracked.string( 'RECO' ), 493 filterName = cms.untracked.string( '' ) 495 outputCommands = cms.untracked.vstring( 'keep *' ) 497 %(process)s.FullOutput = cms.EndPath( %(process)s.hltOutputFull ) 502 if self.config.eras
is None:
504 self.
data = re.sub(
r'process = cms.Process\( *"\w+"',
'from Configuration.StandardSequences.Eras import eras\n\g<0>, '+
', '.
join(
'eras.' + era
for era
in self.config.eras.split(
',')), self.
data)
508 if self.config.setup
is None:
510 processLine = self.data.find(
"\n",self.data.find(
"cms.Process"))
511 self.
data = self.
data[:processLine]+
'\nprocess.load("%s")'%self.config.setupFile+self.
data[processLine:]
515 if self.config.name
is None:
519 self.config.name = self.config.name.replace(
"_",
"")
522 self.
data = re.compile(
r'^(process\s*=\s*cms\.Process\(\s*' + quote +
r')\w+(' + quote +
r'\s*\).*)$', re.MULTILINE).sub(
r'\1%s\2' % self.config.name, self.
data, 1)
525 if self.config.setup: self.
data +=
""" 526 # avoid PrescaleService error due to missing HLT paths 527 if 'PrescaleService' in process.__dict__: 528 for pset in reversed(process.PrescaleService.prescaleTable): 529 if not hasattr(process,pset.pathName.value()): 530 process.PrescaleService.prescaleTable.remove(pset) 537 if 'MessageLogger' in %(dict)s: 538 %(process)s.MessageLogger.categories.append('TriggerSummaryProducerAOD') 539 %(process)s.MessageLogger.categories.append('L1GtTrigReport') 540 %(process)s.MessageLogger.categories.append('L1TGlobalSummary') 541 %(process)s.MessageLogger.categories.append('HLTrigReport') 542 %(process)s.MessageLogger.categories.append('FastReport') 550 if 'GlobalTag' in %%(dict)s: 552 for condition
in conditions:
553 self.
data +=
""" %%(process)s.GlobalTag.toGet.append( 555 record = cms.string( '%(record)s' ), 556 tag = cms.string( '%(tag)s' ), 557 label = cms.untracked.string( '%(label)s' ), 565 if self.config.fragment:
566 return 'from %s import *\n' % module
568 return 'process.load( "%s" )\n' % module
576 self.
data +=
"if '%s' in %%(dict)s:\n" % module
577 for (parameter, value)
in parameters:
578 self.
data +=
" %%(process)s.%s.%s = %s\n" % (module, parameter, value)
584 if self.config.timing:
586 # instrument the menu with the modules and EndPath needed for timing studies 589 self.
data +=
'\n# configure the FastTimerService\n' 590 self.
loadCff(
'HLTrigger.Timer.FastTimerService_cfi')
592 self.
data +=
"""# print a text summary at the end of the job 593 %(process)s.FastTimerService.printEventSummary = False 594 %(process)s.FastTimerService.printRunSummary = False 595 %(process)s.FastTimerService.printJobSummary = True 598 %(process)s.FastTimerService.enableDQM = True 600 # enable per-path DQM plots (starting with CMSSW 9.2.3-patch2) 601 %(process)s.FastTimerService.enableDQMbyPath = True 603 # enable per-module DQM plots 604 %(process)s.FastTimerService.enableDQMbyModule = True 606 # enable per-event DQM plots vs lumisection 607 %(process)s.FastTimerService.enableDQMbyLumiSection = True 608 %(process)s.FastTimerService.dqmLumiSectionsRange = 2500 610 # set the time resolution of the DQM plots 611 %(process)s.FastTimerService.dqmTimeRange = 2000. 612 %(process)s.FastTimerService.dqmTimeResolution = 10. 613 %(process)s.FastTimerService.dqmPathTimeRange = 1000. 614 %(process)s.FastTimerService.dqmPathTimeResolution = 5. 615 %(process)s.FastTimerService.dqmModuleTimeRange = 200. 616 %(process)s.FastTimerService.dqmModuleTimeResolution = 1. 618 # set the base DQM folder for the plots 619 %(process)s.FastTimerService.dqmPath = 'HLT/TimerService' 620 %(process)s.FastTimerService.enableDQMbyProcesses = False 625 if not self.config.hilton:
627 if 'hltDQMFileSaver' in self.
data:
628 self.
data = re.sub(
r'\b(process\.)?hltDQMFileSaver \+ ',
'', self.
data)
629 self.
data = re.sub(
r' \+ \b(process\.)?hltDQMFileSaver',
'', self.
data)
630 self.
data = re.sub(
r'\b(process\.)?hltDQMFileSaver',
'', self.
data)
633 dqmstore =
"\n# load the DQMStore and DQMRootOutputModule\n" 635 dqmstore +=
"%(process)s.DQMStore.enableMultiThread = True\n" 637 %(process)s.dqmOutput = cms.OutputModule("DQMRootOutputModule", 638 fileName = cms.untracked.string("DQMIO.root") 642 empty_path = re.compile(
r'.*\b(process\.)?DQMOutput = cms\.EndPath\( *\).*')
643 other_path = re.compile(
r'(.*\b(process\.)?DQMOutput = cms\.EndPath\()(.*)')
644 if empty_path.search(self.
data):
646 self.
data = empty_path.sub(dqmstore +
'\n%(process)s.DQMOutput = cms.EndPath( %(process)s.dqmOutput )\n', self.
data)
647 elif other_path.search(self.
data):
649 self.
data = other_path.sub(dqmstore +
r'\g<1> %(process)s.dqmOutput +\g<3>', self.
data)
652 self.
data += dqmstore
653 self.
data +=
'\n%(process)s.DQMOutput = cms.EndPath( %(process)s.dqmOutput )\n' 658 sys.stderr.write(
'Path selection:\n')
660 sys.stderr.write(
'\t%s\n' % path)
661 sys.stderr.write(
'\n\n')
666 if self.config.paths:
668 paths = self.config.paths.split(
',')
678 if self.config.fragment
or self.config.output
in (
'none', ):
679 if self.config.paths:
684 paths.append(
"-*Output" )
685 paths.append(
"-RatesMonitoring")
686 paths.append(
"-DQMHistograms")
687 if self.config.fragment: paths.append(
"Scouting*Output" )
689 elif self.config.output
in (
'dqm',
'minimal',
'full'):
690 if self.config.paths:
692 paths.append(
"DQMHistograms" )
695 paths.append(
"-*Output" )
696 paths.append(
"-RatesMonitoring")
697 if self.config.fragment: paths.append(
"Scouting*Output" )
700 if self.config.paths:
702 paths.append(
"*Output" )
703 paths.append(
"DQMHistograms" )
709 if self.config.profiling:
710 paths.append(
"-HLTAnalyzerEndpath" )
713 paths.append(
"-OfflineOutput" )
718 if self.config.paths:
722 raise RuntimeError(
'Error: option "--paths %s" does not select any valid paths' % self.config.paths)
738 if not self.config.hilton:
744 if self.config.fragment:
748 self.
options[
'essources'].
append(
"-XMLIdealGeometryESSource" )
753 self.
options[
'esmodules'].
append(
"-AutoMagneticFieldESProducer" )
768 self.
options[
'esmodules'].
append(
"-CaloTowerHardcodeGeometryEP" )
769 self.
options[
'esmodules'].
append(
"-CastorHardcodeGeometryEP" )
772 self.
options[
'esmodules'].
append(
"-EcalElectronicsMappingBuilder" )
774 self.
options[
'esmodules'].
append(
"-EcalLaserCorrectionService" )
775 self.
options[
'esmodules'].
append(
"-EcalPreshowerGeometryEP" )
776 self.
options[
'esmodules'].
append(
"-HcalHardcodeGeometryEP" )
778 self.
options[
'esmodules'].
append(
"-MuonNumberingInitialization" )
779 self.
options[
'esmodules'].
append(
"-ParametrizedMagneticFieldProducer" )
782 self.
options[
'esmodules'].
append(
"-SiStripRecHitMatcherESProducer" )
783 self.
options[
'esmodules'].
append(
"-SiStripQualityESProducer" )
784 self.
options[
'esmodules'].
append(
"-StripCPEfromTrackAngleESProducer" )
785 self.
options[
'esmodules'].
append(
"-TrackerDigiGeometryESModule" )
786 self.
options[
'esmodules'].
append(
"-TrackerGeometricDetESModule" )
787 self.
options[
'esmodules'].
append(
"-VolumeBasedMagneticFieldESProducer" )
790 self.
options[
'esmodules'].
append(
"-L1GtTriggerMaskAlgoTrigTrivialProducer" )
791 self.
options[
'esmodules'].
append(
"-L1GtTriggerMaskTechTrigTrivialProducer" )
792 self.
options[
'esmodules'].
append(
"-hltESPEcalTrigTowerConstituentsMapBuilder" )
793 self.
options[
'esmodules'].
append(
"-hltESPGlobalTrackingGeometryESProducer" )
794 self.
options[
'esmodules'].
append(
"-hltESPMuonDetLayerGeometryESProducer" )
795 self.
options[
'esmodules'].
append(
"-hltESPTrackerRecoGeometryESProducer" )
798 self.
options[
'esmodules'].
append(
"-CaloTowerGeometryFromDBEP" )
799 self.
options[
'esmodules'].
append(
"-CastorGeometryFromDBEP" )
800 self.
options[
'esmodules'].
append(
"-EcalBarrelGeometryFromDBEP" )
801 self.
options[
'esmodules'].
append(
"-EcalEndcapGeometryFromDBEP" )
802 self.
options[
'esmodules'].
append(
"-EcalPreshowerGeometryFromDBEP" )
814 self.
options[
'modules'].
append(
"-hltOutputScoutingCaloMuon" )
817 if self.config.fragment
or (self.config.prescale
and (self.config.prescale.lower() ==
'none')):
820 if self.config.fragment
or self.config.timing:
825 if len(filenames) > 255:
832 self.
data +=
" %s = cms.untracked.vstring%s\n" % (name, token_open)
833 for line
in filenames:
834 self.
data +=
" '%s',\n" % line
835 self.
data +=
" %s,\n" % (token_close)
840 if input[0:8] ==
'dataset:':
841 from dasFileQuery
import dasFileQuery
847 files = input.split(
',')
851 if self.config.input:
854 elif self.config.data:
856 self.
source = [
"file:RelVal_Raw_%s_DATA.root" % self.config.type ]
859 self.
source = [
"file:RelVal_Raw_%s_MC.root" % self.config.type ]
861 if self.config.parent:
866 %(process)s.source = cms.Source( "PoolSource", 872 inputCommands = cms.untracked.vstring( def __init__(self, configuration)
def splitter(iterator, n)
def addGlobalOptions(self)
def getSetupConfigurationFromDB(self)
def overrideProcessName(self)
def instrumentErrorEventType(self)
def replace(string, replacements)
def expand_filenames(self, input)
def updateMessageLogger(self)
def overrideL1MenuXml(self)
def overrideGlobalTag(self)
def specificCustomize(self)
def consolidatePositiveList(elements)
def overrideParameters(self, module, parameters)
def instrumentOpenMode(self)
def getRawConfigurationFromDB(self)
def loadAdditionalConditions(self, comment, conditions)
def loadCffCommand(self, module)
static std::string join(char **cmd)
def loadCff(self, module)
def consolidateNegativeList(elements)
def instrumentTiming(self)
def expandWildcards(globs, collection)
def _fix_parameter(self, args)
def append_filenames(self, name, filenames)
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