ATLAS Offline Software
HIJetRecConfigCA.py
Go to the documentation of this file.
1 #
2 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 #
4 
5 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6 from AthenaConfiguration.ComponentFactory import CompFactory
7 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
8 from JetRecConfig.JetDefinition import JetInputConstitSeq, JetInputConstit, xAODType, JetDefinition
9 from JetRecConfig.JetDefinition import JetModifier, JetInputExternal
10 #from JetRecConfig.JetRecConfig import getJetModifierTools
11 from JetRecConfig.JetRecConfig import getPseudoJetAlgs
12 from JetRecConfig.StandardJetMods import stdJetModifiers
13 from JetRecConfig import JetRecConfig
14 from JetRecConfig.DependencyHelper import solveDependencies
15 from HIGlobal.HIGlobalConfig import HIEventShapeMakerCfg, HIEventShapeMapToolCfg
16 from AthenaCommon.Logging import logging
17 __log = logging.getLogger('HIJetRecConfigCA')
18 
19 
20 def HIClusterMakerCfg(flags, save=False, **kwargs):
21  """Function to equip HI cluster builder from towers and cells, adds to output AOD stream."""
22 
23  acc = ComponentAccumulator()
24 
25  kwargs.setdefault("CaloCellContainerKey", "AllCalo")
26  kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.Internal.ClusterKey)
27 
28  # get towers
29  from CaloRec.CaloRecoConfig import CaloRecoCfg
30  acc.merge(CaloRecoCfg(flags))
31  from CaloRec.CaloTowerMakerConfig import CaloTowerMakerCfg
32  towerMaker = acc.getPrimaryAndMerge(CaloTowerMakerCfg(flags))
33  tower_key = towerMaker.TowerContainerName
34 
35  HIClusterMaker = CompFactory.HIClusterMaker("HIClusterMaker",
36  InputTowerKey=tower_key,
37  **kwargs)
38 
39  if save:
40  output = ["xAOD::CaloClusterContainer#"+kwargs["OutputContainerKey"],
41  "xAOD::CaloClusterAuxContainer#"+kwargs["OutputContainerKey"]+"Aux."]
42  acc.merge(addToESD(flags, output))
43  acc.merge(addToAOD(flags, output))
44 
45  acc.addEventAlgo(HIClusterMaker, primary=True)
46  return acc
47 
48 def HIClusterCopierCfg(flags, save=False, **kwargs):
49  """Function to copy HI clusters to modify them in derivations."""
50 
51  acc = ComponentAccumulator()
52 
53  kwargs.setdefault("InputContainerKey", "HIClusters")
54  kwargs.setdefault("OutputContainerKey", flags.HeavyIon.Jet.Internal.ClusterKey)
55 
56  HIClusterCopier = CompFactory.HIClusterCopier("HIClusterCopier",
57  **kwargs)
58 
59  acc.addEventAlgo(HIClusterCopier, primary=True)
60  return acc
61 
62 def HICaloJetInputConstitSeq(flags, name="HICaloConstit", **kwargs):
63  kwargs.setdefault("objtype", xAODType.CaloCluster)
64  kwargs.setdefault("modifiers", [])
65  kwargs.setdefault("inputname", flags.HeavyIon.Jet.Internal.ClusterKey)
66  kwargs.setdefault("outputname", flags.HeavyIon.Jet.Internal.ClusterKey)
67  kwargs.setdefault("label", "HI")
68 
69  jetConstit = JetInputConstitSeq(name, **kwargs)
70 
71  from JetRecConfig.StandardJetConstits import stdConstitDic
72  stdConstitDic.setdefault(name, jetConstit)
73 
74  return jetConstit
75 
76 
77 def HICaloJetDef(flags, jetradius, **kwargs):
78  """Returns jet definition for calo jets, with already resolved dependencies."""
79 
80  ptmin_dict = {2:7000, 3:7000, 4:7000, 6:7000, 10:50000}
81  if jetradius not in ptmin_dict and "ptmin" not in kwargs:
82  __log.warning("jetradius "+str(jetradius)+" is not in the dictionary for ptmin; setting ptmin to 7000")
83  kwargs.setdefault("ptmin", ptmin_dict.get(jetradius, 7000))
84  kwargs.setdefault("radius", float(jetradius)/10.)
85  kwargs.setdefault("inputdef", HICaloJetInputConstitSeq(flags))
86  kwargs.setdefault("algorithm", "AntiKt")
87  kwargs.setdefault("prefix", "")
88  kwargs.setdefault("suffix", "")
89 
90  return solveDependencies(JetDefinition(**kwargs), flags)
91 
92 
93 def HITrackJetInputConstit(flags, name="HITrack", **kwargs):
94  kwargs.setdefault("objtype", xAODType.TrackParticle)
95  kwargs.setdefault("containername", "JetSelectedTracks")
96 
97  jetConstit = JetInputConstit(name, **kwargs)
98  return jetConstit
99 
100 
101 def HITrackJetDef(flags, jetradius, **kwargs):
102  """Returns jet definition for track jets, with already resolved dependencies."""
103 
104  import JetRecTools.JetRecToolsConfig as jrtcfg
105  JetInputExternal("JetSelectedTracks",
106  xAODType.TrackParticle,
107  # in std context, this is InDetTrackParticles (see StandardJetContext)
108  prereqs=["InDetTrackParticles"],
109  algoBuilder=lambda jdef, _: jrtcfg.getTrackSelAlg(jdef, trackSelOpt=False))
110  kwargs.setdefault("ptmin", 5000)
111  kwargs.setdefault("inputdef", HITrackJetInputConstit(flags))
112 
113  return HICaloJetDef(flags, jetradius=jetradius, **kwargs)
114 
115 
116 def HIPseudoJetAlgCfg(flags, **kwargs):
117  """Creates a pseudo jet algorithm"""
118  acc = ComponentAccumulator()
119 
120  kwargs.setdefault("name", "pjcs"+flags.HeavyIon.Jet.Internal.ClusterKey)
121  kwargs.setdefault("InputContainer", flags.HeavyIon.Jet.Internal.ClusterKey)
122  kwargs.setdefault("OutputContainer", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey)
123  kwargs.setdefault("Label", "LCTopo")
124  kwargs.setdefault("SkipNegativeEnergy", False)
125  kwargs.setdefault("TreatNegativeEnergyAsGhost", True)
126 
127  acc.addEventAlgo(CompFactory.PseudoJetAlgorithm(**kwargs))
128  return acc
129 
130 
131 def HIPseudoTrackJetAlgCfg(flags, name="TrackPseudoJets", **kwargs):
132  """Creates a pseudo track jet algorithm."""
133  acc = ComponentAccumulator()
134 
135  kwargs.setdefault("InputContainer", "HIJetTracks")
136  kwargs.setdefault("OutputContainer", "PseudoTracks")
137  kwargs.setdefault("Label", "Tracks")
138  kwargs.setdefault("SkipNegativeEnergy", True)
139 
140  acc.addEventAlgo(CompFactory.PseudoJetAlgorithm(name, **kwargs))
141  return acc
142 
143 
144 def HIJetClustererCfg(flags, name="builder", jetDef=None, **kwargs):
145  """Creates a tool for clustering."""
146  acc = ComponentAccumulator()
147 
148  if jetDef is not None:
149  kwargs.setdefault("JetAlgorithm", jetDef.algorithm)
150  kwargs.setdefault("JetRadius", jetDef.radius)
151  kwargs.setdefault("PtMin", jetDef.ptmin)
152  kwargs.setdefault("GhostArea", 0.01)
153  kwargs.setdefault("InputPseudoJets", "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks")
154 
155  acc.setPrivateTools(CompFactory.JetClusterer(name, **kwargs))
156  return acc
157 
158 
159 def HIJetAlgCfg(flags, jetDef, **kwargs):
160  """Creates a jet reconstruction algorithm."""
161  acc = ComponentAccumulator()
162 
163  if "Provider" not in kwargs:
164  jclust = acc.popToolsAndMerge(HIJetClustererCfg(flags, jetDef=jetDef))
165  kwargs.setdefault("Provider", jclust)
166  if "Modifiers" not in kwargs:
167  kwargs.setdefault("Modifiers", JetRecConfig.getJetModifierTools(jetDef))
168  if "OutputContainer" not in kwargs:
169  kwargs.setdefault("OutputContainer", jetDef.fullname())
170  kwargs.setdefault("name", "JRA_build"+kwargs["OutputContainer"])
171 
172  acc.addEventAlgo(CompFactory.JetRecAlg(**kwargs))
173  return acc
174 
175 
176 def HIJetCopierCfg(flags, name="builder_copy", **kwargs):
177  """Creates a tool to copy jets."""
178  acc = ComponentAccumulator()
179 
180  kwargs.setdefault("InputJets", "")
181  kwargs.setdefault("DecorDeps", [])
182  kwargs.setdefault("ShallowCopy", False)
183  kwargs.setdefault("ShallowIO", False)
184 
185  acc.setPrivateTools(CompFactory.JetCopier(name, **kwargs))
186  return acc
187 
188 
189 def HIJetCopyAlgCfg(flags, jetDef_in, jetDef, **kwargs):
190  """Creates an algorithm to copy jets."""
191  acc = ComponentAccumulator()
192 
193  if "Provider" not in kwargs:
194  jcopy = acc.popToolsAndMerge(HIJetCopierCfg(flags, InputJets=jetDef_in.fullname()))
195  kwargs.setdefault("Provider", jcopy)
196  acc.merge(HIJetAlgCfg(flags, jetDef, **kwargs))
197  return acc
198 
199 
200 def updateStdJetModifier(flags, name, **kwargs):
201  """Updates the stdJetModifiers dictionary, based on the provided name.
202  Some of the modifiers expect certain kwargs.
203  Some of the modifiers ignore kwargs which makes the code simpler."""
204 
205  if "Filter:" in name:
206  # already there, do nothing
207  return
208  if "JetDeltaRLabel:" in name:
209  # already there, do nothing
210  return
211  if "JetDeltaRInitialLabel:" in name:
212  # already there, do nothing
213  return
214  if "HIJetCalib:" in name:
215  # add generic "HIJetCalib" modifier
216  if "HIJetCalib" not in stdJetModifiers:
217  updateStdJetModifier(flags, "HIJetCalib", **kwargs)
218  return
219  if name in stdJetModifiers:
220  # already there, do nothing
221  return
222 
223  if name == "HIJetAssoc":
224  stdJetModifiers.update(
225  HIJetAssoc=JetModifier("HIJetDRAssociationTool",
226  "HIJetDRAssociation",
227  ContainerKey=flags.HeavyIon.Jet.Internal.ClusterKey,
228  DeltaR=0.8,
229  AssociationName=flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc"))
230  return
231 
232  if name == "HIJetMaxOverMean":
233  if "jetDef" not in kwargs:
234  __log.warning(
235  "HIJetMaxOverMean needs 'jetDef' in its kwargs; HIJetMaxOverMean is not added to stdJetModifiers")
236  return
237  stdJetModifiers.update(
238  HIJetMaxOverMean=JetModifier("HIJetMaxOverMeanTool",
239  "HIJetMaxOverMean",
240  JetContainer=kwargs["jetDef"].fullname()))
241  return
242 
243  if name == "HIJetDiscrim":
244  stdJetModifiers.update(
245  HIJetDiscrim=JetModifier("HIJetDiscriminatorTool",
246  "HIJetDiscriminator",
247  MaxOverMeanCut=4,
248  MinimumETMaxCut=3000))
249  return
250 
251  if name == "subtr0":
252  if "Modulator" not in kwargs or "EventShapeMapTool" not in kwargs or \
253  "Subtractor" not in kwargs or "EventShapeKey" not in kwargs:
254  __log.warning(
255  "subtr0 needs 'Modulator', 'EventShapeMapTool', 'Subtractor', and 'EventShapeKey' in its kwargs; subtr0 is not added to stdJetModifiers")
256  return
257 
258  stdJetModifiers.update(
259  subtr0=JetModifier("HIJetConstituentSubtractionTool",
260  "HICS_HIEventShapeWeighted_iter0",
261  MomentName="JetSubtractedScaleMomentum",
262  SetMomentOnly=False,
263  ApplyOriginCorrection=True,
264  **kwargs))
265  return
266 
267  if name == "HIJetCalib":
268  stdJetModifiers.update(
269  HIJetCalib=JetModifier("JetCalibrationTool",
270  "HICalibTool_{modspec}",
271  JetCollection=lambda _, modspec: "AntiKt{}HI".format(modspec.split('___')[0]) if modspec.split('___')[0] in flags.HeavyIon.Jet.CaliRValues else "AntiKt4HI",
272  PrimaryVerticesContainerName="",
273  ConfigFile='JES_MC16_HI_Jan2021_5TeV.config', # JES_MC16_HI_Jan2021_5TeV.config JES_MC15c_HI_Nov2016.config
274  CalibSequence=lambda _, modspec: modspec.split('___')[1],
275  IsData=lambda _, modspec: modspec.split('___')[2] == 'True'))
276  return
277 
278  if name == "subtr1":
279  if "Modulator" not in kwargs or "EventShapeMapTool" not in kwargs or \
280  "Subtractor" not in kwargs or "EventShapeKey" not in kwargs:
281  __log.warning(
282  "subtr1 needs 'Modulator', 'EventShapeMapTool', 'Subtractor', and 'EventShapeKey' in its kwargs; subtr1 is not added to stdJetModifiers")
283  return
284 
285  stdJetModifiers.update(
286  subtr1=JetModifier("HIJetConstituentSubtractionTool",
287  "HICS_HIEventShapeWeighted_iter1",
288  MomentName="JetSubtractedScaleMomentum",
289  SetMomentOnly=False,
290  ApplyOriginCorrection=True,
291  **kwargs))
292  return
293 
294  if name == "consmod":
295  if "ClusterKey" not in kwargs or "Subtractor" not in kwargs:
296  __log.warning(
297  "consmod needs 'ClusterKey' and 'Subtractor' in its kwargs; consmod is not added to stdJetModifiers")
298  return
299 
300  stdJetModifiers.update(
301  consmod=JetModifier(
302  "HIJetConstituentModifierTool",
303  "HIJetConstituentModifierTool_final",
304  ApplyOriginCorrection=True,
305  **kwargs))
306  return
307 
308  __log.warning("updateStdJetModifier does not know modifier "+
309  name+"; it is not added to stdJetModifiers")
310  return
311 
312 
313 def HIJetDefCloner(flags, jetDef_in, **kwargs):
314  """Clones jet definitions based on the template.
315  Updates stdJetModifiers if necessary.
316  Overwrites suffix and modifiers, and return jet definition with already resolved dependencies."""
317 
318  jetDef_new = jetDef_in.clone()
319 
320  if "prefix" in kwargs:
321  jetDef_new.prefix = kwargs["prefix"]
322  if "suffix" in kwargs:
323  jetDef_new.suffix = kwargs["suffix"]
324  if "modifiers" in kwargs:
325  jetDef_new.modifiers = []
326  for modifier in kwargs["modifiers"]:
327  updateStdJetModifier(flags, modifier, jetDef=jetDef_new)
328  jetDef_new.modifiers.append(modifier)
329 
330  return solveDependencies(jetDef_new,flags)
331 
332 
334  """Provides modulator tool without any modulations."""
335  acc = ComponentAccumulator()
336  acc.setPrivateTools(CompFactory.HIUEModulatorTool('NullUEModulator',
337  EventShapeKey='',
338  DoV2=False,
339  DoV3=False,
340  DoV4=False))
341  return acc
342 
343 
344 def HIModulatorCfg(flags, mod_key, suffix=None, **kwargs):
345  """Provides modulator tool."""
346 
347  kwargs.setdefault("harmonics", flags.HeavyIon.Jet.HarmonicsForSubtraction)
348  if len(kwargs["harmonics"]) == 0:
349  return NullModulatorCfg()
350  acc = ComponentAccumulator()
351  kwargs.setdefault("name", "Modulator_"+mod_key+
352  "".join(["_V"+str(h) for h in kwargs["harmonics"]]))
353  if suffix is not None:
354  kwargs["name"] += '_'+suffix
355  kwargs.setdefault("DoV2", 2 in kwargs["harmonics"])
356  kwargs.setdefault("DoV3", 3 in kwargs["harmonics"])
357  kwargs.setdefault("DoV4", 4 in kwargs["harmonics"])
358  del kwargs["harmonics"]
359  kwargs.setdefault("EventShapeKey", mod_key)
360 
361  acc.setPrivateTools(CompFactory.HIUEModulatorTool(**kwargs))
362 
363  if 'label' in kwargs:
364  label = kwargs['label']
365  for key in kwargs:
366  if key not in ["name", "DoV2", "DoV3", "DoV4", "EventShapeKey"]:
367  del kwargs[key]
368 
369  stdJetModifiers[label] = JetModifier("HIUEModulatorTool", **kwargs)
370 
371  return acc
372 
373 
374 def HIJetClusterSubtractorCfg(flags, name="HIJetClusterSubtractor", **kwargs):
375  """Provides tool for cluster subtraction."""
376  acc = ComponentAccumulator()
377 
378  kwargs.setdefault("ConfigDir", "HIJetCorrection/")
379  kwargs.setdefault("UseSamplings", False)
380  if "InputFile" not in kwargs:
381  from HIJetRec.HIJetRecUtilsCA import getHIClusterGeoWeightFile
382  kwargs.setdefault("InputFile", getHIClusterGeoWeightFile(flags))
383 
384  acc.setPrivateTools(CompFactory.HIJetClusterSubtractorTool(name, **kwargs))
385  return acc
386 
387 
388 def HIJetCellSubtractorCfg(flags, name="HIJetCellSubtractor", **kwargs):
389  """Provides tool for cell subtraction."""
390  acc = ComponentAccumulator()
391 
392  acc.setPrivateTools(CompFactory.HIJetCellSubtractorTool(name, **kwargs))
393  return acc
394 
395 
396 def HIJetSubtractorCfg(flags, useClusters, **kwargs):
397  """Common function for clsuter and cell subtraction configuration."""
398 
399  if useClusters:
400  return HIJetClusterSubtractorCfg(flags, **kwargs)
401  else:
402  return HIJetCellSubtractorCfg(flags, **kwargs)
403 
404 
405 def HIEventShapeJetIterationCfg(flags, suffix=None, useClusters=True, **kwargs):
406  """Provides tool for event shape iteration.
407  Also saves some tool, so they can be used later."""
408  acc = ComponentAccumulator()
409 
410  kwargs.setdefault("InputEventShapeKey", "HIEventShape_Weighted")
411  kwargs.setdefault("CaloJetSeedContainerKey", "")
412 
413  out_shape_name = kwargs["InputEventShapeKey"]
414  if suffix is not None:
415  out_shape_name += '_'+suffix
416  mod_shape_key = out_shape_name+'_Modulate'
417 
418  if 'Modulator' not in kwargs:
419  modulator = acc.popToolsAndMerge(HIModulatorCfg(
420  flags, mod_key=mod_shape_key, suffix=suffix))
421  kwargs.setdefault('Modulator', modulator)
422  if "Subtractor" not in kwargs:
423  sub_tool = acc.popToolsAndMerge(HIJetSubtractorCfg(flags, useClusters))
424  kwargs.setdefault("Subtractor", sub_tool)
425  if "EventShapeMapTool" not in kwargs:
426  map_tool = acc.popToolsAndMerge(HIEventShapeMapToolCfg(flags))
427  kwargs.setdefault("EventShapeMapTool", map_tool)
428  kwargs.setdefault("OutputEventShapeKey", out_shape_name)
429  kwargs.setdefault("AssociationKey", flags.HeavyIon.Jet.Internal.ClusterKey+"_DR8Assoc")
430  kwargs.setdefault("ModulationScheme", 1)
431  kwargs.setdefault("RemodulateUE", True)
432  kwargs.setdefault("ShallowCopy", False)
433  kwargs.setdefault("ModulationEventShapeKey", mod_shape_key)
434  kwargs.setdefault("TrackJetSeedContainerKey", "")
435 
436  acc.setPrivateTools(CompFactory.HIEventShapeJetIteration(
437  "HIJetIteration_"+out_shape_name, **kwargs))
438 
439  # save some tools for later
440  jm_dict = {"Modulator": kwargs["Modulator"],
441  "EventShapeMapTool": kwargs["EventShapeMapTool"],
442  "Subtractor": kwargs["Subtractor"],
443  "EventShapeKey": kwargs["OutputEventShapeKey"]}
444 
445  return jm_dict, acc
446 
447 
448 def HITrackSelAlgCfg(flags, name="TrackSelAlgHI", **kwargs):
449  """Provides track selection algorithm for track jet reconstruction."""
450  acc = ComponentAccumulator()
451 
452  if "TrackSelector" not in kwargs:
453  from InDetConfig.InDetTrackSelectionToolConfig import HI_InDetTrackSelectionToolForHITrackJetsCfg
454  tracksel = acc.popToolsAndMerge(HI_InDetTrackSelectionToolForHITrackJetsCfg(flags))
455  kwargs.setdefault("TrackSelector", tracksel)
456  kwargs.setdefault("InputContainer", "InDetTrackParticles")
457  kwargs.setdefault("OutputContainer", "HIJetTracks")
458  kwargs.setdefault("DecorDeps", [])
459 
460  acc.addEventAlgo(CompFactory.JetTrackSelectionAlg(name, **kwargs))
461  return acc
462 
463 
464 def HICaloClusterMomentsCfg(flags, name="HIClusterMoments", **kwargs):
465  """Provides tool for cluster moments."""
466  acc = ComponentAccumulator()
467 
468  kwargs.setdefault("MinBadLArQuality", 4000)
469  kwargs.setdefault("MomentsNames", ["CENTER_MAG",
470  "LONGITUDINAL",
471  "FIRST_ENG_DENS",
472  "SECOND_ENG_DENS",
473  "ENG_FRAC_EM",
474  "ENG_FRAC_MAX",
475  "ENG_FRAC_CORE",
476  "ENG_BAD_CELLS",
477  "N_BAD_CELLS",
478  "N_BAD_CELLS_CORR",
479  "BAD_CELLS_CORR_E",
480  "BADLARQ_FRAC",
481  "ENG_POS",
482  "SIGNIFICANCE",
483  "CELL_SIGNIFICANCE",
484  "CELL_SIG_SAMPLING",
485  "AVG_LAR_Q",
486  "AVG_TILE_Q",
487  "ENG_BAD_HV_CELLS",
488  "N_BAD_HV_CELLS"])
489 
490  acc.setPrivateTools(CompFactory.CaloClusterMomentsMaker(name, **kwargs))
491  return acc
492 
493 
494 def HISubtractionToCellsCfg(flags, name="HIClusterSubtraction", **kwargs):
495  """Provides tool for cell subtraction.
496  Re-uses tool for cluster subtraction."""
497 
498  return HISubtractionToClustersCfg(flags, name, useClusters=False, **kwargs)
499 
500 
501 def HISubtractionToClustersCfg(flags, name="HIClusterSubtraction", useClusters=True, **kwargs):
502  """Provides tool for cluster subtraction."""
503  acc = ComponentAccumulator()
504 
505  kwargs.setdefault('EventShapeKey', 'EventShapeKey')
506  kwargs.setdefault('ClusterKey', flags.HeavyIon.Jet.Internal.ClusterKey)
507  kwargs.setdefault('OutClusterKey', 'ClusterKey_deep')
508  kwargs.setdefault('UpdateOnly', False)
509  kwargs.setdefault('ApplyOriginCorrection', True)
510  kwargs.setdefault('SetMoments', False)
511  if 'Modulator' not in kwargs:
512  modulator = acc.popToolsAndMerge(NullModulatorCfg())
513  kwargs.setdefault('Modulator', modulator)
514  if "EventShapeMapTool" not in kwargs:
515  map_tool = acc.popToolsAndMerge(HIEventShapeMapToolCfg(flags))
516  kwargs.setdefault("EventShapeMapTool", map_tool)
517  if "Subtractor" not in kwargs:
518  sub_tool = acc.popToolsAndMerge(HIJetSubtractorCfg(flags, useClusters))
519  kwargs.setdefault("Subtractor", sub_tool)
520  if kwargs["SetMoments"] and "ClusterCorrectionTools" not in kwargs:
521  clusterCorrectionTools = acc.popToolsAndMerge(
522  HICaloClusterMomentsCfg(flags, "HIClusterMoments"))
523  kwargs.setdefault("ClusterCorrectionTools", [clusterCorrectionTools])
524 
525  acc.setPrivateTools(CompFactory.HIClusterSubtraction(name, **kwargs))
526  return acc
527 
528 
529 def HIJetRecCfg(flags):
530  """Configures Heavy Ion Jet reconstruction."""
531  acc = ComponentAccumulator()
532 
533  if not flags.HeavyIon.isDerivation:
534  # get HIClusters
535  acc.merge(HIClusterMakerCfg(flags))
536  else:
537  # copy HIClusters
538  acc.merge(HIClusterCopierCfg(flags))
539 
540 
541  # get weighted event shape
542  eventshapeKey = flags.HeavyIon.HIJetPrefix+"HIEventShapeWeighted"
543  acc.merge(HIEventShapeMakerCfg(flags,
544  name="HIEventShapeMaker_Weighted",
545  doWeighted=True,
546  InputTowerKey=flags.HeavyIon.Jet.Internal.ClusterKey,
547  OutputContainerKey=eventshapeKey))
548 
549  # get jet definition
550  # R=0.2 calojets are use as seeds for UE subtraction
551  jetDef2 = HICaloJetDef(flags, jetradius=2, prefix=flags.HeavyIon.HIJetPrefix, suffix="_Unsubtracted")
552 
553  # get jet definitions for physics
554  jetDef = []
555  jetRlist = flags.HeavyIon.Jet.RValues #Default [0.2,0.4], Others R's should be build in Derivations or pass in preExec
556  for jetR in jetRlist:
557  jetDef.append(HICaloJetDef(flags, jetradius=jetR, prefix=flags.HeavyIon.HIJetPrefix, suffix="_Unsubtracted"))
558  __log.info("HI Jet Collection for Reco: "+jetDef[-1].fullname())
559 
560  # get calo pseudojets
561  acc.merge(HIPseudoJetAlgCfg(flags))
562 
563  # HIJetTracks are used for GhostTracks association and later to build TrackJets seeds
564  pseudoTrkJetCont = "HIJetTracks"
565  pseudoGhostTrks = "PseudoJetGhostTracks"
566 
567  acc.merge(HITrackSelAlgCfg(flags, OutputContainer=pseudoTrkJetCont))
568  acc.merge(HIPseudoTrackJetAlgCfg(
569  flags, name="GhostTrackPseudoJets", InputContainer=pseudoTrkJetCont, OutputContainer=pseudoGhostTrks, Label="GhostTrack"))
570 
571 
572 
573  pjContNames = ["PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey,pseudoGhostTrks]
574 
575  mergeAlg = CompFactory.PseudoJetMerger(
576  "PJmerge_HIGhostTrack",
577  InputPJContainers = pjContNames,
578  OutputContainer = "PseudoJet"+flags.HeavyIon.Jet.Internal.ClusterKey+"_GhostTracks"
579  )
580  acc.addEventAlgo(mergeAlg)
581 
582  # build jets
583  acc.merge(HIJetAlgCfg(flags, jetDef=jetDef2))
584  for jd in jetDef:
585  acc.merge(HIJetAlgCfg(flags, jetDef=jd))
586 
587  # copy unsubtracted jets; create seed0
588  jetDef_seed0 = HIJetDefCloner(flags, jetDef_in=jetDef2,
589  prefix=flags.HeavyIon.HIJetPrefix,
590  suffix="_seed0",
591  modifiers=["HIJetAssoc", "HIJetMaxOverMean", "HIJetDiscrim", "Filter:5000"])
592  acc.merge(HIJetCopyAlgCfg(flags, jetDef2, jetDef_seed0))
593 
594  # first iteration, iter0
595  jm_dict0, acc_iter0 = HIEventShapeJetIterationCfg(flags,
596  suffix="iter0",
597  InputEventShapeKey=eventshapeKey,
598  CaloJetSeedContainerKey=jetDef_seed0.fullname())
599  iter0 = acc.popToolsAndMerge(acc_iter0)
600  acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_iter0", Tools=[iter0]))
601 
602  # jet modifier from the first iteration
603  updateStdJetModifier(flags, "subtr0", **jm_dict0)
604 
605  # set jet energy scale configuration
606  calib_seq = "EtaJES"
607  if not flags.Input.isMC:
608  calib_seq += "_Insitu"
609 
610  # copy jets from the first iteration; create seed1
611  jetDef_seed1 = HIJetDefCloner(flags, jetDef_in=jetDef2,
612  prefix=flags.HeavyIon.HIJetPrefix,
613  suffix="_seed1",
614  modifiers=["HIJetAssoc", "subtr0", "HIJetCalib:{}___{}___{}".format(2, calib_seq, not flags.Input.isMC), "Filter:{}".format(flags.HeavyIon.Jet.SeedPtMin)])
615  acc.merge(HIJetCopyAlgCfg(flags, jetDef2, jetDef_seed1))
616 
617  # configuring track jets, seeds for second iteration
618  if flags.HeavyIon.Jet.doTrackJetSeed:
619  pseudoTrks = "PseudoTracks"
620 
621  acc.merge(HIPseudoTrackJetAlgCfg(
622  flags, InputContainer=pseudoTrkJetCont, OutputContainer=pseudoTrks))
623 
624  jetDef_trk = HITrackJetDef(flags,
625  jetradius=4,
626  modifiers=["HIJetAssoc", "Filter:{}".format(flags.HeavyIon.Jet.TrackJetPtMin),"Sort"])
627  trkJetSeedCont = jetDef_trk.fullname()
628 
629  trkJetClust = acc.popToolsAndMerge(HIJetClustererCfg(flags,
630  jetDef=jetDef_trk,
631  InputPseudoJets=pseudoTrks))
632  acc.merge(HIJetAlgCfg(flags, jetDef_trk, Provider=trkJetClust))
633  else:
634  trkJetSeedCont = ""
635 
636  # second iteration, iter1
637  jm_dict1, acc_iter1 = HIEventShapeJetIterationCfg(flags,
638  suffix="iter1",
639  InputEventShapeKey=eventshapeKey,
640  CaloJetSeedContainerKey=jetDef_seed1.fullname(),
641  TrackJetSeedContainerKey=trkJetSeedCont)
642  iter1 = acc.popToolsAndMerge(acc_iter1)
643  acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_iter1", Tools=[iter1]))
644 
645  # event shape for egamma
646  jm_dict1_eg, acc_iter1_eg = HIEventShapeJetIterationCfg(flags,
647  suffix="iter_egamma",
648  useClusters=False,
649  InputEventShapeKey=flags.HeavyIon.Global.EventShape,
650  OutputEventShapeKey=flags.HeavyIon.Egamma.EventShape,
651  CaloJetSeedContainerKey=jetDef_seed1.fullname())
652  iter1_eg = acc.popToolsAndMerge(acc_iter1_eg)
653  acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_iter1_egamma", Tools=[iter1_eg]))
654 
655  # constituents subtraction for egamma, cell-level
656  cluster_key_eGamma_deep = flags.HeavyIon.Jet.Internal.ClusterKey+"_eGamma_deep"
657  if not flags.HeavyIon.isDerivation:
658  subtrToCelltool = acc.popToolsAndMerge(
660  name="HIClusterSubtraction_egamma",
661  EventShapeKey=jm_dict1_eg["EventShapeKey"],
662  OutClusterKey=cluster_key_eGamma_deep,
663  Modulator=jm_dict1["Modulator"],
664  EventShapeMapTool=jm_dict1["EventShapeMapTool"],
665  SetMoments=True,
666  ApplyOriginCorrection=False)
667  )
668  acc.addEventAlgo(CompFactory.JetAlgorithm("jetalgHI_subtrToCellTool", Tools=[subtrToCelltool]))
669 
670  # jet modifier from the second iteration
671  updateStdJetModifier(flags, "subtr1", **jm_dict1)
672 
673  # constituents subtraction for jets, tower-level
674  clusterKey = cluster_key_eGamma_deep
675  if flags.HeavyIon.isDerivation:
676  clusterKey = flags.HeavyIon.Jet.Internal.ClusterKey
677  subtrToClusterTool = acc.popToolsAndMerge(
679  name="HIClusterSubtraction_final",
680  EventShapeKey=jm_dict1["EventShapeKey"],
681  ClusterKey=clusterKey,
682  OutClusterKey=flags.HeavyIon.Jet.ClusterKey,
683  Modulator=jm_dict1["Modulator"],
684  EventShapeMapTool=jm_dict1["EventShapeMapTool"],
685  ApplyOriginCorrection=False)
686  )
687  acc.addEventAlgo(CompFactory.JetAlgorithm(
688  "jetalgHI_subtrToClusterTool", Tools=[subtrToClusterTool]))
689 
690  # jet modifier from the tower-level subtraction
691  updateStdJetModifier(flags, "consmod",
692  ClusterKey=flags.HeavyIon.Jet.ClusterKey,
693  Subtractor=jm_dict1["Subtractor"])
694 
695  # store final version of HIClusters
696  if flags.HeavyIon.Jet.WriteHIClusters:
697  output_hicluster = ["xAOD::CaloClusterContainer#"+flags.HeavyIon.Jet.ClusterKey,
698  "xAOD::CaloClusterAuxContainer#"+flags.HeavyIon.Jet.ClusterKey+"Aux."]
699  acc.merge(addToESD(flags, output_hicluster))
700  acc.merge(addToAOD(flags, output_hicluster))
701 
702  # configure final jets and store them
703  extramods = ["Sort","Width","CaloEnergies","LArHVCorr","CaloQuality","TrackMoments","JVF","JVT"]# adding modifiers to final jets
704  for jd in jetDef:
705  print("Printing flags: isDerivation: ", flags.HeavyIon.isDerivation, "doHIBTagging: ", flags.HeavyIon.doHIBTagging, "isMC: ", flags.Input.isMC, "jet radius: ", jd.radius)
706  if flags.HeavyIon.isDerivation and flags.HeavyIon.doHIBTagging and jd.radius==0.4:
707  extramods += flags.HeavyIon.FTagModifiers
708  if flags.Input.isMC:
709  extramods += flags.HeavyIon.FTagTruthModifiers
710  jetDef_final = HIJetDefCloner(flags,
711  jetDef_in=jd,
712  prefix=flags.HeavyIon.HIJetPrefix,
713  suffix="",
714  modifiers=["subtr1", "consmod", "HIJetCalib:{}___{}___{}".format(str(float(jd.radius)*10).replace('.0',''),calib_seq, not flags.Input.isMC), "Filter:{}".format(flags.HeavyIon.Jet.RecoOutputPtMin)]+extramods)
715  if flags.HeavyIon.isDerivation and flags.HeavyIon.doHIBTagging and flags.Input.isMC and jd.radius==0.4:
716  jetDef_final.ghostdefs += ["Truth","BHadronsInitial", "BHadronsFinal", "BQuarksFinal","CHadronsInitial", "CHadronsFinal", "CQuarksFinal","TausFinal", "TQuarksFinal","Partons"]
717  jetDef_final = solveDependencies(jetDef_final, flags)
718  pjaList = getPseudoJetAlgs(jetDef_final)
719  pjaList = pjaList[1:] # removing pseudoJets from HIClusters - already created
720  for pjalg in pjaList:
721  if pjalg.Label=='GhostTrack': #pseudo jet algorithm for ghost tracks crashing, reusing pj thost tracks from HI track jets
722  continue
723  pjalg.name="GhostTrackPseudoJets"
724  pjalg.InputContainer=pseudoTrkJetCont
725  pjalg.OutputContainer=pseudoGhostTrks
726  if pjalg.Label=='merged':
727  inpjcnt = pjalg.InputPJContainers
728  inpjcnt.remove('PseudoJetGhostJetSelectedTracks')
729  inpjcnt.append(pseudoGhostTrks)
730  pjalg.InputPJContainers = inpjcnt
731  acc.addEventAlgo(pjalg)
732  finalpjs = str(pjalg.OutputContainer)
733  # Set the name of the final PseudoJetContainer to be used as input :
734  jetDef_final._internalAtt['finalPJContainer'] = finalpjs
735  jetRecAlg = getHIJetRecAlg(jetDef_final, jetDef_final.fullname())
736  acc.addEventAlgo(jetRecAlg)
737  else:
738  acc.merge(HIJetCopyAlgCfg(flags, jd, jetDef_final))
739 
740  output = ["xAOD::JetContainer#"+jetDef_final.fullname(),
741  "xAOD::JetAuxContainer#"+jetDef_final.fullname()+"Aux.-PseudoJet"]
742  acc.merge(addToESD(flags, output))
743  acc.merge(addToAOD(flags, output))
744 
745  # store track jets
746  if flags.HeavyIon.Jet.doTrackJetSeed:
747  output = ["xAOD::JetContainer#"+jetDef_trk.fullname(),
748  "xAOD::JetAuxContainer#"+jetDef_trk.fullname()+"Aux.-PseudoJet"]
749  acc.merge(addToESD(flags, output))
750  acc.merge(addToAOD(flags, output))
751 
752  return acc
753 
754 def getHIJetRecAlg( jetdef, jetsName):
755  """Returns the configured HIJetRecAlg instance corresponding to jetdef
756 
757  IMPORTANT : jetdef must have its dependencies solved (i.e. it must result from solveDependencies() )
758  """
759  pjContNames = jetdef._internalAtt['finalPJContainer']
760  jclust = CompFactory.JetClusterer(
761  "builder",
762  JetAlgorithm = jetdef.algorithm,
763  JetRadius = jetdef.radius,
764  PtMin = jetdef.ptmin,
765  InputPseudoJets = pjContNames,
766  GhostArea = 0.0,
767  JetInputType = int(jetdef.inputdef.jetinputtype),
768  RandomOption = 1,
769  )
770 
771  mods = JetRecConfig.getJetModifierTools(jetdef)
772 
773  jetname = jetsName
774  jra = CompFactory.JetRecAlg(
775  "jetrecalg_"+jetname,
776  Provider = jclust,
777  Modifiers = mods,
778  OutputContainer = jetname,
779  )
780  jra.ExtraOutputs = [('xAOD::JetContainer',f'{jetname}.Ghost{ghost}') for ghost in jetdef.ghostdefs]
781 
782  return jra
783 
784 
785 if __name__ == "__main__":
786  from AthenaConfiguration.AllConfigFlags import initConfigFlags
787  from AthenaConfiguration.TestDefaults import defaultConditionsTags, defaultGeometryTags, defaultTestFiles
788  flags = initConfigFlags()
789  flags.Input.Files = [defaultTestFiles.d + "/RecJobTransformTests/data18_hi.00367384.physics_HardProbes.daq.RAW._lb0145._SFO-8._0001.data"]
790  flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
791  flags.IOVDb.GlobalTag = defaultConditionsTags.RUN2_DATA
792  flags.Exec.MaxEvents = 5
793  flags.Concurrency.NumThreads = 1
794 
795  # enable unit tests to switch only parts of reco such as (note the absence of spaces around equal sign):
796 
797  flags.fillFromArgs()
798  flags.Jet.strictMode = False
799  flags.lock()
800 
801  from AthenaConfiguration.MainServicesConfig import MainServicesCfg
802  acc = MainServicesCfg(flags)
803  from InDetConfig.TrackRecoConfig import InDetTrackRecoCfg
804  acc.merge(InDetTrackRecoCfg(flags))
805 
806 
807 
808  from JetRecConfig.JetRecConfig import JetRecCfg
809  from JetRecConfig.StandardSmallRJets import AntiKt4EMTopo
810  EMjet = AntiKt4EMTopo.clone()
811  EMjet.ghostdefs = ["Track"]
812  acc.merge(JetRecCfg(flags,EMjet))
813 
814  from HIGlobal.HIGlobalConfig import HIGlobalRecCfg
815  acc.merge(HIGlobalRecCfg(flags))
816 
817  acc.merge(HIJetRecCfg(flags))
818 
819  acc.printConfig(withDetails=True, summariseProps=True)
820  flags.dump()
821 
822  import sys
823  sys.exit(acc.run().isFailure())
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
HIJetRecConfigCA.HIJetRecCfg
def HIJetRecCfg(flags)
Definition: HIJetRecConfigCA.py:529
python.CaloRecoConfig.CaloRecoCfg
def CaloRecoCfg(flags, clustersname=None)
Definition: CaloRecoConfig.py:9
python.JetAnalysisCommon.ComponentAccumulator
ComponentAccumulator
Definition: JetAnalysisCommon.py:302
vtune_athena.format
format
Definition: vtune_athena.py:14
HIJetRecConfigCA.HIModulatorCfg
def HIModulatorCfg(flags, mod_key, suffix=None, **kwargs)
Definition: HIJetRecConfigCA.py:344
HIJetRecUtilsCA.getHIClusterGeoWeightFile
def getHIClusterGeoWeightFile(flags)
Definition: HIJetRecUtilsCA.py:9
HIJetRecConfigCA.updateStdJetModifier
def updateStdJetModifier(flags, name, **kwargs)
Definition: HIJetRecConfigCA.py:200
HIJetRecConfigCA.HIClusterMakerCfg
def HIClusterMakerCfg(flags, save=False, **kwargs)
Definition: HIJetRecConfigCA.py:20
HIJetRecConfigCA.NullModulatorCfg
def NullModulatorCfg()
Definition: HIJetRecConfigCA.py:333
HIJetRecConfigCA.HIJetDefCloner
def HIJetDefCloner(flags, jetDef_in, **kwargs)
Definition: HIJetRecConfigCA.py:313
HIJetRecConfigCA.HISubtractionToClustersCfg
def HISubtractionToClustersCfg(flags, name="HIClusterSubtraction", useClusters=True, **kwargs)
Definition: HIJetRecConfigCA.py:501
HIGlobalConfig.HIEventShapeMapToolCfg
def HIEventShapeMapToolCfg(flags, name="HIEventShapeMapTool", **kwargs)
Definition: HIGlobalConfig.py:20
HIJetRecConfigCA.HIJetSubtractorCfg
def HIJetSubtractorCfg(flags, useClusters, **kwargs)
Definition: HIJetRecConfigCA.py:396
HIJetRecConfigCA.HIClusterCopierCfg
def HIClusterCopierCfg(flags, save=False, **kwargs)
Definition: HIJetRecConfigCA.py:48
python.InDetTrackSelectionToolConfig.HI_InDetTrackSelectionToolForHITrackJetsCfg
def HI_InDetTrackSelectionToolForHITrackJetsCfg(flags, name="TrackSelHI", **kwargs)
Definition: InDetTrackSelectionToolConfig.py:164
HIJetRecConfigCA.HICaloJetInputConstitSeq
def HICaloJetInputConstitSeq(flags, name="HICaloConstit", **kwargs)
Definition: HIJetRecConfigCA.py:62
HIJetRecConfigCA.HITrackJetDef
def HITrackJetDef(flags, jetradius, **kwargs)
Definition: HIJetRecConfigCA.py:101
HIJetRecConfigCA.HICaloClusterMomentsCfg
def HICaloClusterMomentsCfg(flags, name="HIClusterMoments", **kwargs)
Definition: HIJetRecConfigCA.py:464
HIJetRecConfigCA.HIJetCellSubtractorCfg
def HIJetCellSubtractorCfg(flags, name="HIJetCellSubtractor", **kwargs)
Definition: HIJetRecConfigCA.py:388
HIJetRecConfigCA.HIPseudoJetAlgCfg
def HIPseudoJetAlgCfg(flags, **kwargs)
Definition: HIJetRecConfigCA.py:116
HIJetRecConfigCA.HIJetClusterSubtractorCfg
def HIJetClusterSubtractorCfg(flags, name="HIJetClusterSubtractor", **kwargs)
Definition: HIJetRecConfigCA.py:374
python.JetRecConfig.JetRecCfg
def JetRecCfg(flags, jetdef, returnConfiguredDef=False)
Top level functions returning ComponentAccumulator out of JetDefinition.
Definition: JetRecConfig.py:36
python.MainServicesConfig.MainServicesCfg
def MainServicesCfg(flags, LoopMgr='AthenaEventLoopMgr')
Definition: MainServicesConfig.py:310
python.DependencyHelper.solveDependencies
def solveDependencies(jetdef0, flags)
Definition: DependencyHelper.py:20
HIJetRecConfigCA.HITrackJetInputConstit
def HITrackJetInputConstit(flags, name="HITrack", **kwargs)
Definition: HIJetRecConfigCA.py:93
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:26
python.OutputStreamConfig.addToESD
def addToESD(flags, itemOrList, **kwargs)
Definition: OutputStreamConfig.py:187
HIJetRecConfigCA.getHIJetRecAlg
def getHIJetRecAlg(jetdef, jetsName)
Definition: HIJetRecConfigCA.py:754
HIJetRecConfigCA.HITrackSelAlgCfg
def HITrackSelAlgCfg(flags, name="TrackSelAlgHI", **kwargs)
Definition: HIJetRecConfigCA.py:448
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
HIJetRecConfigCA.HICaloJetDef
def HICaloJetDef(flags, jetradius, **kwargs)
Definition: HIJetRecConfigCA.py:77
HIJetRecConfigCA.HIEventShapeJetIterationCfg
def HIEventShapeJetIterationCfg(flags, suffix=None, useClusters=True, **kwargs)
Definition: HIJetRecConfigCA.py:405
HIJetRecConfigCA.HIJetClustererCfg
def HIJetClustererCfg(flags, name="builder", jetDef=None, **kwargs)
Definition: HIJetRecConfigCA.py:144
HIJetRecConfigCA.HIPseudoTrackJetAlgCfg
def HIPseudoTrackJetAlgCfg(flags, name="TrackPseudoJets", **kwargs)
Definition: HIJetRecConfigCA.py:131
HIJetRecConfigCA.HISubtractionToCellsCfg
def HISubtractionToCellsCfg(flags, name="HIClusterSubtraction", **kwargs)
Definition: HIJetRecConfigCA.py:494
HIJetRecConfigCA.HIJetAlgCfg
def HIJetAlgCfg(flags, jetDef, **kwargs)
Definition: HIJetRecConfigCA.py:159
python.TrackRecoConfig.InDetTrackRecoCfg
def InDetTrackRecoCfg(flags)
Main ID tracking config #####################.
Definition: TrackRecoConfig.py:804
python.CaloTowerMakerConfig.CaloTowerMakerCfg
def CaloTowerMakerCfg(flags)
Definition: CaloTowerMakerConfig.py:7
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
HIJetRecConfigCA.HIJetCopierCfg
def HIJetCopierCfg(flags, name="builder_copy", **kwargs)
Definition: HIJetRecConfigCA.py:176
python.AllConfigFlags.initConfigFlags
def initConfigFlags()
Definition: AllConfigFlags.py:19
python.OutputStreamConfig.addToAOD
def addToAOD(flags, itemOrList, **kwargs)
Definition: OutputStreamConfig.py:202
HIJetRecConfigCA.HIJetCopyAlgCfg
def HIJetCopyAlgCfg(flags, jetDef_in, jetDef, **kwargs)
Definition: HIJetRecConfigCA.py:189
HIGlobalConfig.HIEventShapeMakerCfg
def HIEventShapeMakerCfg(flags, name="HIEventShapeMaker", doWeighted=False, **kwargs)
Definition: HIGlobalConfig.py:41
str
Definition: BTagTrackIpAccessor.cxx:11
python.JetRecConfig.getPseudoJetAlgs
def getPseudoJetAlgs(jetdef)
Mid level functions returning specific type of algs out of JetDefinition functions below assumines th...
Definition: JetRecConfig.py:233
HIGlobalConfig.HIGlobalRecCfg
def HIGlobalRecCfg(flags)
Definition: HIGlobalConfig.py:81
python.LArMinBiasAlgConfig.float
float
Definition: LArMinBiasAlgConfig.py:65