From e9a4276568990b9c279ec502c6c19f884136675f Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 24 Jul 2024 02:13:29 -0700 Subject: [PATCH 01/54] initiate overlapping SPs in GNNTrackMaker --- .../src/SiSPGNNTrackMaker.cxx | 22 +++++++++++++++++++ .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 844190003b07..a98ca266e772 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -20,6 +20,7 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_CHECK(m_SpacePointsPixelKey.initialize()); ATH_CHECK(m_SpacePointsSCTKey.initialize()); + ATH_CHECK(m_SpacePointsOverlapKey.initialize()); ATH_CHECK(m_outputTracksKey.initialize()); @@ -77,8 +78,26 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } }; + auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ + if (not containerKey.empty()){ + + SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; + + if (collection.isValid()){ + ATH_MSG_DEBUG("Number of overlapping space points: " << collection->size()); + for (const Trk::SpacePoint *sp : *collection) { + spacePoints.push_back(sp); + } + } + } + }; + getData(m_SpacePointsPixelKey); getData(m_SpacePointsSCTKey); + int nNonOverlap = spacePoints.size(); + ATH_MSG_DEBUG("Number of non-overlapping spacepoints: " << nNonOverlap ); + getOverlapData(m_SpacePointsOverlapKey); + ATH_MSG_DEBUG("Number of spacepoints: " << spacePoints.size() ); std::vector<std::vector<uint32_t> > TT; if (m_gnnTrackFinder.isSet()) { @@ -115,6 +134,9 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } const Trk::SpacePoint* sp = spacePoints[id]; + if (id > nNonOverlap) { + ATH_MSG_DEBUG("Track " << trackCounter << " Overlapping Hit " << id << ": (" << sp->globalPosition().x() << ", " << sp->globalPosition().y() << ", " << sp->globalPosition().z() << ")"); + } if (sp != nullptr) { trackCandiate.push_back(sp); clusters.push_back(sp->clusterList().first); diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index 458b7b4ef9f9..cb6defffa63a 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -12,6 +12,7 @@ // data containers #include "TrkSpacePoint/SpacePointContainer.h" +#include "TrkSpacePoint/SpacePointOverlapCollection.h" #include "TrkTrack/TrackCollection.h" // Tool handles @@ -58,6 +59,7 @@ namespace InDet { this, "SpacePointsPixelName", "ITkPixelSpacePoints"}; SG::ReadHandleKey<SpacePointContainer> m_SpacePointsSCTKey{ this, "SpacePointsSCTName", "ITkStripSpacePoints"}; + SG::ReadHandleKey<SpacePointOverlapCollection> m_SpacePointsOverlapKey{this, "SpacePointsOverlapName", "ITkOverlapSpacePoints"}; //@} // output container -- GitLab From b9155543eeae85c8ffee37fe302449aa5b79efed Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 04:44:26 -0800 Subject: [PATCH 02/54] turn off AR --- .../InDetConfig/python/ITkTrackRecoConfig.py | 9 +- .../python/ITkTrackingSiPatternConfig.py | 5 +- .../python/InDetGNNTrackingConfig.py | 13 ++ .../python/InDetGNNTrackingConfigFlags.py | 3 + .../src/GNNTrackReaderTool.cxx | 61 +++++- .../InDetGNNTracking/src/GNNTrackReaderTool.h | 4 + .../src/IGNNTrackReaderTool.h | 3 + .../InDetGNNTracking/src/SeedFitterTool.cxx | 4 +- .../src/SiSPGNNTrackMaker.cxx | 197 +++++++++++++++--- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 12 ++ 10 files changed, 278 insertions(+), 33 deletions(-) diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index ba81c551c125..a82aa1f2bc57 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -346,7 +346,8 @@ def ITkTrackFinalCfg(flags, if doTrackOverlay: #schedule merge to combine signal and background tracks InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer] - + + doGNNWithoutAmbiReso = (hasattr(flags.Tracking, "ITkGNNPass") and flags.Tracking.ITkGNNPass.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution)) # This merges track collections from TrkConfig.TrkTrackCollectionMergerConfig import ( ITkTrackCollectionMergerAlgCfg) @@ -355,7 +356,7 @@ def ITkTrackFinalCfg(flags, InputCombinedTracks=InputCombinedITkTracks, OutputCombinedTracks=TrackContainer, AssociationMapName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else f"PRDtoTrackMapMerge_{TrackContainer}"))) if flags.Tracking.doTruth: @@ -382,10 +383,10 @@ def ITkTrackFinalCfg(flags, result.merge(ITkTrackParticleCnvAlgCfg( flags, ClusterSplitProbabilityName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else splitProbName), AssociationMapName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else f"PRDtoTrackMapMerge_{TrackContainer}"), isActsAmbi = 'ActsValidateResolvedTracks' in splitProbName or \ 'ActsValidateAmbiguityResolution' in splitProbName or \ diff --git a/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py b/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py index 91bd8a3cd316..72b2276dbd9c 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py @@ -115,7 +115,10 @@ def ITkTrackingSiPatternCfg(flags, # ------------------------------------------------------------ runTruth = True - if flags.Tracking.doITkFastTracking and flags.Tracking.ActiveConfig.doAthenaTrack: + # if do GNN without ambi resolution, create a CopyAlgForAmbi + doGNNWithoutAmbiReso = flags.Tracking.ActiveConfig.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution) + + if (flags.Tracking.doITkFastTracking and flags.Tracking.ActiveConfig.doAthenaTrack or doGNNWithoutAmbiReso): from TrkConfig.TrkCollectionAliasAlgConfig import CopyAlgForAmbiCfg acc.merge(CopyAlgForAmbiCfg( diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 4aaf90da4dd4..0c29023925e4 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -104,6 +104,13 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): InDetTrackFitter = acc.popToolsAndMerge(ITkTrackFitterCfg(flags)) kwargs.setdefault("TrackFitter", InDetTrackFitter) + if "TrackSummaryTool" not in kwargs: + from TrkConfig.TrkTrackSummaryToolConfig import InDetTrackSummaryToolCfg + + kwargs.setdefault( + "TrackSummaryTool", acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags)) + ) + if flags.Tracking.GNN.useTrackFinder: InDetGNNTrackFinderTool = acc.popToolsAndMerge(GNNTrackFinderToolCfg(flags)) kwargs.setdefault("GNNTrackFinderTool", InDetGNNTrackFinderTool) @@ -115,6 +122,12 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): else: raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") + kwargs.setdefault("areInputClusters", flags.Tracking.GNN.areInputClusters) + + if "AssociationToolNotGanged" not in kwargs: + from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg + acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) + acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 40255830a439..a4b49b7fd1fa 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,5 +27,8 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") + icf.addFlag("Tracking.GNN.doAthenaAmbiguityResolution", False) + icf.addFlag("Tracking.GNN.areInputClusters", False) + icf.addFlag("Tracking.GNN.doAmbiResolution", True) return icf diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx index 47a40549c092..f38e8270c465 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx @@ -59,8 +59,12 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb std::stringstream lineStream(line); std::string cell; std::vector<uint32_t> trackCandidate; - while(std::getline(lineStream, cell, ',')) - { + // allow both "," and " " as delimiter + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + while (std::getline(lineStream, cell, delimiter)) { uint32_t cellId = 0; try { cellId = std::stoi(cell); @@ -75,4 +79,57 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb } trackCandidates.push_back(std::move(trackCandidate)); } +} + +// this function reads each track candidate as 2 lists, a list of sp and +// a list of clusters, the trackCandidates vector will be the clusters, +// the seeds vector will be the SPs +void InDet::GNNTrackReaderTool::getTracks( + uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t>>& trackCandidates, + std::vector<std::vector<uint32_t>>& seeds) const { + std::string fileName = m_inputTracksDir + "/" + m_csvPrefix + "_" + + std::to_string(runNumber) + "_" + + std::to_string(eventNumber) + ".csv"; + + trackCandidates.clear(); + std::ifstream csvFile(fileName); + + if (!csvFile.is_open()) { + ATH_MSG_ERROR("Cannot open file " << fileName); + return; + } else { + ATH_MSG_INFO("File " << fileName << " is opened."); + } + + std::string line; + while (std::getline(csvFile, line)) { + std::istringstream lineStream(line); + std::string CLString, SPString; + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + + if (std::getline(lineStream, CLString, '|') && + std::getline(lineStream, SPString)) { + std::istringstream CLStream(CLString), SPStream(SPString); + std::vector<uint32_t> cls, sps; + std::string number; + + while (std::getline(CLStream, number, delimiter)) { + cls.push_back(std::stoi(number)); + } + + while (std::getline(SPStream, number, delimiter)) { + sps.push_back(std::stoi(number)); + } + + trackCandidates.push_back(cls); + seeds.push_back(sps); + } + } + csvFile.close(); + + ATH_MSG_DEBUG("Length of track list " << trackCandidates.size()); } \ No newline at end of file diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h index 8c9953dfb407..7c3b6e806522 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h @@ -47,6 +47,10 @@ namespace InDet{ virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, std::vector<std::vector<uint32_t> >& tracks) const override final; + virtual void getTracks( + uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t>>& tracks, + std::vector<std::vector<uint32_t>>& seeds) const override final; /////////////////////////////////////////////////////////////////// // Print internal tool parameters and status /////////////////////////////////////////////////////////////////// diff --git a/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h b/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h index 15f32b3e97ac..30419bd902bc 100644 --- a/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h +++ b/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h @@ -41,6 +41,9 @@ namespace InDet { virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, std::vector<std::vector<uint32_t> >& tracks) const =0; + virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t> >& tracks, std::vector<std::vector<uint32_t> >& seeds) const =0; + /////////////////////////////////////////////////////////////////// // Print internal tool parameters and status diff --git a/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx b/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx index fb9d7eab12c8..6b61f6695c29 100644 --- a/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx @@ -101,7 +101,7 @@ std::unique_ptr<const Trk::TrackParameters> InDet::SeedFitterTool::fit( } } if (any_nan){ - ATH_MSG_WARNING("Seed parameters contain NaN elements - skipping this track "); + ATH_MSG_DEBUG("Seed parameters contain NaN elements - skipping this track "); return nullptr; } @@ -109,7 +109,7 @@ std::unique_ptr<const Trk::TrackParameters> InDet::SeedFitterTool::fit( pla->createUniqueTrackParameters(track_paras[0],track_paras[1],track_paras[2],track_paras[3],track_paras[4],std::nullopt)); if (!trkParameters) { - ATH_MSG_WARNING("Failed to create track parameters"); + ATH_MSG_DEBUG("Failed to create track parameters"); return nullptr; } diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index a306ddfd20f1..4739bfcff14e 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -17,12 +17,14 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_CHECK(m_SpacePointsPixelKey.initialize()); ATH_CHECK(m_SpacePointsSCTKey.initialize()); ATH_CHECK(m_SpacePointsOverlapKey.initialize()); - ATH_CHECK(m_SpacePointsOverlapKey.initialize()); + ATH_CHECK(m_ClusterPixelKey.initialize()); + ATH_CHECK(m_ClusterSCTKey.initialize()); ATH_CHECK(m_outputTracksKey.initialize()); ATH_CHECK(m_trackFitter.retrieve()); ATH_CHECK(m_seedFitter.retrieve()); + ATH_CHECK(m_trackSummaryTool.retrieve()); if (!m_gnnTrackFinder.empty() && !m_gnnTrackReader.empty()) { ATH_MSG_ERROR("Use either track finder or track reader, not both."); @@ -37,6 +39,9 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_MSG_INFO("Use GNN Track Reader"); ATH_CHECK(m_gnnTrackReader.retrieve()); } + if (m_areInputClusters) { + ATH_MSG_INFO("Use input clusters"); + } return StatusCode::SUCCESS; } @@ -82,8 +87,6 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { ctx}; if (collection.isValid()) { - ATH_MSG_DEBUG( - "Number of overlapping space points: " << collection->size()); for (const Trk::SpacePoint* sp : *collection) { spacePoints.push_back(sp); } @@ -92,23 +95,87 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { }; getData(m_SpacePointsPixelKey); + int npixsp = spacePoints.size(); + ATH_MSG_DEBUG("Event " << eventNumber << " has " << npixsp + << " pixel space points"); getData(m_SpacePointsSCTKey); + ATH_MSG_DEBUG("Event " << eventNumber << " has " + << spacePoints.size() - npixsp << " SCT space points"); int nNonOverlap = spacePoints.size(); - ATH_MSG_DEBUG("Number of non-overlapping spacepoints: " << nNonOverlap); + ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap + << " non-overlapping spacepoints"); getOverlapData(m_SpacePointsOverlapKey); - ATH_MSG_DEBUG("Number of spacepoints: " << spacePoints.size()); + ATH_MSG_INFO("Event " << eventNumber << " has " << spacePoints.size() + << " space points"); + + // get clusters + std::vector<const Trk::PrepRawData*> allClusters; + if (m_areInputClusters) { + SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, + ctx); + SG::ReadHandle<InDet::SCT_ClusterContainer> sctcontainer(m_ClusterSCTKey, + ctx); + + if (!pixcontainer.isValid() || !sctcontainer.isValid()) { + ATH_MSG_ERROR("Pixel container invalid, returning"); + return StatusCode::FAILURE; + } + + auto pixcollection = pixcontainer->begin(); + auto pixcollectionEnd = pixcontainer->end(); + for (; pixcollection != pixcollectionEnd; ++pixcollection) { + if ((*pixcollection)->empty()) { + ATH_MSG_WARNING("Empty pixel cluster collection encountered"); + continue; + } + auto const* clusterCollection = (*pixcollection); + auto thisCluster = clusterCollection->begin(); + auto clusterEnd = clusterCollection->end(); + for (; thisCluster != clusterEnd; ++thisCluster) { + const PixelCluster* cl = (*thisCluster); + allClusters.push_back(cl); + } + } + + auto sctcollection = sctcontainer->begin(); + auto sctcollectionEnd = sctcontainer->end(); + for (; sctcollection != sctcollectionEnd; ++sctcollection) { + if ((*sctcollection)->empty()) { + ATH_MSG_WARNING("Empty SCT cluster collection encountered"); + continue; + } + auto const* clusterCollection = (*sctcollection); + auto thisCluster = clusterCollection->begin(); + auto clusterEnd = clusterCollection->end(); + for (; thisCluster != clusterEnd; ++thisCluster) { + const SCT_Cluster* cl = (*thisCluster); + allClusters.push_back(cl); + } + } + + ATH_MSG_INFO("Event " << eventNumber << " has " << allClusters.size() + << " clusters"); + } + + // get tracks std::vector<std::vector<uint32_t> > TT; + std::vector<std::vector<uint32_t> > clusterTracks; if (m_gnnTrackFinder.isSet()) { ATH_CHECK(m_gnnTrackFinder->getTracks(spacePoints, TT)); } else if (m_gnnTrackReader.isSet()) { - m_gnnTrackReader->getTracks(runNumber, eventNumber, TT); + // if track candidates are built from cluster, get both clusters and SPs + if (m_areInputClusters) { + m_gnnTrackReader->getTracks(runNumber, eventNumber, clusterTracks, TT); + } else { + m_gnnTrackReader->getTracks(runNumber, eventNumber, TT); + } } else { ATH_MSG_ERROR("Both GNNTrackFinder and GNNTrackReader are not set"); return StatusCode::FAILURE; } - ATH_MSG_DEBUG("Obtained " << TT.size() << " Tracks"); + ATH_MSG_DEBUG("Event " << eventNumber << " obtained " << TT.size() << " Tracks"); // loop over all track candidates // and perform track fitting for each. @@ -116,15 +183,18 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { for (auto& trackIndices : TT) { std::vector<const Trk::PrepRawData*> clusters; - std::vector<const Trk::SpacePoint*> trackCandiate; - trackCandiate.reserve(trackIndices.size()); + std::vector<const Trk::SpacePoint*> trackCandidate; + trackCandidate.reserve(trackIndices.size()); trackCounter++; ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackIndices.size() << " spacepoints"); std::stringstream spCoordinates; + std::vector<std::pair<double, const Trk::SpacePoint*> > distanceSortedSPs; + // get track space points + // sort SPs in track by distance from origin for (auto& id : trackIndices) { //// for each spacepoint, attach all prepRawData to a list. if (id > spacePoints.size()) { @@ -140,22 +210,76 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { << sp->globalPosition().y() << ", " << sp->globalPosition().z() << ")"); } + + // store distance - hit paire if (sp != nullptr) { - trackCandiate.push_back(sp); + distanceSortedSPs.push_back( + std::make_pair( + pow(sp->globalPosition().x(), 2) + pow(sp->globalPosition().y(), 2), + sp + ) + ); + } + } + + // sort by distance + std::sort(distanceSortedSPs.begin(), distanceSortedSPs.end()); + + // add SP to trk candidate in the same order + for (size_t i = 0; i < distanceSortedSPs.size(); i++) { + trackCandidate.push_back(distanceSortedSPs[i].second); + } + + // get cluster list + int nPIX(0), nSCT(0); + // if use input clusters, get the cluster list from clusterTracks + if (m_areInputClusters) { + std::vector<uint32_t> clusterIndices = clusterTracks[trackCounter]; + clusters.reserve(clusterIndices.size()); + for (uint32_t id : clusterIndices) { + if (id > allClusters.size()) { + ATH_MSG_ERROR("Cluster index out of range"); + continue; + } + if (allClusters[id]->type(Trk::PrepRawDataType::PixelCluster)) + nPIX++; + if (allClusters[id]->type(Trk::PrepRawDataType::SCT_Cluster)) + nSCT++; + clusters.push_back(allClusters[id]); + } // if not get list of clusters from space points + } else { + for (const Trk::SpacePoint* sp : trackCandidate) { + if (sp->clusterList().first->type(Trk::PrepRawDataType::PixelCluster)) + nPIX++; + if (sp->clusterList().first->type(Trk::PrepRawDataType::SCT_Cluster)) + nSCT++; clusters.push_back(sp->clusterList().first); if (sp->clusterList().second != nullptr) { clusters.push_back(sp->clusterList().second); + nSCT++; } } } - ATH_MSG_DEBUG("Track " << trackCounter << " has " << clusters.size() - << " clusters"); - ATH_MSG_DEBUG("spacepoints: " << spCoordinates.str()); + + ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackCandidate.size() + << " space points, " << clusters.size() + << " clusters, " << nPIX << " pixel clusters, " + << nSCT << " SCT clusters"); + + // reject track with less than 3 space point hits, the conformal map will + // fail any way + if (trackCandidate.size() < 3) { + ATH_MSG_DEBUG( + "Track " + << trackCounter + << " does not have enough hits to run a conformal map, rejecting"); + continue; + } // conformal mapping for track parameters - auto trkParameters = m_seedFitter->fit(trackCandiate); + auto trkParameters = m_seedFitter->fit(trackCandidate); if (trkParameters == nullptr) { - ATH_MSG_WARNING("Conformal mapping failed"); + ATH_MSG_DEBUG("Conformal mapping failed"); continue; } @@ -163,22 +287,47 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { // first fit the track with local parameters and without outlier removal. std::unique_ptr<Trk::Track> track = m_trackFitter->fit(ctx, clusters, *trkParameters, false, matEffects); - if (track != nullptr && track->perigeeParameters() != nullptr) { + + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the first chi2 fit, skipping"); + continue; + } // fit the track again with perigee parameters and without outlier // removal. track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), false, matEffects); - if (track != nullptr) { + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the second chi2 fit, skipping"); + continue; + } // finally fit with outlier removal - track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), - true, matEffects); - if (track != nullptr && track->trackSummary() != nullptr) { - outputTracks->push_back(track.release()); - } - } + track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), true, + matEffects); + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the third chi2 fit, skipping"); + continue; } - } + // compute pT and skip if pT too low + const Trk::Perigee* origPerigee = track->perigeeParameters(); + double pt = sqrt(pow(origPerigee->momentum().x(), 2) + + pow(origPerigee->momentum().y(), 2)); + ATH_MSG_DEBUG("Track " << trackCounter << " has pT: " << pt); + if (pt < 500) { + ATH_MSG_DEBUG("Track " << trackCounter + << " has pT too low, skipping track!"); + continue; + } + // need to compute track summary here. This is done during ambiguity + // resolution in the legacy chain. Since we skip it, we must do it here + m_trackSummaryTool->computeAndReplaceTrackSummary( + *track, false /* DO NOT suppress hole search*/); + outputTracks->push_back(track.release()); + } + ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " << outputTracks->size() << " tracks stored"); return StatusCode::SUCCESS; diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index cb6defffa63a..f967056640a2 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -11,6 +11,8 @@ #include "StoreGate/DataHandle.h" // data containers +#include "InDetPrepRawData/PixelClusterContainer.h" +#include "InDetPrepRawData/SCT_ClusterContainer.h" #include "TrkSpacePoint/SpacePointContainer.h" #include "TrkSpacePoint/SpacePointOverlapCollection.h" #include "TrkTrack/TrackCollection.h" @@ -20,6 +22,7 @@ #include "InDetRecToolInterfaces/ISeedFitter.h" #include "TrkFitterInterfaces/ITrackFitter.h" #include "IGNNTrackReaderTool.h" +#include "TrkToolInterfaces/IExtendedTrackSummaryTool.h" namespace Trk { class ITrackFitter; @@ -61,6 +64,10 @@ namespace InDet { this, "SpacePointsSCTName", "ITkStripSpacePoints"}; SG::ReadHandleKey<SpacePointOverlapCollection> m_SpacePointsOverlapKey{this, "SpacePointsOverlapName", "ITkOverlapSpacePoints"}; //@} + SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ + this, "PixelClusterContainer", "ITkPixelClusters"}; + SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ + this, "SCT_ClusterContainer", "ITkStripClusters"}; // output container SG::WriteHandleKey<TrackCollection> m_outputTracksKey{ @@ -84,6 +91,8 @@ namespace InDet { this, "TrackFitter", "Trk::GlobalChi2Fitter/InDetTrackFitter", "Track Fitter" }; + ToolHandle<Trk::IExtendedTrackSummaryTool> m_trackSummaryTool{ + this, "TrackSummaryTool", "InDetTrackSummaryTool"}; ToolHandle<IGNNTrackReaderTool> m_gnnTrackReader{ this, "GNNTrackReaderTool", "InDet::GNNTrackReaderTool", "Track Reader" @@ -92,6 +101,9 @@ namespace InDet { MsgStream& dumptools(MsgStream& out) const; MsgStream& dumpevent(MsgStream& out) const; + BooleanProperty m_areInputClusters{ + this, "areInputClusters", false, + "Read track candidates as list of clusters"}; }; MsgStream& operator << (MsgStream& ,const SiSPGNNTrackMaker&); -- GitLab From cc685159d46bbfbeaf28126e4dff9be6d1e797a1 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:03:37 -0800 Subject: [PATCH 03/54] rid of cosmetic --- .../src/SiSPGNNTrackMaker.cxx | 88 +++++++++++-------- 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 4739bfcff14e..57a59d8dec74 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -2,18 +2,22 @@ Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration */ -#include "SiSPGNNTrackMaker.h" - -#include <fstream> #include <memory> +#include <fstream> + +#include "SiSPGNNTrackMaker.h" #include "TrkPrepRawData/PrepRawData.h" -InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker(const std::string& name, - ISvcLocator* pSvcLocator) - : AthReentrantAlgorithm(name, pSvcLocator) {} +InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( + const std::string& name, ISvcLocator* pSvcLocator) + : AthReentrantAlgorithm(name, pSvcLocator) +{ + +} -StatusCode InDet::SiSPGNNTrackMaker::initialize() { +StatusCode InDet::SiSPGNNTrackMaker::initialize() +{ ATH_CHECK(m_SpacePointsPixelKey.initialize()); ATH_CHECK(m_SpacePointsSCTKey.initialize()); ATH_CHECK(m_SpacePointsOverlapKey.initialize()); @@ -46,7 +50,9 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() { return StatusCode::SUCCESS; } -StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { + +StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const +{ SG::WriteHandle<TrackCollection> outputTracks{m_outputTracksKey, ctx}; ATH_CHECK(outputTracks.record(std::make_unique<TrackCollection>())); @@ -56,21 +62,20 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { std::vector<const Trk::SpacePoint*> spacePoints; - auto getData = - [&](const SG::ReadHandleKey<SpacePointContainer>& containerKey) { - if (not containerKey.empty()) { + auto getData = [&](const SG::ReadHandleKey<SpacePointContainer>& containerKey){ + if (not containerKey.empty()){ SG::ReadHandle<SpacePointContainer> container{containerKey, ctx}; - if (container.isValid()) { + if (container.isValid()){ // loop over spacepoint collection auto spc = container->begin(); auto spce = container->end(); - for (; spc != spce; ++spc) { + for(; spc != spce; ++spc){ const SpacePointCollection* spCollection = (*spc); auto sp = spCollection->begin(); auto spe = spCollection->end(); - for (; sp != spe; ++sp) { + for(; sp != spe; ++sp) { const Trk::SpacePoint* spacePoint = (*sp); spacePoints.push_back(spacePoint); } @@ -79,15 +84,13 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { } }; - auto getOverlapData = - [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey) { - if (not containerKey.empty()) { + auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ + if (not containerKey.empty()){ - SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, - ctx}; + SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; - if (collection.isValid()) { - for (const Trk::SpacePoint* sp : *collection) { + if (collection.isValid()){ + for (const Trk::SpacePoint *sp : *collection) { spacePoints.push_back(sp); } } @@ -328,17 +331,18 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { outputTracks->push_back(track.release()); } - ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " - << outputTracks->size() << " tracks stored"); + ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " << outputTracks->size() << " tracks stored"); return StatusCode::SUCCESS; } + /////////////////////////////////////////////////////////////////// // Overload of << operator MsgStream /////////////////////////////////////////////////////////////////// -MsgStream& InDet::operator<<(MsgStream& sl, - const InDet::SiSPGNNTrackMaker& se) { +MsgStream& InDet::operator << + (MsgStream& sl,const InDet::SiSPGNNTrackMaker& se) +{ return se.dump(sl); } @@ -346,8 +350,9 @@ MsgStream& InDet::operator<<(MsgStream& sl, // Overload of << operator std::ostream /////////////////////////////////////////////////////////////////// -std::ostream& InDet::operator<<(std::ostream& sl, - const InDet::SiSPGNNTrackMaker& se) { +std::ostream& InDet::operator << + (std::ostream& sl,const InDet::SiSPGNNTrackMaker& se) +{ return se.dump(sl); } @@ -355,22 +360,24 @@ std::ostream& InDet::operator<<(std::ostream& sl, // Dumps relevant information into the MsgStream /////////////////////////////////////////////////////////////////// -MsgStream& InDet::SiSPGNNTrackMaker::dump(MsgStream& out) const { - out << std::endl; - if (msgLvl(MSG::DEBUG)) - return dumpevent(out); - else - return dumptools(out); +MsgStream& InDet::SiSPGNNTrackMaker::dump( MsgStream& out ) const +{ + out<<std::endl; + if(msgLvl(MSG::DEBUG)) return dumpevent(out); + else return dumptools(out); } /////////////////////////////////////////////////////////////////// // Dumps conditions information into the MsgStream /////////////////////////////////////////////////////////////////// -MsgStream& InDet::SiSPGNNTrackMaker::dumptools(MsgStream& out) const { - out << "| Location of output tracks | " << std::endl; - out << "|----------------------------------------------------------------" - << "----------------------------------------------------|" << std::endl; +MsgStream& InDet::SiSPGNNTrackMaker::dumptools( MsgStream& out ) const +{ + out<<"| Location of output tracks | " + <<std::endl; + out<<"|----------------------------------------------------------------" + <<"----------------------------------------------------|" + <<std::endl; return out; } @@ -378,10 +385,13 @@ MsgStream& InDet::SiSPGNNTrackMaker::dumptools(MsgStream& out) const { // Dumps event information into the ostream /////////////////////////////////////////////////////////////////// -MsgStream& InDet::SiSPGNNTrackMaker::dumpevent(MsgStream& out) const { +MsgStream& InDet::SiSPGNNTrackMaker::dumpevent( MsgStream& out ) const +{ return out; } -std::ostream& InDet::SiSPGNNTrackMaker::dump(std::ostream& out) const { + +std::ostream& InDet::SiSPGNNTrackMaker::dump( std::ostream& out ) const +{ return out; } -- GitLab From 32538446a06fcf4950616aa094c0205a8704894a Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:10:32 -0800 Subject: [PATCH 04/54] indentation --- .../src/SiSPGNNTrackMaker.cxx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 57a59d8dec74..8427e73c9073 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -65,24 +65,24 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const auto getData = [&](const SG::ReadHandleKey<SpacePointContainer>& containerKey){ if (not containerKey.empty()){ - SG::ReadHandle<SpacePointContainer> container{containerKey, ctx}; + SG::ReadHandle<SpacePointContainer> container{containerKey, ctx}; if (container.isValid()){ - // loop over spacepoint collection - auto spc = container->begin(); - auto spce = container->end(); + // loop over spacepoint collection + auto spc = container->begin(); + auto spce = container->end(); for(; spc != spce; ++spc){ - const SpacePointCollection* spCollection = (*spc); - auto sp = spCollection->begin(); - auto spe = spCollection->end(); + const SpacePointCollection* spCollection = (*spc); + auto sp = spCollection->begin(); + auto spe = spCollection->end(); for(; sp != spe; ++sp) { - const Trk::SpacePoint* spacePoint = (*sp); - spacePoints.push_back(spacePoint); - } - } + const Trk::SpacePoint* spacePoint = (*sp); + spacePoints.push_back(spacePoint); } } - }; + } + } + }; auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ if (not containerKey.empty()){ -- GitLab From f13a33ae89fc3bfc16cfa6c0aa5262b44db53851 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:11:53 -0800 Subject: [PATCH 05/54] more indentation --- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 8427e73c9073..c7078439fef9 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -76,8 +76,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const auto sp = spCollection->begin(); auto spe = spCollection->end(); for(; sp != spe; ++sp) { - const Trk::SpacePoint* spacePoint = (*sp); - spacePoints.push_back(spacePoint); + const Trk::SpacePoint* spacePoint = (*sp); + spacePoints.push_back(spacePoint); } } } @@ -91,11 +91,11 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (collection.isValid()){ for (const Trk::SpacePoint *sp : *collection) { - spacePoints.push_back(sp); - } - } + spacePoints.push_back(sp); } - }; + } + } + }; getData(m_SpacePointsPixelKey); int npixsp = spacePoints.size(); -- GitLab From 3be936c932cdf24db2d28fcfa22bef8017801254 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 14:31:48 -0800 Subject: [PATCH 06/54] add reco track cuts --- .../python/InDetGNNTrackingConfig.py | 16 + .../python/InDetGNNTrackingConfigFlags.py | 13 +- .../src/SiSPGNNTrackMaker.cxx | 284 +++++++++++++++++- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 33 +- 4 files changed, 326 insertions(+), 20 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 0c29023925e4..498ea3dff1bd 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -123,11 +123,27 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") kwargs.setdefault("areInputClusters", flags.Tracking.GNN.areInputClusters) + kwargs.setdefault("doRecoTrackCuts", flags.Tracking.GNN.doRecoTrackCuts) if "AssociationToolNotGanged" not in kwargs: from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) + # add eta dependent cut service + if "InDetEtaDependentCutSvc" not in kwargs: + from InDetConfig.InDetEtaDependentCutsConfig import ITkEtaDependentCutsSvcCfg + # import AthenaCommon.SystemOfUnits as Units + # flags.Tracking.ActiveConfig.minPT = [400. * Units.MeV, 400. * Units.MeV, 400. * Units.MeV] + acc.merge(ITkEtaDependentCutsSvcCfg(flags)) + kwargs.setdefault("InDetEtaDependentCutsSvc", acc.getService("ITkEtaDependentCutsSvc"+flags.Tracking.ActiveConfig.extension)) + + kwargs.setdefault("nClustersMin", flags.Tracking.GNN.nClustersMin) + kwargs.setdefault("pTmin", flags.Tracking.GNN.pTmin) + kwargs.setdefault("etamax", flags.Tracking.GNN.etamax) + kwargs.setdefault("doRecoTrackCuts", flags.Tracking.GNN.doRecoTrackCuts) + kwargs.setdefault("minPixelHits", flags.Tracking.GNN.minPixelHits) + kwargs.setdefault("minStripHits", flags.Tracking.GNN.minStripHits) + acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index a4b49b7fd1fa..1a9fc7b0c687 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,8 +27,19 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") - icf.addFlag("Tracking.GNN.doAthenaAmbiguityResolution", False) icf.addFlag("Tracking.GNN.areInputClusters", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) + icf.addFlag("Tracking.GNN.doRecoTrackCuts", True) + + icf.addFlag("Tracking.GNN.etamax", 4.0) + icf.addFlag("Tracking.GNN.minPixelHits", 1) + icf.addFlag("Tracking.GNN.minStripHits", 0) + icf.addFlag("Tracking.GNN.nClustersMin", 6) + import AthenaCommon.SystemOfUnits as Units + icf.addFlag("Tracking.GNN.pTmin", 400. * Units.MeV) + + + + return icf diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index c7078439fef9..becabbded13e 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -8,6 +8,7 @@ #include "SiSPGNNTrackMaker.h" #include "TrkPrepRawData/PrepRawData.h" +#include "TrkRIO_OnTrack/RIO_OnTrack.h" InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( const std::string& name, ISvcLocator* pSvcLocator) @@ -16,6 +17,40 @@ InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( } +double InDet::SiSPGNNTrackMaker::trackQuality(const Trk::Track* Tr) const { + + double quality = 0.; + double baseScorePerHit = 17.; + /// check all hits on the track + for (const Trk::TrackStateOnSurface* m : *(Tr->trackStateOnSurfaces())) { + /// exclude anything which is not an actual hit + if (not m->type(Trk::TrackStateOnSurface::Measurement)) + continue; + /// retrieve the fit quality for a given hit + const Trk::FitQualityOnSurface fq = m->fitQualityOnSurface(); + if (!fq) + continue; + + double x2 = fq.chiSquared(); + double hitQualityScore; + /// score the hit based on the technology (pixels get higher score) and + /// the local chi2 for the hit + if (fq.numberDoF() == 2) + hitQualityScore = (1.2 * (baseScorePerHit - x2 * .5)); // pix + else + hitQualityScore = (baseScorePerHit - x2); // sct + if (hitQualityScore < 0.) + hitQualityScore = + 0.; // do not allow a bad hit to decrement the overall score + quality += hitQualityScore; + } + /// penalise brem tracks + if (Tr->info().trackProperties(Trk::TrackInfo::BremFit)) + quality *= 0.7; + + return quality; +} + StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_CHECK(m_SpacePointsPixelKey.initialize()); @@ -46,6 +81,67 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() if (m_areInputClusters) { ATH_MSG_INFO("Use input clusters"); } + // retrieve eta dependent cut svc + ATH_CHECK(m_etaDependentCutsSvc.retrieve()); + + ATH_MSG_INFO("Min pT: " << m_pTmin); + ATH_MSG_INFO("Max eta: " << m_etamax); + + + if (m_doRecoTrackCuts) { + // ATH_MSG_INFO("Min Si Hits: [" + // << m_etaDependentCutsSvc->getMinSiHitsAtEta(0) << "," + // << m_etaDependentCutsSvc->getMinSiHitsAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMinSiHitsAtEta(4) << "]"); + // ATH_MSG_INFO("Min Si unshared Hits: [" + // << m_etaDependentCutsSvc->getMinSiNotSharedAtEta(0) << "," + // << m_etaDependentCutsSvc->getMinSiNotSharedAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMinSiNotSharedAtEta(4) << "]"); + // ATH_MSG_INFO("Max shared Hits: [" + // << m_etaDependentCutsSvc->getMaxSharedAtEta(0) << "," + // << m_etaDependentCutsSvc->getMaxSharedAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMaxSharedAtEta(4) << "]"); + // ATH_MSG_INFO("Min pixel hits: [" + // << m_etaDependentCutsSvc->getMinPixelHitsAtEta(0) << "," + // << m_etaDependentCutsSvc->getMinPixelHitsAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMinPixelHitsAtEta(4) << "]"); + // ATH_MSG_INFO("Min pT: [" << m_etaDependentCutsSvc->getMinPtAtEta(0) << "," + // << m_etaDependentCutsSvc->getMinPtAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMinPtAtEta(4) << "]"); + // ATH_MSG_INFO("Max z0 (getMaxZImpactAtEta): [" + // << m_etaDependentCutsSvc->getMaxZImpactAtEta(0) << "," + // << m_etaDependentCutsSvc->getMaxZImpactAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMaxZImpactAtEta(4) << "]"); + // ATH_MSG_INFO("Max d0 (getMaxPrimaryImpactAtEta): [" + // << m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(0) << "," + // << m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(4) << "]"); + // ATH_MSG_INFO("Max holes (getMaxSiHolesAtEta): [" + // << m_etaDependentCutsSvc->getMaxSiHolesAtEta(0) << "," + // << m_etaDependentCutsSvc->getMaxSiHolesAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMaxSiHolesAtEta(4) << "]"); + // ATH_MSG_INFO("Max pixel holes (getMaxPixelHolesAtEta): [" + // << m_etaDependentCutsSvc->getMaxPixelHolesAtEta(0) << "," + // << m_etaDependentCutsSvc->getMaxPixelHolesAtEta(2.1) << "," + // << m_etaDependentCutsSvc->getMaxPixelHolesAtEta(4) << "]"); + // ATH_MSG_INFO("Min Si Hits: " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::minClusters, std::vector<int> {}) ); + // ATH_MSG_INFO("Min pixel hits: " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::minPixelHits, std::vector<int> {})); + // ATH_MSG_INFO("Min pT: " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::minPT, std::vector<double> {})); + // ATH_MSG_INFO("Max z0 (getMaxZImpactAtEta): " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::maxZImpact, std::vector<double> {})); + // ATH_MSG_INFO("Max d0 (getMaxPrimaryImpactAtEta): " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::maxPrimaryImpact, std::vector<double> {})); + // ATH_MSG_INFO("Max holes (getMaxSiHolesAtEta): " + // << m_etaDependentCutsSvc->getValue(InDet::CutName::maxHoles, std::vector<int> {})); + + ATH_MSG_INFO("Min number of clusters hits: " << m_nclusmin); + ATH_MSG_INFO("Min number of pixel hits: " << m_minPixHits); + ATH_MSG_INFO("Min number of strip hits: " << m_minStripHits); + + } return StatusCode::SUCCESS; } @@ -183,6 +279,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // loop over all track candidates // and perform track fitting for each. int trackCounter = -1; + std::multimap<double, Trk::Track*> qualitySortedTrackCandidates; + for (auto& trackIndices : TT) { std::vector<const Trk::PrepRawData*> clusters; @@ -279,6 +377,12 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const continue; } + if (static_cast<int>(clusters.size()) < m_nclusmin) { + ATH_MSG_DEBUG("Track " << trackCounter + << " does not have enough hits, rejecting"); + continue; + } + // conformal mapping for track parameters auto trkParameters = m_seedFitter->fit(trackCandidate); if (trkParameters == nullptr) { @@ -296,16 +400,22 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const << " fails the first chi2 fit, skipping"); continue; } - // fit the track again with perigee parameters and without outlier - // removal. - track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), - false, matEffects); + + // reject track with pT too low, default 400 MeV + if (track->perigeeParameters()->pT() < m_pTmin) { + continue; + } + + // fit the track again with perigee parameters and without outlier + // removal. + track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), + false, matEffects); if (track == nullptr || track->perigeeParameters() == nullptr) { ATH_MSG_DEBUG("Track " << trackCounter << " fails the second chi2 fit, skipping"); continue; } - // finally fit with outlier removal + // finally fit with outlier removal track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), true, matEffects); if (track == nullptr || track->perigeeParameters() == nullptr) { @@ -315,27 +425,177 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } // compute pT and skip if pT too low - const Trk::Perigee* origPerigee = track->perigeeParameters(); - double pt = sqrt(pow(origPerigee->momentum().x(), 2) + - pow(origPerigee->momentum().y(), 2)); - ATH_MSG_DEBUG("Track " << trackCounter << " has pT: " << pt); - if (pt < 500) { + if (track->perigeeParameters()->pT() < m_pTmin) { ATH_MSG_DEBUG("Track " << trackCounter + << "with pt = " << track->perigeeParameters()->pT() << " has pT too low, skipping track!"); continue; } + + // get rid of tracks with eta too large + if (std::abs(track->perigeeParameters()->eta()) > m_etamax) { + ATH_MSG_DEBUG("Track " << trackCounter << "with eta = " + << std::abs(track->perigeeParameters()->eta()) + << " has eta too high, skipping track!"); + continue; + } // need to compute track summary here. This is done during ambiguity // resolution in the legacy chain. Since we skip it, we must do it here m_trackSummaryTool->computeAndReplaceTrackSummary( *track, false /* DO NOT suppress hole search*/); - outputTracks->push_back(track.release()); + + // create track quality - track pair + std::unique_ptr<Trk::TrackStates> ts = + std::make_unique<Trk::TrackStates>(*(track->trackStateOnSurfaces())); + std::unique_ptr<Trk::FitQuality> fq = + std::make_unique<Trk::FitQuality>(*(track->fitQuality())); + Trk::Track t(track->info(), std::move(ts), std::move(fq)); + + Trk::Track* track_rawPtr = track.release(); + + std::pair TQPair = std::make_pair(-trackQuality(&t), track_rawPtr); + qualitySortedTrackCandidates.insert(TQPair); + } + + ATH_MSG_INFO("Event " << eventNumber << " has " << qualitySortedTrackCandidates.size() << " tracks found"); - ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " << outputTracks->size() << " tracks stored"); + filterSharedTracks(qualitySortedTrackCandidates); + + ATH_MSG_INFO("Event " << eventNumber << " has " << qualitySortedTrackCandidates.size() + << " tracks remains after filtering shared tracks"); + + for (const std::pair<const double, Trk::Track*>& qualityAndTrack : + qualitySortedTrackCandidates) { + outputTracks->push_back(qualityAndTrack.second); + } + return StatusCode::SUCCESS; } + +int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, + int nClusters, + int nFreeClusters, + int nPixels) const { + const Trk::Perigee* origPerigee = track->perigeeParameters(); + double pt = origPerigee->pT(); + + double eta = std::abs(origPerigee->eta()); + + double d0 = std::abs(origPerigee->parameters()[Trk::d0]); + + double z0 = std::abs(origPerigee->parameters()[Trk::z0]); + + int nHolesOnTrack = track->trackSummary()->get(Trk::numberOfPixelHoles) + + track->trackSummary()->get(Trk::numberOfSCTHoles); + + ATH_MSG_DEBUG("track params: " << pt << " " << eta << " " << d0 << " " << z0 + << " " << nClusters << " " << nFreeClusters + << " " << nPixels); + + // min Si hits + if (nClusters < m_etaDependentCutsSvc->getMinSiHitsAtEta(eta)) + return 1; + + // min pixel hits + if (nPixels < m_etaDependentCutsSvc->getMinPixelHitsAtEta(eta)) + return 4; + + // min pT, default 400 + if (pt < m_etaDependentCutsSvc->getMinPtAtEta(eta)) + return 5; + + // max z0 + if (z0 > m_etaDependentCutsSvc->getMaxZImpactAtEta(eta)) + return 6; + + // max d0 + if (d0 > m_etaDependentCutsSvc->getMaxPrimaryImpactAtEta(eta)) + return 7; + + // max holes + if (nHolesOnTrack > m_etaDependentCutsSvc->getMaxSiHolesAtEta(eta)) + return 8; + + return 0; +} + +void InDet::SiSPGNNTrackMaker::filterSharedTracks( + std::multimap<double, Trk::Track*>& qualitySortedTracks) const { + std::set<const Trk::PrepRawData*> clusters; + + std::vector<const Trk::PrepRawData*> freeClusters; + freeClusters.reserve(15); + + std::multimap<double, Trk::Track*>::iterator it_qualityAndTrack = + qualitySortedTracks.begin(); + + std::vector<int> status_codes; + /// loop over all track candidates, sorted by quality + while (it_qualityAndTrack != qualitySortedTracks.end()) { + freeClusters.clear(); + + std::set<const Trk::PrepRawData*>::iterator it_clustersEnd = clusters.end(); + + int nClusters = 0; + int nPixels = 0; + /// loop over track states on surface of the track candidate + for (const Trk::TrackStateOnSurface* tsos : + *((*it_qualityAndTrack).second->trackStateOnSurfaces())) { + + if (!tsos->type(Trk::TrackStateOnSurface::Measurement)) + continue; + const Trk::FitQualityOnSurface fq = tsos->fitQualityOnSurface(); + if (!fq) + continue; + if (fq.numberDoF() == 2) + ++nPixels; + + /// get the PRD from the measurement + const Trk::MeasurementBase* mb = tsos->measurementOnTrack(); + const Trk::RIO_OnTrack* ri = dynamic_cast<const Trk::RIO_OnTrack*>(mb); + if (!ri) + continue; + const Trk::PrepRawData* pr = ri->prepRawData(); + if (pr) { + /// increase cluster count + ++nClusters; + /// and check if the cluster was already used in a previous ( = higher + /// quality) track + if (clusters.find(pr) == it_clustersEnd) { + /// if not, record as a free (not prevously used) cluster + freeClusters.push_back(pr); + } + } + } + + /// add the free clusters to our cluster set + clusters.insert(freeClusters.begin(), freeClusters.end()); + + int nFreeClusters = static_cast<int>(freeClusters.size()); + int status_code = m_doRecoTrackCuts + ? passEtaDepCuts((*it_qualityAndTrack).second, + nClusters, nFreeClusters, nPixels) + : 0; + status_codes.push_back(status_code); + if (status_code == 0) { + /// if this is fulfilled, we keep the candidate + ++it_qualityAndTrack; + } else { + /// if we do not keep the track, clean up candidate + delete (*it_qualityAndTrack).second; + qualitySortedTracks.erase(it_qualityAndTrack++); + } + } + + for (int code = 1; code <= 10; code++) { + ATH_MSG_INFO(std::count(status_codes.begin(), status_codes.end(), code) + << " tracks fail with status code " << code); + } +} + /////////////////////////////////////////////////////////////////// // Overload of << operator MsgStream /////////////////////////////////////////////////////////////////// diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index f967056640a2..b49993f7faa5 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -23,6 +23,7 @@ #include "TrkFitterInterfaces/ITrackFitter.h" #include "IGNNTrackReaderTool.h" #include "TrkToolInterfaces/IExtendedTrackSummaryTool.h" +#include "InDetRecToolInterfaces/IInDetEtaDependentCutsSvc.h" namespace Trk { class ITrackFitter; @@ -64,10 +65,10 @@ namespace InDet { this, "SpacePointsSCTName", "ITkStripSpacePoints"}; SG::ReadHandleKey<SpacePointOverlapCollection> m_SpacePointsOverlapKey{this, "SpacePointsOverlapName", "ITkOverlapSpacePoints"}; //@} - SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ - this, "PixelClusterContainer", "ITkPixelClusters"}; - SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ - this, "SCT_ClusterContainer", "ITkStripClusters"}; + SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ + this, "PixelClusterContainer", "ITkPixelClusters"}; + SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ + this, "SCT_ClusterContainer", "ITkStripClusters"}; // output container SG::WriteHandleKey<TrackCollection> m_outputTracksKey{ @@ -102,10 +103,28 @@ namespace InDet { MsgStream& dumptools(MsgStream& out) const; MsgStream& dumpevent(MsgStream& out) const; BooleanProperty m_areInputClusters{ - this, "areInputClusters", false, - "Read track candidates as list of clusters"}; + this, "areInputClusters", false, + "Read track candidates as list of clusters"}; + IntegerProperty m_nclusmin{this, "nClustersMin", 6, "Min number clusters"}; + + DoubleProperty m_pTmin{this, "pTmin", 400., "min pT"}; + DoubleProperty m_etamax{this, "etamax", 4., "max reco eta"}; + + BooleanProperty m_doRecoTrackCuts{this, "doRecoTrackCuts", false, + "Apply Loose track cuts"}; + IntegerProperty m_minPixHits{this, "minPixelHits", 1, "min pixel hits"}; + IntegerProperty m_minStripHits{this, "minStripHits", 0, + "Minimum number of strip hits"}; + // eta dependent track selection + ServiceHandle<IInDetEtaDependentCutsSvc> m_etaDependentCutsSvc{ + this, "InDetEtaDependentCutsSvc", "InDetEtaDependentCutsSvc"}; + int passEtaDepCuts(const Trk::Track* track, int nClusters, + int nFreeClusters, int nPixels) const; + + double trackQuality (const Trk::Track* Tr) const; + void filterSharedTracks(std::multimap<double, Trk::Track*>& qualitySortedTracks) const ; }; - + MsgStream& operator << (MsgStream& ,const SiSPGNNTrackMaker&); std::ostream& operator << (std::ostream&,const SiSPGNNTrackMaker&); } -- GitLab From dfca347334be7f09127ec1ab1aa996e5f2ee056d Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 01:37:06 -0800 Subject: [PATCH 07/54] rid of doathenaambituityresolution --- .../InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py | 1 - 1 file changed, 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index a4b49b7fd1fa..cddaec8b5ac7 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,7 +27,6 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") - icf.addFlag("Tracking.GNN.doAthenaAmbiguityResolution", False) icf.addFlag("Tracking.GNN.areInputClusters", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) -- GitLab From 245493a6bd7f9c56b75ea82a0bc41969097005ca Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 10:52:31 +0100 Subject: [PATCH 08/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Alexis Vallier <alexis.vallier@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index c7078439fef9..3d50aded1511 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -103,7 +103,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const << " pixel space points"); getData(m_SpacePointsSCTKey); ATH_MSG_DEBUG("Event " << eventNumber << " has " - << spacePoints.size() - npixsp << " SCT space points"); + << spacePoints.size() - npixsp << " Strips space points"); int nNonOverlap = spacePoints.size(); ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap << " non-overlapping spacepoints"); -- GitLab From 78ed5e086098c9944c4c548aef2975ed22be6f6f Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 03:05:31 -0800 Subject: [PATCH 09/54] change SCT -> strip --- .../src/SiSPGNNTrackMaker.cxx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 3d50aded1511..7e124110653f 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -116,14 +116,19 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (m_areInputClusters) { SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, ctx); - SG::ReadHandle<InDet::SCT_ClusterContainer> sctcontainer(m_ClusterSCTKey, + SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterSCTKey, ctx); - if (!pixcontainer.isValid() || !sctcontainer.isValid()) { + if (!pixcontainer.isValid()) { ATH_MSG_ERROR("Pixel container invalid, returning"); return StatusCode::FAILURE; } + if (!strip_container.isValid()) { + ATH_MSG_ERROR("Strip container invalid, returning"); + return StatusCode::FAILURE; + } + auto pixcollection = pixcontainer->begin(); auto pixcollectionEnd = pixcontainer->end(); for (; pixcollection != pixcollectionEnd; ++pixcollection) { @@ -140,14 +145,14 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } } - auto sctcollection = sctcontainer->begin(); - auto sctcollectionEnd = sctcontainer->end(); - for (; sctcollection != sctcollectionEnd; ++sctcollection) { - if ((*sctcollection)->empty()) { - ATH_MSG_WARNING("Empty SCT cluster collection encountered"); + auto strip_collection = strip_container->begin(); + auto strip_collectionEnd = strip_container->end(); + for (; strip_collection != strip_collectionEnd; ++strip_collection) { + if ((*strip_collection)->empty()) { + ATH_MSG_WARNING("Empty strip cluster collection encountered"); continue; } - auto const* clusterCollection = (*sctcollection); + auto const* clusterCollection = (*strip_collection); auto thisCluster = clusterCollection->begin(); auto clusterEnd = clusterCollection->end(); for (; thisCluster != clusterEnd; ++thisCluster) { -- GitLab From 30afc131e4cd41eb5f965070aaf37a1edfee9091 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 09:10:52 -0800 Subject: [PATCH 10/54] implement thomas's suggestion --- InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index a82aa1f2bc57..935ba3340ff5 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -348,6 +348,7 @@ def ITkTrackFinalCfg(flags, InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer] doGNNWithoutAmbiReso = (hasattr(flags.Tracking, "ITkGNNPass") and flags.Tracking.ITkGNNPass.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution)) + skipClusterMerge = doGNNWithoutAmbiReso or flags.Tracking.doITkFastTracking # This merges track collections from TrkConfig.TrkTrackCollectionMergerConfig import ( ITkTrackCollectionMergerAlgCfg) @@ -356,7 +357,7 @@ def ITkTrackFinalCfg(flags, InputCombinedTracks=InputCombinedITkTracks, OutputCombinedTracks=TrackContainer, AssociationMapName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else f"PRDtoTrackMapMerge_{TrackContainer}"))) if flags.Tracking.doTruth: @@ -383,10 +384,10 @@ def ITkTrackFinalCfg(flags, result.merge(ITkTrackParticleCnvAlgCfg( flags, ClusterSplitProbabilityName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else splitProbName), AssociationMapName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else f"PRDtoTrackMapMerge_{TrackContainer}"), isActsAmbi = 'ActsValidateResolvedTracks' in splitProbName or \ 'ActsValidateAmbiguityResolution' in splitProbName or \ -- GitLab From 5f96f54f7fbac80f3eedbc65d28db487b9a1db9e Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:18:11 +0100 Subject: [PATCH 11/54] ITk track summary config --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 0c29023925e4..710d5783df40 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -105,10 +105,10 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): kwargs.setdefault("TrackFitter", InDetTrackFitter) if "TrackSummaryTool" not in kwargs: - from TrkConfig.TrkTrackSummaryToolConfig import InDetTrackSummaryToolCfg + from TrkConfig.TrkTrackSummaryToolConfig import ITkTrackSummaryToolCfg kwargs.setdefault( - "TrackSummaryTool", acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags)) + "TrackSummaryTool", acc.popToolsAndMerge(ITkTrackSummaryToolCfg(flags)) ) if flags.Tracking.GNN.useTrackFinder: -- GitLab From 0fa1e5cafcc853a6790c43ab7022b69629a1c34b Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:39:30 +0100 Subject: [PATCH 12/54] Apply 4 suggestion(s) to 3 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- .../python/InDetGNNTrackingConfig.py | 2 +- .../InDetGNNTracking/src/GNNTrackReaderTool.cxx | 12 ++++++------ .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 710d5783df40..f968868ecb35 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -126,7 +126,7 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): if "AssociationToolNotGanged" not in kwargs: from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg - acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) + kwargs.setdefault("AssociationToolNotGanged ", acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags))) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx index f38e8270c465..e36b383c6d0c 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx @@ -59,12 +59,12 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb std::stringstream lineStream(line); std::string cell; std::vector<uint32_t> trackCandidate; - // allow both "," and " " as delimiter - char delimiter = ','; - if (line.find(delimiter) == std::string::npos) { - delimiter = ' '; - } - while (std::getline(lineStream, cell, delimiter)) { + // allow both "," and " " as delimiter + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + while (std::getline(lineStream, cell, delimiter)) { uint32_t cellId = 0; try { cellId = std::stoi(cell); diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 7e124110653f..2e53bb548f4d 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -239,7 +239,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } // get cluster list - int nPIX(0), nSCT(0); + int nPIX(0), nStrip(0); // if use input clusters, get the cluster list from clusterTracks if (m_areInputClusters) { std::vector<uint32_t> clusterIndices = clusterTracks[trackCounter]; @@ -260,11 +260,11 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (sp->clusterList().first->type(Trk::PrepRawDataType::PixelCluster)) nPIX++; if (sp->clusterList().first->type(Trk::PrepRawDataType::SCT_Cluster)) - nSCT++; + nStrip++; clusters.push_back(sp->clusterList().first); if (sp->clusterList().second != nullptr) { clusters.push_back(sp->clusterList().second); - nSCT++; + nStrip++; } } } @@ -272,7 +272,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackCandidate.size() << " space points, " << clusters.size() << " clusters, " << nPIX << " pixel clusters, " - << nSCT << " SCT clusters"); + << nStrip << " Strip clusters"); // reject track with less than 3 space point hits, the conformal map will // fail any way -- GitLab From 86ee9bfc0fa0eb52936bd006337e1d6031b14347 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 09:48:20 -0800 Subject: [PATCH 13/54] remove remaining nSCT --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 2e53bb548f4d..9a5fd3f0c9d1 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -252,7 +252,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (allClusters[id]->type(Trk::PrepRawDataType::PixelCluster)) nPIX++; if (allClusters[id]->type(Trk::PrepRawDataType::SCT_Cluster)) - nSCT++; + nStrip++; clusters.push_back(allClusters[id]); } // if not get list of clusters from space points } else { -- GitLab From 9f528de68e57e7845aa13613f56a485e821bc5a1 Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:49:33 +0100 Subject: [PATCH 14/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 9a5fd3f0c9d1..67b238dc67d0 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -321,8 +321,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // compute pT and skip if pT too low const Trk::Perigee* origPerigee = track->perigeeParameters(); - double pt = sqrt(pow(origPerigee->momentum().x(), 2) + - pow(origPerigee->momentum().y(), 2)); + double pt = std::hypot(origPerigee->momentum().x(), origPerigee->momentum().y()); ATH_MSG_DEBUG("Track " << trackCounter << " has pT: " << pt); if (pt < 500) { ATH_MSG_DEBUG("Track " << trackCounter -- GitLab From d9ff492f5d68789d172bceac868a1ddcacc0e426 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 10:34:07 -0800 Subject: [PATCH 15/54] info->debug --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 8 ++++---- .../python/InDetGNNTrackingConfigFlags.py | 2 +- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 6 +++--- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index f968868ecb35..1f3d322ec194 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -122,11 +122,11 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): else: raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") - kwargs.setdefault("areInputClusters", flags.Tracking.GNN.areInputClusters) - - if "AssociationToolNotGanged" not in kwargs: + kwargs.setdefault("areInputClusters", flags.Tracking.GNN.useClusterTracks) + + if not flags.Tracking.GNN.doAmbiResolution: from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg - kwargs.setdefault("AssociationToolNotGanged ", acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags))) + acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index cddaec8b5ac7..22ce3ca7eb02 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,7 +27,7 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") - icf.addFlag("Tracking.GNN.areInputClusters", False) + icf.addFlag("Tracking.GNN.useClusterTracks", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) return icf diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 67b238dc67d0..0a6b5a834fa6 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -22,7 +22,7 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() ATH_CHECK(m_SpacePointsSCTKey.initialize()); ATH_CHECK(m_SpacePointsOverlapKey.initialize()); ATH_CHECK(m_ClusterPixelKey.initialize()); - ATH_CHECK(m_ClusterSCTKey.initialize()); + ATH_CHECK(m_ClusterStripKey.initialize()); ATH_CHECK(m_outputTracksKey.initialize()); @@ -108,7 +108,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap << " non-overlapping spacepoints"); getOverlapData(m_SpacePointsOverlapKey); - ATH_MSG_INFO("Event " << eventNumber << " has " << spacePoints.size() + ATH_MSG_DEBUG("Event " << eventNumber << " has " << spacePoints.size() << " space points"); // get clusters @@ -116,7 +116,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (m_areInputClusters) { SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, ctx); - SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterSCTKey, + SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterStripKey, ctx); if (!pixcontainer.isValid()) { diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index f967056640a2..9ec41184f50d 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -66,8 +66,8 @@ namespace InDet { //@} SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ this, "PixelClusterContainer", "ITkPixelClusters"}; - SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ - this, "SCT_ClusterContainer", "ITkStripClusters"}; + SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterStripKey{ + this, "StripClusterContainer", "ITkStripClusters"}; // output container SG::WriteHandleKey<TrackCollection> m_outputTracksKey{ -- GitLab From bb0fbb385fd8608e6e84eb662d8633ab37f469c2 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 10:40:51 -0800 Subject: [PATCH 16/54] range-based loop --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 0a6b5a834fa6..215250ab4df2 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -234,8 +234,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const std::sort(distanceSortedSPs.begin(), distanceSortedSPs.end()); // add SP to trk candidate in the same order - for (size_t i = 0; i < distanceSortedSPs.size(); i++) { - trackCandidate.push_back(distanceSortedSPs[i].second); + for (std::pair<double, const Trk::SpacePoint*> pair : distanceSortedSPs) { + trackCandidate.push_back(pair.second); } // get cluster list -- GitLab From 132c87209d9b82b79c757a5e907e1de8a308d3ba Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 19:42:58 +0100 Subject: [PATCH 17/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 215250ab4df2..8f6545d91a66 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -223,7 +223,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (sp != nullptr) { distanceSortedSPs.push_back( std::make_pair( - pow(sp->globalPosition().x(), 2) + pow(sp->globalPosition().y(), 2), + std::pow(sp->globalPosition().x(), 2) + std::pow(sp->globalPosition().y(), 2), sp ) ); -- GitLab From ae653ca72b089614c3cb591e24d564c5c70f8c1a Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 19:49:27 +0100 Subject: [PATCH 18/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 8f6545d91a66..8466116401d9 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -161,7 +161,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } } - ATH_MSG_INFO("Event " << eventNumber << " has " << allClusters.size() + ATH_MSG_DEBUG("Event " << eventNumber << " has " << allClusters.size() << " clusters"); } -- GitLab From bfb68aff282e9a1b9757fb01a34d0ac0064810b2 Mon Sep 17 00:00:00 2001 From: Thomas Strebler <thomas.strebler@cern.ch> Date: Mon, 9 Dec 2024 23:53:50 +0100 Subject: [PATCH 19/54] Configure ResidualPullCalculatorTool for ITkGlobalChi2Fitter --- Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py b/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py index 276e45a33698..2270e5b5c6ba 100644 --- a/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py +++ b/Tracking/TrkConfig/python/TrkGlobalChi2FitterConfig.py @@ -440,6 +440,10 @@ def ITkGlobalChi2FitterBaseCfg(flags, name='ITkGlobalChi2FitterBase', **kwargs): kwargs.setdefault("MeasurementUpdateTool", acc.popToolsAndMerge( ITkUpdatorCfg(flags))) + from TrkConfig.TrkResidualPullCalculatorConfig import ResidualPullCalculatorCfg + kwargs.setdefault("ResidualPullCalculatorTool", acc.popToolsAndMerge( + ResidualPullCalculatorCfg(flags))) + kwargs.setdefault("StraightLine", not flags.BField.solenoidOn) kwargs.setdefault("OutlierCut", 4) kwargs.setdefault("SignedDriftRadius", True) -- GitLab From 1750df4046d30cbc85674debf5487a1de5d38281 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 04:44:26 -0800 Subject: [PATCH 20/54] turn off AR --- .../InDetConfig/python/ITkTrackRecoConfig.py | 9 +- .../python/ITkTrackingSiPatternConfig.py | 5 +- .../python/InDetGNNTrackingConfig.py | 13 ++ .../python/InDetGNNTrackingConfigFlags.py | 3 + .../src/GNNTrackReaderTool.cxx | 61 ++++- .../InDetGNNTracking/src/GNNTrackReaderTool.h | 4 + .../src/IGNNTrackReaderTool.h | 3 + .../InDetGNNTracking/src/SeedFitterTool.cxx | 4 +- .../src/SiSPGNNTrackMaker.cxx | 218 +++++++++++++++--- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 12 + 10 files changed, 292 insertions(+), 40 deletions(-) diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index 2e7d6b5b9001..17562be3e955 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -347,7 +347,8 @@ def ITkTrackFinalCfg(flags, if doTrackOverlay: #schedule merge to combine signal and background tracks InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer] - + + doGNNWithoutAmbiReso = (hasattr(flags.Tracking, "ITkGNNPass") and flags.Tracking.ITkGNNPass.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution)) # This merges track collections from TrkConfig.TrkTrackCollectionMergerConfig import ( ITkTrackCollectionMergerAlgCfg) @@ -356,7 +357,7 @@ def ITkTrackFinalCfg(flags, InputCombinedTracks=InputCombinedITkTracks, OutputCombinedTracks=TrackContainer, AssociationMapName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else f"PRDtoTrackMapMerge_{TrackContainer}"))) if flags.Tracking.doTruth: @@ -383,10 +384,10 @@ def ITkTrackFinalCfg(flags, result.merge(ITkTrackParticleCnvAlgCfg( flags, ClusterSplitProbabilityName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else splitProbName), AssociationMapName=( - "" if flags.Tracking.doITkFastTracking else + "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else f"PRDtoTrackMapMerge_{TrackContainer}"), isActsAmbi = 'ActsValidateResolvedTracks' in splitProbName or \ 'ActsValidateAmbiguityResolution' in splitProbName or \ diff --git a/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py b/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py index 91bd8a3cd316..72b2276dbd9c 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackingSiPatternConfig.py @@ -115,7 +115,10 @@ def ITkTrackingSiPatternCfg(flags, # ------------------------------------------------------------ runTruth = True - if flags.Tracking.doITkFastTracking and flags.Tracking.ActiveConfig.doAthenaTrack: + # if do GNN without ambi resolution, create a CopyAlgForAmbi + doGNNWithoutAmbiReso = flags.Tracking.ActiveConfig.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution) + + if (flags.Tracking.doITkFastTracking and flags.Tracking.ActiveConfig.doAthenaTrack or doGNNWithoutAmbiReso): from TrkConfig.TrkCollectionAliasAlgConfig import CopyAlgForAmbiCfg acc.merge(CopyAlgForAmbiCfg( diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 4aaf90da4dd4..0c29023925e4 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -104,6 +104,13 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): InDetTrackFitter = acc.popToolsAndMerge(ITkTrackFitterCfg(flags)) kwargs.setdefault("TrackFitter", InDetTrackFitter) + if "TrackSummaryTool" not in kwargs: + from TrkConfig.TrkTrackSummaryToolConfig import InDetTrackSummaryToolCfg + + kwargs.setdefault( + "TrackSummaryTool", acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags)) + ) + if flags.Tracking.GNN.useTrackFinder: InDetGNNTrackFinderTool = acc.popToolsAndMerge(GNNTrackFinderToolCfg(flags)) kwargs.setdefault("GNNTrackFinderTool", InDetGNNTrackFinderTool) @@ -115,6 +122,12 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): else: raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") + kwargs.setdefault("areInputClusters", flags.Tracking.GNN.areInputClusters) + + if "AssociationToolNotGanged" not in kwargs: + from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg + acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) + acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 40255830a439..a4b49b7fd1fa 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,5 +27,8 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") + icf.addFlag("Tracking.GNN.doAthenaAmbiguityResolution", False) + icf.addFlag("Tracking.GNN.areInputClusters", False) + icf.addFlag("Tracking.GNN.doAmbiResolution", True) return icf diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx index 47a40549c092..f38e8270c465 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx @@ -59,8 +59,12 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb std::stringstream lineStream(line); std::string cell; std::vector<uint32_t> trackCandidate; - while(std::getline(lineStream, cell, ',')) - { + // allow both "," and " " as delimiter + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + while (std::getline(lineStream, cell, delimiter)) { uint32_t cellId = 0; try { cellId = std::stoi(cell); @@ -75,4 +79,57 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb } trackCandidates.push_back(std::move(trackCandidate)); } +} + +// this function reads each track candidate as 2 lists, a list of sp and +// a list of clusters, the trackCandidates vector will be the clusters, +// the seeds vector will be the SPs +void InDet::GNNTrackReaderTool::getTracks( + uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t>>& trackCandidates, + std::vector<std::vector<uint32_t>>& seeds) const { + std::string fileName = m_inputTracksDir + "/" + m_csvPrefix + "_" + + std::to_string(runNumber) + "_" + + std::to_string(eventNumber) + ".csv"; + + trackCandidates.clear(); + std::ifstream csvFile(fileName); + + if (!csvFile.is_open()) { + ATH_MSG_ERROR("Cannot open file " << fileName); + return; + } else { + ATH_MSG_INFO("File " << fileName << " is opened."); + } + + std::string line; + while (std::getline(csvFile, line)) { + std::istringstream lineStream(line); + std::string CLString, SPString; + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + + if (std::getline(lineStream, CLString, '|') && + std::getline(lineStream, SPString)) { + std::istringstream CLStream(CLString), SPStream(SPString); + std::vector<uint32_t> cls, sps; + std::string number; + + while (std::getline(CLStream, number, delimiter)) { + cls.push_back(std::stoi(number)); + } + + while (std::getline(SPStream, number, delimiter)) { + sps.push_back(std::stoi(number)); + } + + trackCandidates.push_back(cls); + seeds.push_back(sps); + } + } + csvFile.close(); + + ATH_MSG_DEBUG("Length of track list " << trackCandidates.size()); } \ No newline at end of file diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h index 8c9953dfb407..7c3b6e806522 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.h @@ -47,6 +47,10 @@ namespace InDet{ virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, std::vector<std::vector<uint32_t> >& tracks) const override final; + virtual void getTracks( + uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t>>& tracks, + std::vector<std::vector<uint32_t>>& seeds) const override final; /////////////////////////////////////////////////////////////////// // Print internal tool parameters and status /////////////////////////////////////////////////////////////////// diff --git a/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h b/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h index 15f32b3e97ac..30419bd902bc 100644 --- a/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h +++ b/InnerDetector/InDetGNNTracking/src/IGNNTrackReaderTool.h @@ -41,6 +41,9 @@ namespace InDet { virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, std::vector<std::vector<uint32_t> >& tracks) const =0; + virtual void getTracks(uint32_t runNumber, uint32_t eventNumber, + std::vector<std::vector<uint32_t> >& tracks, std::vector<std::vector<uint32_t> >& seeds) const =0; + /////////////////////////////////////////////////////////////////// // Print internal tool parameters and status diff --git a/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx b/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx index fb9d7eab12c8..6b61f6695c29 100644 --- a/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/SeedFitterTool.cxx @@ -101,7 +101,7 @@ std::unique_ptr<const Trk::TrackParameters> InDet::SeedFitterTool::fit( } } if (any_nan){ - ATH_MSG_WARNING("Seed parameters contain NaN elements - skipping this track "); + ATH_MSG_DEBUG("Seed parameters contain NaN elements - skipping this track "); return nullptr; } @@ -109,7 +109,7 @@ std::unique_ptr<const Trk::TrackParameters> InDet::SeedFitterTool::fit( pla->createUniqueTrackParameters(track_paras[0],track_paras[1],track_paras[2],track_paras[3],track_paras[4],std::nullopt)); if (!trkParameters) { - ATH_MSG_WARNING("Failed to create track parameters"); + ATH_MSG_DEBUG("Failed to create track parameters"); return nullptr; } diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 3472070ddf72..3edd97b4272d 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -21,11 +21,14 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() ATH_CHECK(m_SpacePointsPixelKey.initialize()); ATH_CHECK(m_SpacePointsSCTKey.initialize()); ATH_CHECK(m_SpacePointsOverlapKey.initialize()); + ATH_CHECK(m_ClusterPixelKey.initialize()); + ATH_CHECK(m_ClusterSCTKey.initialize()); ATH_CHECK(m_outputTracksKey.initialize()); ATH_CHECK(m_trackFitter.retrieve()); ATH_CHECK(m_seedFitter.retrieve()); + ATH_CHECK(m_trackSummaryTool.retrieve()); if (!m_gnnTrackFinder.empty() && !m_gnnTrackReader.empty()) { ATH_MSG_ERROR("Use either track finder or track reader, not both."); @@ -40,6 +43,9 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() ATH_MSG_INFO("Use GNN Track Reader"); ATH_CHECK(m_gnnTrackReader.retrieve()); } + if (m_areInputClusters) { + ATH_MSG_INFO("Use input clusters"); + } return StatusCode::SUCCESS; } @@ -83,34 +89,96 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; - if (collection.isValid()){ - ATH_MSG_DEBUG("Number of overlapping space points: " << collection->size()); - for (const Trk::SpacePoint *sp : *collection) { - spacePoints.push_back(sp); + if (collection.isValid()) { + for (const Trk::SpacePoint* sp : *collection) { + spacePoints.push_back(sp); + } + } } - } - } - }; + }; getData(m_SpacePointsPixelKey); + int npixsp = spacePoints.size(); + ATH_MSG_DEBUG("Event " << eventNumber << " has " << npixsp + << " pixel space points"); getData(m_SpacePointsSCTKey); + ATH_MSG_DEBUG("Event " << eventNumber << " has " + << spacePoints.size() - npixsp << " SCT space points"); int nNonOverlap = spacePoints.size(); - ATH_MSG_DEBUG("Number of non-overlapping spacepoints: " << nNonOverlap ); + ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap + << " non-overlapping spacepoints"); getOverlapData(m_SpacePointsOverlapKey); - ATH_MSG_DEBUG("Number of spacepoints: " << spacePoints.size() ); + ATH_MSG_INFO("Event " << eventNumber << " has " << spacePoints.size() + << " space points"); + + // get clusters + std::vector<const Trk::PrepRawData*> allClusters; + if (m_areInputClusters) { + SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, + ctx); + SG::ReadHandle<InDet::SCT_ClusterContainer> sctcontainer(m_ClusterSCTKey, + ctx); + + if (!pixcontainer.isValid() || !sctcontainer.isValid()) { + ATH_MSG_ERROR("Pixel container invalid, returning"); + return StatusCode::FAILURE; + } + + auto pixcollection = pixcontainer->begin(); + auto pixcollectionEnd = pixcontainer->end(); + for (; pixcollection != pixcollectionEnd; ++pixcollection) { + if ((*pixcollection)->empty()) { + ATH_MSG_WARNING("Empty pixel cluster collection encountered"); + continue; + } + auto const* clusterCollection = (*pixcollection); + auto thisCluster = clusterCollection->begin(); + auto clusterEnd = clusterCollection->end(); + for (; thisCluster != clusterEnd; ++thisCluster) { + const PixelCluster* cl = (*thisCluster); + allClusters.push_back(cl); + } + } + + auto sctcollection = sctcontainer->begin(); + auto sctcollectionEnd = sctcontainer->end(); + for (; sctcollection != sctcollectionEnd; ++sctcollection) { + if ((*sctcollection)->empty()) { + ATH_MSG_WARNING("Empty SCT cluster collection encountered"); + continue; + } + auto const* clusterCollection = (*sctcollection); + auto thisCluster = clusterCollection->begin(); + auto clusterEnd = clusterCollection->end(); + for (; thisCluster != clusterEnd; ++thisCluster) { + const SCT_Cluster* cl = (*thisCluster); + allClusters.push_back(cl); + } + } + + ATH_MSG_INFO("Event " << eventNumber << " has " << allClusters.size() + << " clusters"); + } + + // get tracks std::vector<std::vector<uint32_t> > TT; + std::vector<std::vector<uint32_t> > clusterTracks; if (m_gnnTrackFinder.isSet()) { ATH_CHECK(m_gnnTrackFinder->getTracks(spacePoints, TT)); } else if (m_gnnTrackReader.isSet()) { - m_gnnTrackReader->getTracks(runNumber, eventNumber, TT); + // if track candidates are built from cluster, get both clusters and SPs + if (m_areInputClusters) { + m_gnnTrackReader->getTracks(runNumber, eventNumber, clusterTracks, TT); + } else { + m_gnnTrackReader->getTracks(runNumber, eventNumber, TT); + } } else { ATH_MSG_ERROR("Both GNNTrackFinder and GNNTrackReader are not set"); return StatusCode::FAILURE; } - - ATH_MSG_DEBUG("Obtained " << TT.size() << " Tracks"); + ATH_MSG_DEBUG("Event " << eventNumber << " obtained " << TT.size() << " Tracks"); // loop over all track candidates // and perform track fitting for each. @@ -118,14 +186,17 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const for (auto& trackIndices : TT) { std::vector<const Trk::PrepRawData*> clusters; - std::vector<const Trk::SpacePoint*> trackCandiate; - trackCandiate.reserve(trackIndices.size()); + std::vector<const Trk::SpacePoint*> trackCandidate; + trackCandidate.reserve(trackIndices.size()); trackCounter++; ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackIndices.size() << " spacepoints"); std::stringstream spCoordinates; + std::vector<std::pair<double, const Trk::SpacePoint*> > distanceSortedSPs; + // get track space points + // sort SPs in track by distance from origin for (auto& id : trackIndices) { //// for each spacepoint, attach all prepRawData to a list. if (id > spacePoints.size()) { @@ -137,41 +208,126 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (static_cast<int>(id) > nNonOverlap) { ATH_MSG_DEBUG("Track " << trackCounter << " Overlapping Hit " << id << ": (" << sp->globalPosition().x() << ", " << sp->globalPosition().y() << ", " << sp->globalPosition().z() << ")"); } + + // store distance - hit paire if (sp != nullptr) { - trackCandiate.push_back(sp); + distanceSortedSPs.push_back( + std::make_pair( + pow(sp->globalPosition().x(), 2) + pow(sp->globalPosition().y(), 2), + sp + ) + ); + } + } + + // sort by distance + std::sort(distanceSortedSPs.begin(), distanceSortedSPs.end()); + + // add SP to trk candidate in the same order + for (size_t i = 0; i < distanceSortedSPs.size(); i++) { + trackCandidate.push_back(distanceSortedSPs[i].second); + } + + // get cluster list + int nPIX(0), nSCT(0); + // if use input clusters, get the cluster list from clusterTracks + if (m_areInputClusters) { + std::vector<uint32_t> clusterIndices = clusterTracks[trackCounter]; + clusters.reserve(clusterIndices.size()); + for (uint32_t id : clusterIndices) { + if (id > allClusters.size()) { + ATH_MSG_ERROR("Cluster index out of range"); + continue; + } + if (allClusters[id]->type(Trk::PrepRawDataType::PixelCluster)) + nPIX++; + if (allClusters[id]->type(Trk::PrepRawDataType::SCT_Cluster)) + nSCT++; + clusters.push_back(allClusters[id]); + } // if not get list of clusters from space points + } else { + for (const Trk::SpacePoint* sp : trackCandidate) { + if (sp->clusterList().first->type(Trk::PrepRawDataType::PixelCluster)) + nPIX++; + if (sp->clusterList().first->type(Trk::PrepRawDataType::SCT_Cluster)) + nSCT++; clusters.push_back(sp->clusterList().first); if (sp->clusterList().second != nullptr) { clusters.push_back(sp->clusterList().second); + nSCT++; } } } - ATH_MSG_DEBUG("Track " << trackCounter << " has " << clusters.size() << " clusters"); - ATH_MSG_DEBUG("spacepoints: " << spCoordinates.str()); + + ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackCandidate.size() + << " space points, " << clusters.size() + << " clusters, " << nPIX << " pixel clusters, " + << nSCT << " SCT clusters"); + + // reject track with less than 3 space point hits, the conformal map will + // fail any way + if (trackCandidate.size() < 3) { + ATH_MSG_DEBUG( + "Track " + << trackCounter + << " does not have enough hits to run a conformal map, rejecting"); + continue; + } // conformal mapping for track parameters - auto trkParameters = m_seedFitter->fit(trackCandiate); + auto trkParameters = m_seedFitter->fit(trackCandidate); if (trkParameters == nullptr) { - ATH_MSG_WARNING("Conformal mapping failed"); + ATH_MSG_DEBUG("Conformal mapping failed"); continue; } Trk::ParticleHypothesis matEffects = Trk::pion; // first fit the track with local parameters and without outlier removal. - std::unique_ptr<Trk::Track> track = m_trackFitter->fit(ctx, clusters, *trkParameters, false, matEffects); - if (track != nullptr && track->perigeeParameters() != nullptr) { - // fit the track again with perigee parameters and without outlier removal. - track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), false, matEffects); - if (track != nullptr) { + std::unique_ptr<Trk::Track> track = + m_trackFitter->fit(ctx, clusters, *trkParameters, false, matEffects); + + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the first chi2 fit, skipping"); + continue; + } + // fit the track again with perigee parameters and without outlier + // removal. + track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), + false, matEffects); + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the second chi2 fit, skipping"); + continue; + } // finally fit with outlier removal - track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), true, matEffects); - if (track != nullptr && track->trackSummary() != nullptr) { - outputTracks->push_back(track.release()); - } - } + track = m_trackFitter->fit(ctx, clusters, *track->perigeeParameters(), true, + matEffects); + if (track == nullptr || track->perigeeParameters() == nullptr) { + ATH_MSG_DEBUG("Track " << trackCounter + << " fails the third chi2 fit, skipping"); + continue; } - } - ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " << outputTracks->size() << " tracks stored"); + // compute pT and skip if pT too low + const Trk::Perigee* origPerigee = track->perigeeParameters(); + double pt = sqrt(pow(origPerigee->momentum().x(), 2) + + pow(origPerigee->momentum().y(), 2)); + ATH_MSG_DEBUG("Track " << trackCounter << " has pT: " << pt); + if (pt < 500) { + ATH_MSG_DEBUG("Track " << trackCounter + << " has pT too low, skipping track!"); + continue; + } + // need to compute track summary here. This is done during ambiguity + // resolution in the legacy chain. Since we skip it, we must do it here + m_trackSummaryTool->computeAndReplaceTrackSummary( + *track, false /* DO NOT suppress hole search*/); + outputTracks->push_back(track.release()); + } + + ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " + << outputTracks->size() << " tracks stored"); return StatusCode::SUCCESS; } diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index cb6defffa63a..f967056640a2 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -11,6 +11,8 @@ #include "StoreGate/DataHandle.h" // data containers +#include "InDetPrepRawData/PixelClusterContainer.h" +#include "InDetPrepRawData/SCT_ClusterContainer.h" #include "TrkSpacePoint/SpacePointContainer.h" #include "TrkSpacePoint/SpacePointOverlapCollection.h" #include "TrkTrack/TrackCollection.h" @@ -20,6 +22,7 @@ #include "InDetRecToolInterfaces/ISeedFitter.h" #include "TrkFitterInterfaces/ITrackFitter.h" #include "IGNNTrackReaderTool.h" +#include "TrkToolInterfaces/IExtendedTrackSummaryTool.h" namespace Trk { class ITrackFitter; @@ -61,6 +64,10 @@ namespace InDet { this, "SpacePointsSCTName", "ITkStripSpacePoints"}; SG::ReadHandleKey<SpacePointOverlapCollection> m_SpacePointsOverlapKey{this, "SpacePointsOverlapName", "ITkOverlapSpacePoints"}; //@} + SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ + this, "PixelClusterContainer", "ITkPixelClusters"}; + SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ + this, "SCT_ClusterContainer", "ITkStripClusters"}; // output container SG::WriteHandleKey<TrackCollection> m_outputTracksKey{ @@ -84,6 +91,8 @@ namespace InDet { this, "TrackFitter", "Trk::GlobalChi2Fitter/InDetTrackFitter", "Track Fitter" }; + ToolHandle<Trk::IExtendedTrackSummaryTool> m_trackSummaryTool{ + this, "TrackSummaryTool", "InDetTrackSummaryTool"}; ToolHandle<IGNNTrackReaderTool> m_gnnTrackReader{ this, "GNNTrackReaderTool", "InDet::GNNTrackReaderTool", "Track Reader" @@ -92,6 +101,9 @@ namespace InDet { MsgStream& dumptools(MsgStream& out) const; MsgStream& dumpevent(MsgStream& out) const; + BooleanProperty m_areInputClusters{ + this, "areInputClusters", false, + "Read track candidates as list of clusters"}; }; MsgStream& operator << (MsgStream& ,const SiSPGNNTrackMaker&); -- GitLab From b145ae46fc568d9afe80adc81cf4083de8969b4c Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:03:37 -0800 Subject: [PATCH 21/54] rid of cosmetic --- .../src/SiSPGNNTrackMaker.cxx | 72 +++++++++++++++---- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 3edd97b4272d..c1a4bae100ef 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -5,6 +5,9 @@ #include <memory> #include <fstream> +#include <memory> +#include <fstream> + #include "SiSPGNNTrackMaker.h" #include "TrkPrepRawData/PrepRawData.h" @@ -14,8 +17,16 @@ InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( : AthReentrantAlgorithm(name, pSvcLocator) { +} +InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( + const std::string& name, ISvcLocator* pSvcLocator) + : AthReentrantAlgorithm(name, pSvcLocator) +{ + } +StatusCode InDet::SiSPGNNTrackMaker::initialize() +{ StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_CHECK(m_SpacePointsPixelKey.initialize()); @@ -51,6 +62,9 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() } +StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const +{ + StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const { SG::WriteHandle<TrackCollection> outputTracks{m_outputTracksKey, ctx}; @@ -62,35 +76,40 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const std::vector<const Trk::SpacePoint*> spacePoints; + auto getData = [&](const SG::ReadHandleKey<SpacePointContainer>& containerKey){ + if (not containerKey.empty()){ auto getData = [&](const SG::ReadHandleKey<SpacePointContainer>& containerKey){ if (not containerKey.empty()){ SG::ReadHandle<SpacePointContainer> container{containerKey, ctx}; if (container.isValid()){ - // loop over spacepoint collection - auto spc = container->begin(); - auto spce = container->end(); + // loop over spacepoint collection + auto spc = container->begin(); + auto spce = container->end(); for(; spc != spce; ++spc){ - const SpacePointCollection* spCollection = (*spc); - auto sp = spCollection->begin(); - auto spe = spCollection->end(); + const SpacePointCollection* spCollection = (*spc); + auto sp = spCollection->begin(); + auto spe = spCollection->end(); for(; sp != spe; ++sp) { - const Trk::SpacePoint* spacePoint = (*sp); - spacePoints.push_back(spacePoint); + const Trk::SpacePoint* spacePoint = (*sp); + spacePoints.push_back(spacePoint); + } + } } } - } - } - }; + }; + auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ + if (not containerKey.empty()){ auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ if (not containerKey.empty()){ SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; + SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; - if (collection.isValid()) { - for (const Trk::SpacePoint* sp : *collection) { + if (collection.isValid()){ + for (const Trk::SpacePoint *sp : *collection) { spacePoints.push_back(sp); } } @@ -326,16 +345,19 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const outputTracks->push_back(track.release()); } - ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " - << outputTracks->size() << " tracks stored"); + ATH_MSG_DEBUG("Run " << runNumber << ", Event " << eventNumber << " has " << outputTracks->size() << " tracks stored"); return StatusCode::SUCCESS; } + /////////////////////////////////////////////////////////////////// // Overload of << operator MsgStream /////////////////////////////////////////////////////////////////// +MsgStream& InDet::operator << + (MsgStream& sl,const InDet::SiSPGNNTrackMaker& se) +{ MsgStream& InDet::operator << (MsgStream& sl,const InDet::SiSPGNNTrackMaker& se) { @@ -346,6 +368,9 @@ MsgStream& InDet::operator << // Overload of << operator std::ostream /////////////////////////////////////////////////////////////////// +std::ostream& InDet::operator << + (std::ostream& sl,const InDet::SiSPGNNTrackMaker& se) +{ std::ostream& InDet::operator << (std::ostream& sl,const InDet::SiSPGNNTrackMaker& se) { @@ -356,6 +381,11 @@ std::ostream& InDet::operator << // Dumps relevant information into the MsgStream /////////////////////////////////////////////////////////////////// +MsgStream& InDet::SiSPGNNTrackMaker::dump( MsgStream& out ) const +{ + out<<std::endl; + if(msgLvl(MSG::DEBUG)) return dumpevent(out); + else return dumptools(out); MsgStream& InDet::SiSPGNNTrackMaker::dump( MsgStream& out ) const { out<<std::endl; @@ -367,6 +397,13 @@ MsgStream& InDet::SiSPGNNTrackMaker::dump( MsgStream& out ) const // Dumps conditions information into the MsgStream /////////////////////////////////////////////////////////////////// +MsgStream& InDet::SiSPGNNTrackMaker::dumptools( MsgStream& out ) const +{ + out<<"| Location of output tracks | " + <<std::endl; + out<<"|----------------------------------------------------------------" + <<"----------------------------------------------------|" + <<std::endl; MsgStream& InDet::SiSPGNNTrackMaker::dumptools( MsgStream& out ) const { out<<"| Location of output tracks | " @@ -381,12 +418,17 @@ MsgStream& InDet::SiSPGNNTrackMaker::dumptools( MsgStream& out ) const // Dumps event information into the ostream /////////////////////////////////////////////////////////////////// +MsgStream& InDet::SiSPGNNTrackMaker::dumpevent( MsgStream& out ) const +{ MsgStream& InDet::SiSPGNNTrackMaker::dumpevent( MsgStream& out ) const { return out; } +std::ostream& InDet::SiSPGNNTrackMaker::dump( std::ostream& out ) const +{ + std::ostream& InDet::SiSPGNNTrackMaker::dump( std::ostream& out ) const { return out; -- GitLab From 826625609c890856bd5652af1bbfd5eb87e2a714 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:10:32 -0800 Subject: [PATCH 22/54] indentation --- .../src/SiSPGNNTrackMaker.cxx | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index c1a4bae100ef..166fcd6a8b82 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -84,21 +84,21 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const SG::ReadHandle<SpacePointContainer> container{containerKey, ctx}; if (container.isValid()){ - // loop over spacepoint collection - auto spc = container->begin(); - auto spce = container->end(); + // loop over spacepoint collection + auto spc = container->begin(); + auto spce = container->end(); for(; spc != spce; ++spc){ - const SpacePointCollection* spCollection = (*spc); - auto sp = spCollection->begin(); - auto spe = spCollection->end(); + const SpacePointCollection* spCollection = (*spc); + auto sp = spCollection->begin(); + auto spe = spCollection->end(); for(; sp != spe; ++sp) { - const Trk::SpacePoint* spacePoint = (*sp); - spacePoints.push_back(spacePoint); - } - } + const Trk::SpacePoint* spacePoint = (*sp); + spacePoints.push_back(spacePoint); } } - }; + } + } + }; auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ if (not containerKey.empty()){ -- GitLab From 2cd81eebf59040da6d594aeb011d6e3f3b1bdca0 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Sun, 8 Dec 2024 05:11:53 -0800 Subject: [PATCH 23/54] more indentation --- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 166fcd6a8b82..76c3dd1d9d1c 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -92,8 +92,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const auto sp = spCollection->begin(); auto spe = spCollection->end(); for(; sp != spe; ++sp) { - const Trk::SpacePoint* spacePoint = (*sp); - spacePoints.push_back(spacePoint); + const Trk::SpacePoint* spacePoint = (*sp); + spacePoints.push_back(spacePoint); } } } @@ -110,11 +110,11 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (collection.isValid()){ for (const Trk::SpacePoint *sp : *collection) { - spacePoints.push_back(sp); - } - } + spacePoints.push_back(sp); } - }; + } + } + }; getData(m_SpacePointsPixelKey); int npixsp = spacePoints.size(); -- GitLab From 2057a4732195f7d227a520866315ee135878d62e Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 01:37:06 -0800 Subject: [PATCH 24/54] rid of doathenaambituityresolution --- .../InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py | 1 - 1 file changed, 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index a4b49b7fd1fa..cddaec8b5ac7 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,7 +27,6 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") - icf.addFlag("Tracking.GNN.doAthenaAmbiguityResolution", False) icf.addFlag("Tracking.GNN.areInputClusters", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) -- GitLab From b89d538efd69f1ef325deeaf10e22611067b27cb Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 10:52:31 +0100 Subject: [PATCH 25/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Alexis Vallier <alexis.vallier@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 76c3dd1d9d1c..e211e449d3ea 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -122,7 +122,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const << " pixel space points"); getData(m_SpacePointsSCTKey); ATH_MSG_DEBUG("Event " << eventNumber << " has " - << spacePoints.size() - npixsp << " SCT space points"); + << spacePoints.size() - npixsp << " Strips space points"); int nNonOverlap = spacePoints.size(); ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap << " non-overlapping spacepoints"); -- GitLab From 632f4b5b51ba5b6bcf68d8c87ab42dcac546ea40 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 03:05:31 -0800 Subject: [PATCH 26/54] change SCT -> strip --- .../src/SiSPGNNTrackMaker.cxx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index e211e449d3ea..e6692faf97e0 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -135,14 +135,19 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (m_areInputClusters) { SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, ctx); - SG::ReadHandle<InDet::SCT_ClusterContainer> sctcontainer(m_ClusterSCTKey, + SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterSCTKey, ctx); - if (!pixcontainer.isValid() || !sctcontainer.isValid()) { + if (!pixcontainer.isValid()) { ATH_MSG_ERROR("Pixel container invalid, returning"); return StatusCode::FAILURE; } + if (!strip_container.isValid()) { + ATH_MSG_ERROR("Strip container invalid, returning"); + return StatusCode::FAILURE; + } + auto pixcollection = pixcontainer->begin(); auto pixcollectionEnd = pixcontainer->end(); for (; pixcollection != pixcollectionEnd; ++pixcollection) { @@ -159,14 +164,14 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } } - auto sctcollection = sctcontainer->begin(); - auto sctcollectionEnd = sctcontainer->end(); - for (; sctcollection != sctcollectionEnd; ++sctcollection) { - if ((*sctcollection)->empty()) { - ATH_MSG_WARNING("Empty SCT cluster collection encountered"); + auto strip_collection = strip_container->begin(); + auto strip_collectionEnd = strip_container->end(); + for (; strip_collection != strip_collectionEnd; ++strip_collection) { + if ((*strip_collection)->empty()) { + ATH_MSG_WARNING("Empty strip cluster collection encountered"); continue; } - auto const* clusterCollection = (*sctcollection); + auto const* clusterCollection = (*strip_collection); auto thisCluster = clusterCollection->begin(); auto clusterEnd = clusterCollection->end(); for (; thisCluster != clusterEnd; ++thisCluster) { -- GitLab From 45dd5b7a8ec6b933abc08e47a957bd934a64e868 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 09:10:52 -0800 Subject: [PATCH 27/54] implement thomas's suggestion --- InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index 17562be3e955..3eace5039d87 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -349,6 +349,7 @@ def ITkTrackFinalCfg(flags, InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer] doGNNWithoutAmbiReso = (hasattr(flags.Tracking, "ITkGNNPass") and flags.Tracking.ITkGNNPass.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution)) + skipClusterMerge = doGNNWithoutAmbiReso or flags.Tracking.doITkFastTracking # This merges track collections from TrkConfig.TrkTrackCollectionMergerConfig import ( ITkTrackCollectionMergerAlgCfg) @@ -357,7 +358,7 @@ def ITkTrackFinalCfg(flags, InputCombinedTracks=InputCombinedITkTracks, OutputCombinedTracks=TrackContainer, AssociationMapName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else f"PRDtoTrackMapMerge_{TrackContainer}"))) if flags.Tracking.doTruth: @@ -384,10 +385,10 @@ def ITkTrackFinalCfg(flags, result.merge(ITkTrackParticleCnvAlgCfg( flags, ClusterSplitProbabilityName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else splitProbName), AssociationMapName=( - "" if flags.Tracking.doITkFastTracking or doGNNWithoutAmbiReso else + "" if skipClusterMerge else f"PRDtoTrackMapMerge_{TrackContainer}"), isActsAmbi = 'ActsValidateResolvedTracks' in splitProbName or \ 'ActsValidateAmbiguityResolution' in splitProbName or \ -- GitLab From 24e473fb8d58bf5d47a5b88800747d0c3db1cd75 Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:18:11 +0100 Subject: [PATCH 28/54] ITk track summary config --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 0c29023925e4..710d5783df40 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -105,10 +105,10 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): kwargs.setdefault("TrackFitter", InDetTrackFitter) if "TrackSummaryTool" not in kwargs: - from TrkConfig.TrkTrackSummaryToolConfig import InDetTrackSummaryToolCfg + from TrkConfig.TrkTrackSummaryToolConfig import ITkTrackSummaryToolCfg kwargs.setdefault( - "TrackSummaryTool", acc.popToolsAndMerge(InDetTrackSummaryToolCfg(flags)) + "TrackSummaryTool", acc.popToolsAndMerge(ITkTrackSummaryToolCfg(flags)) ) if flags.Tracking.GNN.useTrackFinder: -- GitLab From 27e82d8f0ec9e26fb46848b1d037d2a5b241343a Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:39:30 +0100 Subject: [PATCH 29/54] Apply 4 suggestion(s) to 3 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- .../python/InDetGNNTrackingConfig.py | 2 +- .../InDetGNNTracking/src/GNNTrackReaderTool.cxx | 12 ++++++------ .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 710d5783df40..f968868ecb35 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -126,7 +126,7 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): if "AssociationToolNotGanged" not in kwargs: from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg - acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) + kwargs.setdefault("AssociationToolNotGanged ", acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags))) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx index f38e8270c465..e36b383c6d0c 100644 --- a/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx +++ b/InnerDetector/InDetGNNTracking/src/GNNTrackReaderTool.cxx @@ -59,12 +59,12 @@ void InDet::GNNTrackReaderTool::getTracks(uint32_t runNumber, uint32_t eventNumb std::stringstream lineStream(line); std::string cell; std::vector<uint32_t> trackCandidate; - // allow both "," and " " as delimiter - char delimiter = ','; - if (line.find(delimiter) == std::string::npos) { - delimiter = ' '; - } - while (std::getline(lineStream, cell, delimiter)) { + // allow both "," and " " as delimiter + char delimiter = ','; + if (line.find(delimiter) == std::string::npos) { + delimiter = ' '; + } + while (std::getline(lineStream, cell, delimiter)) { uint32_t cellId = 0; try { cellId = std::stoi(cell); diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index e6692faf97e0..c9a29b722893 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -253,7 +253,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } // get cluster list - int nPIX(0), nSCT(0); + int nPIX(0), nStrip(0); // if use input clusters, get the cluster list from clusterTracks if (m_areInputClusters) { std::vector<uint32_t> clusterIndices = clusterTracks[trackCounter]; @@ -274,11 +274,11 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (sp->clusterList().first->type(Trk::PrepRawDataType::PixelCluster)) nPIX++; if (sp->clusterList().first->type(Trk::PrepRawDataType::SCT_Cluster)) - nSCT++; + nStrip++; clusters.push_back(sp->clusterList().first); if (sp->clusterList().second != nullptr) { clusters.push_back(sp->clusterList().second); - nSCT++; + nStrip++; } } } @@ -286,7 +286,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const ATH_MSG_DEBUG("Track " << trackCounter << " has " << trackCandidate.size() << " space points, " << clusters.size() << " clusters, " << nPIX << " pixel clusters, " - << nSCT << " SCT clusters"); + << nStrip << " Strip clusters"); // reject track with less than 3 space point hits, the conformal map will // fail any way -- GitLab From 5aeb2b24c6e3eaaa47cc4ba4c344b11db3544630 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 09:48:20 -0800 Subject: [PATCH 30/54] remove remaining nSCT --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index c9a29b722893..ac95998a0318 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -266,7 +266,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (allClusters[id]->type(Trk::PrepRawDataType::PixelCluster)) nPIX++; if (allClusters[id]->type(Trk::PrepRawDataType::SCT_Cluster)) - nSCT++; + nStrip++; clusters.push_back(allClusters[id]); } // if not get list of clusters from space points } else { -- GitLab From 7894ba5541a2695f63115d0c07696d9fd6682f0a Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 18:49:33 +0100 Subject: [PATCH 31/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index ac95998a0318..7f9f032edcc0 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -335,8 +335,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // compute pT and skip if pT too low const Trk::Perigee* origPerigee = track->perigeeParameters(); - double pt = sqrt(pow(origPerigee->momentum().x(), 2) + - pow(origPerigee->momentum().y(), 2)); + double pt = std::hypot(origPerigee->momentum().x(), origPerigee->momentum().y()); ATH_MSG_DEBUG("Track " << trackCounter << " has pT: " << pt); if (pt < 500) { ATH_MSG_DEBUG("Track " << trackCounter -- GitLab From f5a893585db26885b8b0c733a1832f800fffb8b7 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 10:34:07 -0800 Subject: [PATCH 32/54] info->debug --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 8 ++++---- .../python/InDetGNNTrackingConfigFlags.py | 2 +- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 6 +++--- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index f968868ecb35..1f3d322ec194 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -122,11 +122,11 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): else: raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") - kwargs.setdefault("areInputClusters", flags.Tracking.GNN.areInputClusters) - - if "AssociationToolNotGanged" not in kwargs: + kwargs.setdefault("areInputClusters", flags.Tracking.GNN.useClusterTracks) + + if not flags.Tracking.GNN.doAmbiResolution: from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg - kwargs.setdefault("AssociationToolNotGanged ", acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags))) + acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index cddaec8b5ac7..22ce3ca7eb02 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -27,7 +27,7 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.inputTracksDir", "gnntracks") icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") - icf.addFlag("Tracking.GNN.areInputClusters", False) + icf.addFlag("Tracking.GNN.useClusterTracks", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) return icf diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 7f9f032edcc0..170f7eb81646 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -33,7 +33,7 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() ATH_CHECK(m_SpacePointsSCTKey.initialize()); ATH_CHECK(m_SpacePointsOverlapKey.initialize()); ATH_CHECK(m_ClusterPixelKey.initialize()); - ATH_CHECK(m_ClusterSCTKey.initialize()); + ATH_CHECK(m_ClusterStripKey.initialize()); ATH_CHECK(m_outputTracksKey.initialize()); @@ -127,7 +127,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const ATH_MSG_DEBUG("Event " << eventNumber << " has " << nNonOverlap << " non-overlapping spacepoints"); getOverlapData(m_SpacePointsOverlapKey); - ATH_MSG_INFO("Event " << eventNumber << " has " << spacePoints.size() + ATH_MSG_DEBUG("Event " << eventNumber << " has " << spacePoints.size() << " space points"); // get clusters @@ -135,7 +135,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (m_areInputClusters) { SG::ReadHandle<InDet::PixelClusterContainer> pixcontainer(m_ClusterPixelKey, ctx); - SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterSCTKey, + SG::ReadHandle<InDet::SCT_ClusterContainer> strip_container(m_ClusterStripKey, ctx); if (!pixcontainer.isValid()) { diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index f967056640a2..9ec41184f50d 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -66,8 +66,8 @@ namespace InDet { //@} SG::ReadHandleKey<InDet::PixelClusterContainer> m_ClusterPixelKey{ this, "PixelClusterContainer", "ITkPixelClusters"}; - SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterSCTKey{ - this, "SCT_ClusterContainer", "ITkStripClusters"}; + SG::ReadHandleKey<InDet::SCT_ClusterContainer> m_ClusterStripKey{ + this, "StripClusterContainer", "ITkStripClusters"}; // output container SG::WriteHandleKey<TrackCollection> m_outputTracksKey{ -- GitLab From 932aa2270ebfc2c279c9865f0a8ed6c73d522490 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 10:40:51 -0800 Subject: [PATCH 33/54] range-based loop --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 170f7eb81646..f1b9a874d6b4 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -248,8 +248,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const std::sort(distanceSortedSPs.begin(), distanceSortedSPs.end()); // add SP to trk candidate in the same order - for (size_t i = 0; i < distanceSortedSPs.size(); i++) { - trackCandidate.push_back(distanceSortedSPs[i].second); + for (std::pair<double, const Trk::SpacePoint*> pair : distanceSortedSPs) { + trackCandidate.push_back(pair.second); } // get cluster list -- GitLab From 3b78ca638c873f49c0f5d12e6841a4cacd10072a Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 19:42:58 +0100 Subject: [PATCH 34/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index f1b9a874d6b4..15646deadf40 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -237,7 +237,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const if (sp != nullptr) { distanceSortedSPs.push_back( std::make_pair( - pow(sp->globalPosition().x(), 2) + pow(sp->globalPosition().y(), 2), + std::pow(sp->globalPosition().x(), 2) + std::pow(sp->globalPosition().y(), 2), sp ) ); -- GitLab From 06973c636f2b470d3d6767a1811e66780ce4d871 Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Mon, 9 Dec 2024 19:49:27 +0100 Subject: [PATCH 35/54] Apply 1 suggestion(s) to 1 file(s) Co-authored-by: Thomas Strebler <thomas.strebler@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 15646deadf40..c1f3325a35a8 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -180,7 +180,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const } } - ATH_MSG_INFO("Event " << eventNumber << " has " << allClusters.size() + ATH_MSG_DEBUG("Event " << eventNumber << " has " << allClusters.size() << " clusters"); } -- GitLab From 7bb20b59a27f0f966e8452170e6757039d0f070a Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Mon, 9 Dec 2024 16:40:00 -0800 Subject: [PATCH 36/54] get rid of PRD tool --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 4 ---- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 1f3d322ec194..0fb90cb7f286 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -123,10 +123,6 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): raise RuntimeError("GNNTrackFinder or GNNTrackReader must be enabled!") kwargs.setdefault("areInputClusters", flags.Tracking.GNN.useClusterTracks) - - if not flags.Tracking.GNN.doAmbiResolution: - from TrkConfig.TrkAssociationToolsConfig import PRDtoTrackMapToolCfg - acc.popToolsAndMerge(PRDtoTrackMapToolCfg(flags)) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index fd77806bb64c..66905079af9c 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -85,8 +85,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const auto getOverlapData = [&](const SG::ReadHandleKey<SpacePointOverlapCollection>& containerKey){ if (not containerKey.empty()){ - - SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; + SG::ReadHandle<SpacePointOverlapCollection> collection{containerKey, ctx}; if (collection.isValid()){ -- GitLab From fabc3839830a1c409558323c4f12dedefd566029 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Tue, 10 Dec 2024 04:02:57 -0800 Subject: [PATCH 37/54] cleaner chec for GNN no ambi --- InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py index 3eace5039d87..33f23ea54954 100644 --- a/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py +++ b/InnerDetector/InDetConfig/python/ITkTrackRecoConfig.py @@ -348,7 +348,8 @@ def ITkTrackFinalCfg(flags, #schedule merge to combine signal and background tracks InputCombinedITkTracks += [flags.Overlay.BkgPrefix + TrackContainer] - doGNNWithoutAmbiReso = (hasattr(flags.Tracking, "ITkGNNPass") and flags.Tracking.ITkGNNPass.doGNNTrack and (not flags.Tracking.GNN.doAmbiResolution)) + from TrkConfig.TrkConfigFlags import TrackingComponent + doGNNWithoutAmbiReso = (TrackingComponent.GNNChain in flags.Tracking.recoChain and (not flags.Tracking.GNN.doAmbiResolution)) skipClusterMerge = doGNNWithoutAmbiReso or flags.Tracking.doITkFastTracking # This merges track collections from TrkConfig.TrkTrackCollectionMergerConfig import ( -- GitLab From 4aeb617030b16b878265ae762a8388c0d2ce5009 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Tue, 10 Dec 2024 05:18:35 -0800 Subject: [PATCH 38/54] change condition --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index ab8d0afee27d..839ff06c0066 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -565,7 +565,7 @@ void InDet::SiSPGNNTrackMaker::filterSharedTracks( } auto maxIt = std::max_element(status_codes.begin(), status_codes.end()); - int max_code = *maxIt ? maxIt != status_codes.end() : 10; + int max_code = maxIt != status_codes.end() ? *maxIt : 10; for (int code = 1; code <= max_code; code++) { ATH_MSG_INFO(std::count(status_codes.begin(), status_codes.end(), code) -- GitLab From 4e0707a6ef1ee2f1dbc41bbaf01d15dbf2962e8c Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 02:24:48 -0800 Subject: [PATCH 39/54] remove duplicate --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index f461ab53d7a6..1b1fc29cf39c 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -358,9 +358,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // conformal mapping for track parameters auto trkParameters = m_seedFitter->fit(trackCandidate); - auto trkParameters = m_seedFitter->fit(trackCandidate); if (trkParameters == nullptr) { - ATH_MSG_DEBUG("Conformal mapping failed"); ATH_MSG_DEBUG("Conformal mapping failed"); continue; } -- GitLab From 1e8728b5c0472521f506054d94d68f31d0dd629a Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:03:26 -0800 Subject: [PATCH 40/54] remove duplicate --- .../InDetGNNTracking/python/InDetGNNTrackingConfig.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index 8e0085494af5..e85e61071e70 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -128,15 +128,12 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): # add eta dependent cut service if "InDetEtaDependentCutSvc" not in kwargs: from InDetConfig.InDetEtaDependentCutsConfig import ITkEtaDependentCutsSvcCfg - # import AthenaCommon.SystemOfUnits as Units - # flags.Tracking.ActiveConfig.minPT = [400. * Units.MeV, 400. * Units.MeV, 400. * Units.MeV] acc.merge(ITkEtaDependentCutsSvcCfg(flags)) kwargs.setdefault("InDetEtaDependentCutsSvc", acc.getService("ITkEtaDependentCutsSvc"+flags.Tracking.ActiveConfig.extension)) kwargs.setdefault("nClustersMin", flags.Tracking.GNN.nClustersMin) kwargs.setdefault("pTmin", flags.Tracking.GNN.pTmin) kwargs.setdefault("etamax", flags.Tracking.GNN.etamax) - kwargs.setdefault("doRecoTrackCuts", flags.Tracking.GNN.doRecoTrackCuts) kwargs.setdefault("minPixelHits", flags.Tracking.GNN.minPixelHits) kwargs.setdefault("minStripHits", flags.Tracking.GNN.minStripHits) -- GitLab From 464a0daad717474b98d5c06a46f73e40f7e9eaaa Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:08:43 -0800 Subject: [PATCH 41/54] add some comment --- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 1b1fc29cf39c..596766846862 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -253,8 +253,19 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // and perform track fitting for each. int trackCounter = -1; std::multimap<double, Trk::Track*> qualitySortedTrackCandidates; - + // track processing loop for (auto& trackIndices : TT) { + // For each track candidate: + // 1. Sort space points by distance from origin + // 2. Get associated clusters + // 3. Perform track fitting: + // - Initial conformal mapping + // - First chi2 fit without outlier removal + // - Second chi2 fit with perigee parameters + // - Final fit with outlier removal + // 4. Apply quality cuts (pT, eta) + // 5. Compute track summary + // 6. Store track if it passes all criteria std::vector<const Trk::PrepRawData*> clusters; std::vector<const Trk::SpacePoint*> trackCandidate; -- GitLab From cd058cccbc3ac68548050194b39e7121487773b9 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:21:00 -0800 Subject: [PATCH 42/54] add some comment --- .../python/InDetGNNTrackingConfigFlags.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 601b8edb0a9c..5b184ac516db 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -29,17 +29,18 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.useClusterTracks", False) icf.addFlag("Tracking.GNN.doAmbiResolution", True) - icf.addFlag("Tracking.GNN.doRecoTrackCuts", True) - - icf.addFlag("Tracking.GNN.etamax", 4.0) + + # the following cuts are applied to the tracks before the track fitting icf.addFlag("Tracking.GNN.minPixelHits", 1) icf.addFlag("Tracking.GNN.minStripHits", 0) icf.addFlag("Tracking.GNN.nClustersMin", 6) + + # the following cuts are applied to the tracks after the track fitting + icf.addFlag("Tracking.GNN.etamax", 4.0) import AthenaCommon.SystemOfUnits as Units icf.addFlag("Tracking.GNN.pTmin", 400. * Units.MeV) - - - + # This option applies eta dependent and applied to the output tracks + icf.addFlag("Tracking.GNN.doRecoTrackCuts", True) return icf -- GitLab From b66f91976427d78b973049c115603b98b000a07d Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:25:22 -0800 Subject: [PATCH 43/54] change some flag names --- .../InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 5b184ac516db..688038b77c97 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -31,9 +31,9 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.doAmbiResolution", True) # the following cuts are applied to the tracks before the track fitting - icf.addFlag("Tracking.GNN.minPixelHits", 1) - icf.addFlag("Tracking.GNN.minStripHits", 0) - icf.addFlag("Tracking.GNN.nClustersMin", 6) + icf.addFlag("Tracking.GNN.minPixelClusters", 1) + icf.addFlag("Tracking.GNN.minStripClusters", 0) + icf.addFlag("Tracking.GNN.minClusters", 6) # the following cuts are applied to the tracks after the track fitting icf.addFlag("Tracking.GNN.etamax", 4.0) -- GitLab From e620f298f40c7355fc8ed81f930245b44d16d00a Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:42:57 -0800 Subject: [PATCH 44/54] apply min cluster cut before fit --- .../python/InDetGNNTrackingConfig.py | 6 +++--- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 18 ++++++++++++++---- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 8 ++++---- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py index e85e61071e70..71ce01594fb9 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfig.py @@ -131,11 +131,11 @@ def GNNEndToEndTrackMaker(flags, name="GNNEndToEndTrackMaker", **kwargs): acc.merge(ITkEtaDependentCutsSvcCfg(flags)) kwargs.setdefault("InDetEtaDependentCutsSvc", acc.getService("ITkEtaDependentCutsSvc"+flags.Tracking.ActiveConfig.extension)) - kwargs.setdefault("nClustersMin", flags.Tracking.GNN.nClustersMin) + kwargs.setdefault("minClusters", flags.Tracking.GNN.minClusters) kwargs.setdefault("pTmin", flags.Tracking.GNN.pTmin) kwargs.setdefault("etamax", flags.Tracking.GNN.etamax) - kwargs.setdefault("minPixelHits", flags.Tracking.GNN.minPixelHits) - kwargs.setdefault("minStripHits", flags.Tracking.GNN.minStripHits) + kwargs.setdefault("minPixelClusters", flags.Tracking.GNN.minPixelClusters) + kwargs.setdefault("minStripClusters", flags.Tracking.GNN.minStripClusters) acc.addEventAlgo(CompFactory.InDet.SiSPGNNTrackMaker(name, **kwargs)) return acc diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 596766846862..2c4af03156c1 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -87,9 +87,9 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() ATH_MSG_INFO("Applying the following cuts during reconstruction: "); ATH_MSG_INFO("Min pT: " << m_pTmin); ATH_MSG_INFO("Max eta: " << m_etamax); - ATH_MSG_INFO("Min number of clusters hits: " << m_nclusmin); - ATH_MSG_INFO("Min number of pixel hits: " << m_minPixHits); - ATH_MSG_INFO("Min number of strip hits: " << m_minStripHits); + ATH_MSG_INFO("Min number of clusters: " << m_minClusters); + ATH_MSG_INFO("Min number of pixel clusters: " << m_minPixelClusters); + ATH_MSG_INFO("Min number of strip clusters: " << m_minStripClusters); if (m_doRecoTrackCuts) { @@ -361,7 +361,17 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const continue; } - if (static_cast<int>(clusters.size()) < m_nclusmin) { + if (nPIX < m_minPixelClusters) { + ATH_MSG_DEBUG("Track " << trackCounter << " does not have enough pixel clusters, rejecting"); + continue; + } + + if (nStrip < m_minStripClusters) { + ATH_MSG_DEBUG("Track " << trackCounter << " does not have enough strip clusters, rejecting"); + continue; + } + + if (static_cast<int>(clusters.size()) < m_minClusters) { ATH_MSG_DEBUG("Track " << trackCounter << " does not have enough hits, rejecting"); continue; diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index c0a747e1d7bf..79b5413c334f 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -107,16 +107,16 @@ namespace InDet { BooleanProperty m_areInputClusters{ this, "areInputClusters", false, "Read track candidates as list of clusters"}; - IntegerProperty m_nclusmin{this, "nClustersMin", 6, "Min number clusters"}; + IntegerProperty m_minClusters{this, "minClusters", 6, "Min number clusters"}; DoubleProperty m_pTmin{this, "pTmin", 400., "min pT"}; DoubleProperty m_etamax{this, "etamax", 4., "max reco eta"}; BooleanProperty m_doRecoTrackCuts{this, "doRecoTrackCuts", false, "Apply Loose track cuts"}; - IntegerProperty m_minPixHits{this, "minPixelHits", 1, "min pixel hits"}; - IntegerProperty m_minStripHits{this, "minStripHits", 0, - "Minimum number of strip hits"}; + IntegerProperty m_minPixelClusters{this, "minPixelClusters", 1, "min pixel clusters"}; + IntegerProperty m_minStripClusters{this, "minStripClusters", 0, + "Minimum number of strip clusters"}; // eta dependent track selection ServiceHandle<IInDetEtaDependentCutsSvc> m_etaDependentCutsSvc{ this, "InDetEtaDependentCutsSvc", "InDetEtaDependentCutsSvc"}; -- GitLab From 70b986edddf0bde2ffe263cb0357abc27895d997 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 03:56:49 -0800 Subject: [PATCH 45/54] some rearrangement --- .../python/InDetGNNTrackingConfigFlags.py | 5 ++++- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 16 ++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 688038b77c97..3c0c5e34498d 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -28,7 +28,6 @@ def createGNNTrackingConfigFlags(): icf.addFlag("Tracking.GNN.TrackReader.csvPrefix", "track") icf.addFlag("Tracking.GNN.useClusterTracks", False) - icf.addFlag("Tracking.GNN.doAmbiResolution", True) # the following cuts are applied to the tracks before the track fitting icf.addFlag("Tracking.GNN.minPixelClusters", 1) @@ -43,4 +42,8 @@ def createGNNTrackingConfigFlags(): # This option applies eta dependent and applied to the output tracks icf.addFlag("Tracking.GNN.doRecoTrackCuts", True) + # this option turns on the ambiguity resolution, False by default + icf.addFlag("Tracking.GNN.doAmbiResolution", False) + return icf + diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index 79b5413c334f..089958a33876 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -107,19 +107,19 @@ namespace InDet { BooleanProperty m_areInputClusters{ this, "areInputClusters", false, "Read track candidates as list of clusters"}; - IntegerProperty m_minClusters{this, "minClusters", 6, "Min number clusters"}; - - DoubleProperty m_pTmin{this, "pTmin", 400., "min pT"}; - DoubleProperty m_etamax{this, "etamax", 4., "max reco eta"}; - BooleanProperty m_doRecoTrackCuts{this, "doRecoTrackCuts", false, "Apply Loose track cuts"}; - IntegerProperty m_minPixelClusters{this, "minPixelClusters", 1, "min pixel clusters"}; - IntegerProperty m_minStripClusters{this, "minStripClusters", 0, - "Minimum number of strip clusters"}; // eta dependent track selection ServiceHandle<IInDetEtaDependentCutsSvc> m_etaDependentCutsSvc{ this, "InDetEtaDependentCutsSvc", "InDetEtaDependentCutsSvc"}; + + IntegerProperty m_minClusters{this, "minClusters", 6, "Min number clusters"}; + IntegerProperty m_minPixelClusters{this, "minPixelClusters", 1, "min pixel clusters"}; + IntegerProperty m_minStripClusters{this, "minStripClusters", 0, + "Minimum number of strip clusters"}; + DoubleProperty m_pTmin{this, "pTmin", 400., "min pT"}; + DoubleProperty m_etamax{this, "etamax", 4., "max reco eta"}; + int passEtaDepCuts(const Trk::Track* track, int nClusters, int nFreeClusters, int nPixels) const; -- GitLab From a51703c894b11762e699429c4c6d620f53fd9576 Mon Sep 17 00:00:00 2001 From: Minh Tuan Pham <tuan.minh.pham@cern.ch> Date: Wed, 11 Dec 2024 12:57:29 +0100 Subject: [PATCH 46/54] Apply 2 suggestion(s) to 1 file(s) Co-authored-by: Alexis Vallier <alexis.vallier@cern.ch> --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 2c4af03156c1..319c3837b998 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -84,7 +84,7 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() // retrieve eta dependent cut svc ATH_CHECK(m_etaDependentCutsSvc.retrieve()); - ATH_MSG_INFO("Applying the following cuts during reconstruction: "); + ATH_MSG_INFO("Applying the following cuts during GNN-based track reconstruction: "); ATH_MSG_INFO("Min pT: " << m_pTmin); ATH_MSG_INFO("Max eta: " << m_etamax); ATH_MSG_INFO("Min number of clusters: " << m_minClusters); @@ -93,7 +93,7 @@ StatusCode InDet::SiSPGNNTrackMaker::initialize() if (m_doRecoTrackCuts) { - ATH_MSG_INFO("Applying the following eta dependant track cuts after reconstruction: "); + ATH_MSG_INFO("Applying the following eta dependant track cuts after GNN-based track reconstruction: "); std::vector <double> etaBins, minPT, maxz0, maxd0; std::vector <int> minClusters, minPixelHits, maxHoles; m_etaDependentCutsSvc->getValue(InDet::CutName::etaBins, etaBins); -- GitLab From 60a74e644e032b3568e4984b32d0b3b717645d49 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 04:44:23 -0800 Subject: [PATCH 47/54] add some cm --- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 319c3837b998..8f68b439cf2b 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -520,15 +520,23 @@ int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, void InDet::SiSPGNNTrackMaker::filterSharedTracks( std::multimap<double, Trk::Track*>& qualitySortedTracks) const { + + // initialize a vector to store all clusters on all tracks, to check with clusters in the next track std::set<const Trk::PrepRawData*> clusters; + // initialize a vector to store all free clusters on a track, those that are uniquely + // associated with the current track std::vector<const Trk::PrepRawData*> freeClusters; freeClusters.reserve(15); + // iterator over all track candidates, sorted by quality std::multimap<double, Trk::Track*>::iterator it_qualityAndTrack = qualitySortedTracks.begin(); + // initialize a vector to store status codes for each track, for debugging + // purposes. A track passing all cuts will have a status code 0. std::vector<int> status_codes; + /// loop over all track candidates, sorted by quality while (it_qualityAndTrack != qualitySortedTracks.end()) { freeClusters.clear(); @@ -586,11 +594,12 @@ void InDet::SiSPGNNTrackMaker::filterSharedTracks( } } + // for debugging, print out the number of tracks that fail each cut auto maxIt = std::max_element(status_codes.begin(), status_codes.end()); int max_code = maxIt != status_codes.end() ? *maxIt : 10; for (int code = 1; code <= max_code; code++) { - ATH_MSG_INFO(std::count(status_codes.begin(), status_codes.end(), code) + ATH_MSG_DEBUG(std::count(status_codes.begin(), status_codes.end(), code) << " tracks fail with status code " << code); } } -- GitLab From 16fb85b74842f2f554f6f34361a568277c327b45 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 04:46:55 -0800 Subject: [PATCH 48/54] add some cm --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 8f68b439cf2b..a9ca76e76836 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -579,6 +579,7 @@ void InDet::SiSPGNNTrackMaker::filterSharedTracks( clusters.insert(freeClusters.begin(), freeClusters.end()); int nFreeClusters = static_cast<int>(freeClusters.size()); + // if we actually do track cuts, check if the track passes the eta dependent cuts, else set status code to 0 (pass) int status_code = m_doRecoTrackCuts ? passEtaDepCuts((*it_qualityAndTrack).second, nClusters, nFreeClusters, nPixels) -- GitLab From f0c05e6350f31601c1fc54ac4a1fd62b9488a0a8 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 05:04:05 -0800 Subject: [PATCH 49/54] add cm --- .../InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py index 3c0c5e34498d..63eb29062b56 100644 --- a/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py +++ b/InnerDetector/InDetGNNTracking/python/InDetGNNTrackingConfigFlags.py @@ -39,7 +39,7 @@ def createGNNTrackingConfigFlags(): import AthenaCommon.SystemOfUnits as Units icf.addFlag("Tracking.GNN.pTmin", 400. * Units.MeV) - # This option applies eta dependent and applied to the output tracks + # This option applies eta dependent track selection to the output tracks icf.addFlag("Tracking.GNN.doRecoTrackCuts", True) # this option turns on the ambiguity resolution, False by default -- GitLab From fbfbdf88b89adfef7552fef39e3ec2dd2e9d66af Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Wed, 11 Dec 2024 12:36:26 -0800 Subject: [PATCH 50/54] count hits from track obj in passEtaDepCuts --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index a9ca76e76836..d36fc9f02b8d 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -487,6 +487,10 @@ int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, int nHolesOnTrack = track->trackSummary()->get(Trk::numberOfPixelHoles) + track->trackSummary()->get(Trk::numberOfSCTHoles); + nPixels = track->trackSummary()->get(Trk::numberOfPixelHits); + int nStrip = track->trackSummary()->get(Trk::numberOfSCTHits); + nClusters = nPixels + nStrip; + ATH_MSG_DEBUG("track params: " << pt << " " << eta << " " << d0 << " " << z0 << " " << nClusters << " " << nFreeClusters << " " << nPixels); -- GitLab From ca4638663980efb339b2734c9376a580e8536cbe Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Thu, 12 Dec 2024 01:31:47 -0800 Subject: [PATCH 51/54] get rid of track quality loop --- .../src/SiSPGNNTrackMaker.cxx | 175 ++---------------- .../InDetGNNTracking/src/SiSPGNNTrackMaker.h | 7 +- 2 files changed, 21 insertions(+), 161 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index d36fc9f02b8d..f37963f4a424 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -17,40 +17,6 @@ InDet::SiSPGNNTrackMaker::SiSPGNNTrackMaker( } -double InDet::SiSPGNNTrackMaker::trackQuality(const Trk::Track* Tr) const { - - double quality = 0.; - double baseScorePerHit = 17.; - /// check all hits on the track - for (const Trk::TrackStateOnSurface* m : *(Tr->trackStateOnSurfaces())) { - /// exclude anything which is not an actual hit - if (not m->type(Trk::TrackStateOnSurface::Measurement)) - continue; - /// retrieve the fit quality for a given hit - const Trk::FitQualityOnSurface fq = m->fitQualityOnSurface(); - if (!fq) - continue; - - double x2 = fq.chiSquared(); - double hitQualityScore; - /// score the hit based on the technology (pixels get higher score) and - /// the local chi2 for the hit - if (fq.numberDoF() == 2) - hitQualityScore = (1.2 * (baseScorePerHit - x2 * .5)); // pix - else - hitQualityScore = (baseScorePerHit - x2); // sct - if (hitQualityScore < 0.) - hitQualityScore = - 0.; // do not allow a bad hit to decrement the overall score - quality += hitQualityScore; - } - /// penalise brem tracks - if (Tr->info().trackProperties(Trk::TrackInfo::BremFit)) - quality *= 0.7; - - return quality; -} - StatusCode InDet::SiSPGNNTrackMaker::initialize() { ATH_CHECK(m_SpacePointsPixelKey.initialize()); @@ -253,7 +219,8 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const // and perform track fitting for each. int trackCounter = -1; std::multimap<double, Trk::Track*> qualitySortedTrackCandidates; - // track processing loop + std::vector<int> status_codes; + // track processing loop for (auto& trackIndices : TT) { // For each track candidate: // 1. Sort space points by distance from origin @@ -438,31 +405,16 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const m_trackSummaryTool->computeAndReplaceTrackSummary( *track, false /* DO NOT suppress hole search*/); - // create track quality - track pair - std::unique_ptr<Trk::TrackStates> ts = - std::make_unique<Trk::TrackStates>(*(track->trackStateOnSurfaces())); - std::unique_ptr<Trk::FitQuality> fq = - std::make_unique<Trk::FitQuality>(*(track->fitQuality())); - Trk::Track t(track->info(), std::move(ts), std::move(fq)); - - Trk::Track* track_rawPtr = track.release(); - - std::pair TQPair = std::make_pair(-trackQuality(&t), track_rawPtr); - qualitySortedTrackCandidates.insert(TQPair); - + int passTrackCut = (m_doRecoTrackCuts) ? passEtaDepCuts(*track) : 0; + status_codes.push_back(passTrackCut); + if (passTrackCut==0) { + outputTracks->push_back(track.release()); + } } - ATH_MSG_INFO("Event " << eventNumber << " has " << qualitySortedTrackCandidates.size() << " tracks found"); - - filterSharedTracks(qualitySortedTrackCandidates); - - ATH_MSG_INFO("Event " << eventNumber << " has " << qualitySortedTrackCandidates.size() - << " tracks remains after filtering shared tracks"); - - for (const std::pair<const double, Trk::Track*>& qualityAndTrack : - qualitySortedTrackCandidates) { - outputTracks->push_back(qualityAndTrack.second); - } + ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " + << std::count(status_codes.begin(), status_codes.end(), 0) + << " tracks remains after applying track cuts"); return StatusCode::SUCCESS; } @@ -471,11 +423,9 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const -int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, - int nClusters, - int nFreeClusters, - int nPixels) const { - const Trk::Perigee* origPerigee = track->perigeeParameters(); +int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track& track) const +{ + const Trk::Perigee* origPerigee = track.perigeeParameters(); double pt = origPerigee->pT(); double eta = std::abs(origPerigee->eta()); @@ -484,15 +434,15 @@ int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, double z0 = std::abs(origPerigee->parameters()[Trk::z0]); - int nHolesOnTrack = track->trackSummary()->get(Trk::numberOfPixelHoles) + - track->trackSummary()->get(Trk::numberOfSCTHoles); + int nHolesOnTrack = track.trackSummary()->get(Trk::numberOfPixelHoles) + + track.trackSummary()->get(Trk::numberOfSCTHoles); - nPixels = track->trackSummary()->get(Trk::numberOfPixelHits); - int nStrip = track->trackSummary()->get(Trk::numberOfSCTHits); - nClusters = nPixels + nStrip; + int nPixels = track.trackSummary()->get(Trk::numberOfPixelHits); + int nStrips = track.trackSummary()->get(Trk::numberOfSCTHits); + int nClusters = nPixels + nStrips; ATH_MSG_DEBUG("track params: " << pt << " " << eta << " " << d0 << " " << z0 - << " " << nClusters << " " << nFreeClusters + << " " << nClusters << nStrips << " " << nPixels); // min Si hits @@ -522,93 +472,6 @@ int InDet::SiSPGNNTrackMaker::passEtaDepCuts(const Trk::Track* track, return 0; } -void InDet::SiSPGNNTrackMaker::filterSharedTracks( - std::multimap<double, Trk::Track*>& qualitySortedTracks) const { - - // initialize a vector to store all clusters on all tracks, to check with clusters in the next track - std::set<const Trk::PrepRawData*> clusters; - - // initialize a vector to store all free clusters on a track, those that are uniquely - // associated with the current track - std::vector<const Trk::PrepRawData*> freeClusters; - freeClusters.reserve(15); - - // iterator over all track candidates, sorted by quality - std::multimap<double, Trk::Track*>::iterator it_qualityAndTrack = - qualitySortedTracks.begin(); - - // initialize a vector to store status codes for each track, for debugging - // purposes. A track passing all cuts will have a status code 0. - std::vector<int> status_codes; - - /// loop over all track candidates, sorted by quality - while (it_qualityAndTrack != qualitySortedTracks.end()) { - freeClusters.clear(); - - std::set<const Trk::PrepRawData*>::iterator it_clustersEnd = clusters.end(); - - int nClusters = 0; - int nPixels = 0; - /// loop over track states on surface of the track candidate - for (const Trk::TrackStateOnSurface* tsos : - *((*it_qualityAndTrack).second->trackStateOnSurfaces())) { - - if (!tsos->type(Trk::TrackStateOnSurface::Measurement)) - continue; - const Trk::FitQualityOnSurface fq = tsos->fitQualityOnSurface(); - if (!fq) - continue; - if (fq.numberDoF() == 2) - ++nPixels; - - /// get the PRD from the measurement - const Trk::MeasurementBase* mb = tsos->measurementOnTrack(); - const Trk::RIO_OnTrack* ri = dynamic_cast<const Trk::RIO_OnTrack*>(mb); - if (!ri) - continue; - const Trk::PrepRawData* pr = ri->prepRawData(); - if (pr) { - /// increase cluster count - ++nClusters; - /// and check if the cluster was already used in a previous ( = higher - /// quality) track - if (clusters.find(pr) == it_clustersEnd) { - /// if not, record as a free (not prevously used) cluster - freeClusters.push_back(pr); - } - } - } - - /// add the free clusters to our cluster set - clusters.insert(freeClusters.begin(), freeClusters.end()); - - int nFreeClusters = static_cast<int>(freeClusters.size()); - // if we actually do track cuts, check if the track passes the eta dependent cuts, else set status code to 0 (pass) - int status_code = m_doRecoTrackCuts - ? passEtaDepCuts((*it_qualityAndTrack).second, - nClusters, nFreeClusters, nPixels) - : 0; - status_codes.push_back(status_code); - if (status_code == 0) { - /// if this is fulfilled, we keep the candidate - ++it_qualityAndTrack; - } else { - /// if we do not keep the track, clean up candidate - delete (*it_qualityAndTrack).second; - qualitySortedTracks.erase(it_qualityAndTrack++); - } - } - - // for debugging, print out the number of tracks that fail each cut - auto maxIt = std::max_element(status_codes.begin(), status_codes.end()); - int max_code = maxIt != status_codes.end() ? *maxIt : 10; - - for (int code = 1; code <= max_code; code++) { - ATH_MSG_DEBUG(std::count(status_codes.begin(), status_codes.end(), code) - << " tracks fail with status code " << code); - } -} - /////////////////////////////////////////////////////////////////// // Overload of << operator MsgStream /////////////////////////////////////////////////////////////////// diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h index 089958a33876..c34eed0eb5b5 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.h @@ -120,11 +120,8 @@ namespace InDet { DoubleProperty m_pTmin{this, "pTmin", 400., "min pT"}; DoubleProperty m_etamax{this, "etamax", 4., "max reco eta"}; - int passEtaDepCuts(const Trk::Track* track, int nClusters, - int nFreeClusters, int nPixels) const; - - double trackQuality (const Trk::Track* Tr) const; - void filterSharedTracks(std::multimap<double, Trk::Track*>& qualitySortedTracks) const ; + int passEtaDepCuts(const Trk::Track& track) const; + }; MsgStream& operator << (MsgStream& ,const SiSPGNNTrackMaker&); -- GitLab From 2945e9cc6238f9432204fcd4e377f97315c414ea Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Thu, 12 Dec 2024 02:46:55 -0800 Subject: [PATCH 52/54] 2 info messages --- .../InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index f37963f4a424..8b2441b0ec9f 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -405,16 +405,20 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const m_trackSummaryTool->computeAndReplaceTrackSummary( *track, false /* DO NOT suppress hole search*/); - int passTrackCut = (m_doRecoTrackCuts) ? passEtaDepCuts(*track) : 0; + int passTrackCut = (m_doRecoTrackCuts) ? passEtaDepCuts(*track) : -1; status_codes.push_back(passTrackCut); - if (passTrackCut==0) { + if (passTrackCut<=0) { outputTracks->push_back(track.release()); } } - - ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " - << std::count(status_codes.begin(), status_codes.end(), 0) - << " tracks remains after applying track cuts"); + if (d_doRecoTrackCuts) { + ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " + << std::count(status_codes.begin(), status_codes.end(), 0) + << " tracks remains after applying track cuts"); + } else { + ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " + << " all tracks are kept"); + } return StatusCode::SUCCESS; } -- GitLab From b52609917e0e736616cd8b0fe70cabe1a8cbd613 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Thu, 12 Dec 2024 02:47:19 -0800 Subject: [PATCH 53/54] 2 info messages --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 8b2441b0ec9f..0bc8f40713bc 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -416,8 +416,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const << std::count(status_codes.begin(), status_codes.end(), 0) << " tracks remains after applying track cuts"); } else { - ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " - << " all tracks are kept"); + ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, all tracks are kept"); } return StatusCode::SUCCESS; -- GitLab From 1d80592611197810706c3ee426259aa7730653f4 Mon Sep 17 00:00:00 2001 From: pmtuan <tuanpham1503@gmail.com> Date: Thu, 12 Dec 2024 02:49:21 -0800 Subject: [PATCH 54/54] 2 info messages --- InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx index 0bc8f40713bc..638d8057fdf2 100644 --- a/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx +++ b/InnerDetector/InDetGNNTracking/src/SiSPGNNTrackMaker.cxx @@ -411,7 +411,7 @@ StatusCode InDet::SiSPGNNTrackMaker::execute(const EventContext& ctx) const outputTracks->push_back(track.release()); } } - if (d_doRecoTrackCuts) { + if (m_doRecoTrackCuts) { ATH_MSG_INFO("Event " << eventNumber << " has " << status_codes.size() << " tracks found, " << std::count(status_codes.begin(), status_codes.end(), 0) << " tracks remains after applying track cuts"); -- GitLab