Skip to content
Snippets Groups Projects
Commit 7b045e1a authored by Frank Winklmeier's avatar Frank Winklmeier
Browse files

Merge branch 'update-ACTS-connection' into 'main'

EFTracking FPGA: DataPrep pipeline to ACTS and IDTPM

See merge request !78577
parents c7ddb59b e34e770c
No related branches found
No related tags found
2 merge requests!78577EFTracking FPGA: DataPrep pipeline to ACTS and IDTPM,!76343Draft: MooTrackBuilder: Recalibrate NSW hits in refine method
......@@ -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
# 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
......@@ -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))
......
......@@ -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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment