49   static const char* rates_t  =  
"rates";      
 
   50   static const char* count_t  =  
"counts";     
 
   51   static const char* tails_t  =  
"tails";      
 
   52   static const char* rndms_t  =  
"randoms";    
 
   57   static const double ToTmax_ns = std::numeric_limits<KM3NETDAQ::JDAQHit::JTOT_t>::max();
 
   99       return (h2s != NULL &&
 
  135 int main(
int argc, 
char **argv)
 
  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);           
 
  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) {
 
  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())) {
 
  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);
 
  434         TH2D* h2s = zmap[address.
first].h2s;
 
  435         TH1D* h1b = zmap[address.
first].h1b;
 
  436         TH1D* h1L = zmap[address.
first].h1L;
 
  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;
 
  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. 
 
Auxiliaries for pre-processing of hits. 
 
ROOT TTree parameter settings of various packages. 
 
double getRate(const int tdc, const double factor=1.0) const 
Get count rate. 
 
Basic data structure for L0 hit. 
 
const JModule & getModule(const JObjectID &id) const 
Get module parameters. 
 
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. 
 
Data structure for detector geometry and calibration. 
 
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. 
 
I/O formatting auxiliaries. 
 
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. 
 
bool is_valid(const json &js)
Check validity of JSon data. 
 
virtual const pointer_type & next() override
Get next element. 
 
Address of module in detector data structure. 
 
Match operator for consecutive hits. 
 
virtual bool hasNext() override
Check availability of next element. 
 
Router for fast addressing of summary data in JDAQSummaryslice data structure as a function of the op...
 
General purpose messaging. 
 
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. 
 
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. 
 
Auxiliary class to define a range between two values. 
 
General purpose class for object reading from a list of file names. 
 
Utility class to parse command line options. 
 
static const char *const W1_overall_t
Named bin for duration of the run. 
 
const JModuleAddress & getAddress(const JObjectID &id) const 
Get address of module. 
 
bool hasModule(const JObjectID &id) const 
Has module. 
 
2-dimensional frame with time calibrated data from one optical module. 
 
PMT analogue signal processor. 
 
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. 
 
KM3NeT DAQ constants, bit handling, etc. 
 
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. 
 
int main(int argc, char *argv[])