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