From 453bcbf80d3f160f7d0191590a6a6c6bd18334a6 Mon Sep 17 00:00:00 2001
From: "P.-A. Loizeau" <p.-a.loizeau@gsi.de>
Date: Wed, 6 Nov 2024 16:54:08 +0100
Subject: [PATCH] Fix non-merged epoch handling in BMon and TOF online
 unpackers

=> Properly implemented in legacy unpackers but if condition lost in porting!
---
 algo/detectors/bmon/UnpackMS.cxx | 9 ++++++++-
 algo/detectors/bmon/UnpackMS.h   | 5 +++--
 algo/detectors/tof/UnpackMS.cxx  | 9 ++++++++-
 algo/detectors/tof/UnpackMS.h    | 5 +++--
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/algo/detectors/bmon/UnpackMS.cxx b/algo/detectors/bmon/UnpackMS.cxx
index 4841b63c75..b4fbf123e1 100644
--- a/algo/detectors/bmon/UnpackMS.cxx
+++ b/algo/detectors/bmon/UnpackMS.cxx
@@ -89,7 +89,14 @@ namespace cbm::algo::bmon
           break;
         }
         case critof001::MSG_EPOCH: {
-          ProcessEpochMessage(message[messageNr], time);
+          if (critof001::kuChipIdMergedEpoch == message[messageNr].getGet4Idx()) {
+            ProcessEpochMessage(message[messageNr], time);
+          }  // if this epoch message is a merged one valid for all chips
+          else {
+            /// FIXME: Should be checked in/forwarded to <some> monitor <task?>, here we just jump it
+            std::get<1>(result).fNumErrInvalidAsicEpochs++;
+            continue;
+          }  // if single chip epoch message
           break;
         }
         case critof001::MSG_SLOWC: {
diff --git a/algo/detectors/bmon/UnpackMS.h b/algo/detectors/bmon/UnpackMS.h
index 9c893c5318..8ba772dbb7 100644
--- a/algo/detectors/bmon/UnpackMS.h
+++ b/algo/detectors/bmon/UnpackMS.h
@@ -54,11 +54,12 @@ namespace cbm::algo::bmon
     uint32_t fNumErrInvalidMsSize       = 0;  ///< Microslice size is not multiple of message size
     uint32_t fNumErrTimestampOverflow   = 0;  ///< Overflow in 64 bit time stamp
     uint32_t fNumErrInvalidStartEpoch   = 0;  ///< Microslice index doesn't match first epoch
+    uint32_t fNumErrInvalidAsicEpochs   = 0;  ///< Epoch did not match merged one for an asic
     bool HasErrors()
     {
       uint32_t numErrors = fNumNonHitOrTsbMessage + fNumErrElinkOutOfRange + fNumErrInvalidFirstMessage
                            + fNumErrInvalidLastMessage + fNumErrInvalidMsSize + fNumErrTimestampOverflow
-                           + fNumErrInvalidStartEpoch;
+                           + fNumErrInvalidStartEpoch + fNumErrInvalidAsicEpochs;
       return (numErrors > 0 ? true : false);
     }
     std::string print()
@@ -66,7 +67,7 @@ namespace cbm::algo::bmon
       std::stringstream ss;
       ss << "errors " << fNumNonHitOrTsbMessage << " | " << fNumErrElinkOutOfRange << " | "
          << fNumErrInvalidFirstMessage << " | " << fNumErrInvalidLastMessage << " | " << fNumErrInvalidMsSize << " | "
-         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | ";
+         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | " << fNumErrInvalidAsicEpochs << " | ";
       return ss.str();
     }
   };
diff --git a/algo/detectors/tof/UnpackMS.cxx b/algo/detectors/tof/UnpackMS.cxx
index b9cd5dcf01..0c11fe6163 100644
--- a/algo/detectors/tof/UnpackMS.cxx
+++ b/algo/detectors/tof/UnpackMS.cxx
@@ -82,7 +82,14 @@ namespace cbm::algo::tof
           break;
         }
         case critof001::MSG_EPOCH: {
-          ProcessEpochMessage(message[messageNr], time);
+          if (critof001::kuChipIdMergedEpoch == message[messageNr].getGet4Idx()) {
+            ProcessEpochMessage(message[messageNr], time);
+          }  // if this epoch message is a merged one valid for all chips
+          else {
+            /// FIXME: Should be checked in/forwarded to <some> monitor <task?>, here we just jump it
+            std::get<1>(result).fNumErrInvalidAsicEpochs++;
+            continue;
+          }  // if single chip epoch message
           break;
         }
         case critof001::MSG_SLOWC: {
diff --git a/algo/detectors/tof/UnpackMS.h b/algo/detectors/tof/UnpackMS.h
index 1a1033cc6b..591a4deee1 100644
--- a/algo/detectors/tof/UnpackMS.h
+++ b/algo/detectors/tof/UnpackMS.h
@@ -52,11 +52,12 @@ namespace cbm::algo::tof
     uint32_t fNumErrInvalidMsSize       = 0;  ///< Microslice size is not multiple of message size
     uint32_t fNumErrTimestampOverflow   = 0;  ///< Overflow in 64 bit time stamp
     uint32_t fNumErrInvalidStartEpoch   = 0;  ///< Microslice index doesn't match first epoch
+    uint32_t fNumErrInvalidAsicEpochs   = 0;  ///< Epoch did not match merged one for an asic
     bool HasErrors()
     {
       uint32_t numErrors = fNumNonHitOrTsbMessage + fNumErrElinkOutOfRange + fNumErrInvalidFirstMessage
                            + fNumErrInvalidLastMessage + fNumErrInvalidMsSize + fNumErrTimestampOverflow
-                           + fNumErrInvalidStartEpoch;
+                           + fNumErrInvalidStartEpoch + fNumErrInvalidAsicEpochs;
       return (numErrors > 0 ? true : false);
     }
     std::string print()
@@ -64,7 +65,7 @@ namespace cbm::algo::tof
       std::stringstream ss;
       ss << "errors " << fNumNonHitOrTsbMessage << " | " << fNumErrElinkOutOfRange << " | "
          << fNumErrInvalidFirstMessage << " | " << fNumErrInvalidLastMessage << " | " << fNumErrInvalidMsSize << " | "
-         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | ";
+         << fNumErrTimestampOverflow << " | " << fNumErrInvalidStartEpoch << " | " << fNumErrInvalidAsicEpochs << " | ";
       return ss.str();
     }
   };
-- 
GitLab