From 71722df9b7e0af490d79a479173f57b7f59c7417 Mon Sep 17 00:00:00 2001
From: Xiaocong Ai <xiaocong.ai@cern.ch>
Date: Tue, 29 Oct 2024 09:57:53 +0100
Subject: [PATCH] fix truth barcode retrieving

---
 .../src/RootTrajectoryStatesWriterTool.cxx    | 11 ++++---
 .../src/RootTrajectorySummaryWriterTool.cxx   | 33 ++++++++++++++++++-
 .../src/RootTrajectorySummaryWriterTool.h     |  3 ++
 .../src/TrackClassification.cxx               | 12 +++----
 4 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
index 785089cdb..a4f86a5a7 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
@@ -279,7 +279,6 @@ StatusCode RootTrajectoryStatesWriterTool::write(const Acts::GeometryContext& gc
   const EventContext& ctx = Gaudi::Hive::currentContext();
   m_eventNr = ctx.eventID().event_number();
 
-  std::vector<ParticleHitCount> particleHitCounts;
   std::map<int, const HepMC::GenParticle*> particles {};
   std::map<std::pair<int, Identifier>, const FaserSiHit*> siHitMap;
 
@@ -294,7 +293,7 @@ StatusCode RootTrajectoryStatesWriterTool::write(const Acts::GeometryContext& gc
     }
     ATH_MSG_VERBOSE("Found " << mcEvents->front()->particles_size() << " particles.");
     for (const auto& particle : mcEvents->front()->particles()) {
-      particles[particle->id()] = &(*particle);
+       particles[HepMC::barcode(particle)] = &(*particle);
     }
 
     SG::ReadHandle<TrackerSimDataCollection> simDataHandle {m_simDataCollectionKey, ctx};
@@ -304,12 +303,13 @@ StatusCode RootTrajectoryStatesWriterTool::write(const Acts::GeometryContext& gc
     SG::ReadHandle<FaserSiHitCollection> siHitCollection {m_faserSiHitKey, ctx};
     ATH_CHECK(siHitCollection.isValid());
     for (const FaserSiHit& hit : *siHitCollection) {
-      int barcode = hit.trackNumber();
+      int trackNumber = hit.trackNumber();
       Identifier id = m_idHelper->wafer_id(hit.getStation(), hit.getPlane(), hit.getRow(), hit.getModule(), hit.getSensor());
-      siHitMap[std::make_pair(barcode, id)] = &hit;
+      siHitMap[std::make_pair(trackNumber, id)] = &hit;
     }
   }
 
+  std::vector<ParticleHitCount> particleHitCounts = {};
   for (const auto& track : tracks) {
     m_trackNr = track.index();
 
@@ -425,6 +425,9 @@ StatusCode RootTrajectoryStatesWriterTool::write(const Acts::GeometryContext& gc
         m_t_eQOP.push_back(truthQOP);
         m_t_eT.push_back(truthTIME);
       } else {
+        if(isMC){
+          ATH_MSG_WARNING("Hit with particle barcode " << barcode  <<" and wafer Id " << waferId <<" not found.");
+        }
         m_t_x.push_back(nan);
         m_t_y.push_back(nan);
         m_t_z.push_back(nan);
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.cxx
index 4ef9c4dda..e6323c8de 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.cxx
@@ -68,12 +68,15 @@ StatusCode RootTrajectorySummaryWriterTool::initialize() {
     m_outputTree->Branch("nSharedHits", &m_nSharedHits);
     m_outputTree->Branch("chi2Sum", &m_chi2Sum);
     m_outputTree->Branch("NDF", &m_NDF);
+    m_outputTree->Branch("rMax_hit", &m_rMax_hit);
     m_outputTree->Branch("measurementChi2", &m_measurementChi2);
     m_outputTree->Branch("outlierChi2", &m_outlierChi2);
     m_outputTree->Branch("measurementVolume", &m_measurementVolume);
     m_outputTree->Branch("measurementLayer", &m_measurementLayer);
+    m_outputTree->Branch("measurementIndex", &m_measurementIndex);
     m_outputTree->Branch("outlierVolume", &m_outlierVolume);
     m_outputTree->Branch("outlierLayer", &m_outlierLayer);
+    m_outputTree->Branch("outlierIndex", &m_outlierIndex);
 
     m_outputTree->Branch("nMajorityHits", &m_nMajorityHits);
     m_outputTree->Branch("majorityParticleId", &m_majorityParticleId);
@@ -158,7 +161,7 @@ StatusCode RootTrajectorySummaryWriterTool::write(
     }
 
     for (const auto& particle : mcEvents->front()->particles()) {
-      particles[particle->id()] = &(*particle);
+      particles[HepMC::barcode(particle)] = &(*particle);
     }
   }
 
@@ -168,6 +171,7 @@ StatusCode RootTrajectorySummaryWriterTool::write(
   // Get the event number
   m_eventNr = ctx.eventID().event_number();
 
+  Acts::Vector3 truthUnitDir(1,1,1);
   // Loop over the trajectories
   for (const auto& track : tracks) {
     m_trackNr.push_back(track.index());
@@ -185,9 +189,12 @@ StatusCode RootTrajectorySummaryWriterTool::write(
       std::vector<double> measurementChi2;
       std::vector<double> measurementVolume;
       std::vector<double> measurementLayer;
+      std::vector<int> measurementIndex;
       std::vector<double> outlierChi2;
       std::vector<double> outlierVolume;
       std::vector<double> outlierLayer;
+      std::vector<int> outlierIndex;
+      double rMax_hit = 0; 
       for (const auto& state : track.trackStatesReversed()) {
         const auto& geoID = state.referenceSurface().geometryId();
         const auto& volume = geoID.volume();
@@ -196,22 +203,43 @@ StatusCode RootTrajectorySummaryWriterTool::write(
           measurementChi2.push_back(state.chi2());
           measurementVolume.push_back(volume);
           measurementLayer.push_back(layer);
+          // expand the local measurements into the full bound space
+          Acts::BoundVector meas = state.effectiveProjector().transpose() *
+                               state.effectiveCalibrated();
+          // extract local and global position
+          Acts::Vector2 local(meas[Acts::eBoundLoc0], meas[Acts::eBoundLoc1]);
+          const auto& surface = state.referenceSurface(); 
+          // The direction does not matter for plane surface 
+          Acts::Vector3 global =
+              surface.localToGlobal(geoContext, local, truthUnitDir);
+          auto r_hit = std::hypot(global[Acts::ePos0],global[Acts::ePos1]);
+          if(r_hit>rMax_hit){
+            rMax_hit = r_hit;
+          }
+          IndexSourceLink sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>();
+          measurementIndex.push_back(sl.index());
         }
         if (state.typeFlags().test(Acts::TrackStateFlag::OutlierFlag)) {
           outlierChi2.push_back(state.chi2());
           outlierVolume.push_back(volume);
           outlierLayer.push_back(layer);
+          IndexSourceLink sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>();
+          outlierIndex.push_back(sl.index());
         }
       }
 
+
       // IDs are stored as double (as the vector of vector of int is not known
       // to ROOT)
       m_measurementChi2.push_back(std::move(measurementChi2));
       m_measurementVolume.push_back(std::move(measurementVolume));
       m_measurementLayer.push_back(std::move(measurementLayer));
+      m_measurementIndex.push_back(std::move(measurementIndex));
       m_outlierChi2.push_back(std::move(outlierChi2));
       m_outlierVolume.push_back(std::move(outlierVolume));
       m_outlierLayer.push_back(std::move(outlierLayer));
+      m_outlierIndex.push_back(std::move(outlierIndex));
+      m_rMax_hit.push_back(rMax_hit); 
     }
 
     // Initialize the truth particle info
@@ -422,8 +450,11 @@ StatusCode RootTrajectorySummaryWriterTool::write(
   m_outlierChi2.clear();
   m_measurementVolume.clear();
   m_measurementLayer.clear();
+  m_measurementIndex.clear();
   m_outlierVolume.clear();
   m_outlierLayer.clear();
+  m_outlierIndex.clear();
+  m_rMax_hit.clear();
 
   m_nMajorityHits.clear();
   m_majorityParticleId.clear();
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.h b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.h
index 383431d78..91dcfbd53 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.h
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectorySummaryWriterTool.h
@@ -58,13 +58,16 @@ private:
   mutable std::vector<unsigned int> m_nSharedHits;    ///< The number of shared hits
   mutable std::vector<float> m_chi2Sum;               ///< The total chi2
   mutable std::vector<unsigned int> m_NDF;  ///< The number of ndf of the measurements+outliers
+  mutable std::vector<double> m_rMax_hit;  ///< max radius of the measurements on the track 
   mutable std::vector<std::vector<double>> m_measurementChi2;  ///< The chi2 on all measurement states
   mutable std::vector<std::vector<double>> m_outlierChi2;  ///< The chi2 on all outlier states
   // FIXME replace volume, layer, ... with station, layer, ...
   mutable std::vector<std::vector<double>> m_measurementVolume;  ///< The volume id of the measurements
   mutable std::vector<std::vector<double>> m_measurementLayer;  ///< The layer id of the measurements
+  mutable std::vector<std::vector<int>> m_measurementIndex;  ///< The hit id of the measurements
   mutable std::vector<std::vector<double>> m_outlierVolume;  ///< The volume id of the outliers
   mutable std::vector<std::vector<double>> m_outlierLayer;  ///< The layer id of the outliers
+  mutable std::vector<std::vector<int>> m_outlierIndex;  ///< The hit id of the outliers
 
   // The majority truth particle info
   mutable std::vector<unsigned int> m_nMajorityHits;  ///< The number of hits from majority particle
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
index a3cd8c500..ce2454ee5 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
@@ -52,17 +52,17 @@ void identifyContributingParticles(
     IndexSourceLink sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>();
     if(sl.hit()==nullptr){
       throw std::runtime_error("The source hit is empty");
-    } 
+    }
     for (const Identifier &id : sl.hit()->rdoList()) {
       if (simDataCollection.count(id) == 0) {
-        continue; //@todo:is this correct?
+        continue;
       }
       const auto &deposits = simDataCollection.find(id)->second.getdeposits();
       for (const TrackerSimData::Deposit &deposit : deposits) {
-        int barcode = deposit.first->id();
+        int barcode = deposit.first.barcode();
         if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
           barcodes.push_back(barcode);
-          increaseHitCount(particleHitCounts, deposit.first->id());
+          increaseHitCount(particleHitCounts, barcode);
         }
       }
     }
@@ -85,10 +85,10 @@ void identifyContributingParticles(
       if (simDataCollection.count(id) == 0) continue;
       const auto &deposits = simDataCollection.find(id)->second.getdeposits();
       for (const TrackerSimData::Deposit &deposit : deposits) {
-        int barcode = deposit.first->id();
+        int barcode = deposit.first.barcode();
         if (std::find(barcodes.begin(), barcodes.end(), barcode) == barcodes.end()) {
           barcodes.push_back(barcode);
-          increaseHitCount(particleHitCounts, deposit.first->id());
+          increaseHitCount(particleHitCounts, barcode);
         }
       }
     }
-- 
GitLab