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 createfn=JetResponseToolConfig.getJetResponseTool,
87 ),
88 )
89
90except ModuleNotFoundError:
91 from AthenaCommon import Logging
92 jetlog = Logging.logging.getLogger('JetStandardMods')
93 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
94 pass
95
96try:
97 from JetCalibTools import JetCalibToolsCfg
98 stdJetModifiers.update(
99 CalibNew = JetModifier("JetCalibTool","jetcalib_jetcoll_calibseq",
100 createfn=JetCalibToolsCfg.defineJetCalibTool,
101 prereqs=lambda mod,jetdef : JetCalibToolsCfg.getJetCalibToolPrereqs(jetdef,mod)+[inputsFromContext("Vertices")])
102 )
103except ModuleNotFoundError:
104 from AthenaCommon import Logging
105 jetlog = Logging.logging.getLogger('JetStandardMods')
106 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
107 pass
108
109# TBD:
110# All items below in principle will support decoration mode, rather
111# than only non-const modification. Mode of operation should be
112# determined by interface called from parent tool/alg.
113
114
115# Many JetMoment tools need to know the name of the container they operate on.
116# We set the function below as the 'JetContainer' property so the config system
117# can assign the right name to the c++ tool.
118def _jetname(jetdef,modspec):
119 return jetdef.fullname()
120
121
122# Standard jet moments
123try:
124 from JetMomentTools import JetMomentToolsConfig
125 stdJetModifiers.update(
126
127 # Easy cases, no special config or prereqs, just default tool config
128 ClusterMoments = JetModifier("JetClusterMomentsTool", "clsmoms", JetContainer = _jetname),
129 ECPSFrac = JetModifier("JetECPSFractionTool", "ecpsfrac", JetContainer = _jetname),
130 Width = JetModifier("JetWidthTool", "width", JetContainer = _jetname),
131
132 # More complex cases here
133 CaloEnergies = JetModifier("JetCaloEnergies", "jetens",
134 prereqs=["mod:EMScaleMom"],
135 Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
136 ),
137
138 CaloEnergiesLargeR = JetModifier("JetCaloEnergies", "jetenslargeR",
139 prereqs=["mod:EMScaleMom"],
140 Calculations=["EMFrac", "HECFrac", "PSFrac", "EM3Frac", "Tile0Frac", "EffNClusts"], JetContainer = _jetname,
141 calcClusterBasedVars = True,
142 ),
143
144 # CaloEnergiesClus is only relevant for FE-based jet collections
145 CaloEnergiesClus = JetModifier("JetCaloEnergies", "jetensclus",
146 prereqs=["mod:EMScaleMom"],
147 Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
148 calcClusterBasedVars = True),
149
150 CaloQuality = JetModifier("JetCaloQualityTool", "caloqual",
151 TimingCuts = [5,10],
152 Calculations = ["LArQuality", "N90Constituents", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
153
154 CaloQualityFE = JetModifier("JetCaloQualityToolFE", "caloqualFE",
155 TimingCuts = [5,10],
156 ThresholdCuts = [90],
157 Calculations = ["LArQuality", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
158
159 N90 = JetModifier("JetCaloQualityTool", "n90",
160 Calculations = ["N90Constituents"],JetContainer = _jetname),
161
162 ConstitFourMom = JetModifier("JetConstitFourMomTool", "constitfourmom_basename",
163 createfn=JetMomentToolsConfig.getConstitFourMomTool,),
164 EMScaleMom = JetModifier("JetEMScaleMomTool", "emscalemom_basename",
165 createfn=JetMomentToolsConfig.getEMScaleMomTool,
166 JetContainer = _jetname),
167
168 JVF = JetModifier("JetVertexFractionTool", "jvf",
169 createfn=JetMomentToolsConfig.getJVFTool,
170 prereqs = [inputsFromContext("TVA"), "mod:TrackMoments", inputsFromContext("Vertices")],
171 JetContainer = _jetname),
172 JVT = JetModifier("JetVertexTaggerTool", "jvt",
173 createfn=JetMomentToolsConfig.getJVTTool,
174 prereqs = [ "mod:JVF" ],JetContainer = _jetname),
175 NNJVT = JetModifier("JetVertexNNTagger", "nnjvt",
176 createfn=JetMomentToolsConfig.getNNJvtTool,
177 prereqs = [ "mod:JVF" ],JetContainer = _jetname),
178 LArHVCorr = JetModifier("JetLArHVTool", "larhvcorr",
179 prereqs = ["mod:EMScaleMom"],JetContainer = _jetname),
180 OriginSetPV = JetModifier("JetOriginCorrectionTool", "origin_setpv",
181 prereqs = [ "mod:JVF" ],JetContainer = _jetname, OnlyAssignPV=True),
182 TrackMoments = JetModifier("JetTrackMomentsTool", "trkmoms",
183 createfn=JetMomentToolsConfig.getTrackMomentsTool,
184 prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
185
186 TrackSumMoments = JetModifier("JetTrackSumMomentsTool", "trksummoms",
187 createfn=JetMomentToolsConfig.getTrackSumMomentsTool,
188 prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
189 Charge = JetModifier("JetChargeTool", "jetcharge",
190 prereqs = [ "ghost:Track" ]),
191
192 QGTagging = JetModifier("JetQGTaggerVariableTool", "qgtagging",
193 createfn=JetMomentToolsConfig.getQGTaggingTool,
194 prereqs = lambda _,jetdef :
195 [inputsFromContext("TVA"),"mod:TrackMoments"] +
196 (["mod:JetPtAssociation"] if not isMC(jetdef._cflags) else []),
197 JetContainer = _jetname),
198
199 fJVT = JetModifier("JetForwardPFlowJvtTool", "fJVT",
200 createfn=JetMomentToolsConfig.getPFlowfJVTTool,
201 prereqs = [inputsFromContext("TVA"),inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
202 JetContainer = _jetname),
203
204 bJVT = JetModifier("JetBalancePFlowJvtTool", "bJVT",
205 createfn=JetMomentToolsConfig.getPFlowbJVTTool,
206 prereqs = [inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
207 JetContainer = _jetname),
208
209 ConstitFrac = JetModifier("JetConstituentFrac", "constitFrac",
210 JetContainer = _jetname,
211 ),
212
213 groomMRatio = JetModifier("JetGroomMRatio", "groomMRatio",
214 JetContainer = _jetname,
215 ),
216
217 JetPtAssociation = JetModifier("JetPtAssociationTool", "jetPtAssociation",
218 filterfn=isMC,
219 createfn=JetMomentToolsConfig.getJetPtAssociationTool,
220 prereqs=["ghost:Truth","input:AntiKt4TruthJets"],
221 JetContainer = _jetname
222 ),
223
224 numConstit = JetModifier("JetNumConstitTool", "numConstit",
225 JetContainer = _jetname,
226 ),
227
228 # *******************
229 # Isolation variables
230 jetiso = JetModifier("JetIsolationTool","iso",
231 JetContainer=_jetname,
232 InputConstitContainer = _constitContainername,
233 IsolationCalculations = ["IsoFixedCone:5:Pt", "IsoFixedCone:5:PtPUsub",],
234 RhoKey = lambda jetdef, specs : "Kt4"+jetdef.inputdef.label+"EventShape" ,
235 prereqs= ["input:EventDensity"], #lambda spec,jetdef : ["input:Kt4"+jetdef.inputdef.label+"EventShape",],
236 ),
237
238 jetisoTruth = JetModifier("JetIsolationTool","isoTruth",
239 JetContainer=_jetname,
240 InputConstitContainer = _constitContainername,
241 IsolationCalculations = ["IsoFixedCone:5:Pt", ],
242 RhoKey = "",
243 ),
244
245 jetisoHLT = JetModifier("JetIsolationTool","isoHLT",
246 JetContainer=_jetname,
247 InputConstitContainer = _constitContainername,
248 IsolationCalculations = ["IsoFixedCone:5:Pt", "IsoFixedCone:5:PtPUsub",],
249 RhoKey = lambda jetdef, specs : "HLT_Kt4"+jetdef.inputdef.label+"EventShape" ,
250 prereqs= ["input:HLT_EventDensity"],
251 ),
252 )
253
254except ModuleNotFoundError:
255 from AthenaCommon import Logging
256 jetlog = Logging.logging.getLogger('JetStandardMods')
257 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
258 pass
259
260
261# Truth labelling moments
262from ParticleJetTools import ParticleJetToolsConfig
263stdJetModifiers.update(
264 # Easy cases, no special config or prereqs, just default tool config
265 PartonTruthLabel = JetModifier("Analysis::JetPartonTruthLabel","partontruthlabel",
266 prereqs=["ghost:Partons"]
267 ),
268
269 # More complex cases here
270 JetDeltaRLabel = JetModifier("ParticleJetDeltaRLabelTool","jetdrlabeler_jetptmin",
271 createfn=ParticleJetToolsConfig.getJetDeltaRLabelTool,
272 prereqs=["ghost:BHadronsFinal",
273 "ghost:CHadronsFinal",
274 "ghost:TausFinal"]
275 ),
276
277
278 JetGhostLabel = JetModifier("ParticleJetGhostLabelTool","jetghostlabeler",
279 createfn=ParticleJetToolsConfig.getJetGhostLabelTool,
280 prereqs=["ghost:BHadronsFinal",
281 "ghost:CHadronsFinal",
282 "ghost:TausFinal"]
283 ),
284
285
286 JetDeltaRInitialLabel = JetModifier("ParticleJetDeltaRLabelTool","jetdrlabelerinitial_jetptmin",
287 createfn=ParticleJetToolsConfig.getJetDeltaRInitialLabelTool,
288 prereqs=["ghost:BHadronsInitial",
289 "ghost:CHadronsInitial",
290 "ghost:TausFinal"]
291 ),
292
293
294 JetGhostInitialLabel = JetModifier("ParticleJetGhostLabelTool","jetghostinitiallabeler",
295 createfn=ParticleJetToolsConfig.getJetGhostInitialLabelTool,
296 prereqs=["ghost:BHadronsInitial",
297 "ghost:CHadronsInitial",
298 "ghost:TausFinal"]
299 ),
300
301 JetQuarkChargeLabel = JetModifier("JetQuarkChargeLabelingTool","jetquarkchargetool",
302 createfn=ParticleJetToolsConfig.getJetQuarkChargeTool,
303 prereqs=["mod:JetGhostInitialLabel","mod:JetGhostLabel","mod:PartonTruthLabel"]
304 ),
305
306
307 JetTaggingTruthLabel = JetModifier("JetTaggingTruthLabel", "truthlabeler_{mods}",
308 filterfn=isMC,
309 createfn=ParticleJetToolsConfig.getJetTruthLabelTool,
310 prereqs=lambda modspec,jetdef: ParticleJetToolsConfig.getJetTruthLabelToolPrereqs(jetdef, modspec)
311 ),
312
313 JetPileupLabel = JetModifier("JetPileupLabel", "pileuplabeler_{mods}",
314 filterfn=isMC,
315 createfn=ParticleJetToolsConfig.getJetPileupLabelTool,
316 prereqs=["input:AntiKt4TruthDressedWZJets"]
317 ),
318
319 JetIRCSafeLabel = JetModifier("JetIRCSafeLabelTool", "jetircsafelabeler",
320 filterfn=isMC,
321 createfn=ParticleJetToolsConfig.getJetIRCSafeLabelTool,
322 prereqs=["ghost:BHadronsFinal",
323 "ghost:CHadronsFinal",
324 "input:JetInputTruthParticles"]
325 )
326 )
327
328
329
330# Substructure tools
331stdJetModifiers.update(
332 nsubjettiness = JetModifier( "NSubjettinessTool", "nsubjettiness", Alpha = 1.0,
333 JetContainer = _jetname),
334 nsubjettinessR = JetModifier( "NSubjettinessRatiosTool", "nsubjettinessR",),
335
336
337 ktdr = JetModifier("KtDeltaRTool", "ktdr", JetRadius = 0.4),
338
339 ktsplitter = JetModifier( "KTSplittingScaleTool", "ktsplitter", JetContainer = _jetname),
340
341 angularity = JetModifier( "AngularityTool", "angularity"),
342
343 dipolarity = JetModifier( "DipolarityTool", "dipolarity",SubJetRadius = 0.3),
344
345 planarflow = JetModifier( "PlanarFlowTool", "planarflow"),
346
347 ktmassdrop = JetModifier( "KtMassDropTool", "ktmassdrop"),
348
349 ecorr = JetModifier( "EnergyCorrelatorTool", "ecorr", Beta = 1.0, JetContainer = _jetname),
350 ecorrR = JetModifier( "EnergyCorrelatorRatiosTool", "ecorrR", ),
351
352 ecorrgeneral = JetModifier( "EnergyCorrelatorGeneralizedTool", "ecorrgeneral", DoLSeries = True, JetContainer = _jetname),
353 ecorrgeneralratios = JetModifier( "EnergyCorrelatorGeneralizedRatiosTool", "ecorrgeneralratios", DoLSeries = True),
354
355 comshapes = JetModifier( "CenterOfMassShapesTool", "comshapes", JetContainer = _jetname),
356
357 pull = JetModifier("JetPullTool", "pull", UseEtaInsteadOfY = False, IncludeTensorMoments = True ),
358
359 charge = JetModifier( "JetChargeTool", "charge", K=1.0),
360
361 qw = JetModifier( "QwTool", "qw", JetContainer = _jetname),
362
363 softdropobs = JetModifier("SoftDropObservablesTool", "softdropobs"),
364)
365
366# Substructure tagger tools: q/g
367try :
368 from JetMomentTools import JetMomentToolsConfig
369 stdJetModifiers.update(
370 qgtransformer = JetModifier("BoostedJetTaggerTool", "qgtransformer",
371 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolQG,
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: top
382try :
383 from JetMomentTools import JetMomentToolsConfig
384 stdJetModifiers.update(
385 toptransformer = JetModifier("BoostedJetTaggerTool", "toptransformer",
386 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolTop,
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
397try :
398 from JetMomentTools import JetMomentToolsConfig
399 stdJetModifiers.update(
400 wtransformer = JetModifier("BoostedJetTaggerTool", "wtransformer",
401 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolW,
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# Substructure tagger tools: w mass dec
412try :
413 from JetMomentTools import JetMomentToolsConfig
414 stdJetModifiers.update(
415 wtransformer_massdec = JetModifier("BoostedJetTaggerTool", "wtransformer_massdec",
416 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolWMassDec,
417 JetContainer = _jetname,
418 SuppressInputDependence = True),
419 )
420except ModuleNotFoundError:
421 from AthenaCommon import Logging
422 jetlog = Logging.logging.getLogger('JetStandardMods')
423 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
424 pass
425
426# VR track-jet decorations
427stdJetModifiers.update(
428 vr = JetModifier( "FlavorTagDiscriminants::VRJetOverlapDecoratorTool", "vr")
429)
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)
_constitContainername(jetdef, modspec)
_jetname(jetdef, modspec)