ATLAS Offline Software
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 
11 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
12 from AthenaConfiguration.ComponentFactory import CompFactory
13 from AthenaConfiguration.Enums import MetadataCategory
14 
15 # Main algorithm config
16 def 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, prefix="TRIG9", doGNTauLoose=True))
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  EventSkimmingTool = CompFactory.DerivationFramework.xAODStringSkimmingTool(
99  name="EventSkimmingTool", expression=skim_expression,
100  )
101  acc.addPublicTool(EventSkimmingTool)
102  skimmingTools.append(EventSkimmingTool)
103 
104  # Pieces of trigger names to keep
105  trig_keys = ['mediumRNN','mediumGNTau']
106  # Add specific triggers
107  additional_triggers = [
108  "HLT_mu24_ivarmedium_L1MU14FCH",
109  "HLT_mu26_ivarmedium_L1MU14FCH",
110  "HLT_e26_lhtight_ivarloose_L1EM22VHI",
111  "HLT_e26_lhtight_ivarloose_L1eEM26M",
112  ]
113  trig_keys += additional_triggers
114  triggers = [t for t in trig_all for k in trig_keys if k in t]
115 
116  # remove not used triggers
117  trig_veto = ['HLT_g','HLT_e17_','HLT_e24_','HLT_mu14_',]
118  final_triggers = [t for t in triggers for k in trig_veto if k not in t]
119 
120  #remove duplicates
121  final_triggers = sorted(list(set(final_triggers)))
122  print('TRIG9 list of triggers used for skimming:')
123  for trig in final_triggers: print(trig)
124 
125  TriggerSkimmingTool = CompFactory.DerivationFramework.TriggerSkimmingTool
126  TRIG9TriggerSkimmingTool = TriggerSkimmingTool(name = "TRIG9TriggerPreSkimmingTool",
127  TriggerListAND = [],
128  TriggerListOR = final_triggers)
129  acc.addPublicTool(TRIG9TriggerSkimmingTool)
130 
131  skimmingTools.append(TRIG9TriggerSkimmingTool)
132 
133  DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
134  acc.addEventAlgo(DerivationKernel(name,
135  SkimmingTools = skimmingTools,
136  ThinningTools = thinningTools,
137  AugmentationTools = augmentationTools))
138 
139  return acc
140 
141 
142 def TRIG9Cfg(flags):
143 
144  acc = ComponentAccumulator()
145 
146  # Get the lists of triggers needed for trigger matching.
147  # This is needed at this scope (for the slimming) and further down in the config chain
148  # for actually configuring the matching, so we create it here and pass it down
149  # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
150  from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
151  TRIG9TriggerListsHelper = TriggerListsHelper(flags)
152 
153  # Common augmentations
154  acc.merge(TRIG9KernelCfg(flags, name="TRIG9Kernel", StreamName = 'StreamDAOD_TRIG9', TriggerListsHelper = TRIG9TriggerListsHelper))
155 
156 
157  # ============================
158  # Define contents of the format
159  # =============================
160  from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
161  from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
162  from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
163 
164  TRIG9SlimmingHelper = SlimmingHelper("TRIG9SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
165 
166  TRIG9SlimmingHelper.SmartCollections = ["EventInfo",
167  "Electrons",
168  "Photons",
169  "Muons",
170  "PrimaryVertices",
171  "InDetTrackParticles",
172  "AntiKt4EMPFlowJets",
173  "MET_Baseline_AntiKt4EMPFlow",
174  "BTagging_AntiKt4EMPFlow",
175  "TauJets",
176  ]
177 
178  TRIG9SlimmingHelper.StaticContent = [
179  "TrigRoiDescriptorCollection#HLT_eTAURoIs",
180  "TrigRoiDescriptorCollection#HLT_jTAURoIs",
181  "TrigRoiDescriptorCollection#HLT_cTAURoIs",
182  "TrigRoiDescriptorCollection#HLT_TAURoI",
183  "TrigRoiDescriptorCollection#HLT_Roi_Tau",
184  "TrigRoiDescriptorCollection#HLT_Roi_Tau_probe",
185  "TrigRoiDescriptorCollection#HLT_Roi_TauCore",
186  "TrigRoiDescriptorCollection#HLT_Roi_TauCore_probe",
187  "TrigRoiDescriptorCollection#HLT_Roi_TauIso",
188  "TrigRoiDescriptorCollection#HLT_Roi_TauIso_probe",
189  ]
190 
191  TRIG9SlimmingHelper.ExtraVariables += [
192  "TruthPrimaryVertices.t.x.y.z",
193  "PrimaryVertices.t.x.y.z.numberDoF.chiSquared.covariance.trackParticleLinks",
194  "EventInfo.hardScatterVertexLink.timeStampNSOffset",
195  ]
196 
197  TRIG9SlimmingHelper.AllVariables += ['HLT_TrigTauRecMerged_MVA','HLT_tautrack_MVA']
198 
199  # Truth containers
200  if flags.Input.isMC:
201  from DerivationFrameworkMCTruth.MCTruthCommonConfig import addTruth3ContentToSlimmerTool
202  addTruth3ContentToSlimmerTool(TRIG9SlimmingHelper)
203  TRIG9SlimmingHelper.AllVariables += ['InTimeAntiKt4TruthJets','OutOfTimeAntiKt4TruthJets']
204  TRIG9SlimmingHelper.ExtraVariables += ["Electrons.TruthLink",
205  "Muons.TruthLink",
206  "Photons.TruthLink"]
207 
208  from DerivationFrameworkMCTruth.MCTruthCommonConfig import AddTauAndDownstreamParticlesCfg
209  acc.merge(AddTauAndDownstreamParticlesCfg(flags))
210  TRIG9SlimmingHelper.AllVariables += ['TruthTausWithDecayParticles','TruthTausWithDecayVertices']
211 
212 
213 
214 
215  # Trigger content
216  TRIG9SlimmingHelper.IncludeTriggerNavigation = True
217  TRIG9SlimmingHelper.IncludeAdditionalTriggerContent = True
218  TRIG9SlimmingHelper.IncludeJetTriggerContent = False
219  TRIG9SlimmingHelper.IncludeMuonTriggerContent = False
220  TRIG9SlimmingHelper.IncludeEGammaTriggerContent = False
221  TRIG9SlimmingHelper.IncludeTauTriggerContent = False
222  TRIG9SlimmingHelper.IncludeEtMissTriggerContent = False
223  TRIG9SlimmingHelper.IncludeBJetTriggerContent = False
224  TRIG9SlimmingHelper.IncludeBPhysTriggerContent = False
225  TRIG9SlimmingHelper.IncludeMinBiasTriggerContent = False
226 
227  # Trigger matching
228  # Run 2
229  if flags.Trigger.EDMVersion == 2:
230  from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddRun2TriggerMatchingToSlimmingHelper
231  AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TRIG9SlimmingHelper,
232  OutputContainerPrefix = "TrigMatch_",
233  TriggerList = TRIG9TriggerListsHelper.Run2TriggerNamesTau)
234  AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TRIG9SlimmingHelper,
235  OutputContainerPrefix = "TrigMatch_",
236  TriggerList = TRIG9TriggerListsHelper.Run2TriggerNamesNoTau)
237  # Run 3, or Run 2 with navigation conversion
238  if flags.Trigger.EDMVersion == 3 or (flags.Trigger.EDMVersion == 2 and flags.Trigger.doEDMVersionConversion):
239  from TrigNavSlimmingMT.TrigNavSlimmingMTConfig import AddRun3TrigNavSlimmingCollectionsToSlimmingHelper
241 
242  # Output stream
243  TRIG9ItemList = TRIG9SlimmingHelper.GetItemList()
244  acc.merge(OutputStreamCfg(flags, "DAOD_TRIG9", ItemList=TRIG9ItemList, AcceptAlgs=["TRIG9Kernel"]))
245  acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_TRIG9", AcceptAlgs=["TRIG9Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData,MetadataCategory.TruthMetaData]))
246 
247  return acc
248 
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
TrigNavSlimmingMTConfig.AddRun3TrigNavSlimmingCollectionsToSlimmingHelper
def AddRun3TrigNavSlimmingCollectionsToSlimmingHelper(slimmingHelper)
Definition: TrigNavSlimmingMTConfig.py:98
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
python.MCTruthCommonConfig.AddTauAndDownstreamParticlesCfg
def AddTauAndDownstreamParticlesCfg(flags, generations=-1, rejectHadronChildren=False)
Definition: MCTruthCommonConfig.py:266
python.OutputStreamConfig.OutputStreamCfg
def OutputStreamCfg(flags, streamName, ItemList=[], MetadataItemList=[], disableEventTag=False, trigNavThinningSvc=None, takeItemsFromInput=False, extendProvenanceRecord=True, keepProvenanceTagsRegEx=None, AcceptAlgs=[], HelperTools=[])
Definition: OutputStreamConfig.py:16
TRIG9.TRIG9KernelCfg
def TRIG9KernelCfg(flags, name='TRIG9Kernel', **kwargs)
Definition: TRIG9.py:16
python.InDetToolsConfig.TrackParticleThinningCfg
def TrackParticleThinningCfg(flags, name, **kwargs)
Definition: InDetToolsConfig.py:516
python.TriggerMatchingCommonConfig.AddRun2TriggerMatchingToSlimmingHelper
def AddRun2TriggerMatchingToSlimmingHelper(**kwargs)
Definition: TriggerMatchingCommonConfig.py:49
TRIG9.TRIG9Cfg
def TRIG9Cfg(flags)
Definition: TRIG9.py:142
python.TauCommonConfig.AddTauAugmentationCfg
def AddTauAugmentationCfg(flags, **kwargs)
Definition: TauCommonConfig.py:6
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.InDetToolsConfig.MuonTrackParticleThinningCfg
def MuonTrackParticleThinningCfg(flags, name, **kwargs)
Definition: InDetToolsConfig.py:600
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
python.MCTruthCommonConfig.addTruth3ContentToSlimmerTool
def addTruth3ContentToSlimmerTool(slimmer)
Definition: MCTruthCommonConfig.py:465
python.TauCommonConfig.TauThinningCfg
def TauThinningCfg(flags, name, **kwargs)
Definition: TauCommonConfig.py:258
python.PhysCommonConfig.PhysCommonAugmentationsCfg
def PhysCommonAugmentationsCfg(flags, **kwargs)
Definition: PhysCommonConfig.py:13
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:801
InfileMetaDataConfig.SetupMetaDataForStreamCfg
def SetupMetaDataForStreamCfg(flags, streamName="", AcceptAlgs=None, createMetadata=None, propagateMetadataFromInput=True, *args, **kwargs)
Definition: InfileMetaDataConfig.py:222
SlimmingHelper
Definition: SlimmingHelper.py:1
python.HION12.DerivationKernel
DerivationKernel
Definition: HION12.py:66