9#include <FairParGenericSet.h>
14#include <RtypesCore.h>
27std::vector<std::pair<std::string, std::shared_ptr<FairParGenericSet>>>*
31 std::string basepath = Form(
"%s", fParFilesBasePath.data());
32 std::string temppath =
"";
36 LOG(debug) <<
"mMuchPar path Name: " << temppath;
37 fParContVec.emplace_back(std::make_pair(temppath, std::make_shared<CbmMuchUnpackPar>()));
57 const uint64_t ulTime =
70 LOG(debug) <<
" Below are the list of addresses of noisy channels ";
72 LOG(debug) <<
" " << *it;
81 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
83 LOG(debug) <<
"Eq. ID for DPB #" << std::setw(2) << uDpb <<
" = 0x" << std::setw(4) << std::hex
91 LOG(info) << fName <<
"::initParSet - for container " << parset->ClassName();
96 << fName <<
"::initParSet - for container " << parset->ClassName()
97 <<
" failed, since CbmMuchUnpackAlgo::initParSet() does not know the derived ParSet and what to do with it!";
105 LOG(debug) << fName <<
"::initParSetAsic - ";
117 std::vector<std::vector<bool>> vbCrobActiveFlag;
128 LOG(debug) <<
"Nr. of MuCH DPBs: " << uNbOfDpbs;
132 LOG(debug) <<
"Nr. of FEBs: " <<
fuNbFebs;
163 const uint32_t uNbStsXyters = parset->
GetNrOfFebs();
164 LOG(debug) <<
"Nr. of StsXyter ASICs: " << uNbStsXyters;
211 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
212 // + (viFebModuleSide[uDpb][uCrobIdx][uFebIdx] << 25));
213 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
215 } // case 0: // FEB-8-1 with ZIF connector on the right
216 case 1: // FEB-8-1 with ZIF connector on the left
218 // P side (0) has type B (1)
219 // N side (1) has type A (0)
220 fviFebType[uDpb][uCrobIdx][uFebIdx] = !(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
228 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
229 // + ((!viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) << 25));
230 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
232 } // case 1: // FEB-8-1 with ZIF connector on the left
234 LOG(fatal) << Form("Bad module type for DPB #%02u CROB #%u FEB %02u: %d", uDpb, uCrobIdx, uFebIdx,
235 viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
238 } // FEB active and module index OK
239 else if (-1 == viFebModuleIdx[uDpb][uCrobIdx][uFebIdx] || -1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) {
240 fviFebAddress.push_back(0);
241 fviFebSide.push_back(-1);
242 } // Module index or type is set to inactive
244 LOG(fatal) << Form("Bad module Index and/or Side for DPB #%02u CROB "
245 "#%u FEB %02u: %d %d",
246 uDpb, uCrobIdx, uFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
247 viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
248 } // Bad module index or type for this FEB
254 vbCrobActiveFlag.resize(uNbOfDpbs);
255 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
257 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
258 vbCrobActiveFlag[uDpb][uCrobIdx] = parset->
IsCrobActive(uDpb, uCrobIdx);
265 LOG(debug) <<
"Unpacking data in bin sorter FW mode";
270 LOG(info) << fName <<
"::initParSet - Successfully initialized MUCH monitor";
290 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
299 for (uint32_t uAsicIdx = 0; uAsicIdx < uNbStsXyters; ++uAsicIdx) {
311 LOG(error) <<
"The input microslice buffer does NOT "
312 <<
"contain only complete sDPB messages!";
320 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
343 LOG(warning) <<
"CbmMuchUnpackAlgo::loopMsMessages => "
344 <<
"EPOCH message at unexpected position in MS: message " << uIdx <<
" VS message 0 expected!";
363 LOG(fatal) <<
"CbmMuchUnpackAlgo::loopMsMessages => "
364 <<
"Unknown message type, should never happen, stopping "
365 "here! Type found was: "
366 <<
static_cast<int>(typeMess);
378 for (uint32_t uFebIdx = 0; uFebIdx <
fuNbFebs; ++uFebIdx) {
385 LOG(fatal) <<
"CbmMuchUnpackAlgo::MaskNoisyChannel => Invalid FEB "
393 const std::vector<std::vector<bool>>& vbCrobActiveFlag)
395 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
396 TString sPrintoutLine = Form(
"DPB #%02u CROB Active ?: ", uDpb);
397 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
398 sPrintoutLine += Form(
"%1u", (vbCrobActiveFlag[uDpb][uCrobIdx] ==
true));
399 LOG(debug) <<
"at function printActiveCrobs";
401 LOG(debug) << sPrintoutLine;
408 const std::vector<std::vector<std::vector<int32_t>>>& ,
409 const std::vector<std::vector<std::vector<int32_t>>>& )
412 LOG(info) <<
"Currently this function not printing any info for MuCh.";
451 fOptOutBVec->emplace_back(
470 LOG(warning) <<
"CbmMuchUnpackAlgo::processHitInfo => "
471 <<
"Particular FEB is not connected. Digi is not created for this hit. Check FEB number " << uAsicIdx
472 <<
" generate FEB Position " << uFebIdx;
477 LOG(error) <<
"CbmMuchUnpackAlgo::processHitInfo => "
478 <<
"Wrong Elink Idx! "
479 <<
" Feb " << uFebIdx <<
" Elink " << usElinkIdx;
484 const uint16_t usRawAdc = mess.
GetHitAdc();
510 LOG(debug1) <<
"CbmMuchUnpackAlgo::processHitInfo => "
511 << Form(
"Rejecting duplicate on Asic %3u channel %3u, TS %3u, ADC %2u", uAsicIdx, usChan, usRawTs,
514 if (
fMonitor)
fMonitor->FillDuplicateHitsAdc(uAsicIdx, uChanInFeb, usRawAdc);
533 double dTimeInNs = tsreltime - fSystemTimeOffset;
536 const uint64_t ulTimeInNs =
static_cast<uint64_t
>(dTimeInNs);
546 if (usChan > 127) LOG(debug) <<
"ERROR !!! Channel in hit message is out of range " << usChan;
559 LOG(debug) <<
"Created Much Address = " << address <<
" from fuCurrDpbIdx " <<
fuCurrDpbIdx <<
" Feb Id "
560 << uFebIdx <<
" Channnel Id " << uChanInFeb;
566 fOptOutAVec->emplace_back(
CbmMuchDigi(address, usRawAdc, ulTimeInNs));
569 fOutputVec.emplace_back(
CbmMuchDigi(address, usRawAdc, ulTimeInNs));
573 LOG(warning) <<
"Digi not created due to generated address is " << address;
591 fOptOutBVec->emplace_back(
598 const double dHitTimeAbsSec =
603 const double dCalAdc = usRawAdc;
606 fMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs, mess.
IsHitMissedEvts());
607 fMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dHitTimeAbsSec,
622 int32_t station = -1;
629 else if (dpbidx == 0 || dpbidx == 1 || dpbidx == 2)
634 else if (dpbidx == 4 || dpbidx == 5 || dpbidx == 6)
639 else if (dpbidx == 3) {
644 LOG(warning) <<
"Wrong DPB Id x " << dpbidx;
648 int32_t layerside = 0;
651 int32_t sSector = -9;
652 int32_t sChannel = -9;
672 if (station == 0 && fiFlag == 1 && layer == 0) {
673 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
674 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
683 else if (station == 1 && fiFlag == 1 && layer == 0) {
684 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
685 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
694 else if (station == 0 || station == 1) {
695 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
696 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
705 else if (station == 2) {
711 LOG(debug) <<
"Sector " << sSector <<
" channel " << sChannel <<
" is not connected or misconnected to pad. "
712 <<
" corresponding Feb is " << iFebId <<
" and uschan " << usChan <<
" DPB id " << dpbidx
713 <<
" Skipping this hit message.";
719 LOG(debug) <<
"Raw address " << address;
721 LOG(debug) <<
"After adding station " << address <<
" binary " << std::bitset<32>(address);
723 LOG(debug) <<
"After adding Layer " << address <<
" binary " << std::bitset<32>(address);
725 LOG(debug) <<
"After adding Layer Side " << address <<
" binary " << std::bitset<32>(address);
727 LOG(debug) <<
"After adding module " << address <<
" binary " << std::bitset<32>(address);
729 LOG(debug) <<
"After adding sector " << address <<
" binary " << std::bitset<32>(address);
731 LOG(debug) <<
"After adding channel " << address <<
" binary " << std::bitset<32>(address);
738 // fDigiVect.push_back( CbmMuchDigi( address, itHitIn->GetAdc(), ulTimeInNs ) );
742 CbmMuchBeamTimeDigi* digi = new CbmMuchBeamTimeDigi(address, itHitIn->GetAdc(), ulTimeInNs);
743 LOG(debug) << "Sector " << sSector << " channel " << sChannel << " layer " << layer << " Address " << address
744 << " Time " << ulTimeInNs;
746 digi->SetPadX(sSector);
747 digi->SetPadY(sChannel);
748 digi->SetRocId(itHitIn->GetDpb());
749 digi->SetNxId(itHitIn->GetAsic());
750 digi->SetNxCh(itHitIn->GetChan()); */
765 std::cout << Form(
"DPB %2u TS %12lu mess %5u ",
fuCurrDpbIdx, fTsIndex, uIdx);
773 LOG(warning) <<
"CbmMuchUnpackAlgo::processStatusInfo => "
774 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
786 fMonitor->FillMuchStatusMessType(uAsicIdx, usStatusField);
794 fOptOutBVec->emplace_back(
807 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
808 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb " << std::setw(5)
810 <<
" new TsMsb " << std::setw(5) << uVal;
818 && !(1 == uMessIdx && 0 == uMsIdx)
823 LOG(debug) <<
"TS MSB Jump in "
824 <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
825 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" => Old TsMsb "
831 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
832 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" TsMsb " << std::setw(5)
839 LOG(fatal) <<
"CbmMuchUnpackAlgo::processTsMsbInfo => "
840 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
841 <<
"would lead to a negative value so it cannot be recovered!!!!"
860 const uint32_t uTsMsbCycleHeader =
862 const uint32_t uTsMsbHeader =
866 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx " << std::setw(4)
867 << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb "
870 << uTsMsbCycleHeader;
874 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
875 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
878 << uTsMsbCycleHeader;
886 LOG(fatal) <<
"CbmMuchUnpackAlgo::refreshTsMsbFields => "
887 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
888 <<
"would lead to a negative value so it cannot be recovered!!!!"
899 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
900 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
905 LOG(warning) <<
"TS MSB cycle from MS header does not match current cycle from data "
906 <<
"for TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MsInTs "
908 << uTsMsbCycleHeader <<
" (header)";
917 auto msDescriptor = ts->descriptor(icomp, imslice);
928 const uint32_t uCurrentEquipmentId = msDescriptor.eq_id;
929 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts->content(icomp, imslice));
930 const uint32_t uSize = msDescriptor.size;
933 LOG(debug) <<
"Microslice: " <<
fMsStartTime <<
" from EqId " << std::hex << uCurrentEquipmentId << std::dec
934 <<
" has size: " << uSize <<
" (index " << imslice <<
")";
939 const uint32_t uCurrDpbId =
static_cast<uint32_t
>(uCurrentEquipmentId & 0xFFFF);
943 const double dMsTime = (1e-9) *
static_cast<double>(
fMsStartTime);
944 if (icomp < fMonitor->GetMaxNbFlibLinks()) {
945 fMonitor->CreateMsComponentSizeHistos(icomp);
947 fMonitor->FillMsSizeTime(icomp, dMsTime, uSize);
958 LOG(warning) << fName <<
"::unpack(...)::Could not find the sDPB index for AFCK id 0x" << std::hex << uCurrDpbId
959 << std::dec <<
" in timeslice " << fNrProcessedTs <<
" in microslice " << imslice <<
" component "
961 <<
"If valid this index has to be added in the STS "
962 "parameter file in the DbpIdArray field";
967 if (1 == fNrProcessedTs)
return true;
1004 for (
auto itHit = fOutputVec.begin(); itHit != fOutputVec.end(); ++itHit) {
1005 fMonitor->FillDigisTimeInRun(itHit->GetTime());
1007 fMonitor->FillVectorSize(ts->index(), fOutputVec.size());
ClassImp(CbmConverterManager)
@ kMuch
Muon detection system.
MUCH unpacker algorithms.
CbmRoot (+externals) headers.
static uint32_t SetElementId(uint32_t address, int32_t level, int32_t newId)
static uint32_t GetAddress(int32_t station=0, int32_t layer=0, int32_t side=0, int32_t module=0, int32_t sector=0, int32_t channel=0)
uint32_t CreateMuchAddress(uint32_t dpbidx, int32_t febId, uint32_t usChan)
void printAddressMaps(CbmMuchUnpackPar *parset, const std::vector< std::vector< std::vector< int32_t > > > &, const std::vector< std::vector< std::vector< int32_t > > > &)
experts please add description
Bool_t initParSet(FairParGenericSet *parset)
Handles the distribution of the hidden derived classes to their explicit functions.
uint32_t fNrAsicsPerFeb
Number of ASICs per FEB.
bool fbDupliWithoutAdc
If rejecting duplicate digis, enables rejection even if ADC differs.
std::vector< uint64_t > fvulCurrentTsMsb
Current TS MSB for each DPB.
uint64_t fuSkippMessNoValidAddress
For static/inline mapping functions.
uint32_t fNrElinksPerCrob
Number of eLinks per CROB.
std::vector< std::vector< uint64_t > > fvvulLastTsMsbChan
TS MSB in TS of last hit message for each channel, [ AsicIdx ][ Chan ].
virtual ~CbmMuchUnpackAlgo()
Destroy the Cbm Much Unpack Algo object.
void processErrorInfo(const stsxyter::Message &mess)
experts please add description
uint32_t fNrFebsPerCrob
Number of FEBs per CROB.
std::vector< std::vector< uint16_t > > fvvusLastTsChan
TS of last hit message for each channel, [ AsicIdx ][ Chan ].
std::map< uint32_t, uint32_t > fdAdcCut_perFeb
Minimum adc cut per Feb to store a hit.
CbmMuchUnpackAlgo()
Create the Cbm Much Unpack Algo object.
std::vector< bool > fvbMaskedComponents
Masked components to print out missing component only once.
std::vector< uint32_t > fvuCurrentTsMsbCycle
Current TS MSB cycle for DPB.
bool fbRejectDuplicateDigis
Enables the rejection of duplicate digis.
std::map< uint32_t, uint32_t > fDpbIdIndexMap
Map of DPB Identifier to DPB index.
void initInternalStatus(CbmMuchUnpackPar *parset)
experts please add description here
void processTsMsbInfo(const stsxyter::Message &mess, uint32_t uMessIdx, uint32_t uMsIdx)
experts please add description
void processStatusInfo(const stsxyter::Message &mess, uint32_t uIdx)
experts please add description
uint64_t fuSkippMessNoValidElink
CbmMuchUnpackPar * fUnpackPar
std::vector< std::vector< bool > > fvvbMaskedChannels
Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true.
uint32_t fNrCrobPerDpb
Number of CROBs per DPB.
uint64_t fMaskedNoisyHitsFromCbmMuchAddress
virtual std::vector< std::pair< std::string, std::shared_ptr< FairParGenericSet > > > * GetParContainerRequest(std::string geoTag, std::uint32_t runId)
Get the requested parameter containers. To be defined in the derived classes! Return the required par...
std::vector< std::vector< uint16_t > > fvvusLastAdcChan
ADC of last hit message for each channel, [ AsicIdx ][ Chan ].
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.
std::shared_ptr< CbmMuchUnpackMonitor > fMonitor
Potential (online) monitor for the unpacking process.
void refreshTsMsbFields(const uint32_t imslice, const size_t mstime)
experts please add description here
uint32_t fNrChsPerAsic
Number of Channels per Asic.
uint64_t getFullTimeStamp(const uint16_t usRawTs)
Get the Full Time Stamp from raw time stamp.
uint32_t fuNbFebs
Number of FEBs with StsXyter ASICs.
void processEpochInfo(const stsxyter::Message &)
experts please add description marked as not used currently
std::vector< uint64_t > fulTsMsbIndexInTs
Current TS MSB cycle for DPB relative to TS start.
std::vector< int > fElinkIdxToFebIdxVec
Vector used for the translation between eLink index and FEB index.
uint32_t fdAdcCut
Minimum adc cut to store a hit.
Bool_t init()
Intialisation at begin of run. Special inits of the derived algos.
uint32_t fuCurrDpbIdx
Current dpb id.
std::vector< uint32_t > fvbFebAdcCut
ADC cuts for FEBs.
void loopMsMessages(const uint8_t *msContent, const uint32_t uSize, const size_t uMsIdx)
Initialize and transfer the informations to the parameters storage vectors.
void printActiveCrobs(CbmMuchUnpackPar *parset, const std::vector< std::vector< bool > > &vbCrobActiveFlag)
experts please add description
bool fbUseChannelMask
flag if channel mask is to be used or not. Set automatically via MaskNoisyChannels
uint32_t fNrAsicsPerCrob
Number of ASICs per CROB.
uint64_t fuSkippMessNoValidFebPosition
std::vector< double > fvdTimeOffsetNsAsics
Time offsets per Asic???
std::string fParFileName
Settings from parameter file.
void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked=true)
Mask a Noisy Channel.
void processHitInfo(const stsxyter::Message &mess)
Process the information of the hit message and create a MuchDigi from it.
void initDpbIdIndexMap(CbmMuchUnpackPar *parset)
Initialize the DpbIdIndexMap with the information from the parset.
uint64_t fMsStartTime
Current µSlice time.
std::set< uint32_t > fInactiveChannels
uint64_t fulTsStartInTsMsb
Start time of the TS expressed in TS_MSB instead of ns.
uint32_t fNrChsPerFeb
Number of Channels per FEB.
static constexpr UInt_t GetNbAsicsPerCrob()
Short_t GetPadXA(UShort_t febid, UShort_t channelid)
Short_t GetPadYA(UShort_t febid, UShort_t channelid)
Short_t GetPadXB(UShort_t febid, UShort_t channelid)
Short_t GetPadYRpc(UShort_t febid, UShort_t channelid)
Short_t GetPadYB(UShort_t febid, UShort_t channelid)
static constexpr UInt_t GetNbChanPerFeb()
Int_t ElinkIdxToFebIdx(UInt_t uElink)
Convert from eLink index to FEB Connection ( 0 to kuNbFebsPerCrob)
static constexpr UInt_t GetNbFebsPerCrob()
static constexpr UInt_t GetNbCrobsPerDpb()
Short_t GetPadXRpc(UShort_t febid, UShort_t channelid)
static constexpr UInt_t GetNbAsicsPerFeb()
static constexpr UInt_t GetNbFebsPerDpb()
static constexpr UInt_t GetNbElinkPerCrob()
Bool_t IsCrobActive(UInt_t uDpbIdx, UInt_t uCrobIdx)
static constexpr UInt_t GetNbChanPerAsic()
UInt_t GetDpbId(UInt_t uDpbIdx)
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