Belle II Software  release-05-01-25
DeSerializerCOPPER.cc
1 //+
2 // File : DeSerializerPC.cc
3 // Description : Module to read COPPER FIFO and store it to DataStore
4 //
5 // Author : Satoru Yamada Itoh, IPNS, KEK
6 // Date : 2 - Aug - 2013
7 //-
8 
9 #include <daq/rawdata/modules/copper.h>
10 #include <daq/rawdata/modules/DeSerializerCOPPER.h>
11 #include <rawdata/dataobjects/PreRawCOPPERFormat_latest.h>
12 
13 #include <sys/ioctl.h>
14 
15 #define CHECKEVT 10000
16 //#define CHECK_SUM
17 //#define DUMMY
18 //#define MAXEVTSIZE 400000000
19 //#define TIME_MONITOR
20 //#define NO_DATA_CHECK
21 //#define WO_FIRST_EVENUM_CHECK
22 //#define YAMADA_DUMMY
23 
24 
25 
26 using namespace std;
27 using namespace Belle2;
28 
29 #ifdef NONSTOP
30 int g_run_resuming = 0;
31 int g_run_pause = 0;
32 int g_run_error = 0;
33 #endif
34 
35 //-----------------------------------------------------------------
36 // Register the Module
37 //-----------------------------------------------------------------
38 REG_MODULE(DeSerializerCOPPER)
39 
40 //-----------------------------------------------------------------
41 // Implementation
42 //-----------------------------------------------------------------
43 
45 {
46  //Set module properties
47  setDescription("Encode DataStore into RingBuffer");
48 
49  // setPropertyFlags(c_Input | c_ParallelProcessingCertified);
50  addParam("FinesseBitFlag", m_finesse_bit_flag, "finesse (A,B,C,D) -> bit (0,1,2,3)", 15);
51 
52  //Parameter definition
53  B2INFO("DeSerializerCOPPER: Constructor done.");
54  m_prev_ftsweve32 = 0xFFFFFFFF;
55 
56  m_cpr_fd = -1;
57 }
58 
59 
60 DeSerializerCOPPERModule::~DeSerializerCOPPERModule()
61 {
62 }
63 
64 void DeSerializerCOPPERModule::initialize()
65 {
66  B2INFO("DeSerializerCOPPER: initialize() started.");
67  // allocate buffer
68  for (int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
69  m_bufary[i] = new int[ BUF_SIZE_WORD ];
70  }
71  m_buffer = new int[ BUF_SIZE_WORD ];
72 
73  //
74  // Initialize basf2 related
75  //
76  for (int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
77  memset(m_bufary[i], 0, BUF_SIZE_WORD * sizeof(int));
78  }
79 
80  // Initialize EvtMetaData
81  m_eventMetaDataPtr.registerInDataStore();
82 
83  // Initialize Array of RawCOPPER
84  // rawcprarray.registerInDataStore();
85  raw_dblkarray.registerInDataStore();
86 
87  if (m_dump_fname.size() > 0) {
88  openOutputFile();
89  }
90  memset(time_array0, 0, sizeof(time_array0));
91  memset(time_array1, 0, sizeof(time_array1));
92  memset(time_array2, 0, sizeof(time_array2));
93  memset(time_array3, 0, sizeof(time_array3));
94  memset(time_array4, 0, sizeof(time_array4));
95  memset(time_array5, 0, sizeof(time_array5));
96 
97  // initialize COPPER
98  initializeCOPPER();
99 
100  //
101  // report ready to SLC
102  //
103  if (m_shmflag > 0) {
104  if (m_nodename.size() == 0 || m_nodeid < 0) {
105  m_shmflag = 0;
106  } else {
107  printf("nodename = %s\n", m_nodename.c_str());
108  g_status.open(m_nodename, m_nodeid);
109  g_status.reportReady();
110  }
111  }
112 
113 #ifdef NONSTOP
114  openRunPauseNshm();
115 #endif
116 
117  B2INFO("DeSerializerCOPPER: initialize() done.");
118 }
119 
120 
121 
122 
123 void DeSerializerCOPPERModule::initializeCOPPER()
124 {
125 
126 #ifndef DUMMY
127  m_use_slot = 0; /* bit mask */
128  int slot_shift;
129 
130  if ((m_finesse_bit_flag & 0x1) == 1) {
131  slot_shift = 0; // a:0, b:1, c:2, d:3
132  m_use_slot |= 1 << slot_shift; //
133  }
134 
135  if (((m_finesse_bit_flag >> 1) & 0x1) == 1) {
136  slot_shift = 1; // a:0, b:1, c:2, d:3
137  m_use_slot |= 1 << slot_shift; //
138  }
139 
140  if (((m_finesse_bit_flag >> 2) & 0x1) == 1) {
141  slot_shift = 2; // a:0, b:1, c:2, d:3
142  m_use_slot |= 1 << slot_shift; //
143  }
144 
145  if (((m_finesse_bit_flag >> 3) & 0x1) == 1) {
146  slot_shift = 3; // a:0, b:1, c:2, d:3
147  m_use_slot |= 1 << slot_shift; //
148  }
149  //
150  // Present slots to use
151  //
152  if (! m_use_slot) {
153  char err_buf[100] = "[FATAL] Slot is not specified. Exiting...";
154  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
155  exit(1);
156  } else {
157  int slot;
158  printf("[DEBUG] ");
159  for (slot = 0; slot < 4; slot++) {
160  if (m_use_slot & (1 << slot)) printf(" %c", 'A' + slot);
161  }
162  printf("\n");
163  }
164 
165 
166 #endif
167 
168 #ifndef YAMADA_DUMMY
169  B2INFO("Opening COPPER...");
170  fflush(stderr);
171  openCOPPER();
172  B2INFO("Done.\n");
173  fflush(stderr);
174 #endif
175 
176 
177 
178 }
179 
180 
181 int* DeSerializerCOPPERModule::readOneEventFromCOPPERFIFO(const int entry, int* delete_flag, int* m_size_word)
182 {
183 
184  // prepare buffer
185  *m_size_word = 0;
186  int* temp_buf = m_bufary[ entry ];
187  temp_buf[0] = BUF_SIZE_WORD ;
188  *delete_flag = 0;
189 
190  //
191  // Read data from HSLB
192  //
193 #ifndef DUMMY
194  int recvd_byte = (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) * sizeof(int);
195  // Firstly, read data with an allocated buffer.
196  while (1) {
197  int read_size = 0;
198  if ((read_size = read(m_cpr_fd, (char*)m_bufary[entry] + recvd_byte, sizeof(int) * BUF_SIZE_WORD - recvd_byte)) < 0) {
199  if (errno == EINTR) {
200  continue;
201  } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
202 
203  if (recvd_byte > (int)((m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) * sizeof(int))) {
204  char err_buf[500];
205  sprintf(err_buf, "[FATAL] EAGAIN return in the middle of an event( COPPER driver should't do this.). Exting...");
206  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
207  exit(-1);
208  }
209 
210 #ifdef NONSTOP
211  // Check run-pause request from SLC
212  string err_str;
213  callCheckRunPause(err_str);
214 #endif
215  continue;
216 
217  } else {
218  char err_buf[500];
219  sprintf(err_buf, "[FATAL] Failed to read data from COPPER. Exiting...");
220  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
221  exit(-1);
222  }
223  } else {
224  recvd_byte += read_size;
225  if (recvd_byte - (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) * sizeof(int) > (int)(sizeof(int) *
226  (m_pre_rawcpr.POS_DATA_LENGTH + 1)))break;
227  }
228  }
229 
230  //
231  // Calcurate data size
232  //
233  *m_size_word = m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH + (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) ]
234  + m_pre_rawcpr.SIZE_COPPER_DRIVER_HEADER + m_pre_rawcpr.SIZE_COPPER_DRIVER_TRAILER
235  + m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS +
236  m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS; // 9 words are COPPER haeder and trailer size.
237 
238  //
239  // If there are data remaining to be read, continue reading
240  //
241  if ((int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) * sizeof(int)) > recvd_byte) {
242 
243  // If event size is larger than BUF_SIZE_WORD, allocate a new buffer
244  if (*m_size_word > BUF_SIZE_WORD) {
245  *delete_flag = 1;
246  temp_buf = new int[ *m_size_word ];
247  memcpy(temp_buf, m_bufary[ entry ], recvd_byte);
248  recvd_byte += readFD(m_cpr_fd, (char*)temp_buf + recvd_byte,
249  (*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) * sizeof(int) - recvd_byte, *delete_flag);
250  } else {
251 
252  recvd_byte += readFD(m_cpr_fd, (char*)(m_bufary[ entry ]) + recvd_byte,
253  (*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) * sizeof(int) - recvd_byte, *delete_flag);
254  }
255 
256  if ((int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) * sizeof(int)) != recvd_byte) {
257  char err_buf[500];
258 
259  sprintf(err_buf, "[FATAL] CORRUPTED DATA: Read less bytes(%d) than expected(%d:%d). Exiting...\n",
260  recvd_byte,
261  *m_size_word * sizeof(int) - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS * sizeof(int),
262  m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH ]);
263  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
264  exit(-1);
265  }
266  } else if ((int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) * sizeof(int)) < recvd_byte) {
267  char err_buf[500];
268  sprintf(err_buf, "[FATAL] CORRUPTED DATA: Read more than data size. Exiting...: %d %d %d %d %d\n",
269  recvd_byte, *m_size_word * sizeof(int) , m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS * sizeof(int),
270  m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH ], m_pre_rawcpr.POS_DATA_LENGTH);
271  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
272  exit(-1);
273  }
274 #else
275  //
276  // Make dummy data
277  //
278  *m_size_word = 256 + entry;
279  m_bufary[entry][0] = *m_size_word;
280 #endif
281 
282  //
283  // Fill Data length
284  //
285  temp_buf[ 0 ] = *m_size_word;
286 
287 
288 #ifdef TIME_MONITOR
289  if (n_basf2evt >= 50000 && n_basf2evt < 50500) {
290  cur_time = getTimeSec();
291  time_array2[ n_basf2evt - 50000 ] = cur_time - m_start_time;
292  }
293 #endif
294 
295 #ifdef CHECK_SUM
296  unsigned int checksum = 0;
297  for (int i = 0; i < m_bufary[entry][0]; i++) {
298  if (i != 2) checksum += m_bufary[entry][i];
299  }
300  m_bufary[entry][2] = checksum;
301 #endif
302  return temp_buf;
303 }
304 
305 
306 
307 
308 void DeSerializerCOPPERModule::openCOPPER()
309 {
310 
311  if (m_cpr_fd != -1) {
312  close(m_cpr_fd);
313  m_cpr_fd = -1;
314  }
315  //
316  // Open a finesse device
317  //
318  if ((m_cpr_fd = open("/dev/copper/copper", O_RDONLY)) == -1) {
319  char err_buf[500];
320  sprintf(err_buf, "[FATAL] Failed to open /dev/copper/copper. Exiting... ");
321  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
322  exit(1);
323  }
324 
325  int set_regval = 15; // How many events to be stored in COPPER FIFO before request for DMA
326  // int set_regval=1;
327  ioctl(m_cpr_fd, CPRIOSET_LEF_WA_FF, &set_regval);
328  ioctl(m_cpr_fd, CPRIOSET_LEF_WB_FF, &set_regval);
329  ioctl(m_cpr_fd, CPRIOSET_LEF_WC_FF, &set_regval);
330  ioctl(m_cpr_fd, CPRIOSET_LEF_WD_FF, &set_regval);
331  ioctl(m_cpr_fd, CPRIOSET_FINESSE_STA, &m_use_slot, sizeof(m_use_slot));
332 
333  int v = 511 - 32;
334 
335  ioctl(m_cpr_fd, CPRIOSET_LEF_WA_AF, &v, sizeof(v));
336  ioctl(m_cpr_fd, CPRIOSET_LEF_WB_AF, &v, sizeof(v));
337  ioctl(m_cpr_fd, CPRIOSET_LEF_WC_AF, &v, sizeof(v));
338  ioctl(m_cpr_fd, CPRIOSET_LEF_WD_AF, &v, sizeof(v));
339 
340 
341  B2INFO("DeSerializerCOPPER: openCOPPER() done.");
342 
343 }
344 
345 
346 
347 int DeSerializerCOPPERModule::readFD(int fd, char* buf, int data_size_byte, int delete_flag)
348 {
349 
350  int n = 0;
351  int read_size = 0;
352  while (1) {
353  if ((read_size = read(fd, (char*)buf + n, data_size_byte - n)) < 0) {
354  if (errno == EINTR) {
355  continue;
356  } else if (errno == EAGAIN || errno == EWOULDBLOCK) {
357  if (n > 0) {
358  char err_buf[500];
359  sprintf(err_buf, "[FATAL] Return due to EAGAIN in the middle of an event( COPPER driver would't do this.). Exting...");
360  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
361  exit(-1);
362  }
363 #ifdef NONSTOP
364  // Check run-pause request from SLC
365  string err_str;
366  try {
367  callCheckRunPause(err_str);
368  } catch (string err_str) {
369  if (delete_flag) {
370  // Delete allocated buffer
371  B2WARNING("Delete buffer before going to Run-pause state");
372  delete buf;
373  }
374  throw (err_str);
375  }
376 #endif
377  continue;
378  } else {
379 #ifdef NONSTOP
380  g_run_error = 1;
381  printf("[ERROR] Failed to read data from COPPER. %s %s %d",
382  __FILE__, __PRETTY_FUNCTION__, __LINE__);
383  string err_str = "RUN_ERROR";
384  throw (err_str);
385 #endif
386  char err_buf[500];
387  sprintf(err_buf, "[FATAL] Failed to read data from COPPER. %s %s %d",
388  __FILE__, __PRETTY_FUNCTION__, __LINE__);
389  print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
390  exit(-1);
391  }
392  } else {
393  n += read_size;
394  if (n == data_size_byte)break;
395  }
396  }
397  return n;
398 }
399 
400 #ifdef NONSTOP
401 void DeSerializerCOPPERModule::resumeRun()
402 {
403 #ifdef NONSTOP_DEBUG
404  printf("\033[31m");
405  printf("###########(DesCpr) Resume from PAUSE ###############\n");
406  printf("\033[0m");
407  fflush(stdout);
408 #endif
409  initializeCOPPER();
410  g_run_error = 0;
411  g_run_resuming = 1;
412  m_start_flag = 0;
413  return;
414 }
415 
416 void DeSerializerCOPPERModule::waitResume()
417 {
418  // First, wait for run_pause
419  if (g_run_pause == 0 && g_run_error == 1) {
420  while (true) {
421 #ifdef NONSTOP_DEBUG
422  printf("\033[31m");
423  printf("###########(DesCpr) Error stop. Waiting for RUNPAUSE ###############\n");
424  printf("\033[0m");
425  fflush(stdout);
426 #endif
427  if (checkRunPause()) break;
428  sleep(1);
429  }
430  }
431 
432  // close COPPER FIFO
433  if (m_cpr_fd != -1) close(m_cpr_fd);
434  m_cpr_fd = -1;
435  while (true) {
436  if (checkRunRecovery()) {
437  g_run_pause = 0;
438  g_run_error = 0;
439  g_run_resuming = 1;
440  resumeRun();
441 
442 #ifdef NONSTOP_DEBUG
443  printf("\033[31m");
444  printf("###########(DesCpr) Resume detected ###############\n");
445  printf("\033[0m");
446  fflush(stdout);
447 #endif
448  break;
449  }
450 #ifdef NONSTOP_DEBUG
451  printf("\033[31m");
452  printf("###########(DesCpr) Waiting for RESUME ###############\n");
453  printf("\033[0m");
454  fflush(stdout);
455 #endif
456  sleep(1);
457  }
458  return;
459 }
460 
461 #endif
462 
463 void DeSerializerCOPPERModule::event()
464 {
465 
466 #ifdef NONSTOP
467  // Check run-pause request
468  if (g_run_pause > 0 || g_run_error > 0) {
469  waitResume(); // Stand-by loop
470  m_eventMetaDataPtr.create(); // Otherwise endRun() is called.
471  return;
472  }
473 #endif
474 
475  if (m_start_flag == 0) {
476  // Use shared memory to start(for HSLB dummy data)
477 
478  if (g_status.isAvailable()) {
479  B2INFO("DeSerializerCOPPER: Waiting for Start...\n");
480  g_status.reportRunning();
481  }
482 
483  m_start_time = getTimeSec();
484  n_basf2evt = 0;
485 #ifdef YAMADA_DUMMY
486  B2INFO("Opening COPPER...");
487  fflush(stderr);
488  openCOPPER();
489  B2INFO("Done.\n");
490  fflush(stderr);
491 #endif
492  }
493 
494 
495  RawDataBlock* temp_rawdblk;
496  for (int j = 0; j < NUM_EVT_PER_BASF2LOOP_COPPER; j++) {
497  int m_size_word = 0;
498  int delete_flag = 0;
499  if (m_start_flag == 0) {
500  B2INFO("DeSerializerCOPPER: Reading the 1st event from COPPER FIFO...");
501  }
502 
503  int* temp_buf;
504  try {
505  temp_buf = readOneEventFromCOPPERFIFO(j, &delete_flag, &m_size_word);
506  g_status.copyEventHeader(temp_buf);
507  } catch (string err_str) {
508 
509 #ifdef NONSTOP
510  if (err_str == "RUN_PAUSE" || err_str == "RUN_ERROR") {
511  // Create EventMetaData otherwise endRun() is called.
512  m_eventMetaDataPtr.create();
513  return;
514  }
515 #endif
516  print_err.PrintError(m_shmflag, &g_status, err_str);
517  exit(1);
518  }
519 
520  if (m_start_flag == 0) {
521  B2INFO("DeSerializerCOPPER: Done. the size of the 1st event is " << m_size_word << "words");
522  m_start_flag = 1;
523  }
524 
525  const int num_nodes = 1;
526  const int num_events = 1;
527  temp_rawdblk = raw_dblkarray.appendNew();
528  temp_rawdblk->SetBuffer(temp_buf, m_size_word, delete_flag, num_events, num_nodes);
529  // Fill Header and Trailer
530 
531  PreRawCOPPERFormat_latest temp_rawcopper;
532  temp_rawcopper.SetBuffer(temp_buf, m_size_word, 0, num_events, num_nodes);
533 
534  // Fill header and trailer
535  try {
536  m_prev_ftsweve32 = temp_rawcopper.FillTopBlockRawHeader(m_nodeid, m_prev_ftsweve32, m_prev_exprunsubrun_no, &m_exprunsubrun_no);
537  m_prev_exprunsubrun_no = m_exprunsubrun_no;
538  // fillNewRawCOPPERHeader( &temp_rawcopper );
539  } catch (string err_str) {
540  print_err.PrintError(m_shmflag, &g_status, err_str);
541  exit(1);
542  }
543 
544  if (m_dump_fname.size() > 0) {
545  dumpData((char*)temp_buf, m_size_word * sizeof(int));
546  }
547  m_totbytes += m_size_word * sizeof(int);
548  }
549 
550 
551  //
552  // Update EventMetaData
553  //
554  m_eventMetaDataPtr.create();
555  m_eventMetaDataPtr->setExperiment(0);
556  m_eventMetaDataPtr->setRun(0);
557  m_eventMetaDataPtr->setEvent(n_basf2evt);
558 
559  //
560  // Monitor
561  //
562  if (max_nevt >= 0 || max_seconds >= 0.) {
563  if ((n_basf2evt * NUM_EVT_PER_BASF2LOOP_PC >= max_nevt && max_nevt > 0)
564  || (getTimeSec() - m_start_time > max_seconds && max_seconds > 0.)) {
565  printf("[DEBUG] RunPause was detected. ( Setting: Max event # %d MaxTime %lf ) Processed Event %d Elapsed Time %lf[s]\n",
566  max_nevt , max_seconds, n_basf2evt * NUM_EVT_PER_BASF2LOOP_PC, getTimeSec() - m_start_time);
567  m_eventMetaDataPtr->setEndOfData();
568  }
569  }
570 
571  //
572  // Print current status
573  //
574  // if (n_basf2evt % 100 == 0 || n_basf2evt < 10) {
575  if (n_basf2evt % 100 == 0) {
576  RateMonitor(m_prev_ftsweve32, m_prev_exprunsubrun_no & RawHeader_latest::SUBRUNNO_MASK ,
577  (m_prev_exprunsubrun_no & RawHeader_latest::RUNNO_MASK) >> RawHeader_latest::RUNNO_SHIFT);
578  }
579  n_basf2evt++;
580  if (g_status.isAvailable()) {
581  g_status.setInputNBytes(m_totbytes);
582  g_status.setInputCount(m_prev_ftsweve32 + 1);
583  }
584  return;
585 }
586 
Belle2::RawDataBlock::SetBuffer
virtual void SetBuffer(int *bufin, int nwords, int delete_flag, int num_events, int num_nodes)
set buffer ( delete_flag : m_buffer is freeed( = 0 )/ not freeed( = 1 ) in Destructer )
Definition: RawDataBlock.cc:35
Belle2::DeSerializerCOPPERModule
A class definition of an input module for Sequential ROOT I/O.
Definition: DeSerializerCOPPER.h:31
Belle2::RawDataBlockFormat::SetBuffer
virtual void SetBuffer(int *bufin, int nwords, int delete_flag, int num_events, int num_nodes)
set buffer ( delete_flag : m_buffer is freeed( = 0 )/ not freeed( = 1 ) in Destructer )
Definition: RawDataBlockFormat.cc:131
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::PreRawCOPPERFormat_latest
The Raw COPPER class ver.1 ( the latest version since May, 2014 ) This class stores data received by ...
Definition: PreRawCOPPERFormat_latest.h:30
Belle2::PreRawCOPPERFormat_latest::FillTopBlockRawHeader
unsigned int FillTopBlockRawHeader(unsigned int m_node_id, unsigned int prev_eve32, unsigned int prev_exprunsubrun_no, unsigned int *cur_exprunsubrun_no) OVERRIDE_CPP17
should be called by DeSerializerCOPPER.cc and fill contents in RawHeader
Definition: PreRawCOPPERFormat_latest.cc:407
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::DeSerializerModule
A class definition of an input module for Sequential ROOT I/O.
Definition: DeSerializer.h:36
Belle2::RawDataBlock
The RawDataBlock class Base class for rawdata handling.
Definition: RawDataBlock.h:27