ATLAS Offline Software
Loading...
Searching...
No Matches
JetMomentToolsConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2
3"""
4
5 JetMomentToolsConfig: A helper module for configuring jet moment
6 tools, in support of JetRecConfig.JetModConfig.
7 Author: TJ Khoo
8
9
10IMPORTANT : all the getXYZTool(jetdef, modspec) functions are meant to be used as callback from the main JetRecConfig module
11when we need to convert definitions of tools into the actual tools. At this point the functions are invoked as
12 func(jetdef, modspec)
13Hence they have jetdef and modspec arguments even if not needed in every case.
14"""
15
16from AthenaCommon import Logging
17jetmomentlog = Logging.logging.getLogger('JetMomentToolsConfig')
18
19from AthenaConfiguration.ComponentFactory import CompFactory
20from AthenaConfiguration.Enums import LHCPeriod
21
22from xAODBase.xAODType import xAODType
23
24
25def idTrackSelToolFromJetCtx(trkOpt,trkProperties):
26 """returns a InDetTrackSelectionTool configured with the jet context corresponding to trkOpt
27 """
28 from JetRecTools.JetRecToolsConfig import getIDTrackSelectionTool #
29 return getIDTrackSelectionTool(f"trackSel{trkOpt}", **trkProperties["trackSelOptions"])
30
31
32def getEMScaleMomTool(jetdef, modspec=""):
33 # This may need updating e.g. for evolving trigger cluster container names
34 # We do the non-trivial summation over constituents unless the jets were
35 # built directly from EM-scale topoclusters, in which case we can just
36 # copy the constituent scale
37 useUncalibConstits = False
38 if jetdef.inputdef.basetype==xAODType.CaloCluster:
39 builtFromEMClusters = jetdef.inputdef.inputname in ["CaloCalTopoClusters","HLT_CaloTopoClustersFS"] and jetdef.inputdef.modifiers==["EM"]
40 useUncalibConstits = not builtFromEMClusters
41 elif (jetdef.inputdef.basetype==xAODType.ParticleFlow or jetdef.inputdef.basetype==xAODType.FlowElement):
42 useUncalibConstits = True
43 else:
44 raise ValueError("EM scale momentum not defined for input type {}".format(jetdef.inputdef.basetype))
45
46 emscalemom = CompFactory.JetEMScaleMomTool(
47 "emscalemom_{}".format(jetdef.basename),
48 UseUncalibConstits = useUncalibConstits,
49 JetContainer = jetdef.fullname(),
50 )
51
52 return emscalemom
53
54def getConstitFourMomTool(jetdef, modspec=""):
55
59 CaloClusterStates = {
60 "UNKNOWN" : -1,
61 "UNCALIBRATED" : 0,
62 "CALIBRATED" : 1,
63 "ALTCALIBRATED" : 2,
64 "NSTATES" : 3
65 }
66
67 cfourmom = CompFactory.JetConstitFourMomTool("constitfourmom_{0}".format(jetdef.basename))
68 if "LCTopo" in jetdef.basename or "EMTopo" in jetdef.basename:
69 cfourmom.JetScaleNames = ["DetectorEtaPhi"]
70 if "HLT_" in jetdef.fullname():
71 cfourmom.AltConstitColls = [""]
72 cfourmom.AltConstitScales = [0]
73 cfourmom.AltJetScales = ["JetConstitScaleMomentum"]
74 else:
75 clstate = "CALIBRATED" if "LCTopo" in jetdef.basename else "UNCALIBRATED"
76 cfourmom.AltConstitColls = [jetdef.inputdef.inputname]
77 cfourmom.AltConstitScales = [CaloClusterStates[clstate]]
78 cfourmom.AltJetScales = [""]
79 # Drop the LC-calibrated four-mom for EMTopo jets as we only wanted it as a possibility
80 # in MET CST calculations but never used it
81 elif "PFlow" in jetdef.basename or "UFO" in jetdef.basename:
82 cfourmom.JetScaleNames = ["DetectorEtaPhi"]
83 cfourmom.AltConstitColls = [""]
84 cfourmom.AltConstitScales = [0]
85 cfourmom.AltJetScales = ["JetConstitScaleMomentum"]
86
87 return cfourmom
88
89# Jet vertex fraction with selection.
90def getJVFTool(jetdef, modspec):
91 trkopt = modspec or jetdef.context # allow to overide jetdef.context if modspec is specified
92 trackingKeys = jetdef._cflags.Jet.Context[trkopt]
93 jvf = CompFactory.JetVertexFractionTool(
94 "jvf",
95 VertexContainer = trackingKeys["Vertices"],
96 AssociatedTracks = trackingKeys["GhostTracksLabel"],
97 TrackVertexAssociation = trackingKeys["TVA"],
98 TrackParticleContainer = trackingKeys["Tracks"],
99 TrackSelector = idTrackSelToolFromJetCtx(trkopt, trackingKeys),
100 SuppressInputDependence = True,
101 UseOriginVertex = jetdef.byVertex
102 )
103 return jvf
104
105
106# Jet vertex tagger with selection.
107def getJVTTool(jetdef, modspec):
108 jvt = CompFactory.JetVertexTaggerTool(
109 "jvt",
110 VertexContainer = jetdef._cflags.Jet.Context[modspec or jetdef.context]["Vertices"],
111 SuppressInputDependence = True,
112 UseOriginVertex = jetdef.byVertex
113 )
114 return jvt
115
116# Jet vertex tagger with neural network.
117def getNNJvtTool(jetdef, modspec):
118 nnjvt = CompFactory.getComp("JetPileupTag::JetVertexNNTagger")(
119 "nnjvt",
120 VertexContainer = jetdef._cflags.Jet.Context[modspec or jetdef.context]["Vertices"],
121 SuppressInputDependence = True
122 )
123 return nnjvt
124
125
126def getTrackMomentsTool(jetdef, modspec):
127 # retrieve the tracking keys to be used with modspec :
128 trkopt = modspec or jetdef.context # allow to overide jetdef.context if modspec is specified
129 trackingKeys = jetdef._cflags.Jet.Context[trkopt]
130
131 trackmoments = CompFactory.JetTrackMomentsTool(
132 "trkmoms",
133 VertexContainer = trackingKeys["Vertices"],
134 AssociatedTracks = trackingKeys["GhostTracksLabel"],
135 TrackVertexAssociation = trackingKeys["TVA"],
136 TrackMinPtCuts = [500, 1000],
137 TrackSelector = idTrackSelToolFromJetCtx(trkopt,trackingKeys),
138 DoPFlowMoments = 'PFlow' in jetdef.fullname() or 'UFO' in jetdef.fullname() ,
139 )
140 return trackmoments
141
142def getTrackSumMomentsTool(jetdef, modspec):
143 trkopt = modspec or jetdef.context # allow to overide jetdef.context if modspec is specified
144 trackingKeys = jetdef._cflags.Jet.Context[trkopt]
145 jettrackselloose = idTrackSelToolFromJetCtx(trkopt,trackingKeys)
146 # retrieve the tracking keys to be used with modspec :
147 tracksummoments = CompFactory.JetTrackSumMomentsTool(
148 "trksummoms",
149 VertexContainer = trackingKeys["Vertices"],
150 AssociatedTracks = trackingKeys["GhostTracksLabel"],
151 TrackVertexAssociation = trackingKeys["TVA"],
152 RequireTrackPV = True,
153 TrackSelector = jettrackselloose
154 )
155 return tracksummoments
156
157# This tool sets a decoration saying which the nominal HS PV was.
158# Historically it did the origin correction, but now we do this to constituents
159def getOriginCorrVxTool(jetdef, modspec):
160 origin_setpv = CompFactory.JetOriginCorrectionTool(
161 "jetorigin_setpv",
162 VertexContainer = jetdef._cflags.Jet.Context[modspec or jetdef.context]["Vertices"],
163 OriginCorrectedName = "",
164 OnlyAssignPV = True,
165 )
166 return origin_setpv
167
168
169def getJetPtAssociationTool(jetdef, modspec):
170
171 from JetRecConfig.JetDefinition import buildJetAlgName
172
173 truthJetAlg = buildJetAlgName(jetdef.algorithm, jetdef.radius)+'Truth'+str(modspec)+'Jets'
174
175 jetPtAssociation = CompFactory.JetPtAssociationTool('jetPtAssociation',
176 MatchingJetContainer = truthJetAlg,
177 AssociationName = "GhostTruth")
178
179 return jetPtAssociation
180
181
182def getQGTaggingTool(jetdef, modspec):
183 trkopt = modspec or jetdef.context # allow to overide jetdef.context if modspec is specified
184 trackingKeys = jetdef._cflags.Jet.Context[trkopt]
185
186 qgtagging = CompFactory.JetQGTaggerVariableTool('qgtagging',
187 VertexContainer = trackingKeys["Vertices"],
188 TrackVertexAssociation = trackingKeys["TVA"],
189 TrackSelector = idTrackSelToolFromJetCtx(trkopt,trackingKeys),
190 )
191
192 return qgtagging
193
194
195def getPFlowfJVTTool(jetdef, modspec):
196
197 from JetCalibTools import JetCalibToolsConfig
198 calibString = "AnalysisLatest:mc:JetArea_Residual_EtaJES"
199 if( modspec and modspec == "CustomVtx" ) :
200 if jetdef._cflags.GeoModel.Run is LHCPeriod.Run3:
201 calibString = "AnalysisLatest:mc:JetArea_Residual_EtaJES:Kt4EMPFlowNeutEventShape:HggPrimaryVertices"
202 else:
203 calibString = "AnalysisLatest:mc:JetArea_Residual_EtaJES:Kt4EMPFlowCustomVtxEventShape:HggPrimaryVertices"
204 jetCalibrationTool = JetCalibToolsConfig.getJetCalibToolFromString(jetdef, calibString)
205
206 wPFOTool = CompFactory.getComp('CP::WeightPFOTool')("fJVT__wPFO")
207
208 trackingKeys = jetdef._cflags.Jet.Context[modspec or jetdef.context]
209
210 fJVTTool = CompFactory.JetForwardPFlowJvtTool("fJVT",
211 verticesName = trackingKeys["Vertices"],
212 TrackVertexAssociation = trackingKeys["TVA"],
213 WeightPFOTool = wPFOTool,
214 JetCalibrationTool = jetCalibrationTool,
215 FEName = jetdef.inputdef.containername,
216 ORName = "",
217 FjvtRawName = "DFCommonJets_fJvt",
218 includePV = False,
219 SuppressInputDependence = True)
220
221 return fJVTTool
222
223
224def getPFlowbJVTTool(jetdef, modspec):
225
226 from JetCalibTools import JetCalibToolsConfig
227 jetCalibrationTool = JetCalibToolsConfig.getJetCalibToolFromString(jetdef, "AnalysisLatest:mc:JetArea_Residual_EtaJES")
228
229 wPFOTool = CompFactory.getComp('CP::WeightPFOTool')("bJVT__wPFO")
230
231 trackingKeys = jetdef._cflags.Jet.Context[modspec or jetdef.context]
232
233 bJVTTool = CompFactory.JetBalancePFlowJvtTool('bJVT',
234 verticesName = trackingKeys["Vertices"],
235 TrackVertexAssociation = trackingKeys["TVA"],
236 WeightPFOTool = wPFOTool,
237 JetCalibrationTool = jetCalibrationTool,
238 FEName = jetdef.inputdef.containername,
239 ORNameFE = "",
240 BjvtRawName = 'DFCommonJets_bJvt',
241 includePV = True)
242
243 return bJVTTool
244
245def getBoostedJetTaggerToolQG(jetdef, modspec):
246
247 jssutils = CompFactory.JSSTaggerUtils("JSSTaggerUtils/MyTagger")
248
249
250 bjtTool = CompFactory.BoostedJetTaggerTool("BoostedJetTaggerTool",
251 MLTagger = jssutils,
252 DecorationName = "QGTransformer",
253 CalibArea = "QGConstituentTagger/May2025",
254 ConfigFile = "QGTagger_AntiKt04PFlow_Transformer.dat"
255 )
256
257 return bjtTool
258
259def getBoostedJetTaggerToolTop(jetdef, modspec):
260
261 jssutils = CompFactory.JSSTaggerUtils("JSSTaggerUtils/MyTagger")
262
263
264 bjtTool = CompFactory.BoostedJetTaggerTool("BoostedJetTaggerTool-Top",
265 MLTagger = jssutils,
266 JetContainer = jetdef.fullname(),
267 DecorationName = "TopTransformer",
268 CalibArea = "TopConstituentTagger/July2025",
269 ConfigFile = "TopTagger_AntiKt10UFOSoftDrop_Transformer.dat"
270 )
271
272 return bjtTool
273
274def getBoostedJetTaggerToolW(jetdef, modspec):
275
276 jssutils = CompFactory.JSSTaggerUtils("JSSTaggerUtils/MyTagger")
277
278
279 bjtTool = CompFactory.BoostedJetTaggerTool("BoostedJetTaggerTool-W",
280 MLTagger = jssutils,
281 JetContainer = jetdef.fullname(),
282 DecorationName = "WTransformer",
283 CalibArea = "WConstituentTagger/July2025",
284 ConfigFile = "WTagger_AntiKt10UFOSoftDrop_Transformer.dat"
285 )
286
287
288 return bjtTool
289
291
292 jssutils = CompFactory.JSSTaggerUtils("JSSTaggerUtils/MyTagger")
293
294
295 bjtTool = CompFactory.BoostedJetTaggerTool("BoostedJetTaggerTool-WMassDec",
296 MLTagger = jssutils,
297 JetContainer = jetdef.fullname(),
298 DecorationName = "WTransformer_massdec",
299 CalibArea = "WConstituentTaggerMassDec/July2025",
300 ConfigFile = "WTagger_AntiKt10UFOSoftDrop_Transformer.dat"
301 )
302
303
304 return bjtTool
if(febId1==febId2)
getJetCalibToolFromString(jetdef, modspec)
getTrackMomentsTool(jetdef, modspec)
getNNJvtTool(jetdef, modspec)
getConstitFourMomTool(jetdef, modspec="")
getPFlowfJVTTool(jetdef, modspec)
getEMScaleMomTool(jetdef, modspec="")
getBoostedJetTaggerToolWMassDec(jetdef, modspec)
getBoostedJetTaggerToolW(jetdef, modspec)
getJetPtAssociationTool(jetdef, modspec)
getBoostedJetTaggerToolTop(jetdef, modspec)
getTrackSumMomentsTool(jetdef, modspec)
getBoostedJetTaggerToolQG(jetdef, modspec)
idTrackSelToolFromJetCtx(trkOpt, trkProperties)
getQGTaggingTool(jetdef, modspec)
getOriginCorrVxTool(jetdef, modspec)
getJVFTool(jetdef, modspec)
getPFlowbJVTTool(jetdef, modspec)