From 8c6dabc0c5b669705680b8635912049ae6968e09 Mon Sep 17 00:00:00 2001
From: Dominik Smith <smith@th.physik.uni-frankfurt.de>
Date: Mon, 9 Aug 2021 14:54:01 +0200
Subject: [PATCH] Can switch between different STS unpackers in
 CbmStsUnpackConfig.

---
 .../detectors/sts/unpack/CbmStsUnpackAlgo.cxx | 16 --------
 reco/detectors/sts/unpack/CbmStsUnpackAlgo.h  | 24 ------------
 .../sts/unpack/CbmStsUnpackAlgoBase.cxx       | 21 ++++++++++
 .../sts/unpack/CbmStsUnpackAlgoBase.h         | 39 +++++++++++++++++++
 .../sts/unpack/CbmStsUnpackAlgoLegacy.cxx     | 15 +++----
 .../sts/unpack/CbmStsUnpackAlgoLegacy.h       |  4 --
 .../sts/unpack/CbmStsUnpackConfig.cxx         |  5 ++-
 .../detectors/sts/unpack/CbmStsUnpackConfig.h |  5 +--
 8 files changed, 70 insertions(+), 59 deletions(-)

diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
index f9992f794a..917c66b4ae 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
@@ -48,22 +48,6 @@ uint64_t CbmStsUnpackAlgo::getFullTimeStamp(const uint16_t usRawTs)
   return ulTime;
 }
 
-
-// ---- GetParContainerRequest ----
-std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
-  CbmStsUnpackAlgo::GetParContainerRequest(std::string /*geoTag*/, std::uint32_t /*runId*/)
-{
-  // Basepath for default Trd parameter sets (those connected to a geoTag)
-  std::string basepath = Form("%s", fParFilesBasePath.data());
-  std::string temppath = "";
-
-  // // Get parameter container
-  temppath = basepath + "mStsPar.par";
-  fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmMcbm2018StsPar>()));
-
-  return &fParContVec;
-}
-
 // ---- init
 Bool_t CbmStsUnpackAlgo::init() { return kTRUE; }
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
index b59acc5139..eae2500fd7 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.h
@@ -39,18 +39,6 @@ public:
   /** @brief Assignment operator - not implemented **/
   CbmStsUnpackAlgo& operator=(const CbmStsUnpackAlgo&) = delete;
 
-  /**
-   * @brief Get the requested parameter containers. To be defined in the derived classes!
-   * Return the required parameter containers together with the paths to the ascii
-   * files to.
-   *
-   * @param[in] std::string geoTag as used in CbmSetup
-   * @param[in] std::uint32_t runId for runwise defined parameters
-   * @return fParContVec
-  */
-  virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
-  GetParContainerRequest(std::string geoTag, std::uint32_t runId);
-
   /**
    * @brief Mask a Noisy Channel
    *
@@ -60,12 +48,6 @@ public:
   */
   void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
 
-  /** @brief Set the minimum adc cut value @param[in] value */
-  void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
-
-  /** @brief Set the minimum adc cut value @param[in] value */
-  void SetAsicTimeOffsetVec(std::vector<double> value) { fvdTimeOffsetNsAsics.swap(value); }
-
   /** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
   void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
 
@@ -241,12 +223,6 @@ protected:
   /** @brief Vector used for the translation between eLink index and Asic index first is feb type A second is feb type b*/
   std::vector<std::pair<uint32_t, uint32_t>> fElinkIdxToAsicIdxVec = {};
 
-  /** @brief Minimum adc cut to store a hit */
-  uint32_t fdAdcCut = 0;
-
-  /** @brief Time offsets per Asic??? @todo expert confirmation required */
-  std::vector<double> fvdTimeOffsetNsAsics = {};
-
   /** @brief flag if channel mask is to be used or not. Set automatically via MaskNoisyChannels */
   bool fbUseChannelMask = false;
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
index a4af6daa95..a1576547ad 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.cxx
@@ -8,5 +8,26 @@ CbmStsUnpackAlgoBase::CbmStsUnpackAlgoBase(std::string name) : CbmRecoUnpackAlgo
 
 CbmStsUnpackAlgoBase::~CbmStsUnpackAlgoBase() {}
 
+// ---- GetParContainerRequest ----
+std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
+  CbmStsUnpackAlgoBase::GetParContainerRequest(std::string /*geoTag*/, std::uint32_t /*runId*/)
+{
+  // Basepath for default Trd parameter sets (those connected to a geoTag)
+  std::string basepath = Form("%s", fParFilesBasePath.data());
+  std::string temppath = "";
+
+  // // Get parameter container
+  temppath = basepath + "mStsPar.par";
+  fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmMcbm2018StsPar>()));
+
+  return &fParContVec;
+}
+
+// -------------------------------------------------------------------------
+void CbmStsUnpackAlgoBase::SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn)
+{
+  if (uAsicIdx >= fvdTimeOffsetNsAsics.size()) { fvdTimeOffsetNsAsics.resize(uAsicIdx + 1, 0.0); }
+  fvdTimeOffsetNsAsics[uAsicIdx] = dOffsetIn;
+}
 
 ClassImp(CbmStsUnpackAlgoBase)
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
index 32634cff69..319044d277 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoBase.h
@@ -56,12 +56,51 @@ public:
   /** @brief Set a predefined monitor @param monitor predefined unpacking monitor */
   void SetMonitor(std::shared_ptr<CbmStsUnpackMonitor> monitor) { fMonitor = monitor; }
 
+  /** @brief Set the minimum adc cut value @param[in] value */
+  void SetMinAdcCut(uint32_t value) { fdAdcCut = value; }
+
+  /** @brief Set the time offset per Asic */
+  void SetAsicTimeOffsetVec(std::vector<double> value) { fvdTimeOffsetNsAsics.swap(value); }
+
+  /** @brief Set the time offset per Asic */
+  void SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn = 0.0);
+
+  /**
+   * @brief Get the requested parameter containers. To be defined in the derived classes!
+   * Return the required parameter containers together with the paths to the ascii
+   * files to.
+   *
+   * @param[in] std::string geoTag as used in CbmSetup
+   * @param[in] std::uint32_t runId for runwise defined parameters
+   * @return fParContVec
+  */
+  virtual std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
+  GetParContainerRequest(std::string geoTag, std::uint32_t runId);
+
+  /**
+   * @brief Mask a Noisy Channel
+   *
+   * @param uFeb
+   * @param uChan
+   * @param bMasked
+  */
+  virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true)
+  {
+    (void) uFeb;
+    (void) uChan;
+    (void) bMasked;
+  };
 
 protected:
   // Monitoring
   /** @brief Potential (online) monitor for the unpacking process */
   std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
 
+  /** @brief Minimum adc cut to store a hit */
+  uint32_t fdAdcCut = 0;
+
+  /** @brief Time offsets per Asic??? @todo expert confirmation required */
+  std::vector<double> fvdTimeOffsetNsAsics = {};
 
 private:
   ClassDef(CbmStsUnpackAlgoBase, 2)
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
index 0561a7295b..57480fd737 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.cxx
@@ -45,10 +45,8 @@ CbmStsUnpackAlgoLegacy::CbmStsUnpackAlgoLegacy()
   , fvdFebAdcGain()
   , fvdFebAdcOffs()
   , fdTimeOffsetNs(0.0)
-  , fvdTimeOffsetNsAsics()
   , fbUseChannelMask(false)
   , fvvbMaskedChannels()
-  , fdAdcCut(0)
   , fulCurrentMsIdx(0)
   , fuCurrDpbIdx(0)
   , fvulCurrentTsMsb()
@@ -402,6 +400,9 @@ void CbmStsUnpackAlgoLegacy::AddHitsToDigiVect(std::vector<stsxyter::FinalHit>*
 
 bool CbmStsUnpackAlgoLegacy::unpack(const fles::Timeslice* ts, std::uint16_t uMsCompIdx, UInt_t uMsIdx)
 {
+  /// Ignore First TS as first MS is typically corrupt
+  if (0 == fTsIndex) { return true; }
+
   auto msDescriptor = ts->descriptor(uMsCompIdx, uMsIdx);
 
   //Current equipment ID, tells from which DPB the current MS is originating
@@ -529,6 +530,7 @@ void CbmStsUnpackAlgoLegacy::LoopMsMessages(const uint8_t* msContent, const uint
   for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
     /// Get message type
     const stsxyter::MessType typeMess = pMess[uIdx].GetMessType();
+
     if (fbMonitorMode && fbDebugMonitorMode) { fUnpackMonitor->ProcessDebugInfo(pMess[uIdx], fuCurrDpbIdx); }
     switch (typeMess) {
       case stsxyter::MessType::Hit: {
@@ -621,7 +623,7 @@ void CbmStsUnpackAlgoLegacy::ProcessHitInfo(const stsxyter::Message& mess)
   const double dHitTimeNs = ulHitTime * stsxyter::kdClockCycleNs;
 
   /// If EM flag ON, store a corresponding error message with the next flag after all other possible status flags set
-  if (mess.IsHitMissedEvts())
+  if (mess.IsHitMissedEvts() && fOptOutAVec != nullptr)
     fOptOutAVec->push_back(
       CbmErrorMessage(ECbmModuleId::kSts, dHitTimeNs, uAsicIdx, 1 << stsxyter::kusLenStatStatus, usChan));
 
@@ -751,13 +753,6 @@ void CbmStsUnpackAlgoLegacy::ProcessErrorInfo(const stsxyter::Message& mess)
   }
 }
 
-// -------------------------------------------------------------------------
-void CbmStsUnpackAlgoLegacy::SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn)
-{
-  if (uAsicIdx >= fvdTimeOffsetNsAsics.size()) { fvdTimeOffsetNsAsics.resize(uAsicIdx + 1, 0.0); }
-  fvdTimeOffsetNsAsics[uAsicIdx] = dOffsetIn;
-}
-
 // -------------------------------------------------------------------------
 void CbmStsUnpackAlgoLegacy::MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked)
 {
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
index 34c1af7084..f75b05e550 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgoLegacy.h
@@ -48,9 +48,7 @@ public:
   inline void SetMonitorMode(bool bFlagIn = true) { fbMonitorMode = bFlagIn; }
   inline void SetDebugMonitorMode(bool bFlagIn = true) { fbDebugMonitorMode = bFlagIn; }
   inline void SetTimeOffsetNs(double dOffsetIn = 0.0) { fdTimeOffsetNs = dOffsetIn; }
-  void SetTimeOffsetNsAsic(const uint32_t uAsicIdx, const double dOffsetIn = 0.0);
   void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked = true);
-  void SetMinAdcCut(uint32_t uAdc) { fdAdcCut = uAdc; }
 
   void SetUnpackStsMonitor(CbmStsUnpackMonitor* inMonitor) { fUnpackMonitor = inMonitor; }
 
@@ -125,11 +123,9 @@ private:
 
   /// User settings: Data correction parameters
   double fdTimeOffsetNs;
-  std::vector<double> fvdTimeOffsetNsAsics;
   bool fbUseChannelMask;
   std::vector<std::vector<bool>>
     fvvbMaskedChannels;  //! Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true
-  uint32_t fdAdcCut;
 
   /// Running indices
   /// TS/MS info
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
index 513cf2a063..c4dea57ece 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackConfig.cxx
@@ -5,6 +5,7 @@
 #include "CbmStsUnpackConfig.h"
 
 #include "CbmStsUnpackAlgo.h"
+#include "CbmStsUnpackAlgoLegacy.h"
 
 #include <Logger.h>
 
@@ -50,7 +51,6 @@ void CbmStsUnpackConfig::InitUnpacker()
   for (auto chmask : fvChanMasks)
     algo->MaskNoisyChannel(chmask.uFeb, chmask.uChan, chmask.bMasked);
 
-
   // Now we have all information required to initialise the algorithm
   algo->Init();
 
@@ -64,13 +64,14 @@ void CbmStsUnpackConfig::InitUnpacker()
 }
 
 // ---- chooseAlgo ----
-std::shared_ptr<CbmStsUnpackAlgo> CbmStsUnpackConfig::chooseAlgo()
+std::shared_ptr<CbmStsUnpackAlgoBase> CbmStsUnpackConfig::chooseAlgo()
 {
   if (fDoLog) LOG(info) << fName << "::Init - chooseAlgo";
 
   // Default unpacker selection
   // Unpacker algo from mcbm 2021 on and hopefully default for a long time.
   auto algo = std::make_shared<CbmStsUnpackAlgo>();
+  //auto algo = std::make_shared<CbmStsUnpackAlgoLegacy>();
   LOG(info) << fName << "::chooseAlgo() - selected algo = " << algo->Class_Name();
   return algo;
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackConfig.h b/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
index a930aa0aa6..8fb6d90468 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackConfig.h
@@ -35,7 +35,7 @@
 #include <memory>
 #include <vector>
 
-class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgo, CbmStsDigi, CbmErrorMessage> {
+class CbmStsUnpackConfig : public CbmRecoUnpackConfig<CbmStsUnpackAlgoBase, CbmStsDigi, CbmErrorMessage> {
 
 public:
   /**
@@ -107,7 +107,7 @@ protected:
    * 
    * @return Bool_t initOk 
   */
-  virtual std::shared_ptr<CbmStsUnpackAlgo> chooseAlgo();
+  virtual std::shared_ptr<CbmStsUnpackAlgoBase> chooseAlgo();
 
   /** @brief pointer to the monitor object */
   std::shared_ptr<CbmStsUnpackMonitor> fMonitor = nullptr;
@@ -121,7 +121,6 @@ protected:
   /// Temporary storage of user parameters
   std::vector<FebChanMaskReco> fvChanMasks = {};
 
-
   /** @brief Geometry setup tag for the given detector as used by CbmSetup objects */
   std::string fGeoSetupTag = "";
 
-- 
GitLab