REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestRawMultiCoBoAsAdToSignalProcess.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 
57 
58 #include "TRestRawMultiCoBoAsAdToSignalProcess.h"
59 
60 #include "TRestDataBase.h"
61 
62 using namespace std;
63 
64 #include <bitset>
65 
66 #include "TTimeStamp.h"
67 
69 
70 TRestRawMultiCoBoAsAdToSignalProcess::TRestRawMultiCoBoAsAdToSignalProcess() { Initialize(); }
71 
72 TRestRawMultiCoBoAsAdToSignalProcess::TRestRawMultiCoBoAsAdToSignalProcess(const char* configFilename) {
73  Initialize();
74 }
75 
76 TRestRawMultiCoBoAsAdToSignalProcess::~TRestRawMultiCoBoAsAdToSignalProcess() {
77  // TRestRawMultiCoBoAsAdToSignalProcess destructor
78 }
79 
82 
83  SetSectionName(this->ClassName());
84 }
85 
86 Bool_t TRestRawMultiCoBoAsAdToSignalProcess::InitializeStartTimeStampFromFilename(TString fName) {
87  // these parameters have to be extracted from the file name. So do not change
88  // the origin binary file name.
89  int year, month, day, hour, minute, second, millisecond;
90 
91  const Ssiz_t fnOffset = fName.Index(".graw");
92 
93  if (fName.Length() != fnOffset + 5 || fnOffset < 28) {
94  cout << "Input binary file name type unknown!" << endl;
95  return kFALSE;
96  }
97 
98  if (fName[fnOffset - 24] != '-' || fName[fnOffset - 21] != '-' || fName[fnOffset - 18] != 'T' ||
99  fName[fnOffset - 15] != ':' || fName[fnOffset - 12] != ':' || fName[fnOffset - 9] != '.' ||
100  fName[fnOffset - 5] != '_') {
101  cout << "Input binary file name unknown!" << endl;
102  return kFALSE;
103  }
104 
105  year = (int)(fName[fnOffset - 28] - 48) * 1000 + (int)(fName[fnOffset - 27] - 48) * 100 +
106  (int)(fName[fnOffset - 26] - 48) * 10 + (int)(fName[fnOffset - 25] - 48) * 1;
107  month = (int)(fName[fnOffset - 23] - 48) * 10 + (int)(fName[fnOffset - 22] - 48) * 1;
108  day = (int)(fName[fnOffset - 20] - 48) * 10 + (int)(fName[fnOffset - 19] - 48) * 1;
109  hour = (int)(fName[fnOffset - 17] - 48) * 10 + (int)(fName[fnOffset - 16] - 48) * 1;
110  minute = (int)(fName[fnOffset - 14] - 48) * 10 + (int)(fName[fnOffset - 13] - 48) * 1;
111  second = (int)(fName[fnOffset - 11] - 48) * 10 + (int)(fName[fnOffset - 10] - 48) * 1;
112  millisecond = (int)(fName[fnOffset - 8] - 48) * 100 + (int)(fName[fnOffset - 7] - 48) * 10 +
113  (int)(fName[fnOffset - 6] - 48) * 1;
114 
115  fStartTimeStamp.Set(year, month, day, hour, minute, second, millisecond * 1000000, kTRUE,
116  -8 * 3600); // Offset for Beijing(local) time
117  return kTRUE;
118 }
119 
120 vector<int> fileerrors;
122  // fDataFrame.clear();
123  // fHeaderFrame.clear();
124  // fileerrors.clear();
125 
126  // for (int n = 0; n < fInputFiles.size(); n++) {
127  // CoBoHeaderFrame hdrtmp;
128  // fHeaderFrame.push_back(hdrtmp);
129  // fileerrors.push_back(0);
130  //}
131 
132  fRunOrigin = fRunInfo->GetRunNumber();
133  fCurrentEvent = -1;
134 
135  if (fRunInfo->GetStartTimestamp() != 0) {
136  fStartTimeStamp = TTimeStamp(fRunInfo->GetStartTimestamp());
137  }
138 
139  totalBytesReaded = 0;
140 }
141 
142 Bool_t TRestRawMultiCoBoAsAdToSignalProcess::AddInputFile(const string& file) {
143  if (file.find(".graw") == string::npos) {
144  return false;
145  }
146  if (TRestRawToSignalProcess::AddInputFile(file)) {
147  CoBoHeaderFrame hdrtmp;
148  fHeaderFrame.push_back(hdrtmp);
149  fileerrors.push_back(0);
150 
151  int i = fHeaderFrame.size() - 1;
152  if (fread(fHeaderFrame[i].frameHeader, 256, 1, fInputFiles[i]) != 1 || feof(fInputFiles[i])) {
153  fclose(fInputFiles[i]);
154  fInputFiles[i] = nullptr;
155  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
156  return kFALSE;
157  }
158  totalBytesReaded += 256;
159  if (!ReadFrameHeader(fHeaderFrame[i])) {
160  cout << "error when reading frame header in file " << i << " \"" << fInputFileNames[i] << "\""
161  << endl;
162  cout << "event id " << fCurrentEvent + 1 << ". The file will be closed" << endl;
163  fHeaderFrame[i].Show();
164  cout << endl;
165  GetChar();
166  fclose(fInputFiles[i]);
167  fInputFiles[i] = nullptr;
168  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
169  return false;
170  }
171 
172  return true;
173  }
174  return false;
175 }
176 
178  fSignalEvent->Initialize();
179 
180  if (EndReading()) {
181  return nullptr;
182  }
183  if (!FillBuffer()) {
184  fSignalEvent->SetOK(false);
185  return fSignalEvent;
186  }
187 
188  // Int_t nextId = GetLowestEventId();
189 
190  if (GetVerboseLevel() >= TRestStringOutput::REST_Verbose_Level::REST_Debug) {
191  cout << "TRestRawMultiCoBoAsAdToSignalProcess: Generating event with ID: " << fCurrentEvent << endl;
192  }
193 
194  TTimeStamp tSt = 0;
195 
196  map<int, CoBoDataFrame>::iterator it;
197  it = fDataFrame.begin();
198 
199  while (it != fDataFrame.end()) {
200  CoBoDataFrame* data = &(it->second);
201  if (data->evId == fCurrentEvent) {
202  if ((Double_t)tSt == 0) tSt = data->timeStamp;
203 
204  for (int m = 0; m < 272; m++) {
205  if (data->chHit[m]) {
206  signal.Initialize();
207  signal.SetSignalID(m + data->asadId * 272);
208 
209  for (int j = 0; j < 512; j++) signal.AddPoint((Short_t)data->data[m][j]);
210 
211  fSignalEvent->AddSignal(signal);
212 
213  if (GetVerboseLevel() >= TRestStringOutput::REST_Verbose_Level::REST_Extreme) {
214  cout << "AgetId, chnId, first value, max value: " << m / 68 << ", " << m % 68 << ", "
215  << signal.GetData(0) << ", " << signal.GetMaxValue() << endl;
216  }
217  }
218  }
219  data->evId = -1;
220  for (int m = 0; m < 272; m++) data->chHit[m] = kFALSE;
221  }
222  it++;
223  }
224 
225  if (GetVerboseLevel() >= TRestStringOutput::REST_Verbose_Level::REST_Debug) {
226  cout << "TRestRawMultiCoBoAsAdToSignalProcess: event time is : " << tSt << endl;
227  cout << "TRestRawMultiCoBoAsAdToSignalProcess: " << fSignalEvent->GetNumberOfSignals()
228  << " signals added" << endl;
229  cout << "------------------------------------" << endl;
230  }
231  fSignalEvent->SetTimeStamp(tSt);
232  fSignalEvent->SetID(fCurrentEvent);
233  fSignalEvent->SetRunOrigin(0);
234  fSignalEvent->SetSubRunOrigin(0);
235 
236  // cout << fSignalEvent->GetNumberOfSignals() << endl;
237  // if( fSignalEvent->GetNumberOfSignals( ) == 0 ) return nullptr;
238 
239  return fSignalEvent;
240 }
241 
243  for (unsigned int i = 0; i < fileerrors.size(); i++) {
244  if (fileerrors[i] > 0) {
245  RESTWarning << "Found " << fileerrors[i] << " error frame headers in file " << i << RESTendl;
246  RESTWarning << "\"" << fInputFileNames[i] << "\"" << RESTendl;
247  }
248  }
249 
250  fileerrors.clear();
251 }
252 
253 // true: finish filling
254 // false: error when filling
255 bool TRestRawMultiCoBoAsAdToSignalProcess::FillBuffer() {
256  // if the file is opened but not read, read header frame
257  for (unsigned int i = 0; i < fInputFiles.size(); i++) {
258  if (fInputFiles[i] && ftell(fInputFiles[i]) == 0) {
259  if (fread(fHeaderFrame[i].frameHeader, 256, 1, fInputFiles[i]) != 1 || feof(fInputFiles[i])) {
260  fclose(fInputFiles[i]);
261  fInputFiles[i] = nullptr;
262  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
263  return kFALSE;
264  }
265  totalBytesReaded += 256;
266  if (!ReadFrameHeader(fHeaderFrame[i])) {
267  cout << "error when reading frame header in file " << i << " \"" << fInputFileNames[i] << "\""
268  << endl;
269  cout << "event id " << fCurrentEvent + 1 << ". The file will be closed" << endl;
270  fHeaderFrame[i].Show();
271  cout << endl;
272  GetChar();
273  fclose(fInputFiles[i]);
274  fInputFiles[i] = nullptr;
275  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
276  return false;
277  }
278  }
279  }
280 
281  // normally:
282  // 1.use the smallest event id in header frames as current event id
283  unsigned int evt = fHeaderFrame[0].eventIdx;
284  for (unsigned int i = 1; i < fHeaderFrame.size(); i++) {
285  if (fHeaderFrame[i].eventIdx < evt) evt = fHeaderFrame[i].eventIdx;
286  }
287  fCurrentEvent = evt;
288 
289  // loop for each file
290  for (unsigned int i = 0; i < fHeaderFrame.size(); i++) {
291  if (fInputFiles[i] == nullptr) {
292  continue;
293  }
294 
295  // file position is at the end of last header
296  // if the eventid of last header is same as current, do the following:
297  // a. read the data frame behind
298  // b. read the next frame header
299  // c. if eventid is the same as current, return to a, otherwise break.
300  while (fCurrentEvent >= 0 && fHeaderFrame[i].eventIdx == (unsigned int)fCurrentEvent) {
301  if (GetVerboseLevel() >= TRestStringOutput::REST_Verbose_Level::REST_Debug) {
302  cout << "TRestRawMultiCoBoAsAdToSignalProcess: retrieving frame header in "
303  "file "
304  << i << " (" << fInputFileNames[i] << ")" << endl;
306  fHeaderFrame[i].Show();
307  }
308 
309  // reading data according to the header
310  unsigned int type = fHeaderFrame[i].frameType;
311  if (fHeaderFrame[i].frameHeader[0] == 0x08 && type == 1) // partial readout
312  {
313  ReadFrameDataP(fInputFiles[i], fHeaderFrame[i]);
314  } else if (fHeaderFrame[i].frameHeader[0] == 0x08 && type == 2) // full readout
315  {
316  if (fread(frameDataF, 2048, 136, fInputFiles[i]) != 136 || feof(fInputFiles[i])) {
317  fclose(fInputFiles[i]);
318  fInputFiles[i] = nullptr;
319  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
320  break;
321  }
322  totalBytesReaded += 278528;
323  ReadFrameDataF(fHeaderFrame[i]);
324  } else {
325  fclose(fInputFiles[i]);
326  fInputFiles[i] = nullptr;
327  fHeaderFrame[i].eventIdx = (unsigned int)4294967295;
328  return false;
329  }
330 
331  // reading next header
332  if (fread(fHeaderFrame[i].frameHeader, 256, 1, fInputFiles[i]) != 1 || feof(fInputFiles[i])) {
333  fclose(fInputFiles[i]);
334  fInputFiles[i] = nullptr;
335  fHeaderFrame[i].eventIdx = (unsigned int)4294967295; // maximum of unsigned int
336  break;
337  }
338  totalBytesReaded += 256;
339  if (!ReadFrameHeader(fHeaderFrame[i])) {
340  RESTWarning << "Event " << fCurrentEvent << " : error when reading next frame header"
341  << RESTendl;
342  RESTWarning << "in file " << i << " \"" << fInputFileNames[i] << "\"" << RESTendl;
343  if (fVerboseLevel > TRestStringOutput::REST_Verbose_Level::REST_Info) fHeaderFrame[i].Show();
344  RESTWarning << "trying to skip this event and find next header..." << RESTendl;
345  fileerrors[i] += 1;
346  TRestStringOutput::REST_Verbose_Level tmp = fVerboseLevel;
347  bool found = false;
349  for (int k = 0; k < 1088; k++) // fullreadoutsize(278528)/headersize(256)=1088
350  {
351  if (fread(fHeaderFrame[i].frameHeader, 256, 1, fInputFiles[i]) != 1 ||
352  feof(fInputFiles[i])) {
353  break;
354  }
355  totalBytesReaded += 256;
356  if (ReadFrameHeader(fHeaderFrame[i])) {
357  fVerboseLevel = tmp;
358  RESTWarning << "Successfully found next header (EventId : "
359  << fHeaderFrame[i].eventIdx << ")" << RESTendl;
361  fHeaderFrame[i].Show();
362  cout << endl;
363  // GetChar();
364  found = true;
365  fSignalEvent->SetOK(false);
366  break;
367  }
368  }
369  if (!found) {
370  fclose(fInputFiles[i]);
371  fInputFiles[i] = nullptr;
372  fHeaderFrame[i].eventIdx = (unsigned int)4294967295; // maximum of unsigned int
373  }
374  }
375  }
376  }
377 
378  return true;
379 }
380 
381 bool TRestRawMultiCoBoAsAdToSignalProcess::ReadFrameHeader(CoBoHeaderFrame& HdrFrame) {
382  UChar_t* Header = &(HdrFrame.frameHeader[0]);
383 
384  HdrFrame.frameSize =
385  (unsigned int)Header[1] * 0x10000 + (unsigned int)Header[2] * 0x100 + (unsigned int)Header[3];
386  HdrFrame.frameSize *= 256;
387 
388  HdrFrame.frameType = (unsigned int)Header[5] * 0x100 + (unsigned int)Header[6];
389  HdrFrame.revision = (unsigned int)Header[7];
390  HdrFrame.headerSize = (unsigned int)Header[8] * 0x100 + (unsigned int)Header[9];
391  HdrFrame.itemSize = (unsigned int)Header[10] * 0x100 + (unsigned int)Header[11];
392  HdrFrame.nItems = (unsigned int)Header[12] * 0x1000000 + (unsigned int)Header[13] * 0x10000 +
393  (unsigned int)Header[14] * 0x100 + (unsigned int)Header[15];
394  HdrFrame.eventTime = (Long64_t)Header[16] * 0x10000000000 + (Long64_t)Header[17] * 0x100000000 +
395  (Long64_t)Header[18] * 0x1000000 + (Long64_t)Header[19] * 0x10000 +
396  (Long64_t)Header[20] * 0x100 + (Long64_t)Header[21];
397  HdrFrame.eventTime *= 10; // ns at 100MHz experiment clock
398  HdrFrame.eventIdx = (unsigned int)Header[22] * 0x1000000 + (unsigned int)Header[23] * 0x10000 +
399  (unsigned int)Header[24] * 0x100 + (unsigned int)Header[25];
400 
401  HdrFrame.asadIdx = (unsigned int)Header[27];
402  HdrFrame.readOffset = (unsigned int)Header[28] * 0x100 + (unsigned int)Header[29];
403  HdrFrame.status = (unsigned int)Header[30];
404 
405  // if (fCurrentEvent == -1) { fCurrentEvent = HdrFrame.eventIdx; }
406  // if (fCurrentEvent != HdrFrame.eventIdx) { fNextEvent = HdrFrame.eventIdx;
407  // return 1; }
408 
409  // HdrFrame.fEveTimeSec = HdrFrame.eventTime / (Long64_t)1e9;//relative time
410  // HdrFrame.fEveTimeNanoSec = HdrFrame.eventTime % (Long64_t)1e9;
411 
412  // HdrFrame.fEveTimeNanoSec = (int)HdrFrame.eventTime;
413  // HdrFrame.fEveTimeStamp.SetSec(HdrFrame.fEveTimeSec);
414  // HdrFrame.fEveTimeStamp.SetNanoSec(HdrFrame.fEveTimeNanoSec);
415  // HdrFrame.fEveTimeStamp.Add(fStartTimeStamp);
416 
417  if (HdrFrame.frameType == 1) {
418  if (HdrFrame.itemSize != 4) {
419  RESTWarning << "unsupported item size!" << RESTendl;
420  return false;
421  }
422 
423  } else if (HdrFrame.frameType == 2) {
424  if (HdrFrame.itemSize != 2) {
425  RESTWarning << "unsupported item size!" << RESTendl;
426  return false;
427  }
428  if (HdrFrame.nItems != 139264) {
429  RESTWarning << "unsupported nItems!" << RESTendl;
430  return false;
431  }
432  } else {
433  RESTWarning << "unknown frame type" << RESTendl;
434  return false;
435  }
436 
437  // warning<<"revision: "<<revision<<endl;
438  if (HdrFrame.revision != 5) {
439  RESTWarning << "unsupported revision!" << RESTendl;
440  return false;
441  }
442 
443  // warning<<"frameHeaderSize: "<<frameHeaderSize<<endl;
444  if (HdrFrame.headerSize != 1) {
445  RESTWarning << "unsupported frameHeader size!" << RESTendl;
446  return false;
447  }
448 
449  // warning<<"readOffset: "<<readOffset<<endl;
450  if (HdrFrame.readOffset != 0) {
451  RESTWarning << "unsupported readOffset!" << RESTendl;
452  return false;
453  }
454 
455  if (HdrFrame.status) {
456  RESTWarning << "bad frame!" << RESTendl;
457  return false;
458  }
459 
460  if (HdrFrame.nItems * HdrFrame.itemSize + 256 != HdrFrame.frameSize) {
461  RESTWarning << "Event " << fCurrentEvent << " : item number and frame size unmatch!" << RESTendl;
462 
463  // sometimes there is a itemnumber-framesize unmatch problem
464  // nItems*itemSize(=4)+256=frameSize
465  // because nitems/512 should be a integer(signal number), we can make a fix
466  //{
467  // if (HdrFrame.nItems % 512 == 0) {
468  // warning << "...frameSize (" << HdrFrame.frameSize;
469  // HdrFrame.frameSize = HdrFrame.nItems * HdrFrame.itemSize + 256;
470  // warning << ") fixed to " << HdrFrame.frameSize << "..." << endl;
471  // warning << endl;
472  //}
473  // else
474  //{
475  // if(fVerboseLevel>=REST_Info)
476  // HdrFrame.Show();
477  // if (((HdrFrame.frameSize - 256) / HdrFrame.itemSize) % 512 == 0)
478  // {
479  // HdrFrame.nItems = (HdrFrame.frameSize - 256) /
480  // HdrFrame.itemSize; warning << "...nItems fixed to " << HdrFrame.nItems
481  // <<
482  //"..." << endl; warning << endl;
483  // }
484  // else
485  // {
486  // warning << "frame unfixed" << endl;
487  // warning << endl;
488  // }
489  //}
490  }
491 
492  return true;
493 }
494 
495 bool TRestRawMultiCoBoAsAdToSignalProcess::ReadFrameDataP(FILE* f, CoBoHeaderFrame& hdr) {
496  unsigned int i;
497  unsigned int agetIdx, chanIdx, buckIdx, sample, chTmp;
498 
499  unsigned int asadid = hdr.asadIdx;
500  unsigned int size = hdr.frameSize;
501  // unsigned int items = hdr.nItems;
502  unsigned int eventid = hdr.eventIdx;
503  Long64_t time = hdr.eventTime;
504  TTimeStamp eveTimeStamp;
505  CoBoDataFrame& dataf = fDataFrame[asadid];
506 
507  //------------read frame data-----------
508  if (size > 256) {
509  unsigned int NBuckTotal = (size - 256) / 4;
510  for (i = 0; i < NBuckTotal; i++) {
511  if ((fread(frameDataP, 4, 1, f)) != 1 || feof(f)) {
512  fclose(f);
513  f = nullptr;
514  return kFALSE;
515  }
516  totalBytesReaded += 4;
517  // total: 4bytes, 32 bits
518  // 11 111111|1 1111111|11 11 1111|11111111
519  // agetIdx chanIdx buckIdx unused samplepoint
520  agetIdx = (frameDataP[0] >> 6); // first 2 bits of the byte
521  chanIdx = ((unsigned int)(frameDataP[0] & 0x3f) * 2 + (frameDataP[1] >> 7));
522  chTmp = agetIdx * 68 + chanIdx;
523  buckIdx = ((unsigned int)(frameDataP[1] & 0x7f) * 4 + (frameDataP[2] >> 6));
524  sample = ((unsigned int)(frameDataP[2] & 0x0f) * 0x100 + frameDataP[3]);
525 
526  if (chTmp >= 272) {
527  cout << "channel id error! value: " << chTmp << endl;
528  continue;
529  }
530 
531  dataf.chHit[chTmp] = kTRUE;
532  dataf.data[chTmp][buckIdx] = sample;
533  }
534  }
535 
536  eveTimeStamp.SetNanoSec(time % ((Long64_t)1e9));
537  eveTimeStamp.SetSec(time / ((Long64_t)1e9));
538  eveTimeStamp.Add(fStartTimeStamp);
539 
540  dataf.asadId = asadid;
541  dataf.evId = eventid;
542  dataf.timeStamp = eveTimeStamp;
543 
544  return true;
545 }
546 
547 bool TRestRawMultiCoBoAsAdToSignalProcess::ReadFrameDataF(CoBoHeaderFrame& hdr) {
548  int i;
549  int j;
550  unsigned int agetIdx, chanIdx, chanIdx0, chanIdx1, chanIdx2, chanIdx3, sample, chTmp;
551 
552  unsigned int asadid = hdr.asadIdx;
553  unsigned int eventid = hdr.eventIdx;
554  Long64_t time = hdr.eventTime;
555  TTimeStamp eveTimeStamp;
556  CoBoDataFrame& dataf = fDataFrame[asadid];
557 
558  int tmpP;
559  for (i = 0; i < 512; i++) {
560  chanIdx0 = 0;
561  chanIdx1 = 0;
562  chanIdx2 = 0;
563  chanIdx3 = 0;
564  for (j = 0; j < 272; j++) {
565  // total 8*2= 16 bits
566  // 11 11 1111|11111111
567  // agetIdx unused samplepoint
568 
569  tmpP = (i * 272 + j) * 2;
570  agetIdx = (frameDataF[tmpP] >> 6);
571  sample = ((unsigned int)(frameDataF[tmpP] & 0x0f) * 0x100 + frameDataF[tmpP + 1]);
572 
573  if (agetIdx == 0) {
574  chanIdx = chanIdx0;
575  chanIdx0++;
576  } else if (agetIdx == 1) {
577  chanIdx = chanIdx1;
578  chanIdx1++;
579  } else if (agetIdx == 2) {
580  chanIdx = chanIdx2;
581  chanIdx2++;
582  } else {
583  chanIdx = chanIdx3;
584  chanIdx3++;
585  }
586  // cout<<"agetIdx: "<<agetIdx<<" chanIdx: "<<chanIdx<<endl;
587 
588  if (chanIdx > 67) { /*cout << "buck or channel id error! ChannelId,
589  AgetId: " << chanIdx << ", " << agetIdx << endl;*/
590  continue;
591  }
592  chTmp = agetIdx * 68 + chanIdx;
593  dataf.chHit[chTmp] = kTRUE;
594  dataf.data[chTmp][i] = sample;
595  }
596  }
597 
598  eveTimeStamp.SetNanoSec(time % ((Long64_t)1e9));
599  eveTimeStamp.SetSec(time / ((Long64_t)1e9));
600  eveTimeStamp.Add(fStartTimeStamp);
601 
602  dataf.asadId = asadid;
603  dataf.evId = eventid;
604  dataf.timeStamp = eveTimeStamp;
605 
606  return true;
607 }
608 
609 Bool_t TRestRawMultiCoBoAsAdToSignalProcess::EndReading() {
610  for (auto& m : fDataFrame) {
611  m.second.finished = true;
612  }
613 
614  // cout << "header frame: ";
615  // for (int n = 0; n < nFiles; n++) {
616  // cout << fHeaderFrame[n].asadIdx << ":" << fHeaderFrame[n].eventIdx << ", ";
617  //}
618  // cout << endl;
619 
620  for (int n = 0; n < nFiles; n++) {
621  // if one header is not 42949..., the asad chain is not finished
622  fDataFrame[fHeaderFrame[n].asadIdx].finished =
623  (fDataFrame[fHeaderFrame[n].asadIdx].finished &&
624  (fHeaderFrame[n].eventIdx == (unsigned int)4294967295));
625  }
626 
627  // cout << "data frame: ";
628  // for (auto m : fDataFrame) {
629  // cout << m.second.asadId << ":" << m.second.finished << ", ";
630  //}
631  // cout << endl;
632  // cout << endl;
633 
634  for (auto m : fDataFrame) {
635  // if any of the asad chain is finihsed, we ends reading for all the
636  // events
637  if (m.second.asadId == -1) continue;
638 
639  if (m.second.finished == true) {
640  return true;
641  }
642  }
643 
644  for (const auto& file : fInputFiles) {
645  if (file != nullptr) {
646  return false;
647  }
648  }
649 
650  return true;
651 }
A base class for any REST event.
Definition: TRestEvent.h:38
virtual void Initialize()=0
Definition: TRestEvent.cxx:73
TRestEvent * ProcessEvent(TRestEvent *inputEvent) override
Process one event.
void Initialize() override
Making default settings.
void EndProcess() override
To be executed at the end of the run (outside event loop)
void InitProcess() override
To be executed at the beginning of the run (outside event loop)
void Initialize() override
Making default settings.
REST_Verbose_Level
Enumerate of verbose level, containing five levels.
@ REST_Info
+show most of the information for each steps
@ REST_Debug
+show the defined debug messages
@ REST_Silent
show minimum information of the software, as well as error messages
Int_t GetChar(std::string hint="Press a KEY to continue ...")
Helps to pause the program, printing a message before pausing.