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