68 LOG(info) <<
"Initializing mCBM STS 2019 unpacker algo";
79 LOG(info) << fName <<
"::initParSet - for container " << parset->ClassName();
84 << fName <<
"::initParSet - for container " << parset->ClassName()
85 <<
" failed, since CbmStsUnpackAlgoLegacy::initParSet() does not know the derived ParSet and what to do with it!";
104 std::vector<int32_t> viModuleType;
107 std::vector<int32_t> viModAddress;
110 std::vector<std::vector<std::vector<int32_t>>> viFebModuleIdx;
113 std::vector<std::vector<bool>> vbCrobActiveFlag;
116 std::vector<std::vector<std::vector<int32_t>>> viFebModuleSide;
119 const uint32_t uNbModules =
fUnpackPar->GetNbOfModules();
120 LOG(info) <<
"Nr. of STS Modules: " << uNbModules;
123 InitTempVectors(&viModuleType, &viModAddress, &viFebModuleIdx, &vbCrobActiveFlag, &viFebModuleSide);
126 const uint32_t uNbOfDpbs =
fUnpackPar->GetNrOfDpbs();
127 LOG(info) <<
"Nr. of STS DPBs: " << uNbOfDpbs;
134 LOG(info) <<
"Nr. of FEBs: " <<
fuNbFebs;
137 const uint32_t uNbStsXyters =
fUnpackPar->GetNrOfAsics();
138 LOG(info) <<
"Nr. of StsXyter ASICs: " << uNbStsXyters;
147 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
149 for (uint32_t uCrobIdx = 0; uCrobIdx <
fUnpackPar->GetNbCrobsPerDpb(); ++uCrobIdx) {
151 for (uint32_t uFebIdx = 0; uFebIdx <
fUnpackPar->GetNbFebsPerCrob(); ++uFebIdx) {
156 if (0 <= viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]
157 &&
static_cast<uint32_t
>(viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]) < uNbModules
158 && 0 <= viFebModuleSide[uDpb][uCrobIdx][uFebIdx] && viFebModuleSide[uDpb][uCrobIdx][uFebIdx] < 2) {
159 switch (viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]) {
164 fviFebType[uDpb][uCrobIdx][uFebIdx] = viFebModuleSide[uDpb][uCrobIdx][uFebIdx];
172 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
174 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
181 fviFebType[uDpb][uCrobIdx][uFebIdx] = !(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
189 fviFebAddress.push_back(viModAddress[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
191 fviFebSide.push_back(viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
195 LOG(fatal) << Form(
"Bad module type for DPB #%02u CROB #%u FEB %02u: %d", uDpb, uCrobIdx, uFebIdx,
196 viModuleType[viFebModuleIdx[uDpb][uCrobIdx][uFebIdx]]);
200 else if (-1 == viFebModuleIdx[uDpb][uCrobIdx][uFebIdx] || -1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx]) {
205 LOG(fatal) << Form(
"Bad module Index and/or Side for DPB #%02u CROB "
206 "#%u FEB %02u: %d %d",
207 uDpb, uCrobIdx, uFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
208 viFebModuleSide[uDpb][uCrobIdx][uFebIdx]);
217 LOG(info) <<
"Unpacking data in bin sorter FW mode";
227 for (uint32_t uDpb = 0; uDpb <
fUnpackPar->GetNrOfDpbs(); ++uDpb) {
229 LOG(info) <<
"Eq. ID for DPB #" << std::setw(2) << uDpb <<
" = 0x" << std::setw(4) << std::hex
236 std::vector<std::vector<std::vector<int32_t>>>* viFebModuleIdx,
237 std::vector<std::vector<bool>>* vbCrobActiveFlag,
238 std::vector<std::vector<std::vector<int32_t>>>* viFebModuleSide)
240 const uint32_t uNbModules =
fUnpackPar->GetNbOfModules();
241 const uint32_t uNbOfDpbs =
fUnpackPar->GetNrOfDpbs();
243 viModuleType->resize(uNbModules);
244 viModAddress->resize(uNbModules);
245 for (uint32_t uModIdx = 0; uModIdx < uNbModules; ++uModIdx) {
246 (*viModuleType)[uModIdx] =
fUnpackPar->GetModuleType(uModIdx);
247 (*viModAddress)[uModIdx] =
fUnpackPar->GetModuleAddress(uModIdx);
248 LOG(info) <<
"Module #" << std::setw(2) << uModIdx <<
" Type " << std::setw(4) << (*viModuleType)[uModIdx]
249 <<
" Address 0x" << std::setw(8) << std::hex << (*viModAddress)[uModIdx] << std::dec;
251 vbCrobActiveFlag->resize(uNbOfDpbs);
252 viFebModuleIdx->resize(uNbOfDpbs);
253 viFebModuleSide->resize(uNbOfDpbs);
255 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
256 (*vbCrobActiveFlag)[uDpb].resize(
fUnpackPar->GetNbCrobsPerDpb());
257 (*viFebModuleIdx)[uDpb].resize(
fUnpackPar->GetNbCrobsPerDpb());
258 (*viFebModuleSide)[uDpb].resize(
fUnpackPar->GetNbCrobsPerDpb());
259 for (uint32_t uCrobIdx = 0; uCrobIdx <
fUnpackPar->GetNbCrobsPerDpb(); ++uCrobIdx) {
260 (*vbCrobActiveFlag)[uDpb][uCrobIdx] =
fUnpackPar->IsCrobActive(uDpb, uCrobIdx);
261 (*viFebModuleIdx)[uDpb][uCrobIdx].resize(
fUnpackPar->GetNbFebsPerCrob());
262 (*viFebModuleSide)[uDpb][uCrobIdx].resize(
fUnpackPar->GetNbFebsPerCrob());
263 for (uint32_t uFebIdx = 0; uFebIdx <
fUnpackPar->GetNbFebsPerCrob(); ++uFebIdx) {
264 (*viFebModuleIdx)[uDpb][uCrobIdx][uFebIdx] =
fUnpackPar->GetFebModuleIdx(uDpb, uCrobIdx, uFebIdx);
265 (*viFebModuleSide)[uDpb][uCrobIdx][uFebIdx] =
fUnpackPar->GetFebModuleSide(uDpb, uCrobIdx, uFebIdx);
274 for (uint32_t uDpb = 0; uDpb <
fUnpackPar->GetNrOfDpbs(); ++uDpb) {
275 TString sPrintoutLine = Form(
"DPB #%02u CROB Active ?: ", uDpb);
276 for (uint32_t uCrobIdx = 0; uCrobIdx <
fUnpackPar->GetNbCrobsPerDpb(); ++uCrobIdx) {
277 sPrintoutLine += Form(
"%1u", (vbCrobActiveFlag[uDpb][uCrobIdx] ==
true));
279 LOG(info) << sPrintoutLine;
285 const std::vector<std::vector<std::vector<int32_t>>>& viFebModuleSide)
287 uint32_t uGlobalFebIdx = 0;
288 for (uint32_t uDpb = 0; uDpb <
fUnpackPar->GetNrOfDpbs(); ++uDpb) {
289 for (uint32_t uCrobIdx = 0; uCrobIdx <
fUnpackPar->GetNbCrobsPerDpb(); ++uCrobIdx) {
290 LOG(info) << Form(
"DPB #%02u CROB #%u: ", uDpb, uCrobIdx);
291 for (uint32_t uFebIdx = 0; uFebIdx <
fUnpackPar->GetNbFebsPerCrob(); ++uFebIdx) {
292 if (0 <= viFebModuleIdx[uDpb][uCrobIdx][uFebIdx])
293 LOG(info) << Form(
" FEB #%02u (%02u): Mod. Idx = %03d Side %c (%2d) Type %c "
294 "(%2d) (Addr. 0x%08x) ADC gain %4.0f e- ADC Offs %5.0f e-",
295 uFebIdx, uGlobalFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
296 1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx] ?
'N' :
'P',
297 viFebModuleSide[uDpb][uCrobIdx][uFebIdx],
301 LOG(info) << Form(
"Disabled FEB #%02u (%02u): Mod. Idx = %03d Side %c (%2d) Type %c "
302 "(%2d) (Addr. 0x%08x) ADC gain %4.0f e- ADC Offs %5.0f e-",
303 uFebIdx, uGlobalFebIdx, viFebModuleIdx[uDpb][uCrobIdx][uFebIdx],
304 1 == viFebModuleSide[uDpb][uCrobIdx][uFebIdx] ?
'N' :
'P',
305 viFebModuleSide[uDpb][uCrobIdx][uFebIdx],
317 const uint32_t uNbOfDpbs =
fUnpackPar->GetNrOfDpbs();
318 const uint32_t uNbStsXyters =
fUnpackPar->GetNrOfAsics();
322 for (uint32_t uDpb = 0; uDpb < uNbOfDpbs; ++uDpb) {
331 for (uint32_t uAsicIdx = 0; uAsicIdx < uNbStsXyters; ++uAsicIdx) {
340 std::vector<CbmStsDigi>* vDigiVectOut)
342 for (
auto itHitIn = vmHitsIn->begin(); itHitIn < vmHitsIn->end(); ++itHitIn) {
343 const uint32_t uAsicIdx = itHitIn->GetAsic();
344 const uint32_t uFebIdx = itHitIn->GetAsic() /
fUnpackPar->GetNbAsicsPerFeb();
345 uint32_t uChanInMod =
346 itHitIn->GetChan() +
fUnpackPar->GetNbChanPerAsic() * (itHitIn->GetAsic() %
fUnpackPar->GetNbAsicsPerFeb());
351 uChanInMod =
fUnpackPar->GetNbChanPerFeb() - uChanInMod - 1
357 const uint64_t ulTimeInNs =
static_cast<uint64_t
>(dTimeInNs);
361 LOG(error) << Form(
"Digi on disabled FEB %02u has address 0x%08x and side %d", uFebIdx,
fviFebAddress[uFebIdx],
368 fOptOutAVec->emplace_back(
fviFebAddress[uFebIdx], uChanInMod, ulTimeInNs, dCalAdc);
372 vDigiVectOut->emplace_back(
fviFebAddress[uFebIdx], uChanInMod, ulTimeInNs, dCalAdc);
384 auto msDescriptor = ts->descriptor(uMsCompIdx, uMsIdx);
387 const uint32_t uCurrentEquipmentId = msDescriptor.eq_id;
388 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts->content(uMsCompIdx, uMsIdx));
389 const uint32_t uSize = msDescriptor.size;
392 LOG(debug) <<
"Microslice: " <<
fulCurrentMsIdx <<
" from EqId " << std::hex << uCurrentEquipmentId << std::dec
393 <<
" has size: " << uSize;
398 const uint32_t uCurrDpbId =
static_cast<uint32_t
>(uCurrentEquipmentId & 0xFFFF);
402 if (uMsCompIdx < fMonitor->GetMaxNbFlibLinks()) {
404 fMonitor->FillMsSize(uMsCompIdx, uSize);
413 LOG(info) <<
"---------------------------------------------------------------";
415 LOG(warning) <<
"Could not find the sDPB index for AFCK id 0x" << std::hex << uCurrDpbId << std::dec
416 <<
" in timeslice " << fTsIndex <<
" in microslice " << uMsIdx <<
" component " << uMsCompIdx <<
"\n"
417 <<
"If valid this index has to be added in the STS "
418 "parameter file in the DbpIdArray field";
423 if (1 == fTsIndex)
return true;
451 for (
auto itHit = fOutputVec.begin(); itHit != fOutputVec.end(); ++itHit) {
452 fMonitor->FillDigisTimeInRun(itHit->GetTime());
454 fMonitor->FillVectorSize(ts->index(), fOutputVec.size());
469 uint32_t uTsMsbCycleHeader;
479 LOG(info) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) <<
fulCurrentMsIdx <<
" MS Idx "
480 << std::setw(4) << uMsIdx <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx
488 LOG(info) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) <<
fulCurrentMsIdx <<
" MS Idx "
489 << std::setw(4) << uMsIdx <<
" Msg Idx " << std::setw(5) << 0 <<
" DPB " << std::setw(2) <<
fuCurrDpbIdx
494 LOG(warning) <<
"TS MSB cycle from MS header does not match current cycle from data "
495 <<
"for TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) <<
fulCurrentMsIdx <<
" MsInTs "
497 << uTsMsbCycleHeader <<
" (header)";
508 LOG(error) <<
"The input microslice buffer does NOT "
509 <<
"contain only complete sDPB messages!";
517 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
536 LOG(info) <<
"CbmStsUnpackAlgoLegacy::DoUnpack => "
537 <<
"EPOCH message at unexpected position in MS: message " << uIdx <<
" VS message 0 expected!";
556 LOG(fatal) <<
"CbmStsUnpackAlgoLegacy::DoUnpack => "
557 <<
"Unknown message type, should never happen, stopping "
558 "here! Type found was: "
559 <<
static_cast<int>(typeMess);
575 const uint32_t uCrobIdx = usElinkIdx /
fUnpackPar->GetNbElinkPerCrob();
576 const int32_t uFebIdx =
fUnpackPar->ElinkIdxToFebIdx(usElinkIdx);
578 LOG(warning) <<
"CbmStsUnpackAlgoLegacy::ProcessHitInfo => "
579 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
582 const uint32_t uAsicIdx =
589 const uint16_t usRawAdc = mess.
GetHitAdc();
597 const uint32_t uChanInFeb = usChan +
fUnpackPar->GetNbChanPerAsic() * (uAsicIdx %
fUnpackPar->GetNbAsicsPerFeb());
606 LOG(debug) <<
"CbmStsUnpackAlgoLegacy::ProcessHitInfo => "
607 << Form(
"Rejecting duplicate on Asic %3u channel %3u, TS %3u, MSB %lu, Cycle %u, ADC %2u", uAsicIdx,
633 fOptOutBVec->push_back(
644 const uint32_t uAsicInFeb = uAsicIdx %
fUnpackPar->GetNbAsicsPerFeb();
645 const double dTimeSinceStartSec = (dHitTimeNs -
fdStartTime) * 1e-9;
647 fMonitor->FillHitMonitoringHistos(uFebIdx, usChan, uChanInFeb, usRawAdc, dCalAdc, usRawTs, mess.
IsHitMissedEvts());
648 fMonitor->FillHitEvoMonitoringHistos(uFebIdx, uAsicIdx, uAsicInFeb, uChanInFeb, dTimeSinceStartSec,
667 LOG(info) <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) <<
fulCurrentMsIdx <<
" MS Idx "
668 << std::setw(4) << uMsIdx <<
" Msg Idx " << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2)
684 LOG(info) <<
"TS MSb Jump in "
685 <<
" TS " << std::setw(12) << fTsIndex <<
" MS " << std::setw(12) <<
fulCurrentMsIdx <<
" MS Idx "
686 << std::setw(4) << uMsIdx <<
" Msg Idx " << std::setw(5) << uMessIdx <<
" DPB " << std::setw(2)
688 << std::setw(5) << uVal;
693 if (4194303 == uVal && 1 == uMessIdx)
721 const uint32_t uCrobIdx = usElinkIdx /
fUnpackPar->GetNbElinkPerCrob();
722 const int32_t uFebIdx =
fUnpackPar->ElinkIdxToFebIdx(usElinkIdx);
724 LOG(warning) <<
"CbmStsUnpackAlgoLegacy::DoUnpack => "
725 <<
"Wrong elink Idx! Elink raw " << Form(
"%d remap %d", usElinkIdx, uFebIdx);
728 const uint32_t uAsicIdx =
734 fMonitor->FillStsStatusMessType(uAsicIdx, usStatusField);
742 fOptOutBVec->push_back(
776 fOptOutBVec->push_back(
788 for (uint32_t uFebIdx = 0; uFebIdx <
fuNbFebs; ++uFebIdx) {
792 if (uFeb <
fuNbFebs && uChan < fUnpackPar->GetNbChanPerFeb())
795 LOG(fatal) <<
"CbmStsUnpackAlgoLegacy::MaskNoisyChannel => Invalid FEB "
797 << Form(
" %u vs %u and %u vs %u", uFeb,
fuNbFebs, uChan,
fUnpackPar->GetNbChanPerFeb());
@ kSts
Silicon Tracking System.
CbmRoot (+externals) headers.
std::vector< double > fvdTimeOffsetNsAsics
Time offsets per Asic???
bool fbUseFwBinning
Enables firmware binning (some implementations ignore this)
uint32_t fdAdcCut
Minimum adc cut to store a hit.
bool fbRejectDuplicateDigis
Enables the rejection of duplicate digis.
std::shared_ptr< CbmStsUnpackMonitor > fMonitor
Potential (online) monitor for the unpacking process.
CbmStsUnpackAlgoBase(std::string name)
Create the Cbm Sts Unpack AlgoBase object.
bool fbDupliWithoutAdc
If rejecting duplicate digis, enables rejection even if ADC differs.
uint64_t GetFullTimeStamp(const uint16_t usRawTs)
Get full time stamp from raw time stamp.
std::vector< double > fvdFebAdcGain
Module side for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
void PrintAddressMaps(const std::vector< std::vector< std::vector< int32_t > > > &viFebModuleIdx, const std::vector< std::vector< std::vector< int32_t > > > &viFebModuleSide)
~CbmStsUnpackAlgoLegacy()
void ProcessEpochInfo(const stsxyter::Message &mess)
void ProcessErrorInfo(const stsxyter::Message &mess)
void InitTempVectors(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)
std::vector< uint64_t > fvulCurrentTsMsb
std::map< uint32_t, uint32_t > fDpbIdIndexMap
Number of FEBs with StsXyter ASICs.
std::vector< stsxyter::FinalHit > fvmHitsInMs
Hits time-sorting.
CbmMcbm2018StsPar * fUnpackPar
Settings from parameter file.
bool initParSet(FairParGenericSet *parset)
ADC offset in e-, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
void InitDpbIdIndexMap()
Map of DPB Identifier to DPB index.
std::vector< bool > fvbMaskedComponents
Control flags.
std::vector< std::vector< uint16_t > > fvvusLastTsChan
std::vector< std::vector< bool > > fvvbMaskedChannels
uint32_t fuCurrDpbIdx
Current data properties.
void RefreshTsMsbFields(const size_t uMsIdx)
std::vector< int32_t > fviFebSide
STS address for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
virtual void MaskNoisyChannel(const uint32_t uFeb, const uint32_t uChan, const bool bMasked=true)
Mask a Noisy Channel.
void InitInternalStatus()
void PrintActiveCrobs(const std::vector< std::vector< bool > > &vbCrobActiveFlag)
void ProcessStatusInfo(const stsxyter::Message &mess, uint32_t uIdx)
std::chrono::steady_clock::time_point ftStartTimeUnix
void ProcessHitInfo(const stsxyter::Message &mess)
TS MSB cycle of last hit message for each channel, [ AsicIdx ][ Chan ].
std::vector< std::vector< std::vector< int32_t > > > fviFebType
std::vector< std::vector< uint32_t > > fvvuLastTsMsbChan
ADC of last hit message for each channel, [ AsicIdx ][ Chan ].
void ProcessTsMsbInfo(const stsxyter::Message &mess, uint32_t uMessIdx=0, uint32_t uMsIdx=0)
void AddHitsToDigiVect(std::vector< stsxyter::FinalHit > *vmHitsIn, std::vector< CbmStsDigi > *vDigiVectOut)
Add the hits to the output buffer as Digis.
void LoopMsMessages(const uint8_t *msContent, const uint32_t uSize, const size_t uMsIdx)
uint64_t fulCurrentMsIdx
Vector of channel masks, [ NbFeb ][ NbCHanInFeb ], used only if fbUseChannelMask is true.
std::vector< double > fvdFebAdcOffs
ADC gain in e-/b, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
bool unpack(const fles::Timeslice *ts, uint16_t icomp, UInt_t imslice)
Unpack a given microslice. To be implemented in the derived unpacker algos.
double fdTimeOffsetNs
User settings: Data correction parameters.
std::vector< uint32_t > fvuCurrentTsMsbCycle
Current TS MSB for each DPB.
std::vector< std::vector< uint16_t > > fvvusLastTsMsbCycleChan
TS MSB of last hit message for each channel, [ AsicIdx ][ Chan ].
std::vector< int32_t > fviFebAddress
Pulser flag for each FEB, [ NbDpb * NbCrobPerDpb * NbFebsPerCrob ].
std::vector< std::vector< uint16_t > > fvvusLastAdcChan
TS of last hit message for each channel, [ AsicIdx ][ Chan ].
std::vector< bool > fvbFebPulser
FEB type, [ NbDpb ][ NbCrobPerDpb ][ NbFebsPerCrob ], 0 = A, 1 = B, -1 if inactive.
static const uint32_t kuMaxTsMsbDiffDuplicates
All hits (time in bins, ADC in bins, asic, channel) in last MS, sorted with "<" operator.
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 GetLinkIndex() const
For all data: Returns the (global) index of the eLink on which the message was received (n bit field)
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 uint32_t GetTsMsbVal() const
For TS MSB data: Returns the TS MSB 22 bit field)
XPU_D uint16_t GetHitTimeFull() const
For Hit data: Returns Full timestamp (10 bit field including 2 bits overlap)
XPU_D uint16_t GetHitTimeBinning() const
XPU_D uint16_t GetStatusLink() const
For Status data: Returns the Link Inedx (9 bit field)
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 kulTsCycleNbBins
static constexpr uint64_t kulTsCycleNbBinsBinning
static constexpr uint32_t kuHitNbTsBins
static constexpr double kdClockCycleNs
static constexpr uint16_t kusLenStatStatus