213 array <double, 3> totRange_ns;
224 JParser<> zap(
"Auxiliary program to determine PMT parameters from K40 data.");
226 zap[
'f'] =
make_field(inputFile,
"input file.");
229 zap[
'a'] =
make_field(detectorFile,
"detector file.");
230 zap[
'T'] =
make_field(TMax_ns,
"time window [ns].") = 20.0;
232 zap[
't'] =
make_field(totRange_ns,
"PMT time-over-threshold range [ns].") = { 4.0, 7.0, ToTmax_ns };
233 zap[
'b'] =
make_field(background,
"background estimation method.") = rates_t, count_t, tails_t, rndms_t;
236 zap[
'D'] =
make_field(deadTime_us,
"L1 dead time (us)") = 0.0;
243 catch(
const exception &error) {
244 FATAL(error.what() << endl);
252 if (selector == JDAQTimesliceL2::Class_Name() ||
253 selector == JDAQTimesliceSN::Class_Name()) {
254 FATAL(
"Option -C <selector> " << selector <<
" not compatible with calibration method." << endl);
257 if (selector == JDAQTimeslice ::Class_Name() ||
258 selector == JDAQTimesliceL1::Class_Name()) {
266 FATAL(
"No trigger parameters from input:" << error.
what() << endl);
269 if ((selector == JDAQTimeslice ::Class_Name() && parameters.writeL1.prescale > 0) ||
270 (selector == JDAQTimesliceL1::Class_Name())) {
272 if (parameters.TMaxLocal_ns < TMax_ns) {
273 FATAL(
"Option -T <TMax_ns> = " << TMax_ns <<
" is larger than in the trigger " << parameters.TMaxLocal_ns << endl);
276 if (background == rndms_t ||
277 background == count_t) {
278 FATAL(
"Option -C <selector> " << selector <<
" incompatible with option -b <background> " << background << endl);
284 FATAL(
"Invalid option -M <multiplicity> " << multiplicity << endl);
287 if (totRange_ns[0] > totRange_ns[1] ||
288 totRange_ns[1] > totRange_ns[2]) {
289 FATAL(
"Invalid option -t <totRange_ns> " <<
JEEPZ() << totRange_ns << endl);
292 if (background == tails_t) {
295 FATAL(
"Invalid option -B <Tail_ns> " << Tail_ns << endl);
299 FATAL(
"Invalid option -B <Tail_ns> " << Tail_ns <<
"; upper limit larger than option -T <TMax_ns> " << TMax_ns << endl);
317 FATAL(
"Empty detector." << endl);
329 t0.push_back(i * 2 * TMax_ns);
350 const Double_t ymin = -floor(TMax_ns) + 0.5;
351 const Double_t ymax = +floor(TMax_ns) - 0.5;
352 const Int_t ny = (Int_t) ((ymax - ymin) / 1.0);
354 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
358 if (!module->empty()) {
360 NOTICE(
"Booking histograms for module " << module->
getID() << endl);
373 const double deadTime_ns = deadTime_us * 1e3;
382 for (JMultipleFileScanner_t::const_iterator i = inputFile.begin(); i != inputFile.end(); ++i) {
384 STATUS(
"Processing: " << *i << endl);
393 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
405 if (background == rates_t) {
411 ERROR(
"Frame indices do not match at "
412 <<
"[counter = " << counter <<
"]"
420 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
422 if (router.
hasModule(frame->getModuleID())) {
433 if (background == count_t) {
439 }
else if (background == tails_t) {
443 }
else if (background == rndms_t) {
447 }
else if (background == rates_t) {
454 rate_Hz[i] = sum.
getRate (i) *RTU;
460 FATAL(
"Summary frame of module " << frame->getModuleID() <<
" not found at frame index " << timeslice->
getFrameIndex() << endl);
472 !rateRange_Hz(rate_Hz[i])) {
477 const JHistogram& histogram = zmap[router.
getAddress(frame->getModuleID()).
first];
478 const JCombinatorics& combinatorics = histogram.getCombinatorics();
480 TH2D* h2s = histogram.h2s;
481 TH1D* h1b = histogram.h1b;
482 TH1D* h1L = histogram.h1L;
488 JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*frame, module);
490 buffer.preprocess(option, match);
492 for (JSuperFrame2D_t::iterator i = buffer.begin(); i != buffer.end(); ++i) {
493 if (veto[i->getPMTAddress()]) {
498 JSuperFrame1D_t& data = JSuperFrame1D_t::multiplex(buffer);
500 DEBUG(
"Number of hits " << timeslice->
getFrameIndex() <<
":" << frame->getModuleID() <<
' ' << frame->size() <<
' ' << data.size() << endl);
505 size_t numberOfSignalEvents = 0;
507 double t1 = numeric_limits<double>::lowest();
509 for (vector<hit_type>::const_iterator p = data.begin(); p != data.end(); ) {
511 vector<hit_type>::const_iterator q = p;
513 while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
517 if (multiplicity(N)) {
519 numberOfSignalEvents += 1;
521 if (p->getT() > t1 + deadTime_ns) {
523 for (vector<hit_type>::const_iterator __p = p; __p != q; ++__p) {
524 for (vector<hit_type>::const_iterator __q = __p; ++__q != q; ) {
526 if ((__p->getToT() >= totRange_ns[0]) &&
527 (__q->getToT() >= totRange_ns[0]) &&
528 (__p->getToT() >= totRange_ns[1] ||
529 __q->getToT() >= totRange_ns[1]) &&
530 (__p->getToT() <= totRange_ns[2]) &&
531 (__q->getToT() <= totRange_ns[2])) {
533 h2s->Fill((
double) combinatorics.
getIndex(__p->getPMT(),__q->getPMT()),
549 if (background == rndms_t) {
552 *i =
hit_type(i->getPMT(),
JHit(i->getT() + t0[i->getPMT()], i->getToT()));
555 sort(data.begin(), data.end());
557 double t1 = numeric_limits<double>::lowest();
559 for (vector<hit_type>::const_iterator p = data.begin(); p != data.end(); ) {
561 vector<hit_type>::const_iterator q = p;
563 while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
567 if (multiplicity(N)) {
569 if (p->getT() > t1 + deadTime_ns) {
571 for (vector<hit_type>::const_iterator __p = p; __p != q; ++__p) {
572 for (vector<hit_type>::const_iterator __q = __p; ++__q != q; ) {
574 if ((__p->getToT() >= totRange_ns[0]) &&
575 (__q->getToT() >= totRange_ns[0]) &&
576 (__p->getToT() >= totRange_ns[1] ||
577 __q->getToT() >= totRange_ns[1]) &&
578 (__p->getToT() <= totRange_ns[2]) &&
579 (__q->getToT() <= totRange_ns[2])) {
581 h1b->Fill((
double) combinatorics.
getIndex(p->getPMT(),q->getPMT()), 1.0);
593 }
else if (background == rates_t ||
594 background == count_t) {
607 if (!veto[i] && !veto[
j]) {
609 const double R1 = rate_Hz[i];
610 const double R2 = rate_Hz[
j];
617 const double N =
getP((
R1) * 2 * TMax_ns * 1e-9,
618 (R2) * 2 * TMax_ns * 1e-9,
619 (Rs -
R1 - R2) * 2 * TMax_ns * 1e-9,
623 h1b->Fill((
double) combinatorics.
getIndex(i,
j), N);
637 const int pmt1 = combinatorics.
getPair(i).first;
638 const int pmt2 = combinatorics.
getPair(i).second;
640 if (!veto[pmt1] && !veto[pmt2]) {
641 h1L->Fill(i, livetime_s);
650 if (background == tails_t ) {
652 const double R = (2.0*TMax_ns) / ((ymax - ymin)/ny);
656 if (hr->is_valid()) {
661 for (
int ix = 1; ix <= h1b->GetXaxis()->GetNbins(); ++ix) {
667 for (
int iy = 1; iy <= h2s->GetYaxis()->GetNbins(); ++iy) {
669 const double y = h2s->GetYaxis()->GetBinCenter(iy) ;
671 if (Tail_ns(fabs(y))) {
672 Y += h2s->GetBinContent(ix,iy);
673 W += h2s->GetBinError (ix,iy) * h2s->GetBinError(ix,iy);
678 h1b->SetBinContent(ix, Y/N * R);
679 h1b->SetBinError (ix, sqrt(W/N) * R);
692 weights_hist.GetXaxis()->SetBinLabel(2,
WS_t);
693 weights_hist.GetXaxis()->SetBinLabel(3,
WB_t);
696 weights_hist.Fill(
WS_t, (ymax - ymin)/ny);
697 weights_hist.Fill(
WB_t, 2.0*TMax_ns);