120 CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool=CompFactory.getComps(
"CaloLCClassificationTool",
"CaloLCWeightTool",
"CaloLCOutOfClusterTool",
"CaloLCDeadMaterialTool",)
121 CaloClusterLocalCalib=CompFactory.CaloClusterLocalCalib
124 LCClassify.ClassificationKey =
"EMFracClassify"
125 LCClassify.UseSpread =
False
126 LCClassify.MaxProbability = 0.5
128 LCClassify.StoreClassificationProbabilityInAOD =
True
129 LCClassify.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
132 LCWeight.CorrectionKey =
"H1ClusterCellWeights"
133 LCWeight.SignalOverNoiseCut = 2.0
135 LCWeight.UseHadProbability =
True
137 LocalCalib = CaloClusterLocalCalib (
"LocalCalib")
138 LocalCalib.ClusterClassificationTool = [LCClassify]
139 LocalCalib.ClusterRecoStatus = [1,2]
140 LocalCalib.LocalCalibTools = [LCWeight]
141 LocalCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
145 LCOut.CorrectionKey =
"OOCCorrection"
146 LCOut.UseEmProbability =
False
147 LCOut.UseHadProbability =
True
149 OOCCalib = CaloClusterLocalCalib (
"OOCCalib")
150 OOCCalib.ClusterRecoStatus = [1,2]
151 OOCCalib.LocalCalibTools = [LCOut]
152 OOCCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
155 LCOutPi0.CorrectionKey =
"OOCPi0Correction"
156 LCOutPi0.UseEmProbability =
True
157 LCOutPi0.UseHadProbability =
False
159 OOCPi0Calib = CaloClusterLocalCalib (
"OOCPi0Calib")
160 OOCPi0Calib.ClusterRecoStatus = [1,2]
161 OOCPi0Calib.LocalCalibTools = [LCOutPi0]
163 OOCPi0Calib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
167 LCDeadMaterial.HadDMCoeffKey =
"HadDMCoeff2"
168 LCDeadMaterial.ClusterRecoStatus = 0
169 LCDeadMaterial.WeightModeDM = 2
170 LCDeadMaterial.UseHadProbability =
True
171 LCDeadMaterial.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
173 DMCalib = CaloClusterLocalCalib (
"DMCalib")
174 DMCalib.ClusterRecoStatus = [1,2]
175 DMCalib.LocalCalibTools = [LCDeadMaterial]
177 DMCalib.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
187 result=ComponentAccumulator()
188 CaloClusterMomentsMaker=CompFactory.CaloClusterMomentsMaker
189 TopoMoments = CaloClusterMomentsMaker (
"TopoMoments")
190 TopoMoments.WeightingOfNegClusters = flags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
191 from AthenaCommon.SystemOfUnits
import deg
192 TopoMoments.MaxAxisAngle = 20*deg
193 TopoMoments.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
194 TopoMoments.MinBadLArQuality = 4000
195 TopoMoments.MomentsNames = [
"FIRST_PHI"
234 if not flags.Common.isOnline:
235 from LArConfiguration.LArElecCalibDBConfig
import LArElecCalibDBCfg
236 result.merge(LArElecCalibDBCfg(flags,[
"HVScaleCorr"]))
238 TopoMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey=
"LArHVScaleCorr")
240 TopoMoments.LArHVFraction=CompFactory.LArHVFraction(HVScaleCorrKey=
"LArHVScaleCorrRecomputed")
241 TopoMoments.MomentsNames += [
"ENG_BAD_HV_CELLS"
245 TopoMoments.UseGPUCriteria = flags.Calo.TopoCluster.UseGPUCompatibleCriteria
247 result.setPrivateTools(TopoMoments)
321 result=ComponentAccumulator()
323 TopoMaker = CompFactory.CaloTopoClusterMaker(
"TopoMaker")
325 TopoMaker.CellsName = cellsname
326 TopoMaker.CalorimeterNames=[
"LAREM",
332 TopoMaker.SeedSamplingNames = [
"PreSamplerB",
"EMB1",
"EMB2",
"EMB3",
333 "PreSamplerE",
"EME1",
"EME2",
"EME3",
334 "HEC0",
"HEC1",
"HEC2",
"HEC3",
335 "TileBar0",
"TileBar1",
"TileBar2",
336 "TileExt0",
"TileExt1",
"TileExt2",
337 "TileGap1",
"TileGap2",
"TileGap3",
338 "FCAL0",
"FCAL1",
"FCAL2"]
339 TopoMaker.NeighborOption =
"super3D"
340 TopoMaker.RestrictHECIWandFCalNeighbors =
False
341 TopoMaker.RestrictPSNeighbors =
True
342 TopoMaker.CellThresholdOnEorAbsEinSigma = 0.0
343 TopoMaker.NeighborThresholdOnEorAbsEinSigma = 2.0
344 TopoMaker.SeedThresholdOnEorAbsEinSigma = 4.0
347 TopoMaker.SeedCutsInT = flags.Calo.TopoCluster.doTimeCut
348 TopoMaker.CutOOTseed = flags.Calo.TopoCluster.extendTimeCut
and flags.Calo.TopoCluster.doTimeCut
349 TopoMaker.UseTimeCutUpperLimit = flags.Calo.TopoCluster.useUpperLimitForTimeCut
350 TopoMaker.TimeCutUpperLimit = flags.Calo.TopoCluster.timeCutUpperLimit
351 TopoMaker.XTalkEM2 = flags.Calo.TopoCluster.xtalkEM2
352 TopoMaker.XTalkEM2D = flags.Calo.TopoCluster.xtalkEM2D
353 TopoMaker.XTalkEM2n = flags.Calo.TopoCluster.xtalkEM2n
354 TopoMaker.XTalkEM3 = flags.Calo.TopoCluster.xtalkEM3
355 TopoMaker.XTalkEMEta = flags.Calo.TopoCluster.xtalkEMEta
356 TopoMaker.XTalkDeltaT = flags.Calo.TopoCluster.xtalkDeltaT
357 TopoMaker.XTalk2Eratio1 = flags.Calo.TopoCluster.xtalk2Eratio1
358 TopoMaker.XTalk2Eratio2 = flags.Calo.TopoCluster.xtalk2Eratio2
359 TopoMaker.XTalk3Eratio = flags.Calo.TopoCluster.xtalk3Eratio
360 TopoMaker.XTalkEtaEratio = flags.Calo.TopoCluster.xtalkEtaEratio
361 TopoMaker.XTalk2DEratio = flags.Calo.TopoCluster.xtalk2DEratio
368 TopoMaker.SeedCutsInAbsE =
True
369 TopoMaker.ClusterCutsInAbsEt =
True
370 TopoMaker.ClusterEtorAbsEtCut = 0.0*MeV
372 TopoMaker.TwoGaussianNoise = flags.Calo.TopoCluster.doTwoGaussianNoise
374 TopoMaker.UseGPUCriteria = flags.Calo.TopoCluster.UseGPUCompatibleCriteria
376 result.setPrivateTools(TopoMaker)
408def CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters"):
410 Configures topo clustering
412 If output writing is enabled (ESD,AOD) the topo clusters are added to them
414 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
415 if clustersname
is None:
416 clustersname =
"CaloCalTopoClusters" if doLCCalib
else "CaloTopoClusters"
419 if clustersname==
"CaloTopoClusters" and doLCCalib
is True:
420 raise RuntimeError(
"Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
422 result=ComponentAccumulator()
424 from LArGeoAlgsNV.LArGMConfig
import LArGMCfg
425 from TileGeoModel.TileGMConfig
import TileGMCfg
426 from CaloTools.CaloNoiseCondAlgConfig
import CaloNoiseCondAlgCfg
428 result.merge(CaloNoiseCondAlgCfg(flags,
"totalNoise"))
430 result.merge(CaloNoiseCondAlgCfg(flags,
"electronicNoise"))
432 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps(
"CaloClusterMaker",
"CaloClusterSnapshot",)
434 result.merge(LArGMCfg(flags))
436 result.merge(TileGMCfg(flags))
449 CaloTopoCluster.ClustersOutputName=clustersname
451 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
453 from CaloBadChannelTool.CaloBadChanToolConfig
import CaloBadChanToolCfg
454 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
455 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
457 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
460 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
463 if flags.Calo.TopoCluster.doCalibHitMoments:
465 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
468 caloCalibDecorator.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
469 clustersname +
"." + flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_Visible"
472 caloCalibDecoratorFullEnergy.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
473 clustersname +
"." + flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_Full"
476 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesL = (
477 clustersname +
"." + flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_OOC_L"
479 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesT = (
480 clustersname +
"." + flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_OOC_T"
484 caloCalibDecoratorDM.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesDM = (
485 clustersname +
"." + flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_DM"
488 CaloTopoCluster.ClusterCorrectionTools += [
489 caloCalibTruthMapMaker,
491 caloCalibDecoratorFullEnergy,
492 caloCalibDecoratorOOC,
493 caloCalibDecoratorDM,
499 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
500 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
504 from CaloRec.CaloTopoClusterConfig
import caloTopoCoolFolderCfg
508 result.addEventAlgo(CaloTopoCluster,primary=
True)
510 if CaloTopoCluster.ClustersOutputName
in flags.Calo.TopoCluster.skipWriteList:
516 AODMoments=[
"SECOND_R"
535 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
536 AODMoments += [
"LATERAL"
542 if flags.Reco.EnableHI:
543 AODMoments += [
"CELL_SIG_SAMPLING"]
545 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
546 AODMoments += [
"ENG_CALIB_TOT"
552 ,
"ENG_CALIB_DEAD_TOT"
553 ,
"ENG_CALIB_DEAD_EMB0"
554 ,
"ENG_CALIB_DEAD_TILE0"
555 ,
"ENG_CALIB_DEAD_TILEG3"
556 ,
"ENG_CALIB_DEAD_EME0"
557 ,
"ENG_CALIB_DEAD_HEC0"
558 ,
"ENG_CALIB_DEAD_FCAL"
559 ,
"ENG_CALIB_DEAD_LEAKAGE"
560 ,
"ENG_CALIB_DEAD_UNCLASS"
562 ,
"ENG_CALIB_FRAC_HAD"
563 ,
"ENG_CALIB_FRAC_REST"]
566 from OutputStreamAthenaPool.OutputStreamConfig
import addToAOD, addToESD
567 toESD = [f
"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
568 f
"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
569 f
"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
570 toAOD = [f
"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
571 f
"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
573 AODMoments.append(
"CellLink")
574 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
576 flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_Visible",
577 flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_Full",
578 flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_OOC_L",
579 flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_OOC_T",
580 flags.Calo.TopoCluster.CalibrationHitDecorationName +
"_DM",
583 if flags.Calo.TopoCluster.addCPData:
584 AODMoments += [
"ClusterWidthEta",
"ClusterWidthPhi"]
586 auxItems = f
"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
587 auxItems+=
".".join(AODMoments)
589 toAOD.append(auxItems)
591 result.merge(addToESD(flags, toESD))
592 result.merge(addToAOD(flags, toAOD))
597 from AthenaCommon.Logging
import logging
598 mlog = logging.getLogger(
'CaloTopoClusterConfig:addSnapshot')
599 corrTools=topomaker.ClusterCorrectionTools
603 newCorrTools.append(t)
604 if (t.getName()==corrName):
605 newSnapshot=CompFactory.CaloClusterSnapshot(
"Snapshot_"+corrName,OutputName=contName,FinalClusterContainerName=topomaker.ClustersOutputName)
606 newCorrTools.append(newSnapshot)
609 mlog.error(
"Did not find cluster correction tool %s", corrName)
611 mlog.info(
"Added cluster snapshot after correction tool %s", corrName)
612 topomaker.ClusterCorrectionTools = newCorrTools
613 topomaker.ClusterCorrectionTools += [newSnapshot]
619 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
620 flags = initConfigFlags()
621 from AthenaConfiguration.TestDefaults
import defaultTestFiles
622 flags.Input.Files = defaultTestFiles.ESD_RUN3_MC
623 flags.Output.ESDFileName=
"esdOut.pool.root"
624 flags.Exec.MaxEvents = 10
628 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
629 cfg = MainServicesCfg(flags)
631 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
632 cfg.merge(PoolReadCfg(flags))
636 topoAlg = topoAcc.getPrimary()
637 topoAlg.ClustersOutputName =
"CaloCalTopoClustersNew"
641 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
642 cfg.merge(OutputStreamCfg(flags,
"xAOD", ItemList = [
"xAOD::CaloClusterContainer#CaloCalTopoClusters*",
643 "xAOD::CaloClusterAuxContainer#*CaloCalTopoClusters*Aux.",
646 ThinNegativeEnergyCaloClustersAlg=CompFactory.ThinNegativeEnergyCaloClustersAlg
648 "ThinNegativeEnergyCaloClustersAlg",
649 CaloClustersKey=topoAlg.ClustersOutputName,
650 ThinNegativeEnergyCaloClusters =
True,
651 StreamName =
'StreamAOD'
653 cfg.addEventAlgo(theNegativeEnergyCaloClustersThinner,
"AthAlgSeq")
655 cfg.addEventAlgo(CompFactory.ClusterDumper(
"TopoDumper",ContainerName=topoAlg.ClustersOutputName,FileName=
"TopoClusters.txt",
656 ReducedPrecision=
True),sequenceName=
"AthAlgSeq")
658 return cfg.run().isSuccess()