31{
   35 
   39  string               regexp;
   40  int                  labelInterval;
   42  
   43  try { 
   44 
   45    JParser<> zap(
"Auxiliary application to plot detector parameters.");
 
   46 
   47    zap[
'a'] = 
make_field(detectorFileA,     
"detector file.");
 
   50    zap[
'r'] = 
make_field(regexp,            
"regular expresion to extract bin labels for the x-axis")  = 
" ";
 
   51    zap[
'L'] = 
make_field(labelInterval,     
"interval between x-axis bins for which labels are shown") = 1;
 
   53 
   54    zap(argc, argv);
   55  }
   56  catch(const exception &error) {
   57    FATAL(error.what() << endl);
 
   58  }
   59 
   60 
   61  if (detectorFileA.empty()) {
   62    FATAL(
"No detector file specified." << endl);
 
   63  }
   64 
   65  if (detectorFileB.size() != 0 && detectorFileB.size() != detectorFileA.size()) {
   66    FATAL(
"Detector file size " << detectorFileA.size() << 
" != " << detectorFileB.size() << endl);
 
   67  }
   68 
   69 
   70  const int NUMBER_OF_FILES = detectorFileA.size();
   71 
   72  JManager<string, TH2D> manager(new TH2D("%", NULL,
   73                                          NUMBER_OF_FILES, -0.5, NUMBER_OF_FILES - 0.5,
   74                                          NUMBER_OF_PMTS,  -0.5, NUMBER_OF_PMTS  - 0.5));
   75 
   76  manager->Sumw2(kFALSE);
   77 
   78  if (regexp != " "){
   79 
   80    const int n = (NUMBER_OF_FILES < labelInterval) ? 1 : labelInterval;
 
   81 
   82    const TPRegexp buffer(regexp);
   83    
   84    for (int i = 0; i != NUMBER_OF_FILES; ++i){
   85 
   86      if(i%n == 0)
   87        manager->GetXaxis()->SetBinLabel(i+1 , 
parse(buffer , TString(detectorFileA[i].c_str())));
 
   88      else
   89        manager->GetXaxis()->SetBinLabel(i+1 , " ");
   90    }
   91  }
   92 
   93 
   94  if (detectorFileB.empty()) {
   95 
   97 
   98    try {
  100    }
  103    }
  104 
  106      FATAL(
"Empty detector." << endl);
 
  107    }
  108 
  109 
  110    for (int i = 0; i != NUMBER_OF_FILES; ++i) {
  111 
  112      NOTICE(
"Histogram " << detectorFileA[i] << 
" relative to " << detectorFileA[0] << endl);
 
  113    
  115 
  116      try {
  117        load(detectorFileA[i], buffer);
 
  118      }
  121      }
  122 
  124  
  125      for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  126 
  127        TH2D* h2 = manager[
MAKE_CSTRING(module->getID() << 
"." << 
"t0")];
 
  128 
  129        for (size_t pmt = 0; pmt != module->size(); ++pmt) {
  130          h2->SetBinContent(i+1, pmt+1, router.getModule(module->getID()).getPMT(pmt).getT0() - module->getPMT(pmt).getT0());
  131        }
  132      }
  133    }
  134 
  135  } else {
  136 
  137    for (int i = 0; i != NUMBER_OF_FILES; ++i) {
  138 
  139      NOTICE(
"Histogram " << detectorFileA[i] << 
" relative to " << detectorFileB[i] << endl);
 
  140 
  143 
  144      try {
  145        load(detectorFileA[i], detectorA);
 
  146        load(detectorFileB[i], detectorB);
 
  147      }
  150      }
  151 
  153  
  154      for (JDetector::iterator module = detectorA.begin(); module != detectorA.end(); ++module) {
  155 
  156        TH2D* h2 = manager[
MAKE_CSTRING(module->getID() << 
"." << 
"t0")];
 
  157 
  158        for (size_t pmt = 0; pmt != module->size(); ++pmt) {
  159          h2->SetBinContent(i+1, pmt+1, router.getModule(module->getID()).getPMT(pmt).getT0() - module->getPMT(pmt).getT0());
  160        }
  161      }
  162    }
  163  }
  164 
  165 
  166  for (JManager<string, TH2D>::iterator i = manager.begin(); i != manager.end(); ++i) {
  167    i->second->Sumw2(kFALSE);
  168  }
  169 
  171}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
#define MAKE_CSTRING(A)
Make C-string.
 
Router for direct addressing of module data in detector data structure.
 
Utility class to parse command line options.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
KM3NeT DAQ data structures and auxiliaries.
 
boost::property_tree::ptree parse(std::string str)
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...