From 1c70793820fc188cc65ffe6313462b6e8f428017 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Thu, 24 Oct 2024 16:32:26 +0200
Subject: [PATCH] CA: Moved tracking setup initializatin from L1 to KfCbm

---
 core/data/CbmDefs.cxx                         | 28 ++++++++++
 core/data/CbmDefs.h                           |  9 ++++
 reco/L1/CMakeLists.txt                        |  2 -
 reco/L1/CbmL1.cxx                             |  4 +-
 reco/L1/qa/CbmCaInputQaSetup.cxx              |  4 +-
 reco/L1/qa/CbmCaOutputQa.cxx                  |  4 +-
 reco/kfnew/CMakeLists.txt                     |  2 +
 .../CbmKfTrackingSetupBuilder.cxx}            | 54 +++++++++----------
 .../CbmKfTrackingSetupBuilder.h}              | 20 ++++---
 9 files changed, 85 insertions(+), 42 deletions(-)
 rename reco/{L1/CbmCaTrackingSetupBuilder.cxx => kfnew/CbmKfTrackingSetupBuilder.cxx} (69%)
 rename reco/{L1/CbmCaTrackingSetupBuilder.h => kfnew/CbmKfTrackingSetupBuilder.h} (81%)

diff --git a/core/data/CbmDefs.cxx b/core/data/CbmDefs.cxx
index bd4d9a0082..406c72c2fa 100644
--- a/core/data/CbmDefs.cxx
+++ b/core/data/CbmDefs.cxx
@@ -102,3 +102,31 @@ std::ostream& operator<<(std::ostream& strm, const ECbmDataType& dataType)
   strm << std::to_string(ToIntegralType(dataType));
   return strm;
 }
+
+namespace cbm::algo::ca
+{
+  ECbmModuleId ToCbmModuleId(EDetectorID detID)
+  {
+    switch (detID) {
+      case EDetectorID::kMvd: return ECbmModuleId::kMvd;
+      case EDetectorID::kSts: return ECbmModuleId::kSts;
+      case EDetectorID::kMuch: return ECbmModuleId::kMuch;
+      case EDetectorID::kTrd: return ECbmModuleId::kTrd;
+      case EDetectorID::kTof: return ECbmModuleId::kTof;
+      default: return ECbmModuleId::kNotExist;
+    }
+  }
+
+  EDetectorID ToCaDetectorID(ECbmModuleId modId)
+  {
+    switch (modId) {
+      case ECbmModuleId::kMvd: return EDetectorID::kMvd;
+      case ECbmModuleId::kSts: return EDetectorID::kSts;
+      case ECbmModuleId::kMuch: return EDetectorID::kMuch;
+      case ECbmModuleId::kTrd: return EDetectorID::kTrd;
+      case ECbmModuleId::kTof: return EDetectorID::kTof;
+      default: return EDetectorID::END;
+    }
+  }
+
+}  // namespace cbm::algo::ca
diff --git a/core/data/CbmDefs.h b/core/data/CbmDefs.h
index 65938836ea..3b89430788 100644
--- a/core/data/CbmDefs.h
+++ b/core/data/CbmDefs.h
@@ -181,6 +181,15 @@ namespace cbm::algo::ca
     kTof,
     END
   };
+
+  /** @brief Conversion map from EDetectorID to ECbmModuleId
+   **/
+  ECbmModuleId ToCbmModuleId(EDetectorID detID);
+
+  /** @brief Conversion map from EDetectorID to ECbmModuleId
+   **/
+  EDetectorID ToCaDetectorID(ECbmModuleId modId);
+
 }  // namespace cbm::algo::ca
 
 
diff --git a/reco/L1/CMakeLists.txt b/reco/L1/CMakeLists.txt
index 1867421d29..84e5bd1bbe 100644
--- a/reco/L1/CMakeLists.txt
+++ b/reco/L1/CMakeLists.txt
@@ -26,7 +26,6 @@ set(SRCS
 ###########################################################################
   CbmCaMCModule.cxx
   CbmCaTimeSliceReader.cxx
-  CbmCaTrackingSetupBuilder.cxx
 
   CbmL1.cxx
   OffLineInterface/CbmL1StsTrackFinder.cxx
@@ -78,7 +77,6 @@ set(HEADERS
   CbmL1Track.h
   CbmL1Vtx.h
   CbmCaTimeSliceReader.h
-  CbmCaTrackingSetupBuilder.h
   L1Algo/utils/CaUvConverter.h
   catools/CaToolsWindowFinder.h
   catools/CaToolsLinkKey.h
diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx
index 15fb967f55..e945d5127c 100644
--- a/reco/L1/CbmL1.cxx
+++ b/reco/L1/CbmL1.cxx
@@ -37,8 +37,8 @@
 #include "CaHit.h"
 #include "CaToolsDebugger.h"
 #include "CaToolsField.h"
-#include "CbmCaTrackingSetupBuilder.h"
 #include "CbmEvent.h"
+#include "CbmKfTrackingSetupBuilder.h"
 #include "CbmMCDataObject.h"
 #include "CbmStsFindTracks.h"
 #include "CbmStsHit.h"
@@ -193,7 +193,7 @@ try {
 
   // turn on reconstruction in sub-detectors
 
-  auto* pSetupBuilder{cbm::ca::TrackingSetupBuilder::Instance()};
+  auto* pSetupBuilder{cbm::kf::TrackingSetupBuilder::Instance()};
   fUseMVD  = pSetupBuilder->Has(ca::EDetectorID::kMvd);
   fUseSTS  = pSetupBuilder->Has(ca::EDetectorID::kSts);
   fUseMUCH = pSetupBuilder->Has(ca::EDetectorID::kMuch);
diff --git a/reco/L1/qa/CbmCaInputQaSetup.cxx b/reco/L1/qa/CbmCaInputQaSetup.cxx
index 7dfc29fa8c..5618827684 100644
--- a/reco/L1/qa/CbmCaInputQaSetup.cxx
+++ b/reco/L1/qa/CbmCaInputQaSetup.cxx
@@ -10,7 +10,7 @@
 #include "CbmCaInputQaSetup.h"
 
 #include "CaInitManager.h"
-#include "CbmCaTrackingSetupBuilder.h"
+#include "CbmKfTrackingSetupBuilder.h"
 #include "CbmL1DetectorID.h"
 #include "CbmMCDataManager.h"
 #include "FairRootManager.h"
@@ -254,7 +254,7 @@ void InputQaSetup::ExecQa()
 InitStatus InputQaSetup::InitQa()
 try {
   LOG(info) << fName << ": initializing... ";
-  auto* pSetupBuilder = cbm::ca::TrackingSetupBuilder::Instance();
+  auto* pSetupBuilder = cbm::kf::TrackingSetupBuilder::Instance();
   auto CheckPresence  = [&](ca::EDetectorID detID) { fvbUseDet[detID] = pSetupBuilder->Has(detID); };
   CheckPresence(ca::EDetectorID::kMvd);
   CheckPresence(ca::EDetectorID::kSts);
diff --git a/reco/L1/qa/CbmCaOutputQa.cxx b/reco/L1/qa/CbmCaOutputQa.cxx
index b86d12ba47..5a49b16b6a 100644
--- a/reco/L1/qa/CbmCaOutputQa.cxx
+++ b/reco/L1/qa/CbmCaOutputQa.cxx
@@ -11,7 +11,7 @@
 
 #include "CaInitManager.h"
 #include "CbmCaMCModule.h"
-#include "CbmCaTrackingSetupBuilder.h"
+#include "CbmKfTrackingSetupBuilder.h"
 #include "CbmQaCanvas.h"
 #include "FairRootManager.h"
 #include "Logger.h"
@@ -798,7 +798,7 @@ try {
 
   {
     using cbm::algo::kf::EFieldMode;
-    using cbm::ca::TrackingSetupBuilder;
+    using cbm::kf::TrackingSetupBuilder;
     ca::InitManager manager;
     manager.ReadParametersObject(fsParametersFilename.c_str());
     manager.SetGeometrySetup(TrackingSetupBuilder::Instance()->MakeSetup<ca::fvec>(EFieldMode::Intrpl));
diff --git a/reco/kfnew/CMakeLists.txt b/reco/kfnew/CMakeLists.txt
index 95833479bf..4b2b4a5c7b 100644
--- a/reco/kfnew/CMakeLists.txt
+++ b/reco/kfnew/CMakeLists.txt
@@ -6,6 +6,7 @@ set(INCLUDE_DIRECTORIES
 
 set(SRCS 
   ${CMAKE_CURRENT_SOURCE_DIR}/CbmKfTarget.cxx
+  ${CMAKE_CURRENT_SOURCE_DIR}/CbmKfTrackingSetupBuilder.cxx
 )
 
 SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS "-O3")
@@ -71,6 +72,7 @@ install(TARGETS KfCbm DESTINATION lib)
 install(
   FILES
     CbmKfOriginalField.h
+    CbmKfTrackingSetupBuilder.h
     CbmKfTarget.h
   DESTINATION
     include/
diff --git a/reco/L1/CbmCaTrackingSetupBuilder.cxx b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx
similarity index 69%
rename from reco/L1/CbmCaTrackingSetupBuilder.cxx
rename to reco/kfnew/CbmKfTrackingSetupBuilder.cxx
index 243f81a5e7..315065019f 100644
--- a/reco/L1/CbmCaTrackingSetupBuilder.cxx
+++ b/reco/kfnew/CbmKfTrackingSetupBuilder.cxx
@@ -7,7 +7,7 @@
 /// \since  28.08.2024
 /// \author Sergei Zharko <s.zharko@gsi.de>
 
-#include "CbmCaTrackingSetupBuilder.h"
+#include "CbmKfTrackingSetupBuilder.h"
 
 #include "CbmKfOriginalField.h"
 #include "CbmKfTarget.h"
@@ -27,7 +27,8 @@
 
 #include <functional>
 
-using cbm::ca::TrackingSetupBuilder;
+using cbm::algo::ca::EDetectorID;
+using cbm::kf::TrackingSetupBuilder;
 using kf::tools::MaterialMapFactory;
 
 // ---------------------------------------------------------------------------------------------------------------------
@@ -35,23 +36,24 @@ using kf::tools::MaterialMapFactory;
 void TrackingSetupBuilder::CheckDetectorPresence()
 {
   LOG(info) << "TrackingSetupBuilder: detector subsystems in geometry: ";
-  auto Check = [&](ca::EDetectorID detID) {
-    fvbDetUsed[detID] = CbmSetup::Instance()->IsActive(kCbmModuleId[detID])
-                        && FairRootManager::Instance()->GetObject(kDetHitBrName[detID]);
-    LOG(info) << fmt::format("\t{:6}: {}", kDetName[detID], fvbDetUsed[detID]);
+  auto Check = [&](EDetectorID detID) {
+    auto modId = cbm::algo::ca::ToCbmModuleId(detID);
+    fvbDetUsed[detID] =
+      CbmSetup::Instance()->IsActive(modId) && FairRootManager::Instance()->GetObject(kDetHitBrName[detID]);
+    LOG(info) << fmt::format("\t{:6}: {}", ToString(modId), fvbDetUsed[detID]);
   };
 
-  Check(ca::EDetectorID::kMvd);
-  Check(ca::EDetectorID::kSts);
-  Check(ca::EDetectorID::kMuch);
-  Check(ca::EDetectorID::kTrd);
-  Check(ca::EDetectorID::kTof);
+  Check(EDetectorID::kMvd);
+  Check(EDetectorID::kSts);
+  Check(EDetectorID::kMuch);
+  Check(EDetectorID::kTrd);
+  Check(EDetectorID::kTof);
 
   // Explicitly disable MVD, if it is not required from the STSFindTracks task
-  if (fvbDetUsed[ca::EDetectorID::kMvd]) {
+  if (fvbDetUsed[EDetectorID::kMvd]) {
     auto* pTrackFinderTask = dynamic_cast<CbmStsFindTracks*>(FairRunAna::Instance()->GetTask("STSFindTracks"));
     if (pTrackFinderTask) {
-      fvbDetUsed[ca::EDetectorID::kMvd] = pTrackFinderTask->MvdUsage();
+      fvbDetUsed[EDetectorID::kMvd] = pTrackFinderTask->MvdUsage();
     }
   }
 }
@@ -74,38 +76,34 @@ try {
       pField->GetType() == 0
       && fabs(pField->GetBx(0., 0., 0.)) < MinField<
            double> && fabs(pField->GetBy(0., 0., 0.)) < MinField<double> && fabs(pField->GetBz(0., 0., 0.)) < MinField<double>) {
-      LOG(info) << "!!!!!!!!!!!!!!!!!!! A";
       fBuilder.SetFieldFunction(cbm::kf::ZeroField(), EFieldType::Null);
     }
     else {
-      LOG(info) << "!!!!!!!!!!!!!!!!!!! B";
       fBuilder.SetFieldFunction(cbm::kf::OriginalField(), EFieldType::Normal);
     }
   }
   else {
-    LOG(info) << "!!!!!!!!!!!!!!!!!!! C";
     fBuilder.SetFieldFunction(cbm::kf::ZeroField(), EFieldType::Null);
   }
 
   // Tracking station property initialization
-  auto CollectStations = [&](const auto* pIfs, ca::EDetectorID detID) -> void {
+  auto CollectStations = [&](const auto* pIfs, EDetectorID detID) -> void {
     if (!fvbDetUsed[detID]) {
       return;
     }
     for (int iSt = 0; iSt < pIfs->GetNtrackingStations(); ++iSt) {
-      fBuilder.AddLayer(
-        GeoLayer<ca::EDetectorID>{detID,  // ca::Tracking detector id scheme
-                                  iSt,    // ca::Tracking station indexing
-                                  pIfs->GetZref(iSt), pIfs->GetZmin(iSt), pIfs->GetZmax(iSt),
-                                  std::max(std::fabs(pIfs->GetXmin(iSt)), std::fabs(pIfs->GetXmax(iSt))),
-                                  std::max(std::fabs(pIfs->GetYmin(iSt)), std::fabs(pIfs->GetYmax(iSt)))});
+      fBuilder.AddLayer(GeoLayer<EDetectorID>{detID,  // ca::Tracking detector id scheme
+                                              iSt,    // ca::Tracking station indexing
+                                              pIfs->GetZref(iSt), pIfs->GetZmin(iSt), pIfs->GetZmax(iSt),
+                                              std::max(std::fabs(pIfs->GetXmin(iSt)), std::fabs(pIfs->GetXmax(iSt))),
+                                              std::max(std::fabs(pIfs->GetYmin(iSt)), std::fabs(pIfs->GetYmax(iSt)))});
     }
   };
-  CollectStations(CbmMvdTrackingInterface::Instance(), ca::EDetectorID::kMvd);
-  CollectStations(CbmStsTrackingInterface::Instance(), ca::EDetectorID::kSts);
-  CollectStations(CbmMuchTrackingInterface::Instance(), ca::EDetectorID::kMuch);
-  CollectStations(CbmTrdTrackingInterface::Instance(), ca::EDetectorID::kTrd);
-  CollectStations(CbmTofTrackingInterface::Instance(), ca::EDetectorID::kTof);
+  CollectStations(CbmMvdTrackingInterface::Instance(), EDetectorID::kMvd);
+  CollectStations(CbmStsTrackingInterface::Instance(), EDetectorID::kSts);
+  CollectStations(CbmMuchTrackingInterface::Instance(), EDetectorID::kMuch);
+  CollectStations(CbmTrdTrackingInterface::Instance(), EDetectorID::kTrd);
+  CollectStations(CbmTofTrackingInterface::Instance(), EDetectorID::kTof);
 
   // Retrieve target properties
   const auto* pTarget = cbm::kf::Target::Instance();
diff --git a/reco/L1/CbmCaTrackingSetupBuilder.h b/reco/kfnew/CbmKfTrackingSetupBuilder.h
similarity index 81%
rename from reco/L1/CbmCaTrackingSetupBuilder.h
rename to reco/kfnew/CbmKfTrackingSetupBuilder.h
index 409775a73d..bc8fabc43e 100644
--- a/reco/L1/CbmCaTrackingSetupBuilder.h
+++ b/reco/kfnew/CbmKfTrackingSetupBuilder.h
@@ -9,13 +9,14 @@
 
 #pragma once
 
-#include "CbmL1DetectorID.h"
+#include "CbmDefs.h"
+#include "CbmEnumArray.h"
 #include "KfSetupBuilder.h"
 
 #include <mutex>
 #include <tuple>
 
-namespace cbm::ca
+namespace cbm::kf
 {
   /// \class TrackingSetupBuilder
   /// \brief Encapsulation of the kf::Setup initialization routines for CBM
@@ -36,7 +37,7 @@ namespace cbm::ca
     }
 
     /// \brief  Checks, if a tracking detector is used (is in geometry and has hits)
-    bool Has(ca::EDetectorID detID) const { return fvbDetUsed[detID]; }
+    bool Has(cbm::algo::ca::EDetectorID detID) const { return fvbDetUsed[detID]; }
 
     // Disable copy and move
     TrackingSetupBuilder(const TrackingSetupBuilder&) = delete;
@@ -45,6 +46,13 @@ namespace cbm::ca
     TrackingSetupBuilder& operator=(TrackingSetupBuilder&&) = delete;
 
    private:
+    template<typename T>
+    using DetectorIDArray_t = cbm::core::EnumArray<cbm::algo::ca::EDetectorID, T>;
+
+    /// \brief Hit branch names vs. cbm::algo::ca::EDetectorID
+    static constexpr DetectorIDArray_t<const char*> kDetHitBrName{
+      {"MvdHit", "StsHit", "MuchPixelHit", "TrdHit", "TofHit"}};
+
     /// \brief Default constructor
     TrackingSetupBuilder() = default;
 
@@ -68,8 +76,8 @@ namespace cbm::ca
     inline static TrackingSetupBuilder* fpInstance{nullptr};
     inline static std::mutex fMutex{};
 
-    cbm::algo::kf::SetupBuilder fBuilder{};  ///< KF-setup builder
-    DetIdArr_t<bool> fvbDetUsed{{false}};    ///< Detector subsystem usage flag
+    cbm::algo::kf::SetupBuilder fBuilder{};       ///< KF-setup builder
+    DetectorIDArray_t<bool> fvbDetUsed{{false}};  ///< Detector subsystem usage flag
 
     /// \brief Checks, if the setup was already initialized
     /// \note  Each call of the setup initializer resets the setup builder, so the initialization is called
@@ -78,4 +86,4 @@ namespace cbm::ca
   };
 
 
-}  // namespace cbm::ca
+}  // namespace cbm::kf
-- 
GitLab