ATLAS Offline Software
Loading...
Searching...
No Matches
CaloTopoClusterConfig.py
Go to the documentation of this file.
1# Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
2
3from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
4from AthenaConfiguration.ComponentFactory import CompFactory
5from AthenaCommon.SystemOfUnits import MeV
6
7def CaloCalibClusterTruthMapMakerTool(flags, name="CaloCalibClusterTruthMapMakerTool", **kwargs):
8
9 TruthMapMakerTool = CompFactory.CaloCalibClusterTruthMapMakerTool
10 truthMapTool = TruthMapMakerTool()
11
12 return truthMapTool
13
14def CaloCalibHitDecoratorTool(flags, name="CaloCalibClusterDecoratorTool", **kwargs):
15
16 kwargs.setdefault(
17 "CaloClusterWriteDecorHandleKey_NLeadingTruthParticles",
18 "CaloTopoClusters." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Visible"
19 )
20
21
22 TruthAttributerTool = CompFactory.CaloCalibClusterTruthAttributerTool
23 truth_tool = TruthAttributerTool("CaloCalibClusterTruthAttributerTool")
24 DecoratorTool = CompFactory.CaloCalibClusterDecoratorTool
25 decoratorTool = DecoratorTool(name,TruthAttributerTool=truth_tool,**kwargs,ExtraInputs = {('CaloCellContainer','StoreGateSvc+AllCalo')})
26 decoratorTool.useCellWeights = True
27 return decoratorTool
28
29def CaloCalibHitDecoratorFullEnergyTool(flags, name="CaloCalibClusterDecoratorTool_Full", **kwargs):
30
31 kwargs.setdefault(
32 "CaloClusterWriteDecorHandleKey_NLeadingTruthParticles",
33 "CaloTopoClusters." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Full"
34 )
35 TruthAttributerTool = CompFactory.CaloCalibClusterTruthAttributerTool
36 truth_tool = TruthAttributerTool("CaloCalibClusterTruthAttributerTool")
37 DecoratorTool = CompFactory.CaloCalibClusterDecoratorTool
38 decoratorTool = DecoratorTool(name, TruthAttributerTool=truth_tool, **kwargs,ExtraInputs = {('CaloCellContainer','StoreGateSvc+AllCalo')})
39 decoratorTool.useCellWeights = True
40 decoratorTool.StoreFullTruthEnergy = True
41
42 return decoratorTool
43
44
45def CaloCalibHitDecoratorToolOOC(flags, name="CaloCalibClusterDecoratorToolOOC", **kwargs):
46
47 kwargs.setdefault(
48 "CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesL",
49 "CaloTopoClusters." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_L",
50 )
51 kwargs.setdefault(
52 "CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesT",
53 "CaloTopoClusters." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_T",
54 )
55
56 DecoratorTool = CompFactory.CaloCalibClusterDecoratorToolOOC
57 decoratorTool = DecoratorTool(name,**kwargs,ExtraInputs = {('CaloCellContainer','StoreGateSvc+AllCalo')})
58 decoratorTool.CalibrationHitContainerNames = [
59 "LArCalibrationHitInactive",
60 "LArCalibrationHitActive",
61 "TileCalibHitActiveCell",
62 "TileCalibHitInactiveCell"
63 ]
64 return decoratorTool
65
66
67
68
69
70
71
73 result=ComponentAccumulator()
74 from IOVDbSvc.IOVDbSvcConfig import addFolders
75 # rely on global tag for both MC and data; do not specify folder tags
76 # use CALO_OFL only for GEO>=18
77 hadCalibFolders = [
78 "HadCalibration2/CaloEMFrac",
79 "HadCalibration2/H1ClusterCellWeights",
80 "HadCalibration2/CaloOutOfCluster",
81 "HadCalibration2/CaloOutOfClusterPi0",
82 "HadCalibration2/CaloDMCorr2"
83 ]
84 hadCalibPrefix = "/CALO/"
85 hadCalibDB = "CALO_ONL"
86 if flags.Input.isMC:
87 hadCalibPrefix = "/CALO/Ofl/"
88 hadCalibDB = "CALO_OFL"
89 hadCalibFolders = [ hadCalibPrefix + foldername for foldername in hadCalibFolders ]
90 result.merge(addFolders(flags, hadCalibFolders, hadCalibDB, className="CaloLocalHadCoeff"))
91
92 return result
93
95 CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool=CompFactory.getComps("CaloLCClassificationTool","CaloLCWeightTool","CaloLCOutOfClusterTool","CaloLCDeadMaterialTool",)
96 CaloClusterLocalCalib=CompFactory.CaloClusterLocalCalib
97 # Local cell weights
98 LCClassify = CaloLCClassificationTool("LCClassify")
99 LCClassify.ClassificationKey = "EMFracClassify"
100 LCClassify.UseSpread = False
101 LCClassify.MaxProbability = 0.5
102 # add the moments EM_PROBABILITY, HAD_WEIGHT, OOC_WEIGHT, DM_WEIGHT to the AOD:
103 LCClassify.StoreClassificationProbabilityInAOD = True
104 LCClassify.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
105
106 LCWeight = CaloLCWeightTool("LCWeight")
107 LCWeight.CorrectionKey = "H1ClusterCellWeights"
108 LCWeight.SignalOverNoiseCut = 2.0
109 # *****
110 LCWeight.UseHadProbability = True
111
112 LocalCalib = CaloClusterLocalCalib ("LocalCalib")
113 LocalCalib.ClusterClassificationTool = [LCClassify]
114 LocalCalib.ClusterRecoStatus = [1,2]
115 LocalCalib.LocalCalibTools = [LCWeight]
116 LocalCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
117
118 # Out-of-cluster corrections
119 LCOut = CaloLCOutOfClusterTool("LCOut")
120 LCOut.CorrectionKey = "OOCCorrection"
121 LCOut.UseEmProbability = False
122 LCOut.UseHadProbability = True
123
124 OOCCalib = CaloClusterLocalCalib ("OOCCalib")
125 OOCCalib.ClusterRecoStatus = [1,2]
126 OOCCalib.LocalCalibTools = [LCOut]
127 OOCCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
128
129 LCOutPi0 = CaloLCOutOfClusterTool("LCOutPi0")
130 LCOutPi0.CorrectionKey = "OOCPi0Correction"
131 LCOutPi0.UseEmProbability = True
132 LCOutPi0.UseHadProbability = False
133
134 OOCPi0Calib = CaloClusterLocalCalib ("OOCPi0Calib")
135 OOCPi0Calib.ClusterRecoStatus = [1,2]
136 OOCPi0Calib.LocalCalibTools = [LCOutPi0]
137
138 OOCPi0Calib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
139
140 # Dead material corrections
141 LCDeadMaterial = CaloLCDeadMaterialTool("LCDeadMaterial")
142 LCDeadMaterial.HadDMCoeffKey = "HadDMCoeff2"
143 LCDeadMaterial.ClusterRecoStatus = 0
144 LCDeadMaterial.WeightModeDM = 2
145 LCDeadMaterial.UseHadProbability = True
146 LCDeadMaterial.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
147
148 DMCalib = CaloClusterLocalCalib ("DMCalib")
149 DMCalib.ClusterRecoStatus = [1,2]
150 DMCalib.LocalCalibTools = [LCDeadMaterial]
151
152 DMCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
153
154 lccalibtools = [
155 LocalCalib,
156 OOCCalib,
157 OOCPi0Calib,
158 DMCalib]
159 return lccalibtools
160
161def getTopoMoments(flags):
162 result=ComponentAccumulator()
163 CaloClusterMomentsMaker=CompFactory.CaloClusterMomentsMaker
164 TopoMoments = CaloClusterMomentsMaker ("TopoMoments")
165 TopoMoments.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
166 from AthenaCommon.SystemOfUnits import deg
167 TopoMoments.MaxAxisAngle = 20*deg
168 TopoMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
169 TopoMoments.MinBadLArQuality = 4000
170 TopoMoments.MomentsNames = ["FIRST_PHI"
171 ,"FIRST_ETA"
172 ,"SECOND_R"
173 ,"SECOND_LAMBDA"
174 ,"DELTA_PHI"
175 ,"DELTA_THETA"
176 ,"DELTA_ALPHA"
177 ,"CENTER_X"
178 ,"CENTER_Y"
179 ,"CENTER_Z"
180 ,"CENTER_MAG"
181 ,"CENTER_LAMBDA"
182 ,"LATERAL"
183 ,"LONGITUDINAL"
184 ,"FIRST_ENG_DENS"
185 ,"ENG_FRAC_EM"
186 ,"ENG_FRAC_MAX"
187 ,"ENG_FRAC_CORE"
188 ,"FIRST_ENG_DENS"
189 ,"SECOND_ENG_DENS"
190 ,"ISOLATION"
191 ,"ENG_BAD_CELLS"
192 ,"N_BAD_CELLS"
193 ,"N_BAD_CELLS_CORR"
194 ,"BAD_CELLS_CORR_E"
195 ,"BADLARQ_FRAC"
196 ,"ENG_POS"
197 ,"SIGNIFICANCE"
198 ,"CELL_SIGNIFICANCE"
199 ,"CELL_SIG_SAMPLING"
200 ,"AVG_LAR_Q"
201 ,"AVG_TILE_Q"
202 ,"PTD"
203 ,"MASS"
204 ,"SECOND_TIME"
205 ,"NCELL_SAMPLING"
206 ]
207
208
209 if not flags.Common.isOnline:
210 from LArConfiguration.LArElecCalibDBConfig import LArElecCalibDBCfg
211 result.merge(LArElecCalibDBCfg(flags,["HVScaleCorr"]))
212 if flags.Input.isMC:
213 TopoMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
214 else:
215 TopoMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed")
216 TopoMoments.MomentsNames += ["ENG_BAD_HV_CELLS"
217 ,"N_BAD_HV_CELLS"
218 ]
219
220 TopoMoments.UseGPUCriteria = flags.Calo.TopoCluster.UseGPUCompatibleCriteria
221
222 result.setPrivateTools(TopoMoments)
223 return result
224
225# a.k.a. DigiTruth
227 CaloClusterMomentsMaker_DigiHSTruth=CompFactory.CaloClusterMomentsMaker_DigiHSTruth
228 TopoMoments_Truth = CaloClusterMomentsMaker_DigiHSTruth ("TopoMoments_Truth")
229 TopoMoments_Truth.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
230 from AthenaCommon.SystemOfUnits import deg
231 TopoMoments_Truth.MaxAxisAngle = 20*deg
232 TopoMoments_Truth.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
233 TopoMoments_Truth.MinBadLArQuality = 4000
234 TopoMoments_Truth.MomentsNames = ["FIRST_PHI_DigiHSTruth"
235 ,"FIRST_ETA_DigiHSTruth"
236 ,"SECOND_R_DigiHSTruth"
237 ,"SECOND_LAMBDA_DigiHSTruth"
238 ,"DELTA_PHI_DigiHSTruth"
239 ,"DELTA_THETA_DigiHSTruth"
240 ,"DELTA_ALPHA_DigiHSTruth"
241 ,"CENTER_X_DigiHSTruth"
242 ,"CENTER_Y_DigiHSTruth"
243 ,"CENTER_Z_DigiHSTruth"
244 ,"CENTER_MAG_DigiHSTruth"
245 ,"CENTER_LAMBDA_DigiHSTruth"
246 ,"LATERAL_DigiHSTruth"
247 ,"LONGITUDINAL_DigiHSTruth"
248 ,"ENG_FRAC_CORE_DigiHSTruth"
249 ,"FIRST_ENG_DENS_DigiHSTruth"
250 ,"SECOND_ENG_DENS_DigiHSTruth"
251 ,"ISOLATION_DigiHSTruth"
252 ,"BAD_CELLS_CORR_E_DigiHSTruth"
253 ,"ENG_POS_DigiHSTruth"
254 ,"SIGNIFICANCE_DigiHSTruth"
255 ,"CELL_SIGNIFICANCE_DigiHSTruth"
256 ,"CELL_SIG_SAMPLING_DigiHSTruth"
257 ,"AVG_LAR_Q_DigiHSTruth"
258 ,"AVG_TILE_Q_DigiHSTruth"
259 ,"ENERGY_DigiHSTruth"
260 ,"PHI_DigiHSTruth"
261 ,"ETA_DigiHSTruth"
262 ]
263 return TopoMoments_Truth
264
266 CaloCalibClusterMomentsMaker2=CompFactory.CaloCalibClusterMomentsMaker2
267 TopoCalibMoments = CaloCalibClusterMomentsMaker2 ("TopoCalibMoments")
268 TopoCalibMoments.MomentsNames = ["ENG_CALIB_TOT"
269 ,"ENG_CALIB_OUT_L"
270 ,"ENG_CALIB_OUT_T"
271 ,"ENG_CALIB_EMB0"
272 ,"ENG_CALIB_EME0"
273 ,"ENG_CALIB_TILEG3"
274 ,"ENG_CALIB_DEAD_TOT"
275 ,"ENG_CALIB_DEAD_EMB0"
276 ,"ENG_CALIB_DEAD_TILE0"
277 ,"ENG_CALIB_DEAD_TILEG3"
278 ,"ENG_CALIB_DEAD_EME0"
279 ,"ENG_CALIB_DEAD_HEC0"
280 ,"ENG_CALIB_DEAD_FCAL"
281 ,"ENG_CALIB_DEAD_LEAKAGE"
282 ,"ENG_CALIB_DEAD_UNCLASS"
283 ,"ENG_CALIB_FRAC_EM"
284 ,"ENG_CALIB_FRAC_HAD"
285 ,"ENG_CALIB_FRAC_REST"]
286
287 TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive"
288 ,"LArCalibrationHitActive"
289 ,"TileCalibHitActiveCell"
290 ,"TileCalibHitInactiveCell"]
291 TopoCalibMoments.DMCalibrationHitContainerNames = ["LArCalibrationHitDeadMaterial"
292 ,"TileCalibHitDeadMaterial"]
293 return TopoCalibMoments
294
295def CaloTopoClusterToolCfg(flags, cellsname):
296 result=ComponentAccumulator()
297 # maker tools
298 TopoMaker = CompFactory.CaloTopoClusterMaker("TopoMaker")
299
300 TopoMaker.CellsName = cellsname
301 TopoMaker.CalorimeterNames=["LAREM",
302 "LARHEC",
303 "LARFCAL",
304 "TILE"]
305 # cells from the following samplings will be able to form
306 # seeds. By default no sampling is excluded
307 TopoMaker.SeedSamplingNames = ["PreSamplerB", "EMB1", "EMB2", "EMB3",
308 "PreSamplerE", "EME1", "EME2", "EME3",
309 "HEC0", "HEC1","HEC2", "HEC3",
310 "TileBar0", "TileBar1", "TileBar2",
311 "TileExt0", "TileExt1", "TileExt2",
312 "TileGap1", "TileGap2", "TileGap3",
313 "FCAL0", "FCAL1", "FCAL2"]
314 TopoMaker.NeighborOption = "super3D"
315 TopoMaker.RestrictHECIWandFCalNeighbors = False
316 TopoMaker.RestrictPSNeighbors = True
317 TopoMaker.CellThresholdOnEorAbsEinSigma = 0.0
318 TopoMaker.NeighborThresholdOnEorAbsEinSigma = 2.0
319 TopoMaker.SeedThresholdOnEorAbsEinSigma = 4.0
320
321 #timing
322 TopoMaker.SeedCutsInT = flags.Calo.TopoCluster.doTimeCut
323 TopoMaker.CutOOTseed = flags.Calo.TopoCluster.extendTimeCut and flags.Calo.TopoCluster.doTimeCut
324 TopoMaker.UseTimeCutUpperLimit = flags.Calo.TopoCluster.useUpperLimitForTimeCut
325 TopoMaker.TimeCutUpperLimit = flags.Calo.TopoCluster.timeCutUpperLimit
326 TopoMaker.XTalkEM2 = flags.Calo.TopoCluster.xtalkEM2
327 TopoMaker.XTalkEM2D = flags.Calo.TopoCluster.xtalkEM2D
328 TopoMaker.XTalkEM2n = flags.Calo.TopoCluster.xtalkEM2n
329 TopoMaker.XTalkEM3 = flags.Calo.TopoCluster.xtalkEM3
330 TopoMaker.XTalkEMEta = flags.Calo.TopoCluster.xtalkEMEta
331 TopoMaker.XTalkDeltaT = flags.Calo.TopoCluster.xtalkDeltaT
332 TopoMaker.XTalk2Eratio1 = flags.Calo.TopoCluster.xtalk2Eratio1
333 TopoMaker.XTalk2Eratio2 = flags.Calo.TopoCluster.xtalk2Eratio2
334 TopoMaker.XTalk3Eratio = flags.Calo.TopoCluster.xtalk3Eratio
335 TopoMaker.XTalkEtaEratio = flags.Calo.TopoCluster.xtalkEtaEratio
336 TopoMaker.XTalk2DEratio = flags.Calo.TopoCluster.xtalk2DEratio
337
338 # note E or AbsE
339 #
340 # the following properties must be set to TRUE in order to make double
341 # sided cuts on the seed and the cluster level
342 #
343 TopoMaker.SeedCutsInAbsE = True
344 TopoMaker.ClusterCutsInAbsEt = True
345 TopoMaker.ClusterEtorAbsEtCut = 0.0*MeV
346 # use 2-gaussian or single gaussian noise for TileCal
347 TopoMaker.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
348
349 TopoMaker.UseGPUCriteria = flags.Calo.TopoCluster.UseGPUCompatibleCriteria
350
351 result.setPrivateTools(TopoMaker)
352 return result
353
355 result=ComponentAccumulator()
356 TopoSplitter = CompFactory.CaloTopoClusterSplitter("TopoSplitter")
357 # cells from the following samplings will be able to form local
358 # maxima. The excluded samplings are PreSamplerB, EMB1,
359 # PreSamplerE, EME1, all Tile samplings, all HEC samplings and the
360 # two rear FCal samplings.
361 #
362 TopoSplitter.SamplingNames = ["EMB2", "EMB3",
363 "EME2", "EME3",
364 "FCAL0"]
365 # cells from the following samplings will also be able to form
366 # local maxima but only if they are not overlapping in eta and phi
367 # with local maxima in previous samplings from the primary list.
368 #
369 TopoSplitter.SecondarySamplingNames = ["EMB1","EME1",
370 "TileBar0","TileBar1","TileBar2",
371 "TileExt0","TileExt1","TileExt2",
372 "HEC0","HEC1","HEC2","HEC3",
373 "FCAL1","FCAL2"]
374 TopoSplitter.ShareBorderCells = True
375 TopoSplitter.RestrictHECIWandFCalNeighbors = False
376 TopoSplitter.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
377
378 TopoSplitter.UseGPUCriteria = flags.Calo.TopoCluster.UseGPUCompatibleCriteria
379
380 result.setPrivateTools(TopoSplitter)
381 return result
382
383def CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters"):
384 """
385 Configures topo clustering
386
387 If output writing is enabled (ESD,AOD) the topo clusters are added to them
388 """
389 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
390 if clustersname is None:
391 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
392
393
394 if clustersname=="CaloTopoClusters" and doLCCalib is True:
395 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
396
397 result=ComponentAccumulator()
398
399 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
400 from TileGeoModel.TileGMConfig import TileGMCfg
401 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
402 # Schedule total noise cond alg
403 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
404 # Schedule electronic noise cond alg (needed for LC weights)
405 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
406
407 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
408
409 result.merge(LArGMCfg(flags))
410
411 result.merge(TileGMCfg(flags))
412
413 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname))
414 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
415 #
416 # the following options are not set, since these are the default
417 # values
418 #
419 # NeighborOption = "super3D",
420 # NumberOfCellsCut = 4,
421 # EnergyCut = 500*MeV,
422
423 CaloTopoCluster=CaloClusterMaker(clustersname+"Maker")
424 CaloTopoCluster.ClustersOutputName=clustersname
425
426 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
427
428 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
429 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
430 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
431 BadChannelListCorr = CaloClusterBadChannelList(badChannelTool = caloBadChanTool)
432 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
433
434 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
435 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
436
437
438 if flags.Calo.TopoCluster.doCalibHitMoments:
439 calibHitsMomentsMaker=getTopoCalibMoments(flags)
440 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
441 if clustersname == "CaloTopoClusters":
442 caloCalibTruthMapMaker = CaloCalibClusterTruthMapMakerTool(flags)
443 caloCalibDecorator = CaloCalibHitDecoratorTool(flags)
444 caloCalibDecoratorFullEnergy = CaloCalibHitDecoratorFullEnergyTool(flags)
445 caloCalibDecoratorOOC = CaloCalibHitDecoratorToolOOC(flags)
446 CaloTopoCluster.ClusterCorrectionTools += [caloCalibTruthMapMaker, caloCalibDecorator, caloCalibDecoratorFullEnergy,caloCalibDecoratorOOC]
447
448
449
450 if doLCCalib:
451 theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=True,FinalClusterContainerName=clustersname)
452 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
453 #if not clustersname:
454 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
455
456 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
457 result.merge(caloTopoCoolFolderCfg(flags))
458
459
460 result.addEventAlgo(CaloTopoCluster,primary=True)
461
462 if CaloTopoCluster.ClustersOutputName in flags.Calo.TopoCluster.skipWriteList:
463 # don't add these clusters to ESD and AOD
464 return result
465
466
467 #Output config:
468 AODMoments=[ "SECOND_R"
469 ,"SECOND_LAMBDA"
470 ,"CENTER_MAG"
471 ,"CENTER_LAMBDA"
472 ,"FIRST_ENG_DENS"
473 ,"ENG_FRAC_MAX"
474 ,"ISOLATION"
475 ,"ENG_BAD_CELLS"
476 ,"N_BAD_CELLS"
477 ,"BADLARQ_FRAC"
478 ,"ENG_POS"
479 ,"SIGNIFICANCE"
480 ,"AVG_LAR_Q"
481 ,"AVG_TILE_Q"
482 ,"EM_PROBABILITY"
483 ,"BadChannelList"
484 ,"SECOND_TIME"
485 ,"NCELL_SAMPLING"]
486
487 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
488 AODMoments += ["LATERAL"
489 ,"LONGITUDINAL"
490 ,"CELL_SIGNIFICANCE"
491 ,"PTD"
492 ,"MASS"]
493
494 if flags.Reco.EnableHI:
495 AODMoments += ["CELL_SIG_SAMPLING"]
496
497 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
498 AODMoments += ["ENG_CALIB_TOT"
499 ,"ENG_CALIB_OUT_L"
500 ,"ENG_CALIB_OUT_T"
501 ,"ENG_CALIB_EMB0"
502 ,"ENG_CALIB_EME0"
503 ,"ENG_CALIB_TILEG3"
504 ,"ENG_CALIB_DEAD_TOT"
505 ,"ENG_CALIB_DEAD_EMB0"
506 ,"ENG_CALIB_DEAD_TILE0"
507 ,"ENG_CALIB_DEAD_TILEG3"
508 ,"ENG_CALIB_DEAD_EME0"
509 ,"ENG_CALIB_DEAD_HEC0"
510 ,"ENG_CALIB_DEAD_FCAL"
511 ,"ENG_CALIB_DEAD_LEAKAGE"
512 ,"ENG_CALIB_DEAD_UNCLASS"
513 ,"ENG_CALIB_FRAC_EM"
514 ,"ENG_CALIB_FRAC_HAD"
515 ,"ENG_CALIB_FRAC_REST"]
516
517
518 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
519 toESD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
520 f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
521 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
522 toAOD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
523 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
524
525 AODMoments.append("CellLink") #Add data-link to cell-link container
526 if flags.Calo.TopoCluster.addCalibrationHitDecoration: #Add calib hit deco if requried
527 AODMoments.append(flags.Calo.TopoCluster.CalibrationHitDecorationName)
528
529 if flags.Calo.TopoCluster.addCPData:
530 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
531
532 auxItems = f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
533 auxItems+= ".".join(AODMoments)
534
535 toAOD.append(auxItems)
536
537 result.merge(addToESD(flags, toESD))
538 result.merge(addToAOD(flags, toAOD))
539
540 return result
541
542def addSnapshot(topomaker, corrName,contName):
543 from AthenaCommon.Logging import logging
544 mlog = logging.getLogger('CaloTopoClusterConfig:addSnapshot')
545 corrTools=topomaker.ClusterCorrectionTools
546 newCorrTools=[]
547 found=False
548 for t in corrTools:
549 newCorrTools.append(t)
550 if (t.getName()==corrName):
551 newSnapshot=CompFactory.CaloClusterSnapshot("Snapshot_"+corrName,OutputName=contName,FinalClusterContainerName=topomaker.ClustersOutputName)
552 newCorrTools.append(newSnapshot)
553 found=True
554 if not found:
555 mlog.error("Did not find cluster correction tool %s", corrName)
556 else:
557 mlog.info("Added cluster snapshot after correction tool %s", corrName)
558 topomaker.ClusterCorrectionTools = newCorrTools
559 topomaker.ClusterCorrectionTools += [newSnapshot]
560 return
561
562# Run with python -m CaloRec.CaloTopoClusterConfig
564 if flags is None:
565 from AthenaConfiguration.AllConfigFlags import initConfigFlags
566 flags = initConfigFlags()
567 from AthenaConfiguration.TestDefaults import defaultTestFiles
568 flags.Input.Files = defaultTestFiles.ESD_RUN3_MC
569 flags.Output.ESDFileName="esdOut.pool.root"
570 flags.Exec.MaxEvents = 10
571 flags.fillFromArgs()
572 flags.lock()
573
574 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
575 cfg = MainServicesCfg(flags)
576
577 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
578 cfg.merge(PoolReadCfg(flags))
579
580 topoAcc = CaloTopoClusterCfg(flags)
581 #topoAcc = CaloTopoClusterCfg(flags)
582 topoAlg = topoAcc.getPrimary()
583 topoAlg.ClustersOutputName = "CaloCalTopoClustersNew"
584 cfg.merge(topoAcc)
585
586
587 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
588 cfg.merge(OutputStreamCfg(flags,"xAOD", ItemList = ["xAOD::CaloClusterContainer#CaloCalTopoClusters*",
589 "xAOD::CaloClusterAuxContainer#*CaloCalTopoClusters*Aux.",
590 ]))
591
592 ThinNegativeEnergyCaloClustersAlg=CompFactory.ThinNegativeEnergyCaloClustersAlg
593 theNegativeEnergyCaloClustersThinner = ThinNegativeEnergyCaloClustersAlg(
594 "ThinNegativeEnergyCaloClustersAlg",
595 CaloClustersKey=topoAlg.ClustersOutputName,
596 ThinNegativeEnergyCaloClusters = True,
597 StreamName = 'StreamAOD'
598 )
599 cfg.addEventAlgo(theNegativeEnergyCaloClustersThinner,"AthAlgSeq")
600
601 cfg.addEventAlgo(CompFactory.ClusterDumper("TopoDumper",ContainerName=topoAlg.ClustersOutputName,FileName="TopoClusters.txt",
602 ReducedPrecision=True),sequenceName="AthAlgSeq")
603
604 return cfg.run().isSuccess()
605
606if __name__=="__main__":
607
608 import sys, subprocess
610 if stat==0:
611 print ("Executing returned StatusCode FAILURE")
612 sys.exit(-1)
613
614 else:
615 from AthenaCommon.Utils.unixtools import find_datafile
616 import os
617 refFile=find_datafile("CaloRec/CaloRec-00-00-01/TopoClusters.txt.ref",pathlist=os.getenv("DATAPATH").split(":"))
618 if not refFile or refFile=="":
619 print ("Did not find reference file!")
620 sys.exit(-1)
621 print ("Comparing output with reference file ", refFile)
622 stat=subprocess.check_call(["diff","TopoClusters.txt",refFile])
623 if stat!=0:
624 print ("Output difference found")
625 sys.exit(-1)
626 else:
627 print("Output indentical to reference")
628
629 sys.exit(0)
void print(char *figname, TCanvas *c1)
Tool creating lookup maps for calibration hit truth information.
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.
classify clusters according to their probability to stem from an em object
dead material correction tool for local hadronic calibration
calculates out-of-cluster corrections based on cluster quantities
calculates hadronic cell weights based on cluster and cell quantities
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
CaloCalibHitDecoratorFullEnergyTool(flags, name="CaloCalibClusterDecoratorTool_Full", **kwargs)
CaloCalibHitDecoratorTool(flags, name="CaloCalibClusterDecoratorTool", **kwargs)
CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters")
CaloCalibClusterTruthMapMakerTool(flags, name="CaloCalibClusterTruthMapMakerTool", **kwargs)
addSnapshot(topomaker, corrName, contName)
CaloCalibHitDecoratorToolOOC(flags, name="CaloCalibClusterDecoratorToolOOC", **kwargs)