From 8034e5398f6a79124622b25e8a4d00cc3a1342ad Mon Sep 17 00:00:00 2001
From: Alexandru Bercuci <abercuci@niham.nipne.ro>
Date: Thu, 7 Mar 2024 23:09:44 +0200
Subject: [PATCH] add the basic functionality of track fitting for each
 measured point

---
 reco/qa/CbmRecoQaTask.cxx | 66 +++++++++++++++++++++++++++++++++++++--
 reco/qa/CbmRecoQaTask.h   |  6 +++-
 2 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/reco/qa/CbmRecoQaTask.cxx b/reco/qa/CbmRecoQaTask.cxx
index 1335f757ad..26bb61d2ee 100644
--- a/reco/qa/CbmRecoQaTask.cxx
+++ b/reco/qa/CbmRecoQaTask.cxx
@@ -2,9 +2,14 @@
    SPDX-License-Identifier: GPL-3.0-only
    Authors: Alexandru Bercuci [committer] */
 
+// CBM headers
+#include "CbmGlobalTrack.h"
 #include "CbmRecoQaTask.h"
-
+// FAIR headers
 #include "FairRootManager.h"
+// ROOT headers
+#include "TClonesArray.h"
+//#include "TObject.h"
 
 //_____________________________________________________________________
 CbmRecoQaTask::CbmRecoQaTask() : FairTask("RecoQA", 0)
@@ -30,12 +35,69 @@ InitStatus CbmRecoQaTask::Init()
     return kERROR;
   }
 
-  return kSUCCESS; 
+  fGlobalTracks = static_cast<TClonesArray*>(ioman->GetObject("GlobalTrack"));
+  if (!fGlobalTracks) {
+    LOG(error) << "CbmRecoQaTask::Init: Global track array not found!";
+    return kERROR;
+  }
+
+  fGlobalTrackMatches = static_cast<TClonesArray*>(ioman->GetObject("GlobalTrackMatch"));
+  if (!fGlobalTrackMatches) {
+    LOG(warn) << "CbmRecoQaTask::Init: MC info for Global track not available !";
+  }
+
+  return kSUCCESS;
 }
 
 //_____________________________________________________________________
 void CbmRecoQaTask::Exec(Option_t*)
 {
+  for (int iTr = 0; iTr < fGlobalTracks->GetEntriesFast(); iTr++) {
+//     if (static_cast<int>(fTracks.size()) >= fMaxNtracks) {
+//       break;
+//     }
+    const CbmGlobalTrack* globalTrack = dynamic_cast<const CbmGlobalTrack*>(fGlobalTracks->At(iTr));
+    if (!globalTrack) {
+      LOG(fatal) << "RecoQA: null pointer to the global track!";
+      break;
+    }
+    CbmKfTrackFitter::Track trk;
+    if (!fFitter.CreateGlobalTrack(trk, *globalTrack)) {
+      LOG(fatal) << "RecoQA: can not create the global track for the fit! ";
+      break;
+    }
+    trk.fNodes.insert(trk.fNodes.begin(), CbmKfTrackFitter::FitNode());
+    trk.fMsQp0      = 1. / 0.5;
+    trk.fIsMsQp0Set = true;
+
+    // try first fit with all hits ON
+    trk.MakeConsistent();
+    fFitter.FitTrack(trk);
+    CbmKfTrackFitter::FitNode &node = trk.fNodes.front();
+    printf("val @ vx %f fit %f\n", node.fMxy.X()[0], node.fTrack.X()[0]);
+
+    
+    for (auto& n : trk.fNodes) {
+      n.fIsTimeSet = false;
+      n.fIsXySet   = false;
+      trk.MakeConsistent();
+      fFitter.FitTrack(trk);
+      double dx    = n.fMxy.X()[0] - n.fTrack.X()[0],
+             dy    = n.fMxy.Y()[0] - n.fTrack.Y()[0],
+             pullx = dx / sqrt(n.fMxy.Dx2()[0] + n.fTrack.GetCovariance(0, 0)[0]),
+             pully = dy / sqrt(n.fMxy.Dy2()[0] + n.fTrack.GetCovariance(1, 1)[0]);
+    }
+
+//     //if (t.fNstsHits < 1) continue;
+//     //if (t.fNtrdHits < 2) continue;
+//     if (t.fNstsHits + t.fNmuchHits + t.fNtrd1dHits + t.fNtrd2dHits + t.fNtofHits < fNtrackingStations - 1) continue;
+//     //if (t.fNtrdHits < 3) continue;
+//     if (t.fNstsHits < 2) continue;
+//     if (t.fNtofHits < 2) continue;
+// 
+    fFitter.FitTrack(trk);
+    fTracks.push_back(trk);
+  }
 }
 
 //_____________________________________________________________________
diff --git a/reco/qa/CbmRecoQaTask.h b/reco/qa/CbmRecoQaTask.h
index 450f8df9bc..80fa7dbc62 100644
--- a/reco/qa/CbmRecoQaTask.h
+++ b/reco/qa/CbmRecoQaTask.h
@@ -8,8 +8,9 @@
 #include "FairTask.h"
 
 #include "CbmKfTrackFitter.h"
+#include <vector>
 
-
+class TClonesArray;
 class CbmRecoQaTask : public FairTask {
 public:
   CbmRecoQaTask();
@@ -27,7 +28,10 @@ private:
   CbmRecoQaTask& operator=(const CbmRecoQaTask&);
 
   CbmKfTrackFitter fFitter;
+  TClonesArray* fGlobalTracks       = nullptr;  //! reconstructed global tracks / event 
+  TClonesArray* fGlobalTrackMatches = nullptr;  //! MC info for the global tracks
 
+  std::vector<CbmKfTrackFitter::Track> fTracks;
   ClassDef(CbmRecoQaTask, 1);
 };
 
-- 
GitLab