92   using namespace KM3NETDAQ;
 
   98   bool               overwriteDetector;
 
  100   int                numberOfTimeslices;
 
  110     JParser<> zap(
"Example program to search for correlations between triggered events and timeslice data.");
 
  112     zap[
'f'] = 
make_field(inputFile,           
"input file.");
 
  114     zap[
'a'] = 
make_field(detectorFile,         
"detector file.");
 
  115     zap[
'A'] = 
make_field(overwriteDetector,    
"overwrite detector file provided through '-a' with module (PMT) status.");
 
  116     zap[
'n'] = 
make_field(numberOfEvents)      = JLimit::max();
 
  118     zap[
'N'] = 
make_field(numberOfTimeslices,  
"time slice difference between triggered event and L1.")    = 100;
 
  119     zap[
'W'] = 
make_field(binWidth_ns,         
"bin width for output histograms." )                        = 10e3;
 
  120     zap[
'D'] = 
make_field(deadTime_us,         
"L1 dead time (us)")                                        = 200.0;
 
  121     zap[
'p'] = 
make_field(Pmin,                
"minimal probability for background to be signal.")         = 1.0e-7;
 
  122     zap[
'C'] = 
make_field(selector,            
"data type selection (default is all).")                    = 
"", getROOTClassSelection<JDAQTimesliceTypes_t>();
 
  128   catch(
const exception& error) {
 
  129     FATAL(error.what() << endl);
 
  143     FATAL(
"Empty detector " << detectorFile << endl);
 
  149   const double BOOST        =  20.0;                                        
 
  150   const double deadTime_ns  =  deadTime_us * 1e3;
 
  152   NOTICE(
"Time window " << 
FIXED(7,1) << TMax_ns << 
" [ns]" << endl);
 
  162   const Double_t 
xmin = -(numberOfTimeslices + 1) * 
getFrameTime() - 0.5*binWidth_ns;
 
  163   const Double_t 
xmax = +(numberOfTimeslices + 1) * 
getFrameTime() + 0.5*binWidth_ns;
 
  164   const Int_t    nx   = (Int_t) ((
xmax - 
xmin) / binWidth_ns);
 
  166   JManager_t manager(
new TH1D(
"M_%", NULL, nx, 
xmin, 
xmax));
 
  174   if (selector == 
"") {
 
  182       FATAL(
"No timeslice data." << endl);
 
  185     NOTICE(
"Selected class " << ps->getClassName() << endl);
 
  191     ps->configure(inputFile);
 
  194   ps->setLimit(inputFile.getLimit());
 
  202     if (
in.getCounter()%1000 == 0) {
 
  203       STATUS(
"event: " << setw(10) << 
in.getCounter() << 
'\r'); 
DEBUG(endl);
 
  213       t0 += 
getTime(*hit, router.getPMT(*hit));
 
  219     buffer[
event->getFrameIndex()].push_back(t0);
 
  224   while (ps->hasNext()) {
 
  226     if (ps->getCounter()%1000 == 0) {
 
  227       STATUS(
"event: " << setw(10) << ps->getCounter() << 
'\r'); 
DEBUG(endl);
 
  232     map_type::const_iterator p = buffer.lower_bound(timeslice->
getFrameIndex() - numberOfTimeslices);
 
  233     map_type::const_iterator q = buffer.upper_bound(timeslice->
getFrameIndex() + numberOfTimeslices);
 
  235     int number_of_events = 0;
 
  237     for (map_type::const_iterator 
i = p; 
i != q; ++
i) {
 
  238       number_of_events += 
i->second.size();
 
  241     if (number_of_events == 0) {
 
  245     for (JDAQTimeslice::const_iterator frame = timeslice->begin(); frame != timeslice->end(); ++frame) {
 
  249       buildL1(*frame, router.getModule(frame->getModuleID()), back_inserter(
data));
 
  251       TH1D*  h1 = manager[frame->getModuleID()];
 
  253       double t1 = numeric_limits<double>::lowest();
 
  257         const double t2 = *hit + frame->getFrameIndex() * 
getFrameTime();
 
  259         if (t2 > t1 + deadTime_ns) {
 
  261           for (map_type::const_iterator 
i = p; 
i != q; ++
i) {
 
  262             for (map_type::mapped_type::const_iterator t0 = 
i->second.begin(); t0 != 
i->second.end(); ++t0) {
 
  277   TF1 
f1(
"f1", 
"[0]*exp(-0.5*(x-[1])*(x-[1])/([2]*[2])) + [3]");
 
  288   for (JDetector::const_iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  290     if (module->getFloor() != 0) {
 
  292       status[module->getID()] = DEFAULT;
 
  294       JManager_t::iterator p = manager.find(module->getID());
 
  296       if (p == manager.end() || p->second->GetEntries() == 0) { 
 
  298         status[module->getID()] = NODATA;
 
  303       TH1D* h1 = p->second;
 
  309       Double_t 
sigma = 250.0;    
 
  312       for (
int i = 1; 
i != h1->GetNbinsX(); ++
i) {
 
  314         const Double_t 
x = h1->GetBinCenter (
i);
 
  315         const Double_t 
y = h1->GetBinContent(
i);
 
  325       ymin /= h1->GetNbinsX();
 
  327       f1.SetParameter(0, ymax);
 
  328       f1.SetParameter(1, x0);
 
  329       if (binWidth_ns < sigma) 
 
  330         f1.SetParameter(2, sigma);
 
  332         f1.FixParameter(2, binWidth_ns/sqrt(12.0));
 
  333       f1.SetParameter(3, ymin);
 
  335       for (Int_t 
i = 0; 
i != 
f1.GetNpar(); ++
i) {
 
  336         f1.SetParError(
i, 0.0);
 
  341       h1->Fit(&
f1, option.c_str(), 
"same", x0 - 5 * 
sigma, x0 + 5 * 
sigma);
 
  344           f1.GetParameter(0)       >= 
f1.GetParameter(3)) {    
 
  346         status[module->getID()] = IN_SYNC;
 
  355              << setw(10)    << module->getID()    << 
' ' 
  356              << 
FIXED(15,3) << 
f1.GetParameter(1) << 
' ' 
  357              << 
FIXED(12,3) << 
f1.GetParameter(0) << 
' ' 
  358              << 
FIXED(12,3) << 
f1.GetParameter(3) << 
' ' 
  359              << 
FIXED(12,3) << fm                 << 
' ' 
  360              << status[module->getID()] << endl);
 
  367       for (Int_t 
i = 1, 
ns = -(numberOfTimeslices + 1); 
i <= h1->GetNbinsX(); ++
i) {
 
  369         const Double_t x = h1->GetBinCenter (
i);
 
  370         const Double_t y = h1->GetBinContent(
i);
 
  384         const Double_t y = getBackground(
i->second, bg[
i->first]);
 
  385         const Double_t 
P = TMath::PoissonI(
i->second.getTotal(), 
y);
 
  387         if (
debug >= 
debug_t || status[module->getID()] != IN_SYNC) {
 
  388           cout << 
"Module/peak " << setw(10) << module->getID() << 
' ' 
  389                << setw(4) << 
i->first << 
' ' 
  396                << 
FIXED(7,1) << 
i->second.getTotal() << 
" / " 
  397                << 
FIXED(7,1) << y                    << 
' '  
  399                << (
i->second.getTotal() > y && P < Pmin && 
i->first != 0 ? 
"***" : 
"") << endl;
 
  402         if (
i->second.getTotal() > y && P < Pmin)
 
  408       if (!(sn.size()         == 1 && 
 
  409             sn.begin()->first == 0)) {
 
  411         status[module->getID()] = (sn.size() == 1 ? OUT_SYNC : 
ERROR);
 
  413         ERROR(
"Module/error " 
  414               << setw(10)    << module->getID()    << 
' ' 
  415               << 
"number of peaks " << sn.size()   << 
' ' 
  416               << 
"peak " << (sn.size() == 1 ? 
MAKE_CSTRING(sn.begin()->first) : 
"?") << 
' '  
  417               << status[module->getID()] << endl);
 
  422   if (overwriteDetector) {
 
  428       if (
i->second != IN_SYNC && 
 
  429           i->second != NODATA) {
 
  431         NOTICE(
"Module " << setw(8) << 
i->first << 
" set out-of-sync." << endl);
 
  437         for (JModule::iterator pmt = module.begin(); pmt != module.end(); ++pmt) {
 
  454     if (
i->second == IN_SYNC) {
 
  457     if (
i->second != IN_SYNC && 
 
  458         i->second != NODATA) {
 
  463   NOTICE(
"Number of modules out/in sync " << nout << 
'/' << nin << endl);
 
  465   QAQC(nin << 
' ' << nout << endl);
 
Utility class to parse command line options. 
 
Data structure for a composite optical module. 
 
Auxiliary class to select ROOT class based on class name. 
 
#define MAKE_CSTRING(A)
Make C-string. 
 
Auxialiary class to assert type conversion. 
 
Auxiliary class for a type holder. 
 
Auxiliary data structure for floating point format specification. 
 
double getTime(const Hit &hit)
Get true time of hit. 
 
Template definition for direct access of elements in ROOT TChain. 
 
Simple wrapper around JModuleRouter class for direct addressing of PMT data in detector data structur...
 
int getFrameIndex() const 
Get frame index. 
 
The template JSinglePointer class can be used to hold a pointer to an object. 
 
const JPolynome f1(1.0, 2.0, 3.0)
Function. 
 
Auxiliary class for defining the range of iterations of objects. 
 
int getStatus() const 
Get status. 
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
double getFrameTime()
Get frame time duration. 
 
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file. 
 
double getMaximalTime(const double R_Hz)
Get maximal time for given rate. 
 
Auxiliary class to select JTreeScanner based on ROOT class name. 
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
then fatal The output file must have the wildcard in the e g root fi eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
 
#define QAQC(A)
QA/QC output macro. 
 
static const int OUT_OF_SYNC
Enable (disable) synchronous signal from this PMT if this status bit is 0 (1);. 
 
static const int MODULE_OUT_OF_SYNC
Enable (disable) synchronous signal from this module if this status bit is 0 (1);. 
 
Auxiliary data structure for L1 build parameters. 
 
const JLimit & getLimit() const 
Get limit. 
 
std::map< int, range_type > map_type
 
do set_variable DETECTOR_TXT $WORKDIR detector
 
Auxiliary data structure for floating point format specification. 
 
int qaqc
QA/QC file descriptor. 
 
#define DEBUG(A)
Message macros.