59{
   63  
   65  
   67  
   68  string                     detectorFile;
   70 
   75 
   76  bool                       useWeights;
   78 
   79  string                     recotype;
   80    
   82  
   83  try {
   84 
   86 
   91 
   92    JParser<> zap(
"Example program to analyse track fit results from Evt formatted data.");
 
   93 
   98      = "";
  100      = "histogram.root";
  103      shower_t();
  110      = 2;
  111 
  112    zap(argc, argv);
  113  }
  114  catch(const exception& error) {
  115    FATAL(error.what() << endl);
 
  116  }
  117 
  118  if (useWeights && numberOfEvents != 
JLimit::max()) {
 
  119    FATAL(
"Cannot apply weighting to limited number of events.");
 
  120  }
  121 
  122 
  123  
  124  
  126 
  127  if (detectorFile != "") {
  128    try {
  130    }
  133    }
  134  }
  135  
  137    
  138  
  139  
  140 
  141  bool (*has_reconstruction)(
const Evt&);
 
  142  const Trk& (*get_best_fit)(
const Evt&);
 
  143 
  147  } else if (recotype == shower_t()) {
  150  } else {
  151    FATAL(
"Invalid recotype: " << recotype);
 
  152  }
  153  
  154  
  155  
  156 
  157  const Int_t    N_Nhits       =               400;
  158  const Double_t Nhits_min     =         0.0 - 0.5;
  159  const Double_t Nhits_max     =      1000.0 - 0.5;
  160  
  161  const Int_t    N_Noverlays   =                40;
  162  const Double_t Noverlays_min =         0.0 - 0.5;
  163  const Double_t Noverlays_max =      1000.0 - 0.5;
  164 
  165  const Int_t    N_radius      =               201;
  166  const Double_t radius_min    =      -700.0 - 0.5;
  167  const Double_t radius_max    =      +700.0 + 0.5;
  168 
  169  const Int_t    N_height      =                18;
  170  const Double_t height_min    =              20.0;
  171  const Double_t height_max    =             200.0;
  172 
  173  const Int_t    N_ToTfrac     =                20;
  174  const Double_t ToTfrac_min   =               0.0;
  175  const Double_t ToTfrac_max   =               1.0;
  176 
  177  const Int_t    N_dt          =              1500;
  178  const Double_t dt_min        =      -500.0 - 0.5;
  179  const Double_t dt_max        =      1000.0 - 0.5;
  180 
  181  const Int_t    N_zenith      =                21;
  182  const Double_t zenith_min    =              -1.0;
  183  const Double_t zenith_max    =              +1.0;
  184  
  185  const Int_t    N_energy      =                60;
  186  const Double_t energy_min    =              -2.0;
  187  const Double_t energy_max    =               4.0;
  188 
  189  const Int_t    N_LoE         =               100;
  190  const Double_t LoE_min       =              -1.0;
  191  const Double_t LoE_max       =               8.0;
  192 
  193  const Int_t    N_quality     =               100;
  194  const Double_t quality_min   =            -200.0;
  195  const Double_t quality_max   =            +800.0;
  196 
  197  const Int_t    N_beta0       =                60;
  198  const Double_t beta0_min     =              -2.0;
  199  const Double_t beta0_max     =              +3.5;
  200  
  201 
  202  
  203 
  204  string ordinateLabel(useWeights ? "Rate [Hz]" : "Number of events");
  205 
  207 
  208  TH1D hs  (
"hs",   
MAKE_CSTRING(
"; #snapshot hits; "                                  << ordinateLabel),
 
  209            N_Nhits,     Nhits_min,     Nhits_max);
  210  TH1D hn  (
"hn",   
MAKE_CSTRING(
"; #triggered hits; "                                 << ordinateLabel),
 
  211            N_Nhits,     Nhits_min,     Nhits_max);
  212  TH1D ho  (
"ho",   
MAKE_CSTRING(
"; #overlays; "                                       << ordinateLabel),
 
  213            N_Noverlays, Noverlays_min, Noverlays_max);
  214  
  215  TH1D hz  (
"hz",   
MAKE_CSTRING(
"; cos(#theta); "                                     << ordinateLabel),
 
  216            N_zenith,    zenith_min,    zenith_max);
  217  TH1D he  (
"he",   
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); "                      << ordinateLabel),
 
  218            N_energy,    energy_min,    energy_max);
  219  TH1D hLoE(
"hLoE", 
MAKE_CSTRING(
"; L/E [km/GeV]; "                                    << ordinateLabel),
 
  220            N_LoE,       LoE_min,       LoE_max);
  221  TH1D ht  (
"ht",   
MAKE_CSTRING(
"; #Delta t [ns]; "                                   << ordinateLabel),
 
  222            N_dt,        dt_min,        dt_max);
  223 
  224  TH1D hZ  (
"hZ",   
MAKE_CSTRING(
"; longitudinal ToT-barycenter [m]; "                 << ordinateLabel),
 
  225            N_height,    height_min,    height_max);
  226  TH1D hT0 (
"hT0",  
MAKE_CSTRING(
"; ToT-fraction below earliest triggered hit [ns]; "  << ordinateLabel),
 
  227            N_ToTfrac,   ToTfrac_min,   ToTfrac_max);
  228  TH1D hT1 (
"hT1",  
MAKE_CSTRING(
"; ToT-fraction above earliest triggered hit [ns]; "  << ordinateLabel),
 
  229            N_ToTfrac,   ToTfrac_min,   ToTfrac_max);  
  230 
  231  TH1D hq  (
"hq",   
MAKE_CSTRING(
"; quality; "                                         << ordinateLabel),
 
  232            N_quality,   quality_min,   quality_max);
  233  TH1D hb0 (
"hb0",  
MAKE_CSTRING(
"; #beta_{0}; "                                       << ordinateLabel),
 
  234            N_beta0,     beta0_min,     beta0_max);
  235  
  236  TH2D hzo (
"hzo",  
MAKE_CSTRING(
"; cos(#theta); #overlays; "                          << ordinateLabel),
 
  237            N_zenith,    zenith_min,    zenith_max,
  238            N_Noverlays, Noverlays_min, Noverlays_max);
  239  TH2D hze (
"hze",  
MAKE_CSTRING(
"; cos(#theta); log_{10}(E_{reco} / 1 GeV); "         << ordinateLabel),
 
  240            N_zenith,    zenith_min,    zenith_max,
  241            N_energy,    energy_min,    energy_max);
  242  TH2D heo (
"heo",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #overlays; "           << ordinateLabel),
 
  243            N_energy,    energy_min,    energy_max,
  244            N_Noverlays, Noverlays_min, Noverlays_max);
  245  TH2D hzt (
"hzt",  
MAKE_CSTRING(
"; cos(#theta); #Delta t [ns]; "                      << ordinateLabel),
 
  246            N_zenith,    zenith_min,    zenith_max,
  247            N_dt,        dt_min,        dt_max);
  248  TH2D het (
"het",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #Delta t [ns]; "       << ordinateLabel),
 
  249            N_energy,    energy_min,    energy_max,
  250            N_dt,        dt_min,        dt_max);
  251  TH2D hot (
"hot",  
MAKE_CSTRING(
"; #overlays; #Delta t [ns]; "                        << ordinateLabel),
 
  252            N_Noverlays, Noverlays_min, Noverlays_max,
  253            N_dt,        dt_min,        dt_max);
  254  
  255  TH2D hzq (
"hzq",  
MAKE_CSTRING(
"; cos(#theta); quality; "                            << ordinateLabel),
 
  256            N_zenith,    zenith_min,    zenith_max,
  257            N_quality,   quality_min,   quality_max);
  258  TH2D heq (
"heq",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); quality; "             << ordinateLabel),
 
  259            N_energy,    energy_min,    energy_max,
  260            N_quality,   quality_min,   quality_max);
  261  TH2D hoq (
"hoq",  
MAKE_CSTRING(
"; #overlays; quality; "                              << ordinateLabel),
 
  262            N_Noverlays, Noverlays_min, Noverlays_max,
  263            N_quality,   quality_min,   quality_max);
  264  
  265  TH2D hob0(
"hob0", 
MAKE_CSTRING(
"; #overlays; log_{10}(#beta_{0}); "                  << ordinateLabel),
 
  266            N_Noverlays, Noverlays_min, Noverlays_max,
  267            N_beta0,     beta0_min,     beta0_max);
  268  TH2D heb0(
"heb0", 
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); log_{10}(#beta_{0}); " << ordinateLabel),
 
  269            N_energy,    energy_min,    energy_max,
  270            N_beta0,     beta0_min,     beta0_max);     
  271  TH2D hzb0(
"hzb0", 
MAKE_CSTRING(
"; cos(#theta); log_{10}(#beta_{0}); "                << ordinateLabel),
 
  272            N_zenith,    zenith_min,    zenith_max,
  273            N_beta0,     beta0_min,     beta0_max);
  274  
  275  TH2D hxy (
"hxy",  
MAKE_CSTRING(
"; x [m]; y [m]; "                                    << ordinateLabel),
 
  276            N_radius,    radius_min,    radius_max,
  277            N_radius,    radius_min,    radius_max);
  278  
  279  
  280  
  281 
  283  
  284  if (scanners.setFlux(fluxMap) == 0) {
  285    WARNING(
"No flux functions set." << endl);
 
  286  }
  287  
  289  
  291    
  292    scanner->setLimit(numberOfEvents);
  293    
  294    while (scanner->hasNext()) {
  295      
  296      const Evt* evt = scanner->next();
 
  297      
  298      const double weight = (useWeights ? scanner->getWeight(*evt) : 1.0);
  299 
  300      const size_t NsnapshotHits  = evt->
hits.size();
 
  301      const size_t NtriggeredHits = count_if(evt->
hits.begin(), evt->
hits.end(),
 
  303      
  304      if (!triggeredHitsRange(NtriggeredHits)) { continue; }
  305      
  306      hs.Fill(NsnapshotHits,  weight);
  307      hn.Fill(NtriggeredHits, weight);
  309      
  310      if (!has_reconstruction(*evt)) { continue; }
  311      
  312      const Trk&      best_trk = (*get_best_fit)(*evt);
 
  314 
  315      const double    logE     = log10(tb.
getE());
 
  317      const double    logLoE   = log10(L/tb.
getE());
 
  318      
  319      if (!energyRange   (tb.
getE())                    ||
 
  320          !coszenithRange(tb.
getDZ())                   ||
 
  322        continue;
  323      }
  324 
  325      
  326          
  328             RIGHT     (15)    << scanner->getCounter()               <<
 
  330 
  331      
  332        
  333      hz  .Fill(tb.
getDZ(),                            weight);
 
  334      he  .Fill(logE,                                  weight);
  335      hLoE.Fill(logLoE,                                weight);
  336      hq  .Fill(best_trk.
lik,                          weight);
 
  337 
  338      hzo.Fill(tb.
getDZ(),            evt->overlays,   weight);
 
  339      hze.Fill(tb.
getDZ(),            logE,            weight);
 
  340      heo.Fill(logE,                  evt->overlays,   weight);
  341 
  342      hoq.Fill(evt->overlays,         best_trk.
lik,    weight);
 
  343      hzq.Fill(tb.
getDZ(),            best_trk.
lik,    weight);
 
  344      heq.Fill(logE,                  best_trk.
lik,    weight);
 
  345 
  346      hxy.Fill(tb.
getX(),             tb.
getY(),       weight);
 
  347 
  349 
  351          
  352        hb0 .Fill(logb0,                               weight);
  353        hob0.Fill(evt->overlays,      logb0,           weight);   
  354        heb0.Fill(logE,               logb0,           weight);
  355        hzb0.Fill(tb.
getDZ(),         logb0,           weight);
 
  356      }
  357 
  358      double ToTbelow     = 0.0;
  359      double ToTabove     = 0.0;
  360      double ToTtotal     = 0.0;
  361      double ToTweightedZ = 0.0;
  362        
  363      vector<Hit>::const_iterator firstHit = min_element(evt->hits.cbegin(), evt->hits.cend(),
  365        
  366      for (vector<Hit>::const_iterator hit = evt->hits.cbegin(); hit != evt->hits.cend(); ++hit) {
  367          
  368        if (router.hasPMT(hit->pmt_id)) {
  369            
  370          const JPMT&     pmt  = router.getPMT(hit->pmt_id);
 
  371            
  372          const double    t0   = tb.
getT(pmt);
 
  373          const double    t1   = 
getTime(*hit);
 
  374            
  375          ht .Fill(t1 - t0,                            weight);
  376          hot.Fill(evt->overlays,     t1 - t0,         weight);
  377          hzt.Fill(tb.
getDZ(),        t1 - t0,         weight);
 
  378          het.Fill(log10(best_trk.
E), t1 - t0,         weight);
 
  379              
  380          if (hit->trig > 0) {
  381 
  382            ToTtotal     += hit->tot;
  383            ToTweightedZ += hit->tot * hit->pos.z;
  384                
  385            if        (hit->pos.z < firstHit->pos.z)  {
  386              ToTbelow   += hit->tot;
  387            } else if (hit->pos.z >= firstHit->pos.z) {
  388              ToTabove   += hit->tot;
  389            }
  390          }
  391        }
  392      }
  393          
  394      hT0.Fill(ToTbelow / ToTtotal,                     weight);
  395      hT1.Fill(ToTabove / ToTtotal,                     weight);
  396      hZ .Fill(ToTweightedZ / ToTtotal,                 weight);
  397    }
  398  }
  399  
  401 
  402  out.Write();
  403  out.Close();
  404 
  405  return 0;
  406}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
#define MAKE_CSTRING(A)
Make C-string.
 
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
 
Template specialisation for a map between event categories and flux factors.
 
const JOscProbHelper & getOscProb() const
Get oscillation probability calculator.
 
Router for direct addressing of PMT data in detector data structure.
 
Data structure for PMT geometry, calibration and status.
 
Utility class to parse parameter values.
 
bool is_inside(const JVector3D &pos) const
Check whether given point is inside cylinder.
 
const JPosition3D & getPosition() const
Get position.
 
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
 
double getE() const
Get energy.
 
double getY() const
Get y position.
 
double getX() const
Get x position.
 
double getDZ() const
Get z direction.
 
Utility class to parse command line options.
 
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.6.0 https://git.km3net.de/common/km3net-dataformat.
 
JTrack3E getTrack(const Trk &track)
Get track.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
const JCylinder3D getMaximumContainmentVolume()
Forward function declarations.
 
const char * getTime()
Get current local time conform ISO-8601 standard.
 
KM3NeT DAQ data structures and auxiliaries.
 
const char *const track_t
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
std::vector< Hit > hits
list of hits
 
unsigned int overlays
number of overlaying triggered events
 
ULong64_t trig
non-zero if the hit is a trigger hit.
 
double t
hit time (from tdc+calibration or MC truth)
 
double getBaseline(const double costh) const
Get baseline for a given cosine zenith angle.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for organising Monte Carlo file scanners associated with event weighters.
 
std::vector< filescanner_type >::iterator iterator
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary base class for list of file names.
 
Auxiliary data structure for alignment of data.
 
Auxiliary data structure for floating point format specification.
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
 
std::vector< double > fitinf
place to store additional fit info, see km3net-dataformat/definitions/fitparameters....
 
double E
Energy [GeV] (either MC truth or reconstructed)
 
double lik
likelihood or lambda value (for aafit, lambda)