From ad0346b7bf388b4ac5a348e27b606df6b416d084 Mon Sep 17 00:00:00 2001 From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de> Date: Thu, 29 Jun 2023 14:27:37 +0000 Subject: [PATCH] UnpackSts: Add protection against invalid timestamps. --- algo/detectors/sts/UnpackSts.cxx | 10 +++++++++- core/data/sts/CbmStsDigi.h | 19 +++++++++---------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/algo/detectors/sts/UnpackSts.cxx b/algo/detectors/sts/UnpackSts.cxx index ad1a586ac1..06a154a98c 100644 --- a/algo/detectors/sts/UnpackSts.cxx +++ b/algo/detectors/sts/UnpackSts.cxx @@ -123,11 +123,19 @@ namespace cbm::algo messageTime -= elinkPar.fTimeOffset; // --- Apply walk correction if applicable - if (message.GetHitAdc() <= elinkPar.fWalk.size()) { messageTime += elinkPar.fWalk[message.GetHitAdc() - 1]; } + if (message.GetHitAdc() <= elinkPar.fWalk.size()) { + double walk = elinkPar.fWalk[message.GetHitAdc() - 1]; + messageTime += walk; + } // --- Charge double charge = elinkPar.fAdcOffset + (message.GetHitAdc() - 1) * elinkPar.fAdcGain; + if (messageTime > CbmStsDigi::kMaxTimestamp) { + monitor.fNumErrTimestampOverflow++; + return; + } + // --- Create output digi digiVec.emplace_back(elinkPar.fAddress, channel, messageTime, charge); } diff --git a/core/data/sts/CbmStsDigi.h b/core/data/sts/CbmStsDigi.h index 2363ba0023..ab50018657 100644 --- a/core/data/sts/CbmStsDigi.h +++ b/core/data/sts/CbmStsDigi.h @@ -39,11 +39,19 @@ **/ class CbmStsDigi { +public: // constants + static constexpr int kNumAdcBits = 5; + static constexpr uint32_t kAdcMask = (1u << kNumAdcBits) - 1u; + static constexpr int kNumLowerAddrBits = 16; + static constexpr int kNumTimestampBits = 31; + static constexpr uint32_t kTimestampMask = (1u << kNumTimestampBits) - 1u; + static constexpr uint32_t kMaxTimestamp = kTimestampMask; + static constexpr uint32_t kTimeAddressBitMask = ~kTimestampMask; + public: /** Default constructor **/ CbmStsDigi() = default; - /** Standard constructor ** @param address Unique element address ** @param channel Channel number @@ -159,15 +167,6 @@ public: private: friend class boost::serialization::access; - - static constexpr int kNumAdcBits = 5; - static constexpr uint32_t kAdcMask = (1u << kNumAdcBits) - 1u; - static constexpr int kNumLowerAddrBits = 16; - static constexpr int kNumTimestampBits = 31; - static constexpr uint32_t kTimestampMask = (1u << kNumTimestampBits) - 1u; - static constexpr uint32_t kMaxTimestamp = kTimestampMask; - static constexpr uint32_t kTimeAddressBitMask = ~kTimestampMask; - // CUDA requires types in shared memory to have trivial constructors / destructors #if XPU_IS_HIP_CUDA #define CPU_ONLY(x) -- GitLab