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
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5from AthenaConfiguration.ComponentFactory import CompFactory
6from AthenaConfiguration.Enums import MetadataCategory
7from AthenaCommon.CFElements import seqAND
8
10 """Configure the example skimming tool"""
11 acc = ComponentAccumulator()
12
13 ExtraData = []
14 ExtraData += ['xAOD::MuonContainer/Muons']
15 ExtraData += ['xAOD::ElectronContainer/Electrons']
16 ExtraData += ['xAOD::PhotonContainer/Photons']
17 ExtraData += ['xAOD::TrackParticleContainer/InDetTrackParticles']
18
19 acc.addSequence( seqAND("HION5Sequence") )
20 acc.getSequence("HION5Sequence").ExtraDataForDynamicConsumers = ExtraData
21 acc.getSequence("HION5Sequence").ProcessDynamicDataDependencies = True
22 filterList = []
23
24 req_electrons = 'count( ( Electrons.pt > 15*GeV ) && ( abs(Electrons.eta) < 2.5) )>0'
25 req_muons = 'count( Muons.DFCommonMuonPassPreselection && (Muons.pt > 15*GeV) && ( abs(Muons.eta) < 2.7))>0'
26 req_photons = 'count( Photons.DFCommonPhotonsIsEMLoose && (Photons.pt > 30*GeV) ) > 0'
27 req_total = '(' + req_electrons + ' || ' + req_muons + ' || ' + req_photons + ')'
28 from DerivationFrameworkTools.DerivationFrameworkToolsConfig import (
29 xAODStringSkimmingToolCfg)
30 HION5StringSkimmingTool = acc.addPublicTool(acc.getPrimaryAndMerge(
31 xAODStringSkimmingToolCfg(flags, name = "HION5StringSkimmingTool",
32 expression = req_total)))
33 filterList += [HION5StringSkimmingTool]
34
35 from DerivationFrameworkHI import ListTriggers
36 triggers = ListTriggers.HION5SkimmingTriggers()
37 HION5TriggerSkimmingTool = CompFactory.DerivationFramework.TriggerSkimmingTool(
38 name = "HION5TriggerSkimmingTool", TriggerListOR = triggers)
39 acc.addPublicTool(HION5TriggerSkimmingTool)
40 filterList += [HION5TriggerSkimmingTool]
41
42 HION5SkimmingTool = CompFactory.DerivationFramework.FilterCombinationAND(
43 name="HION5SkimmingTool", FilterList=filterList)
44 acc.addPublicTool(HION5SkimmingTool, primary = True)
45 return acc
46
47def HION5Thinning(flags):
48 from DerivationFrameworkInDet.InDetToolsConfig import TrackParticleThinningCfg,JetTrackParticleThinningCfg
49 acc = ComponentAccumulator()
50
51 # find collision type
52 from CoolConvUtilities.ParticleTypeUtil import getTypeForRun
53 info=getTypeForRun(flags.Input.RunNumbers[0])
54 isOxygenOxygenCollision = False
55 if (info.getBeam1Type() == 8) or (info.getBeam2Type() == 8):
56 isOxygenOxygenCollision = True
57
58 pTCut = 0.9
59 if isOxygenOxygenCollision:
60 pTCut = 0.5
61
62 track_thinning_expression = f"InDetTrackParticles.pt > {pTCut}*GeV"
63 TrackParticleThinningTool = acc.getPrimaryAndMerge(TrackParticleThinningCfg(
64 flags,
65 name = "PHYSTrackParticleThinningTool",
66 StreamName = "StreamDAOD_HION5",
67 SelectionString = track_thinning_expression,
68 InDetTrackParticlesKey = "InDetTrackParticles"))
69
70 AntiKt2HIJetsThinningTool = acc.getPrimaryAndMerge(JetTrackParticleThinningCfg(
71 flags,
72 name = "AntiKt2HIJetsThinningTool",
73 StreamName = "StreamDAOD_HION5",
74 JetKey = "AntiKt2HIJets",
75 SelectionString = "AntiKt2HIJets.pt > 15*GeV",
76 InDetTrackParticlesKey = "InDetTrackParticles"))
77
78 AntiKt4HIJetsThinningTool = acc.getPrimaryAndMerge(JetTrackParticleThinningCfg(
79 flags,
80 name = "AntiKt4HIJetsThinningTool",
81 StreamName = "StreamDAOD_HION5",
82 JetKey = "AntiKt4HIJets",
83 SelectionString = "AntiKt4HIJets.pt > 15*GeV",
84 InDetTrackParticlesKey = "InDetTrackParticles"))
85
86 acc.addPublicTool(TrackParticleThinningTool,primary = True)
87 acc.addPublicTool(AntiKt2HIJetsThinningTool)
88 acc.addPublicTool(AntiKt4HIJetsThinningTool)
89
90 return acc
91
92def HION5KernelCfg(flags, name="HION5Kernel", **kwargs):
93 """Configure the derivation framework driving algorithm (kernel)
94 for HION5"""
95 acc = ComponentAccumulator()
96
97 # Schedule extra jets collections
98 from JetRecConfig.StandardSmallRJets import AntiKt4PV0Track
99 from JetRecConfig.JetRecConfig import JetRecCfg
100
101 jetList = [AntiKt4PV0Track]
102 for jd in jetList:
103 acc.merge(JetRecCfg(flags, jd))
104
105 # Common augmentations
106 # cannot use PhysCommon sequence because
107 # - no triggers
108 # - no TauJets
109 # so we have to use a modified version here
110 from DerivationFrameworkMuons.MuonsCommonConfig import MuonsCommonCfg
111 from DerivationFrameworkEGamma.EGammaCommonConfig import EGammaCommonCfg
112
113 acc.merge(MuonsCommonCfg(flags))
114 acc.merge(EGammaCommonCfg(flags))
115
116 # jet cleaning
117 # standard way in PhysCommon is
118 # - calculate tau ID (needed for default jet OR)
119 # - decorate jets with overlap removal
120 # - do event cleaning
121 # but taus are missing in HI derivations so need to do differently
122
123 # NO JVT criteria in HI data (see pp config for details)
124
125 # Decorate if jet passes OR and save decoration DFCommonJets_passOR
126 # Use modified OR that does not check overlaps with taus
127 from AssociationUtils.AssociationUtilsConfig import OverlapRemovalToolCfg
128
129 outputLabel = "DFCommonJets_passOR_HI"
130 bJetLabel = "" # default
131 tauLabel = "" # workaround for missing taus
132 tauKey = "" # workaround for missing taus
133 orTool = acc.popToolsAndMerge(
134 OverlapRemovalToolCfg(
135 flags, outputLabel=outputLabel, bJetLabel=bJetLabel, doTaus=False
136 )
137 )
138 algOR = CompFactory.OverlapRemovalGenUseAlg(
139 "OverlapRemovalGenUseAlg",
140 OverlapLabel=outputLabel,
141 OverlapRemovalTool=orTool,
142 JetKey = 'AntiKt4HIJets',
143 TauKey=tauKey,
144 TauLabel=tauLabel,
145 BJetLabel=bJetLabel,
146 )
147 acc.addEventAlgo(algOR)
148
149 # skimming
150 skimmingTool = acc.getPrimaryAndMerge(HION5SkimmingToolCfg(flags))
151
152 # Thinning
153 thinningTool= acc.getPrimaryAndMerge(HION5Thinning(flags))
154
155 # setup the kernel
156 acc.addEventAlgo(
157 CompFactory.DerivationFramework.DerivationKernel(
158 name,
159 SkimmingTools = [skimmingTool],
160 ThinningTools = [thinningTool],
161 AugmentationTools = [],
162 ))
163
164 return acc
165
166def HION5Cfg(flags):
167 acc = ComponentAccumulator()
168
169 from DerivationFrameworkEGamma.PhotonsCPDetailedContent import PhotonsCPDetailedContent
170 from DerivationFrameworkEGamma.ElectronsCPDetailedContent import ExtraElectronShowerShapes,ExtraElectronGSFVar
171
172 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
173 HION5TriggerListsHelper = TriggerListsHelper(flags)
174
175 acc.merge(HION5KernelCfg(flags, name="HION5Kernel", StreamName="StreamDAOD_HION5", TriggerListsHelper = HION5TriggerListsHelper,))
176
177 # configure slimming
178 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
179 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
180 from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
181 from DerivationFrameworkHI import ListSlimming
182
183 HION5SlimmingHelper = SlimmingHelper("HION5SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
184 HION5SlimmingHelper.AppendToDictionary = {'EventInfo':'xAOD::EventInfo','EventInfoAux':'xAOD::EventAuxInfo',
185 'TruthEvents':'xAOD::TruthEventContainer','TruthEventsAux':'xAOD::TruthEventAuxContainer',
186 'MET_Truth':'xAOD::MissingETContainer','MET_TruthAux':'xAOD::MissingETAuxContainer',
187 'TruthLHEParticles':'xAOD::TruthParticleContainer', 'TruthLHEParticlesAux':'xAOD::TruthParticleAuxContainer',
188 'TruthElectrons':'xAOD::TruthParticleContainer','TruthElectronsAux':'xAOD::TruthParticleAuxContainer',
189 'TruthMuons':'xAOD::TruthParticleContainer','TruthMuonsAux':'xAOD::TruthParticleAuxContainer',
190 'TruthPhotons':'xAOD::TruthParticleContainer','TruthPhotonsAux':'xAOD::TruthParticleAuxContainer',
191 'TruthTaus':'xAOD::TruthParticleContainer','TruthTausAux':'xAOD::TruthParticleAuxContainer',
192 'TruthNeutrinos':'xAOD::TruthParticleContainer','TruthNeutrinosAux':'xAOD::TruthParticleAuxContainer',
193 'TruthBSM':'xAOD::TruthParticleContainer','TruthBSMAux':'xAOD::TruthParticleAuxContainer',
194 'TruthBoson':'xAOD::TruthParticleContainer','TruthBosonAux':'xAOD::TruthParticleAuxContainer',
195 'TruthBottom':'xAOD::TruthParticleContainer','TruthBottomAux':'xAOD::TruthParticleAuxContainer',
196 'TruthTop':'xAOD::TruthParticleContainer','TruthTopAux':'xAOD::TruthParticleAuxContainer',
197 'TruthForwardProtons':'xAOD::TruthParticleContainer','TruthForwardProtonsAux':'xAOD::TruthParticleAuxContainer',
198 'BornLeptons':'xAOD::TruthParticleContainer','BornLeptonsAux':'xAOD::TruthParticleAuxContainer',
199 'TruthBosonsWithDecayParticles':'xAOD::TruthParticleContainer','TruthBosonsWithDecayParticlesAux':'xAOD::TruthParticleAuxContainer',
200 'TruthBosonsWithDecayVertices':'xAOD::TruthVertexContainer','TruthBosonsWithDecayVerticesAux':'xAOD::TruthVertexAuxContainer',
201 'TruthBSMWithDecayParticles':'xAOD::TruthParticleContainer','TruthBSMWithDecayParticlesAux':'xAOD::TruthParticleAuxContainer',
202 'TruthBSMWithDecayVertices':'xAOD::TruthVertexContainer','TruthBSMWithDecayVerticesAux':'xAOD::TruthVertexAuxContainer',
203 'AntiKt4TruthDressedWZJets':'xAOD::JetContainer','AntiKt4TruthDressedWZJetsAux':'xAOD::JetAuxContainer',
204 'AntiKt10TruthSoftDropBeta100Zcut10Jets':'xAOD::JetContainer','AntiKt10TruthSoftDropBeta100Zcut10JetsAux':'xAOD::JetAuxContainer',
205 'MET_Track1000':'xAOD::MissingETContainer', 'MET_Track1000Aux':'xAOD::MissingETAuxContainer',
206 'MET_Track2000':'xAOD::MissingETContainer', 'MET_Track2000Aux':'xAOD::MissingETAuxContainer',
207 'MET_Track3000':'xAOD::MissingETContainer', 'MET_Track3000Aux':'xAOD::MissingETAuxContainer',
208 'MET_Track4000':'xAOD::MissingETContainer', 'MET_Track4000Aux':'xAOD::MissingETAuxContainer',
209 'MET_Track5000':'xAOD::MissingETContainer', 'MET_Track5000Aux':'xAOD::MissingETAuxContainer',
210 }
211 # Build track MET with ptCut in MeV and HItight Tracks
212 from DerivationFrameworkHI.TrackMET_config import Cfg_METTrack
213 met_ptCutList = [1000,2000,3000,4000,5000]
214
215 for ptCut in met_ptCutList:
216 acc.merge(Cfg_METTrack(flags, ptCut))
217
218 AllVariables = []
219 AllVariables += ListSlimming.HION5AllVariables(flags.Input.RunNumbers[0])
220 AllVariables += ListSlimming.HION5ExtraContainersTrigger()
221
222 if flags.Input.isMC:
223 from DerivationFrameworkMCTruth.MCTruthCommonConfig import AddStandardTruthContentsCfg
224 acc.merge(AddStandardTruthContentsCfg(flags))
225 AllVariables += ListSlimming.HION5AllTruthVariables()
226
227 HION5SlimmingHelper.SmartCollections = ListSlimming.HION5SmartCollections()
228 HION5SlimmingHelper.ExtraVariables = ListSlimming.HION5ExtraVariables()
229 HION5SlimmingHelper.ExtraVariables += PhotonsCPDetailedContent
230 HION5SlimmingHelper.ExtraVariables += ExtraElectronShowerShapes
231 HION5SlimmingHelper.ExtraVariables += ExtraElectronGSFVar
232 HION5SlimmingHelper.AllVariables = AllVariables
233
234 # Add egamma trigger objects
235 HION5SlimmingHelper.IncludeEGammaTriggerContent = True
236 # Add muon trigger objects
237 HION5SlimmingHelper.IncludeMuonTriggerContent = True
238
239 HION5ItemList = HION5SlimmingHelper.GetItemList()
240
241 acc.merge(OutputStreamCfg(flags, "DAOD_HION5", ItemList=HION5ItemList, AcceptAlgs=["HION5Kernel"]))
242 acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_HION5", AcceptAlgs=["HION5Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData]))
243
244 return acc
HION5KernelCfg(flags, name="HION5Kernel", **kwargs)
Definition HION5.py:92
HION5SkimmingToolCfg(flags)
Definition HION5.py:9
HION5Thinning(flags)
Definition HION5.py:47
HION5Cfg(flags)
Definition HION5.py:166