Jpp  pmt_effective_area_update
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JCalibrateK40.cc File Reference

Auxiliary program to determine PMT parameters from K40 data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <limits>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TMath.h"
#include "JTools/JRange.hh"
#include "km3net-dataformat/online/JDAQ.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDAQ/JDAQSummarysliceIO.hh"
#include "JDAQ/JDAQEvaluator.hh"
#include "JTrigger/JSuperFrame1D.hh"
#include "JTrigger/JSuperFrame2D.hh"
#include "JTrigger/JHitR0.hh"
#include "JTrigger/JMatchL0.hh"
#include "JTrigger/JHitToolkit.hh"
#include "JTrigger/JTriggerParameters.hh"
#include "JTrigger/JTriggerToolkit.hh"
#include "JTrigger/JSummaryRouter.hh"
#include "JTrigger/JPreprocessor.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTAnalogueSignalProcessor.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JTreeScanner.hh"
#include "JSupport/JSupport.hh"
#include "JSupport/JMeta.hh"
#include "JSupport/JTriggerParametersSupportkit.hh"
#include "JLang/JObjectMultiplexer.hh"
#include "JROOT/JROOTClassSelector.hh"
#include "JCalibrate/JCalibrateK40.hh"
#include "Jeep/JPrint.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to determine PMT parameters from K40 data.

By default, the combinatorial background is estimated from the singles rate. In case L0 data are taken (and no summary data are available), the singles rate can be determined from the amount of L0 data. One can also estimate the background from the tails in the time residual distribution. In that case, option -B can be used to specify the minimal and maximal time offset in ns. For example -B "10 20". Note that the minimal and maximal time should be larger that the width of the time residual distribution and less than the time window of the L1 coincidence, respectively. The time window is applied symmetrically around a time offset of zero. Finally, if L0 data are available, one can estimate the background using the same procedure but with a random (read wrong) time calibration.

The option -M can be used to specify a range of multiplicities. For example -M "2 2" will strictly select two-fold coincidences. Note that such a selection can bias the sample.

Also consult documentation.

Author
mdejong

Definition in file JCalibrateK40.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 135 of file JCalibrateK40.cc.

136 {
137  using namespace std;
138  using namespace JPP;
139  using namespace KM3NETDAQ;
140 
141 
142  //-----------------------------------------------------------
143  //parameter interface
144  //-----------------------------------------------------------
145 
147  JLimit_t& numberOfEvents = inputFile.getLimit();
148  string outputFile;
149  string detectorFile;
150  Double_t TMax_ns;
151  JRange<double> rateRange_Hz;
152  JRange<double> totRange_ns;
153  JRange<double> Tail_ns;
154  JRange<int> multiplicity;
155  double deadTime_us;
156  JROOTClassSelector selector;
157  string background;
158  JPreprocessor option;
159  int debug;
160 
161  try {
162 
163  JParser<> zap("Auxiliary program to determine PMT parameters from K40 data.");
164 
165  zap['f'] = make_field(inputFile, "input file.");
166  zap['o'] = make_field(outputFile, "output file.") = "calibrate_k40.root";
167  zap['n'] = make_field(numberOfEvents) = JLimit::max();
168  zap['a'] = make_field(detectorFile, "detector file.");
169  zap['T'] = make_field(TMax_ns, "time window [ns].") = 20.0;
170  zap['V'] = make_field(rateRange_Hz, "PMT rate range [Hz].") = JRange<double>(0.0, 20.0e3);
171  zap['t'] = make_field(totRange_ns, "PMT time-over-threshold range [ns].") = JRange<double>(4.0, ToTmax_ns);
172  zap['b'] = make_field(background, "background estimation method.") = rates_t, count_t, tails_t, rndms_t;
173  zap['B'] = make_field(Tail_ns, "time window used for background estimation.") = JRange<double>(15.0, 20.0);
174  zap['M'] = make_field(multiplicity, "multiplicity range of hits on DOM.") = JRange<int>(2, 31);
175  zap['D'] = make_field(deadTime_us, "L1 dead time (us)") = 0.0;
176  zap['C'] = make_field(selector, "timeslice selector, e.g. JDAQTimesliceL1.") = getROOTClassSelection<JDAQTimesliceTypes_t>();
177  zap['O'] = make_field(option, "hit pre-processing option.") = JPreprocessor::getOptions();
178  zap['d'] = make_field(debug, "debug flag.") = 1;
179 
180  zap(argc, argv);
181  }
182  catch(const exception &error) {
183  FATAL(error.what() << endl);
184  }
185 
186  //-----------------------------------------------------------
187  // check the input parameters
188  //-----------------------------------------------------------
189 
190  cout.tie(&cerr);
191 
192  if (selector == JDAQTimesliceL2::Class_Name() ||
193  selector == JDAQTimesliceSN::Class_Name()) {
194  FATAL("Option -C <selector> " << selector << " not compatible with calibration method." << endl);
195  }
196 
197  if (selector == JDAQTimeslice ::Class_Name() ||
198  selector == JDAQTimesliceL1::Class_Name()) {
199 
201 
202  try {
203  parameters = getTriggerParameters(inputFile);
204  }
205  catch(const JException& error) {
206  FATAL("No trigger parameters from input:" << error.what() << endl);
207  }
208 
209  if ((selector == JDAQTimeslice ::Class_Name() && parameters.writeL1.prescale > 0) ||
210  (selector == JDAQTimesliceL1::Class_Name())) {
211 
212  if (parameters.TMaxLocal_ns < TMax_ns) {
213  FATAL("Option -T <TMax_ns> = " << TMax_ns << " is larger than in the trigger " << parameters.TMaxLocal_ns << endl);
214  }
215 
216  if (background == rndms_t ||
217  background == count_t) {
218  FATAL("Option -C <selector> " << selector << " incompatible with option -b <background> " << background << endl);
219  }
220  }
221  }
222 
223  if (!multiplicity.is_valid() || multiplicity.getLowerLimit() < 2) {
224  FATAL("Invalid option -M <multiplicity> " << multiplicity << endl);
225  }
226 
227  if (!totRange_ns.is_valid()) {
228  FATAL("Invalid option -t <totRange_ns> " << totRange_ns << endl);
229  }
230 
231  if (background == tails_t) {
232 
233  if (!Tail_ns.is_valid()) {
234  FATAL("Invalid option -B <Tail_ns> " << Tail_ns << endl);
235  }
236 
237  if (Tail_ns.getUpperLimit() > TMax_ns) {
238  FATAL("Invalid option -B <Tail_ns> " << Tail_ns << "; upper limit larger than option -T <TMax_ns> " << TMax_ns << endl);
239  }
240  }
241 
242  //-----------------------------------------------------------
243  // load detector file
244  //-----------------------------------------------------------
245 
247 
248  try {
249  load(detectorFile, detector);
250  }
251  catch(const JException& error) {
252  FATAL(error);
253  }
254 
255  if (detector.empty()) {
256  FATAL("Empty detector." << endl);
257  }
258 
259  const JModuleRouter router(detector);
260  JSummaryRouter summaryRouter;
261 
262  //-----------------------------------------------------------
263  // determine time offsets for background method rndms_t
264  //-----------------------------------------------------------
265 
266  vector<double> t0; // time offsets for random background evaluation [ns]
267 
268  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
269  t0.push_back(i * 2 * TMax_ns);
270  }
271 
272  //-----------------------------------------------------------
273  // correction factor for rate due to specified time-over-threshold range
274  //-----------------------------------------------------------
275 
276  const JPMTAnalogueSignalProcessor cpu;
277 
278  const int NPE = 1;
279  const double RTU = (cpu.getIntegralOfChargeProbability(cpu.getNPE(totRange_ns.getLowerLimit()), cpu.getNPE(totRange_ns.getUpperLimit()), NPE)
280  /
281  cpu.getIntegralOfChargeProbability(cpu.getNPE(0.0), cpu.getNPE(ToTmax_ns), NPE));
282 
283 
284 
285  //-----------------------------------------------------------
286  // initialise histograms
287  //-----------------------------------------------------------
288 
289  JCombinatorics combinatorics(NUMBER_OF_PMTS);
290 
291  vector<JHistogram> zmap(detector.size());
292 
293  TH1D weights_hist(weights_hist_t, NULL, 3, 0.0, 3.0);
294 
295  weights_hist.GetXaxis()->SetBinLabel(1, W1_overall_t); // [s]
296  weights_hist.GetXaxis()->SetBinLabel(2, WS_t); // [ns]
297  weights_hist.GetXaxis()->SetBinLabel(3, WB_t); // [ns]
298 
299  const int nx = combinatorics.getNumberOfPairs();
300  const double xmin = -0.5;
301  const double xmax = nx - 0.5;
302 
303  const double ymin = -floor(TMax_ns) + 0.5;
304  const double ymax = +floor(TMax_ns) - 0.5;
305  const int ny = (int) ((ymax - ymin) / 1.0);
306 
307 
308  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
309 
310  const JModuleAddress& address = router.getAddress(module->getID());
311 
312  if (!module->empty()) {
313 
314  NOTICE("Booking histograms for module " << module->getID() << endl);
315 
316  zmap[address.first] = JHistogram(new TH2D(MAKE_CSTRING(module->getID() << _2S), NULL, nx, xmin, xmax, ny, ymin, ymax),
317  new TH1D(MAKE_CSTRING(module->getID() << _1B), NULL, nx, xmin, xmax),
318  new TH1D(MAKE_CSTRING(module->getID() << _1L), NULL, nx, xmin, xmax));
319  }
320  }
321 
322 
323  JTreeScanner<JDAQSummaryslice, JDAQEvaluator> summaryFile(inputFile);
324 
325  typedef JHitR0 hit_type;
326  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
327  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
328 
329  const JMatchL0<hit_type> match(TMax_ns); // time window self-coincidences [ns]
330 
331  const double deadTime_ns = deadTime_us * 1e3;
332 
334 
335  counter_type counter = 0;
336 
337  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
338 
339  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
340 
341  const JDAQTimeslice* timeslice = in.next();
342 
343  if (background == rates_t) {
344 
345  const Long64_t index = summaryFile.find(*timeslice);
346 
347  if (index == -1) {
348  FATAL("Missing summary data at " << timeslice->getFrameIndex() << endl);
349  }
350 
351  summaryRouter.update(summaryFile.getEntry(index));
352 
353  if (timeslice->getFrameIndex() != summaryRouter.getFrameIndex()) {
354 
355  ERROR("Frame indices do not match "
356  << "[counter=" << counter << "]"
357  << "[timeslice=" << timeslice->getFrameIndex() << "]"
358  << "[summaryslice=" << summaryRouter.getFrameIndex() << "]" << endl);
359 
360  if (!in.hasNext())
361  break;
362  else
363  FATAL("ROOT TTrees not aligned; Run number " << timeslice->getRunNumber() << endl);
364  }
365  }
366 
367 
368  for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
369 
370  if (router.hasModule(frame->getModuleID())) {
371 
372  const JModule& module = router.getModule(frame->getModuleID());
373 
374  //-----------------------------------------------------------
375  // determine background rates
376  //-----------------------------------------------------------
377 
378  vector<double> rate_Hz(NUMBER_OF_PMTS, 0.0);
379  vector<bool> veto (NUMBER_OF_PMTS, false);
380 
381  JDAQFrameStatus status;
382 
383  if (background == count_t) {
384 
385  status = frame->getDAQFrameStatus();
386 
387  for (JDAQSuperFrame::const_iterator i = frame->begin(); i != frame->end(); ++i) {
388  rate_Hz[i->getPMT()] += RTU * 1e9 / getFrameTime();
389  }
390 
391  } else if (background == tails_t) {
392 
393  status = frame->getDAQFrameStatus();
394 
395  } else if (background == rndms_t) {
396 
397  status = frame->getDAQFrameStatus();
398 
399  } else if (background == rates_t) {
400 
401  if (!summaryRouter.hasSummaryFrame(frame->getModuleID())) {
402  FATAL("Summary frame not found " << timeslice->getFrameIndex() << ":" << frame->getModuleID() << endl);
403  }
404 
405  const JDAQSummaryFrame& summary_frame = summaryRouter.getSummaryFrame(frame->getModuleID());
406 
407  status = summary_frame.getDAQFrameStatus();
408 
409  for (int i = 0; i != NUMBER_OF_PMTS; ++i){
410  rate_Hz[i] = RTU * summary_frame.getRate(i);
411  }
412  }
413 
414  // Set veto according DAQ or PMT status
415  // Hits of PMTs with veto will not be counted in livetime nor coincidences nor background
416 
417  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
418  if (!getDAQStatus(status, module, i) ||
419  !getPMTStatus(status, module, i)) {
420  veto[i] = true;
421  }
422  }
423 
424  //-----------------------------------------------------------
425  // sort the PMT pairs by opening angle in the order largest angle-->smallest angle
426  //-----------------------------------------------------------
427 
428  const JModuleAddress& address = router.getAddress(frame->getModuleID());
429 
430  combinatorics.configure(module.size());
431 
432  combinatorics.sort(JPairwiseComparator(module));
433 
434  TH2D* h2s = zmap[address.first].h2s;
435  TH1D* h1b = zmap[address.first].h1b;
436  TH1D* h1L = zmap[address.first].h1L;
437 
438  //-----------------------------------------------------------
439  // fill the livetime by PMT pairs
440  //-----------------------------------------------------------
441 
442  for (size_t i = 0; i < combinatorics.getNumberOfPairs(); ++i) {
443 
444  const int pmt1 = combinatorics.getPair(i).first;
445  const int pmt2 = combinatorics.getPair(i).second;
446 
447  if (!veto[pmt1] && rateRange_Hz(rate_Hz[pmt1]) &&
448  !veto[pmt2] && rateRange_Hz(rate_Hz[pmt2]) ) {
449 
450  h1L->Fill(i, getFrameTime()*1e-9);
451  }
452  }
453 
454  //-----------------------------------------------------------
455  // process data
456  //-----------------------------------------------------------
457 
458  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*frame, module);
459 
460  buffer.preprocess(option, match);
461 
462  for (JSuperFrame2D_t::iterator i = buffer.begin(); i != buffer.end(); ++i) {
463 
464  const int pmt = i->getPMTAddress();
465 
466  if ( veto[pmt] || !rateRange_Hz(rate_Hz[pmt]) ) {
467  i->reset();
468  }
469  }
470 
471  JSuperFrame1D_t& data = JSuperFrame1D_t::multiplex(buffer);
472 
473  DEBUG("Number of hits " << timeslice->getFrameIndex() << ":" << frame->getModuleID() << ' ' << frame->size() << ' ' << data.size() << endl);
474 
475  if (data.empty()) {
476  continue;
477  }
478 
479  // Signal;
480  // Hits from PMTs that do not comply with rate cuts have been exluded above
481 
482  double t1 = numeric_limits<double>::lowest();
483 
484  for (vector<hit_type>::const_iterator p = data.begin(); p != data.end(); ) {
485 
487 
488  while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
489 
490  const int N = distance(p,q);
491 
492  if (multiplicity(N)) {
493 
494  if (p->getT() > t1 + deadTime_ns) {
495 
496  for (vector<hit_type>::const_iterator __p = p; __p != q; ++__p) {
497  for (vector<hit_type>::const_iterator __q = __p; ++__q != q; ) {
498 
499  if (totRange_ns( __p->getToT()) && totRange_ns(__q->getToT())) {
500  h2s->Fill((double) combinatorics.getIndex(__p->getPMT(),__q->getPMT()),
501  JCombinatorics::getSign(__p->getPMT(),__q->getPMT()) * (__q->getT() - __p->getT()));
502  }
503  }
504  }
505  }
506 
507  t1 = p->getT();
508  }
509 
510  p = q;
511  }
512 
513  // Background;
514  // Note that rate cuts and veto have already been accounted for when data buffer was filled
515 
516  if (background == rndms_t) {
517 
518  for (vector<hit_type>::iterator i = data.begin(); i != data.end(); ++i) {
519  *i = hit_type(i->getPMT(), JHit(i->getT() + t0[i->getPMT()], i->getToT()));
520  }
521 
522  sort(data.begin(), data.end());
523 
524  for (vector<hit_type>::const_iterator p = data.begin(); p != data.end(); ) {
525 
527 
528  while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
529 
530  const int N = distance(p,q);
531 
532  if (multiplicity(N)) {
533 
534  for (vector<hit_type>::const_iterator __p = p; __p != q; ++__p) {
535  for (vector<hit_type>::const_iterator __q = __p; ++__q != q; ) {
536 
537  if (totRange_ns(__p->getToT()) && totRange_ns(__q->getToT())) {
538  h1b->Fill((double) combinatorics.getIndex(p->getPMT(),q->getPMT()), 1.0);
539  }
540  }
541  }
542  }
543 
544  p = q;
545  }
546 
547  } else if (background == rates_t ||
548  background == count_t) {
549 
550  Double_t Rs = 0.0; // total rate [Hz]
551 
552  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
553 
554  const Double_t R1 = rate_Hz[i]; // [Hz]
555 
556  if (!veto[i] && rateRange_Hz(R1)) {
557  Rs += R1;
558  }
559  }
560 
561  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
562  for (int j = i; ++j != NUMBER_OF_PMTS; ) {
563 
564  const Double_t R1 = rate_Hz[i]; // [Hz]
565  const Double_t R2 = rate_Hz[j]; // [Hz]
566 
567  if (!veto[i] && rateRange_Hz(R1) &&
568  !veto[j] && rateRange_Hz(R2)) {
569 
570  // expectation values (counts) within TMax_ns * 2 for the optical module and the two PMTs
571  const double ED = (Rs - rate_Hz[i] - rate_Hz[j]) * 2 * TMax_ns * 1e-9;
572  const double E1 = rate_Hz[i] * 2 * TMax_ns * 1e-9;
573  const double E2 = rate_Hz[j] * 2 * TMax_ns * 1e-9;
574 
575  // expected rate of coincidences = P * # of trials
576  Double_t N = coincidenceP(E1, E2, ED,
577  multiplicity.getLowerLimit(),
578  multiplicity.getUpperLimit()) * getFrameTime() / (2*TMax_ns);
579 
580  h1b->Fill((double) combinatorics.getIndex(i,j), N);
581  }
582  }
583  }
584  }
585  }
586  }
587  }
588  STATUS(endl);
589 
590  if (background == tails_t ) {
591 
592  for (vector<JHistogram>::iterator hist = zmap.begin() ; hist != zmap.end() ; ++hist) {
593 
594  if (hist->is_valid()) {
595 
596  TH2D* h2s = hist->h2s;
597  TH1D* h1b = hist->h1b;
598 
599  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
600  for (int j = i; ++j != NUMBER_OF_PMTS; ) {
601 
602  double Y = 0.0; // sum of counts in tail regions
603  double W = 0.0; // square of error of Y
604  int N = 0; // number of bins in tail regions
605  int k = combinatorics.getIndex(i,j); // PMT pair index (x-axis of h2s)
606 
607  for (int l = 1; l <= h2s->GetYaxis()->GetNbins(); ++l) {
608 
609  const Double_t dt = h2s->GetYaxis()->GetBinCenter(l) ;
610 
611  if (Tail_ns(fabs(dt))) {
612  Y += h2s->GetBinContent(k+1,l);
613  W += h2s->GetBinError(k+1,l) * h2s->GetBinError(k+1,l);
614  N++;
615  }
616  }
617 
618  h1b->SetBinContent(k+1, Y / N * (2.0*TMax_ns) / ((ymax - ymin)/ny) );
619  h1b->SetBinError (k+1, sqrt(W/N) * (2.0*TMax_ns) / ((ymax - ymin)/ny) );
620  }
621  }
622  }
623  }
624  }
625 
626  //---------------------------------------------
627  // save normalisation constants and store histograms
628  //---------------------------------------------
629 
630  weights_hist.Fill(W1_overall_t, counter*getFrameTime()*1e-9); // [s]
631  weights_hist.Fill(WS_t, (ymax - ymin)/ny); // [ns]
632  weights_hist.Fill(WB_t, 2.0*TMax_ns); // [ns]
633 
634 
635  TFile out(outputFile.c_str(), "recreate");
636 
637  putObject(&out, JMeta(argc, argv));
638 
639  weights_hist.Write() ;
640 
641  for (vector<JHistogram>::iterator i = zmap.begin(); i != zmap.end(); ++i) {
642  if (i->is_valid()) {
643  i->h2s->Write();
644  i->h1b->Write();
645  i->h1L->Write();
646  }
647  }
648 
649  out.Write();
650  out.Close();
651 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Utility class to parse command line options.
Definition: JParser.hh:1500
General exception.
Definition: JException.hh:23
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
Auxiliary class to convert pair of indices to unique index and back.
double getRate(const int tdc, const double factor=1.0) const
Get count rate.
Data structure for a composite optical module.
Definition: JModule.hh:66
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
static const char *const WB_t
Named bin for value of TMax_ns in JCalibrateK40.
L0 match criterion.
Definition: JMatchL0.hh:27
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:81
Auxiliary class to select ROOT class based on class name.
Router for direct addressing of module data in detector data structure.
bool putObject(TDirectory *dir, const TObject &object)
Write object to ROOT directory.
#define R1(x)
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
#define MAKE_CSTRING(A)
Make C-string.
Definition: JPrint.hh:151
Long64_t counter_type
Type definition for counter.
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
Auxiliary class for multiplexing object iterators.
string outputFile
int getRunNumber() const
Get run number.
Acoustics hit.
int getFrameIndex() const
Get frame index.
1-dimensional frame with time calibrated data from one optical module.
int first
index of module in detector data structure
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
static const char *const WS_t
Named bin for time residual bin width.
Auxiliary class to sort pairs of PMT addresses within optical module.
Detector file.
Definition: JHead.hh:196
Reduced data structure for L0 hit.
Definition: JHitR0.hh:25
Hit data structure.
Definition: JDAQHit.hh:34
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
static const char *const _1B
Name extension for 1D background.
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
Data storage class for rate measurements of all PMTs in one module.
#define NOTICE(A)
Definition: JMessage.hh:64
#define ERROR(A)
Definition: JMessage.hh:66
Data time slice.
Address of module in detector data structure.
int debug
debug level
Definition: JSirene.cc:63
Router for fast addressing of summary data in JDAQSummaryslice data structure as a function of the op...
#define FATAL(A)
Definition: JMessage.hh:67
static const char *const weights_hist_t
Histogram naming.
static const char *const _1L
Name extension for 1D live time.
virtual const char * what() const override
Get error message.
Definition: JException.hh:48
bool getPMTStatus(const JStatus &status)
Test status of PMT.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
static const char *const W1_overall_t
Named bin for duration of the run.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
2-dimensional frame with time calibrated data from one optical module.
int j
Definition: JPolint.hh:666
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
double coincidenceP(double E1, double E2, double ED, int M_min, int M_max)
Coincidence probability of two PMTs within one module.
do set_variable DETECTOR_TXT $WORKDIR detector
bool getDAQStatus(const JDAQFrameStatus &frame, const JStatus &status)
Test status of DAQ.
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Definition: JDAQ.hh:26
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:40
Auxiliary class for specifying the way of pre-processing of hits.
const JDAQFrameStatus & getDAQFrameStatus() const
Get DAQ frame status.
then usage $script[input file[working directory[option]]] nWhere option can be N
Definition: JMuonPostfit.sh:36
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
static const char *const _2S
Name extension for 2D counts.
Template definition of histogram object interface.
Definition: JHistogram.hh:27