80{
   84 
   86  typedef JTriggeredFileScanner_t::multi_pointer_type       multi_pointer_type;
   87 
   88  JTriggeredFileScanner_t inputFile;
   91  size_t                  numberOfPrefits;
   94  double                  Emin_GeV;
   95  double                  NPE;
   96  int                     application;
   97  string                  option;
  100 
  101  try {
  102 
  103    JParser<> zap(
"Example program to histogram fit results.");
 
  104 
  114    zap[
'O'] = 
make_field(option)              = 
"LINE", 
"LOGE", 
"LINN", 
"LOGN";
 
  117 
  118    zap(argc, argv);
  119  }
  120  catch(const exception& error) {
  121    FATAL(error.what() << endl);
 
  122  }
  123 
  125 
  126  try {
  128  }
  129  catch(const exception& error) {
  130    FATAL(error.what() << endl);
 
  131  }
  132 
  133  JVolume     volume(head, option != 
"LINE");
 
  137 
  138  cylinder.
add(offset);
 
  139 
  140  NOTICE(
"Offset: "   << offset   << endl);
 
  141  NOTICE(
"Cylinder: " << cylinder << endl);
 
  142 
  144 
  145  TH1D job("job", NULL, 100, 0.5, 100.5);
  146 
  147  TH1D hn("hn",  NULL,  250,   -0.5, 249.5);    
  148  TH1D hq("hq",  NULL,  300,    0.0, 600.0);    
  149  TH1D hi("hi",  NULL,  101,   -0.5, 100.5);    
  150  TH1D hv("hv",  NULL,  200,   -6.0,   0.0);    
  151  TH1D h1("h1",  NULL,  200,   -2.0,  +2.0);    
  152  TH1D hc("hc",  NULL,  200,   -1.0,  +1.0);    
  153  TH1D hu("hu",  NULL,  400, -1.0e3, 1.0e3);    
  154 
  155  TH1D hx("hx",  NULL,  70,   -3.0,  +2.3);     
  156  TH1D hd("hd",  NULL,  100,    0.0,  10.0);    
  157  TH1D ht("ht",  NULL,  100, -100.0, 100.0);    
  158 
  159  TH1D hz0("hz0[start]",  NULL,  400, -200.0, 200.0);    
  160  TH1D hz1("hz1[end]",    NULL,  400, -200.0, 200.0);    
  161 
  162  TH1D E_0("E_0",  NULL,  100, volume.getXmin(), volume.getXmax());     
  163  TH1D E_1("E_1",  NULL,  100, volume.getXmin(), volume.getXmax());     
  164  TH1D E_2("E_2",  NULL,  100, volume.getXmin(), volume.getXmax());     
  165  TH1D E_E("E_E",  NULL,  100, -5.0, +5.0);                             
  166  TH2D ExE("ExE",  NULL,
  167      40, volume.getXmin(), volume.getXmax(),
  168      40, volume.getXmin(), volume.getXmax());  
  169 
  170  const Int_t    ny   = 28800;
  171  const Double_t ymin =   0.0;         
  172  const Double_t ymax =   180.0;       
  173 
  175 
  176  if        (option == "LINN") {
  177 
  178    const double xmin = log((
double)   3);
 
  179    const double xmax = log((
double) 300);
 
  180 
  181    for (
double x = xmin, dx = (xmax - xmin) / 20; 
x <= 
xmax; 
x += dx) {
 
  182      X.push_back((int) exp(x));
  183    }
  184 
  185  } else if (option == "LOGN") {
  186 
  187    const double xmin = log10((
double)   3);
 
  188    const double xmax = log10((
double) 300);
 
  189 
  190    for (
double x = xmin, dx = (xmax - xmin) / 20; 
x <= 
xmax; 
x += dx) {
 
  191      X.push_back(x);
  192    }
  193 
  194  } else {
  195 
  196    for (double x = volume.getXmin(), dx = (volume.getXmax() - volume.getXmin()) / 20.0; x < volume.getXmax() + 0.5*dx; x += dx) {
  197      X.push_back(x);
  198    }
  199  }
  200 
  201  TH2D h2("h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
  202 
  203  TH2D Va("Va", NULL, 
  206  TH2D Vb("Vb", NULL, 
  209 
  212 
  213 
  214  while (inputFile.hasNext()) {
  215 
  216    STATUS(
"event: " << setw(10) << inputFile.getCounter() << 
'\r'); 
DEBUG(endl);
 
  217 
  218    multi_pointer_type ps = inputFile.next();
  219 
  223 
  225 
  226    job.Fill(1.0);
  227 
  228 
  229    double Enu  = 0.0;
  230    double Emu  = 0.0;
  231    double Emax = 0.0;
  232 
  235    }
  236 
  237    vector<Trk>::const_iterator muon = event->mc_trks.end();
  238 
  239    for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
  240 
  242 
  243        Emu += track->E;
  244 
  245        if (track->E > Emax) {
  246          muon = track;
  247          Emax = track->E;
  248        }
  249      }
  250    }
  251 
  252    if (muon == event->mc_trks.end()) {
  253      continue;
  254    }
  255 
  256    job.Fill(3.0);
  257 
  258 
  259    
  260 
  262 
  263    {
  264      const double E = event->mc_trks[0].E;
  266    
  267      if      (option == "LINN")
  269      else if (option == "LOGN")
  271      else
  273    }
  274 
  275 
  276    if (!evt->empty()) {
  277 
  279 
  280      if (evt->begin() == __end) {
  281        continue;
  282      }
  283 
  284      job.Fill(4.0);
  285 
  286      if (numberOfPrefits > 0) {
  287 
  288        JEvt::iterator __q = __end;
  289 
  290        advance(__end = evt->begin(), min(numberOfPrefits, (
size_t) 
distance(evt->begin(), __q)));
 
  291 
  293 
  294      } else {
  295 
  297      }
  298 
  299      double    E = 0.0;
  301 
  303        E        = Emu;
  305      } 
else if (
primary == neutrino_t) {       
 
  306        E        = Enu;
  308      }
  309 
  310      JEvt::iterator best  = pointing(evt->begin(), __end);
  311      const Double_t beta  = pointing.
getAngle(*best);
 
  312      const double   Efit  = best->getE();
  313      const double   Eraw  = best->getW(
JENERGY_ENERGY, numeric_limits<double>::min());
 
  314      const double   mip   = best->getW(
JSTART_NPE_MIP, numeric_limits<double>::max());
 
  315 
  316      
  317 
  318      bool ok = (Efit >= Emin_GeV  && mip  >= NPE);
  319 
  320      if (ok) {
  321 
  322        job.Fill(5.0);
  323 
  324        hn.Fill((Double_t) best->getNDF());
  325        hq.Fill(best->getQ());
  326        hi.Fill((Double_t) 
distance(evt->begin(), best));
 
  327        hc.Fill(best->getDZ());
  328 
  329        
  330 
  333          hu.Fill(atmosphere(evt->begin(), __end));
  334        }
  335 
  336        hx.Fill(max(log10(beta), hx.GetXaxis()->GetXmin()));
  337 
  338        Q.put(beta);
  339 
  342 
  344        tb.
sub(converter.putTime());
 
  345 
  348 
  350 
  352 
  353          job.Fill(6.0);
  354 
  356 
  358 
  360 
  362 
  363            job.Fill(7.0);
  364 
  366 
  368 
  371          }
  372        }
  373 
  376 
  377        E_0.Fill(volume.getX(E,    true));
  378        E_1.Fill(volume.getX(Eraw, true));
  379        E_2.Fill(volume.getX(Efit, true));
  380        E_E.Fill(volume.getX(Efit) - volume.getX(E));
  381        ExE.Fill(volume.getX(E),     volume.getX(Efit));
  382 
  383        h2.Fill(x, beta);
  384 
  387        }
  388 
  390 
  391          const double npe   = best->getW(
JVETO_NPE);               
 
  393          const double pv    = TMath::PoissonI(count, npe);         
  394 
  395          hv.Fill(max(log10(pv), hv.GetXaxis()->GetXmin()));
  396        }
  397      }
  398    }
  399  }
  401 
  402  NOTICE(
"Number of events input           " << setw(8) << right << job.GetBinContent(1) << endl);
 
  403  NOTICE(
"Number of events with muon       " << setw(8) << right << job.GetBinContent(3) << endl);
 
  404  NOTICE(
"Number of events with fit        " << setw(8) << right << job.GetBinContent(4) << endl);
 
  405  NOTICE(
"Number of events selected        " << setw(8) << right << job.GetBinContent(5) << endl);
 
  406  NOTICE(
"Number of events with neutrino   " << setw(8) << right << job.GetBinContent(6) << endl);
 
  407  NOTICE(
"Number of events contained       " << setw(8) << right << job.GetBinContent(7) << endl);
 
  408 
  409  if (Q.getCount() != 0) {
  410    NOTICE(
"Median space angle [deg] " << 
FIXED   (6,3) << Q.getQuantile(0.5) << endl);
 
  411  }
  412 
  413  out.Write();
  414  out.Close();
  415}
#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.
 
double getRadius() const
Get radius.
 
Data structure for vector in two dimensions.
 
double getLengthSquared() const
Get length squared.
 
double getIntersection(const JVector3D &pos) const
Get longitudinal position along axis of position of closest approach with given position.
 
double getZmin() const
Get minimal z position.
 
bool is_inside(const JVector3D &pos) const
Check whether given point is inside cylinder.
 
double getZmax() const
Get maximal z position.
 
JCylinder3D & add(const JVector3D &pos)
Add position.
 
Data structure for position in three dimensions.
 
const JPosition3D & getPosition() const
Get position.
 
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
 
JTime & add(const JTime &value)
Addition operator.
 
JTime & sub(const JTime &value)
Subtraction operator.
 
JVector3D & add(const JVector3D &vector)
Add vector.
 
Utility class to parse command line options.
 
Auxiliary class to evaluate atmospheric muon hypothesis.
 
Auxiliary class to compare fit results with respect to a reference direction (e.g....
 
double getAngle(const JFit &fit) const
Get angle between reference direction and fit result.
 
const_iterator< T > end() const
Get end of data.
 
const_iterator< T > begin() const
Get begin of data.
 
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
 
static const int JMUONGANDALF
 
static const int JMUONPREFIT
 
static const int JMUONENERGY
 
static const int JMUONSIMPLEX
 
static const int JMUONPATH
 
static const int JMUONSTART
 
static const int JENERGY_ENERGY
uncorrected energy [GeV] from JEnergy.cc
 
static const int JVETO_NPE
number of photo-electrons from JVeto.cc
 
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
 
static const int JVETO_NUMBER_OF_HITS
number of hits from JVeto.cc
 
static const int JSTART_NPE_MIP
number of photo-electrons up to the barycentre from JStart.cc
 
Vec getOrigin(const JHead &header)
Get origin.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
JTrack3E getTrack(const Trk &track)
Get track.
 
JCylinder3D getCylinder(const JHead &header)
Get cylinder corresponding to the positions of generated tracks (i.e.
 
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
 
Vec getOffset(const JHead &header)
Get offset.
 
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
 
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
 
Head getCommonHeader(const JMultipleFileScanner_t &file_list)
Get common Monte Carlo header.
 
KM3NeT DAQ data structures and auxiliaries.
 
const char *const neutrino_t
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
Auxiliary data structure for floating point format specification.
 
Auxiliary class for histogramming of effective volume.
 
Auxiliary class to test history.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
General purpose sorter of fit results.
 
Auxiliary class for defining the range of iterations of objects.
 
const JLimit & getLimit() const
Get limit.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
 
double E
Energy [GeV] (either MC truth or reconstructed)
 
Reconstruction type dependent comparison of track quality.