ATLAS Offline Software
Loading...
Searching...
No Matches
TOPQ7.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2#====================================================================
3# DAOD_TOPQ7.py
4# This defines DAOD_TOPQ7, an skimmed and thinned DAOD format containing all variables
5# from PHYS in boosted ttbar events with the additional 3 leading parton jets saved.
6# It contains the variables and objects needed for the large majority
7# of physics analyses in ATLAS.
8# It requires the flag TOPQ7 in Derivation_tf.py
9#====================================================================
10
11from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
12from AthenaConfiguration.ComponentFactory import CompFactory
13from AthenaConfiguration.Enums import MetadataCategory
14from AthenaCommon.Logging import logging
15logTOPQ7 = logging.getLogger('TOPQ7')
16
18 acc = ComponentAccumulator()
19 acc.addPublicTool(
20 CompFactory.DerivationFramework.BoostedTTbarSkimmingToolAlg(
21 name="TOPQ7BoostedTTbarSkimmingTool",
22 ttbarCut = 700000.0
23 ),
24 primary=True
25 )
26 return acc
27
28
29# Main algorithm config
30def TOPQ7KernelCfg(flags, name='TOPQ7Kernel', **kwargs):
31 """Configure the derivation framework driving algorithm (kernel) for TOPQ7"""
32 acc = ComponentAccumulator()
33
34 # Common augmentations
35 from DerivationFrameworkPhys.PhysCommonConfig import PhysCommonAugmentationsCfg
36 acc.merge(PhysCommonAugmentationsCfg(
37 flags,
38 TriggerListsHelper = kwargs['TriggerListsHelper']
39 ))
40
41 # Thinning tools
42 # These are set up in PhysCommonThinningConfig. Only thing needed here the list of tools to schedule
43 nametag = name.replace('Kernel', '') #get the name to label the tools below such that other formats can use this KernelCfg
44 thinningToolsArgs = {
45 'TrackParticleThinningToolName' : nametag+"TrackParticleThinningTool",
46 'MuonTPThinningToolName' : nametag+"MuonTPThinningTool",
47 'TauJetThinningToolName' : nametag+"TauJetThinningTool",
48 'TauJets_MuonRMThinningToolName' : nametag+"TauJets_MuonRMThinningTool",
49 'DiTauThinningToolName' : nametag+"DiTauThinningTool",
50 'DiTauTPThinningToolName' : nametag+"DiTauTPThinningTool",
51 'DiTauLowPtThinningToolName' : nametag+"DiTauLowPtThinningTool",
52 'DiTauLowPtTPThinningToolName' : nametag+"DiTauLowPtTPThinningTool",
53 }
54 # for AOD produced before 24.0.17, the electron removal tau is not available
55 if flags.Tau.TauEleRM_isAvailable:
56 thinningToolsArgs['TauJets_EleRMThinningToolName'] = nametag+"TauJets_EleRMThinningTool"
57 # Configure the thinning tools
58 from DerivationFrameworkPhys.PhysCommonThinningConfig import PhysCommonThinningCfg
59 acc.merge(PhysCommonThinningCfg(flags, StreamName = kwargs['StreamName'], **thinningToolsArgs))
60 # Get them from the CA so they can be added to the kernel
61 thinningTools = []
62 for key in thinningToolsArgs:
63 thinningTools.append(acc.getPublicTool(thinningToolsArgs[key]))
64
65
66 #Skimming tool and augmentation - boosted ttbar semilep selection and building parton jets
67 skimmingTools = []
68 augmentationTools = []
69
70 if flags.Input.isMC:
71 # Skimming
72 skimmingTool = acc.getPrimaryAndMerge(BoostedTTbarSkimmingToolCfg(flags))
73 skimmingTools.append(skimmingTool)
74
75 # Parton jet augmentation
76 partonTool = CompFactory.DerivationFramework.PartonJetAugmentationTool("TOPQ7PartonJetTool")
77 acc.addPublicTool(partonTool)
78 augmentationTools.append(partonTool)
79
80
81 # The kernel algorithm itself
82 DerivationKernel = CompFactory.DerivationFramework.DerivationKernel
83 acc.addEventAlgo(
84 DerivationKernel(
85 name,
86 ThinningTools = thinningTools,
87 SkimmingTools=skimmingTools,
88 AugmentationTools=augmentationTools
89 ))
90 return acc
91
92
93def TOPQ7CoreCfg(flags, name_tag='TOPQ7', StreamName='StreamDAOD_TOPQ7', TriggerListsHelper=None, addExtraVariables=None):
94
95 if TriggerListsHelper is None:
96 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
97 TriggerListsHelper = TriggerListsHelper(flags)
98
99 acc = ComponentAccumulator()
100
101
102 from DerivationFrameworkHiggs.HiggsPhysContent import HiggsAugmentationAlgsCfg
103 acc.merge(HiggsAugmentationAlgsCfg(flags))
104
105
107 from IsolationSelection.IsolationSelectionConfig import IsoCloseByAlgsCfg
108 acc.merge(IsoCloseByAlgsCfg(flags, isPhysLite = False, stream_name = StreamName))
109
110
111 from LeptonTaggers.LeptonTaggersConfig import DecoratePLITAlgsCfg
112 acc.merge(DecoratePLITAlgsCfg(flags))
113
114 #===================================================
115 # HEAVY FLAVOR CLASSIFICATION FOR ttbar+jets EVENTS
116 #===================================================
117 from DerivationFrameworkMCTruth.HFClassificationCommonConfig import HFClassificationCommonCfg
118 acc.merge(HFClassificationCommonCfg(flags))
119
120 # ============================
121 # Define contents of the format
122 # =============================
123 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
124 from xAODMetaDataCnv.InfileMetaDataConfig import SetupMetaDataForStreamCfg
125 from DerivationFrameworkCore.SlimmingHelper import SlimmingHelper
126
127 TOPQ7SlimmingHelper = SlimmingHelper(name_tag+"SlimmingHelper", NamesAndTypes = flags.Input.TypedCollections, flags = flags)
128 TOPQ7SlimmingHelper.SmartCollections = ["EventInfo",
129 "Electrons",
130 "Photons",
131 "Muons",
132 "PrimaryVertices",
133 "InDetTrackParticles",
134 "AntiKt4EMTopoJets",
135 "AntiKt4EMPFlowJets",
136 "MET_Baseline_AntiKt4EMTopo",
137 "MET_Baseline_AntiKt4EMPFlow",
138 "TauJets",
139 "TauJets_MuonRM",
140 "DiTauJets",
141 "DiTauJetsLowPt",
142 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets",
143 "AntiKtVR30Rmax4Rmin02PV0TrackJets",
144 ]
145 if flags.Tau.TauEleRM_isAvailable:
146 TOPQ7SlimmingHelper.SmartCollections.append("TauJets_EleRM")
147
148 excludedVertexAuxData = "-vxTrackAtVertex.-MvfFitInfo.-isInitialized.-VTAV"
149 StaticContent = []
150 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Tight_Vertices"]
151 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Tight_VerticesAux." + excludedVertexAuxData]
152 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Medium_Vertices"]
153 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Medium_VerticesAux." + excludedVertexAuxData]
154 StaticContent += ["xAOD::VertexContainer#SoftBVrtClusterTool_Loose_Vertices"]
155 StaticContent += ["xAOD::VertexAuxContainer#SoftBVrtClusterTool_Loose_VerticesAux." + excludedVertexAuxData]
156 StaticContent += ["xAOD::VertexContainer#NVSI_SecVrt_Tight"]
157 StaticContent += ["xAOD::VertexAuxContainer#NVSI_SecVrt_TightAux."+excludedVertexAuxData]
158
159 TOPQ7SlimmingHelper.StaticContent = StaticContent
160
161 # Extra content
162 TOPQ7SlimmingHelper.ExtraVariables += ["AntiKt4EMTopoJets.DFCommonJets_QGTagger_truthjet_nCharged.DFCommonJets_QGTagger_truthjet_pt.DFCommonJets_QGTagger_truthjet_eta.DFCommonJets_QGTagger_NTracks.DFCommonJets_QGTagger_TracksWidth.DFCommonJets_QGTagger_TracksC1.ConeExclBHadronsFinal.ConeExclCHadronsFinal.GhostBHadronsFinal.GhostCHadronsFinal.GhostBHadronsFinalCount.GhostBHadronsFinalPt.GhostCHadronsFinalCount.GhostCHadronsFinalPt.IsoFixedCone5PtPUsub",
163 "AntiKt4EMPFlowJets.DFCommonJets_QGTagger_truthjet_nCharged.DFCommonJets_QGTagger_truthjet_pt.DFCommonJets_QGTagger_truthjet_eta.DFCommonJets_QGTagger_NTracks.DFCommonJets_QGTagger_TracksWidth.DFCommonJets_QGTagger_TracksC1.ConeExclBHadronsFinal.ConeExclCHadronsFinal.GhostBHadronsFinal.GhostCHadronsFinal.GhostBHadronsFinalCount.GhostBHadronsFinalPt.GhostCHadronsFinalCount.GhostCHadronsFinalPt.isJvtHS.isJvtPU.IsoFixedCone5PtPUsub",
164 "TruthPrimaryVertices.t.x.y.z",
165 "InDetTrackParticles.TTVA_AMVFVertices.TTVA_AMVFWeights.eProbabilityHT.numberOfTRTHits.numberOfTRTOutliers",
166 "EventInfo.GenFiltHT.GenFiltMET.GenFiltHTinclNu.GenFiltPTZ.GenFiltFatJ.HF_Classification.HF_SimpleClassification.HF_ClassificationC5J20.HF_ClassificationC5J25.HF_ClassificationC15J20.HF_ClassificationC15J25",
167 "TauJets.dRmax.etOverPtLeadTrk",
168 "TauJets_MuonRM.dRmax.etOverPtLeadTrk",
169 "HLT_xAOD__TrigMissingETContainer_TrigEFMissingET.ex.ey",
170 "HLT_xAOD__TrigMissingETContainer_TrigEFMissingET_mht.ex.ey",
171 "HLT_AnomDet_ComboHypo.adScore"]
172
173 if addExtraVariables:
174 TOPQ7SlimmingHelper.ExtraVariables += addExtraVariables
175
176 if flags.Tau.TauEleRM_isAvailable:
177 TOPQ7SlimmingHelper.ExtraVariables += ["TauJets_EleRM.dRmax.etOverPtLeadTrk"]
178
179 # IFF extra content
180 from LeptonTaggers.LeptonTaggersConfig import GetExtraPLITVariablesForDxAOD
181 TOPQ7SlimmingHelper.ExtraVariables += GetExtraPLITVariablesForDxAOD()
182
183 # boosted jet taggers
184 TOPQ7SlimmingHelper.ExtraVariables += ["AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10TruthLabel_R22v1_TruthJetMass",
185 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10TruthLabel_R22v1_TruthJetPt",
186 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10TruthLabel_R22v1_TruthGroomedJetMass",
187 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10TruthLabel_R22v1_TruthGroomedJetPt",
188 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10WZTruthLabel_R22v1_TruthJetMass",
189 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10WZTruthLabel_R22v1_TruthJetPt",
190 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10WZTruthLabel_R22v1_TruthGroomedJetMass",
191 "AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets.R10WZTruthLabel_R22v1_TruthGroomedJetPt"]
192
193 # Truth extra content
194 if flags.Input.isMC:
195
196 from DerivationFrameworkMCTruth.MCTruthCommonConfig import addTruth3ContentToSlimmerTool
197 addTruth3ContentToSlimmerTool(TOPQ7SlimmingHelper)
198 TOPQ7SlimmingHelper.AllVariables += ['TruthLHEParticles','InTimeAntiKt4TruthJets','OutOfTimeAntiKt4TruthJets']
199 TOPQ7SlimmingHelper.ExtraVariables += ["Electrons.TruthLink",
200 "Muons.TruthLink",
201 "Photons.TruthLink",
202 "AntiKt4TruthDressedWZJets.IsoFixedCone5Pt.HFHadronOriginID",
203 "TruthHFWithDecayParticles.prodVtxLink.prodVtxLink.prodVtxLink.decayVtxLink.decayVtxLink.decayVtxLink.parentLinks.childLinks.m.px.py.pz.e.pdgId.Classification.uid.classifierParticleOrigin.classifierParticleType.classifierParticleOutCome.status",
204 "TruthHFWithDecayVertices.incomingParticleLinks.outgoingParticleLinks.uid.status.x.y.z.t",
205 "TruthCharm.prodVtxLink.prodVtxLink.prodVtxLink.decayVtxLink.decayVtxLink.decayVtxLink.parentLinks.childLinks.m.px.py.pz.e.pdgId.Classification.uid.classifierParticleOrigin.classifierParticleType.classifierParticleOutCome.status.barcode.polarizationPhi.polarizationTheta",
206 "TruthPileupParticles.prodVtxLink.prodVtxLink.prodVtxLink.decayVtxLink.decayVtxLink.decayVtxLink.m.px.py.pz.e.pdgId.Classification.uid.classifierParticleOrigin.classifierParticleType.classifierParticleOutCome.status.barcode.PVz.pileupEventNumber.parentHadronID"]
207
208 from DerivationFrameworkMCTruth.MCTruthCommonConfig import AddTauAndDownstreamParticlesCfg
209 acc.merge(AddTauAndDownstreamParticlesCfg(flags))
210 TOPQ7SlimmingHelper.ExtraVariables += ["TruthTausWithDecayParticles.prodVtxLink.prodVtxLink.prodVtxLink.decayVtxLink.decayVtxLink.decayVtxLink.m.px.py.pz.e.pdgId.Classification.uid.classifierParticleOrigin.classifierParticleType.classifierParticleOutCome.status",
211 "TruthTausWithDecayVertices.incomingParticleLinks.outgoingParticleLinks.uid.status.x.y.z.t"]
212
213 #parton jets
214 TOPQ7SlimmingHelper.AppendToDictionary.update({
215 "PartonJets": "xAOD::JetContainer",
216 "PartonJetsAux": "xAOD::JetAuxContainer"
217 })
218
219 TOPQ7SlimmingHelper.AllVariables += ["PartonJets"]
220
221
222
223 from DerivationFrameworkHiggs.HiggsPhysContent import setupHiggsSlimmingVariables
224 setupHiggsSlimmingVariables(flags, TOPQ7SlimmingHelper)
225
226
227 TOPQ7SlimmingHelper.AllVariables += [ 'AFPSiHitContainer', 'AFPToFHitContainer' ]
228
229
230 TOPQ7SlimmingHelper.AppendToDictionary.update({'MET_Core_AntiKt4EMPFlowHR':'xAOD::MissingETContainer', 'MET_Core_AntiKt4EMPFlowHRAux':'xAOD::MissingETAuxContainer',
231 'METAssoc_AntiKt4EMPFlowHR':'xAOD::MissingETAssociationMap', 'METAssoc_AntiKt4EMPFlowHRAux':'xAOD::MissingETAuxAssociationMap'})
232
233 TOPQ7SlimmingHelper.AllVariables += ['METAssoc_AntiKt4EMPFlowHR']
234
235 TOPQ7SlimmingHelper.ExtraVariables += ['Muons.UEcorr_Pt','Electrons.UEcorr_Pt','MET_Core_AntiKt4EMPFlowHR.name.mpx.mpy.sumet.source']
236
237 # Trigger content
238 TOPQ7SlimmingHelper.IncludeTriggerNavigation = False
239 TOPQ7SlimmingHelper.IncludeJetTriggerContent = False
240 TOPQ7SlimmingHelper.IncludeMuonTriggerContent = False
241 TOPQ7SlimmingHelper.IncludeEGammaTriggerContent = False
242 TOPQ7SlimmingHelper.IncludeTauTriggerContent = False
243 TOPQ7SlimmingHelper.IncludeEtMissTriggerContent = False
244 TOPQ7SlimmingHelper.IncludeBJetTriggerContent = False
245 TOPQ7SlimmingHelper.IncludeBPhysTriggerContent = False
246 TOPQ7SlimmingHelper.IncludeMinBiasTriggerContent = False
247 # Compact b-jet trigger matching info
248 TOPQ7SlimmingHelper.IncludeBJetTriggerByYearContent = True
249
250 # Trigger matching
251 # Run 2
252 if flags.Trigger.EDMVersion == 2:
253 from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddRun2TriggerMatchingToSlimmingHelper
254 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TOPQ7SlimmingHelper,
255 OutputContainerPrefix = "TrigMatch_",
256 TriggerList = TriggerListsHelper.Run2TriggerNamesTau)
257 AddRun2TriggerMatchingToSlimmingHelper(SlimmingHelper = TOPQ7SlimmingHelper,
258 OutputContainerPrefix = "TrigMatch_",
259 TriggerList = TriggerListsHelper.Run2TriggerNamesNoTau)
260 # Run 3, or Run 2 with navigation conversion
261 if flags.Trigger.EDMVersion == 3 or (flags.Trigger.EDMVersion == 2 and flags.Trigger.doEDMVersionConversion):
262 from TrigNavSlimmingMT.TrigNavSlimmingMTConfig import AddRun3TrigNavSlimmingCollectionsToSlimmingHelper
263 AddRun3TrigNavSlimmingCollectionsToSlimmingHelper(TOPQ7SlimmingHelper)
264
265 # L1 trigger objects
266 from Campaigns.Utils import getDataYear
267 if getDataYear(flags) >= 2024:
268 # Run 3 with Phase I jet RoIs.
269 from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddjFexRoIsToSlimmingHelper
270 AddjFexRoIsToSlimmingHelper(SlimmingHelper = TOPQ7SlimmingHelper)
271 elif getDataYear(flags) >= 2015:
272 # Run 2 and early Run 3, legacy L1 RoIs
273 from DerivationFrameworkPhys.TriggerMatchingCommonConfig import AddLegacyL1JetRoIsToSlimmingHelper
274 AddLegacyL1JetRoIsToSlimmingHelper(SlimmingHelper = TOPQ7SlimmingHelper)
275
276 # Output stream
277 TOPQ7ItemList = TOPQ7SlimmingHelper.GetItemList()
278 acc.merge(OutputStreamCfg(flags, "DAOD_"+name_tag, ItemList=TOPQ7ItemList, AcceptAlgs=[name_tag+"Kernel"]))
279 acc.merge(SetupMetaDataForStreamCfg(flags, "DAOD_"+name_tag, AcceptAlgs=[name_tag+"Kernel"], createMetadata=[MetadataCategory.CutFlowMetaData, MetadataCategory.TruthMetaData]))
280
281 return acc
282
283def TOPQ7Cfg(flags):
284
285 logTOPQ7.info('****************** STARTING TOPQ7 *****************')
286
287 stream_name = 'StreamDAOD_TOPQ7'
288 acc = ComponentAccumulator()
289
290 # Get the lists of triggers needed for trigger matching.
291 # This is needed at this scope (for the slimming) and further down in the config chain
292 # for actually configuring the matching, so we create it here and pass it down
293 # TODO: this should ideally be called higher up to avoid it being run multiple times in a train
294 from DerivationFrameworkPhys.TriggerListsHelper import TriggerListsHelper
295 TOPQ7TriggerListsHelper = TriggerListsHelper(flags)
296
297 # Common augmentations
298 acc.merge(TOPQ7KernelCfg(
299 flags,
300 name="TOPQ7Kernel",
301 StreamName = stream_name,
302 TriggerListsHelper = TOPQ7TriggerListsHelper
303 ))
304 # TOPQ7 content
305 acc.merge(TOPQ7CoreCfg(
306 flags,
307 "TOPQ7",
308 StreamName = stream_name,
309 TriggerListsHelper = TOPQ7TriggerListsHelper
310 ))
311
312 return acc
TOPQ7CoreCfg(flags, name_tag='TOPQ7', StreamName='StreamDAOD_TOPQ7', TriggerListsHelper=None, addExtraVariables=None)
Definition TOPQ7.py:93
BoostedTTbarSkimmingToolCfg(flags)
Definition TOPQ7.py:17
TOPQ7Cfg(flags)
Definition TOPQ7.py:283
TOPQ7KernelCfg(flags, name='TOPQ7Kernel', **kwargs)
Definition TOPQ7.py:30