ATLAS Offline Software
Loading...
Searching...
No Matches
ParticleJetToolsConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3
10
11from AthenaCommon import Logging
12jrtlog = Logging.logging.getLogger('ParticleJetToolsConfig')
13
14from AthenaConfiguration.ComponentFactory import CompFactory
15# workaround for missing JetRecConfig in AthAnalysis
16try:
17 from JetRecConfig.JetRecConfig import isAnalysisRelease
18except ModuleNotFoundError:
20 return True
21
22# Putting MCTruthClassifier here as we needn't stick jet configs in really foreign packages
24 # Assume mc15 value
25 truthclassif = CompFactory.MCTruthClassifier(
26 "JetMCTruthClassifier"
27 )
28 if not isAnalysisRelease() :
29 truthclassif.xAODTruthLinkVector= ""
30 # Config neessary only for Athena releases
31 import os
32 if "AtlasProject" in os.environ.keys():
33 if os.environ["AtlasProject"] in ["Athena","AthDerivation"]:
34 truthclassif.ParticleCaloExtensionTool=""
35 return truthclassif
36
37# Generates truth particle containers for truth labeling
38truthpartoptions = {
39 "Partons":{"ToolType":CompFactory.CopyTruthPartons,"ptmin":5000},
40 "BosonTop":{"ToolType":CompFactory.CopyBosonTopLabelTruthParticles,"ptmin":100000},
41 "FlavourLabel":{"ToolType":CompFactory.CopyFlavorLabelTruthParticles,"ptmin":5000},
42}
44 toolProperties = {}
45 if truthtype == "Partons":
46 truthcategory = "Partons"
47 elif truthtype in ["WBosons", "ZBosons", "HBosons", "TQuarksFinal"]:
48 truthcategory = "BosonTop"
49 toolProperties['ParticleType'] = truthtype
50 else:
51 truthcategory = "FlavourLabel"
52 toolProperties['ParticleType'] = truthtype
53
54 tooltype = truthpartoptions[truthcategory]["ToolType"]
55 toolProperties.update( PtMin = truthpartoptions[truthcategory]["ptmin"],
56 OutputName = "TruthLabel"+truthtype)
57 ctp = tooltype("truthpartcopy_"+truthtype,
58 **toolProperties
59 )
60 return ctp
61
62# Generates input truth particle containers for truth jets
63def getCopyTruthJetParticles(modspec, cflags):
64 truthclassif = getMCTruthClassifier()
65
66 truthpartcopy = CompFactory.CopyTruthJetParticles(
67 "truthpartcopy"+modspec,
68 OutputName="JetInputTruthParticles"+modspec,
69 MCTruthClassifier=truthclassif)
70 if modspec=="NoWZ":
71 truthpartcopy.IncludePromptLeptons=False
72 truthpartcopy.IncludePromptPhotons=False
73 truthpartcopy.IncludeMuons=True
74 truthpartcopy.IncludeNeutrinos=True
75 if modspec=="DressedWZ":
76 truthpartcopy.IncludePromptLeptons=False
77 truthpartcopy.IncludePromptPhotons=True
78 truthpartcopy.IncludeMuons=True
79 truthpartcopy.IncludeNeutrinos=True
80 truthpartcopy.DressingDecorationNames=['TruthParticles.dressedPhoton_e','TruthParticles.dressedPhoton_mu']
81
82 truthpartcopy.ExtraInputs = {( 'xAOD::TruthParticleContainer' , 'StoreGateSvc+TruthParticles.dressedPhoton_e' ),
83 ( 'xAOD::TruthParticleContainer' , 'StoreGateSvc+TruthParticles.dressedPhoton_mu' )}
84 if modspec=="Charged":
85 truthpartcopy.ChargedParticlesOnly=True
86 return truthpartcopy
87
88
89def getCopyTruthJetParticlesGEN(modspec, cflags):
90 """ Build truth constituents as in EVTGEN jobs in the r21 config.
91 IMPORTANT : this is expected to be temporary, only to reproduce the EVTGEN r21 config with the new config. The definitions should be harmonized with reco-level at some point and this function removed.
92 The source for r21 EVTGEN config was in GeneratorFilters/share/common/GenerateTruthJets.py
93 """
94 truthclassif = getMCTruthClassifier()
95
96 if modspec == "":
97 return CompFactory.CopyTruthJetParticles("truthpartcopy",
98 OutputName="JetInputTruthParticlesGEN",
99 MCTruthClassifier=truthclassif)
100 elif modspec=="NoWZ":
101 return CompFactory.CopyTruthJetParticles("truthpartcopywz",
102 OutputName="JetInputTruthParticlesGENNoWZ",
103 MCTruthClassifier=truthclassif,
104 IncludePromptLeptons=False)
105
106
108 """Internal unlity to name labels
109
110 Returns a dictionary to configure labeling tools. Takes one
111 argument which is prefixed to each label.
112 """
113 return dict(
114 LabelName=f"{prefix}TruthLabelID",
115 DoubleLabelName=f"{prefix}ExtendedTruthLabelID",
116 LabelPtName=f"{prefix}TruthLabelPt",
117 LabelLxyName=f"{prefix}TruthLabelLxy",
118 LabelDRName=f"{prefix}TruthLabelDR",
119 LabelPdgIdName=f"{prefix}TruthLabelPdgId",
120 LabelPositionDPhiName=f"{prefix}TruthLabelPositionDPhi",
121 LabelPositionDEtaName=f"{prefix}TruthLabelPositionDEta",
122 LabelBarcodeName=f"{prefix}TruthLabelBarcode",
123 ChildLxyName=f"{prefix}TruthLabelChildLxy",
124 ChildPtName=f"{prefix}TruthLabelChildPt",
125 ChildPdgIdName=f"{prefix}TruthLabelChildPdgId",
126 ChildPositionDPhiName=f"{prefix}TruthLabelChildPositionDPhi",
127 ChildPositionDEtaName=f"{prefix}TruthLabelChildPositionDEta",
128 )
129
130
131# ATLASRECTS-8290: remove use_barcode here
132def getJetDeltaRFlavorLabelTool(name='jetdrlabeler', jet_pt_min=5000, collection="Final", dr_max=0.3, use_barcode=False):
133 """Get the standard flavor tagging delta-R labeling tool
134
135 Uses cone matching to B, C and tau truth particles.
136 """
137 prefix_to_name = "HadronConeExcl"
138 if collection != "Final":
139 prefix_to_name += collection
140 name+=collection
141
142 return CompFactory.ParticleJetDeltaRLabelTool(
143 name,
144 **_getCommonLabelNames(prefix_to_name),
145 BLabelName = "ConeExclBHadrons"+collection,
146 CLabelName = "ConeExclCHadrons"+collection,
147 TauLabelName = "ConeExclTausFinal",
148 BParticleCollection = "TruthLabelBHadrons"+collection,
149 CParticleCollection = "TruthLabelCHadrons"+collection,
150 TauParticleCollection = "TruthLabelTausFinal",
151 PartPtMin = 5000.,
152 DRMax = dr_max,
153 MatchMode = "MinDR",
154 JetPtMin = jet_pt_min,
155 useBarcode=use_barcode, # ATLASRECTS-8290: remove this eventually
156 )
157
158
159def getJetQuarkChargeLabelTool(name='jetquarkcharge',
160 output_label = "QuarkChargeTruthLabelID",
161 hadron_label = "HadronGhostInitialTruthLabelPdgId",
162 parton_label = "PartonExtendedTruthLabelID"):
163 """Get the flavor tagging labeling tool to store the quark charge of a jet
164 It is necessary to have saved before an hadron label and a parton label, otherwise the code will break
165 """
166
167 import ParticleJetTools.quarkChargeMap as qcMap
168 charge_map = qcMap.hadrons_dict
169
170 return CompFactory.JetQuarkChargeLabelingTool(
171 name,
172 HadronDecorationName = hadron_label,
173 PartonDecorationName = parton_label,
174 HadronChargeMap = charge_map,
175 OutputName = output_label,
176 )
177
178def getJetDeltaRLabelTool(jetdef, modspec):
179 """returns a ParticleJetDeltaRLabelTool
180 Cone matching for B, C and tau truth for all but track jets.
181
182 This function is meant to be used as callback from JetRecConfig where
183 it is called as func(jetdef, modspec). Hence the jetdef argument even if not used in this case.
184 """
185 jetptmin = float(modspec)
186 name = "jetdrlabeler_jetpt{0}GeV".format(int(jetptmin/1000))
187 return getJetDeltaRFlavorLabelTool(name, jetptmin)
188
189
190def getJetQuarkChargeTool(jetdef, modspec):
191 """returns a JetQuarkChargeLabelingTool
192
193 This function is meant to be used as callback from JetRecConfig where
194 it is called as func(jetdef, modspec). Hence the jetdef argument even if not used.
195 """
196 if modspec == "":
198
199 outputLabel,hadronLabel,partonLabel = modspec.split(",")
200
201 name = f"jetquarkcharge_{outputLabel}_{hadronLabel}_{partonLabel}"
202 return getJetQuarkChargeLabelTool(name,output_label = outputLabel, hadron_label = hadronLabel, parton_label = partonLabel)
203
204def getJetDeltaRInitialLabelTool(jetdef, modspec):
205 """returns a ParticleJetDeltaRLabelTool
206 Cone matching for B, C and tau truth for all but track jets.
207
208 This function is meant to be used as callback from JetRecConfig where
209 it is called as func(jetdef, modspec). Hence the jetdef argument even if not used in this case.
210 """
211 jetptmin = float(modspec)
212 name = "jetdrlabeler_jetpt{0}GeV".format(int(jetptmin/1000))
213 return getJetDeltaRFlavorLabelTool(name, jetptmin, collection = "Initial")
214
215
216# ATLASRECTS-8290: remove use_barcode here
218 name="jetghostlabeler",
219 collection="Final",
220 use_barcode=False):
221
222 prefix_to_name = "HadronGhost"
223 if collection != "Final":
224 prefix_to_name += collection
225 name+=collection
226 return CompFactory.ParticleJetGhostLabelTool(
227 name,
228 **_getCommonLabelNames(prefix_to_name),
229 GhostBName = "GhostBHadrons"+collection,
230 GhostCName = "GhostCHadrons"+collection,
231 GhostTauName = "GhostTausFinal",
232 useBarcode = use_barcode, # ATLASRECTS-8290: remove this eventually
233 PartPtMin = 5000.0
234 )
235
236def getJetGhostInitialLabelTool(jetdef, modspec):
237 """get ghost-based flavor tagging labeling
238
239 This is a wrapper for JetRecConfig where it's called as
240 func(jetdef, modspec)
241 """
242 return getJetGhostFlavorLabelTool(modspec,collection = "Initial")
243
244def getJetGhostLabelTool(jetdef, modspec):
245 """get ghost-based flavor tagging labeling
246
247 This is a wrapper for JetRecConfig where it's called as
248 func(jetdef, modspec)
249 """
250 return getJetGhostFlavorLabelTool(modspec)
251
252
253def getJetTruthLabelTool(jetdef, modspec):
254
255 isTruthJet = 'Truth' in jetdef.fullname()
256
257 if not isinstance(modspec, str):
258 raise ValueError("JetTruthLabelingTool can only be scheduled with str as modspec")
259 else:
260 truthLabel = str(modspec)
261
262 jetTruthLabelTool = CompFactory.JetTruthLabelingTool('truthlabeler_{0}'.format(truthLabel),
263 RecoJetContainer = jetdef.fullname(),
264 IsTruthJetCollection = isTruthJet,
265 TruthLabelName = truthLabel)
266
267 return jetTruthLabelTool
268
269def getJetTruthLabelToolPrereqs(jetdef, modspec):
270 return ["input:AntiKt10TruthDressedWZSoftDropBeta100Zcut10Jets"] if modspec == "R10WZTruthLabel_R22v1" and jetdef._cflags.Input.isMC else []
271
272def getJetPileupLabelTool(jetdef, modspec):
273
274 jetPileupLabelTool = CompFactory.JetPileupLabelingTool('pileuplabeler',
275 RecoJetContainer = jetdef.fullname(),
276 TruthJetContainer= "AntiKt4TruthDressedWZJets")
277
278 return jetPileupLabelTool
getJetTruthLabelToolPrereqs(jetdef, modspec)
getJetTruthLabelTool(jetdef, modspec)
getJetQuarkChargeTool(jetdef, modspec)
getJetDeltaRLabelTool(jetdef, modspec)
getJetDeltaRInitialLabelTool(jetdef, modspec)
getJetDeltaRFlavorLabelTool(name='jetdrlabeler', jet_pt_min=5000, collection="Final", dr_max=0.3, use_barcode=False)
getJetGhostLabelTool(jetdef, modspec)
getJetPileupLabelTool(jetdef, modspec)
getCopyTruthJetParticles(modspec, cflags)
getJetQuarkChargeLabelTool(name='jetquarkcharge', output_label="QuarkChargeTruthLabelID", hadron_label="HadronGhostInitialTruthLabelPdgId", parton_label="PartonExtendedTruthLabelID")
getCopyTruthJetParticlesGEN(modspec, cflags)
getJetGhostInitialLabelTool(jetdef, modspec)
getJetGhostFlavorLabelTool(name="jetghostlabeler", collection="Final", use_barcode=False)