139 using namespace KM3NETDAQ;
163 JParser<> zap(
"Auxiliary program to determine PMT parameters from K40 data.");
165 zap[
'f'] =
make_field(inputFile,
"input file.");
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;
172 zap[
'b'] =
make_field(background,
"background estimation method.") = rates_t, count_t, tails_t, rndms_t;
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();
182 catch(
const exception &error) {
183 FATAL(error.what() << endl);
192 if (selector == JDAQTimesliceL2::Class_Name() ||
193 selector == JDAQTimesliceSN::Class_Name()) {
194 FATAL(
"Option -C <selector> " << selector <<
" not compatible with calibration method." << endl);
197 if (selector == JDAQTimeslice ::Class_Name() ||
198 selector == JDAQTimesliceL1::Class_Name()) {
206 FATAL(
"No trigger parameters from input:" << error.
what() << endl);
209 if ((selector == JDAQTimeslice ::Class_Name() && parameters.writeL1.prescale > 0) ||
210 (selector == JDAQTimesliceL1::Class_Name())) {
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);
216 if (background == rndms_t ||
217 background == count_t) {
218 FATAL(
"Option -C <selector> " << selector <<
" incompatible with option -b <background> " << background << endl);
223 if (!multiplicity.is_valid() || multiplicity.getLowerLimit() < 2) {
224 FATAL(
"Invalid option -M <multiplicity> " << multiplicity << endl);
227 if (!totRange_ns.is_valid()) {
228 FATAL(
"Invalid option -t <totRange_ns> " << totRange_ns << endl);
231 if (background == tails_t) {
233 if (!Tail_ns.is_valid()) {
234 FATAL(
"Invalid option -B <Tail_ns> " << Tail_ns << endl);
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);
256 FATAL(
"Empty detector." << endl);
269 t0.push_back(i * 2 * TMax_ns);
279 const double RTU = (cpu.getIntegralOfChargeProbability(cpu.getNPE(totRange_ns.getLowerLimit()), cpu.getNPE(totRange_ns.getUpperLimit()), NPE)
281 cpu.getIntegralOfChargeProbability(cpu.getNPE(0.0), cpu.getNPE(ToTmax_ns), NPE));
296 weights_hist.GetXaxis()->SetBinLabel(2,
WS_t);
297 weights_hist.GetXaxis()->SetBinLabel(3,
WB_t);
299 const int nx = combinatorics.getNumberOfPairs();
300 const double xmin = -0.5;
301 const double xmax = nx - 0.5;
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);
308 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
310 const JModuleAddress& address = router.getAddress(module->getID());
312 if (!module->empty()) {
314 NOTICE(
"Booking histograms for module " << module->getID() << endl);
331 const double deadTime_ns = deadTime_us * 1e3;
337 for ( ;
in.hasNext() && counter != inputFile.getLimit(); ++counter) {
339 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
343 if (background == rates_t) {
345 const Long64_t index = summaryFile.find(*timeslice);
351 summaryRouter.update(summaryFile.getEntry(index));
353 if (timeslice->
getFrameIndex() != summaryRouter.getFrameIndex()) {
355 ERROR(
"Frame indices do not match "
356 <<
"[counter=" << counter <<
"]"
358 <<
"[summaryslice=" << summaryRouter.getFrameIndex() <<
"]" << endl);
363 FATAL(
"ROOT TTrees not aligned; Run number " << timeslice->
getRunNumber() << endl);
368 for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
370 if (router.hasModule(frame->getModuleID())) {
372 const JModule& module = router.getModule(frame->getModuleID());
383 if (background == count_t) {
391 }
else if (background == tails_t) {
395 }
else if (background == rndms_t) {
399 }
else if (background == rates_t) {
401 if (!summaryRouter.hasSummaryFrame(frame->getModuleID())) {
402 FATAL(
"Summary frame not found " << timeslice->
getFrameIndex() <<
":" << frame->getModuleID() << endl);
405 const JDAQSummaryFrame& summary_frame = summaryRouter.getSummaryFrame(frame->getModuleID());
410 rate_Hz[i] = RTU * summary_frame.
getRate(i);
428 const JModuleAddress& address = router.getAddress(frame->getModuleID());
430 combinatorics.configure(module.size());
434 TH2D* h2s = zmap[address.
first].h2s;
435 TH1D* h1b = zmap[address.
first].h1b;
436 TH1D* h1L = zmap[address.
first].h1L;
442 for (
size_t i = 0; i < combinatorics.getNumberOfPairs(); ++i) {
444 const int pmt1 = combinatorics.getPair(i).
first;
445 const int pmt2 = combinatorics.getPair(i).second;
447 if (!veto[pmt1] && rateRange_Hz(rate_Hz[pmt1]) &&
448 !veto[pmt2] && rateRange_Hz(rate_Hz[pmt2]) ) {
458 JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*frame, module);
460 buffer.preprocess(option, match);
462 for (JSuperFrame2D_t::iterator i = buffer.begin(); i != buffer.end(); ++i) {
464 const int pmt = i->getPMTAddress();
466 if ( veto[pmt] || !rateRange_Hz(rate_Hz[pmt]) ) {
471 JSuperFrame1D_t& data = JSuperFrame1D_t::multiplex(buffer);
475 DEBUG(
"Number of hits " << timeslice->
getFrameIndex() <<
":" << frame->getModuleID() <<
' ' << frame->size() <<
' ' << data.size() << endl);
484 double t1 = numeric_limits<double>::lowest();
490 while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
494 if (multiplicity(N)) {
496 if (p->getT() > t1 + deadTime_ns) {
501 if (totRange_ns( __p->getToT()) && totRange_ns(__q->getToT())) {
502 h2s->Fill((
double) combinatorics.getIndex(__p->getPMT(),__q->getPMT()),
503 JCombinatorics::getSign(__p->getPMT(),__q->getPMT()) * (__q->getT() - __p->getT()));
518 if (background == rndms_t) {
521 *i =
hit_type(i->getPMT(),
JHit(i->getT() + t0[i->getPMT()], i->getToT()));
524 sort(data.begin(), data.end());
530 while (++q != data.end() && q->getT() - p->getT() <= TMax_ns) {}
534 if (multiplicity(N)) {
539 if (totRange_ns(__p->getToT()) && totRange_ns(__q->getToT())) {
540 h1b->Fill((
double) combinatorics.getIndex(p->getPMT(),q->getPMT()), 1.0);
549 }
else if (background == rates_t ||
550 background == count_t) {
556 const Double_t
R1 = rate_Hz[i];
558 if (!veto[i] && rateRange_Hz(R1)) {
566 const Double_t R1 = rate_Hz[i];
567 const Double_t R2 = rate_Hz[
j];
569 if (!veto[i] && rateRange_Hz(R1) &&
570 !veto[
j] && rateRange_Hz(R2)) {
573 const double ED = (Rs - rate_Hz[i] - rate_Hz[
j]) * 2 * TMax_ns * 1e-9;
574 const double E1 = rate_Hz[i] * 2 * TMax_ns * 1e-9;
575 const double E2 = rate_Hz[
j] * 2 * TMax_ns * 1e-9;
579 multiplicity.getLowerLimit(),
580 multiplicity.getUpperLimit()) *
getFrameTime() / (2*TMax_ns);
582 h1b->Fill((
double) combinatorics.getIndex(i,
j),
N);
592 if (background == tails_t ) {
596 if (hist->is_valid()) {
598 TH2D* h2s = hist->h2s;
599 TH1D* h1b = hist->h1b;
607 int k = combinatorics.getIndex(i,
j);
609 for (
int l = 1; l <= h2s->GetYaxis()->GetNbins(); ++l) {
611 const Double_t dt = h2s->GetYaxis()->GetBinCenter(l) ;
613 if (Tail_ns(fabs(dt))) {
614 Y += h2s->GetBinContent(k+1,l);
615 W += h2s->GetBinError(k+1,l) * h2s->GetBinError(k+1,l);
620 h1b->SetBinContent(k+1, Y / N * (2.0*TMax_ns) / ((ymax - ymin)/ny) );
621 h1b->SetBinError (k+1, sqrt(W/N) * (2.0*TMax_ns) / ((ymax - ymin)/ny) );
633 weights_hist.Fill(
WS_t, (ymax - ymin)/ny);
634 weights_hist.Fill(
WB_t, 2.0*TMax_ns);
641 weights_hist.Write() ;
Utility class to parse command line options.
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
double getRate(const int tdc, const double factor=1.0) const
Get count rate.
Data structure for a composite optical module.
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.
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.
*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
#define MAKE_CSTRING(A)
Make C-string.
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.
int getRunNumber() const
Get run number.
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.
static const char *const WS_t
Named bin for time residual bin width.
Auxiliary class to sort pairs of PMT addresses within optical module.
Reduced data structure for L0 hit.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
static const char *const _1B
Name extension for 1D background.
double getFrameTime()
Get frame time duration.
Data storage class for rate measurements of all PMTs in one module.
Address of module in detector data structure.
Router for fast addressing of summary data in JDAQSummaryslice data structure as a function of the op...
PMT analogue signal processor.
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.
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.
const JLimit & getLimit() const
Get limit.
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.
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
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
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
static const char *const _2S
Name extension for 2D counts.