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