532 PlotterTool = None, addAsPrimary = True, ReallyUseGPUTools = True):
533
534 doLCCalib = flags.CaloRecGPU.ActiveConfig.doTopoClusterLocalCalib
535
536 if clustersname is None:
537 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
538
539 if clustersname == "CaloTopoClusters" and doLCCalib:
540 raise RuntimeError("Inconsistent arguments: clustersname must not be 'CaloTopoClusters' if doTopoClusterLocalCalib is True")
541
542 clustersname_final = clustersname
543 if flags.CaloRecGPU.ActiveConfig.applyClusterTimingCut:
544 clustersname = f"{clustersname}BeforeTimingCut"
545
546 result = ComponentAccumulator()
547
548 if not instantiateForTrigger:
549
550 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
551 from TileGeoModel.TileGMConfig import TileGMCfg
552 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
553
554 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
555 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
556
557 result.merge(LArGMCfg(flags))
558 result.merge(TileGMCfg(flags))
559
560
561 HybridClusterProcessor = CompFactory.CaloGPUHybridClusterProcessor(name)
562 HybridClusterProcessor.ClustersOutputName = clustersname
563
564 HybridClusterProcessor.WriteTriggerSpecificInfo = instantiateForTrigger
565
566 HybridClusterProcessor.MeasureTimes = flags.CaloRecGPU.ActiveConfig.MeasureTimes
567
568 HybridClusterProcessor.TimeFileOutput = "GlobalTimes.txt"
569
570 HybridClusterProcessor.DeferConstantDataPreparationToFirstEvent = True
571 HybridClusterProcessor.DoPlots = PlotterTool is not None
572 HybridClusterProcessor.PlotterTool = PlotterTool
573
574 HybridClusterProcessor.NumPreAllocatedDataHolders = flags.CaloRecGPU.ActiveConfig.NumPreAllocatedDataHolders
575
576 if ReallyUseGPUTools:
577
578 HybridClusterProcessor.ConstantDataToGPUTool = result.popToolsAndMerge( BasicConstantDataExporterToolCfg(flags) )
579 HybridClusterProcessor.EventDataToGPUTool = result.popToolsAndMerge( BasicEventDataExporterToolCfg(flags, cellsname) )
580 HybridClusterProcessor.GPUToEventDataTool = result.popToolsAndMerge( AthenaClusterAndMomentsImporterToolCfg(flags, cellsname, instantiateForTrigger) )
581
582
583 HybridClusterProcessor.BeforeGPUTools = []
584
585 HybridClusterProcessor.GPUTools = []
586
587 HybridClusterProcessor.GPUTools += [result.popToolsAndMerge( TopoAutomatonClusteringToolCfg(flags,"GPUGrowing"))]
588
589 HybridClusterProcessor.GPUTools += [result.popToolsAndMerge( ClusterInfoCalcToolCfg(flags,"PostGPUGrowingClusterPropertiesCalculator", True))]
590
591 HybridClusterProcessor.GPUTools += [result.popToolsAndMerge( TopoAutomatonSplitterToolCfg(flags,"GPUSplitting") )]
592
593 HybridClusterProcessor.GPUTools += [result.popToolsAndMerge( ClusterSorterToolCfg(flags, "GPUClusterSorting", False) )]
594
595 HybridClusterProcessor.GPUTools += [result.popToolsAndMerge( GPUClusterMomentsCalculatorToolCfg(flags,"GPUTopoMoments") )]
596
597 else:
598
599 HybridClusterProcessor.ConstantDataToGPUTool = None
600 HybridClusterProcessor.EventDataToGPUTool = None
601 HybridClusterProcessor.GPUToEventDataTool = None
602 HybridClusterProcessor.SkipConversions = True
603
604 HybridClusterProcessor.GPUTools = []
605
606 HybridClusterProcessor.BeforeGPUTools = []
607
608 HybridClusterProcessor.BeforeGPUTools += [result.popToolsAndMerge( DefaultTopologicalClusteringToolCfg(flags, cellsname,"CPUGrowing"))]
609
610 HybridClusterProcessor.BeforeGPUTools += [result.popToolsAndMerge( DefaultClusterSplittingToolCfg(flags,"CPUSplitting") )]
611
612 HybridClusterProcessor.BeforeGPUTools += [result.popToolsAndMerge( DefaultClusterMomentsCalculatorToolCfg(flags, instantiateForTrigger, "CPUTopoMoments") )]
613
614 HybridClusterProcessor.BeforeGPUTools += [ CompFactory.CaloClusterStoreRawProperties("RawPropertiesStorer") ]
615
616
617
618 HybridClusterProcessor.AfterGPUTools = []
619
620 if not instantiateForTrigger:
621 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
622 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
623 HybridClusterProcessor.AfterGPUTools += [CompFactory.CaloClusterBadChannelList(badChannelTool = caloBadChanTool)]
624
625 if not instantiateForTrigger and flags.CaloRecGPU.ActiveConfig.doCalibHitMoments:
626
627 calibHitsMomentsMaker = result.popToolsAndMerge(DefaultCalibMomentsToolCfg(flags))
628 HybridClusterProcessor.AfterGPUTools += [calibHitsMomentsMaker]
629
630 if doLCCalib:
631 if not instantiateForTrigger:
632 HybridClusterProcessor.AfterGPUTools += [CompFactory.CaloClusterSnapshot(OutputName=clustersnapname,
633 SetCrossLinks=True,
634 FinalClusterContainerName=clustersname)]
635 else:
636 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
637 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
638 result.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
639 result.merge(caloTopoCoolFolderCfg(flags))
640
641 calibTools = result.popToolsAndMerge(DefaultTopoClusterLocalCalibToolsCfg(flags, instantiateForTrigger, 'Trig' if instantiateForTrigger else ''))
642
643 HybridClusterProcessor.AfterGPUTools += calibTools
644
645
646 if not instantiateForTrigger:
647 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
648 result.merge(caloTopoCoolFolderCfg(flags))
649
650 if instantiateForTrigger:
651 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
652 result.merge(CaloNoiseCondAlgCfg(flags))
653
654 result.addEventAlgo(HybridClusterProcessor, primary=addAsPrimary)
655
656 if flags.CaloRecGPU.ActiveConfig.applyClusterTimingCut:
657 from CaloRec.CaloTopoClusterConfig import CaloClusterTimingFilterCfg
658 result.merge(CaloClusterTimingFilterCfg(flags, name = f"{clustersname}Filter", InputClusters = clustersname, OutputClusters = clustersname_final))
659
660 if instantiateForTrigger or clustersname_final in flags.CaloRecGPU.ActiveConfig.skipWriteList:
661
662 return result
663
664
665 AODMoments=[ "SECOND_R"
666 ,"SECOND_LAMBDA"
667 ,"CENTER_MAG"
668 ,"CENTER_LAMBDA"
669 ,"FIRST_ENG_DENS"
670 ,"ENG_FRAC_MAX"
671 ,"ISOLATION"
672 ,"ENG_BAD_CELLS"
673 ,"N_BAD_CELLS"
674 ,"BADLARQ_FRAC"
675 ,"ENG_POS"
676 ,"SIGNIFICANCE"
677 ,"AVG_LAR_Q"
678 ,"AVG_TILE_Q"
679 ,"EM_PROBABILITY"
680 ,"BadChannelList"
681 ,"SECOND_TIME"
682 ,"NCELL_SAMPLING"]
683
684 if flags.CaloRecGPU.ActiveConfig.writeExtendedClusterMoments:
685 AODMoments += ["LATERAL"
686 ,"LONGITUDINAL"
687 ,"CELL_SIGNIFICANCE"
688 ,"PTD"
689 ,"MASS"]
690
691 if flags.Reco.EnableHI:
692 AODMoments += ["CELL_SIG_SAMPLING"]
693
694 if flags.CaloRecGPU.ActiveConfig.writeCalibHitClusterMoments:
695 AODMoments += ["ENG_CALIB_TOT"
696 ,"ENG_CALIB_OUT_L"
697 ,"ENG_CALIB_OUT_T"
698 ,"ENG_CALIB_EMB0"
699 ,"ENG_CALIB_EME0"
700 ,"ENG_CALIB_TILEG3"
701 ,"ENG_CALIB_DEAD_TOT"
702 ,"ENG_CALIB_DEAD_EMB0"
703 ,"ENG_CALIB_DEAD_TILE0"
704 ,"ENG_CALIB_DEAD_TILEG3"
705 ,"ENG_CALIB_DEAD_EME0"
706 ,"ENG_CALIB_DEAD_HEC0"
707 ,"ENG_CALIB_DEAD_FCAL"
708 ,"ENG_CALIB_DEAD_LEAKAGE"
709 ,"ENG_CALIB_DEAD_UNCLASS"
710 ,"ENG_CALIB_FRAC_EM"
711 ,"ENG_CALIB_FRAC_HAD"
712 ,"ENG_CALIB_FRAC_REST"]
713
714
715 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
716 toESD = [f"xAOD::CaloClusterContainer#{clustersname_final}",
717 f"xAOD::CaloClusterAuxContainer#{clustersname_final}Aux.",
718 f"CaloClusterCellLinkContainer#{clustersname_final}_links"]
719 toAOD = [f"xAOD::CaloClusterContainer#{clustersname_final}",
720 f"CaloClusterCellLinkContainer#{clustersname_final}_links"]
721
722 AODMoments.append("CellLink")
723 if flags.CaloRecGPU.ActiveConfig.addCalibrationHitDecoration:
724 AODMoments.append(flags.CaloRecGPU.ActiveConfig.CalibrationHitDecorationName)
725
726 if flags.CaloRecGPU.ActiveConfig.addCPData:
727 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
728
729 auxItems = f"xAOD::CaloClusterAuxContainer#{clustersname_final}Aux."
730 auxItems+= ".".join(AODMoments)
731
732 toAOD.append(auxItems)
733
734 result.merge(addToESD(flags, toESD))
735 result.merge(addToAOD(flags, toAOD))
736
737
738 return result
739