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