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
320
321
322# Substructure tools
323stdJetModifiers.update(
324 nsubjettiness = JetModifier( "NSubjettinessTool", "nsubjettiness", Alpha = 1.0,
325 JetContainer = _jetname),
326 nsubjettinessR = JetModifier( "NSubjettinessRatiosTool", "nsubjettinessR",),
327
328
329 ktdr = JetModifier("KtDeltaRTool", "ktdr", JetRadius = 0.4),
330
331 ktsplitter = JetModifier( "KTSplittingScaleTool", "ktsplitter", JetContainer = _jetname),
332
333 angularity = JetModifier( "AngularityTool", "angularity"),
334
335 dipolarity = JetModifier( "DipolarityTool", "dipolarity",SubJetRadius = 0.3),
336
337 planarflow = JetModifier( "PlanarFlowTool", "planarflow"),
338
339 ktmassdrop = JetModifier( "KtMassDropTool", "ktmassdrop"),
340
341 ecorr = JetModifier( "EnergyCorrelatorTool", "ecorr", Beta = 1.0, JetContainer = _jetname),
342 ecorrR = JetModifier( "EnergyCorrelatorRatiosTool", "ecorrR", ),
343
344 ecorrgeneral = JetModifier( "EnergyCorrelatorGeneralizedTool", "ecorrgeneral", DoLSeries = True, JetContainer = _jetname),
345 ecorrgeneralratios = JetModifier( "EnergyCorrelatorGeneralizedRatiosTool", "ecorrgeneralratios", DoLSeries = True),
346
347 comshapes = JetModifier( "CenterOfMassShapesTool", "comshapes", JetContainer = _jetname),
348
349 pull = JetModifier("JetPullTool", "pull", UseEtaInsteadOfY = False, IncludeTensorMoments = True ),
350
351 charge = JetModifier( "JetChargeTool", "charge", K=1.0),
352
353 qw = JetModifier( "QwTool", "qw", JetContainer = _jetname),
354
355 softdropobs = JetModifier("SoftDropObservablesTool", "softdropobs"),
356)
357
358# Substructure tagger tools: q/g
359try :
360 from JetMomentTools import JetMomentToolsConfig
361 stdJetModifiers.update(
362 qgtransformer = JetModifier("BoostedJetTaggerTool", "qgtransformer",
363 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolQG,
364 JetContainer = _jetname,
365 SuppressInputDependence = True),
366 )
367except ModuleNotFoundError:
368 from AthenaCommon import Logging
369 jetlog = Logging.logging.getLogger('JetStandardMods')
370 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
371 pass
372
373# Substructure tagger tools: top
374try :
375 from JetMomentTools import JetMomentToolsConfig
376 stdJetModifiers.update(
377 toptransformer = JetModifier("BoostedJetTaggerTool", "toptransformer",
378 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolTop,
379 JetContainer = _jetname,
380 SuppressInputDependence = True),
381 )
382except ModuleNotFoundError:
383 from AthenaCommon import Logging
384 jetlog = Logging.logging.getLogger('JetStandardMods')
385 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
386 pass
387
388# Substructure tagger tools: w
389try :
390 from JetMomentTools import JetMomentToolsConfig
391 stdJetModifiers.update(
392 wtransformer = JetModifier("BoostedJetTaggerTool", "wtransformer",
393 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolW,
394 JetContainer = _jetname,
395 SuppressInputDependence = True),
396 )
397except ModuleNotFoundError:
398 from AthenaCommon import Logging
399 jetlog = Logging.logging.getLogger('JetStandardMods')
400 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
401 pass
402
403# Substructure tagger tools: w mass dec
404try :
405 from JetMomentTools import JetMomentToolsConfig
406 stdJetModifiers.update(
407 wtransformer_massdec = JetModifier("BoostedJetTaggerTool", "wtransformer_massdec",
408 createfn=JetMomentToolsConfig.getBoostedJetTaggerToolWMassDec,
409 JetContainer = _jetname,
410 SuppressInputDependence = True),
411 )
412except ModuleNotFoundError:
413 from AthenaCommon import Logging
414 jetlog = Logging.logging.getLogger('JetStandardMods')
415 jetlog.info("No JetMomentTools pakage found (expected in AthGeneration or analysis releases). Some jet calculations will be disabled.")
416 pass
417
418# VR track-jet decorations
419stdJetModifiers.update(
420 vr = JetModifier( "FlavorTagDiscriminants::VRJetOverlapDecoratorTool", "vr")
421)
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)