ATLAS Offline Software
StandardJetMods.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 """
3 This module defines the standard JetModifier tools used in jet reco
4 
5 Definitions are grouped in a dictionary of tool configurations using the helpers defined
6 in package configs.
7 This dict maps a modifier alias to the JetModifier config object
8 that in turn will be responsible for generating a configured tool.
9 
10 The 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 """
24 from .JetDefinition import JetModifier
25 from .Utilities import ldict
26 from .StandardJetConstits import inputsFromContext
27 
28 stdJetModifiers = ldict()
29 
30 
32 stdJetModifiers.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
55 try:
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  )
62 except 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.
77 def _jetname(jetdef,modspec):
78  return jetdef.fullname()
79 
80 def 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 
87 def _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
95 try:
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  )
215 except 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
222 from ParticleJetTools import ParticleJetToolsConfig
223 stdJetModifiers.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
283 stdJetModifiers.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
319 try :
320  from JetMomentTools import JetMomentToolsConfig
321  stdJetModifiers.update(
322  qgtransformer = JetModifier("BoostedJetTaggerTool", "qgtransformer",
323  createfn=JetMomentToolsConfig.getBoostedJetTaggerToolQG,
324  JetContainer = _jetname,
325  SuppressInputDependence = True),
326  )
327 except 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
334 try :
335  from JetMomentTools import JetMomentToolsConfig
336  stdJetModifiers.update(
337  toptransformer = JetModifier("BoostedJetTaggerTool", "toptransformer",
338  createfn=JetMomentToolsConfig.getBoostedJetTaggerToolTop,
339  JetContainer = _jetname,
340  SuppressInputDependence = True),
341  )
342 except 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
349 try :
350  from JetMomentTools import JetMomentToolsConfig
351  stdJetModifiers.update(
352  wtransformer = JetModifier("BoostedJetTaggerTool", "wtransformer",
353  createfn=JetMomentToolsConfig.getBoostedJetTaggerToolW,
354  JetContainer = _jetname,
355  SuppressInputDependence = True),
356  )
357 except 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
364 try :
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  )
372 except 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
379 stdJetModifiers.update(
380  vr = JetModifier( "FlavorTagDiscriminants::VRJetOverlapDecoratorTool", "vr")
381 )
ParticleJetToolsConfig.getJetTruthLabelToolPrereqs
def getJetTruthLabelToolPrereqs(jetdef, modspec)
Definition: ParticleJetToolsConfig.py:269
JetCalibToolsConfig.getJetCalibToolPrereqs
def getJetCalibToolPrereqs(modspec, jetdef)
Definition: JetCalibToolsConfig.py:205
python.StandardJetContext.inputsFromContext
def inputsFromContext(inputKey, prefix="", suffix="")
Definition: StandardJetContext.py:112
python.StandardJetMods.isMC
def isMC(flags)
Definition: StandardJetMods.py:80
python.StandardJetMods._constitContainername
def _constitContainername(jetdef, modspec)
Definition: StandardJetMods.py:87
python.Utilities.ldict
Definition: Utilities.py:139
python.JetDefinition.JetModifier
Definition: JetDefinition.py:248
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.StandardJetMods._jetname
def _jetname(jetdef, modspec)
Definition: StandardJetMods.py:77
Trk::split
@ split
Definition: LayerMaterialProperties.h:38