ATLAS Offline Software
Loading...
Searching...
No Matches
HION5.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2# HION5.py
3
4
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from AthenaConfiguration.Enums import MetadataCategory
8from AthenaCommon.CFElements import seqAND
9
11 """Configure the example skimming tool"""
12 acc = ComponentAccumulator()
13
14 # added: DF-prefixed jet containers to ExtraData
15 JetColl = flags.HeavyIon.HIJetPrefix
16
17 ExtraData = []
18 ExtraData += ['xAOD::MuonContainer/Muons']
19 ExtraData += ['xAOD::ElectronContainer/Electrons']
20 ExtraData += ['xAOD::PhotonContainer/Photons']
21 ExtraData += ['xAOD::TrackParticleContainer/InDetTrackParticles']
22 ExtraData += ['xAOD::JetContainer/'+JetColl+'AntiKt2HIJets']
23 ExtraData += ['xAOD::JetContainer/'+JetColl+'AntiKt4HIJets']
24
25 acc.addSequence( seqAND("HION5Sequence") )
26 acc.getSequence("HION5Sequence").ExtraDataForDynamicConsumers = ExtraData
27 acc.getSequence("HION5Sequence").ProcessDynamicDataDependencies = True
28 filterList = []
29
30 req_electrons = 'count( ( Electrons.pt > 15*GeV ) && ( abs(Electrons.eta) < 2.5) )>0'
31 req_muons = 'count( Muons.DFCommonMuonPassPreselection && (Muons.pt > 15*GeV) && ( abs(Muons.eta) < 2.7))>0'
32 req_photons = 'count( Photons.DFCommonPhotonsIsEMLoose && (Photons.pt > 30*GeV) ) > 0'
33 req_total = '(' + req_electrons + ' || ' + req_muons + ' || ' + req_photons + ')'
34 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import (
35 xAODStringSkimmingToolCfg)
36 HION5StringSkimmingTool = acc.addPublicTool(acc.getPrimaryAndMerge(
37 xAODStringSkimmingToolCfg(flags, name = "HION5StringSkimmingTool",
38 expression = req_total)))
39 filterList += [HION5StringSkimmingTool]
40
41 from DerivationFrameworkHI import ListTriggers
42 triggers = ListTriggers.HION5SkimmingTriggers()
43 HION5TriggerSkimmingTool = CompFactory.DerivationFramework.TriggerSkimmingTool(
44 name = "HION5TriggerSkimmingTool", TriggerListOR = triggers)
45 acc.addPublicTool(HION5TriggerSkimmingTool)
46 filterList += [HION5TriggerSkimmingTool]
47
48 HION5SkimmingTool = CompFactory.DerivationFramework.FilterCombinationAND(
49 name="HION5SkimmingTool", FilterList=filterList)
50 acc.addPublicTool(HION5SkimmingTool, primary = True)
51 return acc
52
53def HION5Thinning(flags):
54 from DerivationFrameworkInDet.InDetToolsConfig import TrackParticleThinningCfg,JetTrackParticleThinningCfg
55 acc = ComponentAccumulator()
56
57 # added: DF-prefixed jet collection names
58 JetColl = flags.HeavyIon.HIJetPrefix
59
60 # find collision type
61 from CoolConvUtilities.ParticleTypeUtil import getTypeForRun
62 info=getTypeForRun(flags.Input.RunNumbers[0])
63 isOxygenOxygenCollision = False
64 if (info.getBeam1Type() == 8) or (info.getBeam2Type() == 8):
65 isOxygenOxygenCollision = True
66
67 pTCut = 0.9
68 if isOxygenOxygenCollision:
69 pTCut = 0.5
70
71 track_thinning_expression = f"InDetTrackParticles.pt > {pTCut}*GeV"
72 TrackParticleThinningTool = acc.getPrimaryAndMerge(TrackParticleThinningCfg(
73 flags,
74 name = "PHYSTrackParticleThinningTool",
75 StreamName = "StreamDAOD_HION5",
76 SelectionString = track_thinning_expression,
77 InDetTrackParticlesKey = "InDetTrackParticles"))
78
79 AntiKt2HIJetsThinningTool = acc.getPrimaryAndMerge(JetTrackParticleThinningCfg(
80 flags,
81 name = "AntiKt2HIJetsThinningTool",
82 StreamName = "StreamDAOD_HION5",
83 JetKey = JetColl+"AntiKt2HIJets",
84 SelectionString = JetColl+"AntiKt2HIJets.pt > 15*GeV",
85 InDetTrackParticlesKey = "InDetTrackParticles"))
86
87 AntiKt4HIJetsThinningTool = acc.getPrimaryAndMerge(JetTrackParticleThinningCfg(
88 flags,
89 name = "AntiKt4HIJetsThinningTool",
90 StreamName = "StreamDAOD_HION5",
91 JetKey = JetColl+"AntiKt4HIJets",
92 SelectionString = JetColl+"AntiKt4HIJets.pt > 15*GeV",
93 InDetTrackParticlesKey = "InDetTrackParticles"))
94
95 acc.addPublicTool(TrackParticleThinningTool,primary = True)
96 acc.addPublicTool(AntiKt2HIJetsThinningTool)
97 acc.addPublicTool(AntiKt4HIJetsThinningTool)
98
99 return acc
100
102 """Configure the example augmentation tool"""
103 acc = ComponentAccumulator()
104
105 # Configure the augmentation tool
106 # This adds FCalEtA, FCalEtC, ...
107 doTopoClus = True
108 caloClusterKey = "CaloCalTopoClusters"
109 from AthenaConfiguration.Enums import HIMode
110 if flags.Reco.HIMode == HIMode.HI:
111 doTopoClus = False
112 caloClusterKey = ""
113
114 cutLevelNames = ["HILoose", "HITight"]
115 from InDetTrackSelectionTool.InDetTrackSelectionToolConfig import (
116 InDetTrackSelectionTool_HILoose_Cfg,
117 InDetTrackSelectionTool_HITight_Cfg
118 )
119
120 InDetTrackSelectionTool_HILoose = acc.popToolsAndMerge(
121 InDetTrackSelectionTool_HILoose_Cfg(flags))
122 acc.addPublicTool(InDetTrackSelectionTool_HILoose, primary=False)
123 InDetTrackSelectionTool_HITight = acc.popToolsAndMerge(
124 InDetTrackSelectionTool_HITight_Cfg(flags))
125 acc.addPublicTool(InDetTrackSelectionTool_HITight, primary=False)
126
127
128 augmentation_tool = CompFactory.DerivationFramework.HIGlobalAugmentationTool(name="HION5AugmentationTool",
129 nHarmonic=0, # to capture higher-order harmonics for anisotropic flow
130 doTopoClusDec = doTopoClus,
131 CaloClusterKey = caloClusterKey,
132 TrackSelectionTools = [InDetTrackSelectionTool_HILoose, InDetTrackSelectionTool_HITight],
133 cutLevels = cutLevelNames
134 )
135 acc.addPublicTool(augmentation_tool, primary=True)
136
137 return acc
138
140 """Configure the example augmentation tool"""
141 acc = ComponentAccumulator()
142
143 # Configure the augmentation tool
144 # This adds JvtMediumPassed, JvtTightPassed ...
145 jvtTool = CompFactory.JetVertexTaggerTool(name="JVTToolEMTopo",
146 JetContainer="AntiKt4EMTopoJets")
147
148
149 augmentation_tool = CompFactory.DerivationFramework.HIJetAugmentationTool(name="HION5JetAugmentationTool",
150 DeltaRJetMatching = 0.3,
151 HIJetContainerKey="DFAntiKt4HIJets",
152 CaloJetContainerKey = "AntiKt4EMTopoJets",
153 JVTToolEMTopo = jvtTool
154 )
155 acc.addPublicTool(jvtTool)
156 acc.addPublicTool(augmentation_tool, primary=True)
157
158 return acc
159
160def HION5KernelCfg(flags, name="HION5Kernel", **kwargs):
161 """Configure the derivation framework driving algorithm (kernel)
162 for HION5"""
163 acc = ComponentAccumulator()
164
165 # added: DF-prefixed jet collection
166 JetColl = flags.HeavyIon.HIJetPrefix
167 JetKey = JetColl + 'AntiKt4HIJets'
168
169 # Schedule extra jets collections
170 from JetRecConfig.StandardSmallRJets import AntiKt4PV0Track
171 from JetRecConfig.JetRecConfig import JetRecCfg
172 jetList = [AntiKt4PV0Track]
173 for jd in jetList:
174 acc.merge(JetRecCfg(flags, jd))
175
176 # Common augmentations: reuse the same common MC/reco setup as other HION derivations
177 # (same pattern as HION15, which imports PhysAugmentationsHION7Cfg from HION7)
178 from DerivationFrameworkHI.HION7 import PhysAugmentationsHION7Cfg
179 acc.merge(PhysAugmentationsHION7Cfg(flags))
180
181 # HIJetRec configuration with DF-prefixed jet collection names
182 # moved here from HION5Cfg to mirror getDFJets pattern in HION7KernelCfg
183 from HIJetRec.HIJetRecConfigCA import HIJetRecCfg
184 acc.merge(HIJetRecCfg(flags))
185
186 # B-Tagging for HI jets — must be after HIJetRecCfg so DFAntiKt4HIJets exists
187 if flags.HeavyIon.doHIBTagging:
188 from BTagging.FlavorTaggingConfig import FlavorTaggingCfg
189 acc.merge(FlavorTaggingCfg(flags, JetColl+"AntiKt4HIJets"))
190 from FlavorTagDiscriminants.TrackLeptonConfig import TrackLeptonDecorationCfg
191 acc.merge(TrackLeptonDecorationCfg(flags))
192
193 # skimming -- must come BEFORE algOR so HION5Sequence is created first
194 skimmingTool = acc.getPrimaryAndMerge(HION5SkimmingToolCfg(flags))
195
196 # jet cleaning
197 # Decorate if jet passes OR and save decoration DFCommonJets_passOR
198 # Use modified OR that does not check overlaps with taus
199 from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
200
201 outputLabel = "DFCommonJets_passOR_HI"
202 bJetLabel = "" # default
203 tauLabel = "" # workaround for missing taus
204 tauKey = "" # workaround for missing taus
205 orTool = acc.popToolsAndMerge(
206 OverlapRemovalToolCfg(
207 flags, outputLabel=outputLabel, bJetLabel=bJetLabel, doTaus=False
208 )
209 )
210 algOR = CompFactory.ORUtils.OverlapRemovalGenUseAlg(
211 "OverlapRemovalGenUseAlg",
212 OverlapLabel=outputLabel,
213 OverlapRemovalTool=orTool,
214 JetKey = JetKey,
215 TauKey=tauKey,
216 TauLabel=tauLabel,
217 BJetLabel=bJetLabel,
218 )
219 acc.addEventAlgo(algOR, sequenceName="HION5Sequence")
220
221 # Thinning
222 thinningTool = acc.getPrimaryAndMerge(HION5Thinning(flags))
223
224 # Augmentation
225 globalAugmentationTool = acc.getPrimaryAndMerge(HION5GlobalAugmentationToolCfg(flags))
226 augmentationTools = [globalAugmentationTool]
227 from AthenaConfiguration.Enums import HIMode
228 if flags.Reco.HIMode != HIMode.HI:
229 jetAugmentationTool = acc.getPrimaryAndMerge(HION5JetAugmentationToolCfg(flags))
230 augmentationTools = [globalAugmentationTool,jetAugmentationTool]
231
232 # setup the kernel
233 acc.addEventAlgo(
234 CompFactory.DerivationFramework.DerivationKernel(
235 name,
236 SkimmingTools = [skimmingTool],
237 ThinningTools = [thinningTool],
238 AugmentationTools = augmentationTools,
239 ),
240 sequenceName="HION5Sequence")
241
242 return acc
243
244def HION5Cfg(flags):
245 acc = ComponentAccumulator()
246
247 JetColl = flags.HeavyIon.HIJetPrefix
248
249 from DerivationFrameworkEGamma.PhotonsCPDetailedContent import PhotonsCPDetailedContent
250 from DerivationFrameworkEGamma.ElectronsCPDetailedContent import ExtraElectronShowerShapes,ExtraElectronGSFVar
251
252 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
253 HION5TriggerListsHelper = TriggerListsHelper(flags)
254
255 acc.merge(HION5KernelCfg(flags, name="HION5Kernel", StreamName="StreamDAOD_HION5", TriggerListsHelper = HION5TriggerListsHelper,))
256
257 # configure slimming
258 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
259 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
260 from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
261 from DerivationFrameworkHI import ListSlimming
262
263 HION5SlimmingHelper = SlimmingHelper("HION5SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
264 HION5SlimmingHelper.AppendToDictionary = {'EventInfo':'xAOD::EventInfo','EventInfoAux':'xAOD::EventAuxInfo',
265 'TruthEvents':'xAOD::TruthEventContainer','TruthEventsAux':'xAOD::TruthEventAuxContainer',
266 'MET_Truth':'xAOD::MissingETContainer','MET_TruthAux':'xAOD::MissingETAuxContainer',
267 'TruthLHEParticles':'xAOD::TruthParticleContainer', 'TruthLHEParticlesAux':'xAOD::TruthParticleAuxContainer',
268 'TruthElectrons':'xAOD::TruthParticleContainer','TruthElectronsAux':'xAOD::TruthParticleAuxContainer',
269 'TruthMuons':'xAOD::TruthParticleContainer','TruthMuonsAux':'xAOD::TruthParticleAuxContainer',
270 'TruthPhotons':'xAOD::TruthParticleContainer','TruthPhotonsAux':'xAOD::TruthParticleAuxContainer',
271 'TruthTaus':'xAOD::TruthParticleContainer','TruthTausAux':'xAOD::TruthParticleAuxContainer',
272 'TruthNeutrinos':'xAOD::TruthParticleContainer','TruthNeutrinosAux':'xAOD::TruthParticleAuxContainer',
273 'TruthBSM':'xAOD::TruthParticleContainer','TruthBSMAux':'xAOD::TruthParticleAuxContainer',
274 'TruthBoson':'xAOD::TruthParticleContainer','TruthBosonAux':'xAOD::TruthParticleAuxContainer',
275 'TruthBottom':'xAOD::TruthParticleContainer','TruthBottomAux':'xAOD::TruthParticleAuxContainer',
276 'TruthTop':'xAOD::TruthParticleContainer','TruthTopAux':'xAOD::TruthParticleAuxContainer',
277 'TruthForwardProtons':'xAOD::TruthParticleContainer','TruthForwardProtonsAux':'xAOD::TruthParticleAuxContainer',
278 'BornLeptons':'xAOD::TruthParticleContainer','BornLeptonsAux':'xAOD::TruthParticleAuxContainer',
279 'TruthBosonsWithDecayParticles':'xAOD::TruthParticleContainer','TruthBosonsWithDecayParticlesAux':'xAOD::TruthParticleAuxContainer',
280 'TruthBosonsWithDecayVertices':'xAOD::TruthVertexContainer','TruthBosonsWithDecayVerticesAux':'xAOD::TruthVertexAuxContainer',
281 'TruthBSMWithDecayParticles':'xAOD::TruthParticleContainer','TruthBSMWithDecayParticlesAux':'xAOD::TruthParticleAuxContainer',
282 'TruthBSMWithDecayVertices':'xAOD::TruthVertexContainer','TruthBSMWithDecayVerticesAux':'xAOD::TruthVertexAuxContainer',
283 'AntiKt4TruthDressedWZJets':'xAOD::JetContainer','AntiKt4TruthDressedWZJetsAux':'xAOD::JetAuxContainer',
284 'AntiKt10TruthSoftDropBeta100Zcut10Jets':'xAOD::JetContainer','AntiKt10TruthSoftDropBeta100Zcut10JetsAux':'xAOD::JetAuxContainer',
285 'MET_Track1000':'xAOD::MissingETContainer', 'MET_Track1000Aux':'xAOD::MissingETAuxContainer',
286 'MET_Track2000':'xAOD::MissingETContainer', 'MET_Track2000Aux':'xAOD::MissingETAuxContainer',
287 'MET_Track3000':'xAOD::MissingETContainer', 'MET_Track3000Aux':'xAOD::MissingETAuxContainer',
288 'MET_Track4000':'xAOD::MissingETContainer', 'MET_Track4000Aux':'xAOD::MissingETAuxContainer',
289 'MET_Track5000':'xAOD::MissingETContainer', 'MET_Track5000Aux':'xAOD::MissingETAuxContainer',
290 }
291 # Build track MET with ptCut in MeV and HItight Tracks
292 from DerivationFrameworkHI.TrackMET_config import Cfg_METTrack
293 met_ptCutList = [1000,2000,3000,4000,5000]
294
295 for ptCut in met_ptCutList:
296 acc.merge(Cfg_METTrack(flags, ptCut))
297
298 AllVariables = []
299 AllVariables += ListSlimming.HION5AllVariables(flags.Input.RunNumbers[0])
300 AllVariables += ListSlimming.HION5ExtraContainersTrigger()
301
302 # B-Tagging slimming content
303 from DerivationFrameworkFlavourTag import FtagBaseContent
304
305 if flags.Input.isMC:
306 # MC truth augmentation (charm, HF, standard truth nav links, PV) is handled by
307 # PhysAugmentationsHION7Cfg called in HION5KernelCfg — same as HION7/HION15.
308 AllVariables += ListSlimming.HION5AllTruthVariables()
309 if flags.HeavyIon.doHIBTagging:
310 # Add b-tagging truth slimming content
311 FtagBaseContent.add_truth_to_slimming_helper(HION5SlimmingHelper)
312
313 #Variables from FTAG
314 if flags.HeavyIon.doHIBTagging:
315 AllVariables += ListSlimming.HION7AllVarFromFTAG1()
316
317 HION5SlimmingHelper.SmartCollections = ListSlimming.HION5SmartCollections()
318 HION5SlimmingHelper.ExtraVariables = ListSlimming.HION5ExtraVariables(JetColl)
319 HION5SlimmingHelper.ExtraVariables += PhotonsCPDetailedContent
320 HION5SlimmingHelper.ExtraVariables += ExtraElectronShowerShapes
321 HION5SlimmingHelper.ExtraVariables += ExtraElectronGSFVar
322
323 #Common Augmentation for FTAG and ExtraVariables
324 if flags.HeavyIon.doHIBTagging:
325 from DerivationFrameworkFlavourTag.FtagBaseContent import add_common_augmentation
326 add_common_augmentation(flags, acc, HION5SlimmingHelper, JetColl+"AntiKt4HIJets")
327 # Update AppendToDictionary
328 extra_AppendToDictionary = {}
329 FtagBaseContent.update_append_to_dictionary_in_slimming_helper(flags, HION5SlimmingHelper, extra_AppendToDictionary)
330 # Add ExtraVariables from B-tagging
331 HION5SlimmingHelper.ExtraVariables += ListSlimming.HION7ExtraVarForBtag(JetColl)
332 FtagBaseContent.add_extra_variables_to_slimming_helper(flags, HION5SlimmingHelper)
333
334 HION5SlimmingHelper.AllVariables = AllVariables
335
336 # Add egamma trigger objects
337 HION5SlimmingHelper.IncludeEGammaTriggerContent = True
338 # Add muon trigger objects
339 HION5SlimmingHelper.IncludeMuonTriggerContent = True
340
341 HION5ItemList = HION5SlimmingHelper.GetItemList()
342
343 #DF-prefixed jet containers with b-tagging info
344 HIJetRemovedBranches = ListSlimming.makeHIJetRemovedBranchList()
345 jet_var_str = '.-'.join([''] + HIJetRemovedBranches)
346
347 jetRlist = flags.HeavyIon.Jet.RValues # Default [0.2, 0.4]
348 for jetR in jetRlist:
349 output = ["xAOD::JetContainer#"+JetColl+"AntiKt"+str(jetR)+"HIJets",
350 "xAOD::JetAuxContainer#"+JetColl+"AntiKt"+str(jetR)+"HIJetsAux.-PseudoJet"+jet_var_str]
351 HION5ItemList += output
352
353 acc.merge(OutputStreamCfg(flags, "DAOD_HION5", ItemList=HION5ItemList, AcceptAlgs=["HION5Kernel"]))
354 acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_HION5", AcceptAlgs=["HION5Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData]))
355
356 return acc
HION5GlobalAugmentationToolCfg(flags)
Definition HION5.py:101
HION5Cfg(flags)
Definition HION5.py:244
HION5JetAugmentationToolCfg(flags)
Definition HION5.py:139
HION5KernelCfg(flags, name="HION5Kernel", **kwargs)
Definition HION5.py:160
HION5Thinning(flags)
Definition HION5.py:53
HION5SkimmingToolCfg(flags)
Definition HION5.py:10