Jpp  test_elongated_shower_pde
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JRunAnalyzer.hh
Go to the documentation of this file.
1 #ifndef __JRUNANALYZER__
2 #define __JRUNANALYZER__
3 
4 #include "JSupport/JSupport.hh"
9 #include "JROOT/JManager.hh"
10 #include "JTools/JQuantile.hh"
11 #include "TFile.h"
12 #include "TH1D.h"
13 #include "JRunHistograms.hh"
14 
15 using namespace std ;
16 using namespace KM3NETDAQ ;
17 using namespace JPP ;
18 
19 /**
20  * \author rgruiz, adomi
21  */
22 
24 
25 /**
26  * Class dedicated to the analysis of %KM3NeT runs.
27  *
28  */
29 class JRunAnalyzer {
30 
31  string inputFile;
39 
40 public :
41 
42  /**
43  * Default constructor.
44  */
46 
47  /**
48  * Constructor.
49  *
50  * \param file Path to the file to be analyzed
51  * \param detectorFile path to a detector file
52  * \param nTimeslices Number of timeslices to be read
53  * \param nSummaryslices Number of summary slices to be read
54  * \param nEvents Number of frames to be read
55  * \param pmtanalysis Option for analysis of PMT data
56  */
57  JRunAnalyzer (string file , string detectorFile , JLimit_t nTimeslices , JLimit_t nSummaryslices , JLimit_t nEvents, bool pmtanalysis):
58  inputFile (file),
59  router (NULL),
60  numberOfTimeslices (nTimeslices),
61  numberOfSummaryslices (nSummaryslices),
62  numberOfEvents (nEvents),
63  pmt_analysis (pmtanalysis)
64  {
65  try {
66  load (detectorFile, detector);
67  }
68  catch(const JException & error) {
69  cerr << "FATAL ERROR. Could not open detector file '" << detectorFile << "'." << endl;
70  exit(1);
71  }
72 
73  histograms = JRA_Histograms(detector);
74  router = new JModuleRouter(detector);
75  highest_floor = getRangeOfFloors(detector).getUpperLimit();
76  }
77 
78  /**
79  * Destructor.
80  */
82 
83  /*
84  * Function template used to read time ordered events from a tree.
85  *
86  * \param scanner A JTreeScanner
87  * \param
88  */
90 
91  while (scanner.hasNext()) {
92 
93  JDAQEvent event = *(scanner.next());
94 
95  histograms.h_trigger.h_Snapshot_hits -> Fill((Double_t) event.size<JDAQSnapshotHit> ());
96  histograms.h_trigger.h_Triggered_hits -> Fill((Double_t) event.size<JDAQTriggeredHit> ());
97  histograms.h_trigger.h_Triggered_over_Snapshot_hits -> Fill((Double_t) event.size<JDAQTriggeredHit> () / event.size<JDAQSnapshotHit > ());
98  histograms.h_trigger.h_Number_of_overlays -> Fill(event.getOverlays());
99 
100  for (unsigned int i = 0; i != NUMBER_OF_TRIGGER_BITS; ++i) {
101 
102  if (event.hasTriggerBit(i)) {
103 
104  histograms.h_trigger.h_Trigger_bit_event -> Fill((Double_t) i);
105  }
106  }
107 
108  int counter_3dmuon = 0;
109  double tmin = numeric_limits<double>::max();
110  double tmax = 0;
111 
112  for (JDAQEvent::const_iterator<JDAQTriggeredHit> hit = event.begin<JDAQTriggeredHit>(); hit != event.end<JDAQTriggeredHit>(); ++hit) {
113 
114  if(hit->getT() < tmin) tmin = hit->getT();
115  if(hit->getT() > tmax) tmax = hit->getT();
116 
117  JDAQTriggerMask trigger_mask(event.getTriggerMask(*hit));
118 
119  if(trigger_mask.hasTriggerBit(getTriggerBit<JTrigger3DMuon>())) counter_3dmuon++;
120 
121  if (router->hasModule(hit->getModuleID())) {
122 
123  const JModule& module = router->getModule (hit->getModuleID());
124 
125  histograms.h_trigger.h_pmt_distribution_triggered_hits->Fill(hit->getPMT());
126  histograms.h_trigger.h_tot_distribution_triggered_hits->Fill(hit->getToT());
127 
128  int String = module.getString();
129  int Floor = module.getFloor();
130 
131  histograms.h_trigger.h_Triggered_hits_per_module -> Fill(String , Floor);
132 
133  if(trigger_mask.hasTriggerBit(getTriggerBit<JTrigger3DMuon>())){
134  histograms.h_trigger.h_Triggered_hits_3dmuon_per_module -> Fill(String , Floor);
135  }
136 
137  for (unsigned int i = 0; i != NUMBER_OF_TRIGGER_BITS; ++i) {
138 
139  if (hit -> hasTriggerBit(i)) {
140 
141  histograms.h_trigger.h_Trigger_bit_hit->Fill((Double_t) i);
142  }
143  }
144  }else{
145  FATAL("JModuleRouter trying to access non existing identifier: "<< hit->getModuleID());
146  }
147  }
148 
149  histograms.h_trigger.h_event_duration->Fill(tmax - tmin);
150 
151  histograms.h_trigger.h_pmt_distribution_triggered_hits->Scale(1. / (Double_t) event.size<JDAQTriggeredHit> ());
152 
153  if(counter_3dmuon != 0) histograms.h_trigger.h_Triggered_hits_3dmuon->Fill(counter_3dmuon);
154 
155  for (JDAQEvent::const_iterator<JDAQSnapshotHit> hit = event.begin<JDAQSnapshotHit>() ; hit != event.end<JDAQSnapshotHit>() ; ++hit){
156 
157  if (router->hasModule(hit->getModuleID())) {
158 
159  const JModule& module = router->getModule (hit->getModuleID());
160 
161  int String = module.getString();
162  int Floor = module.getFloor();
163  int pmt = hit-> getPMT();
164 
165  if(pmt_analysis == true){
166 
167  (*histograms.h_trigger.m_Snapshot_hits_per_pmt)[MAKE_STRING("Detector/DU" + to_string(String))] -> Fill(pmt, Floor);
168 
169  }
170 
171  histograms.h_trigger.h_pmt_distribution_snapshot_hits -> Fill(hit->getPMT());
172  histograms.h_trigger.h_tot_distribution_snapshot_hits -> Fill(hit->getToT());
173  histograms.h_trigger.h_Snapshot_hits_per_module -> Fill(String, Floor);
174 
175 
176  }else{
177  FATAL("JModuleRouter trying to access non existing identifier: "<< hit->getModuleID());
178  }
179  }
180  }
181  }
182 
183 
184  struct value_type :
185  public vector< vector<JQuantile> >
186  {
189  {}
190  };
191 
192  /*
193  * Function template to read and process time ordered summary slices.
194  *
195  * \param scanner A JTreeScanner from which time ordered summary slices are accessed.
196  */
198 
199  map<int, value_type> PMT_rate_quantiles;
200  std::map <int, vector<JQuantile>> DOM_rate_quantiles;
201 
202  while (scanner.hasNext()){
203 
204  JDAQSummaryslice slice = *(scanner.next());
205 
206  for (JDAQSummaryslice::const_iterator frame = slice.begin() ; frame != slice.end() ; ++ frame) {
207 
208  if (router->hasModule(frame->getModuleID())) {
209 
210  const JModule& module = router->getModule (frame->getModuleID());
211 
212  int string = module.getString();
213  int floor = module.getFloor ();
214 
215  JDAQFrameStatus status = frame -> getDAQFrameStatus();
216  int nFIFOcount = status.countFIFOStatus();
217  int nHRVcount = status.countHighRateVeto();
218 
219  if (nHRVcount > 0) {
220  histograms.h_summary.h_hrv_per_dom->Fill(string , floor, nHRVcount);
221  }
222 
223  if (status.testDAQStatus() == false) {
224  histograms.h_summary.h_daq_status_per_dom->Fill(string , floor, (1./distance(scanner.begin(), scanner.end()))*100);
225  }
226 
227  histograms.h_summary.h_fifo_per_dom->Fill(string , floor , nFIFOcount);
228 
229  if(pmt_analysis == true){
230 
231  TH2D* h2 = (*histograms.h_summary.m_summary_rate_distribution)[MAKE_STRING("Detector/DU" + to_string(string) + "/F" + to_string(floor))];
232 
233  double rate = 0;
234  const double factor = 1.0e-3; // [kHz]
235 
236  for (int i = 0 ; i < NUMBER_OF_PMTS ; i++){
237 
238  rate += frame->getRate(i, factor);
239 
240  h2->Fill(i , frame->getRate(i, factor));
241 
242  PMT_rate_quantiles[string][floor][i].put(frame->getRate(i, factor));
243 
244  histograms.h_summary.h_pmt_rate_distribution->Fill(frame->getRate(i, factor), frame->getWeight(i, factor));
245 
246  }
247 
248  histograms.h_summary.h_dom_rate_distribution->Fill(rate);
249 
250  DOM_rate_quantiles[string].resize(highest_floor + 1);
251 
252  DOM_rate_quantiles[string][floor].put(rate);
253 
254  } else {
255 
256  double rate = 0;
257  const double factor = 1.0e-3; // [kHz]
258 
259  for (int i = 0 ; i < NUMBER_OF_PMTS ; i++){
260 
261  rate += frame->getRate(i, factor);
262 
263  histograms.h_summary.h_pmt_rate_distribution->Fill(frame->getRate(i, factor), frame->getWeight(i, factor));
264  }
265 
266  histograms.h_summary.h_dom_rate_distribution->Fill(rate);
267 
268  DOM_rate_quantiles[string].resize(highest_floor + 1);
269 
270  DOM_rate_quantiles[string][floor].put(rate);
271 
272  }
273 
274  }else{
275  FATAL("JModuleRouter trying to access non existing identifier: "<< frame->getModuleID());
276  }
277  }
278  }
279 
280  for (std::map<int , vector<JQuantile> >::const_iterator i = DOM_rate_quantiles.begin() ; i!= DOM_rate_quantiles.end() ; ++i) {
281 
282  for (int j=1; j <= highest_floor; j++) {
283 
284  if (i->second[j].getCount() > 0) histograms.h_summary.h_rate_summary->Fill(i->first, j, i->second[j].getMean());
285  }
286  }
287 
288  if(pmt_analysis == true){
289 
290  for(map<int, value_type>::const_iterator i = PMT_rate_quantiles.begin(); i != PMT_rate_quantiles.end(); ++i) {
291 
292  for (int j = 1; j <= highest_floor; j++){
293 
294  for (int k=0 ; k < NUMBER_OF_PMTS ; k++){
295 
296  if (i -> second[j][k].getCount() > 0){
297 
298  (*histograms.h_summary.m_mean_summary_rate) [MAKE_STRING("Detector/DU" + to_string(i->first))]->Fill(k, j, i->second[j][k].getMean());
299  (*histograms.h_summary.m_mean_summary_rate_distribution)[MAKE_STRING("Detector/DU" + to_string(i->first))]->Fill( i->second[j][k].getMean());
300  }
301  }
302  }
303  }
304  }
305  }
306 
307  /*
308  * Function template to read and process time ordered timeslices.
309  *
310  * \param scanner A JTreeScanner from which time ordered timeslices are accessed.
311  * \param frame_index_range the range of the indices of the frames to be accessed.
312  */
313  template <class T>
315 
317 
318  std::map < int , std::map <int , JQuantile> > DOM_rate_quantiles;
319 
320  double inverseFrameTimeSec = 1. / (1.0e-9 * getFrameTime());
321 
322  while (scanner.hasNext()){
323 
324  T slice = *(scanner.next());
325 
326  for(auto & frame : slice) {
327  if (router->hasModule(frame.getModuleID())) {
328 
329  const JModule& module = router->getModule (frame.getModuleID());
330  double rate = frame.numberOfHits * inverseFrameTimeSec;
331  int string = module.getString();
332  int floor = module.getFloor ();
333 
334  DOM_rate_quantiles[string][floor].put(rate);
335 
336  vector <int> pmt_hit_count (NUMBER_OF_PMTS , 0) ;
337 
338  if(pmt_analysis == true){
339 
340  TH2D* h2 = (*histograms.h_timeslice.m_pmt_tot_distributions[ts_type])[MAKE_STRING("Detector/DU" + to_string(string) + "/F" + to_string(floor) + "/" + to_string(frame.getModuleID()))];
341 
342  for (JDAQSuperFrame::const_iterator hit = frame.begin() ; hit != frame.end() ; ++hit){
343 
344  h2 -> Fill(hit->getPMT() , hit->getToT()) ;
345 
346  pmt_hit_count[hit->getPMT()]++;
347 
348  }
349 
350  for (int pmt = 0 ; pmt != NUMBER_OF_PMTS ; ++pmt) {
351 
352  (*histograms.h_timeslice.m_pmt_rate_distributions[ts_type])[MAKE_STRING("Detector/DU" + to_string(string) + "/F" + to_string(floor))] -> Fill(pmt , 1e-3 * pmt_hit_count[pmt] * inverseFrameTimeSec);
353 
354  }
355 
356  }
357 
358  }else{
359  FATAL("JModuleRouter trying to access non existing identifier: "<< frame.getModuleID());
360  }
361  }
362  }
363 
364 
365  for (std::map< int , std::map<int,JQuantile>>::const_iterator i = DOM_rate_quantiles.begin() ; i != DOM_rate_quantiles.end() ; i++){
366 
367  for (std::map<int , JQuantile>::const_iterator j = i->second.begin() ; j != i->second.end() ; j++){
368 
369  if (j->second.getCount() > 0) histograms.h_timeslice.h_dom_mean_rates[ts_type] -> Fill (i->first , j->first , j->second.getMean() ) ;
370  }
371  }
372  }
373 
374 
375  /*
376  * Checks through the use of a JTreeScanner, if summary slices are present in the run file.
377  * In case they are, the corresponding tree is iterated.
378  *
379  */
381 
382  JTreeScanner <JDAQSummaryslice> scanner(inputFile, numberOfSummaryslices);
383  if (scanner.hasNext()) {
384  histograms.initialize_summary_histograms();
385  scanner.rewind();
386  iterateSummarysliceTree(scanner);
387  }
388  }
389 
390 
391  /*
392  * Function template that checks through the use of a JTreeScanner, if objects of different timeslice classes are present in the run file.
393  * In case they are, the corresponding tree is iterated.
394  *
395  */
396  template <class T>
398 
399  JTreeScanner <T> scanner(inputFile, numberOfTimeslices);
400  if(scanner.hasNext()) {
401 
402  histograms.initialize_timeslice_histograms <T>();
403  scanner.rewind();
404  iterateTimesliceTree(scanner);
405  }
406  }
407 
408 
409  /*
410  * Function template that checks through the use of a JTreeScanner, if JDAQEvent objects are present in the run file.
411  * In case they are, the corresponding tree is read.
412  *
413  */
414  void readEvents() {
415 
416  JTreeScanner <JDAQEvent> scanner(inputFile, numberOfEvents);
417 
418  if(scanner.hasNext()) {
419 
420  histograms.initialize_trigger_histograms();
421  scanner.rewind();
422  iterateEventTree(scanner);
423  }
424  }
425 
426  /*
427  * Returns the histograms produced from the data in the file.
428  */
430 
431  return histograms ;
432  }
433 
434  /*
435  * Writes the histograms to a root file.
436  * \param f The root file.
437  */
438  void writeToFile(TFile & f){
439 
440  f.mkdir("Detector");
441  f .cd("Detector");
442 
443  if (histograms.h_summary.h_fifo_per_dom) histograms.h_summary.h_fifo_per_dom -> Write();
444  if (histograms.h_summary.h_daq_status_per_dom) histograms.h_summary.h_daq_status_per_dom -> Write();
445  if (histograms.h_summary.h_hrv_per_dom) histograms.h_summary.h_hrv_per_dom -> Write();
446  if (histograms.h_summary.h_rate_summary) histograms.h_summary.h_rate_summary -> Write();
447  if (histograms.h_summary.h_pmt_rate_distribution) histograms.h_summary.h_pmt_rate_distribution -> Write();
448  if (histograms.h_summary.h_dom_rate_distribution) histograms.h_summary.h_dom_rate_distribution -> Write();
449 
450  histograms.Write_histogram_table_to_file(f , MAKE_STRING("Detector"), histograms.h_timeslice.h_dom_mean_rates);
451 
452  for (typename vector < JManager < string , TH2D >* >::const_iterator i = histograms.h_timeslice.m_pmt_tot_distributions.begin();
453  i != histograms.h_timeslice.m_pmt_tot_distributions.end() ; ++i){
454 
455  if ((*i)){
456 
457  for (typename JManager < string , TH2D >::const_iterator j = (*i) -> begin() ; j != (*i) -> end() ; ++j){
458 
459  j->second->Scale(1., "width");
460  }
461  }
462  }
463 
464  histograms.Write_manager_table_in_key_dir (f , histograms.h_timeslice.m_pmt_tot_distributions);
465  histograms.Write_manager_table_in_key_dir (f , histograms.h_timeslice.m_pmt_rate_distributions);
466 
467  if (histograms.h_summary.m_summary_rate_distribution) histograms.Write_manager_in_key_dir (f , histograms.h_summary.m_summary_rate_distribution);
468 
469  if (histograms.h_summary.m_mean_summary_rate) histograms.Write_manager_in_key_dir( f , histograms.h_summary.m_mean_summary_rate);
470  if (histograms.h_summary.m_mean_summary_rate_distribution) histograms.Write_manager_in_key_dir( f , histograms.h_summary.m_mean_summary_rate_distribution);
471 
472  histograms.h_timeslice.Fill_mean_ToT_histograms();
473 
474  histograms.Write_manager_table_in_key_dir (f , histograms.h_timeslice.m_mean_ToT);
475  histograms.Write_manager_table_in_key_dir (f , histograms.h_timeslice.m_mean_ToT_distribution);
476 
477  f.mkdir ( MAKE_STRING ("JDAQEvent").c_str());
478  f.cd ("JDAQEvent");
479 
480  if (histograms.h_trigger.h_Trigger_bit_event) histograms.h_trigger.h_Trigger_bit_event -> Write();
481  if (histograms.h_trigger.h_Trigger_bit_hit) histograms.h_trigger.h_Trigger_bit_hit -> Write();
482  if (histograms.h_trigger.h_Triggered_hits) histograms.h_trigger.h_Triggered_hits -> Write();
483  if (histograms.h_trigger.h_Triggered_hits_3dmuon) histograms.h_trigger.h_Triggered_hits_3dmuon -> Write();
484  if (histograms.h_trigger.h_Triggered_hits_3dmuon_per_module) histograms.h_trigger.h_Triggered_hits_3dmuon_per_module -> Write();
485  if (histograms.h_trigger.h_Snapshot_hits) histograms.h_trigger.h_Snapshot_hits -> Write();
486  if (histograms.h_trigger.h_Triggered_over_Snapshot_hits) histograms.h_trigger.h_Triggered_over_Snapshot_hits -> Write();
487  if (histograms.h_trigger.h_event_duration) histograms.h_trigger.h_event_duration -> Write();
488  if (histograms.h_trigger.h_Number_of_overlays) histograms.h_trigger.h_Number_of_overlays -> Write();
489  if (histograms.h_trigger.h_pmt_distribution_triggered_hits) {histograms.h_trigger.h_pmt_distribution_triggered_hits -> Write();}
490  if (histograms.h_trigger.h_pmt_distribution_snapshot_hits) {histograms.h_trigger.h_pmt_distribution_snapshot_hits -> Write();}
491  if (histograms.h_trigger.h_tot_distribution_triggered_hits) { histograms.h_trigger.h_tot_distribution_triggered_hits->Scale(1, "width") ; histograms.h_trigger.h_tot_distribution_triggered_hits-> Write();}
492  if (histograms.h_trigger.h_tot_distribution_snapshot_hits) {histograms.h_trigger.h_tot_distribution_snapshot_hits->Scale(1, "width") ; histograms.h_trigger.h_tot_distribution_snapshot_hits -> Write();}
493  if (histograms.h_trigger.h_Triggered_hits_per_module) { histograms.h_trigger.h_Triggered_hits_per_module-> Write();}
494  if (histograms.h_trigger.h_Snapshot_hits_per_module) { histograms.h_trigger.h_Snapshot_hits_per_module -> Write();}
495  if (histograms.h_trigger.m_Snapshot_hits_per_pmt) histograms.Write_manager_in_key_dir(f , histograms.h_trigger.m_Snapshot_hits_per_pmt);
496  }
497 };
498 
499 #endif
JDetector detector
Definition: JRunAnalyzer.hh:23
General exception.
Definition: JException.hh:23
DAQ key hit.
Definition: JDAQKeyHit.hh:19
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
void iterateTimesliceTree(JTreeScanner< T > &scanner)
ROOT TTree parameter settings of various packages.
static const unsigned int NUMBER_OF_TRIGGER_BITS
Number of trigger bits.
int countFIFOStatus() const
Count FIFO status.
JRunAnalyzer(string file, string detectorFile, JLimit_t nTimeslices, JLimit_t nSummaryslices, JLimit_t nEvents, bool pmtanalysis)
Constructor.
Definition: JRunAnalyzer.hh:57
int getFloor() const
Get floor number.
Definition: JLocation.hh:145
Data structure for a composite optical module.
Definition: JModule.hh:68
then set_variable PMT_FILE set_variable DAQ_FILE set_variable OUTPUT_FILE set_variable DETECTOR else fatal Wrong number of arguments fi set_variable RUNBYRUN file
Auxiliary class for trigger mask.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
JRA_Histograms histograms
Definition: JRunAnalyzer.hh:33
Auxiliary data structure for running average, standard deviation and quantiles.
Definition: JQuantile.hh:43
Detector data structure.
Definition: JDetector.hh:89
Template const_iterator.
Definition: JDAQEvent.hh:68
Router for direct addressing of module data in detector data structure.
then set_variable singlesRate set_variable doublesRate set_variable numberOfSlices echo Generating random background echo Singles rate
o $QUALITY_ROOT d $DEBUG!JPlot1D f
Definition: JDataQuality.sh:66
exit
Definition: JPizza.sh:36
string inputFile
Definition: JRunAnalyzer.hh:31
JLimit_t numberOfTimeslices
Definition: JRunAnalyzer.hh:35
Dynamic ROOT object management.
JModuleRouter * router
Definition: JRunAnalyzer.hh:32
void iterateSummarysliceTree(JTreeScanner< JDAQSummaryslice > &scanner)
Class dedicated to the analysis of KM3NeT runs.
Definition: JRunAnalyzer.hh:29
floor_range getRangeOfFloors(const JDetector &detector)
Get range of floors.
Template definition for direct access of elements in ROOT TChain.
Definition: JTreeScanner.hh:91
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:142
void writeToFile(TFile &f)
void readTimesliceData()
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
JRunAnalyzer()
Default constructor.
Definition: JRunAnalyzer.hh:45
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
Definition: JManager.hh:43
~JRunAnalyzer()
Destructor.
Definition: JRunAnalyzer.hh:81
Detector file.
Definition: JHead.hh:224
Hit data structure.
Definition: JDAQHit.hh:34
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
do set_variable OUTPUT_DIRECTORY $WORKDIR T
T getUpperLimit() const
Get upper limit.
Definition: JRange.hh:213
Support methods.
void readSummaryData()
void iterateEventTree(JTreeScanner< JDAQEvent > &scanner)
Definition: JRunAnalyzer.hh:89
#define FATAL(A)
Definition: JMessage.hh:67
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Direct access to module in detector data structure.
int getString() const
Get string number.
Definition: JLocation.hh:134
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
int countHighRateVeto() const
Count high-rate veto status.
JLimit_t numberOfEvents
Definition: JRunAnalyzer.hh:37
General purpose string class.
Definition: JHead.hh:150
std::string to_string(const T &value)
Convert value to string.
int getCount(const T &hit)
Get hit count.
JLimit_t numberOfSummaryslices
Definition: JRunAnalyzer.hh:36
int j
Definition: JPolint.hh:682
Indexing of data type in type list.
Definition: JTypeList.hh:310
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Definition: JDAQ.hh:26
bool testDAQStatus() const
Test DAQ status of packets.
JRA_Histograms getHistograms()
void readEvents()