ATLAS Offline Software
Loading...
Searching...
No Matches
HIJetRecConfigCA.py
Go to the documentation of this file.
2# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3#
4
5from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
6from AthenaConfiguration.ComponentFactory import CompFactory
7from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
8from JetRecConfig.JetDefinition import JetInputConstitSeq, JetInputConstit, xAODType, JetDefinition
9from JetRecConfig.JetDefinition import JetModifier, JetInputExternal
10#from JetRecConfig.JetRecConfig import getJetModifierTools
11from JetRecConfig.JetRecConfig import getPseudoJetAlgs
12from JetRecConfig.StandardJetMods import stdJetModifiers
13from JetRecConfig import JetRecConfig
14from JetRecConfig.DependencyHelper import solveDependencies
15from HIGlobal.HIGlobalConfig import HIEventShapeMakerCfg, HIEventShapeMapToolCfg
16from AthenaCommon.Logging import logging
17__log = logging.getLogger('HIJetRecConfigCA')
18
19
20def 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
48def 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
62def 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
77def 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
93def 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
101def 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
116def 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
131def 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
144def 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
159def 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
176def 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
189def 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
200def 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
313def 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
344def 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
374def 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
388def 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
396def 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
405def 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
448def 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
464def 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
494def 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
501def 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
529def 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
754def 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
785if __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())
void print(char *figname, TCanvas *c1)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
HISubtractionToClustersCfg(flags, name="HIClusterSubtraction", useClusters=True, **kwargs)
getHIJetRecAlg(jetdef, jetsName)
HIJetClusterSubtractorCfg(flags, name="HIJetClusterSubtractor", **kwargs)
HIClusterCopierCfg(flags, save=False, **kwargs)
updateStdJetModifier(flags, name, **kwargs)
HIJetCellSubtractorCfg(flags, name="HIJetCellSubtractor", **kwargs)
HIPseudoJetAlgCfg(flags, **kwargs)
HISubtractionToCellsCfg(flags, name="HIClusterSubtraction", **kwargs)
HIPseudoTrackJetAlgCfg(flags, name="TrackPseudoJets", **kwargs)
HICaloJetDef(flags, jetradius, **kwargs)
HICaloClusterMomentsCfg(flags, name="HIClusterMoments", **kwargs)
HIEventShapeJetIterationCfg(flags, suffix=None, useClusters=True, **kwargs)
HITrackJetInputConstit(flags, name="HITrack", **kwargs)
HIJetCopierCfg(flags, name="builder_copy", **kwargs)
HIJetSubtractorCfg(flags, useClusters, **kwargs)
HIJetDefCloner(flags, jetDef_in, **kwargs)
HITrackSelAlgCfg(flags, name="TrackSelAlgHI", **kwargs)
HICaloJetInputConstitSeq(flags, name="HICaloConstit", **kwargs)
HIJetAlgCfg(flags, jetDef, **kwargs)
HIJetClustererCfg(flags, name="builder", jetDef=None, **kwargs)
HITrackJetDef(flags, jetradius, **kwargs)
HIJetCopyAlgCfg(flags, jetDef_in, jetDef, **kwargs)
HIModulatorCfg(flags, mod_key, suffix=None, **kwargs)
HIClusterMakerCfg(flags, save=False, **kwargs)