From 2e14e7df3555c9d3018bada15486a67aacdd2034 Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Tue, 4 Jul 2023 10:01:36 +0000
Subject: [PATCH] StsDigi: Clamp out-of-range timestamp.

---
 core/data/sts/CbmStsDigi.h | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/core/data/sts/CbmStsDigi.h b/core/data/sts/CbmStsDigi.h
index 458abe19fc..2857a4200c 100644
--- a/core/data/sts/CbmStsDigi.h
+++ b/core/data/sts/CbmStsDigi.h
@@ -60,6 +60,7 @@ public:
    **/
   XPU_D CbmStsDigi(int32_t address, int32_t channel, uint32_t time, uint16_t charge)
   {
+    time = ClampTime(time);
     PackAddressAndTime(address, time);
     PackChannelAndCharge(channel, charge);
   }
@@ -127,12 +128,9 @@ public:
   /** Update Time of measurement
    ** @param New Time [ns]
    **/
-  XPU_D void SetTime(double dNewTime)
+  XPU_D void SetTime(uint32_t dNewTime)
   {
-    // StsDigi is not able to store negative timestamps.
-    assert(dNewTime >= 0);
-    // StsDigi has a maximal time range of ~2.1s (2 147 483 647 ns).
-    assert(dNewTime <= kMaxTimestamp);
+    dNewTime = ClampTime(dNewTime);
     PackTime(dNewTime);
   }
 
@@ -153,7 +151,11 @@ public:
    **
    ** Slightly more efficient than calling both individual setters.
    **/
-  XPU_D void SetAddressAndTime(int32_t address, uint32_t time) { PackAddressAndTime(address, time); }
+  XPU_D void SetAddressAndTime(int32_t address, uint32_t time)
+  {
+    time = ClampTime(time);
+    PackAddressAndTime(address, time);
+  }
 
 
   /** String output **/
@@ -206,6 +208,12 @@ private:
     return CbmStsAddress::UnpackDigiAddress(packedAddress);
   }
 
+  XPU_D uint32_t ClampTime(uint32_t time) const
+  {
+    if (time > kMaxTimestamp) time = kMaxTimestamp;
+    return time;
+  }
+
 #if !defined(NO_ROOT) && !XPU_IS_HIP_CUDA
   ClassDefNV(CbmStsDigi, 8);
 #endif
-- 
GitLab