Commit ab0f53f5 authored by Pascal Raisig's avatar Pascal Raisig
Browse files

Fix TRD digi time resolution of real data.

Due to some missed casting to double values, the UTC time stored in the CbmTrdRawMessageSpadic lost precision.
Now we also only store the time relative to the Timeslice in the 2021+ unpacker, such that a double is large enough to store the full information.
parent b99da649
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <Logger.h> // for LOG #include <Logger.h> // for LOG
#include <algorithm> // for max_element #include <algorithm> // for max_element
#include <cstdint>
#include <stdexcept> // for range_error #include <stdexcept> // for range_error
// ------- Default Constructor ---------------- // ------- Default Constructor ----------------
...@@ -26,7 +27,7 @@ CbmTrdRawMessageSpadic::CbmTrdRawMessageSpadic() ...@@ -26,7 +27,7 @@ CbmTrdRawMessageSpadic::CbmTrdRawMessageSpadic()
// ------- Constructor ---------------- // ------- Constructor ----------------
CbmTrdRawMessageSpadic::CbmTrdRawMessageSpadic(std::uint8_t channelId, std::uint8_t elinkId, std::uint8_t crobId, CbmTrdRawMessageSpadic::CbmTrdRawMessageSpadic(std::uint8_t channelId, std::uint8_t elinkId, std::uint8_t crobId,
std::uint16_t criId, std::uint8_t hitType, std::uint8_t nrSamples, std::uint16_t criId, std::uint8_t hitType, std::uint8_t nrSamples,
bool multiHit, size_t fullTime, std::vector<std::int16_t> samples) bool multiHit, std::uint64_t fullTime, std::vector<std::int16_t> samples)
: fChannelID {channelId} : fChannelID {channelId}
, fElinkID {elinkId} , fElinkID {elinkId}
, fCrobId(crobId) , fCrobId(crobId)
......
...@@ -84,7 +84,7 @@ private: ...@@ -84,7 +84,7 @@ private:
std::uint8_t fHitType; std::uint8_t fHitType;
std::uint8_t fNrSamples; std::uint8_t fNrSamples;
bool fMultiHit; bool fMultiHit;
size_t fFullTime; /**< Fulltime in units of Clockcycles. */ std::uint64_t fFullTime; /**< Fulltime in units of Clockcycles. */
std::vector<std::int16_t> fSamples; /**< Holds up to 32 Samples from a Spadic Message. Valid values [-256,255] */ std::vector<std::int16_t> fSamples; /**< Holds up to 32 Samples from a Spadic Message. Valid values [-256,255] */
public: public:
...@@ -93,7 +93,7 @@ public: ...@@ -93,7 +93,7 @@ public:
/** Constructor **/ /** Constructor **/
CbmTrdRawMessageSpadic(std::uint8_t channelId, std::uint8_t elinkId, std::uint8_t crobId, std::uint16_t criId, CbmTrdRawMessageSpadic(std::uint8_t channelId, std::uint8_t elinkId, std::uint8_t crobId, std::uint16_t criId,
std::uint8_t hitType, std::uint8_t nrSamples, bool multiHi, size_t fullTime, std::uint8_t hitType, std::uint8_t nrSamples, bool multiHi, std::uint64_t fullTime,
std::vector<std::int16_t> samples); std::vector<std::int16_t> samples);
/** Copy Constructor **/ /** Copy Constructor **/
...@@ -116,17 +116,17 @@ public: ...@@ -116,17 +116,17 @@ public:
std::uint8_t GetHitType() const { return fHitType; } std::uint8_t GetHitType() const { return fHitType; }
std::uint8_t GetNrSamples() const { return fNrSamples; } std::uint8_t GetNrSamples() const { return fNrSamples; }
bool GetMultiHit() const { return fMultiHit; } bool GetMultiHit() const { return fMultiHit; }
size_t GetFullTime() const { return fFullTime; } std::uint64_t GetFullTime() const { return fFullTime; }
const std::vector<std::int16_t>* GetSamples() const { return &fSamples; } const std::vector<std::int16_t>* GetSamples() const { return &fSamples; }
/** Returns the full time in nanoseconds */ /** Returns the full time in nanoseconds */
Double_t GetTime() const { return fFullTime * 62.5; } double GetTime() const { return (fFullTime * 62.5); }
/** @brief increase the number of samples stored in this raw message by one */ /** @brief increase the number of samples stored in this raw message by one */
void IncNrSamples() { fNrSamples++; } void IncNrSamples() { fNrSamples++; }
/** Set the full time in nanoseconds */ /** Set the full time in nanoseconds */
void SetTime(Double_t setvalue) { fFullTime = (size_t)(setvalue / 62.5); } void SetTime(Double_t setvalue) { fFullTime = static_cast<std::uint64_t>(setvalue / 62.5); }
/** Returns the value of the sample with the highest value. */ /** Returns the value of the sample with the highest value. */
int16_t GetMaxAdc(); int16_t GetMaxAdc();
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "CbmTrdParManager.h" #include "CbmTrdParManager.h"
#include "CbmTrdParSetAsic.h" #include "CbmTrdParSetAsic.h"
#include "CbmTrdRawMessageSpadic.h" #include "CbmTrdRawMessageSpadic.h"
#include "CbmTrdSpadic.h"
#include <FairTask.h> #include <FairTask.h>
#include <Logger.h> #include <Logger.h>
...@@ -289,10 +290,8 @@ void CbmTrdUnpackAlgoR::makeDigi(CbmTrdRawMessageSpadic raw) ...@@ -289,10 +290,8 @@ void CbmTrdUnpackAlgoR::makeDigi(CbmTrdRawMessageSpadic raw)
// Get the time information and apply the necessary correction // Get the time information and apply the necessary correction
ULong64_t time = raw.GetTime(); ULong64_t time = raw.GetTime();
time -= fSystemTimeOffset;
// Set the time relative to the TS start time -= fSystemTimeOffset;
time -= fTsStartTime;
auto digi = fRTDMethod->MakeDigi(raw.GetSamples(), padChNr, uniqueModuleId, time, triggerType, errClass); auto digi = fRTDMethod->MakeDigi(raw.GetSamples(), padChNr, uniqueModuleId, time, triggerType, errClass);
...@@ -309,15 +308,17 @@ CbmTrdRawMessageSpadic CbmTrdUnpackAlgoR::makeRaw(const std::uint32_t frame, std ...@@ -309,15 +308,17 @@ CbmTrdRawMessageSpadic CbmTrdUnpackAlgoR::makeRaw(const std::uint32_t frame, std
{ {
auto chId = static_cast<std::uint8_t>(((frame >> 17) & 0xf)); auto chId = static_cast<std::uint8_t>(((frame >> 17) & 0xf));
auto timestamp = static_cast<std::uint16_t>((frame >> 9) & 0xff); auto timestamp = static_cast<std::uint8_t>((frame >> 9) & 0xff);
bool multihit = ((frame >> 8) & 0x1); bool multihit = ((frame >> 8) & 0x1);
auto hitType = static_cast<std::uint8_t>((frame >> 6) & 0x3); auto hitType = static_cast<std::uint8_t>((frame >> 6) & 0x3);
std::uint8_t nsamples = 0; std::uint8_t nsamples = 0;
// We directly start with the largest possible samples vector to only init it once // We directly start with the largest possible samples vector to only init it once
std::vector<std::int16_t> samples = std::vector<std::int16_t>(0); std::vector<std::int16_t> samples = std::vector<std::int16_t>(0);
// get the correct fulltime in units of clock cycles // Get the µSlice starttime relative to the timeslice starttime. Otherwise the UTC will already here be to large due to a cast, caused by the multiplication with a double used in the raw message
size_t fulltime = fMsStartTimeCC + (fNrTsMsbVec.at(istream) * fTsMsbLengthCC) + timestamp; auto relMsStartTimeCC = fMsStartTimeCC - (fTsStartTime / CbmTrdSpadic::GetClockCycle());
uint64_t fulltime = relMsStartTimeCC + (fNrTsMsbVec.at(istream) * fTsMsbLengthCC) + timestamp;
// Create message // Create message
CbmTrdRawMessageSpadic retval(chId, elinkId, crobId, criId, hitType, nsamples, multihit, fulltime, samples); CbmTrdRawMessageSpadic retval(chId, elinkId, crobId, criId, hitType, nsamples, multihit, fulltime, samples);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment