116{
  120 
  123  string             detectorFile;
  124  double             Timewindow_ns;
  125  int                binwidth; 
  126  double             TmaxL1_ns;
  128  unsigned int       multiplicity;
  129  bool               correct_time;
  130  double             livetime_s;
  132 
  133  try {
  134 
  135    JParser<> zap(
"Program to create L1 hit time difference histograms from raw data.");
 
  136 
  137    zap[
'f'] = 
make_field(inputFile,     
"input file");
 
  139    zap[
'a'] = 
make_field(detectorFile,  
"detector file");
 
  140    zap[
't'] = 
make_field(TmaxL1_ns,     
"max time between L1 hits [ns]")               = 1000.0;
 
  141    zap[
'T'] = 
make_field(Timewindow_ns, 
"time window around t=0 [ns]")                 = 2400.0;
 
  142    zap[
'w'] = 
make_field(binwidth,      
"binwidth [ns]")                               = 1;
 
  144    zap[
'm'] = 
make_field(multiplicity,  
"minimal multiplicity of the L1 hits")         = 2;
 
  145    zap[
'c'] = 
make_field(correct_time,  
"subtract expected arrival time from delta-t");
 
  146    zap[
'L'] = 
make_field(livetime_s,    
"livetime of the data, set to positive value") = -1.0; 
 
  148 
  149    if (zap.read(argc, argv) != 0)
  150      return 1;
  151  }
  152  catch(const exception &error) {
  153    FATAL(error.what() << endl);
 
  154  }
  155 
  156 
  158 
  159  try {
  161  }
  164  }
  165 
  167    FATAL(
"Empty detector." << endl);
 
  168  }
  169 
  171 
  173 
  174  const double ctMin = -1; 
  176 
  177  
  179 
  181  const double xmin = -0.5;
 
  182  const double xmax = nx - 0.5;
 
  183 
  184  const double ymin = -floor(Timewindow_ns) + 0.5;
  185  const double ymax = +floor(Timewindow_ns) + 0.5; 
  186  const int    ny   = (int) ((ymax - ymin) / binwidth);
  187 
  188  
  191  Int_t npairs = c.getNumberOfPairs();
  193 
  195  manager = new JManager <int, TH2D>(new TH2D("h%", "", npairs, 0.5, npairs+0.5, ny, ymin, ymax));
  196 
  197  NOTICE(
"Running JMonitorL1dt: Monitoring L1 time differences and creating histograms." << endl);
 
  198  for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  199 
  200    const JModuleAddress& address = router.getAddress(module->getID());
 
  201 
  202    STATUS(
"Booking histograms for module " << module->getID() << endl);
 
  203 
  204    const JString title(module->getID());
 
  207    titleString1D = title + ".1L";
  208    titleString2D = title + ".2S";
  209 
  210    zmap[address.
first] = JHistogram(
new TH2D((titleString2D).c_str(), NULL, nx, xmin, xmax, ny, ymin, ymax),
 
  211        new TH1D((titleString1D).c_str(), NULL, nx, xmin, xmax));
  212 
  213    for (JDetector::iterator mod = 
detector.begin(); mod != 
detector.end(); ++mod) {
 
  214      zmap[address.
first].h2s->GetXaxis()->SetBinLabel(
distance(
detector.begin(), mod)+1, Form(
"%i", mod->getID()));
 
  215      zmap[address.
first].h1l->GetXaxis()->SetBinLabel(
distance(
detector.begin(), mod)+1, Form(
"%i", mod->getID()));
 
  216    }
  217  }
  218 
  219 
  221 
  223 
  224  int counter = 0;
  225 
  226  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
  227 
  228    STATUS(
"event: " << setw(10) << counter << 
'\r'); 
DEBUG(endl);
 
  229 
  231 
  232    JFrameL1_t frameL1;
  235 
  236    for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
  237      if (router.hasModule(super_frame->getModuleID()) && !super_frame->empty()) {
  238 
  239        const JModuleAddress& address  = router.getAddress(super_frame->getModuleID());
 
  241 
  242        frameL1.clear();
  243 
  244        buildL2(*super_frame, module, back_inserter(frameL1));
  245 
  246        for (JFrameL1_t::iterator L1hit = frameL1.begin(); L1hit != frameL1.end(); ++L1hit) {
  247          buffer.push_back(
JElement(address.
first, L1hit->begin()->getT()));
 
  248        }
  249      }
  250    }
  251 
  253      if (!DOM_OK[
distance(zmap.begin(), h1)]) { 
 
  254        continue; 
  255      }
  256      for (
unsigned int i = 0; i < 
detector.size(); ++i) {
 
  257        if (DOM_OK[i]) { h1->h1l->Fill(i, 
getFrameTime() * 1e-9); } 
 
  258      }
  259    }
  260 
  261    
  262    sort(buffer.begin(), buffer.end());
  263 
  264    for (vector<JElement>::const_iterator p = buffer.begin(); p != buffer.end(); ) {
  265      vector<JElement>::const_iterator q = p;
  266 
  268 
  269      while (++q != buffer.end() && q->t - p->t <= Timewindow_ns ) {
  270        
  271 
  273 
  275        double time_correction = (correct_time ? (dom_distance / 
getSpeedOfLight()) : 0);
 
  276 
  277        zmap[p->id].h2s->Fill(q->id, q->t - p->t - time_correction);
  278        zmap[q->id].h2s->Fill(p->id, p->t - q->t + time_correction);
  279 
  281          
  282          int xbin = c.getIndex(module_p.
getFloor() - 1, module_q.
getFloor() - 1) + 1;
 
  283          (*manager)[module_p.
getString()]->Fill(xbin, q->t - p->t - time_correction);
 
  284        }
  285      }
  286      p++;  
  287    }
  288    buffer.clear();
  289  }
  291 
  292  
  293  if (livetime_s > 0.0) {
  295      TH1D* hl = i->h1l;
  296      for (int ibin = 1; ibin <= hl->GetNbinsX(); ++ibin) {
  297        hl->SetBinContent(ibin, livetime_s);
  298        hl->SetBinError(ibin, 0.0000001);
  299      }
  300    }
  301  }
  302 
  304 
  306    i->h2s->Write();
  307    i->h1l->Write();
  308  }
  309 
  310  manager->Write(out);
  311  out.Write();
  312  out.Close();
  313}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
 
int getFloor() const
Get floor number.
 
int getString() const
Get string number.
 
Address of module in detector data structure.
 
int first
index of module in detector data structure
 
Router for direct addressing of module data in detector data structure.
 
Data structure for a composite optical module.
 
const JPosition3D & getPosition() const
Get position.
 
Auxiliary class for multiplexing object iterators.
 
Wrapper class around STL string class.
 
Utility class to parse command line options.
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
 
General purpose class for object reading from a list of file names.
 
Template definition for direct access of elements in ROOT TChain.
 
int getNumberOfFloors(const JDetector &detector)
Get number of floors.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getDistance(const JFirst_t &first, const JSecond_t &second)
Get distance between objects.
 
const double getSpeedOfLight()
Get speed of light.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
std::set< JROOTClassSelector > getROOTClassSelection(const bool option=false)
Get ROOT class selection.
 
double getFrameTime()
Get frame time duration.
 
bool comparepair(const pair_type &A, const pair_type &B)
 
Auxiliary class to select ROOT class based on class name.
 
Data structure for L2 parameters.