From b2b8dc19ae759e67004023d407645548666a8fc8 Mon Sep 17 00:00:00 2001
From: Xiaocong Ai <xiaocong.ai@cern.ch>
Date: Sun, 21 Jul 2024 14:02:30 +0200
Subject: [PATCH] fix CKF2 eventInfo and add acts output configuration in
 faser_reco

---
 .../Reconstruction/scripts/faser_reco.py       | 18 +++++++++++++++---
 .../FaserActsKalmanFilter/python/CKF2Config.py | 18 ++++++++++--------
 .../Acts/FaserActsKalmanFilter/src/CKF2.cxx    |  1 -
 .../src/RootTrajectoryStatesWriterTool.cxx     |  1 +
 .../src/TrackClassification.cxx                | 13 +++++++++++--
 5 files changed, 37 insertions(+), 14 deletions(-)

diff --git a/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py b/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
index 0235dfa4f..f2d32291a 100755
--- a/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
+++ b/Control/CalypsoExample/Reconstruction/scripts/faser_reco.py
@@ -280,11 +280,22 @@ if useCKF:
     # Do both forward and backward tracking
     from FaserActsKalmanFilter.CKF2Config import CKF2Cfg
     if not args.isOverlay:
-        # 4-station tracks
-        acc.merge(CKF2Cfg(configFlags, noDiagnostics=True))
+        # 4-station tracking forward
+        acc.merge(CKF2Cfg(configFlags, 
+                          actsOutputTag=f"{filestem}_4station_forward", 
+                          noDiagnostics=True))
+
+        # 4-station tracking backward
+        acc.merge(CKF2Cfg(configFlags, name="CKF_Back", 
+                          actsOutputTag=f"{filestem}_4station_backward", 
+                          OutputCollection="CKFTrackCollectionBackward", 
+                          BackwardPropagation=True, 
+                          noDiagnostics=True))
+
 
     # Add tracking collection with no IFT 
-    acc.merge(CKF2Cfg(configFlags, maskedLayers=[0, 1, 2], name="CKF_woIFT", 
+    acc.merge(CKF2Cfg(configFlags, maskedLayers=[0, 1, 2], name="CKF_woIFT",
+                      actsOutputTag=f"{filestem}_3station_forward", 
                       OutputCollection="CKFTrackCollectionWithoutIFT", 
                       BackwardPropagation=False,
                       noDiagnostics=True))
@@ -292,6 +303,7 @@ if useCKF:
 
     # Backward tracking with no IFT
     acc.merge(CKF2Cfg(configFlags, maskedLayers=[0, 1, 2], name="CKF_Back_woIFT", 
+                      actsOutputTag=f"{filestem}_3station_backward", 
                       OutputCollection="CKFTrackCollectionBackwardWithoutIFT", 
                       BackwardPropagation=True,
                       noDiagnostics=True))
diff --git a/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py b/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
index 964d0d5b4..ade113b47 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
+++ b/Tracking/Acts/FaserActsKalmanFilter/python/CKF2Config.py
@@ -29,7 +29,7 @@ def CKF2_OutputCfg(flags):
     return acc
 
 
-def CKF2Cfg(flags, **kwargs):
+def CKF2Cfg(flags, actsOutputTag, **kwargs):
     # acc = ComponentAccumulator()
     acc = FaserSCT_GeometryCfg(flags)
     acc.merge(MagneticFieldSvcCfg(flags))
@@ -61,14 +61,16 @@ def CKF2Cfg(flags, **kwargs):
 
     trajectory_states_writer_tool = CompFactory.RootTrajectoryStatesWriterTool()
     trajectory_states_writer_tool.noDiagnostics = kwargs.get("noDiagnostics", True)
+    trajectory_states_writer_tool.FilePath = f"{actsOutputTag}_track_states_ckf.root"
     trajectory_states_writer_tool1 = CompFactory.RootTrajectoryStatesWriterTool()
     trajectory_states_writer_tool1.noDiagnostics = kwargs.get("noDiagnostics", True)
-    trajectory_states_writer_tool1.FilePath = "track_states_ckf1.root"
+    trajectory_states_writer_tool1.FilePath = f"{actsOutputTag}_track_states_ckf1.root" 
 
     trajectory_summary_writer_tool = CompFactory.RootTrajectorySummaryWriterTool()
     trajectory_summary_writer_tool.noDiagnostics = kwargs.get("noDiagnostics", True)
+    trajectory_summary_writer_tool.FilePath = f"{actsOutputTag}_track_summary_ckf.root"
     trajectory_summary_writer_tool1 = CompFactory.RootTrajectorySummaryWriterTool()
-    trajectory_summary_writer_tool1.FilePath = "track_summary_ckf1.root"
+    trajectory_summary_writer_tool1.FilePath = f"{actsOutputTag}_track_summary_ckf1.root"
     trajectory_summary_writer_tool1.noDiagnostics = kwargs.get("noDiagnostics", True)
 
     actsExtrapolationTool = CompFactory.FaserActsExtrapolationTool("FaserActsExtrapolationTool")
@@ -88,8 +90,8 @@ def CKF2Cfg(flags, **kwargs):
     kalman_fitter1 = CompFactory.KalmanFitterTool(name="fitterTool1")
     kalman_fitter1.noDiagnostics = kwargs.get("noDiagnostics", True)
     kalman_fitter1.ActsLogging = "INFO"
-    kalman_fitter1.SummaryWriter = True
-    kalman_fitter1.StatesWriter = False
+    kalman_fitter1.SummaryWriter = kwargs.get("SummaryWriter", False)
+    kalman_fitter1.StatesWriter = kwargs.get("StatesWriter", False)
     kalman_fitter1.SeedCovarianceScale = 10
     kalman_fitter1.isMC = flags.Input.isMC
     kalman_fitter1.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool1
@@ -100,13 +102,13 @@ def CKF2Cfg(flags, **kwargs):
     ckf.ActsLogging = "INFO"
     ckf.RootTrajectoryStatesWriterTool = trajectory_states_writer_tool
     ckf.RootTrajectorySummaryWriterTool = trajectory_summary_writer_tool
-    #todo    
+    #@todo    
     #ckf.PerformanceWriterTool = trajectory_performance_writer_tool
     ckf.TrackingGeometryTool=actsTrackingGeometryTool
     ckf.isMC = flags.Input.isMC
     ckf.noDiagnostics = kwargs.get("noDiagnostics", True)
-    ckf.SummaryWriter = True
-    ckf.StatesWriter = False
+    ckf.SummaryWriter = kwargs.get("SummaryWriter", False)
+    ckf.StatesWriter = kwargs.get("StatesWriter", False)
     ckf.PerformanceWriter = False
 
     ckf.nMax = 10
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
index 687908a49..38afb57d5 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx
@@ -217,7 +217,6 @@ StatusCode CKF2::execute() {
     else return false;
   });
 
-
   while (not allTracks.empty()) {
     TrackInfo selected = allTracks.front();
     
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
index 9982aa0db..56f1d5afb 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/RootTrajectoryStatesWriterTool.cxx
@@ -317,6 +317,7 @@ StatusCode RootTrajectoryStatesWriterTool::write(const Acts::GeometryContext& gc
     if (isMC) {
       // truthQ = 1;
       // truthMomentum = 1;
+      //@todo: this can break and the reasons needs to be understood 
       identifyContributingParticles(*simData, track, particleHitCounts);
       if (not particleHitCounts.empty()) {
         // Get the barcode of the majority truth particle
diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
index 0b618a1f5..0142377a5 100644
--- a/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
+++ b/Tracking/Acts/FaserActsKalmanFilter/src/TrackClassification.cxx
@@ -45,8 +45,17 @@ void identifyContributingParticles(
     }
     std::vector<int> barcodes {};
     // register all particles that generated this hit
-    IndexSourceLink sl =
-      state.getUncalibratedSourceLink().template get<IndexSourceLink>();
+    //@todo: this can break. Need to understand the reason!!! 
+    if(not state.hasUncalibratedSourceLink()){
+      throw std::runtime_error("The measurement state does not have a source link?");
+    }
+    Acts::SourceLink sl_acts = state.getUncalibratedSourceLink();
+    IndexSourceLink sl =  sl_acts.template get<IndexSourceLink>(); 
+   // 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?
-- 
GitLab