ATLAS Offline Software
StandardJetMods.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2023 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 AthenaConfiguration.ComponentFactory import CompFactory
27 from JetRecConfig.JetConfigFlags import jetInternalFlags
28 from .StandardJetConstits import inputsFromContext
29 
30 stdJetModifiers = ldict()
31 
32 
34 stdJetModifiers.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 if jetInternalFlags.isRecoJob else int(modspec),
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
57 try:
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  )
64 except ModuleNotFoundError:
65  # In some releases (AthGeneration) JetCalibTools is not existing
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, "Input file is not MC"
85 
86 
87 # Standard jet moments
88 try:
89  from JetMomentTools import JetMomentToolsConfig
90  stdJetModifiers.update(
91 
92  # Easy cases, no special config or prereqs, just default tool config
93  ClusterMoments = JetModifier("JetClusterMomentsTool", "clsmoms", JetContainer = _jetname),
94  ECPSFrac = JetModifier("JetECPSFractionTool", "ecpsfrac", JetContainer = _jetname),
95  Width = JetModifier("JetWidthTool", "width", JetContainer = _jetname),
96 
97  # More complex cases here
98  CaloEnergies = JetModifier("JetCaloEnergies", "jetens",
99  prereqs=["mod:EMScaleMom"],
100  Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
101  ),
102 
103  CaloEnergiesLargeR = JetModifier("JetCaloEnergies", "jetenslargeR",
104  prereqs=["mod:EMScaleMom"],
105  Calculations=["EMFrac", "HECFrac", "PSFrac", "EM3Frac", "Tile0Frac", "EffNClusts"], JetContainer = _jetname,
106  calcClusterBasedVars = True,
107  ),
108 
109  # CaloEnergiesClus is only relevant for FE-based jet collections
110  CaloEnergiesClus = JetModifier("JetCaloEnergies", "jetensclus",
111  prereqs=["mod:EMScaleMom"],
112  Calculations=["EMFrac", "HECFrac", "PSFrac", "FracSamplingMax"], JetContainer = _jetname,
113  calcClusterBasedVars = True),
114 
115  CaloQuality = JetModifier("JetCaloQualityTool", "caloqual",
116  TimingCuts = [5,10],
117  Calculations = ["LArQuality", "N90Constituents", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
118 
119  CaloQualityFE = JetModifier("JetCaloQualityToolFE", "caloqualFE",
120  TimingCuts = [5,10],
121  ThresholdCuts = [90],
122  Calculations = ["LArQuality", "NegativeE", "Timing", "HECQuality", "Centroid", "AverageLArQF", "BchCorrCell"],JetContainer = _jetname),
123 
124  N90 = JetModifier("JetCaloQualityTool", "n90",
125  Calculations = ["N90Constituents"],JetContainer = _jetname),
126 
127  ConstitFourMom = JetModifier("JetConstitFourMomTool", "constitfourmom_basename",
128  createfn=JetMomentToolsConfig.getConstitFourMomTool,),
129  EMScaleMom = JetModifier("JetEMScaleMomTool", "emscalemom_basename",
130  createfn=JetMomentToolsConfig.getEMScaleMomTool,
131  JetContainer = _jetname),
132 
133  JVF = JetModifier("JetVertexFractionTool", "jvf",
134  createfn=JetMomentToolsConfig.getJVFTool,
135  prereqs = [inputsFromContext("TVA"), "mod:TrackMoments", inputsFromContext("Vertices")],
136  JetContainer = _jetname),
137  JVT = JetModifier("JetVertexTaggerTool", "jvt",
138  createfn=JetMomentToolsConfig.getJVTTool,
139  prereqs = [ "mod:JVF" ],JetContainer = _jetname),
140  NNJVT = JetModifier("JetVertexNNTagger", "nnjvt",
141  createfn=JetMomentToolsConfig.getNNJvtTool,
142  prereqs = [ "mod:JVF" ],JetContainer = _jetname),
143  LArHVCorr = JetModifier("JetLArHVTool", "larhvcorr",
144  prereqs = ["mod:EMScaleMom"],JetContainer = _jetname),
145  OriginSetPV = JetModifier("JetOriginCorrectionTool", "origin_setpv",
146  prereqs = [ "mod:JVF" ],JetContainer = _jetname, OnlyAssignPV=True),
147  TrackMoments = JetModifier("JetTrackMomentsTool", "trkmoms",
148  createfn=JetMomentToolsConfig.getTrackMomentsTool,
149  prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
150 
151  TrackSumMoments = JetModifier("JetTrackSumMomentsTool", "trksummoms",
152  createfn=JetMomentToolsConfig.getTrackSumMomentsTool,
153  prereqs = [ inputsFromContext("TVA"),"ghost:Track" ],JetContainer = _jetname),
154  Charge = JetModifier("JetChargeTool", "jetcharge",
155  prereqs = [ "ghost:Track" ]),
156 
157  QGTagging = JetModifier("JetQGTaggerVariableTool", "qgtagging",
158  createfn=JetMomentToolsConfig.getQGTaggingTool,
159  prereqs = lambda _,jetdef :
160  [inputsFromContext("TVA"),"mod:TrackMoments"] +
161  (["mod:JetPtAssociation"] if not isMC(jetdef._cflags) else []),
162  JetContainer = _jetname),
163 
164  fJVT = JetModifier("JetForwardPFlowJvtTool", "fJVT",
165  createfn=JetMomentToolsConfig.getPFlowfJVTTool,
166  prereqs = [inputsFromContext("TVA"),inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
167  JetContainer = _jetname),
168 
169  bJVT = JetModifier("JetBalancePFlowJvtTool", "bJVT",
170  createfn=JetMomentToolsConfig.getPFlowbJVTTool,
171  prereqs = [inputsFromContext("EventDensity"),inputsFromContext("Vertices"),"mod:NNJVT"],
172  JetContainer = _jetname),
173 
174  ConstitFrac = JetModifier("JetConstituentFrac", "constitFrac",
175  JetContainer = _jetname,
176  ),
177 
178  groomMRatio = JetModifier("JetGroomMRatio", "groomMRatio",
179  JetContainer = _jetname,
180  ),
181 
182  JetPtAssociation = JetModifier("JetPtAssociationTool", "jetPtAssociation",
183  filterfn=isMC,
184  createfn=JetMomentToolsConfig.getJetPtAssociationTool,
185  prereqs=["ghost:Truth"],
186  JetContainer = _jetname
187  ),
188 
189  )
190 except ModuleNotFoundError:
191  # In some releases (AthGeneration) JetMomentTools is not existing
192  pass
193 
194 # Truth labelling moments
195 from ParticleJetTools import ParticleJetToolsConfig
196 stdJetModifiers.update(
197  # Easy cases, no special config or prereqs, just default tool config
198  PartonTruthLabel = JetModifier("Analysis::JetPartonTruthLabel","partontruthlabel",
199  prereqs=["ghost:Partons"]),
200 
201  # More complex cases here
202  TruthPartonDR = JetModifier("Analysis::JetConeLabeling","truthpartondr",
203  filterfn=isMC,
204  JetTruthMatchTool = lambda *l : CompFactory.getComp("Analysis::JetQuarkLabel")("jetquarklabel", McEventCollection='TruthEvents'),
205  ),
206 
207 
208  JetDeltaRLabel = JetModifier("ParticleJetDeltaRLabelTool","jetdrlabeler_jetptmin",
209  createfn=ParticleJetToolsConfig.getJetDeltaRLabelTool,
210  prereqs=["ghost:BHadronsFinal",
211  "ghost:CHadronsFinal",
212  "ghost:TausFinal"]
213  ),
214 
215 
216  JetGhostLabel = JetModifier("ParticleJetGhostLabelTool","jetghostlabeler",
217  createfn=ParticleJetToolsConfig.getJetGhostLabelTool,
218  prereqs=["ghost:BHadronsFinal",
219  "ghost:CHadronsFinal",
220  "ghost:TausFinal"]
221  ),
222 
223 
224  JetTaggingTruthLabel = JetModifier("JetTaggingTruthLabel", "truthlabeler_{mods}",
225  filterfn=isMC,
226  createfn=ParticleJetToolsConfig.getJetTruthLabelTool,
227  ),
228 
229  JetPileupLabel = JetModifier("JetPileupLabel", "pileuplabeler_{mods}",
230  filterfn=isMC,
231  createfn=ParticleJetToolsConfig.getJetPileupLabelTool,
232  prereqs=["input:AntiKt4TruthDressedWZJets"]
233  ),
234 )
235 
236 
237 
238 # Substructure tools
239 stdJetModifiers.update(
240  nsubjettiness = JetModifier( "NSubjettinessTool", "nsubjettiness",Alpha = 1.0),
241  nsubjettinessR = JetModifier( "NSubjettinessRatiosTool", "nsubjettinessR",),
242 
243 
244  ktdr = JetModifier("KtDeltaRTool", "ktdr", JetRadius = 0.4),
245 
246  ktsplitter = JetModifier( "KTSplittingScaleTool", "ktsplitter"),
247 
248  angularity = JetModifier( "AngularityTool", "angularity"),
249 
250  dipolarity = JetModifier( "DipolarityTool", "dipolarity",SubJetRadius = 0.3),
251 
252  planarflow = JetModifier( "PlanarFlowTool", "planarflow"),
253 
254  ktmassdrop = JetModifier( "KtMassDropTool", "ktmassdrop"),
255 
256  ecorr = JetModifier( "EnergyCorrelatorTool", "ecorr", Beta = 1.0),
257  ecorrR = JetModifier( "EnergyCorrelatorRatiosTool", "ecorrR", ),
258 
259  ecorrgeneral = JetModifier( "EnergyCorrelatorGeneralizedTool", "ecorrgeneral", DoLSeries = True),
260  ecorrgeneralratios = JetModifier( "EnergyCorrelatorGeneralizedRatiosTool", "ecorrgeneralratios", DoLSeries = True),
261 
262  comshapes = JetModifier( "CenterOfMassShapesTool","comshapes"),
263 
264  pull = JetModifier("JetPullTool", "pull", UseEtaInsteadOfY = False, IncludeTensorMoments = True ),
265 
266  charge = JetModifier( "JetChargeTool", "charge", K=1.0),
267 
268  qw = JetModifier( "QwTool", "qw"),
269 
270  softdropobs = JetModifier("SoftDropObservablesTool", "softdropobs"),
271 
272 )
273 
274 # VR track-jet decorations
275 stdJetModifiers.update(
276  vr = JetModifier( "FlavorTagDiscriminants::VRJetOverlapDecoratorTool", "vr")
277 )
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
JetCalibToolsConfig.getJetCalibToolPrereqs
def getJetCalibToolPrereqs(modspec, jetdef)
Definition: JetCalibToolsConfig.py:202
python.StandardJetContext.inputsFromContext
def inputsFromContext(inputKey, prefix="", suffix="")
Definition: StandardJetContext.py:106
python.StandardJetMods.isMC
def isMC(flags)
Definition: StandardJetMods.py:80
python.Utilities.ldict
Definition: Utilities.py:139
python.JetDefinition.JetModifier
Definition: JetDefinition.py:248
python.StandardJetMods._jetname
def _jetname(jetdef, modspec)
Definition: StandardJetMods.py:77