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!";
106 LOG(debug) << fName <<
"::initParSetAsic - ";
118 std::vector<std::vector<bool>> vbCrobActiveFlag;
129 LOG(debug) <<
"Nr. of MuCH DPBs: " << uNbOfDpbs;
133 LOG(debug) <<
"Nr. of FEBs: " <<
fuNbFebs;
164 const uint32_t uNbStsXyters = parset->
GetNrOfFebs();
165 LOG(debug) <<
"Nr. of StsXyter ASICs: " << uNbStsXyters;
212 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
213 // + (viFebModuleSide[uDpb][uCrobIdx][uFebIdx] << 25));
214 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
216 } // case 0: // FEB-8-1 with ZIF connector on the right
217 case 1: // FEB-8-1 with ZIF connector on the left
219 // P side (0) has type B (1)
220 // N side (1) has type A (0)
221 fviFebType[uDpb][uCrobIdx][uFebIdx] = !(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
229 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
230 // + ((!viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) << 25));
231 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
233 } // case 1: // FEB-8-1 with ZIF connector on the left
235 LOG(fatal) << Form("Bad module type for DPB #%02u CROB #%u FEB %02u: %d", uDpb, uCrobIdx, uFebIdx,
236 viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
239 } // FEB active and module index OK
240 else if (-1 == viFebModuleIdx[uDpb][uCrobIdx][uFebIdx] || -1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) {
241 fviFebAddress.push_back(0);
242 fviFebSide.push_back(-1);
243 } // Module index or type is set to inactive
245 LOG(fatal) << Form("Bad module Index and/or Side for DPB #%02u CROB "
246 "#%u FEB %02u: %d %d",
247 uDpb, uCrobIdx, uFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
248 viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
249 } // Bad module index or type for this FEB
255 vbCrobActiveFlag.resize(uNbOfDpbs);
256 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
258 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
259 vbCrobActiveFlag[uDpb][uCrobIdx] = parset->
IsCrobActive(uDpb, uCrobIdx);
266 LOG(debug) <<
"Unpacking data in bin sorter FW mode";
271 LOG(info) << fName <<
"::initParSet - Successfully initialized MUCH monitor";
291 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
300 for (uint32_t uAsicIdx = 0; uAsicIdx < uNbStsXyters; ++uAsicIdx) {
312 LOG(error) <<
"The input microslice buffer does NOT "
313 <<
"contain only complete sDPB messages!";
321 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
344 LOG(warning) <<
"CbmMuchUnpackAlgo::loopMsMessages => "
345 <<
"EPOCH message at unexpected position in MS: message " << uIdx <<
" VS message 0 expected!";
364 LOG(fatal) <<
"CbmMuchUnpackAlgo::loopMsMessages => "
365 <<
"Unknown message type, should never happen, stopping "
366 "here! Type found was: "
367 <<
static_cast<int>(typeMess);
379 for (uint32_t uFebIdx = 0; uFebIdx <
fuNbFebs; ++uFebIdx) {
386 LOG(fatal) <<
"CbmMuchUnpackAlgo::MaskNoisyChannel => Invalid FEB "
394 const std::vector<std::vector<bool>>& vbCrobActiveFlag)
396 for (uint32_t uDpb = 0; uDpb < parset->
GetNrOfDpbs(); ++uDpb) {
397 TString sPrintoutLine = Form(
"DPB #%02u CROB Active ?: ", uDpb);
398 for (uint32_t uCrobIdx = 0; uCrobIdx <
fNrCrobPerDpb; ++uCrobIdx) {
399 sPrintoutLine += Form(
"%1u", (vbCrobActiveFlag[uDpb][uCrobIdx] ==
true));
400 LOG(debug) <<
"at function printActiveCrobs";
402 LOG(debug) << sPrintoutLine;
409 const std::vector<std::vector<std::vector<int32_t>>>& ,
410 const std::vector<std::vector<std::vector<int32_t>>>& )
413 LOG(info) <<
"Currently this function not printing any info for MuCh.";
452 fOptOutBVec->emplace_back(
465 uint32_t asicidx =
fUnpackPar->ElinkIdxToFebIdx(usElinkIdx);
469 int32_t uFebIdx =
fUnpackPar->GetFebId(uAsicIdx);
471 LOG(warning) <<
"CbmMuchUnpackAlgo::processHitInfo => "
472 <<
"Particular FEB is not connected. Digi is not created for this hit. Check FEB number " << uAsicIdx
473 <<
" generate FEB Position " << uFebIdx;
478 LOG(error) <<
"CbmMuchUnpackAlgo::processHitInfo => "
479 <<
"Wrong Elink Idx! "
480 <<
" Feb " << uFebIdx <<
" Elink " << usElinkIdx;
485 const uint16_t usRawAdc = mess.
GetHitAdc();
511 LOG(debug1) <<
"CbmMuchUnpackAlgo::processHitInfo => "
512 << Form(
"Rejecting duplicate on Asic %3u channel %3u, TS %3u, ADC %2u", uAsicIdx, usChan, usRawTs,
515 if (
fMonitor)
fMonitor->FillDuplicateHitsAdc(uAsicIdx, uChanInFeb, usRawAdc);
534 double dTimeInNs = tsreltime - fSystemTimeOffset;
537 const uint64_t ulTimeInNs =
static_cast<uint64_t
>(dTimeInNs);
547 if (usChan > 127) LOG(debug) <<
"ERROR !!! Channel in hit message is out of range " << usChan;
560 LOG(debug) <<
"Created Much Address = " << address <<
" from fuCurrDpbIdx " <<
fuCurrDpbIdx <<
" Feb Id "
561 << uFebIdx <<
" Channnel Id " << uChanInFeb;
567 fOptOutAVec->emplace_back(
CbmMuchDigi(address, usRawAdc, ulTimeInNs));
570 fOutputVec.emplace_back(
CbmMuchDigi(address, usRawAdc, ulTimeInNs));
574 LOG(warning) <<
"Digi not created due to generated address is " << address;
592 fOptOutBVec->emplace_back(
599 const double dHitTimeAbsSec =
604 const double dCalAdc = usRawAdc;
607 fMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs, mess.
IsHitMissedEvts());
608 fMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dHitTimeAbsSec,
623 int32_t station = -1;
630 else if (dpbidx == 0 || dpbidx == 1 || dpbidx == 2)
635 else if (dpbidx == 4 || dpbidx == 5 || dpbidx == 6)
640 else if (dpbidx == 3) {
645 LOG(warning) <<
"Wrong DPB Id x " << dpbidx;
649 int32_t layerside = 0;
652 int32_t sSector = -9;
653 int32_t sChannel = -9;
673 if (station == 0 && fiFlag == 1 && layer == 0) {
674 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
675 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
676 sChannel =
fUnpackPar->GetPadXA(iFebId, 127 - usChan);
677 sSector =
fUnpackPar->GetPadYA(iFebId, 127 - usChan);
680 sChannel =
fUnpackPar->GetPadXA(iFebId, usChan);
681 sSector =
fUnpackPar->GetPadYA(iFebId, usChan);
684 else if (station == 1 && fiFlag == 1 && layer == 0) {
685 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
686 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
687 sChannel =
fUnpackPar->GetPadXB(iFebId, 127 - usChan);
688 sSector =
fUnpackPar->GetPadYB(iFebId, 127 - usChan);
691 sChannel =
fUnpackPar->GetPadXB(iFebId, usChan);
692 sSector =
fUnpackPar->GetPadYB(iFebId, usChan);
695 else if (station == 0 || station == 1) {
696 if (iFebId == 0 || iFebId == 1 || iFebId == 2 || iFebId == 3 || iFebId == 4 || iFebId == 8 || iFebId == 9
697 || iFebId == 10 || iFebId == 11 || iFebId == 17) {
698 sChannel =
fUnpackPar->GetPadXA(iFebId, 127 - usChan);
699 sSector =
fUnpackPar->GetPadYA(iFebId, 127 - usChan);
702 sChannel =
fUnpackPar->GetPadXA(iFebId, usChan);
703 sSector =
fUnpackPar->GetPadYA(iFebId, usChan);
706 else if (station == 2) {
707 sChannel =
fUnpackPar->GetPadXRpc(iFebId, usChan);
708 sSector =
fUnpackPar->GetPadYRpc(iFebId, usChan);
712 LOG(debug) <<
"Sector " << sSector <<
" channel " << sChannel <<
" is not connected or misconnected to pad. "
713 <<
" corresponding Feb is " << iFebId <<
" and uschan " << usChan <<
" DPB id " << dpbidx
714 <<
" Skipping this hit message.";
720 LOG(debug) <<
"Raw address " << address;
722 LOG(debug) <<
"After adding station " << address <<
" binary " << std::bitset<32>(address);
724 LOG(debug) <<
"After adding Layer " << address <<
" binary " << std::bitset<32>(address);
726 LOG(debug) <<
"After adding Layer Side " << address <<
" binary " << std::bitset<32>(address);
728 LOG(debug) <<
"After adding module " << address <<
" binary " << std::bitset<32>(address);
730 LOG(debug) <<
"After adding sector " << address <<
" binary " << std::bitset<32>(address);
732 LOG(debug) <<
"After adding channel " << address <<
" binary " << std::bitset<32>(address);
739 // fDigiVect.push_back( CbmMuchDigi( address, itHitIn->GetAdc(), ulTimeInNs ) );
743 CbmMuchBeamTimeDigi* digi = new CbmMuchBeamTimeDigi(address, itHitIn->GetAdc(), ulTimeInNs);
744 LOG(debug) << "Sector " << sSector << " channel " << sChannel << " layer " << layer << " Address " << address
745 << " Time " << ulTimeInNs;
747 digi->SetPadX(sSector);
748 digi->SetPadY(sChannel);
749 digi->SetRocId(itHitIn->GetDpb());
750 digi->SetNxId(itHitIn->GetAsic());
751 digi->SetNxCh(itHitIn->GetChan()); */
766 std::cout << Form(
"DPB %2u TS %12lu mess %5u ",
fuCurrDpbIdx, fTsIndex, uIdx);
774 LOG(warning) <<
"CbmMuchUnpackAlgo::processStatusInfo => "
775 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
780 uint32_t asicidx =
fUnpackPar->ElinkIdxToFebIdx(usElinkIdx);
787 fMonitor->FillMuchStatusMessType(uAsicIdx, usStatusField);
795 fOptOutBVec->emplace_back(
808 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
809 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb " << std::setw(5)
811 <<
" new TsMsb " << std::setw(5) << uVal;
819 && !(1 == uMessIdx && 0 == uMsIdx)
824 LOG(debug) <<
"TS MSB Jump in "
825 <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
826 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" => Old TsMsb "
832 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS Idx " << std::setw(4) << uMsIdx <<
" Msg Idx "
833 << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" TsMsb " << std::setw(5)
840 LOG(fatal) <<
"CbmMuchUnpackAlgo::processTsMsbInfo => "
841 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
842 <<
"would lead to a negative value so it cannot be recovered!!!!"
861 const uint32_t uTsMsbCycleHeader =
863 const uint32_t uTsMsbHeader =
867 LOG(debug1) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx " << std::setw(4)
868 << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx <<
" Old TsMsb "
871 << uTsMsbCycleHeader;
875 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
876 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
879 << uTsMsbCycleHeader;
887 LOG(fatal) <<
"CbmMuchUnpackAlgo::refreshTsMsbFields => "
888 <<
"Value computed from TS_MSB and TS_MSB cycle smaller than Timeslice start in TS_MSB, "
889 <<
"would lead to a negative value so it cannot be recovered!!!!"
900 LOG(debug) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MS Idx "
901 << std::setw(4) << imslice <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2)
906 LOG(warning) <<
"TS MSB cycle from MS header does not match current cycle from data "
907 <<
"for TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) << mstime <<
" MsInTs "
909 << uTsMsbCycleHeader <<
" (header)";
918 auto msDescriptor = ts->descriptor(icomp, imslice);
929 const uint32_t uCurrentEquipmentId = msDescriptor.eq_id;
930 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts->content(icomp, imslice));
931 const uint32_t uSize = msDescriptor.size;
934 LOG(debug) <<
"Microslice: " <<
fMsStartTime <<
" from EqId " << std::hex << uCurrentEquipmentId << std::dec
935 <<
" has size: " << uSize <<
" (index " << imslice <<
")";
940 const uint32_t uCurrDpbId =
static_cast<uint32_t
>(uCurrentEquipmentId & 0xFFFF);
944 const double dMsTime = (1e-9) *
static_cast<double>(
fMsStartTime);
945 if (icomp < fMonitor->GetMaxNbFlibLinks()) {
946 fMonitor->CreateMsComponentSizeHistos(icomp);
948 fMonitor->FillMsSizeTime(icomp, dMsTime, uSize);
959 LOG(warning) << fName <<
"::unpack(...)::Could not find the sDPB index for AFCK id 0x" << std::hex << uCurrDpbId
960 << std::dec <<
" in timeslice " << fNrProcessedTs <<
" in microslice " << imslice <<
" component "
962 <<
"If valid this index has to be added in the STS "
963 "parameter file in the DbpIdArray field";
968 if (1 == fNrProcessedTs)
return true;
1005 for (
auto itHit = fOutputVec.begin(); itHit != fOutputVec.end(); ++itHit) {
1006 fMonitor->FillDigisTimeInRun(itHit->GetTime());
1008 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.
virtual std::vector< std::pair< std::string, std::shared_ptr< FairParGenericSet > > > * GetParContainerRequest(std::string geoTag, uint32_t runId)
Get the requested parameter containers. To be defined in the derived classes! Return the required par...
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
bool unpack(const fles::Timeslice *ts, uint16_t icomp, UInt_t imslice)
Unpack a given microslice. To be implemented in the derived unpacker algos.
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
std::vector< std::vector< uint16_t > > fvvusLastAdcChan
ADC of last hit message for each channel, [ AsicIdx ][ Chan ].
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.
Bool_t fbElinkFebMap2022
Backward compatibility with 2022 data.
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 micro-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()
static constexpr UInt_t GetNbChanPerFeb()
static constexpr UInt_t GetNbFebsPerCrob()
static constexpr UInt_t GetNbCrobsPerDpb()
static constexpr UInt_t GetNbAsicsPerFeb()
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