28 const uint64_t tTimeslice)
const
40 auto const msTime = msDescr.idx;
44 auto msSize = msDescr.size;
46 L_(error) <<
"Invalid microslice size: " << msSize;
47 std::get<1>(result).fNumErrInvalidMsSize++;
51 if (numMessages < 2) {
52 L_(error) <<
"Microslice too small: " << numMessages;
53 std::get<1>(result).fNumErrInvalidMsSize++;
57 const u32 maxDigis = numMessages - 2;
58 std::get<0>(result).reserve(maxDigis);
65 L_(error) <<
"First message in microslice is not of type EPOCH";
66 std::get<1>(result).fNumErrInvalidFirstMessage++;
72 L_(error) <<
"Second message in microslice is not of type TS_MSB";
73 std::get<1>(result).fNumErrInvalidFirstMessage++;
79 for (uint32_t messageNr = 2; messageNr < numMessages; messageNr++) {
82 switch (message[messageNr].GetMessType()) {
85 ProcessHitMessage(message[messageNr], time, std::get<0>(result), std::get<1>(result), std::get<2>(result));
93 std::get<1>(result).fNumNonHitOrTsbMessage++;
119 uint32_t asicNr = elinkPar.fAsicNr;
122 if (message.
GetHitAdc() <= elinkPar.fAdcMinCut) {
128 if (!elinkPar.fChanMask.empty() && elinkPar.fChanMask[msg_channel] ==
true) {
134 if (!maybe_channel.has_value())
return;
143 messageTime -= elinkPar.fTimeOffset;
146 if (message.
GetHitAdc() <= elinkPar.fWalk.size()) {
147 double walk = elinkPar.fWalk[message.
GetHitAdc() - 1];
152 double charge = elinkPar.fAdcOffset + (message.
GetHitAdc() - 1) * elinkPar.fAdcGain;
160 digiVec.emplace_back(elinkPar.fAddress, *maybe_channel, messageTime, charge);
static constexpr uint32_t kMaxTimestamp
std::tuple< std::vector< Digi_t >, Monitor_t, Aux_t > Result_t
static std::optional< u16 > ChannelInModule(const u16 elink_chn, const u16 asic_idx)
Channel HW to SW conversion.
void ProcessTsmsbMessage(const stsxyter::Message &message, TimeSpec &time) const
Process an epoch message (TS_MSB)
static constexpr uint32_t fkClockCycleNom
UnpackPar fParams
Parameter container.
void ProcessHitMessage(const stsxyter::Message &message, const TimeSpec &time, std::vector< CbmStsDigi > &digiVec, UnpackMonitorData &monitor, UnpackAuxData &aux) const
Process a hit message.
static constexpr uint32_t fkClockCycleDen
Result_t operator()(const uint8_t *msContent, const fles::MicrosliceDescriptor &msDescr, const uint64_t tTimeslice) const override
Algorithm execution.
static constexpr uint64_t fkEpochsPerCycle
static constexpr uint64_t fkCycleLength
~UnpackMS() override
Destructor.
UnpackMS(const UnpackPar &pars)
Default constructor.
static constexpr uint64_t fkEpochLength
XPU_D bool IsHitMissedEvts() const
For Hit data: Returns Missed event flag (1 bit field)
XPU_D uint32_t GetTsMsbValBinning() const
For TS MSB data: Returns the TS MSB 29 bit field)
XPU_D uint16_t GetHitAdc() const
For Hit data: Returns ADC value (5 bit field)
XPU_D uint16_t GetHitChannel() const
For Hit data: Returns StsXYTER channel number (7 bit field)
XPU_D uint16_t GetLinkIndexHitBinning() const
XPU_D uint16_t GetHitTimeBinning() const
std::vector< QaDigi > fQaDigis
Structure to hold the current time information for the current microslice.
u64 currentEpochTime
Current epoch time relative to timeslice in clock cycles.
u64 currentTsTime
Unix time of timeslice in units of epoch length.
u64 currentCycle
Current epoch cycle.
u32 currentEpoch
Current epoch number within epoch cycle.
uint32_t fNumErrElinkOutOfRange
Elink not contained in parameters.
uint32_t fNumErrTimestampOverflow
Overflow in 64 bit time stamp.
bool fWriteAux
Write auxiliary data for module.
std::vector< UnpackElinkPar > fElinkParams
Parameters for each eLink.