5 '''@file MTMonitoring.py
6 @authors P-A. Delsart, Jona Bossio
8 @brief Python configuration for the Run III Trigger Jet Monitoring
11 from AthenaCommon.Logging
import logging
12 logger = logging.getLogger(__name__)
14 from TrigDecisionTool.TrigDecisionToolConfig
import getRun3NavigationContainerFromInput
16 from JetMonitoring.JetStandardHistoSpecs
import knownHistos
32 OfflineJetCollections =
dict()
34 OfflineJetCollections[
'pp'] = {
35 'AntiKt4EMTopoJets' : {
'MatchTo' :
'AntiKt4EMPFlowJets' },
36 'AntiKt4EMPFlowJets' : {
'MatchTo' :
'NONE' },
40 OfflineJetCollections[
'HI'] = {
41 'AntiKt4HIJets' : {
'MatchTo' :
'AntiKt4HIJets' },
54 match_smallRL1_OfflineJets_List = [
'AntiKt4EMPFlowJets',
'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf']
56 match_largeRL1_OfflineJets_List = [
'AntiKt4EMPFlowJets',
'HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf']
57 match_HIL1_OfflineJets_List = [
'AntiKt4HIJets',
'HLT_AntiKt4HIJets']
59 L1JetCollections[
'pp'] = {
62 'MatchTo' : match_smallRL1_OfflineJets_List},
64 'L1_jFexSRJetRoI': {
'MatchTo': match_smallRL1_OfflineJets_List},
66 'L1_gFexSRJetRoI': {
'MatchTo': match_smallRL1_OfflineJets_List},
68 'L1_gFexLRJetRoI': {
'MatchTo': match_largeRL1_OfflineJets_List},
71 L1JetCollections[
'HI'] = {
72 'LVL1JetRoIs' : {
'MatchTo' : match_HIL1_OfflineJets_List},
73 'L1_jFexSRJetRoI': {
'MatchTo': match_HIL1_OfflineJets_List},
74 'L1_gFexSRJetRoI': {
'MatchTo': match_HIL1_OfflineJets_List},
77 for case
in L1JetCollections.keys():
79 items = L1JetCollections[case].
items()
80 except (AttributeError, TypeError):
81 raise RuntimeError(
'L1JetCollections for %s is not a mapping type'%case)
86 except (AttributeError, TypeError):
87 raise RuntimeError(
'L1JetCollections value for %s is not a mapping type'%case)
89 if 'MatchTo' not in d:
90 errmsg =
'L1Collections entry %s has no (possibly empty) MatchType list' % (
92 raise RuntimeError(errmsg)
101 l1Coll2MatcherKey = {
102 'LVL1JetRoIs':
'L1JetContainerName1',
103 'L1_jFexSRJetRoI':
'L1jFexSRJetRoIContainerName',
104 'L1_gFexSRJetRoI':
'L1gFexJetRoIContainerName',
105 'L1_gFexLRJetRoI':
'L1gFexJetRoIContainerName',
108 for case
in L1JetCollections.keys():
109 for k, d
in L1JetCollections[case].
items():
111 if k
not in l1Coll2MatcherKey:
112 errmsg =
'Match(es) to an L1 container requested entry '\
113 '%s but no C++ MatcherAlg attribute name provided' % (
str(k),)
114 raise RuntimeError(errmsg)
122 Chain2L1JetCollDict[
'pp'] = {
123 'L1_J15': [
'LVL1JetRoIs'],
124 'L1_J20': [
'LVL1JetRoIs'],
125 'L1_J100': [
'LVL1JetRoIs'],
127 'L1_jJ40': [
'L1_jFexSRJetRoI'],
128 'L1_jJ50': [
'L1_jFexSRJetRoI'],
129 'L1_jJ160': [
'L1_jFexSRJetRoI'],
130 'L1_jJ85p0ETA21_3jJ40p0ETA25': [
'L1_jFexSRJetRoI'],
131 'L1_3jJ70p0ETA23': [
'L1_jFexSRJetRoI'],
132 'L1_4jJ40': [
'L1_jFexSRJetRoI'],
134 'L1_gJ20': [
'L1_gFexSRJetRoI'],
135 'L1_gJ50': [
'L1_gFexSRJetRoI'],
136 'L1_gJ100': [
'L1_gFexSRJetRoI'],
138 'L1_gJ160': [
'L1_gFexSRJetRoI'],
140 'L1_gLJ80': [
'L1_gFexLRJetRoI'],
141 'L1_gLJ120': [
'L1_gFexLRJetRoI'],
142 'L1_gLJ140': [
'L1_gFexLRJetRoI'],
144 'L1_SC111-CjJ40': [
'L1_jFexSRJetRoI'],
145 'L1_HT190-jJ40s5pETA21': [
'L1_jFexSRJetRoI'],
148 Chain2L1JetCollDict[
'HI'] = {
149 'L1_J15': [
'LVL1JetRoIs'],
150 'L1_J20': [
'LVL1JetRoIs'],
151 'L1_J100': [
'LVL1JetRoIs'],
155 Legacy2PhaseIjJThresholdDict = {
173 Legacy2PhaseIgJThresholdDict = {
192 Legacy2PhaseIgLJThresholdDict = {
205 JetCollections[
'pp'] = {
206 'HLT_AntiKt4EMTopoJets_subjesIS' : {
'MatchTo' :
'AntiKt4EMPFlowJets'},
207 'HLT_AntiKt4EMTopoJets_subjesIS_fastftag' : {
'MatchTo' :
'NONE'},
208 'HLT_AntiKt4EMTopoJets_subresjesgscIS_ftf' : {
'MatchTo' :
'AntiKt4EMPFlowJets'},
209 'HLT_AntiKt4EMTopoJets_subjesgscIS_ftf' : {
'MatchTo' :
'AntiKt4EMPFlowJets'},
210 'HLT_AntiKt4EMPFlowJets_subjesgscIS_ftf' : {
'MatchTo' :
'AntiKt4EMPFlowJets'},
211 'HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf' : {
'MatchTo' :
'AntiKt4EMPFlowJets'},
212 'HLT_AntiKt4EMPFlowJets_nojcalib_ftf' : {
'MatchTo' :
'NONE'},
213 'HLT_AntiKt10EMTopoRCJets_subjesIS' : {
'MatchTo' :
'NONE'},
214 'HLT_AntiKt10LCTopoJets_subjes' : {
'MatchTo' :
'NONE'},
215 'HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes' : {
'MatchTo' :
'NONE'},
216 'HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_nojcalib_ftf' : {
'MatchTo' :
'NONE'},
217 'HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf' : {
'MatchTo' :
'NONE'},
220 JetCollections[
'HI'] = {
221 'HLT_AntiKt4HIJets' : {
'MatchTo':
'AntiKt4HIJets'},
222 'HLT_AntiKt4EMTopoJets_subjesIS' : {
'MatchTo':
'AntiKt4HIJets'},
223 'HLT_AntiKt4EMPFlowJets_jes_ftf' : {
'MatchTo':
'AntiKt4HIJets'}
229 Chains2Monitor =
dict()
230 from TrigConfigSvc.TriggerConfigAccess
import getHLTMonitoringAccess
235 ListOfMonChains = monAccess.monitoredChains(signatures=
"jetMon", monLevels = [
"shifter",
"t0"])
237 default_dict = {
"HLTColl":
"NONE",
"RefChain":
"NONE" ,
"OfflineColl":
"NONE"}
238 Chains2Monitor[monMode] =
dict((chain, default_dict.copy())
for chain
in ListOfMonChains)
241 for chainName
in Chains2Monitor[
'HI']:
242 if '_ion_' in chainName:
243 Chains2Monitor[
'HI'][chainName][
"HLTColl"] =
"HLT_AntiKt4HIJets"
244 Chains2Monitor[
'HI'][chainName][
"OfflineColl"] =
"AntiKt4HIJets"
246 Chains2Monitor[
'HI'][chainName][
"HLTColl"] =
"HLT_AntiKt4EMTopoJets_subjesIS"
247 Chains2Monitor[
'HI'][chainName][
"OfflineColl"] =
"AntiKt4EMPFlowJets"
248 elif monMode ==
"pp":
250 for chainName
in Chains2Monitor[
'pp']:
251 Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt4EMTopoJets_subjesIS"
252 if '_pf_' in chainName
and 'a10' not in chainName:
253 Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt4EMPFlowJets_subresjesgscIS_ftf"
254 Chains2Monitor[
'pp'][chainName][
"OfflineColl"] =
"AntiKt4EMPFlowJets"
255 elif 'a10' in chainName:
256 if 'a10t' in chainName: Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt10LCTopoTrimmedPtFrac4SmallR20Jets_jes"
257 elif 'sd_cssk_pf' in chainName: Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf"
258 elif 'a10r' in chainName: Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt10EMTopoRCJets_subjesIS"
259 else: Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt10LCTopoJets_subjes"
260 elif '_noalg_' in chainName:
261 Chains2Monitor[
'pp'][chainName][
"RefChain"] =
"HLT_j45_pf_ftf_preselj20_L1jJ40"
262 Chains2Monitor[
'pp'][chainName][
"OfflineColl"] =
"AntiKt4EMPFlowJets"
263 if 'gLJ' in chainName: Chains2Monitor[
'pp'][chainName][
"HLTColl"] =
"HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf"
268 if Chains2Monitor[
'pp'].
get(
'HLT_j420_L1J100'): Chains2Monitor[
'pp'][
'HLT_j420_L1J100'].
update({
"RefChain":
"HLT_j85_L1J20",
"OfflineColl":
"AntiKt4EMPFlowJets"})
269 if Chains2Monitor[
'pp'].
get(
'HLT_3j200_L1J100'): Chains2Monitor[
'pp'][
'HLT_3j200_L1J100'].
update({
"RefChain":
"HLT_j85_L1J20",
"OfflineColl":
"AntiKt4EMPFlowJets"})
270 if Chains2Monitor[
'pp'].
get(
'HLT_4j120_L13J50'): Chains2Monitor[
'pp'][
'HLT_4j120_L13J50'].
update({
"RefChain":
"HLT_j85_L1J20",
"OfflineColl":
"AntiKt4EMPFlowJets"})
271 if Chains2Monitor[
'pp'].
get(
'HLT_5j80_pf_ftf_presel5j50_L14J15'): Chains2Monitor[
'pp'][
'HLT_5j80_pf_ftf_presel5j50_L14J15'].
update({
"RefChain":
"HLT_j45_pf_ftf_preselj20_L1J15",
"OfflineColl":
"AntiKt4EMPFlowJets"})
272 if Chains2Monitor[
'pp'].
get(
'HLT_j400_pf_ftf_L1J100'): Chains2Monitor[
'pp'][
'HLT_j400_pf_ftf_L1J100'].
update({
"RefChain":
"HLT_j85_pf_ftf_preselj50_L1J20",
"OfflineColl":
"AntiKt4EMPFlowJets"})
273 if Chains2Monitor[
'pp'].
get(
'HLT_j400_pf_ftf_preselj225_L1J100'): Chains2Monitor[
'pp'][
'HLT_j400_pf_ftf_preselj225_L1J100'].
update({
"RefChain":
"HLT_j85_pf_ftf_preselj50_L1J20",
"OfflineColl":
"AntiKt4EMPFlowJets"})
275 if Chains2Monitor[
'pp'].
get(
'HLT_j420_L1jJ160'): Chains2Monitor[
'pp'][
'HLT_j420_L1jJ160'].
update({
"RefChain":
"HLT_j85_L1jJ50",
"OfflineColl":
"AntiKt4EMPFlowJets"})
276 if Chains2Monitor[
'pp'].
get(
'HLT_3j200_L1jJ160'): Chains2Monitor[
'pp'][
'HLT_3j200_L1jJ160'].
update({
"RefChain":
"HLT_j85_L1jJ50",
"OfflineColl":
"AntiKt4EMPFlowJets"})
277 if Chains2Monitor[
'pp'].
get(
'HLT_4j120_L13jJ90'): Chains2Monitor[
'pp'][
'HLT_4j120_L13jJ90'].
update({
"RefChain":
"HLT_j85_L1jJ50",
"OfflineColl":
"AntiKt4EMPFlowJets"})
278 if Chains2Monitor[
'pp'].
get(
'HLT_5j80_pf_ftf_presel5j50_L14jJ40'): Chains2Monitor[
'pp'][
'HLT_5j80_pf_ftf_presel5j50_L14jJ40'].
update({
"RefChain":
"HLT_j45_pf_ftf_preselj20_L1jJ40",
"OfflineColl":
"AntiKt4EMPFlowJets"})
279 if Chains2Monitor[
'pp'].
get(
'HLT_j400_pf_ftf_L1jJ160'): Chains2Monitor[
'pp'][
'HLT_j400_pf_ftf_L1jJ160'].
update({
"RefChain":
"HLT_j85_pf_ftf_preselj50_L1jJ50",
"OfflineColl":
"AntiKt4EMPFlowJets"})
280 if Chains2Monitor[
'pp'].
get(
'HLT_j400_pf_ftf_preselj225_L1jJ160'): Chains2Monitor[
'pp'][
'HLT_j400_pf_ftf_preselj225_L1jJ160'].
update({
"RefChain":
"HLT_j85_pf_ftf_preselj50_L1jJ50",
"OfflineColl":
"AntiKt4EMPFlowJets"})
283 errmsg =
'Returned empty Chains2Monitor due to invalid monMode'
284 raise RuntimeError(errmsg)
285 return Chains2Monitor
292 etaMin,etaMax = 0,2.5
294 etaParts = chain.split(
'eta')
295 etaMinTemp = etaParts[0].
split(
'_')
296 etaMin = etaMinTemp[len(etaMinTemp)-1]
297 etaMin =
int(etaMin)/10
298 etaMax = etaParts[1].
split(
'_')[0]
299 etaMax =
int(etaMax)/10
304 xbins, xmin, xmax = 160,0.,800000.
306 if varname ==
"pt" or varname ==
"et":
308 if 'jJ500' in chain
or 'J400' in chain:
return 160,xmin,800000
309 else:
return 100,xmin,500000
312 threshold =
int(re.search(
r'\d+',chain.split(
"_")[1].
split(
'j')[1]).
group())
314 return 40, 0., 100000.
316 return 36, 20000., 200000.
319 xmin = 50000.+100000.*(
int(threshold/100)-1)
320 if threshold % 100 == 0:
321 xmin = 1000.*(threshold - 100.)
322 xmax = xmin + 200000.
332 xbins, xmin, xmax = 35, 30000., 100000.
333 return xbins, xmin, xmax
336 parts = chain.split(
'HT')
337 threshold = parts[1].
split(
'_')[0]
338 if 'XX' in threshold:
339 threshold = threshold.split(
'XX')[0]
340 xmin =
int(0.9 *
int(threshold))
342 xbins =
int((xmax-xmin)/binwidth)-1
343 return xbins, xmin, xmax
351 xvar = f
"{network_prefix}_p{f}"
352 varname = f
"ftag_p{f}"
353 fillerTools += [HistoSpec(varname, xvar=xvar, bins=(70, -0.2, 1.2), title=f
"{varname};{varname};;Entries")]
354 fastDipsSelectSpec = SelectSpec(f
"{network_prefix}_{cutname}",
'20<pt:GeV&|eta|<3.2', path=
'NoTriggerSelection/'+cutname, FillerTools=fillerTools)
355 conf.appendHistos(fastDipsSelectSpec)
360 from JetMonitoring.JetMonitoringConfig
import JetMonAlgSpec, HistoSpec, EventHistoSpec, SelectSpec, ToolSpec
361 from AthenaConfiguration.ComponentFactory
import CompFactory
364 ExtraOfflineHists = [
371 "TrackWidthPt1000[0]",
376 ExtraSmallROnlineHists = [
377 HistoSpec(
'et:GeV;eta', (100,0,750, 50,-5,5) , title=
'#eta vs E_{T};E_{T} [GeV];#eta;Entries'),
388 ExtraLargeROnlineHists = [
391 ExtraOnlineNJetHists = [
404 OfflineScaleMomenta = [
"ConstitScale",
"EMScale",
"PileupScale",
"EtaJESScale"]
405 OnlineScaleMomenta = [
"ConstitScale" ]
406 for var
in [
"pt",
"eta",
"m" ]:
407 for offlinescale
in OfflineScaleMomenta:
408 ExtraOfflineHists.append(
"Jet"+offlinescale+
"Momentum_"+var)
409 for onlinescale
in OnlineScaleMomenta:
410 ExtraSmallROnlineHists.append(
"Jet"+onlinescale+
"Momentum_"+var)
412 OnlineScaleMomenta.append(
"")
413 OfflineScaleMomenta.append(
"")
418 Schedules JetCopier tool to make a shallow copy of
419 the original offline/HLT jet container, for the JetMatcherAlg to decorate.
420 This prevents our jet monitoring from decorating
421 the original jet containers, which may end up being
422 persistified in AOD/ESD (ATLASRECTS-7168,ATR-27980,ATR-26076)
424 jcopy = CompFactory.JetCopier(
431 jprovider = CompFactory.JetRecAlg(
432 "jetalg_copy_"+outjets,
435 OutputContainer = outjets,
442 Schedules L1JetCopyAlgorithm to make a shallow copy of
443 the original L1 jet container, for the JetMatcherAlg to decorate.
444 This prevents our jet monitoring from decorating
445 the original jet containers, which may end up being
446 persistified in AOD/ESD (ATLASRECTS-7168,ATR-27980,ATR-26076).
447 The L1JetCopyAlgorithm is a templated class (e.g. L1JetCopyAlgorithm<JTM_JetRoIContainer>).
448 The python class name is what is generated by Athena during build time.
449 The template types are defined in JTMContainers.h.
452 jcopy_alg_name =
"l1jetcopy_alg_"+injets
453 if injets ==
"LVL1JetRoIs":
454 jcopy_alg = CompFactory.L1JetCopyAlgorithm_JTM_JetRoIContainer_(jcopy_alg_name)
455 elif injets ==
"L1_jFexSRJetRoI":
456 jcopy_alg = CompFactory.L1JetCopyAlgorithm_JTM_jFexSRJetRoIContainer_(jcopy_alg_name)
457 elif injets
in [
"L1_gFexSRJetRoI",
"L1_gFexLRJetRoI"]:
458 jcopy_alg = CompFactory.L1JetCopyAlgorithm_JTM_gFexJetRoIContainer_(jcopy_alg_name)
460 raise ValueError(f
"L1 jet container {injets} not recognised")
461 jcopy_alg.JetInContainerName = injets
462 jcopy_alg.JetOutContainerName = outjets
468 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
472 if inputFlags.Reco.EnableHI: monMode =
'HI'
480 for chain,chaindict
in Chains2Monitor[monMode].
items():
481 if chaindict[
'HLTColl']
not in JetCollections[case]:
482 JetCollections[case][chaindict[
'HLTColl']] = {
'MatchTo':
'NONE'}
485 CopiedJetCollections = copy.deepcopy(JetCollections)
486 for hltColl,collDict
in JetCollections[monMode].
items():
487 if collDict[
'MatchTo'] !=
'NONE':
488 copiedhltColl = f
'{hltColl}_{copySuffix}'
489 CopiedJetCollections[monMode][copiedhltColl] = CopiedJetCollections[monMode].pop(hltColl)
491 jetcopyalg.ExtraInputs.add((
'xAOD::TrigCompositeContainer',
493 cfg.addEventAlgo(jetcopyalg)
494 for jetcalibscale
in OnlineScaleMomenta:
495 scalestring =
"_"+jetcalibscale
if jetcalibscale !=
"" else ""
496 name =
'Matching_{}{}_{}'.
format(hltColl,scalestring,collDict[
'MatchTo'])
497 alg = CompFactory.JetMatcherAlg(name,
498 JetContainerName1=copiedhltColl,
499 JetContainerName2=collDict[
'MatchTo'],
500 JetCalibScale=jetcalibscale)
502 alg.ExtraInputs.add((
'xAOD::TrigCompositeContainer',
504 cfg.addEventAlgo(alg)
507 CopiedOfflineJetCollections = copy.deepcopy(OfflineJetCollections)
508 for offjetColl,collDict
in OfflineJetCollections[monMode].
items():
509 if collDict[
'MatchTo'] !=
'NONE':
510 copiedjetcoll = f
'{offjetColl}_{copySuffix}'
511 CopiedOfflineJetCollections[monMode][copiedjetcoll] = CopiedOfflineJetCollections[monMode].pop(offjetColl)
513 cfg.addEventAlgo(jetcopyalg)
514 for jetcalibscale
in OfflineScaleMomenta:
515 scalestring =
"_"+jetcalibscale
if jetcalibscale !=
"" else ""
516 name =
'Matching_{}{}_{}'.
format(offjetColl,scalestring,collDict[
'MatchTo'])
517 alg = CompFactory.JetMatcherAlg(name,
518 JetContainerName1=copiedjetcoll,
519 JetContainerName2=collDict[
'MatchTo'],
520 JetCalibScale=jetcalibscale)
522 alg.ExtraInputs.add((
'xAOD::TrigCompositeContainer',
524 cfg.addEventAlgo(alg)
528 CopiedL1JetCollections = copy.deepcopy(L1JetCollections)
529 for l1jetColl,collDict
in L1JetCollections[monMode].
items():
530 copiedl1jetColl = f
'{l1jetColl}_{copySuffix}'
531 CopiedL1JetCollections[monMode][copiedl1jetColl] = CopiedL1JetCollections[monMode].pop(l1jetColl)
533 l1jetcopyalg.ExtraInputs.add((
'xAOD::TrigCompositeContainer',
535 cfg.addEventAlgo(l1jetcopyalg)
536 for matchjetcoll
in collDict[
'MatchTo']:
538 kwds = {
'name':
'Matching_{}_{}'.
format(l1jetColl,matchjetcoll),
539 l1Coll2MatcherKey[l1jetColl]: copiedl1jetColl,
540 'JetContainerName2': matchjetcoll,
544 alg = CompFactory.JetMatcherAlg(**kwds)
545 alg.ExtraInputs.add((
'xAOD::TrigCompositeContainer',
547 cfg.addEventAlgo(alg)
551 from AthenaMonitoring
import AthMonitorCfgHelper
552 helper = AthMonitorCfgHelper(inputFlags,
'TrigJetMonitorAlgorithm')
554 from AthenaMonitoring.EventFlagFilterToolConfig
import EventFlagFilterToolCfg
555 from AthenaMonitoring.BadLBFilterToolConfig
import LArBadLBFilterToolCfg
557 for jetcoll
in CopiedL1JetCollections[monMode]:
559 alg=l1jetconf.toAlg(helper)
563 for chain,jetcolls
in Chain2L1JetCollDict[monMode].
items():
564 for jetcoll
in jetcolls:
566 alg=l1chainconf.toAlg(helper)
570 for jetcoll
in CopiedOfflineJetCollections[monMode]:
571 offlineMonitorConf =
jetMonitoringConfig(inputFlags,jetcoll,CopiedOfflineJetCollections,monMode)
572 alg=offlineMonitorConf.toAlg(helper)
576 for jetcoll
in CopiedJetCollections[monMode]:
580 monitorConf.toAlg(helper)
583 for chain,chainDict
in Chains2Monitor[monMode].
items():
584 jetcoll = chainDict[
'HLTColl']
588 alg=chainMonitorConfT.toAlg(helper)
592 alg=chainMonitorConfF.toAlg(helper)
595 if chainDict[
'RefChain'] !=
'NONE' and chainDict[
'OfflineColl'] !=
'NONE':
597 effMonitorConf.toAlg(helper)
599 cfg.merge(helper.result())
606 path =
'NoTriggerSelection' if isOnline
else 'standardHistos/'
607 minNjetBin = 1
if isOnline
else 0
609 TopLevelDir =
'HLT/JetMon/'
610 TopLevelDir +=
'Online/' if isOnline
else 'Offline/'
612 jetcollFolder = jetcoll
613 jetcollFolder=jetcoll.replace(f
"_{copySuffix}",
"")
614 Conf = JetMonAlgSpec(jetcoll+
"Mon",JetContainerName = jetcoll, defaultPath = path, topLevelDir=TopLevelDir, bottomLevelDir=jetcollFolder, failureOnMissingContainer=
False)
617 knownHistos[
'phi_tight'] = HistoSpec(
'phi_tight',
618 (50,-math.pi,math.pi),
619 title=
'#phi;#phi;Entries',
651 SelectSpec(
'central',
'|eta|<3.2', path, FillerTools = [
"pt",
"et",
"m"] ),
652 SelectSpec(
'forward',
'3.2<|eta|', path, FillerTools = [
"pt",
"et",
"m"] ),
653 SelectSpec(
'lowmu',
'avgMu<30', path, isEventVariable=
True, FillerTools = [
"pt",
"et",
"m",
"phi",
"eta"]),
654 SelectSpec(
'highmu',
'30<avgMu', path, isEventVariable=
True, FillerTools = [
"pt",
"et",
"m",
"phi",
"eta"]),
658 EventHistoSpec(
'njets', (25,minNjetBin,25), title=
'NJets;NJets;Entries' ),
659 EventHistoSpec(
'njetsPt20', (25,minNjetBin,25), title=
'NJetsPt20;NJetsPt20;Entries' ),
660 EventHistoSpec(
'njetsPt50', (25,minNjetBin,25), title=
'NJetsPt50;NJetsPt50;Entries' ),
689 '''Function to configures some algorithms in the monitoring system.'''
691 isOnline =
True if 'HLT' in jetcoll
else False
694 jetCollMonDetails = jetCollDict[monMode][jetcoll]
698 if 'AntiKt4' in jetcoll
or 'a4tcem' in jetcoll:
699 for hist
in ExtraSmallROnlineHists: conf.appendHistos(hist)
701 conf.appendHistos(
"Jvt")
702 conf.appendHistos(
"JVFCorr")
703 conf.appendHistos(
"JvtRpt")
704 conf.appendHistos(
"SumPtTrkPt500[0]")
705 conf.appendHistos(
"NumTrkPt1000[0]")
706 conf.appendHistos(
"TrackWidthPt1000[0]")
708 conf.appendHistos(
"SumPtChargedPFOPt500[0]")
709 conf.appendHistos(
"fCharged")
710 if "subresjesgscIS" in jetcoll:
714 if 'fastftag' in jetcoll:
719 if 'EMTopo' in jetcoll:
720 conf.appendHistos(
"Timing")
722 for hist
in ExtraLargeROnlineHists: conf.appendHistos(hist)
724 if jetCollMonDetails[
'MatchTo'] !=
'NONE':
725 def defineHistoForHLTJetMatch(conf, parentAlg, monhelper , path):
727 group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+
'/'+conf.bottomLevelDir+
'/NoTriggerSelection/')
729 for histname
in [
'ptdiff',
'energydiff',
'massdiff' ]:
730 group.defineHistogram(histname,title=histname, type=
"TH1F",
731 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
732 xbins=100 , xmin=-100000., xmax=100000. ,)
734 for histname
in [
'ptresp',
'energyresp',
'massresp' ]:
735 group.defineHistogram(histname,title=histname, type=
"TH1F",
736 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
737 xbins=100 , xmin=-2., xmax=2. ,)
739 group.defineHistogram(
'ptresp,ptref;ptresp_vs_ptRef',title=
'ptresponse vs ptRef', type=
"TH2F",
740 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
741 xbins=10 , xmin=-2., xmax=2., ybins=10, ymin=0., ymax=500000.,)
743 group.defineHistogram(
'ptresp,etaref;ptresp_vs_etaRef',title=
'ptresponse vs etaRef', type=
"TH2F",
744 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
745 xbins=10 , xmin=-2., xmax=2., ybins=10, ymin=-5., ymax=5.,)
747 matchedJetColl = jetCollMonDetails[
'MatchTo']
750 jetmatchKey =
'{}.matched_{}'.
format(jetcoll,matchedJetColl)
751 jetptdiffKey =
'{}.ptdiff_{}'.
format(jetcoll,matchedJetColl)
752 jetenergydiffKey =
'{}.energydiff_{}'.
format(jetcoll,matchedJetColl)
753 jetmassdiffKey =
'{}.massdiff_{}'.
format(jetcoll,matchedJetColl)
754 jetptrespKey =
'{}.ptresp_{}'.
format(jetcoll,matchedJetColl)
755 jetenergyrespKey =
'{}.energyresp_{}'.
format(jetcoll,matchedJetColl)
756 jetmassrespKey =
'{}.massresp_{}'.
format(jetcoll,matchedJetColl)
757 jetptrefKey =
'{}.ptRef_{}'.
format(jetcoll,matchedJetColl)
758 jetetarefKey =
'{}.etaRef_{}'.
format(jetcoll,matchedJetColl)
759 name =
'jetMatched_{}_{}'.
format(jetcoll,matchedJetColl)
760 conf.appendHistos(ToolSpec(
'JetHistoMatchedFiller', name,
761 JetMatchedKey=jetmatchKey, JetPtDiffKey=jetptdiffKey,
762 JetEnergyDiffKey=jetenergydiffKey,
763 JetMassDiffKey=jetmassdiffKey, JetPtRespKey=jetptrespKey,
764 JetEnergyRespKey=jetenergyrespKey, JetMassRespKey=jetmassrespKey,
765 JetPtRefKey=jetptrefKey,JetEtaRefKey=jetetarefKey,
766 defineHistoFunc=defineHistoForHLTJetMatch,Group=
'matchedJets_'+jetcoll)
769 for hist
in ExtraOfflineHists: conf.appendHistos(hist)
770 if 'AntiKt4' in jetcoll
and monMode==
"pp":
771 conf.appendHistos(SelectSpec(
'LooseBadFailedJets',
'LooseBad',
779 conf.appendHistos(
"SumPtChargedPFOPt500[0]")
780 conf.appendHistos(
"fCharged")
781 elif 'EMTopo' in jetcoll:
782 conf.appendHistos(
"Timing")
783 if jetCollMonDetails[
'MatchTo'] !=
'NONE':
784 def defineHistoForOfflineJetMatch(conf, parentAlg, monhelper , path):
786 group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+
'/'+conf.bottomLevelDir+
'/standardHistos/')
788 for histname
in [
'ptdiff',
'energydiff',
'massdiff' ]:
789 group.defineHistogram(histname,title=histname, type=
"TH1F",
790 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
791 xbins=100 , xmin=-100000., xmax=100000. ,)
793 for histname
in [
'ptresp',
'energyresp',
'massresp' ]:
794 group.defineHistogram(histname,title=histname, type=
"TH1F",
795 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
796 xbins=100 , xmin=-2., xmax=2. ,)
798 group.defineHistogram(
'ptresp,ptref;ptresp_vs_ptRef',title=
'ptresp vs ptRef', type=
"TH2F",
799 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
800 xbins=10 , xmin=-2., xmax=2., ybins=10, ymin=0., ymax=500000.,)
802 group.defineHistogram(
'ptresp,etaref;ptresp_vs_etaRef',title=
'ptresp vs etaRef', type=
"TH2F",
803 path=
'MatchedJets_{}'.
format(jetCollMonDetails[
'MatchTo']),
804 xbins=10 , xmin=-2., xmax=2., ybins=10, ymin=-5., ymax=5.,)
806 matchedJetColl = jetCollMonDetails[
'MatchTo']
807 jetmatchKey =
'{}.matched_{}'.
format(jetcoll,matchedJetColl)
808 jetptdiffKey =
'{}.ptdiff_{}'.
format(jetcoll,matchedJetColl)
809 jetenergydiffKey =
'{}.energydiff_{}'.
format(jetcoll,matchedJetColl)
810 jetmassdiffKey =
'{}.massdiff_{}'.
format(jetcoll,matchedJetColl)
811 jetptrespKey =
'{}.ptresp_{}'.
format(jetcoll,matchedJetColl)
812 jetenergyrespKey =
'{}.energyresp_{}'.
format(jetcoll,matchedJetColl)
813 jetmassrespKey =
'{}.massresp_{}'.
format(jetcoll,matchedJetColl)
814 jetptrefKey =
'{}.ptRef_{}'.
format(jetcoll,matchedJetColl)
815 jetetarefKey =
'{}.etaRef_{}'.
format(jetcoll,matchedJetColl)
816 name =
'jetMatched_{}_{}'.
format(jetcoll,matchedJetColl)
817 conf.appendHistos(ToolSpec(
'JetHistoMatchedFiller',name,
818 JetMatchedKey=jetmatchKey, JetPtDiffKey=jetptdiffKey,
819 JetEnergyDiffKey=jetenergydiffKey,
820 JetMassDiffKey=jetmassdiffKey, JetPtRespKey=jetptrespKey,
821 JetEnergyRespKey=jetenergyrespKey,
822 JetMassRespKey=jetmassrespKey,
823 JetPtRefKey=jetptrefKey, JetEtaRefKey=jetetarefKey,
824 defineHistoFunc=defineHistoForOfflineJetMatch,Group=
'matchedJets_'+jetcoll)
831 from TrigJetMonitoring.L1JetMonitoringConfig
import L1JetMonAlg
832 name = jetColl
if chain==
'' else jetColl+
'_'+chain
835 jetColl = jetColl.replace(f
"_{copySuffix}",
"")
837 if not jetDict[monMode][jetCollKey][
'MatchTo']:
838 conf = L1JetMonAlg(name,jetColl,jetCollKey,chain)
840 assert len(jetDict[monMode][jetCollKey][
'MatchTo']) == 2
842 conf = L1JetMonAlg(name,jetColl,jetCollKey,chain,
843 matched,jetDict[monMode][jetCollKey][
'MatchTo'][0],
844 jetDict[monMode][jetCollKey][
'MatchTo'][1])
849 '''Function to configures some algorithms in the monitoring system.'''
851 jetcollFolder = jetcoll
856 jetMonAlgSpecName = chain+
"TrigMon"
857 if not onlyUsePassingJets:
858 chainFolder = chainFolder +
"/ExpertHistos"
859 jetMonAlgSpecName = jetMonAlgSpecName +
"_ExpertHistos"
863 return parts[1].
split(
'_')[0]
865 def getEtaRangeString(chain):
866 etaMin, etaMax = 0, 32
868 etaParts = chain.split(
'eta')
869 etaMinTemp = etaParts[0].
split(
'_')
870 etaMin = etaMinTemp[len(etaMinTemp)-1]
871 etaMax = etaParts[1].
split(
'_')[0]
874 return 'Eta{}_{}'.
format(etaMin,etaMax)
876 def getNjetHistName(chain):
877 NjetHistName =
'NONE'
878 parts = chain.split(
'j')
880 multiplicity = parts[0].
split(
'_')[1]
881 if (chain.count(
'_j')-chain.count(
'_jes')) > 1
or multiplicity !=
'':
886 trigConf = JetMonAlgSpec(
888 JetContainerName = jetcoll,
889 TriggerChain = chain,
890 defaultPath = chainFolder,
891 topLevelDir=
"HLT/JetMon/Online/",
892 bottomLevelDir=jetcollFolder,
893 failureOnMissingContainer=
True,
894 onlyPassingJets=onlyUsePassingJets,
895 isExpressStreamJob=inputFlags.Common.doExpressProcessing,
898 trigConf.appendHistos(
907 for hist
in ExtraOnlineNJetHists: trigConf.appendHistos(EventHistoSpec(hist, (20,0,25), title=hist+
';'+hist+
';Entries'))
909 if 'ht' not in chain
and 'HT' not in chain
and 'dijet' not in chain
and 'DIJET' not in chain
and 'fbdj' not in chain
and 'noalg' not in chain:
910 NjetHistName = getNjetHistName(chain)
911 from JetMonitoring.JetStandardHistoSpecs
import knownEventVar
912 if knownEventVar.get(NjetHistName,
None)
is not None and NjetHistName
not in ExtraOnlineNJetHists:
913 trigConf.appendHistos(
914 EventHistoSpec(NjetHistName, (25,0,25), title=NjetHistName+
';'+NjetHistName+
';Entries' ),
916 NjetHistName = NjetHistName.replace(
'Et',
'Pt')
917 if knownEventVar.get(NjetHistName,
None)
is not None and NjetHistName
not in ExtraOnlineNJetHists:
918 trigConf.appendHistos(
919 EventHistoSpec(NjetHistName, (25,0,25), title=NjetHistName+
';'+NjetHistName+
';Entries' ),
921 if 'ftf' in chain
and 'a10' not in chain:
922 trigConf.appendHistos(
"Jvt")
923 trigConf.appendHistos(
"JVFCorr")
924 trigConf.appendHistos(
"JvtRpt")
926 if 'ht' in chain
or 'HT' in chain:
927 def defineHistoForHTChain(conf, parentAlg, monhelper , path):
929 group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+jetcollFolder+
'/')
932 group.defineHistogram(
"jetHT;HT",title=
"Jet HT;H_{T} [GeV];Entries", type=
"TH1F", path=chainFolder, xbins=xbins , xmin=xmin, xmax=xmax ,)
933 trigConf.appendHistos(ToolSpec(
'JetHistoHTFiller',
'JetHistoHTFiller_'+chain,MinPt=30.,MaxEta=3.2,FailureOnMissingContainer=
False,
934 defineHistoFunc=defineHistoForHTChain,Group=
'jetHT_'+jetcoll))
939 '''Function to configures some algorithms in the monitoring system.'''
941 jetcollFolder = onlinejetcoll
949 def defineHistoForJetTrigg(conf, parentAlg, monhelper , path):
951 group = monhelper.addGroup(parentAlg, conf.Group, conf.topLevelDir+jetcollFolder+
'/')
953 append =
"offlineCut_"+conf.name.split(
"_")[-1]
if "offlineCut" in conf.name
else "noOfflineCut"
954 histname =
"trigEff_vs_"+conf.Var.Name+
"_"+append
956 group.defineHistogram(
'trigPassed,jetVar;'+histname, title=histname, type=
"TEfficiency",
958 xbins=xbins , xmin=xmin, xmax=xmax,)
961 validchain = chain.replace(
'noalg',
'j0')
962 parts = validchain.split(
'j')
963 multiplicity = parts[0].
split(
'_')[1]
964 if multiplicity !=
'': index =
int(multiplicity) - 1
968 from JetMonitoring.JetMonitoringConfig
import retrieveVarToolConf
969 trigConf = JetMonAlgSpec(
971 JetContainerName = offlinejetcoll,
972 TriggerChain = refChain,
973 defaultPath = chainFolder,
974 topLevelDir =
"HLT/JetMon/Online/",
975 bottomLevelDir = jetcollFolder,
976 failureOnMissingContainer =
True,
977 onlyPassingJets =
False,
979 trigConf.appendHistos(
980 SelectSpec(
'eff',
'{}<|eta|<{}'.
format(etaMin,etaMax), chainFolder, SelectedIndex=index, FillerTools = [
982 ToolSpec(
'JetHistoTriggEfficiency', chain,
984 Group=
'jetTrigGroup_'+chain,
987 ProbeTrigChain=chain,defineHistoFunc=defineHistoForJetTrigg),
992 trigConf.appendHistos(
993 SelectSpec(
'm50',
'50<m:GeV&{}<|eta|<{}'.
format(etaMin,etaMax), chainFolder, SelectedIndex=index, FillerTools = [
994 ToolSpec(
'JetHistoTriggEfficiency', chain+
'_offlineCut_m50',
995 Group=
'jetTrigGroup_'+chain+
'_m50',
997 ProbeTrigChain=chain,defineHistoFunc=defineHistoForJetTrigg
1000 SelectSpec(
'et500',
'500<et:GeV&{}<|eta|<{}'.
format(etaMin,etaMax), chainFolder, SelectedIndex=index, FillerTools = [
1001 ToolSpec(
'JetHistoTriggEfficiency', chain+
'_offlineCut_et500',
1002 Group=
'jetTrigGroup_'+chain+
'_et500',
1005 ProbeTrigChain=chain,defineHistoFunc=defineHistoForJetTrigg
1012 if __name__==
'__main__':
1017 parser = argparse.ArgumentParser()
1018 parser.add_argument(
'--runTruthReco', action=
'store_true', dest=
'runTruthReco', default=
False)
1019 parser.add_argument(
'--genOfflineR10PF', action=
'store_true', dest=
'genOfflineR10PF', default=
False)
1020 parser.add_argument(
'--printDetailedConfig', action=
'store_true', dest=
'printDetailedConfig', default=
False)
1021 parser.add_argument(
'--input', action=
'store', dest=
'inputFile')
1022 args = parser.parse_args()
1023 RunTruth = args.runTruthReco
1024 GenOfflineR10PF = args.genOfflineR10PF
1025 PrintDetailedConfig = args.printDetailedConfig
1028 if args.inputFile
is not None: inputFile = args.inputFile
1030 logger.error(
'ERROR: No input file provided, exiting')
1034 from AthenaCommon.Logging
import log
1039 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
1041 flags.Input.Files = [inputFile]
1042 flags.Input.isMC =
True
1043 flags.Output.HISTFileName =
'AthenaMTMonitorOutput.root'
1047 if flags.Reco.EnableHI: monMode =
'HI'
1055 for chain,chaindict
in Chains2Monitor[monMode].
items():
1056 if chaindict[
'HLTColl']
not in JetCollections[case]:
1057 JetCollections[case][chaindict[
'HLTColl']] = {
'MatchTo':
'NONE'}
1060 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
1061 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
1065 outputlist = [
"xAOD::EventInfo#*",
"xAOD::VertexContainer#*",
"xAOD::JetContainer#AntiKt4*Jets",
"xAOD::JetAuxContainer#AntiKt4*JetsAux.-PseudoJet",
"xAOD::JetContainer#HLT_*",
"xAOD::JetAuxContainer#HLT_*Aux.-PseudoJet",
"xAOD::ShallowAuxContainer#HLT_*Aux.-PseudoJet"]
1068 from JetRecConfig.StandardSmallRJets
import AntiKt4Truth
1070 from JetRecConfig.JetRecConfig
import JetRecCfg
1074 key =
"{0}Jets".
format(AntiKt4Truth.basename)
1075 outputlist += [
"xAOD::JetContainer#"+key,
"xAOD::JetAuxContainer#"+key+
"Aux.-PseudoJet"]
1079 from JetRecConfig.JetDefinition
import JetConstitSeq, JetDefinition, xAODType
1080 EMPFlowCSSK = JetConstitSeq(
"EMPFlowCSSK", xAODType.ParticleFlow, [
"CorrectPFO",
"CS",
"SK",
"CHS"],
"JetETMissParticleFlowObjects",
"CSSKParticleFlowObjects", label=
"EMPFlowCSSK")
1081 AntiKt10EMPFlowCSSK = JetDefinition(
"AntiKt",1.0,EMPFlowCSSK,ptmin=2e3,)
1082 AntiKt10EMPFlowCSSK.modifiers = [
"ConstitFourMom",
"Sort",
"Filter:2000"]
1083 from JetRecConfig.JetGrooming
import JetSoftDrop
1084 from JetRecConfig.StandardLargeRJets
import standardrecomods,substrmods
1085 AntiKt10EMPFlowCSSKSoftDrop = JetSoftDrop(AntiKt10EMPFlowCSSK,modifiers=standardrecomods+substrmods,ZCut=0.1,Beta=1.0)
1087 from JetRecConfig.JetRecConfig
import JetRecCfg
1088 comp =
JetRecCfg(AntiKt10EMPFlowCSSKSoftDrop,flags)
1091 key =
"{0}Jets".
format(AntiKt10EMPFlowCSSKSoftDrop.basename)
1092 outputlist += [
"xAOD::JetContainer#"+key,
"xAOD::JetAuxContainer#"+key+
"Aux.-PseudoJet"]
1095 if RunTruth
or GenOfflineR10PF:
1097 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
1104 from AthenaMonitoring
import AthMonitorCfgHelper
1105 helper = AthMonitorCfgHelper(flags,
'TrigJetMonitorAlgorithm')
1106 cfg.merge(helper.result())
1109 for hltColl,collDict
in JetCollections[monMode].
items():
1110 if collDict[
'MatchTo'] !=
'NONE':
1111 for jetcalibscale
in OnlineScaleMomenta:
1112 scalestring =
"_"+jetcalibscale
if jetcalibscale !=
"" else ""
1113 name =
'Matching_{}{}_{}'.
format(hltColl,scalestring,collDict[
'MatchTo'])
1114 alg = CompFactory.JetMatcherAlg(name, JetContainerName1=hltColl,JetContainerName2=collDict[
'MatchTo'],JetCalibScale=jetcalibscale)
1116 cfg.addEventAlgo(alg,sequenceName=
'AthMonSeq_TrigJetMonitorAlgorithm')
1119 for offjetColl,collDict
in OfflineJetCollections[monMode].
items():
1120 if collDict[
'MatchTo'] !=
'NONE':
1121 for jetcalibscale
in OfflineScaleMomenta:
1122 scalestring =
"_"+jetcalibscale
if jetcalibscale !=
"" else ""
1123 name =
'Matching_{}{}_{}'.
format(offjetColl,scalestring,collDict[
'MatchTo'])
1124 alg = CompFactory.JetMatcherAlg(name, JetContainerName1=offjetColl,JetContainerName2=collDict[
'MatchTo'],JetCalibScale=jetcalibscale)
1126 cfg.addEventAlgo(alg,sequenceName=
'AthMonSeq_TrigJetMonitorAlgorithm')
1129 for l1jetColl,collDict
in L1JetCollections[monMode].
items():
1130 for matchjetcoll
in collDict[
'MatchTo']:
1131 if matchjetcoll !=
'NONE':
1132 name =
'Matching_{}_{}'.
format(l1jetColl,matchjetcoll)
1133 alg = CompFactory.JetMatcherAlg(name, L1JetContainerName1=l1jetColl,JetContainerName2=matchjetcoll,MatchL1=
True)
1135 cfg.addEventAlgo(alg,sequenceName=
'AthMonSeq_TrigJetMonitorAlgorithm')
1138 for jetcoll
in L1JetCollections[monMode]:
1140 l1jetconf.toAlg(helper)
1143 for chain,jetcoll
in Chain2L1JetCollDict[monMode].
items():
1145 l1chainconf.toAlg(helper)
1148 for jetcoll
in OfflineJetCollections[monMode]:
1150 offlineMonitorConf.toAlg(helper)
1153 for jetcoll
in JetCollections[monMode]:
1157 monitorConf.toAlg(helper)
1160 for chain,chainDict
in Chains2Monitor[monMode].
items():
1161 jetcoll = chainDict[
'HLTColl']
1165 chainMonitorConfT.toAlg(helper)
1168 chainMonitorConfF.toAlg(helper)
1170 if chainDict[
'RefChain'] !=
'NONE' and chainDict[
'OfflineColl'] !=
'NONE':
1172 chainDict[
'OfflineColl'], chain,
1173 chainDict[
'RefChain'])
1174 effMonitorConf.toAlg(helper)
1176 cfg.merge(helper.result())
1179 cfg.printConfig(withDetails=PrintDetailedConfig)