REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestRawBiPoToSignalProcess.cxx
1 /*************************************************************************
2  * This file is part of the REST software framework. *
3  * *
4  * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) *
5  * For more information see http://gifna.unizar.es/trex *
6  * *
7  * REST is free software: you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation, either version 3 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * REST is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have a copy of the GNU General Public License along with *
18  * REST in $REST_PATH/LICENSE. *
19  * If not, see http://www.gnu.org/licenses/. *
20  * For the list of contributors see $REST_PATH/CREDITS. *
21  *************************************************************************/
22 
81 #include "TRestRawBiPoToSignalProcess.h"
82 
83 using namespace std;
84 
85 #include "TTimeStamp.h"
86 // #include "zlib.h"
87 
89 
94 
99 
105 
106  SetLibraryVersion(LIBRARY_VERSION);
107 }
108 
115 
116  fEventCounter = 0;
117 
118  tStart = 0; // timeStamp of the run initially set to 0
119  RESTInfo << "TRestRawBiPoToSignalProcess::InitProcess" << RESTendl;
120 
122  char buffer[CTAG_SZ];
123  if (fread(buffer, sizeof(char), CTAG_SZ, fInputBinFile) != CTAG_SZ) {
124  printf("Error: could not read first prefix.\n");
125  exit(1);
126  }
127  totalBytesReaded += CTAG_SZ * sizeof(char);
128 
129  if (strcmp(buffer, TAG_RUN_BIPO) != 0) {
130  RESTError << "The file " << fInputFileNames[0] << " is not BiPo format" << RESTendl;
131  exit(1);
132  }
133 
135  ReadHeader();
137 }
138 
143  RESTDebug << "-------Start of TRestRawBiPoToSignalProcess::ProcessEvent------------" << RESTendl;
144  fEventCounter++;
145  RESTDebug << "--- Starting to process event id: " << fEventCounter << RESTendl;
146 
148  fSignalEvent->Initialize();
149  fSignalEvent->SetRunOrigin(fRunOrigin);
150  fSignalEvent->SetSubRunOrigin(fSubRunOrigin);
151  fSignalEvent->SetID(fEventCounter);
152 
153  char buffer[CTAG_SZ];
154  if (fread(buffer, sizeof(char), CTAG_SZ, fInputBinFile) != CTAG_SZ) {
155  printf("Error: could not read first ACQ prefix.\n");
156  exit(1);
157  }
158  totalBytesReaded += CTAG_SZ * sizeof(char);
159 
160  if (strcmp(buffer, TAG_RUN_STOP) == 0) {
161  RESTDebug << "The run ends" << RESTendl;
162  ReadFooter();
163  // The processing thread finishes
164  return nullptr;
165  }
166 
167  if (strcmp(buffer, TAG_ACQ) == 0 || strcmp(buffer, TAG_ACQ_2) == 0) {
168  RESTDebug << "A new event comes" << RESTendl;
169 
170  std::vector<uint16_t> data;
171  Int_t boardAddress = ReadBiPoEventData(data);
172  Int_t bIndex = GetBoardIndex(boardAddress);
173 
174  if (bIndex < 0) {
175  RESTError << "TRestRawBiPoToSignalProcess::ProcessEvent." << RESTendl;
176  RESTError << "Board index not found!" << RESTendl;
177  return nullptr;
178  }
179 
180  RESTDebug << "Number of channels : " << fMatacqBoard[bIndex].nChannels << RESTendl;
181  for (int nch = 0; nch < fMatacqBoard[bIndex].nChannels; nch++) {
182  TRestRawSignal sgnl;
183  sgnl.Initialize();
184  sgnl.SetSignalID(100 * boardAddress + nch);
185 
186  Int_t nBins = fBiPoSettings[bIndex].t1_window + fBiPoSettings[bIndex].t2_window;
187 
188  for (int b = 0; b < nBins; b++) {
189  Short_t sdata = data[GetBin(bIndex, nch, b)];
190  Short_t v = MATACQ_ZERO - sdata; // Inversing polarity
191  if (sdata == MATACQ_OVERFLOW) {
192  v = 0;
193  }
194  if (sdata == MATACQ_UNDERFLOW) {
195  v = TMath::Power(2, 12);
196  }
197 
198  if (sgnl.GetSignalID() >= 0) sgnl.AddPoint(v);
199  }
200 
201  RESTDebug << "Adding signal with id : " << sgnl.GetID() << RESTendl;
202  RESTDebug << "Number of points: " << sgnl.GetNumberOfPoints() << RESTendl;
203  fSignalEvent->AddSignal(sgnl);
204  }
205 
206  return fSignalEvent;
207  }
208 
209  // The processing thread will be finished if return nullptr is reached
210  return nullptr;
211 }
212 
219  RESTDebug << "Entering TRestRawBiPoToSignalProcess::ReadFooter" << RESTendl;
220  int32_t tmp;
221 
223  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
224  printf("Error: could not read timestamp.\n");
225  exit(1);
226  }
227  totalBytesReaded += sizeof(int32_t);
228  Double_t runEndTime = (Double_t)tmp;
229 
230  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
231  printf("Error: could not read timestamp (us).\n");
232  exit(1);
233  }
234  totalBytesReaded += sizeof(int32_t);
235  runEndTime += 1.e-6 * (Double_t)tmp;
236 
237  fRunInfo->SetEndTimeStamp(runEndTime);
238 }
239 
246  RESTDebug << "Entering TRestRawBiPoToSignalProcess::ReadHeader" << RESTendl;
247  int32_t tmp;
248 
250  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
251  printf("Error: could not read timestamp.\n");
252  exit(1);
253  }
254  totalBytesReaded += sizeof(int32_t);
255  Double_t runStartTime = (Double_t)tmp;
256 
257  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
258  printf("Error: could not read timestamp (us).\n");
259  exit(1);
260  }
261  totalBytesReaded += sizeof(int32_t);
262  runStartTime += 1.e-6 * (Double_t)tmp;
263 
264  fRunInfo->SetStartTimeStamp(runStartTime);
265 
266  uint32_t nBoards;
267  if (fread(&nBoards, sizeof(uint32_t), 1, fInputBinFile) != 1) {
268  printf("Error: could not read nBoards.\n");
269  exit(1);
270  }
271  totalBytesReaded += sizeof(int32_t);
272 
273  fNBoards = nBoards;
274  RESTDebug << "N boards: " << fNBoards << RESTendl;
275 
276  for (int n = 0; n < fNBoards; n++) {
277  ReadBoard();
278 
279  int32_t bipo;
280  if (fread(&bipo, sizeof(int32_t), 1, fInputBinFile) != 1) {
281  printf("Error: could not read BiPo flag.\n");
282  exit(1);
283  }
284  totalBytesReaded += sizeof(int32_t);
285 
286  if (bipo != 1) {
287  RESTError << "The file " << fInputFileNames[0] << " is not BiPo format" << RESTendl;
288  exit(1);
289  }
290 
291  ReadBiPoSetup();
292  }
293 }
294 
299  MatacqBoard board;
300  int32_t tmp;
301  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
302  printf("Error: could not read base matacq address.\n");
303  exit(1);
304  }
305  totalBytesReaded += sizeof(int32_t);
306  board.address = tmp;
307 
308  if (fread(&board.en_ch[0], sizeof(int32_t), MATACQ_N_CH, fInputBinFile) != MATACQ_N_CH) {
309  printf("Error: could not read base matacq en_ch.\n");
310  exit(1);
311  }
312  totalBytesReaded += MATACQ_N_CH * sizeof(int32_t);
313 
314  int cnt = 0;
315  board.nChannels = 0;
316  for (int ich = (MATACQ_N_CH - 1); ich >= 0; ich--) {
317  if (board.en_ch[ich] == 1) {
318  board.nChannels = board.nChannels + 1;
319  board.ch_shifts[ich] = cnt;
320  cnt++;
321  } else {
322  board.ch_shifts[ich] = -1;
323  }
324  }
325 
326  if (fread(&board.trg_ch[0], sizeof(int32_t), MATACQ_N_CH, fInputBinFile) != MATACQ_N_CH) {
327  printf("Error: could not read base matacq trg_ch.\n");
328  exit(1);
329  }
330  totalBytesReaded += MATACQ_N_CH * sizeof(int32_t);
331 
332  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
333  printf("Error: could not read Trig type.\n");
334  exit(1);
335  }
336  totalBytesReaded += sizeof(int32_t);
337  board.Trig_Type = tmp;
338 
339  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
340  printf("Error: could not read Threshold.\n");
341  exit(1);
342  }
343  totalBytesReaded += sizeof(int32_t);
344  board.Threshold = tmp;
345 
346  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
347  printf("Error: could not read Nb_Acq.\n");
348  exit(1);
349  }
350  totalBytesReaded += sizeof(int32_t);
351  board.Nb_Acq = tmp;
352 
353  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
354  printf("Error: could not read Posttrig.\n");
355  exit(1);
356  }
357  totalBytesReaded += sizeof(int32_t);
358  board.Posttrig = tmp;
359 
360  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
361  printf("Error: could not read Time_Tag_On.\n");
362  exit(1);
363  }
364  totalBytesReaded += sizeof(int32_t);
365  board.Time_Tag_On = tmp;
366 
367  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
368  printf("Error: could not read Sampling_GHz.\n");
369  exit(1);
370  }
371  totalBytesReaded += sizeof(int32_t);
372  board.Sampling_GHz = tmp;
373 
374  RESTDebug << "MATACQ Base memory address: " << board.address << RESTendl;
375  RESTDebug << "En[0]: " << board.en_ch[0] << " En[1]: " << board.en_ch[1] << " En[2]: " << board.en_ch[2]
376  << " En[3]: " << board.en_ch[3] << RESTendl;
377  RESTDebug << "Trg[0]: " << board.trg_ch[0] << " Trg[1]: " << board.trg_ch[1]
378  << " Trg[2]: " << board.trg_ch[2] << " Trg[3]: " << board.trg_ch[3] << RESTendl;
379  RESTDebug << " " << RESTendl;
380  RESTDebug << "Trigger type: " << board.Trig_Type << " Threshold: " << board.Threshold << RESTendl;
381  RESTDebug << "Nb_Acq: " << board.Nb_Acq << " Posttrig: " << board.Posttrig << RESTendl;
382  RESTDebug << "Time_Tag_On: " << board.Time_Tag_On << " Sampling_GHz: " << board.Sampling_GHz << RESTendl;
383  RESTDebug << " -- " << RESTendl;
384 
385  fMatacqBoard.push_back(board);
386 }
387 
393  BiPoSettings bipo;
394 
395  int32_t tmp;
396  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
397  printf("Error: could not read BiPo trigger address.\n");
398  exit(1);
399  }
400  totalBytesReaded += sizeof(int32_t);
401  bipo.trigger_address = tmp;
402 
403  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
404  printf("Error: could not read BiPo Win1 Posttrig.\n");
405  exit(1);
406  }
407  totalBytesReaded += sizeof(int32_t);
408  bipo.Win1_Posttrig = tmp;
409 
410  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
411  printf("Error: could not read BiPo timeout 200KHz.\n");
412  exit(1);
413  }
414  totalBytesReaded += sizeof(int32_t);
415  bipo.Timeout_200KHz = tmp;
416 
417  if (fread(&bipo.Trig_Chan[0], sizeof(int32_t), MATACQ_N_CH, fInputBinFile) != MATACQ_N_CH) {
418  printf("Error: could not read Trig_Chan.\n");
419  exit(1);
420  }
421  totalBytesReaded += MATACQ_N_CH * sizeof(int32_t);
422 
423  if (fread(&bipo.Level1_mV[0], sizeof(int32_t), MATACQ_N_CH, fInputBinFile) != MATACQ_N_CH) {
424  printf("Error: could not read Level1_mV.\n");
425  exit(1);
426  }
427  totalBytesReaded += MATACQ_N_CH * sizeof(int32_t);
428 
429  if (fread(&bipo.Level2_mV[0], sizeof(int32_t), MATACQ_N_CH, fInputBinFile) != MATACQ_N_CH) {
430  printf("Error: could not read Level2_mV.\n");
431  exit(1);
432  }
433  totalBytesReaded += MATACQ_N_CH * sizeof(int32_t);
434 
435  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
436  printf("Error: could not read BiPo Win1 Posttrig.\n");
437  exit(1);
438  }
439  totalBytesReaded += sizeof(int32_t);
440  bipo.t1_window = tmp;
441 
442  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
443  printf("Error: could not read BiPo Win1 Posttrig.\n");
444  exit(1);
445  }
446  totalBytesReaded += sizeof(int32_t);
447  bipo.t2_window = tmp;
448 
449  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
450  printf("Error: could not read BiPo Win1 Posttrig.\n");
451  exit(1);
452  }
453  totalBytesReaded += sizeof(int32_t);
454  bipo.t1_t2_timeout = tmp;
455 
456  RESTDebug << "BiPo trigger address: " << bipo.trigger_address << RESTendl;
457  RESTDebug << "Win1 Posttrig: " << bipo.Win1_Posttrig << RESTendl;
458  RESTDebug << "Timeout [200KHz]: " << bipo.Timeout_200KHz << RESTendl;
459  RESTDebug << " " << RESTendl;
460  RESTDebug << "Trig_Chan[0]: " << bipo.Trig_Chan[0] << " Trig_Chan[1]: " << bipo.Trig_Chan[1]
461  << " Trig_Chan[2]: " << bipo.Trig_Chan[2] << " Trig_Chan[3]: " << bipo.Trig_Chan[3] << RESTendl;
462  RESTDebug << "Level1_mV[0]: " << bipo.Level1_mV[0] << " Level1_mV[1]: " << bipo.Level1_mV[1]
463  << " Level1_mV[2]: " << bipo.Level1_mV[2] << " Level1_mV[3]: " << bipo.Level1_mV[3] << RESTendl;
464  RESTDebug << "Level2_mV[0]: " << bipo.Level2_mV[0] << " Level2_mV[1]: " << bipo.Level2_mV[1]
465  << " Level2_mV[2]: " << bipo.Level2_mV[2] << " Level2_mV[3]: " << bipo.Level2_mV[3] << RESTendl;
466  RESTDebug << " " << RESTendl;
467  RESTDebug << "T1 window: " << bipo.t1_window << RESTendl;
468  RESTDebug << "T2 window: " << bipo.t2_window << RESTendl;
469  RESTDebug << "T1-T2 timeout: " << bipo.t1_t2_timeout << RESTendl;
470  RESTDebug << " -- " << RESTendl;
471 
472  fBiPoSettings.push_back(bipo);
473 }
474 
485 Int_t TRestRawBiPoToSignalProcess::ReadBiPoEventData(std::vector<uint16_t>& mdata) {
486  int32_t tmp;
487  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
488  printf("Error: could not read tmp .\n");
489  exit(1);
490  }
491  totalBytesReaded += sizeof(int32_t);
492  Int_t boardAddress = tmp;
493 
494  RESTDebug << " Event address --> " << boardAddress << RESTendl;
495 
496  // int32_t event_address = tmp; // It is this important?
497  // Probably board where it took place the event?
498 
499  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
500  printf("Error: could not read tmp .\n");
501  exit(1);
502  }
503  totalBytesReaded += sizeof(int32_t);
504 
505  Double_t timeStamp = tmp;
506 
507  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
508  printf("Error: could not read tmp .\n");
509  exit(1);
510  }
511  totalBytesReaded += sizeof(int32_t);
512  timeStamp += 1.e-6 * (Double_t)tmp;
513 
514  fSignalEvent->SetTime(timeStamp);
515 
516  RESTDebug << "Event time stamp: " << timeStamp << RESTendl;
517 
518  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
519  printf("Error: could not read tmp .\n");
520  exit(1);
521  }
522  totalBytesReaded += sizeof(int32_t);
523  int32_t data_size = tmp;
524  RESTDebug << "Data size --> " << tmp << RESTendl;
525 
526  if (fread(&tmp, sizeof(int32_t), 1, fInputBinFile) != 1) {
527  printf("Error: could not read BiPo trigger address.\n");
528  exit(1);
529  }
530  totalBytesReaded += sizeof(int32_t);
531  RESTDebug << " T1-T2 distance --> " << tmp << RESTendl;
532  fSignalEvent->SetAuxiliar(tmp);
533 
534  mdata.resize(data_size);
535  if (fread(&mdata[0], sizeof(uint16_t), data_size, fInputBinFile) != (size_t)data_size) {
536  printf("Error: could not read MATACQ data.\n");
537  exit(1);
538  }
539  totalBytesReaded += data_size * sizeof(uint16_t);
540 
541  return boardAddress;
542 }
543 
549  for (unsigned int n = 0; n < fMatacqBoard.size(); n++)
550  if (fMatacqBoard[n].address == address) return n;
551 
552  return -1;
553 }
554 
559 Int_t TRestRawBiPoToSignalProcess::GetBin(Int_t boardIndex, Int_t channel, Int_t bin) {
560  MatacqBoard board = fMatacqBoard[boardIndex];
561  return board.ch_shifts[channel] + board.nChannels * bin;
562 }
563 
569 
570  RESTMetadata << "Number of Matacq boards : " << fNBoards << RESTendl;
571  RESTMetadata << " " << RESTendl;
572 
573  for (int n = 0; n < fNBoards; n++) {
574  RESTMetadata << " " << RESTendl;
575  RESTMetadata << "Board address: " << fMatacqBoard[n].address << RESTendl;
576  RESTMetadata << "----" << RESTendl;
577  RESTMetadata << " - Enabled channels: " << fMatacqBoard[n].en_ch[0] << " - "
578  << fMatacqBoard[n].en_ch[1] << " - " << fMatacqBoard[n].en_ch[2] << " - "
579  << fMatacqBoard[n].en_ch[3] << RESTendl;
580  RESTMetadata << " - Trigger channels: " << fMatacqBoard[n].trg_ch[0] << " - "
581  << fMatacqBoard[n].trg_ch[1] << " - " << fMatacqBoard[n].trg_ch[2] << " - "
582  << fMatacqBoard[n].trg_ch[3] << RESTendl;
583  RESTMetadata << " - Trigger type: " << fMatacqBoard[n].Trig_Type << RESTendl;
584  RESTMetadata << " - Threshold: " << fMatacqBoard[n].Threshold << RESTendl;
585  RESTMetadata << " - Nb_Acq: " << fMatacqBoard[n].Nb_Acq << RESTendl;
586  RESTMetadata << " - Posttrig: " << fMatacqBoard[n].Posttrig << RESTendl;
587  RESTMetadata << " - Time_Tag_On: " << fMatacqBoard[n].Time_Tag_On << RESTendl;
588  RESTMetadata << " - Sampling_GHz: " << fMatacqBoard[n].Sampling_GHz << RESTendl;
589  RESTMetadata << " " << RESTendl;
590  RESTMetadata << "BiPo trigger settings. Address : " << fBiPoSettings[n].trigger_address << RESTendl;
591  RESTMetadata << "----" << RESTendl;
592  RESTMetadata << " - Win1 Posttrig: " << fBiPoSettings[n].Win1_Posttrig << RESTendl;
593  RESTMetadata << " - Timeout [200KHz]: " << fBiPoSettings[n].Timeout_200KHz << RESTendl;
594  RESTMetadata << " - Trigger channels: " << fBiPoSettings[n].Trig_Chan[0] << " - "
595  << fBiPoSettings[n].Trig_Chan[1] << " - " << fBiPoSettings[n].Trig_Chan[2] << " - "
596  << fBiPoSettings[n].Trig_Chan[3] << RESTendl;
597  RESTMetadata << " - Level 1 [mV]: " << fBiPoSettings[n].Level1_mV[0] << " - "
598  << fBiPoSettings[n].Level1_mV[1] << " - " << fBiPoSettings[n].Level1_mV[2] << " - "
599  << fBiPoSettings[n].Level1_mV[3] << RESTendl;
600  RESTMetadata << " - Level 2 [mV]: " << fBiPoSettings[n].Level2_mV[0] << " - "
601  << fBiPoSettings[n].Level2_mV[2] << " - " << fBiPoSettings[n].Level2_mV[2] << " - "
602  << fBiPoSettings[n].Level2_mV[3] << RESTendl;
603  RESTMetadata << " - T1 window: " << fBiPoSettings[n].t1_window << RESTendl;
604  RESTMetadata << " - T2 window: " << fBiPoSettings[n].t2_window << RESTendl;
605  RESTMetadata << " - T1-T2 timeout: " << fBiPoSettings[n].t1_t2_timeout << RESTendl;
606  }
607 
608  RESTMetadata << "+++++++++++++++++++++++++++++++++++++++++++++++++" << RESTendl;
609 }
A base class for any REST event.
Definition: TRestEvent.h:38
virtual void Initialize()=0
Definition: TRestEvent.cxx:73
virtual void PrintMetadata()
Implemented it in the derived metadata class to print out specific metadata information.
An process to read binary data from BiPo electronics.
TRestEvent * ProcessEvent(TRestEvent *inputEvent) override
The main processing event function.
Int_t GetBin(Int_t boardIndex, Int_t channel, Int_t bin)
It returns the ordered channel value from the Matacq memory buffer for a given board,...
Int_t ReadBiPoEventData(std::vector< uint16_t > &mdata)
This method reads the event data corresponding to one event. The sampled channel data that will be ma...
void ReadBoard()
This method reads the settings of one of the Matacq boards.
void ReadFooter()
This method reads the header data containing the run timestamp, the number of Matacq boards,...
TRestRawBiPoToSignalProcess()
Default constructor.
void ReadHeader()
This method reads the header data containing the run timestamp, the number of Matacq boards,...
UInt_t GetBoardIndex(Int_t address)
It returns the std::vector storage index using the hardware address of the Matacq board.
~TRestRawBiPoToSignalProcess()
Default destructor.
void InitProcess() override
Process initialization. Data members that require initialization just before start processing should ...
void PrintMetadata() override
Prints out the Matacq boards configuration and BiPo setup.
void ReadBiPoSetup()
This method reads the header data corresponding to the BiPo settings of one card.
void Initialize() override
Function to initialize input/output event members and define the section name.
It defines a Short_t array with a physical parameter that evolves in time using a fixed time bin.
Int_t GetID() const
Returns the value of signal ID.
void Initialize()
Initialization of TRestRawSignal members.
void SetSignalID(Int_t sID)
It sets the id number of the signal.
void AddPoint(Short_t)
Adds a new point to the end of the signal data array.
Int_t GetSignalID() const
Returns the value of signal ID.
Int_t GetNumberOfPoints() const
Returns the actual number of points, or size of the signal.
virtual void InitProcess() override
To be executed at the beginning of the run (outside event loop)
void Initialize() override
Making default settings.
@ REST_Debug
+show the defined debug messages
Int_t GetChar(std::string hint="Press a KEY to continue ...")
Helps to pause the program, printing a message before pausing.
A structure to store the BiPo settings.
A structure to store the configuration settings of Matacq board.
int32_t address
The base memory address of the Matacq board.