9#include <FairParGenericSet.h>
14#include <RtypesCore.h>
29 const uint32_t febtype =
fviFebType[dpbidx][crobidx][uFebIdx];
44 const uint64_t ulTime =
58 LOG(warning) <<
"Chosen STS unpacker always uses firmware binning (``false'' setting is ignored).";
67 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
69 LOG(debug) <<
"Eq. ID for DPB #" << std::setw(2) << uDpb <<
" = 0x" << std::setw(4) << std::hex
77 LOG(info) << fName <<
"::initParSet - for container " << parset->ClassName();
82 << fName <<
"::initParSet - for container " << parset->ClassName()
83 <<
" failed, since CbmStsUnpackAlgo::initParSet() does not know the derived ParSet and what to do with it!";
90 LOG(debug) << fName <<
"::initParSetAsic - ";
93 std::vector<int32_t> viModuleType;
96 std::vector<int32_t> viModAddress;
99 std::vector<std::vector<std::vector<int32_t>>> viFebModuleIdx;
102 std::vector<std::vector<bool>> vbCrobActiveFlag;
105 std::vector<std::vector<std::vector<int32_t>>> viFebModuleSide;
109 LOG(debug) <<
"Nr. of STS Modules: " << uNbModules;
113 LOG(debug) <<
"Nr. of STS DPBs: " << uNbOfDpbs;
117 LOG(debug) <<
"Nr. of FEBs: " <<
fuNbFebs;
148 LOG(debug) <<
"Nr. of StsXyter ASICs: " << uNbStsXyters;
151 initTempVectors(parset, &viModuleType, &viModAddress, &viFebModuleIdx, &vbCrobActiveFlag, &viFebModuleSide);
169 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
171 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
173 for (uint32_t uFebIdx = 0; uFebIdx < parset->
GetNbFebsPerCrob(); ++uFebIdx) {
178 if (0 <= viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]
179 &&
static_cast<uint32_t
>(viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]) < uNbModules
180 && 0 <= viFebModuleSide[uDpb][uCrobIdx][uFebIdx] && viFebModuleSide[uDpb][uCrobIdx][uFebIdx] < 2) {
181 switch (viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]) {
186 fviFebType[uDpb][uCrobIdx][uFebIdx] = viFebModuleSide[uDpb][uCrobIdx][uFebIdx];
194 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
196 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
203 fviFebType[uDpb][uCrobIdx][uFebIdx] = !(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
211 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
213 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
217 LOG(fatal) << Form(
"Bad module type for DPB #%02u CROB #%u FEB %02u: %d", uDpb, uCrobIdx, uFebIdx,
218 viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
222 else if (-1 == viFebModuleIdx[uDpb][uCrobIdx][uFebIdx] || -1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) {
227 LOG(fatal) << Form(
"Bad module Index and/or Side for DPB #%02u CROB "
228 "#%u FEB %02u: %d %d",
229 uDpb, uCrobIdx, uFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
230 viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
239 LOG(debug) <<
"Unpacking data in bin sorter FW mode";
249 std::vector<int32_t>* viModAddress,
250 std::vector<std::vector<std::vector<int32_t>>>* viFebModuleIdx,
251 std::vector<std::vector<bool>>* vbCrobActiveFlag,
252 std::vector<std::vector<std::vector<int32_t>>>* viFebModuleSide)
257 viModuleType->resize(uNbModules);
258 viModAddress->resize(uNbModules);
259 for (uint32_t uModIdx = 0; uModIdx < uNbModules; ++uModIdx) {
262 LOG(debug) <<
"Module #" << std::setw(2) << uModIdx <<
" Type " << std::setw(4) << (*viModuleType)[uModIdx]
263 <<
" Address 0x" << std::setw(8) << std::hex << (*viModAddress)[uModIdx] << std::dec;
265 vbCrobActiveFlag->resize(uNbOfDpbs);
266 viFebModuleIdx->resize(uNbOfDpbs);
267 viFebModuleSide->resize(uNbOfDpbs);
269 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
273 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
274 (*vbCrobActiveFlag)[uDpb][uCrobIdx] = parset->
IsCrobActive(uDpb, uCrobIdx);
277 for (uint32_t uFebIdx = 0; uFebIdx < parset->
GetNbFebsPerCrob(); ++uFebIdx) {
278 (*viFebModuleIdx)[uDpb][uCrobIdx][uFebIdx] = parset->
GetFebModuleIdx(uDpb, uCrobIdx, uFebIdx);
279 (*viFebModuleSide)[uDpb][uCrobIdx][uFebIdx] = parset->
GetFebModuleSide(uDpb, uCrobIdx, uFebIdx);
294 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
303 for (uint32_t uAsicIdx = 0; uAsicIdx < uNbStsXyters; ++uAsicIdx) {
315 LOG(error) <<
"The input microslice buffer does NOT "
316 <<
"contain only complete sDPB messages!";
324 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
346 LOG(warning) <<
"CbmStsUnpackAlgo::loopMsMessages => "
347 <<
"EPOCH message at unexpected position in MS: message " << uIdx <<
" VS message 0 expected!";
366 LOG(fatal) <<
"CbmStsUnpackAlgo::loopMsMessages => "
367 <<
"Unknown message type, should never happen, stopping "
368 "here! Type found was: "
369 <<
static_cast<int>(typeMess);
381 for (uint32_t uFebIdx = 0; uFebIdx <
fuNbFebs; ++uFebIdx) {
388 LOG(fatal) <<
"CbmStsUnpackAlgo::MaskNoisyChannel => Invalid FEB "
396 const std::vector<std::vector<bool>>& vbCrobActiveFlag)
398 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
399 TString sPrintoutLine = Form(
"DPB #%02u CROB Active ?: ", uDpb);
400 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
401 sPrintoutLine += Form(
"%1u", (vbCrobActiveFlag[uDpb][uCrobIdx] ==
true));
403 LOG(debug) << sPrintoutLine;
409 const std::vector<std::vector<std::vector<int32_t>>>& viFebModuleIdx,
410 const std::vector<std::vector<std::vector<int32_t>>>& viFebModuleSide)
412 uint32_t uGlobalFebIdx = 0;
413 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
414 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
415 LOG(debug) << Form(
"DPB #%02u CROB #%u: ", uDpb, uCrobIdx);
416 for (uint32_t uFebIdx = 0; uFebIdx < parset->
GetNbFebsPerCrob(); ++uFebIdx) {
417 if (0 <= viFebModuleIdx[uDpb][uCrobIdx][uFebIdx])
418 LOG(debug) << Form(
" FEB #%02u (%02u): Mod. Idx = %03d Side %c (%2d) Type %c "
419 "(%2d) (Addr. 0x%08x) ADC gain %4.0f e- ADC Offs %5.0f e-",
420 uFebIdx, uGlobalFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
421 1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx] ?
'N' :
'P',
422 viFebModuleSide[uDpb][uCrobIdx][uFebIdx],
426 LOG(debug) << Form(
"Disabled FEB #%02u (%02u): Mod. Idx = %03d Side %c (%2d) Type %c "
427 "(%2d) (Addr. 0x%08x) ADC gain %4.0f e- ADC Offs %5.0f e-",
428 uFebIdx, uGlobalFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
429 1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx] ?
'N' :
'P',
430 viFebModuleSide[uDpb][uCrobIdx][uFebIdx],
448 fOptOutBVec->emplace_back(
460 LOG(warning) <<
"CbmStsUnpackAlgo::processHitInfo => "
461 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
471 const uint16_t usRawAdc = mess.
GetHitAdc();
494 LOG(debug1) <<
"CbmStsUnpackAlgo::processHitInfo => "
495 << Form(
"Rejecting duplicate on Asic %3u channel %3u, TS %3u, ADC %2u", uAsicIdx, usChan, usRawTs,
498 if (
fMonitor)
fMonitor->FillDuplicateHitsAdc(uFebIdx, uChanInFeb, usRawAdc);
522 double dTimeInNs = tsreltime - fSystemTimeOffset;
533 const uint64_t ulTimeInNs =
static_cast<uint64_t
>(dTimeInNs);
537 LOG(error) << Form(
"Digi on disabled FEB %02u has address 0x%08x and side %d", uFebIdx,
fviFebAddress[uFebIdx],
563 const double dHitTimeAbsSec =
570 fMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs, mess.
IsHitMissedEvts());
571 fMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dHitTimeAbsSec,
586 std::cout << Form(
"DPB %2u TS %12lu mess %5u ",
fuCurrDpbIdx, fTsIndex, uIdx);
594 LOG(warning) <<
"CbmStsUnpackAlgo::processStatusInfo => "
595 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
601 fMonitor->FillStsStatusMessType(uAsicIdx, usStatusField);
609 fOptOutBVec->emplace_back(
622 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
623 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb " << std::setw(5)
625 <<
" new TsMsb " << std::setw(5) << uVal;
633 && !(1 == uMessIdx && 0 == uMsIdx)
638 LOG(debug) <<
"TS MSB Jump in "
639 <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
640 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" => Old TsMsb "
646 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
647 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" TsMsb " << std::setw(5)
654 LOG(fatal) <<
"CbmStsUnpackAlgo::processTsMsbInfo => "
655 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
656 <<
"would lead to a negative value so it cannot be recovered!!!!"
675 const uint32_t uTsMsbCycleHeader =
677 const uint32_t uTsMsbHeader =
681 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx " << std::setw(4)
682 << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb "
685 << uTsMsbCycleHeader;
689 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
690 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
693 << uTsMsbCycleHeader;
701 LOG(fatal) <<
"CbmStsUnpackAlgo::refreshTsMsbFields => "
702 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
703 <<
"would lead to a negative value so it cannot be recovered!!!!"
714 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
715 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
720 LOG(warning) <<
"TS MSB cycle from MS header does not match current cycle from data "
721 <<
"for TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MsInTs "
723 << uTsMsbCycleHeader <<
" (header)";
732 auto msDescriptor = ts->descriptor(icomp, imslice);
743 const uint32_t uCurrentEquipmentId = msDescriptor.eq_id;
744 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts->content(icomp, imslice));
745 const uint32_t uSize = msDescriptor.size;
748 LOG(debug) <<
"Microslice: " <<
fMsStartTime <<
" from EqId " << std::hex << uCurrentEquipmentId << std::dec
749 <<
" has size: " << uSize <<
" (index " << imslice <<
")";
754 const uint32_t uCurrDpbId =
static_cast<uint32_t
>(uCurrentEquipmentId & 0xFFFF);
758 const double dMsTime = (1e-9) *
static_cast<double>(
fMsStartTime);
759 if (icomp < fMonitor->GetMaxNbFlibLinks()) {
760 fMonitor->CreateMsComponentSizeHistos(icomp);
762 fMonitor->FillMsSizeTime(icomp, dMsTime, uSize);
773 LOG(warning) << fName <<
"::unpack(...)::Could not find the sDPB index for AFCK id 0x" << std::hex << uCurrDpbId
774 << std::dec <<
" in timeslice " << fNrProcessedTs <<
" in microslice " << imslice <<
" component "
776 <<
"If valid this index has to be added in the STS "
777 "parameter file in the DbpIdArray field";
782 if (1 == fNrProcessedTs)
return true;
819 for (
auto itHit = fOutputVec.begin(); itHit != fOutputVec.end(); ++itHit) {
820 fMonitor->FillDigisTimeInRun(itHit->GetTime());
822 fMonitor->FillVectorSize(ts->index(), fOutputVec.size());
ClassImp(CbmConverterManager)
@ kSts
Silicon Tracking System.
Baseclass for the STS unpacker algorithms.
CbmRoot (+externals) headers.
Double_t GetFebAdcGain(UInt_t uDpbIdx, UInt_t uCrobIdx, UInt_t uFebIdx)
UInt_t GetDpbId(UInt_t uDpbIdx)
Int_t ElinkIdxToFebIdx(UInt_t uElink)
Int_t GetFebModuleIdx(UInt_t uDpbIdx, UInt_t uCrobIdx, UInt_t uFebIdx)
UInt_t GetModuleType(UInt_t uModuleIdx)
static constexpr UInt_t GetNbFebsPerCrob()
static constexpr UInt_t GetNbAsicsPerFeb()
static constexpr UInt_t GetNbElinkPerCrob()
Double_t GetFebAdcOffset(UInt_t uDpbIdx, UInt_t uCrobIdx, UInt_t uFebIdx)
static constexpr UInt_t GetNbAsicsPerCrob()
Bool_t IsCrobActive(UInt_t uDpbIdx, UInt_t uCrobIdx)
static constexpr UInt_t GetNbCrobsPerDpb()
UInt_t ElinkIdxToAsicIdxFebA(UInt_t uElink)
UInt_t ElinkIdxToAsicIdxFebB(UInt_t uElink)
UInt_t GetModuleAddress(UInt_t uModuleIdx)
Bool_t IsFebPulser(UInt_t uFebInSystIdx)
Int_t GetFebModuleSide(UInt_t uDpbIdx, UInt_t uCrobIdx, UInt_t uFebIdx)
static constexpr UInt_t GetNbChanPerAsic()
static constexpr UInt_t GetNbChanPerFeb()
Data class for a single-channel message in the STS.
std::vector< double > fvdTimeOffsetNsAsics
Time offsets per Asic???
bool fbUseTimeWalkCorrection
Enable/Disable time-walk correction.
bool fbUseFwBinning
Enables firmware binning (some implementations ignore this)
uint32_t fdAdcCut
Minimum adc cut to store a hit.
std::map< uint32_t, std::vector< std::vector< double > > > fWalkLookup
Per-ASIC's sensors Time-Walk correction mapping.
bool fbRejectDuplicateDigis
Enables the rejection of duplicate digis.
std::shared_ptr< CbmStsUnpackMonitor > fMonitor
Potential (online) monitor for the unpacking process.
std::map< uint32_t, uint32_t > fdAdcCut_perFeb
Minimum adc cut per Feb to store a hit.
bool fbDupliWithoutAdc
If rejecting duplicate digis, enables rejection even if ADC differs.
uint32_t fuCurrDpbIdx
Current dpb id.
std::vector< std::vector< bool > > fvvbMaskedChannels
Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true.
std::vector< double > fvdFebAdcOffs
ADC offset in e-, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
void initInternalStatus(CbmMcbm2018StsPar *parset)
experts please add description here
std::vector< int32_t > fviFebSide
Module side for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
std::vector< uint32_t > fvuCurrentTsMsbCycle
Current TS MSB cycle for DPB.
void initDpbIdIndexMap(CbmMcbm2018StsPar *parset)
Initialize the DpbIdIndexMap with the information from the parset.
uint32_t fNrAsicsPerFeb
Number of ASICs per FEB.
uint32_t fNrCrobPerDpb
Number of CROBs per DPB.
std::vector< uint64_t > fvulCurrentTsMsb
Current TS MSB for each DPB.
Bool_t initParSet(FairParGenericSet *parset)
Handles the distribution of the hidden derived classes to their explicit functions.
void processEpochInfo(const stsxyter::Message &)
experts please add description marked as not used currently
std::vector< std::vector< uint64_t > > fvvulLastTsMsbChan
TS MSB in TS of last hit message for each channel, [ AsicIdx ][ Chan ].
std::vector< bool > fvbMaskedComponents
Masked components to print out missing component only once.
void processErrorInfo(const stsxyter::Message &mess)
experts please add description
std::vector< int > fElinkIdxToFebIdxVec
Vector used for the translation between eLink index and FEB index.
virtual ~CbmStsUnpackAlgo()
Destroy the Cbm Sts Unpack Task object.
void loopMsMessages(const uint8_t *msContent, const uint32_t uSize, const size_t uMsIdx)
Main loop over the sts xyter messages in the µSlices.
uint32_t fNrFebsPerCrob
Number of FEBs per CROB.
CbmStsUnpackAlgo()
Create the Cbm Sts Unpack AlgoBase object.
std::map< uint32_t, uint32_t > fDpbIdIndexMap
Map of DPB Identifier to DPB index.
uint32_t fNrElinksPerCrob
Number of eLinks per CROB.
std::vector< std::pair< uint32_t, uint32_t > > fElinkIdxToAsicIdxVec
Vector used for the translation between eLink index and Asic index first is feb type A second is feb ...
virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked=true)
Mask a Noisy Channel.
Bool_t init()
Intialisation at begin of run. Special inits of the derived algos.
uint32_t getAsicIndex(uint32_t dpbidx, uint32_t crobidx, uint16_t elinkidx)
Get the Asic Index.
uint64_t fulTsStartInTsMsb
Start time of the TS expressed in TS_MSB instead of ns.
uint64_t getFullTimeStamp(const uint16_t usRawTs)
Get the Full Time Stamp from raw time stamp.
bool fbUseChannelMask
flag if channel mask is to be used or not. Set automatically via MaskNoisyChannels
bool unpack(const fles::Timeslice *ts, std::uint16_t icomp, UInt_t imslice)
Unpack a given microslice. To be implemented in the derived unpacker algos.
void processStatusInfo(const stsxyter::Message &mess, uint32_t uIdx)
experts please add description
std::vector< bool > fvbFebPulser
Pulser flag for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
uint32_t fNrChsPerAsic
Number of Channels per Asic.
std::vector< std::vector< std::vector< int32_t > > > fviFebType
FEB type, [ NbDpb ][ NbCrobPerDpb ][ NbFebsPerCrob ], 0 = A, 1 = B, -1 if inactive.
std::vector< std::vector< uint16_t > > fvvusLastAdcChan
ADC of last hit message for each channel, [ AsicIdx ][ Chan ].
uint32_t fuNbFebs
Number of FEBs with StsXyter ASICs.
std::vector< std::vector< uint16_t > > fvvusLastTsChan
TS of last hit message for each channel, [ AsicIdx ][ Chan ].
void processTsMsbInfo(const stsxyter::Message &mess, uint32_t uMessIdx, uint32_t uMsIdx)
experts please add description
std::vector< uint64_t > fulTsMsbIndexInTs
Current TS MSB cycle for DPB relative to TS start.
void printActiveCrobs(CbmMcbm2018StsPar *parset, const std::vector< std::vector< bool > > &vbCrobActiveFlag)
experts please add description
uint64_t fMsStartTime
Current µSlice time.
uint32_t fNrAsicsPerCrob
Number of ASICs per CROB.
std::vector< int32_t > fviFebAddress
STS address for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
uint32_t fNrChsPerFeb
Number of Channels per FEB.
void initTempVectors(CbmMcbm2018StsPar *parset, std::vector< int32_t > *viModuleType, std::vector< int32_t > *viModAddress, std::vector< std::vector< std::vector< int32_t > > > *viFebModuleIdx, std::vector< std::vector< bool > > *vbCrobActiveFlag, std::vector< std::vector< std::vector< int32_t > > > *viFebModuleSide)
Initialize and transfer the informations to the parameters storage vectors.
void printAddressMaps(CbmMcbm2018StsPar *parset, const std::vector< std::vector< std::vector< int32_t > > > &viFebModuleIdx, const std::vector< std::vector< std::vector< int32_t > > > &viFebModuleSide)
experts please add description
void refreshTsMsbFields(const uint32_t imslice, const size_t mstime)
experts please add description here
void processHitInfo(const stsxyter::Message &mess)
Process the information of the hit message and create a StsDigi from it.
std::vector< uint32_t > fvbFebAdcCut
ADC cuts for FEBs.
std::vector< double > fvdFebAdcGain
ADC gain in e-/b, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
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)
bool PrintMess(std::ostream &os, MessagePrintMask ctrl=MessagePrintMask::msg_print_Human, bool bBinning=true) const
XPU_D uint16_t GetStatusStatus() const
For Status data: Returns the Status field from ACK frame (4 bit field)
XPU_D MessType GetMessType() const
Returns the message type, see enum MessType.
XPU_D uint16_t GetLinkIndexHitBinning() const
XPU_D uint32_t GetData() const
XPU_D uint16_t GetHitTimeBinning() const
XPU_D uint16_t GetStatusLink() const
For Status data: Returns the Link Inedx (9 bit field)
static std::string PrintMessType(MessType type)
XPU_D uint16_t GetMsErrorType() const
For End of MS data: Returns the MS error type field (2 bit field)
XPU_D bool IsMsErrorFlagOn() const
For End of MS data: Returns the MS error flag (1 bit field)
static constexpr uint32_t kuHitNbTsBinsBinning
static constexpr uint64_t kulTsCycleNbBinsBinning
static constexpr double kdClockCycleNs
static constexpr uint16_t kusLenTsMsbValBinning
static constexpr uint16_t kusLenStatStatus
static constexpr uint32_t kuTsMsbNbTsBinsBinning