CbmRoot
CbmDaq.cxx
Go to the documentation of this file.
1 
5 #include "CbmDaq.h"
6 
7 #include "CbmDigitizeBase.h" // for CbmDigitizeBase
8 #include "CbmLink.h" // for CbmLink
9 #include "CbmMatch.h" // for CbmMatch
10 #include "CbmModuleList.h" // for CbmModuleList
11 #include "CbmTimeSlice.h" // for CbmTimeSlice, CbmTimeSlice::kEvent
12 
13 #include <FairEventHeader.h> // for FairEventHeader
14 #include <FairLogger.h> // for Logger, LOG, Severity, Severity::debug
15 #include <FairLogger.h> // for FairLogger, gLogger
16 #include <FairRootManager.h> // for FairRootManager
17 #include <FairRunAna.h> // for FairRunAna
18 #include <FairTask.h> // for FairTask, InitStatus, kSUCCESS
19 
20 #include <TGenericClassInfo.h> // for TGenericClassInfo
21 #include <TStopwatch.h> // for TStopwatch
22 #include <TString.h> // for operator<<, TString
23 
24 #include <cassert> // for assert
25 #include <iomanip> // for setw, setprecision, __iom_t6, __iom_t5
26 #include <iostream> // for operator<<, string, basic_ostream, right
27 #include <sstream> // for basic_stringstream<>::string_type
28 #include <string> // for char_traits
29 #include <utility> // for pair
30 
31 using std::fixed;
32 using std::left;
33 using std::map;
34 using std::pair;
35 using std::right;
36 using std::setprecision;
37 using std::setw;
38 using std::string;
39 using std::stringstream;
40 
41 
42 // ===== Constructor =====================================================
43 CbmDaq::CbmDaq(Bool_t eventMode)
44  : FairTask("Daq")
45  , fIsEventByEvent(eventMode)
46  , fTimeSliceLength(-1.)
47  , fLatency(5000.)
48  , fStoreEmptySlices(kFALSE)
49  , fTimeEventPrevious(-1.)
50  , fNofEvents(0)
51  , fNofDigis(0)
52  , fNofDigisIgnored(0)
53  , fNofTimeSlices(0)
54  , fNofTimeSlicesEmpty(0)
55  , fTimeDigiFirst(-1.)
56  , fTimeDigiLast(-1.)
57  , fTimeSliceFirst(-1.)
58  , fTimeSliceLast(-1.)
59  , fTimer()
60  , fDigis()
61  , fDigitizers()
62  , fTimeSlice(nullptr)
63  , fEventList()
64  , fEventsCurrent(nullptr)
65  , fEventRange() {}
66 // ===========================================================================
67 
68 
69 // ===== Constructor for event by event mode ==============================
70 CbmDaq::CbmDaq(Double_t tsLength)
71  : FairTask("Daq")
72  , fIsEventByEvent(kFALSE)
73  , fTimeSliceLength(tsLength)
74  , fLatency(2000.)
75  , fStoreEmptySlices(kFALSE)
76  , fTimeEventPrevious(-1.)
77  , fNofEvents(0)
78  , fNofDigis(0)
79  , fNofDigisIgnored(0)
80  , fNofTimeSlices(0)
81  , fNofTimeSlicesEmpty(0)
82  , fTimeDigiFirst(-1.)
83  , fTimeDigiLast(-1.)
84  , fTimeSliceFirst(-1.)
85  , fTimeSliceLast(-1.)
86  , fTimer()
87  , fDigis()
88  , fDigitizers()
89  , fTimeSlice(nullptr)
90  , fEventList()
91  , fEventsCurrent(nullptr)
92  , fEventRange() {}
93 // ===========================================================================
94 
95 
96 // ===== Destructor ======================================================
98 // ===========================================================================
99 
100 
101 // ===== Check output for time sorting ===================================
102 Bool_t CbmDaq::CheckOutput() const {
103  Bool_t result = kTRUE;
104  for (auto& digitizer : fDigitizers)
105  result = (result && digitizer.second->CheckOutput());
106  return result;
107 }
108 // ===========================================================================
109 
110 
111 // ===== Close the current time slice and fill it to the tree ============
113 
114  fNofTimeSlices++;
115  if (fTimeSlice->IsEmpty()) {
117  LOG(debug) << fName << ": Closing " << fTimeSlice->ToString();
118  } else
119  LOG(info) << fName << ": Closing " << fTimeSlice->ToString();
120 
121  // --- No action if time slice is empty and empty slices are not stored
122  if (fTimeSlice->IsEmpty() && (!fStoreEmptySlices)) return;
123 
124  // --- Fill the list of events contributing to the time slice
125  CopyEventList();
126  fEventsCurrent->Sort();
127 
128  // --- Call user-defined method FillCustomData
129  for (auto entry : fDigitizers) {
130  if (entry.second) entry.second->FillCustomData(1, kTRUE);
131  } //# Digitisers
132 
133  // --- Check the output for being time-sorted
134  assert(CheckOutput());
135 
136  // --- Fill the ROOT tree
137  FairRootManager::Instance()->Fill();
138 
139  // --- Bookkeeping and debug
145  if (gLogger->IsLogNeeded(fair::Severity::debug)) PrintCurrentEventRange();
146  LOG(info) << GetName() << " " << GetBufferStatus();
147 }
148 // ===========================================================================
149 
150 
151 // ===== Copy event list to output branch ================================
153 
154  Int_t nMCEvents = 0;
155  CbmMatch match = fTimeSlice->GetMatch();
156  for (Int_t iLink = 0; iLink < match.GetNofLinks(); iLink++) {
157  Int_t input = match.GetLink(iLink).GetFile();
158  Int_t event = match.GetLink(iLink).GetEntry();
159  Double_t time = fEventList.GetEventTime(event, input);
160  fEventsCurrent->Insert(event, input, time);
161  nMCEvents++;
162  }
163 
164  return nMCEvents;
165 }
166 // ===========================================================================
167 
168 
169 // ===== Task execution ==================================================
170 void CbmDaq::Exec(Option_t*) {
171 
172  // Start timer and digi counter
173  fTimer.Start();
174  Int_t nDigis = 0;
175 
176  // Event info
177  Int_t file = FairRunAna::Instance()->GetEventHeader()->GetInputFileId();
178  Int_t event = FairRootManager::Instance()->GetEntryNr();
179  Double_t eventTime = FairRunAna::Instance()->GetEventHeader()->GetEventTime();
180  fEventList.Insert(event, file, eventTime);
181 
182  // Status
183  LOG(debug) << GetName() << " " << GetBufferStatus();
184  Double_t fillTime = fTimeEventPrevious - fLatency;
185  if (fTimeSlice->IsEvent()) fillTime = -1.;
186  LOG(debug) << GetName() << ": Fill time is " << fillTime << " ns";
187 
188  // Regular mode: Time slices up to the previous event time minus the latency
189  // can be filled and closed.
190  if (fTimeSlice->IsRegular()) {
192  nDigis += FillTimeSlice(kTRUE, fillTime);
193  CloseTimeSlice();
195  }
196  }
197 
198  // Flexible mode: Fill the time slice from the buffers, but do not close it.
199  else if (fTimeSlice->IsFlexible()) {
200  nDigis += FillTimeSlice(kTRUE, fillTime);
201  }
202 
203  // Event mode: Fill the time slice and close it.
204  else if (fTimeSlice->IsEvent()) {
205  nDigis += FillTimeSlice(kFALSE);
206  CloseTimeSlice();
208  }
209 
210  // --- Save event time for next execution
211  fTimeEventPrevious = eventTime;
212 
213  // --- Event log
214  LOG(info) << left << setw(15) << GetName() << "[" << fixed << setprecision(3)
215  << fTimer.RealTime() << " s]"
216  << " Transported digis: " << nDigis << ", " << GetBufferStatus();
217 
218  // --- Increase exec counter
219  fNofEvents++;
220  fNofDigis += nDigis;
221 }
222 // ===========================================================================
223 
224 
225 // ===== Fill current time slice with data from buffers ==================
226 ULong64_t CbmDaq::FillTimeSlice(Bool_t timeLimit, Double_t tMax) {
227 
228  if (timeLimit)
229  LOG(debug) << GetName() << ": Fill time slice up to t = " << tMax << " ns";
230  else
231  LOG(debug) << GetName() << ": Fill time slice";
232  LOG(debug) << GetName() << " " << GetBufferStatus(kTRUE);
233  LOG(debug) << GetName() << ": " << fTimeSlice->ToString();
234 
235  // --- Move data from DAQ buffers into current time slice
236  std::stringstream ss;
237  ss << GetName() << ": Fill data: ";
238  ULong64_t nDataAll = 0;
239  ULong64_t nData = 0;
240  for (auto digitizer : fDigitizers) {
241  if (timeLimit)
242  nData = digitizer.second->FillTimeSlice(fTimeSlice, tMax);
243  else
244  nData = digitizer.second->FillTimeSlice(fTimeSlice);
245  ss << " " << CbmModuleList::GetModuleNameCaps(digitizer.first) << " "
246  << nData;
247  nDataAll += nData;
248  }
249  LOG(debug) << ss.str();
250  LOG(debug) << GetName() << " " << GetBufferStatus(kTRUE);
251  LOG(debug) << GetName() << fTimeSlice->ToString();
252  LOG(debug) << GetName() << ": total " << nData << " moved";
253 
254  return nDataAll;
255 }
256 // ===========================================================================
257 
258 
259 // ===== End-of-run action ===============================================
261 
262  std::cout << std::endl;
263  LOG(info) << fName << ": Finish run";
264  LOG(info) << GetBufferStatus(kTRUE);
265 
266  // --- In regular mode: Fill the remaining buffer data into time slices
267  // --- until the buffers are empty.
268  if (fTimeSlice->IsRegular()) {
269  do {
270  fNofDigis += FillTimeSlice(kFALSE);
271  CloseTimeSlice();
273  } while (!IsDaqBufferEmpty());
274  }
275 
276  // --- For flexible time slice: Fill the remaining buffer data
277  // --- into the time slice. After that, the buffers should be empty.
278  else if (fTimeSlice->IsFlexible()) {
279  fNofDigis += FillTimeSlice(kFALSE);
280  CloseTimeSlice();
281  if (!IsDaqBufferEmpty()) {
282  LOG(info) << GetBufferStatus();
283  LOG(fatal) << GetName() << ": Time-slice mode is flexible but "
284  << " buffers are not empty after fill!";
285  }
286  }
287 
288  // --- In event mode, the buffers should be empty
289  else {
290  if (!IsDaqBufferEmpty()) {
291  LOG(info) << GetBufferStatus();
292  LOG(fatal) << GetName() << ": Time-slice mode is event but "
293  << " buffers are not empty!";
294  }
295  }
296 
297 
298  std::cout << std::endl;
299  LOG(info) << "=====================================";
300  LOG(info) << GetName() << ": Run summary";
301  LOG(info) << "Events: " << setw(10) << right << fNofEvents;
302  LOG(info) << "Digis: " << setw(10) << right << fNofDigis << " from "
303  << setw(10) << right << fixed << setprecision(1) << fTimeDigiFirst
304  << " ns to " << setw(10) << right << fixed << setprecision(1)
305  << fTimeDigiLast << " ns";
306  LOG(info) << "Digis ignored: " << setw(10) << right << fNofDigisIgnored;
307  if (fTimeSlice->IsRegular())
308  LOG(info) << "Time slices: " << setw(10) << right << fNofTimeSlices
309  << " from " << setw(10) << right << fixed << setprecision(1)
310  << fTimeSliceFirst << " ns to " << setw(10) << right << fixed
311  << setprecision(1) << fTimeSliceLast << " ns";
312  else
313  LOG(info) << "Time slices: " << setw(10) << right << fNofTimeSlices;
314  LOG(info) << "Empty slices: " << setw(10) << right << fNofTimeSlicesEmpty;
315  LOG(info) << "=====================================";
316 
317  std::cout << std::endl;
318  LOG(info) << fEventList.ToString();
319  // fEventList.Print();
320 }
321 // ===========================================================================
322 
323 
324 // ===== Number of data in DAQ buffers ===================================
325 ULong64_t CbmDaq::GetBufferSize() const {
326  ULong64_t nData = 0;
327  for (auto& digitizer : fDigitizers)
328  nData += digitizer.second->GetDaqBufferSize();
329  return nData;
330 }
331 // ===========================================================================
332 
333 
334 // ===== DAQ buffer status to string =====================================
335 std::string CbmDaq::GetBufferStatus(Bool_t verbose) const {
336  stringstream ss;
337  if (IsDaqBufferEmpty()) {
338  ss << "Buffer status: empty";
339  return ss.str();
340  }
341  ss << "Buffer status: " << GetBufferSize()
342  << " data from t = " << GetBufferTimeFirst() << " to "
343  << GetBufferTimeLast() << " ns";
344  if (verbose) {
345  for (auto& digitizer : fDigitizers)
346  ss << "\n " << CbmModuleList::GetModuleNameCaps(digitizer.first)
347  << " " << digitizer.second->GetDaqBufferStatus();
348  }
349  return ss.str();
350 }
351 // ===========================================================================
352 
353 
354 // ===== Time of first datum in DAQ buffers ==============================
355 Double_t CbmDaq::GetBufferTimeFirst() const {
356  Double_t tMin = -1.;
357  for (auto& digitizer : fDigitizers) {
358  Double_t test = digitizer.second->GetDaqBufferTimeFirst();
359  if (tMin < 0.)
360  tMin = test;
361  else
362  tMin = (tMin < test ? tMin : test);
363  }
364  return tMin;
365 }
366 // ===========================================================================
367 
368 
369 // ===== Time of last datum in DAQ buffers ===============================
370 Double_t CbmDaq::GetBufferTimeLast() const {
371  Double_t tMax = -1.;
372  for (auto& digitizer : fDigitizers) {
373  Double_t test = digitizer.second->GetDaqBufferTimeLast();
374  if (tMax < 0.)
375  tMax = test;
376  else
377  tMax = (tMax > test ? tMax : test);
378  }
379  return tMax;
380 }
381 // ===========================================================================
382 
383 
384 // ===== Task initialisation =============================================
385 InitStatus CbmDaq::Init() {
386 
387  std::cout << std::endl;
388  LOG(info) << "==========================================================";
389  LOG(info) << fName << ": Initialisation";
390 
391 
392  // --- Set the initial time slice
393  if (fIsEventByEvent) {
394  LOG(info) << fName << ": Event mode";
396  } else {
397  if (fTimeSliceLength > 0.) {
398  LOG(info) << fName << ": Time-based mode, time slice duration "
399  << fTimeSliceLength << " ns";
401  } else {
402  LOG(info) << fName << ": Time-based mode, flexible time slice";
404  }
405  }
406  fTimeEventPrevious = -1.;
408 
409 
410  // --- Register output branch TimeSlice
411  FairRootManager::Instance()->Register("TimeSlice.", "DAQ", fTimeSlice, kTRUE);
412 
413  // --- Register output branch MCEventList
415  FairRootManager::Instance()->Register(
416  "MCEventList.", "DAQ", fEventsCurrent, kTRUE);
417 
418  LOG(info) << GetName() << ": Initialisation successful";
419  LOG(info) << "==========================================================";
420  std::cout << std::endl;
421 
422  return kSUCCESS;
423 }
424 // ===========================================================================
425 
426 
427 // ===== Check for empty DAQ buffers =====================================
428 Bool_t CbmDaq::IsDaqBufferEmpty() const {
429  Bool_t empty = kTRUE;
430  for (auto digitizer : fDigitizers) {
431  if (digitizer.second->GetDaqBufferSize()) {
432  empty = kFALSE;
433  break;
434  }
435  }
436  return empty;
437 }
438 // ===========================================================================
439 
440 
441 // ===== Print current event range =======================================
443 
444  std::stringstream ss;
445  ss << GetName() << ": Current MC event range: ";
446  if (fEventRange.empty()) {
447  ss << "empty";
448  LOG(info) << ss.str();
449  return;
450  }
451  auto it = fEventRange.begin();
452  while (it != fEventRange.end()) {
453  Int_t file = it->first;
454  Int_t firstEvent = it->second.first;
455  Int_t lastEvent = it->second.second;
456  ss << "\n Input file " << file << ", first event " << firstEvent
457  << ", last event " << lastEvent;
458  it++;
459  } //# inputs
460  LOG(info) << ss.str();
461 }
462 // ===========================================================================
463 
464 
465 // ===== Set the digitizer for a given system ============================
467  assert(digitizer);
468  fDigitizers[system] = digitizer;
469 }
470 // ===========================================================================
471 
472 
473 // ===== Start a new time slice ==========================================
475 
476  // --- Reset the time slice header
477  if (fTimeSlice->IsRegular()) {
478  Double_t newStart = fTimeSlice->GetStartTime() + fTimeSliceLength;
479  fTimeSlice->Reset(newStart, fTimeSliceLength);
480  } else
481  fTimeSlice->Reset();
482 
483  // --- Reset event range and event list
484  fEventRange.clear();
485  fEventsCurrent->Clear("");
486 
487  // --- Clear data output arrays
488  for (auto entry : fDigitizers)
489  entry.second->ClearOutput();
490 }
491 // ===========================================================================
492 
493 
CbmDaq::Exec
virtual void Exec(Option_t *opt)
Task execution.
Definition: CbmDaq.cxx:170
CbmDigitizeBase.h
CbmDaq::fDigitizers
std::map< ECbmModuleId, CbmDigitizeBase * > fDigitizers
Output arrays (digis)
Definition: CbmDaq.h:132
CbmMatch
Definition: CbmMatch.h:22
CbmMCEventList::Sort
void Sort()
Sort the list.
Definition: CbmMCEventList.cxx:133
CbmTimeSlice::IsEvent
Bool_t IsEvent() const
Definition: CbmTimeSlice.h:141
CbmDaq::CloseTimeSlice
void CloseTimeSlice()
Definition: CbmDaq.cxx:112
CbmTimeSlice::Reset
void Reset()
Reset the time slice.
Definition: CbmTimeSlice.cxx:166
CbmMCEventList::Insert
Bool_t Insert(UInt_t event, UInt_t file, Double_t time)
Definition: CbmMCEventList.cxx:116
CbmDaq.h
CbmTimeSlice::IsRegular
Bool_t IsRegular() const
Definition: CbmTimeSlice.h:153
CbmMatch::GetLink
const CbmLink & GetLink(Int_t i) const
Definition: CbmMatch.h:35
CbmDaq::fTimeSliceLength
Double_t fTimeSliceLength
Time-slice length [ns].
Definition: CbmDaq.h:114
CbmMatch::GetNofLinks
Int_t GetNofLinks() const
Definition: CbmMatch.h:38
CbmDaq::fTimeSlice
CbmTimeSlice * fTimeSlice
Array of registered digitizers.
Definition: CbmDaq.h:133
CbmDaq::fEventsCurrent
CbmMCEventList * fEventsCurrent
MC event list (all)
Definition: CbmDaq.h:135
CbmDaq::~CbmDaq
~CbmDaq()
Destructor
Definition: CbmDaq.cxx:97
CbmDaq::CbmDaq
CbmDaq(Bool_t eventMode=kFALSE)
Constructor.
Definition: CbmDaq.cxx:43
CbmDaq::PrintCurrentEventRange
void PrintCurrentEventRange() const
Definition: CbmDaq.cxx:442
CbmTimeSlice::IsFlexible
Bool_t IsFlexible() const
Definition: CbmTimeSlice.h:147
CbmDaq::SetDigitizer
void SetDigitizer(ECbmModuleId system, CbmDigitizeBase *digitizer)
Set the digitizer for a given system.
Definition: CbmDaq.cxx:466
ECbmModuleId
ECbmModuleId
Definition: CbmDefs.h:33
CbmDaq::fTimeEventPrevious
Double_t fTimeEventPrevious
Time of previous event [ns].
Definition: CbmDaq.h:117
CbmDaq::Finish
virtual void Finish()
Definition: CbmDaq.cxx:260
CbmDaq::fTimeSliceFirst
Double_t fTimeSliceFirst
Start time of first time slice.
Definition: CbmDaq.h:126
CbmTimeSlice::GetStartTime
Double_t GetStartTime() const
Definition: CbmTimeSlice.h:108
CbmTimeSlice::GetMatch
const CbmMatch & GetMatch() const
Definition: CbmTimeSlice.h:99
CbmMatch.h
CbmDaq::Init
virtual InitStatus Init()
Initialisation.
Definition: CbmDaq.cxx:385
CbmTimeSlice.h
CbmDaq::fEventList
CbmMCEventList fEventList
Current time slice.
Definition: CbmDaq.h:134
CbmTimeSlice::GetEndTime
Double_t GetEndTime() const
Definition: CbmTimeSlice.cxx:94
CbmDaq::fNofEvents
Int_t fNofEvents
Number of processed events.
Definition: CbmDaq.h:119
CbmDaq::fTimer
TStopwatch fTimer
Definition: CbmDaq.h:129
CbmModuleList::GetModuleNameCaps
static TString GetModuleNameCaps(ECbmModuleId moduleId)
Definition: CbmModuleList.cxx:77
CbmDaq::GetBufferSize
ULong64_t GetBufferSize() const
Size of DAQ buffers @value Sum of number of data in all DAQ buffers.
Definition: CbmDaq.cxx:325
CbmMCEventList::GetEventTime
Double_t GetEventTime(UInt_t event, UInt_t file)
Event start time.
Definition: CbmMCEventList.cxx:86
CbmDaq::FillTimeSlice
ULong64_t FillTimeSlice(Bool_t timeLimit, Double_t fillTime=-1.)
Definition: CbmDaq.cxx:226
CbmMCEventList::ToString
std::string ToString(const char *option="") const
Definition: CbmMCEventList.cxx:143
CbmDaq::fNofTimeSlicesEmpty
Int_t fNofTimeSlicesEmpty
Number of empty time slices.
Definition: CbmDaq.h:123
ClassImp
ClassImp(CbmConverterManager) InitStatus CbmConverterManager
Definition: CbmConverterManager.cxx:12
CbmDaq
CBM task class for filling digis into time slices.
Definition: CbmDaq.h:40
CbmDaq::fTimeSliceLast
Double_t fTimeSliceLast
Stop time of last time slice.
Definition: CbmDaq.h:127
CbmMCEventList
Container class for MC events with number, file and start time.
Definition: CbmMCEventList.h:38
CbmDaq::fNofDigisIgnored
Int_t fNofDigisIgnored
Number of ignored digis.
Definition: CbmDaq.h:121
CbmModuleList.h
CbmDaq::fIsEventByEvent
Bool_t fIsEventByEvent
Flag for event-by-event mode.
Definition: CbmDaq.h:113
CbmDaq::StartNextTimeSlice
void StartNextTimeSlice()
Start a new time slice in the output tree.
Definition: CbmDaq.cxx:474
CbmDaq::fEventRange
std::map< Int_t, std::pair< Int_t, Int_t > > fEventRange
MC events for current time slice.
Definition: CbmDaq.h:139
CbmTimeSlice::ToString
std::string ToString() const
Definition: CbmTimeSlice.cxx:196
CbmDaq::fLatency
Double_t fLatency
Maximal time disorder of input data [ns].
Definition: CbmDaq.h:115
CbmTimeSlice
Bookkeeping of time-slice content.
Definition: CbmTimeSlice.h:29
CbmMCEventList::Clear
virtual void Clear(Option_t *)
Delete all event entries.
Definition: CbmMCEventList.h:50
CbmDaq::IsDaqBufferEmpty
Bool_t IsDaqBufferEmpty() const
Check for empty DAQ buffers.
Definition: CbmDaq.cxx:428
CbmTimeSlice::GetTimeDataLast
Double_t GetTimeDataLast() const
Time stamp of last data.
Definition: CbmTimeSlice.h:129
CbmDaq::fTimeDigiFirst
Double_t fTimeDigiFirst
Time of first digi.
Definition: CbmDaq.h:124
CbmDaq::fStoreEmptySlices
Bool_t fStoreEmptySlices
Flag to store also empty time slices.
Definition: CbmDaq.h:116
CbmDaq::CopyEventList
Int_t CopyEventList()
Definition: CbmDaq.cxx:152
CbmDaq::fNofTimeSlices
Int_t fNofTimeSlices
Number of time slices.
Definition: CbmDaq.h:122
CbmDaq::fTimeDigiLast
Double_t fTimeDigiLast
Time of last digi.
Definition: CbmDaq.h:125
CbmDaq::GetBufferTimeFirst
Double_t GetBufferTimeFirst() const
Time of first datum in DAQ buffers @value Minimum time stamp in all DAQ buffers.
Definition: CbmDaq.cxx:355
CbmTimeSlice::kEvent
@ kEvent
Flexible time slice; no fixed time limits.
Definition: CbmTimeSlice.h:36
CbmDigitizeBase
Abstract base class for CBM digitisation tasks.
Definition: CbmDigitizeBase.h:26
CbmTimeSlice::IsEmpty
Bool_t IsEmpty() const
Definition: CbmTimeSlice.h:135
CbmDaq::GetBufferStatus
std::string GetBufferStatus(Bool_t verbose=kFALSE) const
Debug output of DAQ buffer status @value String with status of DAQ buffers.
Definition: CbmDaq.cxx:335
CbmTimeSlice::GetTimeDataFirst
Double_t GetTimeDataFirst() const
Time stamp of first data.
Definition: CbmTimeSlice.h:123
CbmDaq::CheckOutput
Bool_t CheckOutput() const
Check the output arrays for being time-sorted.
Definition: CbmDaq.cxx:102
CbmTimeSlice::kFlexible
@ kFlexible
Regular time slice with fixed-size time interval.
Definition: CbmTimeSlice.h:35
CbmDaq::GetBufferTimeLast
Double_t GetBufferTimeLast() const
Time of last datum in DAQ buffers @value Maximum time stamp in all DAQ buffers.
Definition: CbmDaq.cxx:370
CbmDaq::fNofDigis
Int_t fNofDigis
Total number of processed digis.
Definition: CbmDaq.h:120