diff --git a/algo/ca/TrackingChain.cxx b/algo/ca/TrackingChain.cxx index 93347a0b08faa371bfec4746c9ddea4fd2dd0ed2..57ed9baa5ea8795f1d65d3a3f5ec81736611c426 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 3f57a3a852c3dba64da69979d107c32c9445bc8d..b8417e60eb522bfba1db4ed3606381370530189b 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 d59fda12b85fd5f0321b27031edcc4ffa60ae45f..7c55ea839abca8ba0d11719b1b34ff687a66c6f8 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 b67132c1348791cd611824519a657980ec7ad179..b95c15e5ffef8eef596e0ab0ee4a20799b0ca597 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 3ab0d39044edce070b33b7a032c1c36a7cefc197..03058f25ec211457fe2152c454cfb7f364cb24d9 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 7cb30eea684c4f571a460a555cac0a74f8593c2e..323abdd46e1e24c3e7ba8dea825e8b07acfb4937 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