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