13 #include "evt/Head.hh" 
   77   inline bool compare(
const JHitL0& first, 
const JHitL0& second)
 
   79     if (std::equal_to<KM3NETDAQ::JDAQPMTIdentifier>()(first, second))
 
   80       return std::less<JTRIGGER::JHit>()(first, second);
 
   82       return std::less<KM3NETDAQ::JDAQPMTIdentifier>()(first, second);
 
   98 int main(
int argc, 
char **argv)
 
  105   typedef JParallelFileScanner_t::multi_pointer_type               multi_pointer_type;
 
  109   JParallelFileScanner_t  inputFile;
 
  116   size_t         numberOfPrefits;
 
  122   histogram_type calibrate;
 
  127     JParser<> zap(
"Program to perform PDF fit of muon trajectory to data.");
 
  132     zap[
'n'] = 
make_field(numberOfEvents)      = JLimit::max();
 
  134     zap[
'R'] = 
make_field(roadWidth_m)         = numeric_limits<double>::max();
 
  135     zap[
'B'] = 
make_field(R_Hz,      
"Default background rate if no summary data are available.")  = 6.0e3;
 
  137     zap[
'T'] = 
make_field(TTS_ns,    
"Time smearing of PDF.");
 
  139     zap[
'E'] = 
make_field(E_GeV,     
"Default energy if no energy estimate is available.")         = 1.0e3;
 
  140     zap[
'z'] = 
make_field(z,         
"Extension of longitudinal range of muon track.")             = 
JZRange(0.0, 0.0);
 
  142     zap[
'c'] = 
make_field(calibrate, 
"Histogram for time calibration per optical module.")         = histogram_type();
 
  147   catch(
const exception& error) {
 
  148     FATAL(error.what() << endl);
 
  174   JRegressor_t::T_ns.setRange(-50.0, +450.0);   
 
  175   JRegressor_t::Vmax_npe           =   10.0;    
 
  176   JRegressor_t::MAXIMUM_ITERATIONS = 1000;
 
  178   JRegressor_t fit(pdfFile, TTS_ns);
 
  181     fit.compress(T_compress);
 
  184   fit.parameters.resize(5);
 
  187   fit.parameters[1] = JLine3Z::pY();
 
  188   fit.parameters[2] = JLine3Z::pT();
 
  189   fit.parameters[3] = JLine3Z::pDX();
 
  190   fit.parameters[4] = JLine3Z::pDY();
 
  192   if (fit.getRmax() < roadWidth_m) {
 
  193     roadWidth_m = fit.getRmax();
 
  204   if (calibrate.is_valid()) {
 
  206     if (numberOfPrefits != 1) {
 
  207       WARNING(
"Running in calibration mode but number of prefits " << numberOfPrefits << 
" != " << 1 << endl);
 
  210     ha = 
new TH2D    (
"ha", NULL, 256, -0.5, 255.5, 
 
  211                       calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
 
  212     hb = 
new TProfile(
"hb", NULL, 256, -0.5, 255.5);
 
  215                       calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
 
  217     gd = JManager_t(
new TProfile(
"%", NULL, 
detector.size(), -0.5, 
detector.size() - 0.5));
 
  224   while (inputFile.hasNext()) {
 
  226     STATUS(
"event: " << setw(10) << inputFile.getCounter() << 
'\r'); 
DEBUG(endl);
 
  228     multi_pointer_type ps = inputFile.next();
 
  234     summaryRouter.
update(*tev);
 
  236     JEvt::iterator __end = evt->end();
 
  242     if (evt->begin() != __end) {
 
  244       copy(evt->begin(), __end, back_inserter(out));
 
  246       if (numberOfPrefits > 0) {
 
  247         advance(__end = evt->begin(), min(numberOfPrefits, out.size()));
 
  250       partial_sort(evt->begin(), __end, evt->end(), 
qualitySorter);
 
  252       __end = partition(evt->begin(), __end, 
JHistory::is_event(evt->begin()->getHistory()));
 
  257       buildL0(*tev, moduleRouter, 
true, back_inserter(dataL0));
 
  260       if (dataL0.size() >= fit.parameters.size()) {
 
  262         for (JEvt::const_iterator track = evt->begin(); track != __end; ++track) {
 
  278           for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
 
  280             double rate_Hz = summaryRouter.
getRate(*i);
 
  282             if (rate_Hz <= 0.0) {
 
  283               rate_Hz = summaryRouter.
getRate();
 
  297           sort(data.begin(), data.end(), compare);
 
  299           JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());
 
  302           const int NDF = 
distance(data.begin(), __end) - fit.parameters.size();
 
  308             if (track->getE() > 0.1)
 
  309               fit.E_GeV   = track->getE();
 
  313             const double chi2 = fit(
JLine3Z(tz), data.begin(), __end);
 
  323             out.rbegin()->setW(track->getW());
 
  325                                                                    fit.error.getDY() * fit.error.getDY()));
 
  332             if (calibrate.is_valid()) {
 
  336               for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
 
  337                 buffer.insert(hit->getModuleID());
 
  346                 if (
distance(data.begin(), q) - fit.parameters.size() > 0) {
 
  348                   fit(ta, data.begin(), q);     
 
  350                   sort(q, __end, compare);      
 
  352                   const int    index    = moduleRouter.
getIndex(*
id);
 
  353                   const double t1       = fit.value.getT(q->getPosition());
 
  354                   JTrack3D     gradient = fit(fit.value, *q).gradient;
 
  358                   ha->Fill(q->getToT(), q->getT1() - t1);
 
  359                   hb->Fill(q->getToT(), gradient.
getT());
 
  361                   h2->Fill(index, q->getT() - t1);
 
  363                   gd[
"T"]->Fill(index, gradient.
getT());
 
  364                   gd[
"X"]->Fill(index, gradient.
getX());
 
  365                   gd[
"Y"]->Fill(index, gradient.
getY());
 
  366                   gd[
"Z"]->Fill(index, gradient.
getZ());
 
  383   if (calibrate.is_valid()) {
 
  389     for (JManager_t::const_iterator i = gd.begin(); i != gd.end(); ++i) {