From 9552da8b4fe84e2bd61024f171bd16dbcd54d769 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Thu, 6 Mar 2025 17:58:46 +0100
Subject: [PATCH] Adding bba alignment to offlien data reconstruction chain

---
 macro/alignment/run_BbaAlignment_mcbm.C      |  1 +
 macro/beamtime/common/reco_mcbm.sh           | 45 +++++++++++++++++++-
 macro/beamtime/mcbm2025/mcbm_event_reco_L1.C |  1 +
 reco/alignment/CbmBbaAlignmentTask.cxx       |  7 ++-
 reco/alignment/CbmBbaAlignmentTask.h         |  9 +++-
 5 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/macro/alignment/run_BbaAlignment_mcbm.C b/macro/alignment/run_BbaAlignment_mcbm.C
index 2607632273..4592f514d2 100644
--- a/macro/alignment/run_BbaAlignment_mcbm.C
+++ b/macro/alignment/run_BbaAlignment_mcbm.C
@@ -144,6 +144,7 @@ void run_BbaAlignment_mcbm(Int_t nEvents = -1, TString dataset = "data/mcbm_beam
 
   // ----- BBA alignment   --------------------------------------------
   CbmBbaAlignmentTask* alignment = new CbmBbaAlignmentTask();
+  alignment->SetMatrixOutFileName(Form("AlignmentMatrices_%s_finetuning.root", setupName.Data()));
   alignment->SetMcbmTrackingMode();
   alignment->SetSimulatedMisalignmentRange(SimulatedMisalignmentRange);
 
diff --git a/macro/beamtime/common/reco_mcbm.sh b/macro/beamtime/common/reco_mcbm.sh
index 4844bdf88e..e49c650819 100755
--- a/macro/beamtime/common/reco_mcbm.sh
+++ b/macro/beamtime/common/reco_mcbm.sh
@@ -145,6 +145,7 @@ DO_RECO=0
 DO_QA=0         # Main QA Macro
 DO_QA_MODULE=0  # QA Macro by Alexandru
 DO_LAMBDA=0     # Lambda analysis using KFParticleFinder
+DO_BBA=0        # BBA alignment on reconstructed data
 STEPS_TO_PRINT=""
 
 ONLINE_PAR=${VMCWORKDIR}/parameters/online
@@ -156,6 +157,7 @@ DIR_UNPACK=""
 DIR_RECO=""
 DIR_QA=""
 DIR_KFPF=""
+DIR_BBA=""
 
 # ----- Run information
 RUN=-1
@@ -190,6 +192,10 @@ while [[ $# -gt 0 ]]; do
       DO_LAMBDA=1
       STEPS_TO_PRINT="${STEPS_TO_PRINT} --kfpf"
       ;;
+    --bba )
+      DO_BBA=1
+      STEPS_TO_PRINT="${STEPS_TO_PRINT} --bba"
+      ;;
     --tsa )
       TSA=${2}
       ;;
@@ -223,6 +229,9 @@ while [[ $# -gt 0 ]]; do
     --kfpf-dir )
       DIR_KFPF=${2}
       ;;
+    --bba-dir )
+      DIR_BBA=${2}
+      ;;
     --setup-only )
       I_WANT_ONLY_SETUP=1
       ;;
@@ -271,6 +280,11 @@ else
   DIR_KFPF=$(realpath -m ${DIR_KFPF})
 fi
 
+if [[ -z ${DIR_BBA} ]]; then 
+  DIR_BBA=${DATA_TOP_DIR}
+else
+  DIR_BBA=$(realpath -m ${DIR_KFPF})
+fi
 
 # ----- Check the environment
 #
@@ -338,6 +352,7 @@ if [[ ${I_WANT_ONLY_SETUP} -eq 1 ]]; then
   DO_QA=0
   DO_QA_MODULE=0
   DO_LAMBDA=0
+  DO_BBA=0
   STEPS_TO_PRINT=" --setup"
   if [[ ${RUN} -lt 0 ]]; then 
     RUN=${RUN_IF_ONLY_SETUP_NEEDED}
@@ -368,6 +383,7 @@ MACRO_RECO="${VMCWORKDIR}/macro/beamtime/mcbm2022/mcbm_event_reco_L1.C"
 MACRO_QA="${VMCWORKDIR}/macro/mcbm/mcbm_qa.C"
 MACRO_QA_MODULE="${VMCWORKDIR}/macro/qa/run_recoQa.C"
 MACRO_KFPF="${VMCWORKDIR}/macro/mcbm/mcbm_hadron_kfp_ana.C"
+MACRO_BBA="${VMCWORKDIR}/macro/alignment/run_BbaAlignment_mcbm.C"
 SETUP_NAME=$(${RUN_INFO} --run ${RUN} --geotag)
 
 # ----- Setting selections vs. run number 
@@ -398,7 +414,7 @@ RECO_FILE="${DIR_RECO}/${FILE_LABEL}.rec.root"
 KF_SETUP_FILE="${DIR_RECO}/${FILE_LABEL}.rec.kf.setup"
 KF_MATERIAL="${DIR_RECO}/${SETUP_NAME}.mat.kf.bin"
 CA_PAR_FILE="${DIR_RECO}/${FILE_LABEL}.rec.ca.par"
-
+BBA_FILE="${DIR_BBA}/${FILE_LABEL}.ali.root"
 
 # -----
 # Log Files
@@ -603,5 +619,32 @@ if [[ ${DO_LAMBDA} -eq 1 ]]; then
   root -b -l -q ${MACRO_KFPF}"(${PARS})"
 fi
 
+# ----- Run BBA alignment
+if [[ ${DO_BBA} -eq 1 ]]; then
+  BBA_REC="${DIR_BBA}/${FILE_LABEL}.rec.root"
+  BBA_GEO="${DIR_BBA}/${FILE_LABEL}.geo.root"
+  BBA_PAR="${DIR_BBA}/${FILE_LABEL}.par.root"
+  if [[ ${BBA_REC} != ${RECO_FILE} ]]; then 
+    pushd .
+    cd ${DIR_BBA}
+    ln -s -f $(realpath ${RECO_FILE}) $(basename ${BBA_REC})
+    popd
+  fi
+  if [[ ${BBA_GEO} != ${SETUP_GEO_FILE} ]]; then 
+    pushd .
+    cd ${DIR_BBA}
+    ln -s -f $(realpath ${SETUP_GEO_FILE}) $(basename ${BBA_GEO})
+    popd
+  fi
+  if [[ ${BBA_PAR} != ${RECO_PAR_FILE} ]]; then 
+    pushd .
+    cd ${DIR_BBA}
+    ln -s -f $(realpath ${RECO_PAR_FILE}) $(basename ${BBA_PAR})
+    popd
+  fi
+  BBA_DATASET="${DIR_BBA}/${FILE_LABEL}"
+  PARS="0,\"${BBA_DATASET}\",\"${SETUP_NAME}\",0.,kFALSE";
+  root -b -l -q ${MACRO_BBA}"(${PARS})"
+fi
 
 printf "Reconstruction of %s succeeded\n" "${TSA_INP}"
diff --git a/macro/beamtime/mcbm2025/mcbm_event_reco_L1.C b/macro/beamtime/mcbm2025/mcbm_event_reco_L1.C
index b2befd366e..293f5362ea 100644
--- a/macro/beamtime/mcbm2025/mcbm_event_reco_L1.C
+++ b/macro/beamtime/mcbm2025/mcbm_event_reco_L1.C
@@ -128,6 +128,7 @@ Bool_t mcbm_event_reco_L1(UInt_t uRunId                   = 3453,
   if (uRunId >= 2160) iCalSet = 700900500;
   if (uRunId >= 2352) iCalSet = 22002500;
   if (uRunId >= 2700) iCalSet = 12032500;
+  if (uRunId >= 3399) iCalSet = 22002500;
 
   Double_t Tint           = 100.;  // coincidence time interval
   Int_t iTrackMode        = 2;     // 2 for TofTracker
diff --git a/reco/alignment/CbmBbaAlignmentTask.cxx b/reco/alignment/CbmBbaAlignmentTask.cxx
index 255b7686d0..e36f8b7d05 100644
--- a/reco/alignment/CbmBbaAlignmentTask.cxx
+++ b/reco/alignment/CbmBbaAlignmentTask.cxx
@@ -326,7 +326,7 @@ void CbmBbaAlignmentTask::Exec(Option_t* /*opt*/)
     fFitter.SetDefaultMomentumForMs(0.1);
 
     for (int iTr = 0; iTr < fInputStsTracks->GetEntriesFast(); iTr++) {
-      if (static_cast<int>(fTracks.size()) >= fMaxNtracks) {
+      if (fMaxNtracks && static_cast<int>(fTracks.size()) >= fMaxNtracks) {
         break;
       }
       const CbmStsTrack* stsTrack = dynamic_cast<CbmStsTrack*>(fInputStsTracks->At(iTr));
@@ -1044,10 +1044,9 @@ void CbmBbaAlignmentTask::Finish()
   }  // sensors
 
   // save matrices to disk
-  TFile* misalignmentMatrixRootfile =
-    new TFile("AlignmentMatrices_mcbm_beam_2022_05_23_nickel_finetuning.root", "RECREATE");
+  TFile* misalignmentMatrixRootfile = new TFile(fsMatrixOutFileName, "RECREATE");
   if (misalignmentMatrixRootfile->IsOpen()) {
-    gDirectory->WriteObject(&alignmentMatrices, "AlignmentMatrices");
+    gDirectory->WriteObject(&alignmentMatrices, "MisalignMatrices");
     misalignmentMatrixRootfile->Write();
     misalignmentMatrixRootfile->Close();
   }
diff --git a/reco/alignment/CbmBbaAlignmentTask.h b/reco/alignment/CbmBbaAlignmentTask.h
index 0aa2f51319..5db2bb39b8 100644
--- a/reco/alignment/CbmBbaAlignmentTask.h
+++ b/reco/alignment/CbmBbaAlignmentTask.h
@@ -35,7 +35,7 @@ class CbmBbaAlignmentTask : public FairTask {
  public:
   // Constructors/Destructors ---------
   CbmBbaAlignmentTask(const char* name = "CbmBbaAlignmentTask", Int_t iVerbose = 0,
-                      TString histoFileName = "CbmBbaAlignmentHisto.root");
+                      TString histoFileName = "./CbmBbaAlignmentHisto.root");
   ~CbmBbaAlignmentTask();
 
   Int_t GetZtoNStation(Double_t getZ);
@@ -50,6 +50,8 @@ class CbmBbaAlignmentTask : public FairTask {
   void SetSimulatedMisalignmentRange(double range) { fSimulatedMisalignmentRange = range; }
   void SetRandomSeed(int seed) { fRandomSeed = seed; }
 
+  void SetMatrixOutFileName(TString sMatrixOutFileName) { fsMatrixOutFileName = sMatrixOutFileName; }
+
  public:
   enum TrackingMode
   {
@@ -133,14 +135,16 @@ class CbmBbaAlignmentTask : public FairTask {
   // collection of selected tracks and hits
   std::vector<TrackContainer> fTracks;
 
+
   //output file with histograms
+  TString fsMatrixOutFileName{"AlignmentMatrices_finetuning.root"};
   TString fHistoFileName{"CbmBbaAlignmentHisto.root"};
   TFile* fHistoFile{nullptr};
   TDirectory* fHistoDir{nullptr};
 
   Int_t fNEvents{0};
 
-  Int_t fMaxNtracks{100000};
+  Int_t fMaxNtracks{0};
 
   int fNtrackingStations{0};
   int fNalignmentBodies{0};
@@ -156,6 +160,7 @@ class CbmBbaAlignmentTask : public FairTask {
   long fNdfTotal{0};
   long fFixedNdf{-1};
 
+
   std::vector<Sensor> fSensors;
   std::vector<AlignmentBody> fAlignmentBodies;
 
-- 
GitLab