From ddac3c05fadc204fb699907265339c9560e65c0a Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Thu, 6 Mar 2025 22:21:58 +0100
Subject: [PATCH 1/5] online:  - QA for V0-trigger  - Masking channels (BMON as
 example) in digi event-selector

---
 algo/CMakeLists.txt                         |  4 ++
 algo/base/Definitions.h                     |  4 +-
 algo/evbuild/EventbuildChain.h              |  5 ++
 algo/evselector/DigiEventSelector.cxx       | 25 ++++++++
 algo/evselector/DigiEventSelector.h         |  9 +++
 algo/evselector/DigiEventSelectorConfig.cxx | 14 ++++-
 algo/evselector/DigiEventSelectorConfig.h   |  9 ++-
 algo/global/Reco.cxx                        |  6 ++
 algo/qa/QaTaskHeader.h                      |  2 +-
 algo/qa/trigger/V0TriggerQa.cxx             | 34 +++++++++++
 algo/qa/trigger/V0TriggerQa.h               | 68 +++++++++++++++++++++
 algo/trigger/V0Trigger.cxx                  | 10 +++
 algo/trigger/V0Trigger.h                    | 11 ++++
 13 files changed, 194 insertions(+), 7 deletions(-)
 create mode 100644 algo/qa/trigger/V0TriggerQa.cxx
 create mode 100644 algo/qa/trigger/V0TriggerQa.h

diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt
index 82f767e3bf..c589483d0b 100644
--- a/algo/CMakeLists.txt
+++ b/algo/CMakeLists.txt
@@ -159,6 +159,7 @@ set(SRCS
   qa/QaManager.cxx
   qa/hitfind/BmonHitfindQa.cxx
   qa/hitfind/BmonHitfindQaParameters.cxx
+  qa/trigger/V0TriggerQa.cxx
   qa/unpack/StsDigiQa.cxx
   ca/TrackingSetup.cxx
   ca/TrackingChain.cxx
@@ -200,6 +201,7 @@ target_include_directories(Algo
          ${CMAKE_CURRENT_SOURCE_DIR}/qa
          ${CMAKE_CURRENT_SOURCE_DIR}/qa/unpack
          ${CMAKE_CURRENT_SOURCE_DIR}/qa/hitfind
+         ${CMAKE_CURRENT_SOURCE_DIR}/qa/trigger
          ${CMAKE_CURRENT_SOURCE_DIR}/kf
          ${CMAKE_CURRENT_SOURCE_DIR}/kf/core
          ${CMAKE_CURRENT_SOURCE_DIR}/kf/core/utils
@@ -275,6 +277,8 @@ if (NOT CBM_ONLINE_STANDALONE)
            ${CMAKE_CURRENT_SOURCE_DIR}/detectors
            ${CMAKE_CURRENT_SOURCE_DIR}/qa
            ${CMAKE_CURRENT_SOURCE_DIR}/qa/unpack
+           ${CMAKE_CURRENT_SOURCE_DIR}/qa/hitfind
+           ${CMAKE_CURRENT_SOURCE_DIR}/qa/trigger
            ${CMAKE_CURRENT_SOURCE_DIR}/kf
            ${CMAKE_CURRENT_SOURCE_DIR}/kf/core
            ${CMAKE_CURRENT_SOURCE_DIR}/kf/core/utils
diff --git a/algo/base/Definitions.h b/algo/base/Definitions.h
index b1ff4c9ccc..c9cac7a917 100644
--- a/algo/base/Definitions.h
+++ b/algo/base/Definitions.h
@@ -79,6 +79,7 @@ namespace cbm::algo
     RecoFsd,
     Tracking,
     V0Finder,
+    V0Trigger,
   };
 
 }  // namespace cbm::algo
@@ -150,7 +151,8 @@ CBM_ENUM_DICT(cbm::algo::QaStep,
   {"RecoTof", cbm::algo::QaStep::RecoTof},
   {"RecoFsd", cbm::algo::QaStep::RecoFsd},
   {"Tracking", cbm::algo::QaStep::Tracking},
-  {"V0Finder", cbm::algo::QaStep::V0Finder}
+  {"V0Finder", cbm::algo::QaStep::V0Finder},
+  {"V0Trigger", cbm::algo::QaStep::V0Trigger}
 );
 
 #endif
diff --git a/algo/evbuild/EventbuildChain.h b/algo/evbuild/EventbuildChain.h
index ed6be01c66..32ae1e649c 100644
--- a/algo/evbuild/EventbuildChain.h
+++ b/algo/evbuild/EventbuildChain.h
@@ -64,6 +64,11 @@ namespace cbm::algo::evbuild
     /** @brief Registers tracking setup **/
     void RegisterTrackingSetup(std::shared_ptr<TrackingSetup> pSetup) { fSelector.RegisterTrackingSetup(pSetup); }
 
+    /** @brief Sets V0 trigger QA
+     ** @param pQa  Qa module
+     **/
+    void SetV0TriggerQa(std::shared_ptr<V0TriggerQa> pQa) { fV0Trigger.SetQa(pQa); }
+
    private:                                              // members
     Config fConfig;                                      ///< Global configuration
     ECbmModuleId fTriggerDet = ECbmModuleId::kNotExist;  ///< Trigger detector
diff --git a/algo/evselector/DigiEventSelector.cxx b/algo/evselector/DigiEventSelector.cxx
index bae8b3e2cf..165bbca2bc 100644
--- a/algo/evselector/DigiEventSelector.cxx
+++ b/algo/evselector/DigiEventSelector.cxx
@@ -38,12 +38,16 @@ namespace cbm::algo::evbuild
         case ECbmModuleId::kTof:
           if (!CheckTofLayers(event.fTof, entry.second)) return false;
           break;
+        case ECbmModuleId::kBmon:
+          if (!CheckBmonDiamonds(event.fBmon, entry.second)) return false;
+          break;
         default:
           throw std::runtime_error("Number of layers for " + ::ToString(entry.first) + " is not implemented");
           break;
       }
     }
 
+
     return true;
   }
   // --------------------------------------------------------------------------
@@ -127,6 +131,27 @@ namespace cbm::algo::evbuild
   // --------------------------------------------------------------------------
 
 
+  // -----   Check number of digis in selected BMON diamonds ------------------
+  bool DigiEventSelector::CheckBmonDiamonds(gsl::span<const CbmBmonDigi> digis, size_t minNum) const
+  {
+    auto itMaskedChan = fConfig.fMaskedChannels.find(ECbmModuleId::kBmon);
+    if (itMaskedChan == fConfig.fMaskedChannels.end() || itMaskedChan->second.size() == 0) {
+      return digis.size() >= minNum;
+    }
+
+    size_t nAcceptedDigis{0};
+    const auto& maskedChannels = itMaskedChan->second;
+    for (const auto& digi : digis) {
+      if (maskedChannels.find(digi.GetAddress()) == maskedChannels.end()) {
+        ++nAcceptedDigis;
+      }
+    }
+
+    return nAcceptedDigis >= minNum;
+  }
+  // --------------------------------------------------------------------------
+
+
   // -----   Info to string   -------------------------------------------------
   std::string DigiEventSelector::ToString() const
   {
diff --git a/algo/evselector/DigiEventSelector.h b/algo/evselector/DigiEventSelector.h
index a8ba4d7a95..b298875b06 100644
--- a/algo/evselector/DigiEventSelector.h
+++ b/algo/evselector/DigiEventSelector.h
@@ -74,6 +74,15 @@ namespace cbm::algo::evbuild
     bool CheckTofLayers(gsl::span<const CbmTofDigi> digis, size_t minNum) const;
 
 
+    // FIXME: apply for all detectors
+    /** @brief Test for digis in selected (=not masked) BMON diamonds
+     ** @param digis Vector of BMON digis
+     ** @param minNum Requested minimum of not masked BMON digis
+     ** @return True if the number of not masked BMON digis is above the threshold
+     **/
+    bool CheckBmonDiamonds(gsl::span<const CbmBmonDigi> digis, size_t minNum) const;
+
+
    private:                           // members
     DigiEventSelectorConfig fConfig;  ///< Configuration / parameters
     std::shared_ptr<TrackingSetup> fpTrackingSetup = nullptr;  ///< Tracking setup (access to stations info)
diff --git a/algo/evselector/DigiEventSelectorConfig.cxx b/algo/evselector/DigiEventSelectorConfig.cxx
index 647f7c0dfb..7c536e3a89 100644
--- a/algo/evselector/DigiEventSelectorConfig.cxx
+++ b/algo/evselector/DigiEventSelectorConfig.cxx
@@ -1,6 +1,6 @@
-/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+/* Copyright (C) 2022-2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
    SPDX-License-Identifier: GPL-3.0-only
-   Authors: Shreya Roy. Pierre-Alain Loizeau, Volker Friese [committer], Dominik Smith */
+   Authors: Shreya Roy. Pierre-Alain Loizeau, Volker Friese [committer], Dominik Smith, Sergei Zharko */
 
 #include "DigiEventSelectorConfig.h"
 
@@ -34,6 +34,15 @@ namespace cbm::algo::evbuild
           L_(warning) << "DigiEventSelectorConfig: Ignoring minimum 0 for layers in " << ::ToString(det);
       }
     }
+    if (auto maskedChannels = config["maskedChannels"]) {
+      for (YAML::const_iterator it = maskedChannels.begin(); it != maskedChannels.end(); ++it) {
+        auto det   = ToCbmModuleIdCaseInsensitive(it->first.as<std::string>());
+        auto value = it->second.as<std::vector<uint32_t>>();
+        if (value.size() > 0) {
+          fMaskedChannels[det] = std::unordered_set<uint32_t>(value.begin(), value.end());
+        }
+      }
+    }
   }
   // --------------------------------------------------------------------------
 
@@ -50,6 +59,7 @@ namespace cbm::algo::evbuild
       auto det                 = ToString(entry.first);
       result["minLayers"][det] = entry.second;
     }
+    // FIXME: implement masked channels storage
     return result;
   }
   // --------------------------------------------------------------------------
diff --git a/algo/evselector/DigiEventSelectorConfig.h b/algo/evselector/DigiEventSelectorConfig.h
index 43276c739d..fa97bdcc13 100644
--- a/algo/evselector/DigiEventSelectorConfig.h
+++ b/algo/evselector/DigiEventSelectorConfig.h
@@ -1,6 +1,6 @@
-/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+/* Copyright (C) 2022-2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
    SPDX-License-Identifier: GPL-3.0-only
-   Authors: Shreya Roy. Pierre-Alain Loizeau, Volker Friese [committer], Dominik Smith */
+   Authors: Shreya Roy. Pierre-Alain Loizeau, Volker Friese [committer], Dominik Smith, Sergei Zharko */
 
 #ifndef CBM_ALGO_EVBUILD_DIGIEVENTSELECTORCONFIG_H
 #define CBM_ALGO_EVBUILD_DIGIEVENTSELECTORCONFIG_H 1
@@ -9,6 +9,7 @@
 
 #include <cstdint>
 #include <map>
+#include <unordered_set>
 
 #include <yaml-cpp/yaml.h>
 
@@ -45,10 +46,12 @@ namespace cbm::algo::evbuild
     /** @brief Save to YAML **/
     YAML::Node ToYaml() const;
 
-
    private:
     std::map<ECbmModuleId, size_t> fMinNumDigis;   ///< Key: detector, value: minimal number of digis
     std::map<ECbmModuleId, size_t> fMinNumLayers;  ///< Key: detector, value: Minimal number of layers
+
+    /** @brief A map of masked digi addresses, which should not participate in the event building **/
+    std::map<ECbmModuleId, std::unordered_set<uint32_t>> fMaskedChannels;
   };
 
 
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index 0f192df1b6..8f042b149d 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -192,6 +192,12 @@ void Reco::Init(const Options& opts)
     evbuild::Config config(YAML::LoadFile(configFile.string()));
     fEventBuild =
       std::make_unique<evbuild::EventbuildChain>(config, (Opts().Has(QaStep::EventBuilding) ? fSender : nullptr));
+    if (fQaManager != nullptr && Opts().Has(QaStep::V0Trigger)) {
+      // FIXME: Replace with a common function SetTriggerQa(fQaManager)
+      auto pTriggerQa = std::make_shared<evbuild::V0TriggerQa>(fQaManager);
+      pTriggerQa->Init();
+      fEventBuild->SetV0TriggerQa(pTriggerQa);
+    }
     fEventBuild->RegisterTrackingSetup(pTrackingSetup);
   }
 
diff --git a/algo/qa/QaTaskHeader.h b/algo/qa/QaTaskHeader.h
index ceb03e5ad4..e910a6a103 100644
--- a/algo/qa/QaTaskHeader.h
+++ b/algo/qa/QaTaskHeader.h
@@ -51,7 +51,7 @@ namespace cbm::algo::qa
     ///
     /// The task can be inactive, if a nullptr qa::Manager was passed to the constructor. If it is the case,
     /// the fpData instance is not defined, and no actions on the task should be performed
-    bool IsActive() const { return static_cast<bool>(fpData != nullptr); }
+    bool IsActive() const { return fpData.get(); }
 
     /// \brief Gets name of the task
     const std::string& GetTaskName() { return fsName; }
diff --git a/algo/qa/trigger/V0TriggerQa.cxx b/algo/qa/trigger/V0TriggerQa.cxx
new file mode 100644
index 0000000000..234cf13b19
--- /dev/null
+++ b/algo/qa/trigger/V0TriggerQa.cxx
@@ -0,0 +1,34 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   V0TriggerQa.cxx
+/// \brief  A V0-trigger QA (implementation)
+/// \since  06.03.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+#include "qa/trigger/V0TriggerQa.h"
+
+#include "qa/Histogram.h"
+
+using cbm::algo::evbuild::V0TriggerQa;
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+void V0TriggerQa::Init()
+{
+  // Histograms
+  fphPairDeltaT  = MakeObj<qa::H1D>("v0trigger_pair_delta_t", "Time difference of track pair;#Delta t [ns];Counts",
+                                   kPairDeltaTB, kPairDeltaTL, kPairDeltaTU);
+  fphPairZVertex = MakeObj<qa::H1D>("v0trigger_pair_z_vertex", "z-verex of track pair;z [cm];Counts", kPairZVertexB,
+                                    kPairZVertexL, kPairZVertexU);
+  fphPairDca     = MakeObj<qa::H1D>("v0trigger_pair_dca", "Track pair distance of closest approach;DCA [cm];Counts",
+                                kPairDcaB, kPairDcaL, kPairDcaU);
+
+  // Canvas
+  auto canv = qa::CanvasConfig(GetTaskName(), "V0 Trigger summary", 3, 1);
+  canv.AddPadConfig(qa::PadConfig(fphPairDeltaT, "hist"));
+  canv.AddPadConfig(qa::PadConfig(fphPairZVertex, "hist"));
+  canv.AddPadConfig(qa::PadConfig(fphPairDca, "hist"));
+  AddCanvasConfig(canv);
+}
diff --git a/algo/qa/trigger/V0TriggerQa.h b/algo/qa/trigger/V0TriggerQa.h
new file mode 100644
index 0000000000..6f1aa13dc6
--- /dev/null
+++ b/algo/qa/trigger/V0TriggerQa.h
@@ -0,0 +1,68 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   V0TriggerQa.h
+/// \brief  A V0-trigger QA
+/// \since  06.03.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+#pragma once
+
+#include "qa/QaTaskHeader.h"
+
+namespace cbm::algo::qa
+{
+  class H1D;
+}  // namespace cbm::algo::qa
+
+
+namespace cbm::algo::evbuild
+{
+  /// \class V0TriggerQa
+  /// \brief A QA module for the V0-trigger
+  class V0TriggerQa : public qa::TaskHeader {
+   public:
+    friend class V0Trigger;  // for access to histograms
+
+    /// \brief Constructor
+    /// \param pManager  Pointer to the QA manager
+    /// \param name      Name of the QA (directory)
+    V0TriggerQa(const std::unique_ptr<qa::Manager>& pManager) : qa::TaskHeader(pManager, "V0Trigger") {}
+
+    /// \brief Copy constructor
+    V0TriggerQa(const V0TriggerQa&) = delete;
+
+    /// \brief Move constructor
+    V0TriggerQa(V0TriggerQa&&) = delete;
+
+    /// \brief Destructor
+    ~V0TriggerQa() = default;
+
+    /// \brief Copy assignment operator
+    V0TriggerQa& operator=(const V0TriggerQa&) = delete;
+
+    /// \brief Move assignment operator
+    V0TriggerQa& operator=(V0TriggerQa&&) = delete;
+
+    /// \brief Initializes the task
+    void Init();
+
+   private:
+    //* Constants
+    static constexpr int kPairDeltaTB{100};       ///< Track pair time difference: n bins
+    static constexpr double kPairDeltaTL{-50.};   ///< Track pair time difference: lower bound [ns]
+    static constexpr double kPairDeltaTU{+50.};   ///< Track pair time difference: upper bound [ns]
+    static constexpr int kPairZVertexB{120};      ///< Track pair z vertex: n bins
+    static constexpr double kPairZVertexL{-60.};  ///< Track pair z vertex: lower bound [cm]
+    static constexpr double kPairZVertexU{+60.};  ///< Track pair z vertex: upper bound [cm]
+    static constexpr int kPairDcaB{100};          ///< Track pair DCA: n bins
+    static constexpr double kPairDcaL{-2.};       ///< Track pair DCA: lower bound [cm]
+    static constexpr double kPairDcaU{+2.};       ///< Track pair DCA: upper bound [cm]
+
+    //* Histograms
+    qa::H1D* fphPairDeltaT{nullptr};   ///< Track pair delta T
+    qa::H1D* fphPairZVertex{nullptr};  ///< Track pair z-vertex
+    qa::H1D* fphPairDca{nullptr};      ///< Track pair distance at closest approach
+  };
+}  // namespace cbm::algo::evbuild
diff --git a/algo/trigger/V0Trigger.cxx b/algo/trigger/V0Trigger.cxx
index bf9264801a..49cd418258 100644
--- a/algo/trigger/V0Trigger.cxx
+++ b/algo/trigger/V0Trigger.cxx
@@ -32,6 +32,11 @@ namespace cbm::algo::evbuild
         // Check track time difference
         float time1 = trackIter1->fParPV.GetTime();
         float time2 = trackIter2->fParPV.GetTime();
+
+        if (fpQa->IsActive()) {
+          fpQa->fphPairDeltaT->Fill(time1 - time2);
+        }
+
         if (time2 < time1) {
           result.second.errTracksUnsorted++;
           continue;
@@ -42,6 +47,11 @@ namespace cbm::algo::evbuild
 
         // Check PCA cuts
         auto [zVertex, dist] = CalcPCA(trackIter1->fParPV, trackIter2->fParPV);
+        if (fpQa->IsActive()) {
+          fpQa->fphPairZVertex->Fill(zVertex);
+          fpQa->fphPairDca->Fill(dist);
+        }
+
         if (dist < config.PairDist_max()) {
           result.second.numTrackPairsAfterDistCut++;
           if (zVertex >= config.PairZ_min() && zVertex <= config.PairZ_max()) {
diff --git a/algo/trigger/V0Trigger.h b/algo/trigger/V0Trigger.h
index 6bed8ce5d2..3736b64f23 100644
--- a/algo/trigger/V0Trigger.h
+++ b/algo/trigger/V0Trigger.h
@@ -7,6 +7,7 @@
 #include "CaTrack.h"
 #include "CaVector.h"
 #include "V0TriggerConfig.h"
+#include "qa/trigger/V0TriggerQa.h"
 
 #include <utility>
 #include <vector>
@@ -50,6 +51,7 @@ namespace cbm::algo::evbuild
     /** @brief Constructor **/
     V0Trigger() = default;
 
+
     /** @brief Execution
      ** @param  tracks      Input track vector
      ** @param  config      Trigger configuration
@@ -57,6 +59,13 @@ namespace cbm::algo::evbuild
      **/
     Result operator()(const TrackVector& tracks, const V0TriggerConfig& config) const;
 
+
+    /** @brief Sets QA module
+     ** @param pQa  Pointer to the QA module
+     **/
+    void SetQa(std::shared_ptr<V0TriggerQa> pQa) { fpQa = pQa; }
+
+
     /** @brief Info to string **/
     std::string ToString() const;
 
@@ -84,6 +93,8 @@ namespace cbm::algo::evbuild
      ** @return decision
      **/
     bool IsPrimary(const TrackParam& track, const V0TriggerConfig& config) const;
+
+    std::shared_ptr<V0TriggerQa> fpQa{std::make_shared<V0TriggerQa>(nullptr)};  //! QA module
   };
 
 }  // namespace cbm::algo::evbuild
-- 
GitLab


From 46f5e7d08e6e186ac9c9a991e8ca8112bf9b46c6 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Tue, 4 Mar 2025 15:42:03 +0100
Subject: [PATCH 2/5] Cherry-pick of commit
 9daecd7fcb47b3ade9e53e7fbc287d8ac0e30800 from MR2035 (TOF Readout)

---
 algo/CMakeLists.txt                        |   2 +
 algo/detectors/tof/ReadoutConfig.cxx       |  53 +++++++++-
 algo/detectors/tof/ReadoutConfig.h         |   3 +-
 algo/global/Reco.cxx                       |  11 +++
 algo/global/Reco.h                         |   2 +
 algo/qa/Histogram.h                        |   3 +-
 algo/qa/hitfind/TofHitfindQa.cxx           | 110 +++++++++++++++++++++
 algo/qa/hitfind/TofHitfindQa.h             |  91 +++++++++++++++++
 algo/qa/hitfind/TofHitfindQaParameters.cxx |  40 ++++++++
 algo/qa/hitfind/TofHitfindQaParameters.h   |  39 ++++++++
 core/detectors/tof/CbmMcbm2018TofPar.cxx   |  61 +++++++++++-
 core/detectors/tof/CbmMcbm2018TofPar.h     |   4 +-
 external/InstallParameter.cmake            |   2 +-
 13 files changed, 409 insertions(+), 12 deletions(-)
 create mode 100644 algo/qa/hitfind/TofHitfindQa.cxx
 create mode 100644 algo/qa/hitfind/TofHitfindQa.h
 create mode 100644 algo/qa/hitfind/TofHitfindQaParameters.cxx
 create mode 100644 algo/qa/hitfind/TofHitfindQaParameters.h

diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt
index c589483d0b..5eff2e5606 100644
--- a/algo/CMakeLists.txt
+++ b/algo/CMakeLists.txt
@@ -160,6 +160,8 @@ set(SRCS
   qa/hitfind/BmonHitfindQa.cxx
   qa/hitfind/BmonHitfindQaParameters.cxx
   qa/trigger/V0TriggerQa.cxx
+  qa/hitfind/TofHitfindQa.cxx
+  qa/hitfind/TofHitfindQaParameters.cxx
   qa/unpack/StsDigiQa.cxx
   ca/TrackingSetup.cxx
   ca/TrackingChain.cxx
diff --git a/algo/detectors/tof/ReadoutConfig.cxx b/algo/detectors/tof/ReadoutConfig.cxx
index 3323882010..36310a9d4b 100644
--- a/algo/detectors/tof/ReadoutConfig.cxx
+++ b/algo/detectors/tof/ReadoutConfig.cxx
@@ -417,7 +417,7 @@ namespace cbm::algo::tof
       fviRpcChUId[uCh] = CbmTofAddress::GetUniqueAddress(iModuleId, 7 - iRpc, 0, 0, iModuleType);
       uCh++;
     }
-    uCh += (24 + 2 * 32);
+    uCh += (24 + 4 * 32);
     L_(debug) << " Map end ceramics  box  at GBTX  -  uCh = " << uCh;
   }
 
@@ -557,7 +557,7 @@ namespace cbm::algo::tof
         int iSideMap        = -1;
         int iStrMap         = -1;
         int iRpcMap         = -1;
-        const int ConOff[8] = {0, 2, 4, 6, 7, 1, 3, 5};  // Get4 after Gbtx
+        const int ConOff[8] = {0, 2, 4, 6, 7, 1, 3, 5};  //Get4 after Gbtx
         for (int32_t iFeet = 0; iFeet < 5; iFeet++) {
           for (int32_t iStr = 0; iStr < 32; iStr++) {
             switch (iFeet) {
@@ -592,6 +592,49 @@ namespace cbm::algo::tof
           }
         }
       }
+      else if (crob.rpcSide == 5) {
+        int iSideMap        = -1;
+        int iStrMap         = -1;
+        int iRpcMap         = -1;
+        const int ConOff[8] = {0, 2, 4, 6, 7, 1, 3, 5};  // Get4 after Gbtx
+        for (int32_t iFeet = 0; iFeet < 5; iFeet++) {
+          for (int32_t iStr = 0; iStr < 32; iStr++) {
+            switch (iFeet) {
+              case 0: iSideMap = -1; break;
+              case 1:
+                iRpcMap  = 0;
+                iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+                iStrMap  = 31 - iStrMap;
+                iSideMap = 1;
+                break;
+              case 2:
+                iRpcMap  = 0;
+                iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+                iStrMap  = 31 - iStrMap;
+                iSideMap = 0;
+                break;
+              case 3:
+                iRpcMap  = 1;
+                iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+                iStrMap  = 31 - iStrMap;
+                iSideMap = 0;
+                break;
+              case 4:
+                iRpcMap  = 1;
+                iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+                iStrMap  = 31 - iStrMap;
+                iSideMap = 1;
+                break;
+            }
+            if (iSideMap > -1)
+              fviRpcChUId[uCh] =
+                CbmTofAddress::GetUniqueAddress(crob.moduleId, iRpcMap, iStrMap, iSideMap, crob.rpcType);
+            else
+              fviRpcChUId[uCh] = 0;
+            uCh++;
+          }
+        }
+      }
     }
   }
 
@@ -645,7 +688,11 @@ namespace cbm::algo::tof
           case 4:  // HD cosmic 2019, Buc2018, v18o
             iRpcMap = 1 - iRpcMap;
             break;
-          case 5:  // HD cosmic 2020, Buc2018, v20a
+          case 5:  // Buc2025, mCBM
+            iRpcMap  = 1 - iRpcMap;
+            iSideMap = 1 - iSideMap;
+            break;
+          case 55:  // HD cosmic 2020, Buc2018, v20a
             iStrMap = 31 - iStr;
             break;
           case 6:  //BUC special
diff --git a/algo/detectors/tof/ReadoutConfig.h b/algo/detectors/tof/ReadoutConfig.h
index 07c91d7292..6b9ac632fa 100644
--- a/algo/detectors/tof/ReadoutConfig.h
+++ b/algo/detectors/tof/ReadoutConfig.h
@@ -69,7 +69,8 @@ namespace cbm::algo::tof
     i32 NCrobsPerComponent() const { return nCrobPerComponent; }
 
     bool CheckBmonComp(uint32_t uCompId) const { return ((uCompId & 0xFFF0) == 0xABF0); }
-    bool CheckInnerComp(uint32_t uCompId) const { return ((uCompId & 0xFFF0) == 0xBBC0); }
+    //bool CheckInnerComp(uint32_t uCompId) const { return ((uCompId & 0xFFF0) == 0xBBC0); }
+    bool CheckInnerComp(uint32_t uCompId) const { return ((uCompId & 0xFF00) == 0xBB00); }
   };
 
 
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index 8f042b149d..79784707ea 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -26,6 +26,7 @@
 #include "much/Unpack.h"
 #include "qa/QaManager.h"
 #include "qa/hitfind/BmonHitfindQa.h"
+#include "qa/hitfind/TofHitfindQa.h"
 #include "rich/Unpack.h"
 #include "sts/ChannelMaskSet.h"
 #include "sts/HitfinderChain.h"
@@ -221,6 +222,12 @@ void Reco::Init(const Options& opts)
 
     auto hitfindSetup = yaml::ReadFromFile<tof::HitfindSetup>(opts.ParamsDir() / parFiles.tof.hitfinder);
     fTofHitFinder     = std::make_unique<tof::Hitfind>(hitfindSetup);
+
+    if (fQaManager != nullptr && Opts().Has(QaStep::RecoTof)) {
+      fTofHitFinderQa = std::make_unique<tof::HitfindQa>(fQaManager, "TofHitfind");
+      fTofHitFinderQa->InitParameters(hitfindSetup);
+      fTofHitFinderQa->Init();
+    }
   }
 
   if (Opts().Has(fles::Subsystem::TRD) && Opts().Has(Step::LocalReco)) {
@@ -371,6 +378,10 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
         L_(error) << "TOF Digis with unknown RPCs: " << nUnknownRPC;
       }
       auto [hits, hitmonitor, digiindices] = (*fTofHitFinder)(caldigis);
+      if (fTofHitFinderQa != nullptr) {
+        fTofHitFinderQa->RegisterHits(&hits);
+        fTofHitFinderQa->Exec();
+      }
       recoData.tofHits                     = std::move(hits);
       QueueTofCalibMetrics(calmonitor);
       QueueTofRecoMetrics(hitmonitor);
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index 35cb5c3462..e5a8412151 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -60,6 +60,7 @@ namespace cbm::algo
     class Calibrate;
     struct CalibrateMonitorData;
     class Hitfind;
+    class HitfindQa;
     struct HitfindMonitorData;
   }
 
@@ -175,6 +176,7 @@ namespace cbm::algo
     std::unique_ptr<tof::Unpack> fTofUnpack;
     std::unique_ptr<tof::Calibrate> fTofCalibrator;
     std::unique_ptr<tof::Hitfind> fTofHitFinder;
+    std::unique_ptr<tof::HitfindQa> fTofHitFinderQa;
 
     // TRD
     std::unique_ptr<trd::Unpack> fTrdUnpack;
diff --git a/algo/qa/Histogram.h b/algo/qa/Histogram.h
index 1b70f3b058..44040934a4 100644
--- a/algo/qa/Histogram.h
+++ b/algo/qa/Histogram.h
@@ -55,7 +55,8 @@ namespace cbm::algo::qa
   enum class EHistFlag : uint8_t
   {
     StoreVsTsId    = 0b00000001,  ///< Store the histogram vs timeslice index
-    OmitIntegrated = 0b00000010   ///< Omits storing integrated histogram
+    OmitIntegrated = 0b00000010,  ///< Omits storing integrated histogram
+    SetMinimum     = 0b00000100   ///< Sets minimum to the histogram
   };
 
   /// \class  HistogramMetadata
diff --git a/algo/qa/hitfind/TofHitfindQa.cxx b/algo/qa/hitfind/TofHitfindQa.cxx
new file mode 100644
index 0000000000..c037dc6764
--- /dev/null
+++ b/algo/qa/hitfind/TofHitfindQa.cxx
@@ -0,0 +1,110 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   TofHitfindQa.cxx
+/// \brief  A TOF hitfinder QA (implementation)
+/// \since  04.03.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+#include "qa/hitfind/TofHitfindQa.h"
+
+#include "CbmTofAddress.h"
+#include "qa/Histogram.h"
+#include "tof/Hit.h"
+
+#include <fmt/format.h>
+
+using cbm::algo::tof::HitfindQa;
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+void HitfindQa::Init()
+try {
+  using fmt::format;
+  using qa::CanvasConfig;
+  using qa::PadConfig;
+  if (!IsActive()) {
+    return;
+  }
+
+  size_t nRpcs = fParameters.rpcs.size();
+  if (nRpcs < 1) {
+    throw std::runtime_error("parameters were not initialized. Please, provide the configuration using the function "
+                             "HitfindQa::InitParameters(hitSetup)");
+  }
+
+  // Histogram initialization
+  fvphRpcHitOccupX.resize(nRpcs, nullptr);
+  fvphRpcHitOccupY.resize(nRpcs, nullptr);
+  fvphRpcHitOccupCh.resize(nRpcs, nullptr);
+
+  auto cOccupX  = CanvasConfig(format("{}/tof_rpc_occup_x", GetTaskName()), "RPC hit occupancy vs. X", 1, 1);
+  auto cOccupY  = CanvasConfig(format("{}/tof_rpc_occup_y", GetTaskName()), "RPC hit occupancy vs. Y", 1, 1);
+  auto cOccupCh = CanvasConfig(format("{}/tof_rpc_occup_ch", GetTaskName()), "RPC hit occupancy vs. channel", 1, 1);
+  for (size_t iRpc = 0; iRpc < nRpcs; ++iRpc) {
+    const auto& rpcPar = fParameters.rpcs[iRpc];
+    int nCh            = rpcPar.chAddresses.size();
+    auto sDN           = format("{:#010x}", rpcPar.address);  // diamond suffix
+    auto sDT           = CbmTofAddress::ToString(rpcPar.address);
+
+    // Histograms initialisation
+    fvphRpcHitOccupX[iRpc]  = MakeObj<qa::H1D>(format("tof_hit_occup_x_{}", sDN), format("RPC {};x [cm];counts", sDT),
+                                              kHitOccupB, kHitOccupL, kHitOccupU);
+    fvphRpcHitOccupY[iRpc]  = MakeObj<qa::H1D>(format("tof_hit_occup_y_{}", sDN), format("RPC {};y [cm];counts", sDT),
+                                              kHitOccupB, kHitOccupL, kHitOccupU);
+    fvphRpcHitOccupCh[iRpc] = MakeObj<qa::H1D>(format("tof_hit_occup_chan_{}", sDN),
+                                               format("RPC {};channel;counts", sDT), nCh, -0.5, nCh - 0.5);
+
+    {
+      auto pad = PadConfig(fvphRpcHitOccupX[iRpc], "hist");
+      pad.SetLog(false, true, false);
+      cOccupX.AddPadConfig(pad);
+    }
+    {
+      auto pad = PadConfig(fvphRpcHitOccupY[iRpc], "hist");
+      pad.SetLog(false, true, false);
+      cOccupY.AddPadConfig(pad);
+    }
+    {
+      auto pad = PadConfig(fvphRpcHitOccupCh[iRpc], "hist");
+      pad.SetLog(false, true, false);
+      cOccupCh.AddPadConfig(pad);
+    }
+  }
+
+  AddCanvasConfig(cOccupX);
+  AddCanvasConfig(cOccupY);
+  AddCanvasConfig(cOccupCh);
+}
+catch (const std::exception& err) {
+  L_(fatal) << "tof::HitfindQa: initialization failed. Reason: " << err.what();
+  throw std::runtime_error("tof::HitfindQa initialization failure");
+}
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+void HitfindQa::Exec()
+{
+  if (!IsActive()) {
+    return;
+  }
+
+  // Fill hit distributions
+  const auto& hits = fpHits->Data();
+  for (size_t iH = 0; iH < hits.size(); ++iH) {
+    const auto& hit     = hits[iH];
+    int32_t hitAddress  = hit.address;
+    int32_t iCh         = CbmTofAddress::GetChannelId(hitAddress);
+    uint32_t rpcAddress = CbmTofAddress::GetModFullId(hitAddress);
+    auto itAddress      = fParameters.lookupMap.find(rpcAddress);
+    if (itAddress == fParameters.lookupMap.end()) {
+      L_(error) << "tof::HitfindQa: unknown RPC address " << CbmTofAddress::ToString(rpcAddress);
+      continue;
+    }
+    uint32_t iRpc = itAddress->second;
+    fvphRpcHitOccupX[iRpc]->Fill(hit.X());
+    fvphRpcHitOccupY[iRpc]->Fill(hit.Y());
+    fvphRpcHitOccupCh[iRpc]->Fill(iCh);
+  }
+}
diff --git a/algo/qa/hitfind/TofHitfindQa.h b/algo/qa/hitfind/TofHitfindQa.h
new file mode 100644
index 0000000000..3c630b0b2a
--- /dev/null
+++ b/algo/qa/hitfind/TofHitfindQa.h
@@ -0,0 +1,91 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   TofHitfindQa.h
+/// \brief  A TOF hitfinder QA
+/// \since  04.03.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+
+#pragma once
+
+#include "PODVector.h"
+#include "PartitionedVector.h"
+#include "qa/QaTaskHeader.h"
+#include "qa/hitfind/TofHitfindQaParameters.h"
+
+namespace cbm::algo
+{
+  namespace qa
+  {
+    class H1D;
+    class H2D;
+  }  // namespace qa
+
+  namespace tof
+  {
+    class Hit;
+  }
+}  // namespace cbm::algo
+
+namespace cbm::algo::tof
+{
+  /// \class HitfindQa
+  /// \brief A QA module for the BMON hit-finder
+  class HitfindQa : public qa::TaskHeader {
+   public:
+    /// \brief Constructor
+    /// \param pManager  Pointer to the QA manager
+    /// \param name      Name of the QA (directory)
+    HitfindQa(const std::unique_ptr<qa::Manager>& pManager, std::string_view name) : qa::TaskHeader(pManager, name) {}
+
+    /// \brief Constructor from the configuration object
+    HitfindQa() = default;
+
+    /// \brief Copy constructor
+    HitfindQa(const HitfindQa&) = delete;
+
+    /// \brief Move constructor
+    HitfindQa(HitfindQa&&) = delete;
+
+    /// \brief Destructor
+    ~HitfindQa() = default;
+
+    /// \brief Copy assignment operator
+    HitfindQa& operator=(const HitfindQa&) = delete;
+
+    /// \brief Move assignment operator
+    HitfindQa& operator=(HitfindQa&&) = delete;
+
+    /// \brief Executes the task, fills the histograms
+    void Exec();
+
+    /// \brief Initialized the task
+    void Init();
+
+    /// \brief Initialisation of the parameters
+    void InitParameters(const HitfindSetup& hitSetup) { fParameters = std::move(HitfindQaParameters(hitSetup)); }
+
+    /// \brief Registers a sample of hits
+    /// \param pHits  A pointer to a vector of hits
+    void RegisterHits(const PartitionedVector<tof::Hit>* pHits) { fpHits = pHits; }
+
+   private:
+    //* Constants
+    static constexpr int kHitOccupB{200};       ///< Hit occupancy: n bins
+    static constexpr double kHitOccupL{-100.};  ///< Hit occupancy: lower bound [cm]
+    static constexpr double kHitOccupU{+100.};  ///< Hit occupancy: upper bound [cm]
+
+    //* Parameters
+    HitfindQaParameters fParameters;  ///< Parameters of the hit finder QA
+
+    //* Data samples
+    const PartitionedVector<tof::Hit>* fpHits{nullptr};  ///< Pointer to TOF hit sample
+
+    //* Histograms
+    std::vector<qa::H1D*> fvphRpcHitOccupX;   ///< Hit occupancy in RPC vs. x
+    std::vector<qa::H1D*> fvphRpcHitOccupY;   ///< Hit occupancy in RPC vs. y
+    std::vector<qa::H1D*> fvphRpcHitOccupCh;  ///< Hit occupancy in RPC vs. channel
+  };
+}  // namespace cbm::algo::tof
diff --git a/algo/qa/hitfind/TofHitfindQaParameters.cxx b/algo/qa/hitfind/TofHitfindQaParameters.cxx
new file mode 100644
index 0000000000..95251731a1
--- /dev/null
+++ b/algo/qa/hitfind/TofHitfindQaParameters.cxx
@@ -0,0 +1,40 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   BmonHitfindQaParameters.cxx
+/// \brief  A BMON hitfinder QA parameter configuration (implementation)
+/// \since  10.02.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+#include "qa/hitfind/TofHitfindQaParameters.h"
+
+#include "AlgoFairloggerCompat.h"
+#include "CbmTofAddress.h"
+
+using cbm::algo::tof::HitfindQaParameters;
+using cbm::algo::tof::HitfindSetup;
+
+// ---------------------------------------------------------------------------------------------------------------------
+//
+HitfindQaParameters::HitfindQaParameters(const HitfindSetup& hitSetup)
+{
+  rpcs.clear();
+  lookupMap.clear();
+  uint32_t iUniqueRpcId = 0;
+  for (const auto& smType : hitSetup.rpcs) {
+    for (const auto& rpc : smType) {
+      uint32_t address   = static_cast<uint32_t>(CbmTofAddress::GetModFullId(rpc.chanPar[0].address));
+      lookupMap[address] = iUniqueRpcId;
+      auto& rpcPar       = rpcs.emplace_back();
+      rpcPar.address     = address;
+      rpcPar.chAddresses.resize(rpc.chanPar.size());
+      L_(info) << "RPC: " << CbmTofAddress::ToString(address);
+      for (int iCh = 0; iCh < rpcPar.chAddresses.size(); ++iCh) {
+        rpcPar.chAddresses[iCh] = rpc.chanPar[iCh].address;
+        L_(info) << "----> ch: " << CbmTofAddress::ToString(rpcPar.chAddresses[iCh]);
+      }
+      iUniqueRpcId++;
+    }
+  }
+}
diff --git a/algo/qa/hitfind/TofHitfindQaParameters.h b/algo/qa/hitfind/TofHitfindQaParameters.h
new file mode 100644
index 0000000000..f64fe1e9f3
--- /dev/null
+++ b/algo/qa/hitfind/TofHitfindQaParameters.h
@@ -0,0 +1,39 @@
+/* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   TofHitfindQaParameters.h
+/// \brief  A TOF hitfinder QA parameter configuration
+/// \since  03.03.2025
+/// \author Sergei Zharko <s.zharko@gsi.de>
+
+#pragma once
+
+#include "tof/HitfindSetup.h"
+
+#include <unordered_map>
+#include <vector>
+
+namespace cbm::algo::tof
+{
+  /// \struct HitfindQaParameters
+  /// \brief  A structure to handle TOF QA parameters
+  struct HitfindQaParameters {
+
+    /// \struct Rpc
+    struct Rpc {
+      std::vector<uint32_t> chAddresses;  ///< Address of channel vs channel ID
+      uint32_t address;                   ///< Address of RPC
+    };
+
+    std::unordered_map<uint32_t, uint32_t> lookupMap;  ///< A lookup map for RPC addresses
+    std::vector<Rpc> rpcs;                             ///< A map for different RPC properties
+
+    /// \brief Default constructor
+    HitfindQaParameters() = default;
+
+    /// \brief Constructor
+    /// \param hitSetup  Hitfinder parameters
+    HitfindQaParameters(const HitfindSetup& hitSetup);
+  };
+}  // namespace cbm::algo::tof
diff --git a/core/detectors/tof/CbmMcbm2018TofPar.cxx b/core/detectors/tof/CbmMcbm2018TofPar.cxx
index d2441aecf6..ad8f36aff7 100644
--- a/core/detectors/tof/CbmMcbm2018TofPar.cxx
+++ b/core/detectors/tof/CbmMcbm2018TofPar.cxx
@@ -268,13 +268,15 @@ void CbmMcbm2018TofPar::BuildChannelsUidMap()
     uint32_t uGdpb = uCh0 / (fiNrOfFeesPerGdpb * fiNrOfGet4PerFee * fiNrOfChannelsPerGet4);
     LOG(info) << "Map at ch " << uCh << ", Gdpb " << uGdpb << ", Id " << std::hex << fiGdpbIdArray[uGdpb] << std::dec;
     switch (fiRpcType[uGbtx]) {
+      case 3:  // intended fall-through
       case 2:  // intended fall-through
+      case 1:  // intended fall-through
       case 0: {
         // CBM modules
         BuildChannelsUidMapCbm(uCh, uGbtx);
         break;
       }
-      case 1: {
+      case 11: {
         // STAR eTOF  modules
         BuildChannelsUidMapStar(uCh, uGbtx);
         break;
@@ -418,7 +420,7 @@ void CbmMcbm2018TofPar::BuildChannelsUidMapStar(UInt_t& uCh, UInt_t uGbtx)
 // -------------------------------------------------------------------------
 void CbmMcbm2018TofPar::BuildChannelsUidMapBmon(UInt_t& uCh, UInt_t uGbtx)
 {
-  LOG(info) << " Map diamond  at GBTX  -  uCh = " << uCh;
+  LOG(info) << " Map diamond  at GBTX " << uGbtx << " -  uCh = " << uCh;
   for (UInt_t uFee = 0; uFee < kuNbFeePerGbtx; ++uFee) {
     for (UInt_t uFeeCh = 0; uFeeCh < kuNbChannelsPerFee; ++uFeeCh) {
       /// Mapping for the 2019 beamtime
@@ -432,6 +434,7 @@ void CbmMcbm2018TofPar::BuildChannelsUidMapBmon(UInt_t& uCh, UInt_t uGbtx)
             /// => 1 Bmon channel per GET4
             /// => 1-2 eLinks per GET4 => GET4 ID = GET4 * 2 (+ 1)
             UInt_t uChannelBmon = uFeeCh / 8 + 4 * fiRpcSide[uGbtx];
+            fiRpcType[uGbtx]    = 5;  //for compatibility with TOF convention
             fviRpcChUId[uCh] = CbmTofAddress::GetUniqueAddress(fiModuleId[uGbtx], 0, uChannelBmon, 0, fiRpcType[uGbtx]);
             LOG(info) << Form("Bmon channel: %u from GBTx %2u Fee %2u "
                               "Channel %2u, indx %d address %08x",
@@ -506,7 +509,8 @@ void CbmMcbm2018TofPar::BuildChannelsUidMapCera(UInt_t& uCh, UInt_t /*uGbtx*/)
     fviRpcChUId[uCh] = CbmTofAddress::GetUniqueAddress(iModuleId, 7 - iRpc, 0, 0, iModuleType);
     uCh++;
   }
-  uCh += (24 + 2 * 32);
+  uCh += (24 + 4 * 32);  //for 2024 FSD
+  //uCh += (24 + 2 * 32);
   LOG(info) << " Map end ceramics  box  at GBTX  -  uCh = " << uCh;
 }
 // -------------------------------------------------------------------------
@@ -684,10 +688,52 @@ void CbmMcbm2018TofPar::BuildChannelsUidMapStar2A(UInt_t& uCh, UInt_t uGbtx)
         }
       }
     }
+    else if (fiRpcSide[uGbtx] == 5) {
+      int iSideMap        = -1;
+      int iStrMap         = -1;
+      int iRpcMap         = -1;
+      const int ConOff[8] = {0, 2, 4, 6, 7, 1, 3, 5};  //Get4 after Gbtx
+      for (Int_t iFeet = 0; iFeet < 5; iFeet++) {
+        for (Int_t iStr = 0; iStr < 32; iStr++) {
+          switch (iFeet) {
+            case 0: iSideMap = -1; break;
+            case 1:
+              iRpcMap  = 0;
+              iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+              iStrMap  = 31 - iStrMap;
+              iSideMap = 1;
+              break;
+            case 2:
+              iRpcMap  = 0;
+              iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+              iStrMap  = 31 - iStrMap;
+              iSideMap = 0;
+              break;
+            case 3:
+              iRpcMap  = 1;
+              iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+              iStrMap  = 31 - iStrMap;
+              iSideMap = 0;
+              break;
+            case 4:
+              iRpcMap  = 1;
+              iStrMap  = 3 - iStr % 4 + 4 * ConOff[iStr / 4];
+              iStrMap  = 31 - iStrMap;
+              iSideMap = 1;
+              break;
+          }
+          if (iSideMap > -1)
+            fviRpcChUId[uCh] =
+              CbmTofAddress::GetUniqueAddress(fiModuleId[uGbtx], iRpcMap, iStrMap, iSideMap, fiRpcType[uGbtx]);
+          else
+            fviRpcChUId[uCh] = 0;
+          uCh++;
+        }
+      }
+    }
   }
 }
 
-// -------------------------------------------------------------------------
 void CbmMcbm2018TofPar::BuildChannelsUidMapBuc(UInt_t& uCh, UInt_t uGbtx)
 {
   LOG(info) << " Map Buc box " << fiModuleId[uGbtx] << " at GBTX " << uGbtx << " -  uCh = " << uCh;
@@ -745,7 +791,12 @@ void CbmMcbm2018TofPar::BuildChannelsUidMapBuc(UInt_t& uCh, UInt_t uGbtx)
         case 4:  // HD cosmic 2019, Buc2018, v18o
           iRpcMap = 1 - iRpcMap;
           break;
-        case 5:  // HD cosmic 2020, Buc2018, v20a
+        case 5:  // Buc2025, mCBM
+          iRpcMap = 1 - iRpcMap;
+          //iStrMap  = 31 - iStr;
+          iSideMap = 1 - iSideMap;
+          break;
+        case 55:  // HD cosmic 2020, Buc2018, v20a
           iStrMap = 31 - iStr;
           break;
         case 6:  //BUC special
diff --git a/core/detectors/tof/CbmMcbm2018TofPar.h b/core/detectors/tof/CbmMcbm2018TofPar.h
index 6ede9c726a..fa38cb39ec 100644
--- a/core/detectors/tof/CbmMcbm2018TofPar.h
+++ b/core/detectors/tof/CbmMcbm2018TofPar.h
@@ -85,7 +85,8 @@ class CbmMcbm2018TofPar : public FairParGenericSet {
   inline Double_t GetTsDeadtimePeriod() { return fdTsDeadtimePeriod; }
 
   inline bool CheckBmonComp(uint32_t uCompId) { return ((uCompId & 0xFFF0) == 0xABF0); }
-  inline bool CheckInnerComp(uint32_t uCompId) { return ((uCompId & 0xFFF0) == 0xBBC0); }
+  //inline bool CheckInnerComp(uint32_t uCompId) { return ((uCompId & 0xFFF0) == 0xBBC0); }
+  inline bool CheckInnerComp(uint32_t uCompId) { return ((uCompId & 0xFF00) == 0xBB00); }
 
  private:
   void BuildChannelsUidMap();
@@ -121,6 +122,7 @@ class CbmMcbm2018TofPar : public FairParGenericSet {
   const UInt_t kuPaditoget4[kuNbChannelsPerFee] = {
     3,  2,  1,  0,  7,  6,  5,  4,  11, 10, 9,  8,  15, 14, 13, 12,
     19, 18, 17, 16, 23, 22, 21, 20, 27, 26, 25, 24, 31, 30, 29, 28};  //! Map from PADI channel to GET4 channel
+
   const UInt_t kuElinkToGet4[kuNbGet4PerGbtx] = {27, 2,  7,  3,  31, 26, 30, 1,  33, 37, 32, 13, 9,  14,
                                                  10, 15, 17, 21, 16, 35, 34, 38, 25, 24, 0,  6,  20, 23,
                                                  18, 22, 28, 4,  29, 5,  19, 36, 39, 8,  12, 11};
diff --git a/external/InstallParameter.cmake b/external/InstallParameter.cmake
index e2c98a2f89..342e335412 100644
--- a/external/InstallParameter.cmake
+++ b/external/InstallParameter.cmake
@@ -1,4 +1,4 @@
-set(PARAMETER_VERSION 99acefb7a5d6667893b319a44a20b265cfb6fbac) # 2025/02/15
+set(PARAMETER_VERSION 125dc2b53e6123739a19deabd9465e4fe568a5dc) # 2025/02/24
 set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/CbmSoft/cbmroot_parameter.git")
 
 download_project_if_needed(PROJECT         Parameter_source
-- 
GitLab


From e1708975cc8f53285444a6c57858baa8f7b58720 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Fri, 7 Mar 2025 03:13:32 +0100
Subject: [PATCH 3/5] small fixes in different QAs

---
 algo/ca/qa/CaQa.cxx                        | 13 ++++++++++++-
 algo/ca/qa/CaQa.h                          |  4 ++++
 algo/kfp/KfpV0Finder.cxx                   |  2 +-
 algo/kfp/KfpV0FinderMonitor.h              |  2 ++
 algo/kfp/KfpV0FinderQa.cxx                 | 13 +++++++------
 algo/qa/hitfind/TofHitfindQaParameters.cxx |  4 ++--
 algo/qa/trigger/V0TriggerQa.h              |  6 +++---
 algo/trigger/V0Trigger.cxx                 |  2 +-
 external/InstallParameter.cmake            |  4 ++--
 9 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/algo/ca/qa/CaQa.cxx b/algo/ca/qa/CaQa.cxx
index 8d081862c7..b921d16813 100644
--- a/algo/ca/qa/CaQa.cxx
+++ b/algo/ca/qa/CaQa.cxx
@@ -216,6 +216,11 @@ void Qa::Init()
       auto sTitl      = "First vs. last station index;ID^{last}_{station};ID^{first}_{station}";
       fphTrkFstLstSta = MakeObj<H2D>(sName, sTitl, nBins, xMin, xMax, nBins, xMin, xMax);
     }
+    {
+      auto sName     = format("{}_track_origin", GetTaskName());
+      auto sTitl     = "Track origin;x [cm];y [cm]";
+      fphTrkOriginXY = MakeObj<H2D>(sName, sTitl, kOriginB, kOriginL, kOriginU, kOriginB, kOriginL, kOriginU);
+    }
     fphTrkNofHits = MakeObj<H1D>("n_hits", "Number of hits;N_{hit}", nBins, xMin, xMax);
   }
 
@@ -231,7 +236,7 @@ void Qa::Init()
           auto titl = format("{} hit occupancy in different stations in XY plane", setNm);
           auto canv = CanvasConfig(name, titl);
           for (int iSt = 0; iSt < nSt; ++iSt) {
-            auto pad = PadConfig();
+            auto pad = PadConfig(false, false, false, false, true);
             pad.RegisterHistogram(fvphHitOccupXY[iSt][hitSet], "colz");
             canv.AddPadConfig(pad);
           }
@@ -294,6 +299,11 @@ void Qa::Init()
         pad.RegisterHistogram(fphTrkFstLstSta, "colz");
         canv.AddPadConfig(pad);
       }
+      {
+        auto pad = PadConfig(true, true, false, false, false);
+        pad.RegisterHistogram(fphTrkOriginXY, "colz");
+        canv.AddPadConfig(pad);
+      }
       AddCanvasConfig(canv);
     }
   }
@@ -371,6 +381,7 @@ void Qa::Exec()
       // Other distributions
       fphTrkFstLstSta->Fill(fpInputData->GetHit(iLstHit).Station(), fpInputData->GetHit(iFstHit).Station());
       fphTrkNofHits->Fill(nHits);
+      fphTrkOriginXY->Fill(track.fParPV.X(), track.fParPV.Y());
       trkFirstHit += nHits;
     }
   }
diff --git a/algo/ca/qa/CaQa.h b/algo/ca/qa/CaQa.h
index 1c42b60562..ae3658a649 100644
--- a/algo/ca/qa/CaQa.h
+++ b/algo/ca/qa/CaQa.h
@@ -117,6 +117,9 @@ namespace cbm::algo::ca
     static constexpr int knTrkParPoints = 2;      ///< Number of track points to build par distributions
     static constexpr int knStaMax       = 16;     ///< Max number of stations (histogram binning)
     static constexpr bool kDebug        = false;  ///< Additional histograms
+    static constexpr int kOriginB       = 100;    ///< Track X(Y) at origin: n bins
+    static constexpr double kOriginL    = -10.;   ///< Track X(Y) at origin: lower bound [cm]
+    static constexpr double kOriginU    = +10.;   ///< Track X(Y) at origin: upper bound [cm]
 
     double fMinHitTime = std::numeric_limits<double>::max();
     double fMaxHitTime = std::numeric_limits<double>::lowest();
@@ -145,6 +148,7 @@ namespace cbm::algo::ca
     std::array<qa::H1D*, knTrkParPoints> fvphTrkChi2Ndf  = {{0}};  ///< hist: chi2/NDF at first/last hit
     std::array<qa::H2D*, knTrkParPoints> fvphTrkPhiTheta = {{0}};  ///< hist: theta vs. phi at first/last hit
 
+    qa::H2D* fphTrkOriginXY  = nullptr;  ///< hist: origin of tracks in x-y plane [cm]
     qa::H2D* fphTrkFstLstSta = nullptr;  ///< hist: fst vs lst station index
     qa::H1D* fphTrkNofHits   = nullptr;  ///< hist: number of hits in track
   };
diff --git a/algo/kfp/KfpV0Finder.cxx b/algo/kfp/KfpV0Finder.cxx
index c95965bc84..820078945d 100644
--- a/algo/kfp/KfpV0Finder.cxx
+++ b/algo/kfp/KfpV0Finder.cxx
@@ -80,7 +80,7 @@ void V0Finder::AssignPid(ParticleInfo& particleInfo)
     // primary
     //particleInfo.fPdg = fPrimaryAssignedPdg;
     particleInfo.fPdg = kUndefPdg;
-    fEventMonitor.IncrementCounter(ECounter::TracksWoPid);
+    fEventMonitor.IncrementCounter(ECounter::PrimaryDca);
   }
 }
 
diff --git a/algo/kfp/KfpV0FinderMonitor.h b/algo/kfp/KfpV0FinderMonitor.h
index d60d5b1354..3f3b68ef6a 100644
--- a/algo/kfp/KfpV0FinderMonitor.h
+++ b/algo/kfp/KfpV0FinderMonitor.h
@@ -28,6 +28,7 @@ namespace cbm::algo::kfp
     TracksWUnphysicalBeta,      ///< Tracks with beta > 1
     PionsDca,                   ///< Number of raw pion-candidates
     ProtonsDca,                 ///< Number of raw proton-candidates
+    PrimaryDca,                 ///< Number of raw proton-candidates
     Pions,                      ///< Number of pion-candidates
     Protons,                    ///< Number of proton-candidates
     EventsTotal,                ///< Total number of events
@@ -76,6 +77,7 @@ namespace cbm::algo::kfp
       SetCounterName(ECounter::TracksWUnphysicalBeta, "tracks w/ beta > 1");
       SetCounterName(ECounter::PionsDca, "raw pion candidates");
       SetCounterName(ECounter::ProtonsDca, "raw proton candidates");
+      SetCounterName(ECounter::PrimaryDca, "number of primary particles");
       SetCounterName(ECounter::Pions, "pion candidates");
       SetCounterName(ECounter::Protons, "proton candidates");
       SetCounterName(ECounter::EventsTotal, "all events");
diff --git a/algo/kfp/KfpV0FinderQa.cxx b/algo/kfp/KfpV0FinderQa.cxx
index ffc903e2a2..703f067f93 100644
--- a/algo/kfp/KfpV0FinderQa.cxx
+++ b/algo/kfp/KfpV0FinderQa.cxx
@@ -57,7 +57,8 @@ void V0FinderQa::Exec(const RecoResults& recoEvent, const V0Finder& v0Finder)
       const auto& particleInfo{v0Finder.GetParticleInfo()[iTrk]};
       const auto& trkParFst{(v0Finder.GetTrackAssignedParams()[iTrk]).first};
       bool bPdgDefined = (particleInfo.fPdg != V0Finder::kUndefPdg);
-      fvphDcaAll->Fill(bPdgDefined ? particleInfo.fDca : -999);
+      // All particles with defined DCA (primaries + secondary pions and protons)
+      fvphDcaAll->Fill(std::isnan(particleInfo.fDca) ? -999 : particleInfo.fDca);
       fvphBetaAll->Fill(particleInfo.fBeta);
       if (bPdgDefined) {
         if (particleInfo.fPdg == -211) {
@@ -75,15 +76,15 @@ void V0FinderQa::Exec(const RecoResults& recoEvent, const V0Finder& v0Finder)
     for (uint32_t iTrk = 0; iTrk < tracks.size(); ++iTrk) {
       const auto& particleInfo{v0Finder.GetParticleInfo()[iTrk]};
       bool bPdgDefined = (particleInfo.fPdg != V0Finder::kUndefPdg);
-      fvphDcaAll->Fill(bPdgDefined ? particleInfo.fDca : -999);
-      fvphBetaAll->Fill(-999);
+      fvphDcaAll->Fill(std::isnan(particleInfo.fDca) ? -999 : particleInfo.fDca);
+      fvphBetaAll->Fill(-9999);
       if (bPdgDefined) {
         if (particleInfo.fPdg == -211) {
-          fvphBetaPion->Fill(-999);
-          fvphMomPion->Fill(-999);
+          fvphBetaPion->Fill(-9999);
+          fvphMomPion->Fill(-9999);
         }
         else if (particleInfo.fPdg == 2212) {
-          fvphBetaProton->Fill(-999);
+          fvphBetaProton->Fill(-9999);
         }
       }
     }
diff --git a/algo/qa/hitfind/TofHitfindQaParameters.cxx b/algo/qa/hitfind/TofHitfindQaParameters.cxx
index 95251731a1..3cb2f35b8c 100644
--- a/algo/qa/hitfind/TofHitfindQaParameters.cxx
+++ b/algo/qa/hitfind/TofHitfindQaParameters.cxx
@@ -29,10 +29,10 @@ HitfindQaParameters::HitfindQaParameters(const HitfindSetup& hitSetup)
       auto& rpcPar       = rpcs.emplace_back();
       rpcPar.address     = address;
       rpcPar.chAddresses.resize(rpc.chanPar.size());
-      L_(info) << "RPC: " << CbmTofAddress::ToString(address);
+      L_(debug) << "RPC: " << CbmTofAddress::ToString(address);
       for (int iCh = 0; iCh < rpcPar.chAddresses.size(); ++iCh) {
         rpcPar.chAddresses[iCh] = rpc.chanPar[iCh].address;
-        L_(info) << "----> ch: " << CbmTofAddress::ToString(rpcPar.chAddresses[iCh]);
+        L_(debug) << "----> ch: " << CbmTofAddress::ToString(rpcPar.chAddresses[iCh]);
       }
       iUniqueRpcId++;
     }
diff --git a/algo/qa/trigger/V0TriggerQa.h b/algo/qa/trigger/V0TriggerQa.h
index 6f1aa13dc6..fff885f86f 100644
--- a/algo/qa/trigger/V0TriggerQa.h
+++ b/algo/qa/trigger/V0TriggerQa.h
@@ -56,9 +56,9 @@ namespace cbm::algo::evbuild
     static constexpr int kPairZVertexB{120};      ///< Track pair z vertex: n bins
     static constexpr double kPairZVertexL{-60.};  ///< Track pair z vertex: lower bound [cm]
     static constexpr double kPairZVertexU{+60.};  ///< Track pair z vertex: upper bound [cm]
-    static constexpr int kPairDcaB{100};          ///< Track pair DCA: n bins
-    static constexpr double kPairDcaL{-2.};       ///< Track pair DCA: lower bound [cm]
-    static constexpr double kPairDcaU{+2.};       ///< Track pair DCA: upper bound [cm]
+    static constexpr int kPairDcaB{300};          ///< Track pair DCA: n bins
+    static constexpr double kPairDcaL{-0.5};      ///< Track pair DCA: lower bound [cm]
+    static constexpr double kPairDcaU{+5.5};      ///< Track pair DCA: upper bound [cm]
 
     //* Histograms
     qa::H1D* fphPairDeltaT{nullptr};   ///< Track pair delta T
diff --git a/algo/trigger/V0Trigger.cxx b/algo/trigger/V0Trigger.cxx
index 49cd418258..e3ff8ef9f5 100644
--- a/algo/trigger/V0Trigger.cxx
+++ b/algo/trigger/V0Trigger.cxx
@@ -34,7 +34,7 @@ namespace cbm::algo::evbuild
         float time2 = trackIter2->fParPV.GetTime();
 
         if (fpQa->IsActive()) {
-          fpQa->fphPairDeltaT->Fill(time1 - time2);
+          fpQa->fphPairDeltaT->Fill(time2 - time1);
         }
 
         if (time2 < time1) {
diff --git a/external/InstallParameter.cmake b/external/InstallParameter.cmake
index 342e335412..67356a801e 100644
--- a/external/InstallParameter.cmake
+++ b/external/InstallParameter.cmake
@@ -1,5 +1,5 @@
-set(PARAMETER_VERSION 125dc2b53e6123739a19deabd9465e4fe568a5dc) # 2025/02/24
-set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/CbmSoft/cbmroot_parameter.git")
+set(PARAMETER_VERSION 4d23b9bfddd5e61fd347ba2090fc215ea72b5f32) # 2025/02/24
+set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/s.zharko/cbmroot_parameter.git")
 
 download_project_if_needed(PROJECT         Parameter_source
                            GIT_REPOSITORY  ${PARAMETER_SRC_URL}
-- 
GitLab


From 63418637da885387f8941c9adf518f60718c7dca Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Fri, 7 Mar 2025 06:22:31 +0100
Subject: [PATCH 4/5] Fixes to digis masking in event selector

---
 algo/evselector/DigiEventSelector.cxx       | 47 ++++++++++-----------
 algo/evselector/DigiEventSelector.h         |  9 ----
 algo/evselector/DigiEventSelectorConfig.cxx |  5 +++
 external/InstallParameter.cmake             |  2 +-
 4 files changed, 29 insertions(+), 34 deletions(-)

diff --git a/algo/evselector/DigiEventSelector.cxx b/algo/evselector/DigiEventSelector.cxx
index 165bbca2bc..4411689bfb 100644
--- a/algo/evselector/DigiEventSelector.cxx
+++ b/algo/evselector/DigiEventSelector.cxx
@@ -38,15 +38,35 @@ namespace cbm::algo::evbuild
         case ECbmModuleId::kTof:
           if (!CheckTofLayers(event.fTof, entry.second)) return false;
           break;
-        case ECbmModuleId::kBmon:
-          if (!CheckBmonDiamonds(event.fBmon, entry.second)) return false;
-          break;
         default:
           throw std::runtime_error("Number of layers for " + ::ToString(entry.first) + " is not implemented");
           break;
       }
     }
 
+    // --- Test masked channels (if any)
+    for (auto& entry : fConfig.fMaskedChannels) {
+      size_t nDigisAccepted = 0;
+      auto det              = entry.first;
+      auto itMinNumDigis    = fConfig.fMinNumDigis.find(det);
+      if (itMinNumDigis != fConfig.fMinNumDigis.end() && itMinNumDigis->second > 0) {
+        switch (det) {
+          case ECbmModuleId::kBmon:
+            for (const auto& digi : event.fBmon) {
+              if (entry.second.find(digi.GetAddress()) == entry.second.end()) {
+                ++nDigisAccepted;
+              }
+            }
+            break;
+          default:
+            // This was met in the first block of the function
+            break;
+        }
+        if (nDigisAccepted < itMinNumDigis->second) {
+          return false;
+        }
+      }
+    }
 
     return true;
   }
@@ -131,27 +151,6 @@ namespace cbm::algo::evbuild
   // --------------------------------------------------------------------------
 
 
-  // -----   Check number of digis in selected BMON diamonds ------------------
-  bool DigiEventSelector::CheckBmonDiamonds(gsl::span<const CbmBmonDigi> digis, size_t minNum) const
-  {
-    auto itMaskedChan = fConfig.fMaskedChannels.find(ECbmModuleId::kBmon);
-    if (itMaskedChan == fConfig.fMaskedChannels.end() || itMaskedChan->second.size() == 0) {
-      return digis.size() >= minNum;
-    }
-
-    size_t nAcceptedDigis{0};
-    const auto& maskedChannels = itMaskedChan->second;
-    for (const auto& digi : digis) {
-      if (maskedChannels.find(digi.GetAddress()) == maskedChannels.end()) {
-        ++nAcceptedDigis;
-      }
-    }
-
-    return nAcceptedDigis >= minNum;
-  }
-  // --------------------------------------------------------------------------
-
-
   // -----   Info to string   -------------------------------------------------
   std::string DigiEventSelector::ToString() const
   {
diff --git a/algo/evselector/DigiEventSelector.h b/algo/evselector/DigiEventSelector.h
index b298875b06..a8ba4d7a95 100644
--- a/algo/evselector/DigiEventSelector.h
+++ b/algo/evselector/DigiEventSelector.h
@@ -74,15 +74,6 @@ namespace cbm::algo::evbuild
     bool CheckTofLayers(gsl::span<const CbmTofDigi> digis, size_t minNum) const;
 
 
-    // FIXME: apply for all detectors
-    /** @brief Test for digis in selected (=not masked) BMON diamonds
-     ** @param digis Vector of BMON digis
-     ** @param minNum Requested minimum of not masked BMON digis
-     ** @return True if the number of not masked BMON digis is above the threshold
-     **/
-    bool CheckBmonDiamonds(gsl::span<const CbmBmonDigi> digis, size_t minNum) const;
-
-
    private:                           // members
     DigiEventSelectorConfig fConfig;  ///< Configuration / parameters
     std::shared_ptr<TrackingSetup> fpTrackingSetup = nullptr;  ///< Tracking setup (access to stations info)
diff --git a/algo/evselector/DigiEventSelectorConfig.cxx b/algo/evselector/DigiEventSelectorConfig.cxx
index 7c536e3a89..43399c74f0 100644
--- a/algo/evselector/DigiEventSelectorConfig.cxx
+++ b/algo/evselector/DigiEventSelectorConfig.cxx
@@ -6,6 +6,7 @@
 
 #include "AlgoFairloggerCompat.h"
 
+#include <iomanip>
 
 namespace cbm::algo::evbuild
 {
@@ -40,6 +41,10 @@ namespace cbm::algo::evbuild
         auto value = it->second.as<std::vector<uint32_t>>();
         if (value.size() > 0) {
           fMaskedChannels[det] = std::unordered_set<uint32_t>(value.begin(), value.end());
+          L_(info) << "Masking following " << ToString(det) << " channels from event selecting: ";
+          for (auto address : fMaskedChannels[det]) {
+            L_(info) << " - 0x" << std::hex << std::setw(8) << std::setfill('0') << address << std::dec;
+          }
         }
       }
     }
diff --git a/external/InstallParameter.cmake b/external/InstallParameter.cmake
index 67356a801e..a62b27992d 100644
--- a/external/InstallParameter.cmake
+++ b/external/InstallParameter.cmake
@@ -1,4 +1,4 @@
-set(PARAMETER_VERSION 4d23b9bfddd5e61fd347ba2090fc215ea72b5f32) # 2025/02/24
+set(PARAMETER_VERSION 837c4d8a6ad72455bf5843d85360580f19700644) # 2025/03/07
 set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/s.zharko/cbmroot_parameter.git")
 
 download_project_if_needed(PROJECT         Parameter_source
-- 
GitLab


From 6aa036a5de8934ab5f4e8e23a17e176f8fe51f34 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Fri, 7 Mar 2025 09:10:01 +0100
Subject: [PATCH 5/5] parameters hash bump

---
 external/InstallParameter.cmake | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/external/InstallParameter.cmake b/external/InstallParameter.cmake
index a62b27992d..7d97a642ab 100644
--- a/external/InstallParameter.cmake
+++ b/external/InstallParameter.cmake
@@ -1,5 +1,5 @@
 set(PARAMETER_VERSION 837c4d8a6ad72455bf5843d85360580f19700644) # 2025/03/07
-set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/s.zharko/cbmroot_parameter.git")
+set(PARAMETER_SRC_URL "https://git.cbm.gsi.de/CbmSoft/cbmroot_parameter.git")
 
 download_project_if_needed(PROJECT         Parameter_source
                            GIT_REPOSITORY  ${PARAMETER_SRC_URL}
-- 
GitLab