From 54d14eca00ae139534b684839d1e1865505cd590 Mon Sep 17 00:00:00 2001
From: Dominik Smith <d.smith@gsi.de>
Date: Tue, 8 Nov 2022 16:14:50 +0100
Subject: [PATCH] Added support for new CbmBmonDigi class to
 CbmAlgoBuildRawEvents and CbmTaskBuildRawEvents. Dropped support for T0 digis
 in TOF stream.

---
 MQ/mcbm/CMakeLists.txt                        |  36 +-
 .../digis/CbmAlgoBuildRawEvents.cxx           | 511 ++++--------------
 .../digis/CbmAlgoBuildRawEvents.h             |  31 +-
 .../digis/CbmTaskBuildRawEvents.cxx           |  60 +-
 .../digis/CbmTaskBuildRawEvents.h             |  13 +-
 5 files changed, 153 insertions(+), 498 deletions(-)

diff --git a/MQ/mcbm/CMakeLists.txt b/MQ/mcbm/CMakeLists.txt
index 25e526bf5b..70840b7b95 100644
--- a/MQ/mcbm/CMakeLists.txt
+++ b/MQ/mcbm/CMakeLists.txt
@@ -70,14 +70,16 @@ set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
 
 generate_cbm_executable()
 
-set(EXE_NAME BuildRawEvents)
-set(SRCS CbmDeviceBuildRawEvents.cxx runBuildRawEvents.cxx)
-
-set(PUBLIC_DEPENDENCIES ${PUBLIC_DEPS}) 
-set(PRIVATE_DEPENDENCIES ${PRIVATE_DEPS}) 
-set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
-
-generate_cbm_executable()
+# diabled until T0 is implemented in unpackers
+#
+#set(EXE_NAME BuildRawEvents)
+#set(SRCS CbmDeviceBuildRawEvents.cxx runBuildRawEvents.cxx)
+#
+#set(PUBLIC_DEPENDENCIES ${PUBLIC_DEPS}) 
+#set(PRIVATE_DEPENDENCIES ${PRIVATE_DEPS}) 
+#set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
+#
+#generate_cbm_executable()
 
 
 set(EXE_NAME McbmEventBuilderWin)
@@ -108,14 +110,16 @@ set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
 
 generate_cbm_executable()
 
-set(EXE_NAME BuildDigiEvents)
-set(SRCS CbmDeviceBuildDigiEvents.cxx runBuildDigiEvents.cxx)
-
-set(PUBLIC_DEPENDENCIES ${PUBLIC_DEPS}) 
-set(PRIVATE_DEPENDENCIES ${PRIVATE_DEPS}) 
-set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
-
-generate_cbm_executable()
+# diabled until T0 is implemented in unpackers
+#
+#set(EXE_NAME BuildDigiEvents)
+#set(SRCS CbmDeviceBuildDigiEvents.cxx runBuildDigiEvents.cxx)
+#
+#set(PUBLIC_DEPENDENCIES ${PUBLIC_DEPS}) 
+#set(PRIVATE_DEPENDENCIES ${PRIVATE_DEPS}) 
+#set(INTERFACE_DEPENDENCIES ${INTERFACE_DEPS})
+#
+#generate_cbm_executable()
 
 set(EXE_NAME DigiEventSink)
 set(SRCS CbmDeviceDigiEventSink.cxx runDigiEventSink.cxx)
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
index b4753a8742..5d3145d184 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
@@ -5,6 +5,7 @@
 #include "CbmAlgoBuildRawEvents.h"
 
 /// CBM headers
+#include "CbmBmonDigi.h"
 #include "CbmEvent.h"
 #include "CbmMuchBeamTimeDigi.h"
 #include "CbmMuchDigi.h"
@@ -33,18 +34,6 @@
 template<>
 void CbmAlgoBuildRawEvents::LoopOnSeeds<Double_t>();
 
-template<class Digi>
-uint32_t GetTofDetType(const Digi* /*pDigi*/)
-{
-  return 0;
-}
-
-uint32_t GetTofDetType(const CbmTofDigi* pDigi)
-{
-  /// Used only if TOF digi, otherwise template with 0 return is called
-  return CbmTofAddress::GetSmType(pDigi->GetAddress());
-}
-
 Bool_t CbmAlgoBuildRawEvents::InitAlgo()
 {
   LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
@@ -256,7 +245,7 @@ void CbmAlgoBuildRawEvents::BuildEvents()
       break;
     }
     case ECbmModuleId::kT0: {
-      LoopOnSeeds<CbmTofDigi>();
+      LoopOnSeeds<CbmBmonDigi>();
       break;
     }
     case ECbmModuleId::kNotExist: {  //explicit seed times
@@ -298,68 +287,20 @@ void CbmAlgoBuildRawEvents::LoopOnSeeds<Double_t>()
 template<class DigiSeed>
 void CbmAlgoBuildRawEvents::LoopOnSeeds()
 {
-  if (ECbmModuleId::kT0 == fRefDet.detId) {
-    if (0 == fuDetTypeT0) {
-      const UInt_t uNbRefDigis = fT0DigiVec->size();
-      /// Loop on size of vector
-      for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
-        LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
-        Double_t dTime = fT0DigiVec->at(uDigi).GetTime();
-
-        /// Check if seed in acceptance window
-        if (dTime < fdSeedWindowBeg) { continue; }
-        else if (fdSeedWindowEnd < dTime) {
-          break;
-        }
-        /// Check Seed and build event if needed
-        CheckSeed(dTime, uDigi);
-      }
-    }
-    else {
-      // filter T0 digis from Tof (remove this block if T0 properly implemented)
-      const UInt_t uNbRefDigis = GetNofDigis(ECbmModuleId::kTof);
-      /// Loop on size of vector
-      for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
-        LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
-
-        const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi);
-
-        // filter T0 digis from Tof
-        if (GetTofDetType(pDigi) != fuDetTypeT0) { continue; }
-
-        const Double_t dTime = pDigi->GetTime();
-
-        /// Check if seed in acceptance window
-        if (dTime < fdSeedWindowBeg) { continue; }
-        else if (fdSeedWindowEnd < dTime) {
-          break;
-        }
-        /// Check Seed and build event if needed
-        CheckSeed(dTime, uDigi);
-      }
-    }
-  }
-  else {
-    const UInt_t uNbRefDigis = GetNofDigis(fRefDet.detId);
-    /// Loop on size of vector
-    for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
-      LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
-
-      const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi);
-
-      // filter T0 digis from Tof (remove this line if T0 properly implemented)
-      if (fRefDet.detId == ECbmModuleId::kTof && 0 != fuDetTypeT0 && GetTofDetType(pDigi) == fuDetTypeT0) { continue; }
-
-      const Double_t dTime = pDigi->GetTime();
-
-      /// Check if seed in acceptance window
-      if (dTime < fdSeedWindowBeg) { continue; }
-      else if (fdSeedWindowEnd < dTime) {
-        break;
-      }
-      /// Check Seed and build event if needed
-      CheckSeed(dTime, uDigi);
+  const UInt_t uNbRefDigis = GetNofDigis(fRefDet.detId);
+  /// Loop on size of vector
+  for (UInt_t uDigi = 0; uDigi < uNbRefDigis; ++uDigi) {
+    LOG(debug) << Form("Checking seed %6u / %6u", uDigi, uNbRefDigis);
+    const DigiSeed* pDigi = GetDigi<DigiSeed>(uDigi);
+    const Double_t dTime  = pDigi->GetTime();
+
+    /// Check if seed in acceptance window
+    if (dTime < fdSeedWindowBeg) { continue; }
+    else if (fdSeedWindowEnd < dTime) {
+      break;
     }
+    /// Check Seed and build event if needed
+    CheckSeed(dTime, uDigi);
   }
 }
 
@@ -418,22 +359,10 @@ void CbmAlgoBuildRawEvents::CheckSeed(Double_t dSeedTime, UInt_t uSeedDigiIdx)
     if (fRefDet.fdTimeWinBeg < fRefDet.fdTimeWinEnd) {
       SearchMatches(dSeedTime, fRefDet);
       /// Also add the seed if the window starts after the seed
-      if (0 < fRefDet.fdTimeWinBeg) {
-        if (ECbmModuleId::kT0 == fRefDet.detId && 0 != fuDetTypeT0) {
-          AddDigiToEvent(kRawEventBuilderDetTof, uSeedDigiIdx);
-        }
-        else {
-          AddDigiToEvent(fRefDet, uSeedDigiIdx);
-        }
-      }
+      if (0 < fRefDet.fdTimeWinBeg) { AddDigiToEvent(fRefDet, uSeedDigiIdx); }
     }
     else {
-      if (ECbmModuleId::kT0 == fRefDet.detId && 0 != fuDetTypeT0) {
-        AddDigiToEvent(kRawEventBuilderDetTof, uSeedDigiIdx);
-      }
-      else {
-        AddDigiToEvent(fRefDet, uSeedDigiIdx);
-      }
+      AddDigiToEvent(fRefDet, uSeedDigiIdx);
     }
   }
 
@@ -530,6 +459,12 @@ const CbmPsdDigi* CbmAlgoBuildRawEvents::GetDigi(UInt_t uDigi)
 {
   return &((*fPsdDigis)[uDigi]);
 }
+template<>
+const CbmBmonDigi* CbmAlgoBuildRawEvents::GetDigi(UInt_t uDigi)
+{
+  return &((*fT0Digis)[uDigi]);
+}
+
 
 //----------------------------------------------------------------------
 
@@ -565,7 +500,7 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet
       break;
     }
     case ECbmModuleId::kT0: {
-      SearchMatches<CbmTofDigi>(dSeedTime, detMatch);
+      SearchMatches<CbmBmonDigi>(dSeedTime, detMatch);
       break;
     }
     default: {
@@ -585,110 +520,45 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet
   UInt_t uLocalIndexEnd   = detMatch.fuStartIndex;
 
   /// Check the Digis until out of window
-  if (ECbmModuleId::kT0 == detMatch.detId) {
-    if (0 == fuDetTypeT0) {
-      /// Loop on size of vector
-      const UInt_t uNbSelDigis = fT0DigiVec->size();
-      for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
-        const Double_t dTime     = fT0DigiVec->at(uDigi).GetTime();
-        const Double_t dTimeDiff = dTime - dSeedTime;
-
-        /// Check if within time window, update start/stop indices if needed
-        if (dTimeDiff < detMatch.fdTimeWinBeg) {
-          ++uLocalIndexStart;
-          continue;
-        }
-        else if (detMatch.fdTimeWinEnd < dTimeDiff) {
-          /// Store as end the first digi out of window to avoid double counting in case of
-          /// merged overlap event mode
-          uLocalIndexEnd = uDigi;
-          break;
-        }
-        AddDigiToEvent(detMatch, uDigi);
-        if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
-      }
-
-      /// catch the case where we reach the end of the vector before being out of the time window
-      if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
+  const UInt_t uNbSelDigis = GetNofDigis(detMatch.detId);
+  /// Loop on size of vector
+  for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
+    const DigiCheck* pDigi   = GetDigi<DigiCheck>(uDigi);
+    const Double_t dTime     = pDigi->GetTime();
+    const Double_t dTimeDiff = dTime - dSeedTime;
+    LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
+
+    /// Check if within time window, update start/stop indices if needed
+    if (dTimeDiff < detMatch.fdTimeWinBeg) {
+      ++uLocalIndexStart;
+      continue;
     }
-    else {
-      // filter T0 digis from Tof (remove this block if T0 properly implemented)
-      const UInt_t uNbSelDigis = GetNofDigis(ECbmModuleId::kTof);
-      /// Loop on size of vector
-      for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
-        const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi);
-
-        const Double_t dTime     = pDigi->GetTime();
-        const Double_t dTimeDiff = dTime - dSeedTime;
-        LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
-
-        /// Check if within time window, update start/stop indices if needed
-        if (dTimeDiff < detMatch.fdTimeWinBeg) {
-          ++uLocalIndexStart;
-          continue;
-        }
-        else if (detMatch.fdTimeWinEnd < dTimeDiff) {
-          /// Store as end the first digi out of window to avoid double counting in case of
-          /// merged overlap event mode
-          uLocalIndexEnd = uDigi;
-          break;
-        }
-
-        // filter T0 digis from Tof
-        if (GetTofDetType(pDigi) != fuDetTypeT0) { continue; }
-
-        AddDigiToEvent(kRawEventBuilderDetTof, uDigi);
-        if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
-      }
-      /// catch the case where we reach the end of the vector before being out of the time window
-      if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
+    else if (detMatch.fdTimeWinEnd < dTimeDiff) {
+      /// Store as end the first digi out of window to avoid double counting in case of
+      /// merged overlap event mode
+      uLocalIndexEnd = uDigi;
+      break;
     }
-  }
-  else {
-    const UInt_t uNbSelDigis = GetNofDigis(detMatch.detId);
-    /// Loop on size of vector
-    for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) {
-      const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi);
-
-      const Double_t dTime     = pDigi->GetTime();
-      const Double_t dTimeDiff = dTime - dSeedTime;
-      LOG(debug4) << detMatch.sName << Form(" => Checking match %6u / %6u, dt %f", uDigi, uNbSelDigis, dTimeDiff);
 
-      /// Check if within time window, update start/stop indices if needed
-      if (dTimeDiff < detMatch.fdTimeWinBeg) {
-        ++uLocalIndexStart;
+    // Filter TRD2D digis if 1D and reverse
+    if (detMatch.detId == ECbmModuleId::kTrd) {
+      const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
+      if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {  //
         continue;
       }
-      else if (detMatch.fdTimeWinEnd < dTimeDiff) {
-        /// Store as end the first digi out of window to avoid double counting in case of
-        /// merged overlap event mode
-        uLocalIndexEnd = uDigi;
-        break;
-      }
-
-      // Filter TRD2D digis if 1D and reverse
-      if (detMatch.detId == ECbmModuleId::kTrd) {
-        const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
-        if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {  //
-          continue;
-        }
-      }
-      else if (detMatch.detId == ECbmModuleId::kTrd2d) {
-        const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
-        if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {  //
-          continue;
-        }
+    }
+    else if (detMatch.detId == ECbmModuleId::kTrd2d) {
+      const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi);
+      if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {  //
+        continue;
       }
-
-      // filter T0 digis from Tof (remove this line if T0 properly implemented)
-      if (detMatch.detId == ECbmModuleId::kTof && 0 != fuDetTypeT0 && GetTofDetType(pDigi) == fuDetTypeT0) { continue; }
-
-      AddDigiToEvent(detMatch, uDigi);
-      if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
     }
-    /// catch the case where we reach the end of the vector before being out of the time window
-    if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
+
+    AddDigiToEvent(detMatch, uDigi);
+    if (fdPrevEvtEndTime < dTime) fdPrevEvtEndTime = dTime;
   }
+  /// catch the case where we reach the end of the vector before being out of the time window
+  if (uLocalIndexEnd < uLocalIndexStart) uLocalIndexEnd = uNbSelDigis;
 
   /// Update the StartIndex and EndIndex for the next event seed
   detMatch.fuStartIndex = uLocalIndexStart;
@@ -753,29 +623,6 @@ Bool_t CbmAlgoBuildRawEvents::CheckTriggerConditions(CbmEvent* event, const RawE
 
   /// Check trigger rejection by minimal number or absence
   int32_t iNbDigis = event->GetNofData(det.dataType);
-  if (0 != fuDetTypeT0) {
-    // filter T0 digis from Tof (remove this block if T0 properly implemented)
-    if (ECbmModuleId::kT0 == det.detId || ECbmModuleId::kTof == det.detId) {
-      iNbDigis                 = 0;
-      int32_t uNbSelDigisTofT0 = event->GetNofData(kRawEventBuilderDetTof.dataType);
-      /// Loop on size of vector
-      for (int32_t iDigi = 0; iDigi < uNbSelDigisTofT0; ++iDigi) {
-        uint idx                = event->GetIndex(kRawEventBuilderDetTof.dataType, iDigi);
-        const CbmTofDigi* pDigi = GetDigi<CbmTofDigi>(idx);
-        if (nullptr == pDigi) continue;
-
-        // filter T0 digis from Tof
-        if (GetTofDetType(pDigi) == fuDetTypeT0) {  //
-          if (ECbmModuleId::kT0 == det.detId) {     //
-            iNbDigis++;
-          }
-        }
-        else if (ECbmModuleId::kTof == det.detId) {  //
-          iNbDigis++;
-        }
-      }
-    }
-  }
   if ((-1 == iNbDigis) || (static_cast<UInt_t>(iNbDigis) < det.fuTriggerMinDigis)) {
     LOG(debug2) << "Event does not have enough digis: " << iNbDigis << " vs " << det.fuTriggerMinDigis << " for "
                 << det.sName;
@@ -958,9 +805,7 @@ bool CbmAlgoBuildRawEvents::CheckDataAvailable(ECbmModuleId detId)
       return fPsdDigis != nullptr;
     }
     case ECbmModuleId::kT0: {
-      if (0 != fuDetTypeT0) return fTofDigis != nullptr;
-      else
-        return fT0DigiVec != nullptr;
+      return fT0Digis != nullptr;
     }
     default: {
       LOG(fatal) << "CbmAlgoBuildRawEvents::CheckDataAvailable => "
@@ -996,9 +841,7 @@ UInt_t CbmAlgoBuildRawEvents::GetNofDigis(ECbmModuleId detId)
       return fPsdDigis->size();
     }
     case ECbmModuleId::kT0: {
-      if (0 != fuDetTypeT0) return fTofDigis->size();
-      else
-        return fT0DigiVec->size();  //what to do here? Not in digi manager.
+      return fT0Digis->size();
     }
     default: {
       LOG(fatal) << "CbmAlgoBuildRawEvents::GetNofDigis => "
@@ -1033,7 +876,7 @@ uint64_t CbmAlgoBuildRawEvents::GetSizeFromDigisNb(ECbmModuleId detId, uint64_t
       return ulNbDigis * sizeof(CbmPsdDigi);
     }
     case ECbmModuleId::kT0: {
-      return ulNbDigis * sizeof(CbmTofDigi);
+      return ulNbDigis * sizeof(CbmBmonDigi);
     }
     default: {
       LOG(fatal) << "CbmAlgoBuildRawEvents::GetSizeFromDigisNb => "
@@ -1320,60 +1163,19 @@ void CbmAlgoBuildRawEvents::FillHistos()
     fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData());
 
     /// Loop on selection detectors
-    uint32_t uNbDataT0    = 0;  // filter T0 digis from Tof (remove this block if T0 properly implemented)
-    uint32_t uNbDataTof   = 0;  // filter T0 digis from Tof (remove this block if T0 properly implemented)
     uint32_t uNbDataTrd1d = 0;
     uint32_t uNbDataTrd2d = 0;
     for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
       if (nullptr == fvhNbDigiPerEvtDet[uDetIdx]) continue;
 
-      if (0 != fuDetTypeT0) {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        if (ECbmDataType::kT0Digi == fvDets[uDetIdx].dataType) {
-          for (int idigi = 0; idigi < evt->GetNofData(ECbmDataType::kTofDigi); ++idigi) {
-            double dTimeDiff = 1.E30;
-            uint idx         = evt->GetIndex(ECbmDataType::kTofDigi, idigi);
-            auto pDigi       = GetDigi<CbmTofDigi>(idx);
-            if (nullptr == pDigi) continue;
-
-            // filter T0 digis from Tof
-            if (GetTofDetType(pDigi) == fuDetTypeT0) {
-              uNbDataT0++;
-              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-              if (dTimeDiff < 1.E30) {  //
-                fvhTDiff[uDetIdx]->Fill(dTimeDiff);
-              }
-            }
-          }
-          continue;
-        }  // if (ECbmDataType::kT0Digi == fvDets[uDetIdx].dataType)
-        else if (ECbmDataType::kTofDigi == fvDets[uDetIdx].dataType) {
-          for (int idigi = 0; idigi < evt->GetNofData(fvDets[uDetIdx].dataType); ++idigi) {
-            double dTimeDiff = 1.E30;
-            uint idx         = evt->GetIndex(fvDets[uDetIdx].dataType, idigi);
-            auto pDigi       = GetDigi<CbmTofDigi>(idx);
-            if (nullptr == pDigi) continue;
-
-            // filter T0 digis from Tof
-            if (GetTofDetType(pDigi) != fuDetTypeT0) {
-              uNbDataTof++;
-              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-              if (dTimeDiff < 1.E30) {  //
-                fvhTDiff[uDetIdx]->Fill(dTimeDiff);
-              }
-            }
-          }
-          continue;
-        }  // else if (ECbmDataType::kTofDigi == fvDets[uDetIdx].dataType)
-      }
-
       for (int idigi = 0; idigi < evt->GetNofData(fvDets[uDetIdx].dataType); ++idigi) {
         double dTimeDiff = 1.E30;
         uint idx         = evt->GetIndex(fvDets[uDetIdx].dataType, idigi);
         switch (fvDets[uDetIdx].dataType) {
           case ECbmDataType::kT0Digi: {
-            if (fT0DigiVec->size() <= idx) continue;
-            dTimeDiff = fT0DigiVec->at(idx).GetTime() - evt->GetStartTime();
+            auto pDigi = GetDigi<CbmBmonDigi>(idx);
+            if (nullptr == pDigi) continue;
+            dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
             break;
           }
           case ECbmDataType::kStsDigi: {
@@ -1432,127 +1234,76 @@ void CbmAlgoBuildRawEvents::FillHistos()
 
         if (dTimeDiff < 1.E30) fvhTDiff[uDetIdx]->Fill(dTimeDiff);
       }
-
-      if (ECbmDataType::kT0Digi == fvDets[uDetIdx].dataType) {
-        uNbDataT0 = TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType));
-      }
-      if (ECbmDataType::kTofDigi == fvDets[uDetIdx].dataType) {
-        uNbDataTof = TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType));
-      }
     }
 
     /// Reference detector
     if (ECbmModuleId::kNotExist != fRefDet.detId) {
       if (nullptr != fvhNbDigiPerEvtDet[uRefDetIdx]) {
-        if (0 != fuDetTypeT0 && ECbmDataType::kT0Digi == fRefDet.dataType) {
-          // filter T0 digis from Tof (remove this block if T0 properly implemented)
-          for (int idigi = 0; idigi < evt->GetNofData(ECbmDataType::kTofDigi); ++idigi) {
-            double dTimeDiff = 1.E30;
-            uint idx         = evt->GetIndex(ECbmDataType::kTofDigi, idigi);
-            auto pDigi       = GetDigi<CbmTofDigi>(idx);
-            if (nullptr == pDigi) continue;
-
-            // filter T0 digis from Tof
-            if (GetTofDetType(pDigi) == fuDetTypeT0) {
-              uNbDataT0++;
+        for (int idigi = 0; idigi < evt->GetNofData(fRefDet.dataType); ++idigi) {
+          double dTimeDiff = 1.E30;
+          uint idx         = evt->GetIndex(fRefDet.dataType, idigi);
+          switch (fRefDet.dataType) {
+            case ECbmDataType::kT0Digi: {
+              auto pDigi = GetDigi<CbmBmonDigi>(idx);
+              if (nullptr == pDigi) continue;
               dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-              if (dTimeDiff < 1.E30) {  //
-                fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
-              }
+              break;
             }
-          }
-        }  // if (0 != fuDetTypeT0 && ECbmDataType::kT0Digi == fRefDet.dataType)
-        else if (0 != fuDetTypeT0 && ECbmDataType::kTofDigi == fRefDet.dataType) {
-          // filter T0 digis from Tof (remove this block if T0 properly implemented)
-          for (int idigi = 0; idigi < evt->GetNofData(fRefDet.dataType); ++idigi) {
-            double dTimeDiff = 1.E30;
-            uint idx         = evt->GetIndex(fRefDet.dataType, idigi);
-            auto pDigi       = GetDigi<CbmTofDigi>(idx);
-            if (nullptr == pDigi) continue;
-
-            // filter T0 digis from Tof
-            if (GetTofDetType(pDigi) != fuDetTypeT0) {
-              uNbDataTof++;
+            case ECbmDataType::kStsDigi: {
+              auto pDigi = GetDigi<CbmStsDigi>(idx);
+              if (nullptr == pDigi) continue;
               dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-              if (dTimeDiff < 1.E30) {  //
-                fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
-              }
+              break;
             }
-          }
-        }  // else if (0 != fuDetTypeT0 && ECbmDataType::kTofDigi == fRefDet.dataType)
-        else {
-          for (int idigi = 0; idigi < evt->GetNofData(fRefDet.dataType); ++idigi) {
-            double dTimeDiff = 1.E30;
-            uint idx         = evt->GetIndex(fRefDet.dataType, idigi);
-            switch (fRefDet.dataType) {
-              case ECbmDataType::kT0Digi: {
-                if (fT0DigiVec->size() <= idx) continue;
-                dTimeDiff = fT0DigiVec->at(idx).GetTime() - evt->GetStartTime();
-                break;
-              }
-              case ECbmDataType::kStsDigi: {
-                auto pDigi = GetDigi<CbmStsDigi>(idx);
+            case ECbmDataType::kMuchDigi: {
+              if (fbUseMuchBeamtimeDigi) {
+                auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx);
                 if (nullptr == pDigi) continue;
                 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                break;
-              }
-              case ECbmDataType::kMuchDigi: {
-                if (fbUseMuchBeamtimeDigi) {
-                  auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx);
-                  if (nullptr == pDigi) continue;
-                  dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                }
-                else {
-                  auto pDigi = GetDigi<CbmMuchDigi>(idx);
-                  if (nullptr == pDigi) continue;
-                  dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                }
-                break;
               }
-              case ECbmDataType::kTofDigi: {
-                auto pDigi = GetDigi<CbmTofDigi>(idx);
+              else {
+                auto pDigi = GetDigi<CbmMuchDigi>(idx);
                 if (nullptr == pDigi) continue;
                 dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                break;
               }
-              case ECbmDataType::kTrdDigi: {
-                auto pDigi = GetDigi<CbmTrdDigi>(idx);
-                if (nullptr == pDigi) continue;
-                dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
-                  if (fRefDet.sName == "Trd2D") continue;
-                  ++uNbDataTrd1d;
-                }
-                else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
-                  if (fRefDet.sName == "Trd1D") continue;
-                  ++uNbDataTrd2d;
-                }
-                break;
-              }
-              case ECbmDataType::kRichDigi: {
-                auto pDigi = GetDigi<CbmRichDigi>(idx);  // FIXME, need to find the proper digi template
-                if (nullptr == pDigi) continue;
-                dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                break;
+              break;
+            }
+            case ECbmDataType::kTofDigi: {
+              auto pDigi = GetDigi<CbmTofDigi>(idx);
+              if (nullptr == pDigi) continue;
+              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
+              break;
+            }
+            case ECbmDataType::kTrdDigi: {
+              auto pDigi = GetDigi<CbmTrdDigi>(idx);
+              if (nullptr == pDigi) continue;
+              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
+              if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) {
+                if (fRefDet.sName == "Trd2D") continue;
+                ++uNbDataTrd1d;
               }
-              case ECbmDataType::kPsdDigi: {
-                auto pDigi = GetDigi<CbmPsdDigi>(idx);  // FIXME, need to find the proper digi template
-                if (nullptr == pDigi) continue;
-                dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
-                break;
+              else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) {
+                if (fRefDet.sName == "Trd1D") continue;
+                ++uNbDataTrd2d;
               }
-              default: LOG(error) << "Unkown dataType " << fRefDet.dataType;
+              break;
             }
-
-            if (dTimeDiff < 1.E30) fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
+            case ECbmDataType::kRichDigi: {
+              auto pDigi = GetDigi<CbmRichDigi>(idx);  // FIXME, need to find the proper digi template
+              if (nullptr == pDigi) continue;
+              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
+              break;
+            }
+            case ECbmDataType::kPsdDigi: {
+              auto pDigi = GetDigi<CbmPsdDigi>(idx);  // FIXME, need to find the proper digi template
+              if (nullptr == pDigi) continue;
+              dTimeDiff = pDigi->GetTime() - evt->GetStartTime();
+              break;
+            }
+            default: LOG(error) << "Unkown dataType " << fRefDet.dataType;
           }
 
-          if (ECbmDataType::kT0Digi == fRefDet.dataType) {  //
-            uNbDataT0 = TMath::Max(0, evt->GetNofData(fRefDet.dataType));
-          }
-          if (ECbmDataType::kTofDigi == fRefDet.dataType) {
-            uNbDataTof = TMath::Max(0, evt->GetNofData(fRefDet.dataType));
-          }
+          if (dTimeDiff < 1.E30) fvhTDiff[uRefDetIdx]->Fill(dTimeDiff);
         }
       }
     }
@@ -1561,25 +1312,7 @@ void CbmAlgoBuildRawEvents::FillHistos()
     for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) {
       if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue;
 
-      if (0 != fuDetTypeT0 && fvDets[uDetIdx].sName == "T0") {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataT0);
-        fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataT0);
-      }
-      else if (0 != fuDetTypeT0 && fvDets[uDetIdx].sName == "Tof") {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTof);
-        fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTof);
-
-        if (0 < GetNofDigis(fvDets[uDetIdx].detId)) {
-          /// Selection ratio
-          uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fvDets[uDetIdx].detId, uNbDataT0 + uNbDataTof);
-
-          ulTotalOutputSize += ulDigiSizeOut;
-          vulTotalOutputSizeDet[uDetIdx] += ulDigiSizeOut;
-        }
-      }
-      else if (fvDets[uDetIdx].sName == "Trd1D") {
+      if (fvDets[uDetIdx].sName == "Trd1D") {
         fvhNbDigiPerEvtDet[uDetIdx]->Fill(uNbDataTrd1d);
         fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d);
 
@@ -1613,25 +1346,7 @@ void CbmAlgoBuildRawEvents::FillHistos()
 
     /// Same for the reference detector
     if (ECbmModuleId::kNotExist != fRefDet.detId) {
-      if (0 != fuDetTypeT0 && fRefDet.sName == "T0") {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataT0);
-        fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataT0);
-      }
-      else if (0 != fuDetTypeT0 && fRefDet.sName == "Tof") {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTof);
-        fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTof);
-
-        if (0 < GetNofDigis(fRefDet.detId)) {
-          /// Selection ratio
-          uint64_t ulDigiSizeOut = GetSizeFromDigisNb(fRefDet.detId, uNbDataT0 + uNbDataTof);
-
-          ulTotalOutputSize += ulDigiSizeOut;
-          vulTotalOutputSizeDet[uRefDetIdx] += ulDigiSizeOut;
-        }
-      }
-      else if (fRefDet.sName == "Trd1D") {
+      if (fRefDet.sName == "Trd1D") {
         fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(uNbDataTrd1d);
         fvhNbDigiPerEvtTimeDet[uRefDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d);
 
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
index adaf851978..e50d1dc6c2 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
@@ -5,32 +5,31 @@
 #ifndef CBMALGOBUILDRAWEVENTS_H
 #define CBMALGOBUILDRAWEVENTS_H
 
-/// CBM headers
-#include "CbmMuchBeamTimeDigi.h"
-#include "CbmMuchDigi.h"
-#include "CbmPsdDigi.h"
-#include "CbmRichDigi.h"
-#include "CbmStsDigi.h"
-#include "CbmTofDigi.h"
-#include "CbmTrdDigi.h"
-
 /// FAIRROOT headers
 #include "FairTask.h"
 
-/// FAIRSOFT headers (geant, boost, ...)
+/// CBMROOT headers
+#include "CbmDefs.h"
 
 /// C/C++ headers
-#include <tuple>
-
 #include <boost/any.hpp>
 
 #include <array>
 #include <map>
 #include <set>
+#include <tuple>
 #include <vector>
 
 class TimesliceMetaData;
 class CbmEvent;
+class CbmMuchDigi;
+class CbmMuchBeamTimeDigi;
+class CbmPsdDigi;
+class CbmRichDigi;
+class CbmStsDigi;
+class CbmTofDigi;
+class CbmTrdDigi;
+class CbmBmonDigi;
 class TClonesArray;
 class TH1;
 class TH2;
@@ -180,8 +179,6 @@ public:
 
   void ChangeMuchBeamtimeDigiFlag(Bool_t bFlagIn = kFALSE) { fbUseMuchBeamtimeDigi = bFlagIn; }
 
-  void SetT0InTofDetType(uint32_t uTypeIn = 5) { fuDetTypeT0 = uTypeIn; }
-
   /// For monitor algos
   void AddHistoToVector(TNamed* pointer, std::string sFolder = "")
   {
@@ -195,7 +192,7 @@ public:
   std::vector<std::pair<TCanvas*, std::string>> GetCanvasVector() { return fvpAllCanvasPointers; }
 
   /// Set digi containers
-  void SetT0Digis(const std::vector<CbmTofDigi>* T0DigiVec) { fT0DigiVec = T0DigiVec; }
+  void SetDigis(std::vector<CbmBmonDigi>* T0Digis) { fT0Digis = T0Digis; }
   void SetDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; }
   void SetDigis(std::vector<CbmMuchDigi>* MuchDigis)
   {
@@ -268,8 +265,6 @@ private:
   Bool_t fbUseTsMetaData       = kTRUE;   //! Read Ts Parameters from input tree
   /// Event building mode and detectors selection
   EOverlapModeRaw fOverMode {EOverlapModeRaw::AllowOverlap};
-  /// for filtering T0 digis from Tof (remove this line if T0 properly implemented)
-  uint32_t fuDetTypeT0 = 0;
 
   TStopwatch* fTimer = nullptr;  //! is create when fbGetTimings is set before init
 
@@ -292,7 +287,7 @@ private:
   /// Data input
   TClonesArray* fTimeSliceMetaDataArray = nullptr;  //!
 
-  const std::vector<CbmTofDigi>* fT0DigiVec                  = nullptr;
+  const std::vector<CbmBmonDigi>* fT0Digis                   = nullptr;
   const std::vector<CbmMuchDigi>* fMuchDigis                 = nullptr;
   const std::vector<CbmMuchBeamTimeDigi>* fMuchBeamTimeDigis = nullptr;
   const std::vector<CbmStsDigi>* fStsDigis                   = nullptr;
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
index 788478c65a..2ea706c281 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx
@@ -108,14 +108,6 @@ InitStatus CbmTaskBuildRawEvents::Init()
   /// Get a handle from the IO manager
   FairRootManager* ioman = FairRootManager::Instance();
 
-  //T0 not included in digi manager.
-  fT0Digis = ioman->InitObjectAs<std::vector<CbmTofDigi> const*>("T0Digi");
-  if (!fT0Digis) { LOG(info) << "No T0 digi input."; }
-  else {
-    LOG(info) << "T0 digi input.";
-    fpAlgo->SetT0Digis(fT0Digis);
-  }
-
   // Get a pointer to the previous already existing data level
   fDigiMan = CbmDigiManager::Instance();
   if (fbUseMuchBeamtimeDigi) { fDigiMan->UseMuchBeamTimeDigi(); }
@@ -131,6 +123,7 @@ InitStatus CbmTaskBuildRawEvents::Init()
   InitDigis(ECbmModuleId::kTof, &fTofDigis);
   InitDigis(ECbmModuleId::kRich, &fRichDigis);
   InitDigis(ECbmModuleId::kPsd, &fPsdDigis);
+  InitDigis(ECbmModuleId::kT0, &fT0Digis);
 
   /// Register output array (CbmEvent)
   fEvents = new TClonesArray("CbmEvent", 100);
@@ -229,6 +222,7 @@ void CbmTaskBuildRawEvents::BuildEvents()
   ReadDigis(ECbmModuleId::kTof, fTofDigis);
   ReadDigis(ECbmModuleId::kRich, fRichDigis);
   ReadDigis(ECbmModuleId::kPsd, fPsdDigis);
+  ReadDigis(ECbmModuleId::kT0, fT0Digis);
 
   //Fill seeds
   if (fSeedFinderSlidingWindow != nullptr) { FillSeedTimesFromSlidingWindow(); }
@@ -265,13 +259,6 @@ void CbmTaskBuildRawEvents::FillSeedTimesFromDetList(std::vector<Double_t>* vdSe
     for (RawEventBuilderDetector& system : fSeedTimeDetList) {
       if (DigiCounters[system.detId] < DigiNumbers[system.detId]) {
 
-        // filter T0 digis from Tof (remove this statement if T0 properly implemented)
-        if (system.detId == ECbmModuleId::kTof && 0 != fuDetTypeT0
-            && (fTofDigis->at(DigiCounters[system.detId])).GetType() == fuDetTypeT0) {
-          DigiCounters[system.detId]++;
-          continue;
-        }  // end of T0 filter
-
         Double_t thisTime = GetDigiTime(system.detId, DigiCounters[system.detId]);
         if (thisTime < earliestTime || earliestTime == -1) {
           nextAddedSystem = system.detId;
@@ -327,12 +314,6 @@ void CbmTaskBuildRawEvents::FillSeedTimesFromSlidingWindow(const RawEventBuilder
     }
     fvDigiMatchQa->clear();
     for (Int_t i = 0; i < fDigiMan->GetNofDigis(seedDet->detId); i++) {
-
-      // filter T0 digis from Tof (remove this statement if T0 properly implemented)
-      if (seedDet->detId == ECbmModuleId::kTof && 0 != fuDetTypeT0 && (fTofDigis->at(i)).GetType() == fuDetTypeT0) {
-        continue;
-      }  // end of T0 filter
-
       const CbmMatch* digiMatch = fDigiMan->GetMatch(seedDet->detId, i);
       fvDigiMatchQa->push_back(*digiMatch);
     }
@@ -350,43 +331,10 @@ void CbmTaskBuildRawEvents::FillSeedTimesFromSlidingWindow(const RawEventBuilder
       }
     case ECbmModuleId::kSts: fSeedFinderSlidingWindow->FillSeedTimes(fStsDigis, fvDigiMatchQa); break;
     case ECbmModuleId::kTrd: fSeedFinderSlidingWindow->FillSeedTimes(fTrdDigis, fvDigiMatchQa); break;
-    case ECbmModuleId::kTof: {
-      if (0 != fuDetTypeT0) {
-        // filter T0 digis from Tof (remove this block if T0 properly implemented)
-        std::vector<CbmTofDigi> vFilteredTofDigis;
-        for (const auto& tofDigi : *fTofDigis) {
-          if (tofDigi.GetType() == fuDetTypeT0) { continue; }
-          vFilteredTofDigis.push_back(tofDigi);
-        }
-        fSeedFinderSlidingWindow->FillSeedTimes(&vFilteredTofDigis, fvDigiMatchQa);
-        // end of T0 filter
-      }
-      else {
-        // original version (no T0 filter)
-        fSeedFinderSlidingWindow->FillSeedTimes(fTofDigis, fvDigiMatchQa);
-      }
-      break;
-    }
+    case ECbmModuleId::kTof: fSeedFinderSlidingWindow->FillSeedTimes(fTofDigis, fvDigiMatchQa); break;
     case ECbmModuleId::kRich: fSeedFinderSlidingWindow->FillSeedTimes(fRichDigis, fvDigiMatchQa); break;
     case ECbmModuleId::kPsd: fSeedFinderSlidingWindow->FillSeedTimes(fPsdDigis, fvDigiMatchQa); break;
-    case ECbmModuleId::kT0: {
-      if (0 != fuDetTypeT0) {
-        // filter T0 digis in Tof array (remove this block if T0 properly implemented)
-        // => This T0 seed finding is untested and without ensurance
-        std::vector<CbmTofDigi> vFilteredTofDigis;
-        for (const auto& tofDigi : *fTofDigis) {
-          if (tofDigi.GetType() != fuDetTypeT0) { continue; }
-          vFilteredTofDigis.push_back(tofDigi);
-        }
-        fSeedFinderSlidingWindow->FillSeedTimes(&vFilteredTofDigis, fvDigiMatchQa);
-        // end of T0 filter
-      }
-      else {
-        // original version (no T0 filter needed)
-        fSeedFinderSlidingWindow->FillSeedTimes(fT0Digis, fvDigiMatchQa);
-      }
-      break;
-    }
+    case ECbmModuleId::kT0: fSeedFinderSlidingWindow->FillSeedTimes(fT0Digis, fvDigiMatchQa); break;
     default: break;
   }
 }
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index 6c902ad7c8..6c8c90c6da 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -12,6 +12,7 @@
 
 /// CBMROOT headers
 #include "CbmAlgoBuildRawEvents.h"
+#include "CbmBmonDigi.h"
 #include "CbmMuchBeamTimeDigi.h"
 #include "CbmMuchDigi.h"
 #include "CbmPsdDigi.h"
@@ -21,11 +22,10 @@
 #include "CbmTrdDigi.h"
 
 /// C/C++ headers
-#include <tuple>
-
 #include <array>
 #include <map>
 #include <set>
+#include <tuple>
 #include <vector>
 
 class CbmDigiManager;
@@ -126,11 +126,6 @@ public:
     if (nullptr != fpAlgo) fpAlgo->SetTimings(bFlagIn);
     fbGetTimings = bFlagIn;
   }
-  void SetT0InTofDetType(uint32_t uTypeIn = 5)
-  {
-    if (nullptr != fpAlgo) fpAlgo->SetT0InTofDetType(uTypeIn);
-    fuDetTypeT0 = uTypeIn;
-  }
 
   void SetSeedFinderQa(Bool_t bFlagIn = kTRUE);
   void PrintTimings();
@@ -153,7 +148,6 @@ private:
   CbmSeedFinderSlidingWindow* fSeedFinderSlidingWindow = nullptr;
 
   CbmDigiManager* fDigiMan                             = nullptr;
-  const std::vector<CbmTofDigi>* fT0Digis              = nullptr;
   std::vector<CbmMuchDigi>* fMuchDigis                 = nullptr;
   std::vector<CbmMuchBeamTimeDigi>* fMuchBeamTimeDigis = nullptr;
   std::vector<CbmStsDigi>* fStsDigis                   = nullptr;
@@ -161,6 +155,7 @@ private:
   std::vector<CbmTofDigi>* fTofDigis                   = nullptr;
   std::vector<CbmRichDigi>* fRichDigis                 = nullptr;
   std::vector<CbmPsdDigi>* fPsdDigis                   = nullptr;
+  std::vector<CbmBmonDigi>* fT0Digis                   = nullptr;
   std::vector<Double_t>* fSeedTimes                    = nullptr;
 
   /** Create digi vector and pass to algo **/
@@ -196,8 +191,6 @@ private:
   Bool_t fbFillHistos {kTRUE};             //! Switch ON/OFF filling of histograms
   Bool_t fbWriteHistosToFairSink {kTRUE};  //! Write histos to FairRootManager instead of separate file
   Bool_t fbGetTimings = kFALSE;            //! Measure CPU time using stopwatch
-  /// for filtering T0 digis from Tof (remove this line if T0 properly implemented)
-  uint32_t fuDetTypeT0 = 0;
 
   /** Name of the histogram output file **/
   TString fsOutFileName {"data/HistosEvtWin.root"};
-- 
GitLab