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
18#include "FairRootManager.h"
19#include "FairRun.h"
20#include "FairRunOnline.h"
21#include "FairRuntimeDb.h"
22#include <Logger.h>
23
24#include "Rtypes.h"
25#include "TCanvas.h"
26#include "TClonesArray.h"
27#include "TF1.h"
28#include "TH1.h"
29#include "TH2.h"
30#include "THStack.h"
31#include "THttpServer.h"
32#include "TMath.h"
33#include "TPaveStats.h"
34#include "TProfile.h"
35#include "TProfile2D.h"
36#include "TROOT.h"
37#include "TString.h"
38#include "TStyle.h"
39#include <TFile.h>
40
41#include <algorithm>
42#include <ctime>
43#include <iomanip>
44#include <iostream>
45
46#include <stdint.h>
47
50
53 , fvMsComponentsList()
54 , fuNbCoreMsPerTs(0)
55 , fuNbOverMsPerTs(0)
56 , fbIgnoreOverlapMs(kFALSE)
57 , fsHistoFileFullname("data/TofPulserHistos.root")
58 , fuMsAcceptsPercent(100)
59 , fuTotalMsNb(0)
60 , fuOverlapMsNb(0)
61 , fuCoreMs(0)
62 , fdMsSizeInNs(0.0)
63 , fdTsCoreSizeInNs(0.0)
64 , fuMinNbGdpb(0)
65 , fuCurrNbGdpb(0)
66 , fUnpackPar()
67 , fuNrOfGdpbs(0)
68 , fuNrOfFeePerGdpb(0)
69 , fuNrOfGet4PerFee(0)
70 , fuNrOfChannelsPerGet4(0)
71 , fuNrOfChannelsPerFee(0)
72 , fuNrOfGet4(0)
73 , fuNrOfGet4PerGdpb(0)
74 , fuNrOfChannelsPerGdpb(0)
75 , fulCurrentTsIndex(0)
76 , fuCurrentMs(0)
77 , fuCurrentMsSysId(0)
78 , fdMsIndex(0)
79 , fuGdpbId(0)
80 , fuGdpbNr(0)
81 , fuGet4Id(0)
82 , fuGet4Nr(0)
83 , fiEquipmentId(0)
84 , fviMsgCounter(11, 0)
85 , // length of enum MessageTypes initialized with 0
86 fvuPadiToGet4()
87 , fvuGet4ToPadi()
88 , fvuElinkToGet4()
89 , fvuGet4ToElink()
90 , fvdPadiThrCodeToValue()
91{
92}
93
95
97{
98 LOG(info) << "Initializing Get4 monitor";
99
100 FairRootManager* ioman = FairRootManager::Instance();
101 if (ioman == NULL) { LOG(fatal) << "No FairRootManager instance"; } // if( ioman == NULL )
102
103 return kTRUE;
104}
105
107{
108 LOG(info) << "Setting parameter containers for " << GetName();
109 fUnpackPar = (CbmMcbm2018TofPar*) (FairRun::Instance()->GetRuntimeDb()->getContainer("CbmMcbm2018TofPar"));
110}
111
113{
114 LOG(info) << "Init parameter containers for " << GetName();
115 Bool_t initOK = ReInitContainers();
116
118
119 return initOK;
120}
121
123{
124 LOG(info) << "ReInit parameter containers for " << GetName();
125
127 LOG(info) << "Nr. of Tof GDPBs: " << fuNrOfGdpbs;
129
131 LOG(info) << "Nr. of FEEs per Tof GDPB: " << fuNrOfFeePerGdpb;
132
134 LOG(info) << "Nr. of GET4 per Tof FEE: " << fuNrOfGet4PerFee;
135
137 LOG(info) << "Nr. of channels per GET4: " << fuNrOfChannelsPerGet4;
138
140 LOG(info) << "Nr. of channels per FEE: " << fuNrOfChannelsPerFee;
141
143 LOG(info) << "Nr. of GET4s: " << fuNrOfGet4;
144
146 LOG(info) << "Nr. of GET4s per GDPB: " << fuNrOfGet4PerGdpb;
147
149 LOG(info) << "Nr. of channels per GDPB: " << fuNrOfChannelsPerGdpb;
150
151 fGdpbIdIndexMap.clear();
152 for (UInt_t i = 0; i < fuNrOfGdpbs; ++i) {
154 LOG(info) << "GDPB Id of TOF " << i << " : " << std::hex << fUnpackPar->GetGdpbId(i) << std::dec;
155 } // for( UInt_t i = 0; i < fuNrOfGdpbs; ++i )
156
158 LOG(info) << "Nr. of GBTx: " << fuNrOfGbtx;
159
165 LOG(info) << "Timeslice parameters: " << fuTotalMsNb << " MS per link, of which " << fuOverlapMsNb
166 << " overlap MS, each MS is " << fdMsSizeInNs << " ns";
167
171 /*
172 UInt_t uGet4topadi[32] = {
173 4, 3, 2, 1, // provided by Jochen
174 24, 23, 22, 21,
175 8, 7, 6, 5,
176 28, 27, 26, 25,
177 12, 11, 10, 9,
178 32, 31, 30, 29,
179 16, 15, 14, 13,
180 20, 19, 18, 17 };
181*/
183 UInt_t uGet4topadi[32] = {4, 3, 2, 1, // provided by Jochen
184 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13, 20, 19,
185 18, 17, 24, 23, 22, 21, 28, 27, 26, 25, 32, 31, 30, 29};
186
187 UInt_t uPaditoget4[32] = {4, 3, 2, 1, // provided by Jochen
188 12, 11, 10, 9, 20, 19, 18, 17, 28, 27, 26, 25, 32, 31,
189 30, 29, 8, 7, 6, 5, 16, 15, 14, 13, 24, 23, 22, 21};
190
191 for (UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan) {
192 fvuPadiToGet4[uChan] = uPaditoget4[uChan] - 1;
193 fvuGet4ToPadi[uChan] = uGet4topadi[uChan] - 1;
194 } // for( UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan )
195
196
200 UInt_t kuElinkToGet4[kuNbGet4PerGbtx] = {27, 2, 7, 3, 31, 26, 30, 1, 33, 37, 32, 13, 9, 14,
201 10, 15, 17, 21, 16, 35, 34, 38, 25, 24, 0, 6, 20, 23,
202 18, 22, 28, 4, 29, 5, 19, 36, 39, 8, 12, 11};
203 UInt_t kuGet4ToElink[kuNbGet4PerGbtx] = {24, 7, 1, 3, 31, 33, 25, 2, 37, 12, 14, 39, 38, 11,
204 13, 15, 18, 16, 28, 34, 26, 17, 29, 27, 23, 22, 5, 0,
205 30, 32, 6, 4, 10, 8, 20, 19, 35, 9, 21, 36};
206
207 for (UInt_t uLinkAsic = 0; uLinkAsic < kuNbGet4PerGbtx; ++uLinkAsic) {
208 fvuElinkToGet4[uLinkAsic] = kuElinkToGet4[uLinkAsic];
209 fvuGet4ToElink[uLinkAsic] = kuGet4ToElink[uLinkAsic];
210 } // for( UInt_t uChan = 0; uChan < fuNrOfChannelsPerFee; ++uChan )
211
213 const UInt_t kuNbThrMeasPoints = 65;
214 UInt_t kuThrMeasCode[kuNbThrMeasPoints] = {
215 0x000, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080, 0x090, 0x0A0, 0x0B0, 0x0C0,
216 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190,
217 0x1A0, 0x1B0, 0x1C0, 0x1D0, 0x1E0, 0x1F0, 0x200, 0x210, 0x220, 0x230, 0x240, 0x250, 0x260,
218 0x270, 0x280, 0x290, 0x2A0, 0x2B0, 0x2C0, 0x2D0, 0x2E0, 0x2F0, 0x300, 0x310, 0x320, 0x330,
219 0x340, 0x350, 0x360, 0x370, 0x380, 0x390, 0x3A0, 0x3B0, 0x3C0, 0x3D0, 0x3E0, 0x3F0, 0x3FF};
220 Double_t kdThrMeasVal[kuNbThrMeasPoints] = {
221 -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,
222 -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,
223 -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,
224 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,
225 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};
226
227 fvdPadiThrCodeToValue.resize(0x3FF + 1, 0.0);
228 for (UInt_t uPadiPoint = 0; uPadiPoint < kuNbThrMeasPoints; ++uPadiPoint) {
229 fvdPadiThrCodeToValue[kuThrMeasCode[uPadiPoint]] = kdThrMeasVal[uPadiPoint];
230
232 if (uPadiPoint + 1 < kuNbThrMeasPoints) {
233 UInt_t uNbSteps = kuThrMeasCode[uPadiPoint + 1] - kuThrMeasCode[uPadiPoint];
234 Double_t dValStep = (kdThrMeasVal[uPadiPoint + 1] - kdThrMeasVal[uPadiPoint]) / uNbSteps;
235 UInt_t uCode = kuThrMeasCode[uPadiPoint];
236 for (UInt_t uStep = 1; uStep < uNbSteps; ++uStep) {
237 uCode++;
238 fvdPadiThrCodeToValue[uCode] = kdThrMeasVal[uPadiPoint] + dValStep * uStep;
239 } // for( UInt_t uStep = 1; uStep < uNbSteps; ++uStep)
240 } // if( uPadiPoint + 1 < kuNbThrMeasPoints )
241 } // for( UInt_t uPadiPoint = 0; uPadiPoint < kuNbThrMeasPoints; ++uPadiPoint )
242
243
244 return kTRUE;
245}
246
247
248void CbmMcbm2018TofFeeThr::AddMsComponentToList(size_t component, UShort_t /*usDetectorId*/)
249{
251 for (UInt_t uCompIdx = 0; uCompIdx < fvMsComponentsList.size(); ++uCompIdx)
252 if (component == fvMsComponentsList[uCompIdx]) return;
253
255 fvMsComponentsList.push_back(component);
256}
257void CbmMcbm2018TofFeeThr::SetNbMsInTs(size_t uCoreMsNb, size_t uOverlapMsNb)
258{
259 fuNbCoreMsPerTs = uCoreMsNb;
260 fuNbOverMsPerTs = uOverlapMsNb;
261
262 // UInt_t uNbMsTotal = fuNbCoreMsPerTs + fuNbOverMsPerTs;
263}
264
266{
267 LOG(info) << "create Histos for " << fuNrOfGdpbs << " gDPBs ";
268
269 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
270
272 new TH2I("hGdpbAsicSpiCounts", "SPI messages count per GDPB and ASIC; ASIC Idx []; GDPB []; SPI msg[]",
274
275 if (server) {
276 server->Register("/", fhGdpbAsicSpiCounts);
277 server->RegisterCommand("/Reset_All_eTOF", "bMcbm2018TofFeeThrResetHistos=kTRUE");
278 server->RegisterCommand("/Save_All_eTof", "bMcbm2018TofFeeThrSaveHistos=kTRUE");
279
280 server->Restrict("/Reset_All_eTof", "allow=admin");
281 server->Restrict("/Save_All_eTof", "allow=admin");
282 } // if( server )
283
284 LOG(info) << "Leaving CreateHistograms";
285}
286
287Bool_t CbmMcbm2018TofFeeThr::DoUnpack(const fles::Timeslice& ts, size_t component)
288{
290 LOG(info) << "Reset eTOF STAR histos ";
293 } // if( bMcbm2018TofFeeThrResetHistos )
295 LOG(info) << "Start saving eTOF STAR histos ";
296 SaveAllHistos("data/histos_Shift_StarTof.root");
298 } // if( bSaveStsHistos )
299
300
301 LOG(debug1) << "Timeslice contains " << ts.num_microslices(component) << "microslices.";
302
304 UInt_t uNbMsLoop = fuNbCoreMsPerTs;
305 if (kFALSE == fbIgnoreOverlapMs) uNbMsLoop += fuNbOverMsPerTs;
306
307 Int_t messageType = -111;
308 // Double_t dTsStartTime = -1;
309
311 for (UInt_t uMsIdx = 0; uMsIdx < uNbMsLoop; uMsIdx++) {
312 if (fuMsAcceptsPercent < uMsIdx) continue;
313
314 fuCurrentMs = uMsIdx;
315
316 if (0 == fulCurrentTsIndex && 0 == uMsIdx) {
317 for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx) {
318 UInt_t uMsComp = fvMsComponentsList[uMsCompIdx];
319 auto msDescriptor = ts.descriptor(uMsComp, uMsIdx);
320 /*
321 LOG(info) << "hi hv eqid flag si sv idx/start crc size offset";
322 LOG(info) << Form( "%02x %02x %04x %04x %02x %02x %016llx %08x %08x %016llx",
323 static_cast<unsigned int>(msDescriptor.hdr_id),
324 static_cast<unsigned int>(msDescriptor.hdr_ver), msDescriptor.eq_id, msDescriptor.flags,
325 static_cast<unsigned int>(msDescriptor.sys_id),
326 static_cast<unsigned int>(msDescriptor.sys_ver), msDescriptor.idx, msDescriptor.crc,
327 msDescriptor.size, msDescriptor.offset );
328*/
329 LOG(info) << FormatMsHeaderPrintout(msDescriptor);
330 } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx )
331 } // if( 0 == fulCurrentTsIndex && 0 == uMsIdx )
332
334 for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx) {
335 constexpr uint32_t kuBytesPerMessage = 8;
336
337 UInt_t uMsComp = fvMsComponentsList[uMsCompIdx];
338 auto msDescriptor = ts.descriptor(uMsComp, uMsIdx);
339 fiEquipmentId = msDescriptor.eq_id;
340 fdMsIndex = static_cast<double>(msDescriptor.idx);
341 fuCurrentMsSysId = static_cast<unsigned int>(msDescriptor.sys_id);
342 const uint8_t* msContent = reinterpret_cast<const uint8_t*>(ts.content(uMsComp, uMsIdx));
343
344 uint32_t size = msDescriptor.size;
345 // fulLastMsIdx = msDescriptor.idx;
346 if (size > 0) LOG(debug) << "Microslice: " << msDescriptor.idx << " has size: " << size;
347
348 // If not integer number of message in input buffer, print warning/error
349 if (0 != (size % kuBytesPerMessage))
350 LOG(error) << "The input microslice buffer does NOT "
351 << "contain only complete nDPB messages!";
352
353 // Compute the number of complete messages in the input microslice buffer
354 uint32_t uNbMessages = (size - (size % kuBytesPerMessage)) / kuBytesPerMessage;
355
356 // Get the gDPB ID from the MS header
358
360 auto it = fGdpbIdIndexMap.find(fuGdpbId);
361 if (it == fGdpbIdIndexMap.end()) {
362 LOG(info) << "---------------------------------------------------------------";
363 /*
364 LOG(info) << "hi hv eqid flag si sv idx/start crc size offset";
365 LOG(info) << Form( "%02x %02x %04x %04x %02x %02x %016llx %08x %08x %016llx",
366 static_cast<unsigned int>(msDescriptor.hdr_id),
367 static_cast<unsigned int>(msDescriptor.hdr_ver), msDescriptor.eq_id, msDescriptor.flags,
368 static_cast<unsigned int>(msDescriptor.sys_id),
369 static_cast<unsigned int>(msDescriptor.sys_ver), msDescriptor.idx, msDescriptor.crc,
370 msDescriptor.size, msDescriptor.offset );
371*/
372 LOG(info) << FormatMsHeaderPrintout(msDescriptor);
373 LOG(warning) << "Could not find the gDPB index for AFCK id 0x" << std::hex << fuGdpbId << std::dec
374 << " in timeslice " << fulCurrentTsIndex << " in microslice " << fdMsIndex << " component "
375 << uMsCompIdx << "\n"
376 << "If valid this index has to be added in the TOF "
377 "parameter file in the RocIdArray field";
378 continue;
379 } // if( it == fGdpbIdIndexMap.end() )
380 else
382
383 // Prepare variables for the loop on contents
384 const uint64_t* pInBuff = reinterpret_cast<const uint64_t*>(msContent);
385 for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx++) {
386 // Fill message
387 uint64_t ulData = static_cast<uint64_t>(pInBuff[uIdx]);
388
390 if (0 == uIdx) { continue; } // if( 0 == uIdx )
391
392 gdpbv100::Message mess(ulData);
393
394 // Increment counter for different message types
395 // and fill the corresponding histogram
396 messageType = mess.getMessageType();
397 fviMsgCounter[messageType]++;
398
402 if (0x90 == fuCurrentMsSysId) fuGet4Id = mess.getGdpbGenChipId();
404
406 LOG(warning) << "Message with Get4 ID too high: " << fuGet4Id << " VS " << fuNrOfGet4PerGdpb
407 << " set in parameters.";
408
409 switch (messageType) {
411 case gdpbv100::MSG_EPOCH: break;
412 case gdpbv100::MSG_SLOWC: {
413 PrintSlcInfo(mess);
414 break;
415 } // case gdpbv100::MSG_SLOWC:
420 case gdpbv100::MSG_STAR_TRI_D: break;
421 default:
422 LOG(error) << "Message type " << std::hex << std::setw(2) << static_cast<uint16_t>(messageType)
423 << " not included in Get4 unpacker.";
424 } // switch( mess.getMessageType() )
425 } // for (uint32_t uIdx = 0; uIdx < uNbMessages; uIdx ++)
426 } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx )
427 } // for( UInt_t uMsIdx = 0; uMsIdx < uNbMsLoop; uMsIdx ++ )
428
429
431
432 return kTRUE;
433}
434
436{
437 if (fGdpbIdIndexMap.end() != fGdpbIdIndexMap.find(fuGdpbId)) {
438 UInt_t uChan = mess.getGdpbSlcChan();
439 UInt_t uEdge = mess.getGdpbSlcEdge();
440 UInt_t uData = mess.getGdpbSlcData();
441 UInt_t uType = mess.getGdpbSlcType();
442
443 // Double_t dGdpbChId = fuGet4Id * fuNrOfChannelsPerGet4 + mess.getGdpbSlcChan() + 0.5 * mess.getGdpbSlcEdge();
444 // Double_t dFullChId = fuGet4Nr * fuNrOfChannelsPerGet4 + mess.getGdpbSlcChan() + 0.5 * mess.getGdpbSlcEdge();
445 Double_t dMessTime = fdMsIndex * 1e-9;
446
448 if (gdpbv100::GET4_32B_SLC_SPIREAD == uType) {
450 LOG(info) << "GET4 Slow Control message, time " << Form("%3.3f", dMessTime) << " s "
451 << " for board ID " << std::hex << std::setw(4) << fuGdpbId << std::dec << "\n"
452 << " +++++++ > Chip = " << std::setw(3) << fuGet4Id << ", Chan = " << std::setw(1) << uChan
453 << ", Edge = " << std::setw(1) << uEdge << ", Type = " << std::setw(1) << mess.getGdpbSlcType() << ", "
454 << Form("channel %1u,", (uData >> 10) & 0xF) << Form("value 0x%03x ", uData & 0x3FF)
455 << Form("level %4.1f ", fvdPadiThrCodeToValue[uData & 0x3FF]) << Form("(Data = 0x%06x) ", uData);
456 } // if( gdpbv100::GET4_32B_SLC_SPIREAD == uType )
457 }
458}
459
461
463{
464 // Printout some stats on what was unpacked
465 TString message_type;
466 for (unsigned int i = 0; i < fviMsgCounter.size(); ++i) {
467 switch (i) {
468 case 0: message_type = "NOP"; break;
469 case 1: message_type = "HIT"; break;
470 case 2: message_type = "EPOCH"; break;
471 case 3: message_type = "SYNC"; break;
472 case 4: message_type = "AUX"; break;
473 case 5: message_type = "EPOCH2"; break;
474 case 6: message_type = "GET4"; break;
475 case 7: message_type = "SYS"; break;
476 case 8: message_type = "GET4_SLC"; break;
477 case 9: message_type = "GET4_32B"; break;
478 case 10: message_type = "GET4_SYS"; break;
479 default: message_type = "UNKNOWN"; break;
480 } // switch(i)
481 LOG(info) << message_type << " messages: " << fviMsgCounter[i];
482 } // for (unsigned int i=0; i< fviMsgCounter.size(); ++i)
483
485 // SaveAllHistos();
486}
487
489{
491 TFile* oldFile = gFile;
492 TDirectory* oldDir = gDirectory;
493
494 TFile* histoFile = NULL;
495 if ("" != sFileName) {
496 // open separate histo file in recreate mode
497 histoFile = new TFile(sFileName, "RECREATE");
498 histoFile->cd();
499 } // if( "" != sFileName )
500
501 if ("" != sFileName) {
502 // Restore original directory position
503 histoFile->Close();
504 } // if( "" != sFileName )
505
507 gFile = oldFile;
508 gDirectory = oldDir;
509}
510
512{
513 LOG(info) << "Reseting all TOF histograms.";
514 fhGdpbAsicSpiCounts->Reset();
515}
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
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.
Int_t GetNrOfGdpbs()
FIXME: replace with method returning the correspondign constants! see Star2019 parameter.
Int_t GetGdpbId(Int_t i)
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