From b3b722cfe365046f747b54d77d642d34b39129d6 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Fri, 5 Apr 2024 18:22:33 +0200
Subject: [PATCH] online/ca: Adding yaml-configuration for the tracking chain;
 setting number of threads to Opts().NumOMPThreads()

---
 algo/ca/TrackingChain.cxx            | 21 ++++++++++++++++-----
 algo/ca/TrackingChainConfig.h        | 10 ++++++----
 algo/ca/core/pars/CaConfigReader.cxx | 26 ++++++++++++++------------
 algo/ca/core/pars/CaConfigReader.h   |  9 +++++++++
 algo/ca/core/pars/CaInitManager.cxx  |  4 ++++
 algo/ca/core/pars/CaInitManager.h    |  3 ++-
 6 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/algo/ca/TrackingChain.cxx b/algo/ca/TrackingChain.cxx
index 93347a0b08..57ed9baa5e 100644
--- a/algo/ca/TrackingChain.cxx
+++ b/algo/ca/TrackingChain.cxx
@@ -50,19 +50,30 @@ TrackingChain::TrackingChain(std::shared_ptr<HistogramSender> histoSender)
 void TrackingChain::Init()
 {
   // ------ Read tracking chain parameters from the config
-  fConfig = yaml::ReadFromFile<TrackingChainConfig>(Opts().ParamsDir() / "CaConfig.yaml");
+  fConfig = yaml::ReadFromFile<TrackingChainConfig>(Opts().ParamsDir() / "TrackingChainConfig.yaml");
 
   // ------ Read parameters from binary
-  auto paramFile = Opts().ParamsDir() / fConfig.fsParName;
-  L_(info) << "Tracking Chain: reading CA parameters file " << GNb << paramFile.string() << CL << '\n';
+  auto geomCfgFile = (Opts().ParamsDir() / fConfig.fsGeomConfig).string();
+  auto mainCfgFile = (Opts().ParamsDir() / fConfig.fsMainConfig).string();
+  auto userCfgFile = fConfig.fsUserConfig;
+
+  L_(info) << "Tracking Chain: reading geometry from CA parameters file " << GNb << geomCfgFile << CL << '\n';
+  L_(info) << "Tracking Chain: reading parameters from CA main config " << GNb << mainCfgFile << CL << '\n';
   auto manager = InitManager{};
-  manager.ReadParametersObject(paramFile.string());
+  manager.SetDetectorNames(ca::kDetName);
+  manager.SetConfigMain(mainCfgFile);
+  if (!userCfgFile.empty()) {
+    L_(info) << "Tracking Chain: applying user configuration from " << GNb << userCfgFile << CL << '\n';
+    manager.SetConfigUser(userCfgFile);
+  }
+  manager.ReadParametersObject(geomCfgFile);  // geometry setup
+  manager.ReadInputConfigs();
   auto parameters = manager.TakeParameters();
   L_(info) << "Tracking Chain: parameters object: \n" << parameters.ToString(1) << '\n';
 
   // ------ Initialize CA framework
   fCaMonitor.Reset();
-  fCaFramework.SetNofThreads(fConfig.fNofThreads);
+  fCaFramework.SetNofThreads(Opts().NumOMPThreads() == std::nullopt ? 1 : *(Opts().NumOMPThreads()));
   fCaFramework.ReceiveParameters(std::move(parameters));
   fCaFramework.Init(ca::Framework::TrackingMode::kMcbm);
 
diff --git a/algo/ca/TrackingChainConfig.h b/algo/ca/TrackingChainConfig.h
index 3f57a3a852..b8417e60eb 100644
--- a/algo/ca/TrackingChainConfig.h
+++ b/algo/ca/TrackingChainConfig.h
@@ -19,15 +19,17 @@ namespace cbm::algo
   /// \struct TrackingChainConfig
   /// \brief Configuration reader for the TrackingChain class
   struct TrackingChainConfig {
-    std::string fsParName;      ///< Tracking parameter file name
+    std::string fsGeomConfig;   ///< Tracking geometry file name (TMP: includes all other settings, but the settings are rewritten)
+    std::string fsMainConfig;   ///< Main configuration file (rel path in online parameters directory)
+    std::string fsUserConfig;   ///< User configuration file (full path)
     std::string fsMoniOutName;  ///< Monitor output file name
-    int fNofThreads;            ///< Number of threads for tracking
     bool fbStoreMonitor;        ///< Stores monitor snapshot
 
     CBM_YAML_PROPERTIES(
-                      yaml::Property(&TrackingChainConfig::fsParName, "ParName", "CA parameters input"),
+                      yaml::Property(&TrackingChainConfig::fsGeomConfig, "GeomConfigName", "CA geometry input"),
+                      yaml::Property(&TrackingChainConfig::fsMainConfig, "MainConfigName", "Main cofniguration"),
+                      yaml::Property(&TrackingChainConfig::fsUserConfig, "UserConfigName", "User cofniguration"),
                       yaml::Property(&TrackingChainConfig::fsMoniOutName, "MoniOutName", "Monitor output"),
-                      yaml::Property(&TrackingChainConfig::fNofThreads, "NofThreads", "Number of threads"),
                       yaml::Property(&TrackingChainConfig::fbStoreMonitor, "StoreMonitor", "If store monitor"));
   };
 }  // namespace cbm::algo
diff --git a/algo/ca/core/pars/CaConfigReader.cxx b/algo/ca/core/pars/CaConfigReader.cxx
index d59fda12b8..7c55ea839a 100644
--- a/algo/ca/core/pars/CaConfigReader.cxx
+++ b/algo/ca/core/pars/CaConfigReader.cxx
@@ -78,18 +78,7 @@ std::vector<std::string> ConfigReader::GetNodeKeys(const YAML::Node& node) const
 //
 void ConfigReader::Read()
 {
-  {  // Init CA iterations in L1InitManager
-    if (fVerbose >= 1) {
-      LOG(info) << "- reading track finder iterations";
-    }
-    auto iters = this->ReadCAIterationVector();
-    assert(iters.size());
-    fpInitManager->ClearCAIterations();
-    fpInitManager->SetCAIterationsNumberCrosscheck(iters.size());
-    std::for_each(iters.begin(), iters.end(), [&](auto& iter) { fpInitManager->PushBackCAIteration(iter); });
-  }
-
-  {  // Unset inactive tracking stations
+  if (!fbGeometryLock) {  // Unset inactive tracking stations
     if (fVerbose >= 1) {
       LOG(info) << "- unsetting inactive tracking stations";
     }
@@ -108,6 +97,19 @@ void ConfigReader::Read()
     }
   }
 
+  {  // Init CA iterations in L1InitManager
+    if (fVerbose >= 1) {
+      LOG(info) << "- reading track finder iterations";
+    }
+    auto iters = this->ReadCAIterationVector();
+    assert(iters.size());
+    fpInitManager->ClearCAIterations();
+    fpInitManager->SetCAIterationsNumberCrosscheck(iters.size());
+    std::for_each(iters.begin(), iters.end(), [&](auto& iter) { fpInitManager->PushBackCAIteration(iter); });
+  }
+
+
+
   // Init parameters, independnent from the tracking iteration
 
   if (fVerbose >= 1) {
diff --git a/algo/ca/core/pars/CaConfigReader.h b/algo/ca/core/pars/CaConfigReader.h
index b67132c134..b95c15e5ff 100644
--- a/algo/ca/core/pars/CaConfigReader.h
+++ b/algo/ca/core/pars/CaConfigReader.h
@@ -64,6 +64,12 @@ namespace cbm::algo::ca
     /// \brief Gets verbosity level
     int GetVerbosity() const { return fVerbose; }
 
+    /// \brief Gets geometry lock status
+    bool GetGeometryLock() const { return fbGeometryLock; }
+
+    /// \brief Sets geometry lock status
+    void SetGeometryLock(bool lock) { fbGeometryLock = lock; }
+
    private:
     /// \brief  Reads inactive tracking station map
     /// \return A vector of sets of disabled station local indexes vs. the the detector index
@@ -101,5 +107,8 @@ namespace cbm::algo::ca
 
     YAML::Node fMainConfigNode{YAML::NodeType::Undefined};  ///< Main configuration node
     YAML::Node fUserConfigNode{YAML::NodeType::Undefined};  ///< User configuration node
+
+    bool fbMainConfigInitialized = false;  ///< Main configuration file is initialized (e.g. via parameters obj)
+    bool fbGeometryLock          = false;  ///< Geometry initialization locked
   };
 }  // namespace cbm::algo::ca
diff --git a/algo/ca/core/pars/CaInitManager.cxx b/algo/ca/core/pars/CaInitManager.cxx
index 3ab0d39044..03058f25ec 100644
--- a/algo/ca/core/pars/CaInitManager.cxx
+++ b/algo/ca/core/pars/CaInitManager.cxx
@@ -49,6 +49,8 @@ void InitManager::CheckInit()
 {
   this->CheckCAIterationsInit();
   this->CheckStationsInfoInit();
+  fbConfigIsRead       = false;
+  fbGeometryConfigLock = false;
 }
 
 // ----------------------------------------------------------------------------------------------------------------------
@@ -333,6 +335,7 @@ void InitManager::ReadInputConfigs()
       auto configReader = ConfigReader(this, 4);
       configReader.SetMainConfigPath(fsConfigInputMain);
       configReader.SetUserConfigPath(fsConfigInputUser);
+      configReader.SetGeometryLock(fbGeometryConfigLock);
       configReader.Read();
       fbConfigIsRead = true;
       LOG(info) << "ca::InitManager: reading parameter configuration ... \033[1;32mdone\033[0m";
@@ -364,6 +367,7 @@ void InitManager::ReadParametersObject(const std::string& fileName)
   try {
     boost::archive::binary_iarchive ia(ifs);
     ia >> fParameters;
+    fbGeometryConfigLock = true;
   }
   catch (const std::exception&) {
     std::stringstream msg;
diff --git a/algo/ca/core/pars/CaInitManager.h b/algo/ca/core/pars/CaInitManager.h
index 7cb30eea68..323abdd46e 100644
--- a/algo/ca/core/pars/CaInitManager.h
+++ b/algo/ca/core/pars/CaInitManager.h
@@ -331,6 +331,7 @@ namespace cbm::algo::ca
     std::string fsConfigInputUser = "";  ///< name for the input configuration file
     std::string fConfigOutputName = "";  ///< name for the output configuration file
 
-    bool fbConfigIsRead = false;  ///< Flag, if configuration file was read
+    bool fbConfigIsRead       = false;  ///< Flag, if configuration file was read
+    bool fbGeometryConfigLock = false;  ///< Lock geometry initialization 
   };
 }  // namespace cbm::algo::ca
-- 
GitLab