ATLAS Offline Software
Loading...
Searching...
No Matches
TRIG9.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2#========================================================================
3# TRIG9.py
4# This defines DAOD_TRIG9, a DAOD format for Run 3.
5# It contains the variables and objects needed for TauTrigger performance
6# such as online and offline tracks, RoIs, and offline objects.
7# Only events passing single lepton or tau trigger chains are kept.
8# It requires the flag TRIG9 in Derivation_tf.py
9#========================================================================
10
11from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
12from AthenaConfiguration.ComponentFactory import CompFactory
13from AthenaConfiguration.Enums import MetadataCategory
14
15# Main algorithm config
16def TRIG9KernelCfg(flags, name='TRIG9Kernel', **kwargs):
17 """Configure the derivation framework driving algorithm (kernel) for TRIG9"""
18 acc = ComponentAccumulator()
19
20 # Augmentations
21 augmentationTools = [ ]
22
23 # Common augmentations
24 from DerivationFrameworkPhys.PhysCommonConfig import PhysCommonAugmentationsCfg
25 acc.merge(PhysCommonAugmentationsCfg(flags, TriggerListsHelper = kwargs['TriggerListsHelper']))
26
27 from DerivationFrameworkTau.TauCommonConfig import AddTauAugmentationCfg
28 acc.merge(AddTauAugmentationCfg(flags, wp="GNTauLoose"))
29
30 from TriggerMenuMT.TriggerAPI.TriggerAPI import TriggerAPI
31 from TriggerMenuMT.TriggerAPI.TriggerEnums import TriggerPeriod
32
33 #allperiods = TriggerPeriod.y2015 | TriggerPeriod.y2016 | TriggerPeriod.y2017 | TriggerPeriod.y2018 | TriggerPeriod.future2e34
34 allperiods = TriggerPeriod.future2e34
35 TriggerAPI.setConfigFlags(flags)
36 trig_all = list(TriggerAPI.getAllHLT(allperiods).keys())
37
38 # Add in Run 3 triggers
39 TriggerListsHelper = kwargs['TriggerListsHelper']
40 trig_all += TriggerListsHelper.Run3TriggerNames
41
42 # Thinning tools...
43 # track thinning
44 from DerivationFrameworkInDet.InDetToolsConfig import TrackParticleThinningCfg
45 tp_thinning_expression = "InDetTrackParticles.DFCommonTightPrimary && abs(DFCommonInDetTrackZ0AtPV)*sin(InDetTrackParticles.theta) < 3.0*mm && InDetTrackParticles.pt > 10*GeV"
46 TRIG9TrackParticleThinningTool = acc.getPrimaryAndMerge(TrackParticleThinningCfg(
47 flags,
48 name = 'TRIG9TrackParticleThinningTool',
49 StreamName = kwargs['StreamName'],
50 SelectionString = tp_thinning_expression,
51 InDetTrackParticlesKey = "InDetTrackParticles"))
52
53 # Include inner detector tracks associated with muons
54 from DerivationFrameworkInDet.InDetToolsConfig import MuonTrackParticleThinningCfg
55 TRIG9MuonTrackParticleThinningTool = acc.getPrimaryAndMerge(MuonTrackParticleThinningCfg(
56 flags,
57 name = 'TRIG9MuonTrackParticleThinningTool',
58 StreamName = kwargs['StreamName'],
59 MuonKey = "Muons",
60 InDetTrackParticlesKey = "InDetTrackParticles"))
61
62 # tau thinning
63 from DerivationFrameworkTau.TauCommonConfig import TauThinningCfg
64 #tau_thinning_expression = "TauJets.pt >= 20*GeV"
65 tau_thinning_expression = "( TauJets.pt >= 20*GeV && abs(TauJets.eta) < 2.5 && abs(TauJets.charge)==1.0 && (TauJets.nTracks == 1 || TauJets.nTracks == 3) )"
66
67 TRIG9TauJetThinningTool = acc.getPrimaryAndMerge(TauThinningCfg(
68 flags,
69 name = 'TRIG9TauJetThinningTool',
70 StreamName = kwargs['StreamName'],
71 Taus = "TauJets",
72 TauTracks = "TauTracks",
73 TrackParticles = "InDetTrackParticles",
74 TauNeutralPFOs = "TauNeutralParticleFlowObjects",
75 TauSecondaryVertices = "TauSecondaryVertices",
76 SelectionString = tau_thinning_expression))
77
78 # Finally the kernel itself
79 thinningTools = [
80 TRIG9TrackParticleThinningTool,
81 TRIG9MuonTrackParticleThinningTool,
82 TRIG9TauJetThinningTool,
83 ]
84
85 # Skimming
86 skimmingTools = []
87
88 # skimming events based on electron/muon + tau counting
89 tauProngs13 = "( abs(TauJets.charge)==1.0 && (TauJets.nTracks == 1 || TauJets.nTracks == 3) )"
90 #MuTrig: (pT(mu)>18 && pT(tau)>18), EleTrig: (pT(el)>22 && pT(tau)>18)
91 e22 = '(count( Electrons.pt > 22.0*GeV && abs(Electrons.eta) < 2.5 && Electrons.DFCommonElectronsLHLoose) >= 1)'
92 mu18 = '(count( Muons.pt > 18.0*GeV && abs(Muons.eta) < 2.5 && Muons.DFCommonMuonPassPreselection) >= 1)'
93 tau20 = '(count( TauJets.pt > 20.0*GeV && abs(TauJets.eta) < 2.5 && '+tauProngs13+' && (TauJets.DFTauRNNLoose || TauJets.DFTauGNTauLoose) ) >= 1)'
94 mutau = '('+mu18+' && '+tau20+')'
95 etau = '('+e22+' && '+tau20+')'
96 skim_expression = '('+mutau+') || ('+etau+')'
97
98 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import (
99 xAODStringSkimmingToolCfg)
100 EventSkimmingTool = acc.getPrimaryAndMerge(xAODStringSkimmingToolCfg(
101 flags, name="EventSkimmingTool", expression=skim_expression))
102 skimmingTools.append(EventSkimmingTool)
103
104 if flags.Trigger.EDMVersion >= 0:
105 # Pieces of trigger names to keep
106 trig_keys = ['mediumRNN','mediumGNTau']
107 # Add specific triggers
108 additional_triggers = [
109 "HLT_mu24_ivarmedium_L1MU14FCH",
110 "HLT_mu26_ivarmedium_L1MU14FCH",
111 "HLT_e26_lhtight_ivarloose_L1EM22VHI",
112 "HLT_e26_lhtight_ivarloose_L1eEM26M",
113 ]
114 trig_keys += additional_triggers
115 triggers = [t for t in trig_all for k in trig_keys if k in t]
116
117 # remove not used triggers
118 trig_veto = ['HLT_g','HLT_e17_','HLT_e24_','HLT_mu14_',]
119 final_triggers = [t for t in triggers for k in trig_veto if k not in t]
120
121 #remove duplicates
122 final_triggers = sorted(list(set(final_triggers)))
123 print('TRIG9 list of triggers used for skimming:')
124 for trig in final_triggers: print(trig)
125
126 TriggerSkimmingTool = CompFactory.DerivationFramework.TriggerSkimmingTool
127 TRIG9TriggerSkimmingTool = TriggerSkimmingTool(name = "TRIG9TriggerPreSkimmingTool",
128 TriggerListAND = [],
129 TriggerListOR = final_triggers)
130 acc.addPublicTool(TRIG9TriggerSkimmingTool)
131
132 skimmingTools.append(TRIG9TriggerSkimmingTool)
133
134 DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
135 acc.addEventAlgo(DerivationKernel(name,
136 SkimmingTools = skimmingTools,
137 ThinningTools = thinningTools,
138 AugmentationTools = augmentationTools))
139
140 return acc
141
142
143def TRIG9Cfg(flags):
144
145 acc = ComponentAccumulator()
146
147 # Get the lists of triggers needed for trigger matching.
148 # This is needed at this scope (for the slimming) and further down in the config chain
149 # for actually configuring the matching, so we create it here and pass it down
150 # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
151 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
152 TRIG9TriggerListsHelper = TriggerListsHelper(flags)
153
154 # Common augmentations
155 acc.merge(TRIG9KernelCfg(flags, name="TRIG9Kernel", StreamName = 'StreamDAOD_TRIG9', TriggerListsHelper = TRIG9TriggerListsHelper))
156
157
158 # ============================
159 # Define contents of the format
160 # =============================
161 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
162 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
163 from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
164
165 TRIG9SlimmingHelper = SlimmingHelper("TRIG9SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
166
167 TRIG9SlimmingHelper.SmartCollections = ["EventInfo",
168 "Electrons",
169 "Photons",
170 "Muons",
171 "PrimaryVertices",
172 "InDetTrackParticles",
173 "AntiKt4EMPFlowJets",
174 "MET_Baseline_AntiKt4EMPFlow",
175
176 "TauJets",
177 ]
178
179 TRIG9SlimmingHelper.StaticContent = [
180 "TrigRoiDescriptorCollection#HLT_eTAURoIs",
181 "TrigRoiDescriptorCollection#HLT_jTAURoIs",
182 "TrigRoiDescriptorCollection#HLT_cTAURoIs",
183 "TrigRoiDescriptorCollection#HLT_TAURoI",
184 "TrigRoiDescriptorCollection#HLT_Roi_Tau",
185 "TrigRoiDescriptorCollection#HLT_Roi_Tau_probe",
186 "TrigRoiDescriptorCollection#HLT_Roi_TauCore",
187 "TrigRoiDescriptorCollection#HLT_Roi_TauCore_probe",
188 "TrigRoiDescriptorCollection#HLT_Roi_TauIso",
189 "TrigRoiDescriptorCollection#HLT_Roi_TauIso_probe",
190 ]
191
192 TRIG9SlimmingHelper.ExtraVariables += [
193 "TruthPrimaryVertices.t.x.y.z",
194 "PrimaryVertices.t.x.y.z.numberDoF.chiSquared.covariance.trackParticleLinks",
195 "EventInfo.hardScatterVertexLink.timeStampNSOffset",
196 ]
197
198 TRIG9SlimmingHelper.AllVariables += ['HLT_TrigTauRecMerged_MVA','HLT_tautrack_MVA']
199
200 # Truth containers
201 if flags.Input.isMC:
202 from DerivationFrameworkMCTruth.MCTruthCommonConfig import addTruth3ContentToSlimmerTool
203 addTruth3ContentToSlimmerTool(TRIG9SlimmingHelper)
204 TRIG9SlimmingHelper.AllVariables += ['InTimeAntiKt4TruthJets','OutOfTimeAntiKt4TruthJets']
205 TRIG9SlimmingHelper.ExtraVariables += ["Electrons.TruthLink",
206 "Muons.TruthLink",
207 "Photons.TruthLink"]
208
209 from DerivationFrameworkMCTruth.MCTruthCommonConfig import AddTauAndDownstreamParticlesCfg
210 acc.merge(AddTauAndDownstreamParticlesCfg(flags))
211 TRIG9SlimmingHelper.AllVariables += ['TruthTausWithDecayParticles','TruthTausWithDecayVertices']
212
213
214
215
216 # Trigger content
217 TRIG9SlimmingHelper.IncludeTriggerNavigation = True
218 TRIG9SlimmingHelper.IncludeAdditionalTriggerContent = True
219 TRIG9SlimmingHelper.IncludeJetTriggerContent = False
220 TRIG9SlimmingHelper.IncludeMuonTriggerContent = False
221 TRIG9SlimmingHelper.IncludeEGammaTriggerContent = False
222 TRIG9SlimmingHelper.IncludeTauTriggerContent = False
223 TRIG9SlimmingHelper.IncludeEtMissTriggerContent = False
224 TRIG9SlimmingHelper.IncludeBJetTriggerContent = False
225 TRIG9SlimmingHelper.IncludeBPhysTriggerContent = False
226 TRIG9SlimmingHelper.IncludeMinBiasTriggerContent = False
227
228 # Trigger matching
229 # Run 2
230 if flags.Trigger.EDMVersion == 2:
231 from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddRun2TriggerMatchingToSlimmingHelper
232 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TRIG9SlimmingHelper,
233 OutputContainerPrefix = "TrigMatch_",
234 TriggerList = TRIG9TriggerListsHelper.Run2TriggerNamesTau)
235 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TRIG9SlimmingHelper,
236 OutputContainerPrefix = "TrigMatch_",
237 TriggerList = TRIG9TriggerListsHelper.Run2TriggerNamesNoTau)
238 # Run 3, or Run 2 with navigation conversion
239 if flags.Trigger.EDMVersion == 3 or (flags.Trigger.EDMVersion == 2 and flags.Trigger.doEDMVersionConversion):
240 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig import AddRun3TrigNavSlimmingCollectionsToSlimmingHelper
241 AddRun3TrigNavSlimmingCollectionsToSlimmingHelper(TRIG9SlimmingHelper)
242
243 # Output stream
244 TRIG9ItemList = TRIG9SlimmingHelper.GetItemList()
245 acc.merge(OutputStreamCfg(flags, "DAOD_TRIG9", ItemList=TRIG9ItemList, AcceptAlgs=["TRIG9Kernel"]))
246 acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_TRIG9", AcceptAlgs=["TRIG9Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData,MetadataCategory.TruthMetaData]))
247
248 return acc
249
void print(char *figname, TCanvas *c1)
STL class.
TRIG9Cfg(flags)
Definition TRIG9.py:143
TRIG9KernelCfg(flags, name='TRIG9Kernel', **kwargs)
Definition TRIG9.py:16