diff --git a/Trigger/EFTracking/EFTrackingFPGAIntegration/python/BenchmarkConfig.py b/Trigger/EFTracking/EFTrackingFPGAIntegration/python/BenchmarkConfig.py index 316f94fa9122a9908ddb517f63927acf7f6871c5..801c932e0f8c57d1a90e1db1adf64760d3ebd5b0 100644 --- a/Trigger/EFTracking/EFTrackingFPGAIntegration/python/BenchmarkConfig.py +++ b/Trigger/EFTracking/EFTrackingFPGAIntegration/python/BenchmarkConfig.py @@ -19,6 +19,12 @@ def BenchmarkCfg(flags, name = 'BenckmarkAlg', **kwarg): testVectorTool = acc.popToolsAndMerge(FPGATestVectorToolCfg(flags)) kwarg.setdefault('TestVectorTool', testVectorTool) + acc.addService(CompFactory.ChronoStatSvc( + PrintUserTime = True, + PrintSystemTime = True, + PrintEllapsedTime = True + )) + acc.addEventAlgo(CompFactory.EFTrackingFPGAIntegration.BenchmarkAlg(**kwarg)) return acc @@ -26,26 +32,86 @@ def BenchmarkCfg(flags, name = 'BenckmarkAlg', **kwarg): if __name__ == "__main__": from AthenaConfiguration.AllConfigFlags import initConfigFlags - from AthenaConfiguration.MainServicesConfig import MainServicesCfg - flags = initConfigFlags() + + # Add FPGA Integration flags + from EFTrackingFPGAIntegration.IntegrationConfigFlag import addFPGADataPrepFlags + addFPGADataPrepFlags(flags) + + flags.Detector.EnableCalo = False + flags.FPGADataPrep.DoActs = True + + # DataPreparation Pipeline doesn't do spacepoint fomration, we need ACTS to do it + flags.FPGADataPrep.PassThrough.ClusterOnly = True + # For Spacepoint formation + if flags.FPGADataPrep.PassThrough.ClusterOnly: + flags.Detector.EnableITkPixel = True + flags.Detector.EnableITkStrip = True + flags.Acts.useCache = False + flags.Tracking.ITkMainPass.doActsSeed = True + + flags.Tracking.ITkMainPass.doAthenaToActsCluster = True + flags.Tracking.ITkMainPass.doAthenaToActsSpacePoint = True + flags.Tracking.ITkMainPass.doAthenaSpacePoint = True + flags.Concurrency.NumThreads = 1 # dummy input to retrieve EventInfo - flags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/RDO/ATLAS-P2-RUN4-03-00-00/mc21_14TeV.900498.PG_single_muonpm_Pt100_etaFlatnp0_43.recon.RDO.e8481_s4149_r14697/RDO.33675668._000016.pool.root.1"] + flags.Input.Files = ["/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/PhaseIIUpgrade/EFTracking/ATLAS-P2-RUN4-03-00-00/RDO/reg0_singlemu.root"] flags.Output.AODFileName = "PassthroughAOD.pool.root" flags.lock() + flags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.ITkMainPass", keepOriginal=True) kwarg = {} + from AthenaConfiguration.MainServicesConfig import MainServicesCfg cfg = MainServicesCfg(flags) from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg cfg.merge(PoolReadCfg(flags)) + + # Check if the input file is RDO or AOD by instepecting if the file contains "RDO" or "AOD" + isRDO = False + if "RDO" in flags.Input.Files[0] or isRDO: + print("The input is an RDO, running the ITk Reco chain") + + #Truth + if flags.Input.isMC: + from xAODTruthCnv.xAODTruthCnvConfig import GEN_AOD2xAODCfg + cfg.merge(GEN_AOD2xAODCfg(flags)) + + # Standard reco + from InDetConfig.ITkTrackRecoConfig import ITkTrackRecoCfg + cfg.merge(ITkTrackRecoCfg(flags)) + + from InDetConfig.InDetPrepRawDataToxAODConfig import TruthParticleIndexDecoratorAlgCfg + cfg.merge( TruthParticleIndexDecoratorAlgCfg(flags) ) + + elif "AOD" in flags.Input.Files[0]: + print("The input is an AOD, skipping the ITk Reco chain") + + else: + print("Cannot determine the input file type. Assuming it's an AOD. Set the isRDO option manully if it's not.") acc = BenchmarkCfg(flags, **kwarg) cfg.merge(acc) + OutputItemList = [ + "xAOD::StripClusterContainer#FPGAStripClusters", + "xAOD::StripClusterAuxContainer#FPGAStripClustersAux.", + "xAOD::PixelClusterContainer#FPGAPixelClusters", + "xAOD::PixelClusterAuxContainer#FPGAPixelClustersAux.", + ] + + # Connection to ACTS + if flags.FPGADataPrep.DoActs: + from EFTrackingFPGAIntegration.DataPrepToActsConfig import DataPrepToActsCfg + cfg.merge(DataPrepToActsCfg(flags)) + OutputItemList += [ + "xAOD::TrackParticleContainer#FPGATrackParticles", + "xAOD::TrackParticleAuxContainer#FPGATrackParticlesAux." + ] + from EFTrackingFPGAIntegration.FPGAOutputValidationConfig import FPGAOutputValidationCfg cfg.merge(FPGAOutputValidationCfg(flags, **{ "pixelKeys": ["FPGAPixelClusters", "ITkPixelClusters"], @@ -63,13 +129,6 @@ if __name__ == "__main__": MetadataCategory.IOVMetaData,],)) from OutputStreamAthenaPool.OutputStreamConfig import addToAOD - OutputItemList = [ - "xAOD::StripClusterContainer#FPGAStripClusters", - "xAOD::StripClusterAuxContainer#FPGAStripClustersAux.", - "xAOD::PixelClusterContainer#FPGAPixelClusters", - "xAOD::PixelClusterAuxContainer#FPGAPixelClustersAux.", - ] - cfg.merge(addToAOD(flags, OutputItemList)) cfg.run(1) \ No newline at end of file diff --git a/Trigger/EFTracking/EFTrackingFPGAIntegration/python/IntegrationConfigFlag.py b/Trigger/EFTracking/EFTrackingFPGAIntegration/python/IntegrationConfigFlag.py index 490adc5c9f6b7e9edd6211ad522d170d39532626..49a8d833ecb5deec21b1426093213301471478b2 100644 --- a/Trigger/EFTracking/EFTrackingFPGAIntegration/python/IntegrationConfigFlag.py +++ b/Trigger/EFTracking/EFTrackingFPGAIntegration/python/IntegrationConfigFlag.py @@ -1,11 +1,9 @@ -# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration # @author: Zhaoyuan.Cui@cern.ch # @date: Nov. 22, 2024 # @brief: Customized flags for FPGA data preparation pipeline -def addFPGADataPrepFlags(): - from AthenaConfiguration.AllConfigFlags import initConfigFlags - flags = initConfigFlags() +def addFPGADataPrepFlags(flags): flags.addFlag("FPGADataPrep.DoActs", True) flags.addFlag("FPGADataPrep.FPGA.RunPixelClustering", True) @@ -18,4 +16,5 @@ def addFPGADataPrepFlags(): flags.addFlag("FPGADataPrep.PassThrough.MaxClusterNum", 500000) flags.addFlag("FPGADataPrep.PassThrough.MaxSpacePointNum", 500000) - return flags \ No newline at end of file + + return flags diff --git a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.cxx b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.cxx index 675bab26f4321173cd8f0d186b892897594f34ee..562a556fa6d1f222659cb3ab5ec8db82d39e8f1b 100644 --- a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.cxx +++ b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.cxx @@ -44,7 +44,7 @@ namespace EFTrackingFPGAIntegration ATH_CHECK(m_inputPixelClusterKey.initialize()); ATH_CHECK(m_inputStripClusterKey.initialize()); - ATH_CHECK(m_xaodContainerMaker.retrieve()); + ATH_CHECK(m_xaodClusterMaker.retrieve()); ATH_CHECK(m_testVectorTool.retrieve()); return StatusCode::SUCCESS; } @@ -98,9 +98,9 @@ namespace EFTrackingFPGAIntegration acc_queue.finish(); } - // use 32-bit point to access output - uint32_t *stripClusters = (uint32_t *)stripOutput.data(); - uint32_t *pixelClusters = (uint32_t *)pixelOutput.data(); + // use 64-bit pointer to access output + uint64_t *stripClusters = stripOutput.data(); + uint64_t *pixelClusters = pixelOutput.data(); unsigned int numStripClusters = stripClusters[0]; ATH_MSG_DEBUG("numStripClusters: " << numStripClusters); @@ -131,53 +131,53 @@ namespace EFTrackingFPGAIntegration { rdoCounter = 0; row = 0; // idhash - scAux.idHash.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.idHash.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 1; // id - scAux.id.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.id.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 2; // rdo w1 - rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - scAux.rdoList.push_back(rdo << 32); + scAux.rdoList.push_back(rdo); rdoCounter++; } row = 3; // rdo w2 - rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - scAux.rdoList.push_back(rdo << 32); + scAux.rdoList.push_back(rdo); rdoCounter++; } row = 4; // rdo w3 - rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - scAux.rdoList.push_back(rdo << 32); + scAux.rdoList.push_back(rdo); rdoCounter++; } row = 5; // rdo w4 - rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - scAux.rdoList.push_back(rdo << 32); + scAux.rdoList.push_back(rdo); rdoCounter++; } row = 6; // local x - scAux.localPosition.push_back(*(float *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.localPosition.push_back(*(double *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 8; // local covariance xx - scAux.localCovariance.push_back(*(float *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.localCovariance.push_back(*(double *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 9; // global x - scAux.globalPosition.push_back(*(float *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.globalPosition.push_back(*(double *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 10; // global y - scAux.globalPosition.push_back(*(float *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.globalPosition.push_back(*(double *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 11; // global z - scAux.globalPosition.push_back(*(float *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.globalPosition.push_back(*(double *)&stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 12; // channels in phi - scAux.channelsInPhi.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + scAux.channelsInPhi.push_back(stripClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); metadata->scRdoIndex[i] = rdoCounter; } - ATH_CHECK(m_xaodContainerMaker->makeStripClusterContainer(scAux, metadata.get(), ctx)); + ATH_CHECK(m_xaodClusterMaker->makeStripClusterContainer(scAux, metadata.get(), ctx)); // print out the strip cluster aux input if (msgLvl(MSG::DEBUG)) { @@ -203,86 +203,86 @@ namespace EFTrackingFPGAIntegration { rdoCounter = 0; row = 0; // id hash - pcAux.idHash.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.idHash.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 1; // id - pcAux.id.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.id.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 2; // rdo w1 - rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - pcAux.rdoList.push_back(rdo << 32); + pcAux.rdoList.push_back(rdo); rdoCounter++; } row = 3; // rdo w2 - rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - pcAux.rdoList.push_back(rdo << 32); + pcAux.rdoList.push_back(rdo); rdoCounter++; } row = 4; // rdo w3 - rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - pcAux.rdoList.push_back(rdo << 32); + pcAux.rdoList.push_back(rdo); rdoCounter++; } row = 5; // rdo w4 - rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]; + rdo = pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]; if (rdo) { - pcAux.rdoList.push_back(rdo << 32); + pcAux.rdoList.push_back(rdo); rdoCounter++; } row = 6; // local x - pcAux.localPosition.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.localPosition.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 7; // local y - pcAux.localPosition.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.localPosition.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 8; // local covariance xx - pcAux.localCovariance.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.localCovariance.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 9; // local covariance yy - pcAux.localCovariance.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.localCovariance.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 10; // global x - pcAux.globalPosition.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.globalPosition.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 11; // global y - pcAux.globalPosition.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.globalPosition.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 12; // global z - pcAux.globalPosition.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.globalPosition.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 13; // channels in phi - pcAux.channelsInPhi.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.channelsInPhi.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 14; // channels in eta - pcAux.channelsInEta.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.channelsInEta.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 15; // width in eta - pcAux.widthInEta.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.widthInEta.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 16; // omega x - pcAux.omegaX.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.omegaX.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 17; // omega y - pcAux.omegaY.push_back(*(float *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.omegaY.push_back(*(double *)&pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); row = 18; // total ToT - pcAux.totalToT.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 1]); + pcAux.totalToT.push_back(pixelClusters[row * EFTrackingTransient::MAX_NUM_CLUSTERS + i + 8]); metadata->pcRdoIndex[i] = rdoCounter; } - ATH_CHECK(m_xaodContainerMaker->makePixelClusterContainer(pcAux, metadata.get(), ctx)); + ATH_CHECK(m_xaodClusterMaker->makePixelClusterContainer(pcAux, metadata.get(), ctx)); // print out pixel cluster aux input if (msgLvl(MSG::DEBUG)) diff --git a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.h b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.h index b93ab06eae7ef8cb2a11de04bba72cea6b2057f5..70064d482396403103f79ea984a212e62d566f91 100644 --- a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.h +++ b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/BenchmarkAlg.h @@ -14,7 +14,7 @@ // EFTracking include #include "IntegrationBase.h" -#include "xAODContainerMaker.h" +#include "xAODClusterMaker.h" #include "TestVectorTool.h" #include "GaudiKernel/ServiceHandle.h" @@ -49,11 +49,11 @@ namespace EFTrackingFPGAIntegration ServiceHandle<IChronoSvc> m_chronoSvc{ "ChronoStatSvc", name()}; //!< Service for timing the algorithm - ToolHandle<xAODContainerMaker> m_xaodContainerMaker{ + ToolHandle<xAODClusterMaker> m_xaodClusterMaker{ this, - "xAODContainerMaker", - "xAODContainerMaker", - "Tool for creating xAOD containers"}; //!< Tool for creating xAOD containers + "xAODClusterMaker", + "xAODClusterMaker", + "Tool for creating xAOD cluster containers"}; //!< Tool for creating xAOD containers ToolHandle<TestVectorTool> m_testVectorTool{ this, "TestVectorTool", "TestVectorTool", "Tool for preparing test vectors"}; //!< Tool for preparing test vectors diff --git a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/EFTrackingTransient.h b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/EFTrackingTransient.h index cb7a5c69a848614aa8de1032e228c4d88a522fed..5a724d5f70b9930795db02048ea49e29527981d7 100644 --- a/Trigger/EFTracking/EFTrackingFPGAIntegration/src/EFTrackingTransient.h +++ b/Trigger/EFTracking/EFTrackingFPGAIntegration/src/EFTrackingTransient.h @@ -6,6 +6,7 @@ * @file src/EFTrackingTransient.h * @author zhaoyuan.cui@cern.ch * @author yuan-tang.chou@cern.ch + * @author zhidong.zhang@cern.ch * @date Apr. 22, 2024 * @brief Temporary data struct design for the EF tracking FPGA integration * development @@ -24,14 +25,14 @@ namespace EFTrackingTransient // They might be aligned in the future for efficient device memory usage constexpr unsigned int MAX_NUM_CLUSTERS = 409600; - constexpr unsigned int NUM_PIXEL_WORD = 7; - constexpr unsigned int NUM_STRIP_WORD = 6; + constexpr unsigned int NUM_PIXEL_WORD = 10; + constexpr unsigned int NUM_STRIP_WORD = 9; constexpr unsigned int NUM_PIXEL_ROW = 19; constexpr unsigned int NUM_STRIP_ROW = 14; constexpr unsigned long PIXEL_BLOCK_BUF_SIZE = NUM_PIXEL_WORD * MAX_NUM_CLUSTERS; constexpr unsigned long STRIP_BLOCK_BUF_SIZE = NUM_STRIP_WORD * MAX_NUM_CLUSTERS; - constexpr unsigned long PIXEL_CONTAINER_BUF_SIZE = (NUM_PIXEL_ROW + 1) / 2 * MAX_NUM_CLUSTERS; - constexpr unsigned long STRIP_CONTAINER_BUF_SIZE = (NUM_STRIP_ROW + 1) / 2 * MAX_NUM_CLUSTERS; + constexpr unsigned long PIXEL_CONTAINER_BUF_SIZE = (NUM_PIXEL_ROW * MAX_NUM_CLUSTERS + 4096); //+4096 for numClusters with alignment + constexpr unsigned long STRIP_CONTAINER_BUF_SIZE = (NUM_STRIP_ROW * MAX_NUM_CLUSTERS + 4096); /** * @brief The StripClusters struct contains all xAOD::StripCluster data members