CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018TofFeeThr.cxx
Go to the documentation of this file.
1/* Copyright (C) 2018-2021 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
5// -----------------------------------------------------------------------------
6// ----- -----
7// ----- CbmMcbm2018TofFeeThr -----
8// ----- Created 10.07.2018 by P.-A. Loizeau -----
9// ----- -----
10// -----------------------------------------------------------------------------
11
13
15#include "CbmHistManager.h"
16#include "CbmMcbm2018TofPar.h"
17#include "FairRootManager.h"
18#include "FairRun.h"
19#include "FairRunOnline.h"
20#include "FairRuntimeDb.h"
21#include "Rtypes.h"
22#include "TCanvas.h"
23#include "TClonesArray.h"
24#include "TF1.h"
25#include "TH1.h"
26#include "TH2.h"
27#include "THStack.h"
28#include "THttpServer.h"
29#include "TMath.h"
30#include "TPaveStats.h"
31#include "TProfile.h"
32#include "TProfile2D.h"
33#include "TROOT.h"
34#include "TString.h"
35#include "TStyle.h"
36
37#include <Logger.h>
38
39#include <TFile.h>
40
41#include <algorithm>
42#include <cstdint>
43#include <ctime>
44#include <iomanip>
45#include <iostream>
46
49
55 , fbIgnoreOverlapMs(kFALSE)
56 , fsHistoFileFullname("data/TofPulserHistos.root")
58 , fuTotalMsNb(0)
59 , fuOverlapMsNb(0)
60 , fuCoreMs(0)
61 , fdMsSizeInNs(0.0)
62 , fdTsCoreSizeInNs(0.0)
63 , fuMinNbGdpb(0)
64 , fuCurrNbGdpb(0)
65 , fUnpackPar()
66 , fuNrOfGdpbs(0)
71 , fuNrOfGet4(0)
75 , fuCurrentMs(0)
77 , fdMsIndex(0)
78 , fuGdpbId(0)
79 , fuGdpbNr(0)
80 , fuGet4Id(0)
81 , fuGet4Nr(0)
82 , fiEquipmentId(0)
83 , fviMsgCounter(11, 0)
84 , // length of enum MessageTypes initialized with 0
90{
91}
92
94
96{
97 LOG(info) << "Initializing Get4 monitor";
98
99 FairRootManager* ioman = FairRootManager::Instance();
100 if (ioman == NULL) { LOG(fatal) << "No FairRootManager instance"; } // if( ioman == NULL )
101
102 return kTRUE;
103}
104
106{
107 LOG(info) << "Setting parameter containers for " << GetName();
108 fUnpackPar = (CbmMcbm2018TofPar*) (FairRun::Instance()->GetRuntimeDb()->getContainer("CbmMcbm2018TofPar"));
109}
110
112{
113 LOG(info) << "Init parameter containers for " << GetName();
114 Bool_t initOK = ReInitContainers();
115
117
118 return initOK;
119}
120
122{
123 LOG(info) << "ReInit parameter containers for " << GetName();
124
125 fuNrOfGdpbs = fUnpackPar->GetNrOfGdpbs();
126 LOG(info) << "Nr. of Tof GDPBs: " << fuNrOfGdpbs;
128
129 fuNrOfFeePerGdpb = fUnpackPar->GetNrOfFeesPerGdpb();
130 LOG(info) << "Nr. of FEEs per Tof GDPB: " << fuNrOfFeePerGdpb;
131
132 fuNrOfGet4PerFee = fUnpackPar->GetNrOfGet4PerFee();
133 LOG(info) << "Nr. of GET4 per Tof FEE: " << fuNrOfGet4PerFee;
134
135 fuNrOfChannelsPerGet4 = fUnpackPar->GetNrOfChannelsPerGet4();
136 LOG(info) << "Nr. of channels per GET4: " << fuNrOfChannelsPerGet4;
137
139 LOG(info) << "Nr. of channels per FEE: " << fuNrOfChannelsPerFee;
140
142 LOG(info) << "Nr. of GET4s: " << fuNrOfGet4;
143
145 LOG(info) << "Nr. of GET4s per GDPB: " << fuNrOfGet4PerGdpb;
146
148 LOG(info) << "Nr. of channels per GDPB: " << fuNrOfChannelsPerGdpb;
149
150 fGdpbIdIndexMap.clear();
151 for (UInt_t i = 0; i < fuNrOfGdpbs; ++i) {
152 fGdpbIdIndexMap[fUnpackPar->GetGdpbId(i)] = i;
153 LOG(info) << "GDPB Id of TOF " << i << " : " << std::hex << fUnpackPar->GetGdpbId(i) << std::dec;
154 } // for( UInt_t i = 0; i < fuNrOfGdpbs; ++i )
155
156 fuNrOfGbtx = fUnpackPar->GetNrOfGbtx();
157 LOG(info) << "Nr. of GBTx: " << fuNrOfGbtx;
158
159 fuTotalMsNb = fUnpackPar->GetNbMsTot();
160 fuOverlapMsNb = fUnpackPar->GetNbMsOverlap();
162 fdMsSizeInNs = fUnpackPar->GetSizeMsInNs();
164 LOG(info) << "Timeslice parameters: " << fuTotalMsNb << " MS per link, of which " << fuOverlapMsNb
165 << " overlap MS, each MS is " << fdMsSizeInNs << " ns";
166
170 /*
171 UInt_t uGet4topadi[32] = {
172 4, 3, 2, 1, // provided by Jochen
173 24, 23, 22, 21,
174 8, 7, 6, 5,
175 28, 27, 26, 25,
176 12, 11, 10, 9,
177 32, 31, 30, 29,
178 16, 15, 14, 13,
179 20, 19, 18, 17 };
180*/
182 UInt_t uGet4topadi[32] = {4, 3, 2, 1, // provided by Jochen
183 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13, 20, 19,
184 18, 17, 24, 23, 22, 21, 28, 27, 26, 25, 32, 31, 30, 29};
185
186 UInt_t uPaditoget4[32] = {4, 3, 2, 1, // provided by Jochen
187 12, 11, 10, 9, 20, 19, 18, 17, 28, 27, 26, 25, 32, 31,
188 30, 29, 8, 7, 6, 5, 16, 15, 14, 13, 24, 23, 22, 21};
189
190 for (UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan) {
191 fvuPadiToGet4[uChan] = uPaditoget4[uChan] - 1;
192 fvuGet4ToPadi[uChan] = uGet4topadi[uChan] - 1;
193 } // for( UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan )
194
195
199 UInt_t kuElinkToGet4[kuNbGet4PerGbtx] = {27, 2, 7, 3, 31, 26, 30, 1, 33, 37, 32, 13, 9, 14,
200 10, 15, 17, 21, 16, 35, 34, 38, 25, 24, 0, 6, 20, 23,
201 18, 22, 28, 4, 29, 5, 19, 36, 39, 8, 12, 11};
202 UInt_t kuGet4ToElink[kuNbGet4PerGbtx] = {24, 7, 1, 3, 31, 33, 25, 2, 37, 12, 14, 39, 38, 11,
203 13, 15, 18, 16, 28, 34, 26, 17, 29, 27, 23, 22, 5, 0,
204 30, 32, 6, 4, 10, 8, 20, 19, 35, 9, 21, 36};
205
206 for (UInt_t uLinkAsic = 0; uLinkAsic < kuNbGet4PerGbtx; ++uLinkAsic) {
207 fvuElinkToGet4[uLinkAsic] = kuElinkToGet4[uLinkAsic];
208 fvuGet4ToElink[uLinkAsic] = kuGet4ToElink[uLinkAsic];
209 } // for( UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan )
210
212 const UInt_t kuNbThrMeasPoints = 65;
213 UInt_t kuThrMeasCode[kuNbThrMeasPoints] = {
214 0x000, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080, 0x090, 0x0A0, 0x0B0, 0x0C0,
215 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190,
216 0x1A0, 0x1B0, 0x1C0, 0x1D0, 0x1E0, 0x1F0, 0x200, 0x210, 0x220, 0x230, 0x240, 0x250, 0x260,
217 0x270, 0x280, 0x290, 0x2A0, 0x2B0, 0x2C0, 0x2D0, 0x2E0, 0x2F0, 0x300, 0x310, 0x320, 0x330,
218 0x340, 0x350, 0x360, 0x370, 0x380, 0x390, 0x3A0, 0x3B0, 0x3C0, 0x3D0, 0x3E0, 0x3F0, 0x3FF};
219 Double_t kdThrMeasVal[kuNbThrMeasPoints] = {
220 -652.6, -631.2, -611.4, -590.6, -570.9, -550.0, -529.9, -509.4, -490.6, -469.5, -449.3, -428.5, -408.5,
221 -388.2, -367.8, -347.2, -329.2, -308.2, -287.5, -266.8, -246.9, -226.0, -205.6, -185.0, -165.7, -144.9,
222 -124.4, -103.8, -83.4, -62.9, -42.4, -21.2, -5.3, 15.5, 36.2, 56.8, 77.3, 97.8, 118.4,
223 139.1, 158.7, 179.2, 199.7, 220.2, 240.8, 261.1, 281.7, 302.2, 321.3, 341.4, 362.0, 382.2,
224 402.9, 422.8, 443.4, 463.7, 483.7, 503.7, 524.1, 544.3, 565.0, 585.0, 605.5, 626.0, 646.1};
225
226 fvdPadiThrCodeToValue.resize(0x3FF + 1, 0.0);
227 for (UInt_t uPadiPoint = 0; uPadiPoint < kuNbThrMeasPoints; ++uPadiPoint) {
228 fvdPadiThrCodeToValue[kuThrMeasCode[uPadiPoint]] = kdThrMeasVal[uPadiPoint];
229
231 if (uPadiPoint + 1 < kuNbThrMeasPoints) {
232 UInt_t uNbSteps = kuThrMeasCode[uPadiPoint + 1] - kuThrMeasCode[uPadiPoint];
233 Double_t dValStep = (kdThrMeasVal[uPadiPoint + 1] - kdThrMeasVal[uPadiPoint]) / uNbSteps;
234 UInt_t uCode = kuThrMeasCode[uPadiPoint];
235 for (UInt_t uStep = 1; uStep < uNbSteps; ++uStep) {
236 uCode++;
237 fvdPadiThrCodeToValue[uCode] = kdThrMeasVal[uPadiPoint] + dValStep * uStep;
238 } // for( UInt_t uStep = 1; uStep < uNbSteps; ++uStep)
239 } // if( uPadiPoint + 1 < kuNbThrMeasPoints )
240 } // for( UInt_t uPadiPoint = 0; uPadiPoint < kuNbThrMeasPoints; ++uPadiPoint )
241
242
243 return kTRUE;
244}
245
246
247void CbmMcbm2018TofFeeThr::AddMsComponentToList(size_t component, UShort_t /*usDetectorId*/)
248{
250 for (UInt_t uCompIdx = 0; uCompIdx < fvMsComponentsList.size(); ++uCompIdx)
251 if (component == fvMsComponentsList[uCompIdx]) return;
252
254 fvMsComponentsList.push_back(component);
255}
256void CbmMcbm2018TofFeeThr::SetNbMsInTs(size_t uCoreMsNb, size_t uOverlapMsNb)
257{
258 fuNbCoreMsPerTs = uCoreMsNb;
259 fuNbOverMsPerTs = uOverlapMsNb;
260
261 // UInt_t uNbMsTotal = fuNbCoreMsPerTs + fuNbOverMsPerTs;
262}
263
265{
266 LOG(info) << "create Histos for " << fuNrOfGdpbs << " gDPBs ";
267
268 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
269
271 new TH2I("hGdpbAsicSpiCounts", "SPI messages count per GDPB and ASIC; ASIC Idx []; GDPB []; SPI msg[]",
273
274 if (server) {
275 server->Register("/", fhGdpbAsicSpiCounts);
276 server->RegisterCommand("/Reset_All_eTOF", "bMcbm2018TofFeeThrResetHistos=kTRUE");
277 server->RegisterCommand("/Save_All_eTof", "bMcbm2018TofFeeThrSaveHistos=kTRUE");
278
279 server->Restrict("/Reset_All_eTof", "allow=admin");
280 server->Restrict("/Save_All_eTof", "allow=admin");
281 } // if( server )
282
283 LOG(info) << "Leaving CreateHistograms";
284}
285
286Bool_t CbmMcbm2018TofFeeThr::DoUnpack(const fles::Timeslice& ts, size_t component)
287{
289 LOG(info) << "Reset eTOF STAR histos ";
292 } // if( bMcbm2018TofFeeThrResetHistos )
294 LOG(info) << "Start saving eTOF STAR histos ";
295 SaveAllHistos("data/histos_Shift_StarTof.root");
297 } // if( bSaveStsHistos )
298
299
300 LOG(debug1) << "Timeslice contains " << ts.num_microslices(component) << "microslices.";
301
303 UInt_t uNbMsLoop = fuNbCoreMsPerTs;
304 if (kFALSE == fbIgnoreOverlapMs) uNbMsLoop += fuNbOverMsPerTs;
305
306 Int_t messageType = -111;
307 // Double_t dTsStartTime = -1;
308
310 for (UInt_t uMsIdx = 0; uMsIdx < uNbMsLoop; uMsIdx++) {
311 if (fuMsAcceptsPercent < uMsIdx) continue;
312
313 fuCurrentMs = uMsIdx;
314
315 if (0 == fulCurrentTsIndex && 0 == uMsIdx) {
316 for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx) {
317 UInt_t uMsComp = fvMsComponentsList[uMsCompIdx];
318 auto msDescriptor = ts.descriptor(uMsComp, uMsIdx);
319 /*
320 LOG(info) << "hi hv eqid flag si sv idx/start crc size offset";
321 LOG(info) << Form( "%02x %02x %04x %04x %02x %02x %016llx %08x %08x %016llx",
322 static_cast<unsigned int>(msDescriptor.hdr_id),
323 static_cast<unsigned int>(msDescriptor.hdr_ver), msDescriptor.eq_id, msDescriptor.flags,
324 static_cast<unsigned int>(msDescriptor.sys_id),
325 static_cast<unsigned int>(msDescriptor.sys_ver), msDescriptor.idx, msDescriptor.crc,
326 msDescriptor.size, msDescriptor.offset );
327*/
328 LOG(info) << FormatMsHeaderPrintout(msDescriptor);
329 } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx )
330 } // if( 0 == fulCurrentTsIndex && 0 == uMsIdx )
331
333 for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx) {
334 constexpr uint32_t kuBytesPerMessage = 8;
335
336 UInt_t uMsComp = fvMsComponentsList[uMsCompIdx];
337 auto msDescriptor = ts.descriptor(uMsComp, uMsIdx);
338 fiEquipmentId = msDescriptor.eq_id;
339 fdMsIndex = static_cast<double>(msDescriptor.idx);
340 fuCurrentMsSysId = static_cast<unsigned int>(msDescriptor.sys_id);
341 const uint8_t* msContent = reinterpret_cast<const uint8_t*>(ts.content(uMsComp, uMsIdx));
342
343 uint32_t size = msDescriptor.size;
344 // fulLastMsIdx = msDescriptor.idx;
345 if (size > 0) LOG(debug) << "Microslice: " << msDescriptor.idx << " has size: " << size;
346
347 // If not integer number of message in input buffer, print warning/error
348 if (0 != (size % kuBytesPerMessage))
349 LOG(error) << "The input microslice buffer does NOT "
350 << "contain only complete nDPB messages!";
351
352 // Compute the number of complete messages in the input microslice buffer
353 uint32_t uNbMessages = (size - (size % kuBytesPerMessage)) / kuBytesPerMessage;
354
355 // Get the gDPB ID from the MS header
357
359 auto it = fGdpbIdIndexMap.find(fuGdpbId);
360 if (it == fGdpbIdIndexMap.end()) {
361 LOG(info) << "---------------------------------------------------------------";
362 /*
363 LOG(info) << "hi hv eqid flag si sv idx/start crc size offset";
364 LOG(info) << Form( "%02x %02x %04x %04x %02x %02x %016llx %08x %08x %016llx",
365 static_cast<unsigned int>(msDescriptor.hdr_id),
366 static_cast<unsigned int>(msDescriptor.hdr_ver), msDescriptor.eq_id, msDescriptor.flags,
367 static_cast<unsigned int>(msDescriptor.sys_id),
368 static_cast<unsigned int>(msDescriptor.sys_ver), msDescriptor.idx, msDescriptor.crc,
369 msDescriptor.size, msDescriptor.offset );
370*/
371 LOG(info) << FormatMsHeaderPrintout(msDescriptor);
372 LOG(warning) << "Could not find the gDPB index for AFCK id 0x" << std::hex << fuGdpbId << std::dec
373 << " in timeslice " << fulCurrentTsIndex << " in microslice " << fdMsIndex << " component "
374 << uMsCompIdx << "\n"
375 << "If valid this index has to be added in the TOF "
376 "parameter file in the RocIdArray field";
377 continue;
378 } // if( it == fGdpbIdIndexMap.end() )
379 else
381
382 // Prepare variables for the loop on contents
383 const uint64_t* pInBuff = reinterpret_cast<const uint64_t*>(msContent);
384 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
385 // Fill message
386 uint64_t ulData = static_cast<uint64_t>(pInBuff[uIdx]);
387
389 if (0 == uIdx) { continue; } // if( 0 == uIdx )
390
391 gdpbv100::Message mess(ulData);
392
393 // Increment counter for different message types
394 // and fill the corresponding histogram
395 messageType = mess.getMessageType();
396 fviMsgCounter[messageType]++;
397
401 if (0x90 == fuCurrentMsSysId) fuGet4Id = mess.getGdpbGenChipId();
403
405 LOG(warning) << "Message with Get4 ID too high: " << fuGet4Id << " VS " << fuNrOfGet4PerGdpb
406 << " set in parameters.";
407
408 switch (messageType) {
410 case gdpbv100::MSG_EPOCH: break;
411 case gdpbv100::MSG_SLOWC: {
412 PrintSlcInfo(mess);
413 break;
414 } // case gdpbv100::MSG_SLOWC:
419 case gdpbv100::MSG_STAR_TRI_D: break;
420 default:
421 LOG(error) << "Message type " << std::hex << std::setw(2) << static_cast<uint16_t>(messageType)
422 << " not included in Get4 unpacker.";
423 } // switch( mess.getMessageType() )
424 } // for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx ++)
425 } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx )
426 } // for( UInt_t uMsIdx = 0; uMsIdx < uNbMsLoop; uMsIdx ++ )
427
428
430
431 return kTRUE;
432}
433
435{
436 if (fGdpbIdIndexMap.end() != fGdpbIdIndexMap.find(fuGdpbId)) {
437 UInt_t uChan = mess.getGdpbSlcChan();
438 UInt_t uEdge = mess.getGdpbSlcEdge();
439 UInt_t uData = mess.getGdpbSlcData();
440 UInt_t uType = mess.getGdpbSlcType();
441
442 // Double_t dGdpbChId = fuGet4Id * fuNrOfChannelsPerGet4 + mess.getGdpbSlcChan() + 0.5 * mess.getGdpbSlcEdge();
443 // Double_t dFullChId = fuGet4Nr * fuNrOfChannelsPerGet4 + mess.getGdpbSlcChan() + 0.5 * mess.getGdpbSlcEdge();
444 Double_t dMessTime = fdMsIndex * 1e-9;
445
447 if (gdpbv100::GET4_32B_SLC_SPIREAD == uType) {
449 LOG(info) << "GET4 Slow Control message, time " << Form("%3.3f", dMessTime) << " s "
450 << " for board ID " << std::hex << std::setw(4) << fuGdpbId << std::dec << "\n"
451 << " +++++++ > Chip = " << std::setw(3) << fuGet4Id << ", Chan = " << std::setw(1) << uChan
452 << ", Edge = " << std::setw(1) << uEdge << ", Type = " << std::setw(1) << mess.getGdpbSlcType() << ", "
453 << Form("channel %1u,", (uData >> 10) & 0xF) << Form("value 0x%03x ", uData & 0x3FF)
454 << Form("level %4.1f ", fvdPadiThrCodeToValue[uData & 0x3FF]) << Form("(Data = 0x%06x) ", uData);
455 } // if( gdpbv100::GET4_32B_SLC_SPIREAD == uType )
456 }
457}
458
460
462{
463 // Printout some stats on what was unpacked
464 TString message_type;
465 for (unsigned int i = 0; i < fviMsgCounter.size(); ++i) {
466 switch (i) {
467 case 0: message_type = "NOP"; break;
468 case 1: message_type = "HIT"; break;
469 case 2: message_type = "EPOCH"; break;
470 case 3: message_type = "SYNC"; break;
471 case 4: message_type = "AUX"; break;
472 case 5: message_type = "EPOCH2"; break;
473 case 6: message_type = "GET4"; break;
474 case 7: message_type = "SYS"; break;
475 case 8: message_type = "GET4_SLC"; break;
476 case 9: message_type = "GET4_32B"; break;
477 case 10: message_type = "GET4_SYS"; break;
478 default: message_type = "UNKNOWN"; break;
479 } // switch(i)
480 LOG(info) << message_type << " messages: " << fviMsgCounter[i];
481 } // for (unsigned int i=0; i< fviMsgCounter.size(); ++i)
482
484 // SaveAllHistos();
485}
486
488{
490 TFile* oldFile = gFile;
491 TDirectory* oldDir = gDirectory;
492
493 TFile* histoFile = NULL;
494 if ("" != sFileName) {
495 // open separate histo file in recreate mode
496 histoFile = new TFile(sFileName, "RECREATE");
497 histoFile->cd();
498 } // if( "" != sFileName )
499
500 if ("" != sFileName) {
501 // Restore original directory position
502 histoFile->Close();
503 } // if( "" != sFileName )
504
506 gFile = oldFile;
507 gDirectory = oldDir;
508}
509
511{
512 LOG(info) << "Reseting all TOF histograms.";
513 fhGdpbAsicSpiCounts->Reset();
514}
ClassImp(CbmConverterManager)
std::string FormatMsHeaderPrintout(const fles::MicrosliceDescriptor &msDescriptor)
Histogram manager.
Bool_t bMcbm2018TofFeeThrResetHistos
Bool_t bMcbm2018TofFeeThrSaveHistos
static constexpr size_t size()
Definition KfSimdPseudo.h:2
int Int_t
bool Bool_t
virtual Bool_t DoUnpack(const fles::Timeslice &ts, size_t component)
std::vector< UInt_t > fvuPadiToGet4
std::vector< UInt_t > fvuGet4ToPadi
TString fsHistoFileFullname
/‍** Ignore Overlap Ms: all fuOverlapMsNb MS at the end of timeslice **‍/
CbmMcbm2018TofPar * fUnpackPar
virtual void SetNbMsInTs(size_t uCoreMsNb, size_t uOverlapMsNb)
size_t fuMsAcceptsPercent
OLD, to be cleaned out !!!!!
std::vector< UInt_t > fvuGet4ToElink
std::vector< Double_t > fvdPadiThrCodeToValue
PADI threshold measures and extrapolated code to value map.
void SaveAllHistos(TString sFileName="")
TH2 * fhGdpbAsicSpiCounts
Histograms.
static const UInt_t kuNbGet4PerGbtx
std::map< UInt_t, UInt_t > fGdpbIdIndexMap
Map of ID to index for the gDPBs.
virtual void AddMsComponentToList(size_t component, UShort_t usDetectorId)
std::vector< UInt_t > fvuElinkToGet4
5 FEE with 8 GET4 each
void PrintSlcInfo(gdpbv100::Message)
UInt_t ConvertElinkToGet4(UInt_t uElinkIdx)
std::vector< int > fviMsgCounter
std::vector< size_t > fvMsComponentsList
FLES containers.
uint32_t getGdpbSlcChan() const
uint32_t getGdpbSlcData() const
uint32_t getGdpbSlcType() const
bool isStarTrigger() const
Returns true is message type is MSG_STAR_TRI_A, _B, _C, _D (STAR Trigger message)
uint16_t getGdpbGenChipId() const
uint32_t getGdpbSlcEdge() const
uint8_t getMessageType() const
Returns the message type. Valid for all message types. 4 bit.
@ GET4_32B_SLC_SPIREAD
const uint32_t kuChipIdMergedEpoch