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. 
 
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. 
 
then fatal No sound hydrophone file $HYDROPHONE_TXT fi JGraph f $HYDROPHONE_TXT o $HYDROPHONE_ROOT sort gr k
 
*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. 
 
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 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. 
 
#define DEBUG(A)
Message macros. 
 
bool putObject(TDirectory *dir, const T &object)
Write object to ROOT directory.