From 2f8728492b29a957bf25d759e35b2b0d89dd364d Mon Sep 17 00:00:00 2001
From: "se.gorbunov" <se.gorbunov@gsi.de>
Date: Fri, 22 Mar 2024 13:19:45 +0000
Subject: [PATCH] KfTrackFitter: replace the assertion with a warning

---
 algo/ca/core/data/CaTrackParam.cxx     |  6 ++++++
 reco/KF/CbmKfTrackFitter.cxx           | 22 +++++++++++++++-------
 reco/KF/CbmKfTrackFitter.h             |  4 ++--
 reco/alignment/CbmBbaAlignmentTask.cxx |  6 +++++-
 4 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/algo/ca/core/data/CaTrackParam.cxx b/algo/ca/core/data/CaTrackParam.cxx
index 0704037dc7..d41bf80f26 100644
--- a/algo/ca/core/data/CaTrackParam.cxx
+++ b/algo/ca/core/data/CaTrackParam.cxx
@@ -40,6 +40,9 @@ namespace cbm::algo::ca
         s << " c55 " << C55()[i] << std::endl;
         s << " c66 " << C66()[i] << std::endl;
         s << ToStringCorrelations(i);
+
+        s << " chi2 " << fChiSq[i];
+        s << " ndf " << fNdf[i] << std::endl;
         return s.str();
       }
     }
@@ -63,6 +66,9 @@ namespace cbm::algo::ca
       s << " c55 " << C55() << std::endl;
       s << " c66 " << C66() << std::endl;
       s << ToStringCorrelations(i);
+
+      s << " chi2 " << fChiSq << std::endl;
+      s << " ndf " << fNdf << std::endl;
     }
     return s.str();
   }
diff --git a/reco/KF/CbmKfTrackFitter.cxx b/reco/KF/CbmKfTrackFitter.cxx
index 9e61f26bb9..83eb7960c2 100644
--- a/reco/KF/CbmKfTrackFitter.cxx
+++ b/reco/KF/CbmKfTrackFitter.cxx
@@ -489,10 +489,12 @@ void CbmKfTrackFitter::AddMaterialEffects(const CbmKfTrackFitter::Track& t, CbmK
 }
 
 
-void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
+bool CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
 {
   // fit the track
 
+  bool ok = true;
+
   // ensure that the fitter is initialized
   Init();
 
@@ -549,7 +551,6 @@ void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
   for (int iNode = t.fLastHitNode - 1; iNode >= 0; iNode--) {
     FitNode& n = t.fNodes[iNode];
     fFit.Extrapolate(n.fZ, field);
-
     if (n.fIsXySet) {
       fFit.FilterXY(n.fMxy, fSkipUnmeasuredCoordinates);
     }
@@ -558,13 +559,16 @@ void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
     }
 
     // combine partially fitted downstream and upstream tracks
+    n.fIsFitted = true;
     if (iNode > t.fFirstHitNode) {
-      Smooth(n.fTrack, fFit.Tr());
+      n.fIsFitted = Smooth(n.fTrack, fFit.Tr());
     }
     else {
       n.fTrack = fFit.Tr();
     }
-    n.fIsFitted = true;
+    if (!n.fIsFitted) {
+      ok = false;
+    }
     fFit.SetQp0(n.fTrack.GetQp());
     AddMaterialEffects(t, n, true);
   }
@@ -578,10 +582,12 @@ void CbmKfTrackFitter::FitTrack(CbmKfTrackFitter::Track& t)
     n.fTrack.SetChiSq(tt.GetChiSq());
     n.fTrack.SetChiSqTime(tt.GetChiSqTime());
   }
+
+  return ok;
 }
 
 
-void CbmKfTrackFitter::Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2)
+bool CbmKfTrackFitter::Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2)
 {
   // TODO: move to the CaTrackFit class
 
@@ -600,8 +606,9 @@ void CbmKfTrackFitter::Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2)
   int ifault = 0;
   cbm::algo::ca::utils::math::SymInv(S, nPar, S1, Tmp, &nullty, &ifault);
 
-  assert(0 == nullty);
-  assert(0 == ifault);
+  if ((0 != ifault) || (0 != nullty)) {
+    return false;
+  }
 
   double dzeta[nPar];
 
@@ -674,4 +681,5 @@ void CbmKfTrackFitter::Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2)
   t1.SetChiSqTime(chi2Time + t1.GetChiSqTime()[0] + t2.GetChiSqTime()[0]);
   t1.SetNdf(5 + t1.GetNdf()[0] + t2.GetNdf()[0]);
   t1.SetNdfTime(2 + t1.GetNdfTime()[0] + t2.GetNdfTime()[0]);
+  return true;
 }
diff --git a/reco/KF/CbmKfTrackFitter.h b/reco/KF/CbmKfTrackFitter.h
index 5f426fe81c..7d1a6aafe0 100644
--- a/reco/KF/CbmKfTrackFitter.h
+++ b/reco/KF/CbmKfTrackFitter.h
@@ -119,7 +119,7 @@ class CbmKfTrackFitter {
   bool CreateGlobalTrack(Track& kfTrack, const CbmGlobalTrack& globalTrack);
 
   /// fit the track
-  void FitTrack(CbmKfTrackFitter::Track& t);
+  bool FitTrack(CbmKfTrackFitter::Track& t);
 
   /// fit sts tracks
   // void FitStsTracks(vector<CbmStsTrack>& Tracks, const vector<int>& pidHypo);
@@ -128,7 +128,7 @@ class CbmKfTrackFitter {
   void FilterFirstMeasurement(const FitNode& n);
   void AddMaterialEffects(const Track& t, FitNode& n, bool upstreamDirection);
   // combine two tracks
-  void Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2);
+  bool Smooth(ca::TrackParamV& t1, const ca::TrackParamV& t2);
 
  private:
   // input data arrays
diff --git a/reco/alignment/CbmBbaAlignmentTask.cxx b/reco/alignment/CbmBbaAlignmentTask.cxx
index 32fd5c4c33..5d3c684485 100644
--- a/reco/alignment/CbmBbaAlignmentTask.cxx
+++ b/reco/alignment/CbmBbaAlignmentTask.cxx
@@ -287,7 +287,11 @@ void CbmBbaAlignmentTask::Exec(Option_t* /*opt*/)
         n.fIsTimeSet = false;
       }
 
-      fFitter.FitTrack(t.fUnalignedTrack);
+      if (!fFitter.FitTrack(t.fUnalignedTrack)) {
+        LOG(warning) << "failed to fit the track! ";
+        continue;
+      }
+
       const auto& par = t.fUnalignedTrack.fNodes[t.fUnalignedTrack.fFirstHitNode].fTrack;
 
       t.fUnalignedTrack.fMsQp0 = par.GetQp()[0];
-- 
GitLab