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