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