ATLAS Offline Software
Loading...
Searching...
No Matches
StandardJetMods.py
Go to the documentation of this file.
1# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2"""
3This module defines the standard JetModifier tools used in jet reco
4
5Definitions are grouped in a dictionary of tool configurations using the helpers defined
6in package configs.
7This dict maps a modifier alias to the JetModifier config object
8that in turn will be responsible for generating a configured tool.
9
10The JetModifier config class is defined in JetDefinition.py
11
12 Args to the JetModifier constructor are:
13 1. Tool Type (ignored if the helper is a custom one)
14 2. Tool Name (ignored if the helper is a custom one)
15 3. createfn : helper function which build the actual tool. If none, we just instantiate the tool type.
16 4. prereqs : Prerequisites (default to []). Can also be a function which returns a list
17 X. all other keyword arguments are directly interpreted as Property of the tool.
18 for ex, passing 'PtMin=10.' will configure the tool as in 'tool.PtMin = 10'
19 we can pass function as the value :
20 'JetContainerName=nameFunc' will configure as in 'tool.JetContainerName=nameFunc(jetdef, modspec)'
21
22 --> should this be by default? prefer to avoid ignored args
23"""
24from .JetDefinition import JetModifier
25from .Utilities import ldict
26from .StandardJetConstits import inputsFromContext
27
28from JetRecConfig.JetRecCommon import isMC
29
30stdJetModifiers = ldict()
31
32
33# Many JetMoment tools need to know the name of the container they operate on.
34# We set the function below as the 'JetContainer' property so the config system
35# can assign the right name to the c++ tool.
36def _jetname(jetdef,modspec):
37 return jetdef.fullname()
38
39
40def _constitContainername(jetdef,modspec):
41 """Returns the exact constituent container name used to build jetdef"""
42 constitdef = jetdef.inputdef
43 containername = constitdef.containername(jetdef).split(':')[-1] if callable(constitdef.containername) else constitdef.containername
44 return containername
45
46
47
49stdJetModifiers.update(
50 Sort = JetModifier("JetSorter","jetsort"),
51 Filter = JetModifier("JetFilterTool","jetptfilter_{modspec}",
52 # we give a function as PtMin : it will be evaluated when instantiating the tool (modspec is specified with this tool
53 # alias like "Filter:10000" --> PtMin=100000).
54 PtMin = lambda jdef,modspec: int(modspec)
55 ),
56 Filter_ifnotESD = JetModifier("JetFilterTool","jetptfilter_{modspec}",
57 PtMin = lambda _,modspec: 1,
58 ),
59 # Filter that can be easily turned off via pre-exec for e.g. PHYSVAL
60 Filter_calibThreshold = JetModifier("JetFilterTool","jetptfilter_{modspec}",
61 PtMin = lambda jetdef,modspec: 1 if not jetdef._cflags.Jet.useCalibJetThreshold else int(modspec),
62 )
63)
64
65
70
71# Calibration
72try:
73 from JetCalibTools import JetCalibToolsConfig
74 stdJetModifiers.update(
75 Calib = JetModifier("JetCalibrationTool","jetcalib_jetcoll_calibseq",
76 createfn=JetCalibToolsConfig.getJetCalibToolFromString,
77 prereqs=lambda mod,jetdef : JetCalibToolsConfig.getJetCalibToolPrereqs(mod,jetdef)+[inputsFromContext("Vertices")])
78 )
79
80 from JetCalibTools import JetResponseToolConfig
81 stdJetModifiers.update(
82 # *******************
83 # Response variables
84 Response = JetModifier("JetResponseTool","response",
85 JetContainer=_jetname,
86 prereqs= ["input:EventDensity"],
87 createfn=JetResponseToolConfig.getJetResponseTool,
88 ),
89 )
90
91except ModuleNotFoundError:
92 from AthenaCommon import Logging
93 jetlog = Logging.logging.getLogger('JetStandardMods')
94 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
95 pass
96
97try:
98 from JetCalibTools import JetCalibToolsCfg
99 stdJetModifiers.update(
100 CalibNew = JetModifier("JetCalibTool","jetcalib_jetcoll_calibseq",
101 createfn=JetCalibToolsCfg.defineJetCalibTool,
102 prereqs=lambda mod,jetdef : JetCalibToolsCfg.getJetCalibToolPrereqs(jetdef,mod)+[inputsFromContext("Vertices")])
103 )
104except ModuleNotFoundError:
105 from AthenaCommon import Logging
106 jetlog = Logging.logging.getLogger('JetStandardMods')
107 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
108 pass
109
110# TBD:
111# All items below in principle will support decoration mode, rather
112# than only non-const modification. Mode of operation should be
113# determined by interface called from parent tool/alg.
114
115
116# Many JetMoment tools need to know the name of the container they operate on.
117# We set the function below as the 'JetContainer' property so the config system
118# can assign the right name to the c++ tool.
119def _jetname(jetdef,modspec):
120 return jetdef.fullname()
121
122
123# Standard jet moments
124try:
125 from JetMomentTools import JetMomentToolsConfig
126 stdJetModifiers.update(
127
128 # Easy cases, no special config or prereqs, just default tool config
129 ClusterMoments = JetModifier("JetClusterMomentsTool", "clsmoms", JetContainer = _jetname),
130 ECPSFrac = JetModifier("JetECPSFractionTool", "ecpsfrac", JetContainer = _jetname),
131 Width = JetModifier("JetWidthTool", "width", JetContainer = _jetname),
132
133 # More complex cases here
134 CaloEnergies = JetModifier("JetCaloEnergies", "jetens",
135 prereqs=["mod:EMScaleMom"],
136 Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
137 ),
138
139 CaloEnergiesLargeR = JetModifier("JetCaloEnergies", "jetenslargeR",
140 prereqs=["mod:EMScaleMom"],
141 Calculations=["EMFrac", "HECFrac", "PSFrac", "EM3Frac", "Tile0Frac", "EffNClusts"], JetContainer = _jetname,
142 calcClusterBasedVars = True,
143 ),
144
145 # CaloEnergiesClus is only relevant for FE-based jet collections
146 CaloEnergiesClus = JetModifier("JetCaloEnergies", "jetensclus",
147 prereqs=["mod:EMScaleMom"],
148 Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
149 calcClusterBasedVars = True),
150
151 CaloQuality = JetModifier("JetCaloQualityTool", "caloqual",
152 TimingCuts = [5,10],
153 Calculations = ["LArQuality", "N90Constituents", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
154
155 CaloQualityFE = JetModifier("JetCaloQualityToolFE", "caloqualFE",
156 TimingCuts = [5,10],
157 ThresholdCuts = [90],
158 Calculations = ["LArQuality", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
159
160 N90 = JetModifier("JetCaloQualityTool", "n90",
161 Calculations = ["N90Constituents"],JetContainer = _jetname),
162
163 ConstitFourMom = JetModifier("JetConstitFourMomTool", "constitfourmom_basename",
164 createfn=JetMomentToolsConfig.getConstitFourMomTool,),
165 EMScaleMom = JetModifier("JetEMScaleMomTool", "emscalemom_basename",
166 createfn=JetMomentToolsConfig.getEMScaleMomTool,
167 JetContainer = _jetname),
168
169 JVF = JetModifier("JetVertexFractionTool", "jvf",
170 createfn=JetMomentToolsConfig.getJVFTool,
171 prereqs = [inputsFromContext("TVA"), "mod:TrackMoments", inputsFromContext("Vertices")],
172 JetContainer = _jetname),
173 JVT = JetModifier("JetVertexTaggerTool", "jvt",
174 createfn=JetMomentToolsConfig.getJVTTool,
175 prereqs = [ "mod:JVF" ],JetContainer = _jetname),
176 NNJVT = JetModifier("JetVertexNNTagger", "nnjvt",
177 createfn=JetMomentToolsConfig.getNNJvtTool,
178 prereqs = [ "mod:JVF" ],JetContainer = _jetname),
179 LArHVCorr = JetModifier("JetLArHVTool", "larhvcorr",
180 prereqs = ["mod:EMScaleMom"],JetContainer = _jetname),
181 OriginSetPV = JetModifier("JetOriginCorrectionTool", "origin_setpv",
182 prereqs = [ "mod:JVF" ],JetContainer = _jetname, OnlyAssignPV=True),
183 TrackMoments = JetModifier("JetTrackMomentsTool", "trkmoms",
184 createfn=JetMomentToolsConfig.getTrackMomentsTool,
185 prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
186
187 TrackSumMoments = JetModifier("JetTrackSumMomentsTool", "trksummoms",
188 createfn=JetMomentToolsConfig.getTrackSumMomentsTool,
189 prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
190 Charge = JetModifier("JetChargeTool", "jetcharge",
191 prereqs = [ "ghost:Track" ]),
192
193 QGTagging = JetModifier("JetQGTaggerVariableTool", "qgtagging",
194 createfn=JetMomentToolsConfig.getQGTaggingTool,
195 prereqs = lambda _,jetdef :
196 [inputsFromContext("TVA"),"mod:TrackMoments"] +
197 (["mod:JetPtAssociation"] if not isMC(jetdef._cflags) else []),
198 JetContainer = _jetname),
199
200 fJVT = JetModifier("JetForwardPFlowJvtTool", "fJVT",
201 createfn=JetMomentToolsConfig.getPFlowfJVTTool,
202 prereqs = [inputsFromContext("TVA"),inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
203 JetContainer = _jetname),
204
205 bJVT = JetModifier("JetBalancePFlowJvtTool", "bJVT",
206 createfn=JetMomentToolsConfig.getPFlowbJVTTool,
207 prereqs = [inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
208 JetContainer = _jetname),
209
210 ConstitFrac = JetModifier("JetConstituentFrac", "constitFrac",
211 JetContainer = _jetname,
212 ),
213
214 groomMRatio = JetModifier("JetGroomMRatio", "groomMRatio",
215 JetContainer = _jetname,
216 ),
217
218 JetPtAssociation = JetModifier("JetPtAssociationTool", "jetPtAssociation",
219 filterfn=isMC,
220 createfn=JetMomentToolsConfig.getJetPtAssociationTool,
221 prereqs=["ghost:Truth"],
222 JetContainer = _jetname
223 ),
224
225 numConstit = JetModifier("JetNumConstitTool", "numConstit",
226 JetContainer = _jetname,
227 ),
228
229 # *******************
230 # Isolation variables
231 jetiso = JetModifier("JetIsolationTool","iso",
232 JetContainer=_jetname,
233 InputConstitContainer = _constitContainername,
234 IsolationCalculations = ["IsoFixedCone:5:Pt", "IsoFixedCone:5:PtPUsub",],
235 RhoKey = lambda jetdef, specs : "Kt4"+jetdef.inputdef.label+"EventShape" ,
236 prereqs= ["input:EventDensity"], #lambda spec,jetdef : ["input:Kt4"+jetdef.inputdef.label+"EventShape",],
237 ),
238
239 jetisoTruth = JetModifier("JetIsolationTool","isoTruth",
240 JetContainer=_jetname,
241 InputConstitContainer = _constitContainername,
242 IsolationCalculations = ["IsoFixedCone:5:Pt", ],
243 RhoKey = "",
244 ),
245 )
246
247except ModuleNotFoundError:
248 from AthenaCommon import Logging
249 jetlog = Logging.logging.getLogger('JetStandardMods')
250 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
251 pass
252
253
254# Truth labelling moments
255from ParticleJetTools import ParticleJetToolsConfig
256stdJetModifiers.update(
257 # Easy cases, no special config or prereqs, just default tool config
258 PartonTruthLabel = JetModifier("Analysis::JetPartonTruthLabel","partontruthlabel",
259 prereqs=["ghost:Partons"]
260 ),
261
262 # More complex cases here
263 JetDeltaRLabel = JetModifier("ParticleJetDeltaRLabelTool","jetdrlabeler_jetptmin",
264 createfn=ParticleJetToolsConfig.getJetDeltaRLabelTool,
265 prereqs=["ghost:BHadronsFinal",
266 "ghost:CHadronsFinal",
267 "ghost:TausFinal"]
268 ),
269
270
271 JetGhostLabel = JetModifier("ParticleJetGhostLabelTool","jetghostlabeler",
272 createfn=ParticleJetToolsConfig.getJetGhostLabelTool,
273 prereqs=["ghost:BHadronsFinal",
274 "ghost:CHadronsFinal",
275 "ghost:TausFinal"]
276 ),
277
278
279 JetDeltaRInitialLabel = JetModifier("ParticleJetDeltaRLabelTool","jetdrlabelerinitial_jetptmin",
280 createfn=ParticleJetToolsConfig.getJetDeltaRInitialLabelTool,
281 prereqs=["ghost:BHadronsInitial",
282 "ghost:CHadronsInitial",
283 "ghost:TausFinal"]
284 ),
285
286
287 JetGhostInitialLabel = JetModifier("ParticleJetGhostLabelTool","jetghostinitiallabeler",
288 createfn=ParticleJetToolsConfig.getJetGhostInitialLabelTool,
289 prereqs=["ghost:BHadronsInitial",
290 "ghost:CHadronsInitial",
291 "ghost:TausFinal"]
292 ),
293
294 JetQuarkChargeLabel = JetModifier("JetQuarkChargeLabelingTool","jetquarkchargetool",
295 createfn=ParticleJetToolsConfig.getJetQuarkChargeTool,
296 prereqs=["mod:JetGhostInitialLabel","mod:JetGhostLabel","mod:PartonTruthLabel"]
297 ),
298
299
300 JetTaggingTruthLabel = JetModifier("JetTaggingTruthLabel", "truthlabeler_{mods}",
301 filterfn=isMC,
302 createfn=ParticleJetToolsConfig.getJetTruthLabelTool,
303 prereqs=lambda modspec,jetdef: ParticleJetToolsConfig.getJetTruthLabelToolPrereqs(jetdef, modspec)
304 ),
305
306 JetPileupLabel = JetModifier("JetPileupLabel", "pileuplabeler_{mods}",
307 filterfn=isMC,
308 createfn=ParticleJetToolsConfig.getJetPileupLabelTool,
309 prereqs=["input:AntiKt4TruthDressedWZJets"]
310 )
311 )
312
313
314
315# Substructure tools
316stdJetModifiers.update(
317 nsubjettiness = JetModifier( "NSubjettinessTool", "nsubjettiness", Alpha = 1.0,
318 JetContainer = _jetname),
319 nsubjettinessR = JetModifier( "NSubjettinessRatiosTool", "nsubjettinessR",),
320
321
322 ktdr = JetModifier("KtDeltaRTool", "ktdr", JetRadius = 0.4),
323
324 ktsplitter = JetModifier( "KTSplittingScaleTool", "ktsplitter", JetContainer = _jetname),
325
326 angularity = JetModifier( "AngularityTool", "angularity"),
327
328 dipolarity = JetModifier( "DipolarityTool", "dipolarity",SubJetRadius = 0.3),
329
330 planarflow = JetModifier( "PlanarFlowTool", "planarflow"),
331
332 ktmassdrop = JetModifier( "KtMassDropTool", "ktmassdrop"),
333
334 ecorr = JetModifier( "EnergyCorrelatorTool", "ecorr", Beta = 1.0, JetContainer = _jetname),
335 ecorrR = JetModifier( "EnergyCorrelatorRatiosTool", "ecorrR", ),
336
337 ecorrgeneral = JetModifier( "EnergyCorrelatorGeneralizedTool", "ecorrgeneral", DoLSeries = True, JetContainer = _jetname),
338 ecorrgeneralratios = JetModifier( "EnergyCorrelatorGeneralizedRatiosTool", "ecorrgeneralratios", DoLSeries = True),
339
340 comshapes = JetModifier( "CenterOfMassShapesTool", "comshapes", JetContainer = _jetname),
341
342 pull = JetModifier("JetPullTool", "pull", UseEtaInsteadOfY = False, IncludeTensorMoments = True ),
343
344 charge = JetModifier( "JetChargeTool", "charge", K=1.0),
345
346 qw = JetModifier( "QwTool", "qw", JetContainer = _jetname),
347
348 softdropobs = JetModifier("SoftDropObservablesTool", "softdropobs"),
349)
350
351# Substructure tagger tools: q/g
352try :
353 from JetMomentTools import JetMomentToolsConfig
354 stdJetModifiers.update(
355 qgtransformer = JetModifier("BoostedJetTaggerTool", "qgtransformer",
356 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolQG,
357 JetContainer = _jetname,
358 SuppressInputDependence = True),
359 )
360except ModuleNotFoundError:
361 from AthenaCommon import Logging
362 jetlog = Logging.logging.getLogger('JetStandardMods')
363 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
364 pass
365
366# Substructure tagger tools: top
367try :
368 from JetMomentTools import JetMomentToolsConfig
369 stdJetModifiers.update(
370 toptransformer = JetModifier("BoostedJetTaggerTool", "toptransformer",
371 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolTop,
372 JetContainer = _jetname,
373 SuppressInputDependence = True),
374 )
375except ModuleNotFoundError:
376 from AthenaCommon import Logging
377 jetlog = Logging.logging.getLogger('JetStandardMods')
378 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
379 pass
380
381# Substructure tagger tools: w
382try :
383 from JetMomentTools import JetMomentToolsConfig
384 stdJetModifiers.update(
385 wtransformer = JetModifier("BoostedJetTaggerTool", "wtransformer",
386 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolW,
387 JetContainer = _jetname,
388 SuppressInputDependence = True),
389 )
390except ModuleNotFoundError:
391 from AthenaCommon import Logging
392 jetlog = Logging.logging.getLogger('JetStandardMods')
393 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
394 pass
395
396# Substructure tagger tools: w mass dec
397try :
398 from JetMomentTools import JetMomentToolsConfig
399 stdJetModifiers.update(
400 wtransformer_massdec = JetModifier("BoostedJetTaggerTool", "wtransformer_massdec",
401 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolWMassDec,
402 JetContainer = _jetname,
403 SuppressInputDependence = True),
404 )
405except ModuleNotFoundError:
406 from AthenaCommon import Logging
407 jetlog = Logging.logging.getLogger('JetStandardMods')
408 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
409 pass
410
411# VR track-jet decorations
412stdJetModifiers.update(
413 vr = JetModifier( "FlavorTagDiscriminants::VRJetOverlapDecoratorTool", "vr")
414)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
getJetCalibToolPrereqs(jetdef, modspec)
getJetCalibToolPrereqs(modspec, jetdef)
getJetTruthLabelToolPrereqs(jetdef, modspec)
_jetname(jetdef, modspec)
_constitContainername(jetdef, modspec)