44   inline const char* 
const track_t()  { 
return "track"; }  
 
   45   inline const char* 
const shower_t() { 
return "shower"; }
 
   56 int main(
int argc, 
char **argv)
 
   60   using namespace KM3NETDAQ;
 
   88     JParser<> zap(
"Example program to analyse track fit results from Evt formatted data.");
 
  110   catch(
const exception& error) {
 
  111     FATAL(error.what() << endl);
 
  114   if (useWeights && numberOfEvents != JLimit::max()) {
 
  115     FATAL(
"Cannot apply weighting to limited number of events.");
 
  123   if (detectorFile != 
"") {
 
  137   bool (*has_reconstruction)(
const Evt&);
 
  138   const Trk& (*get_best_fit)(
const Evt&);
 
  143   } 
else if (recotype == shower_t()) {
 
  147     FATAL(
"Invalid recotype: " << recotype);
 
  153   const Int_t    N_Nhits       =               400;
 
  154   const Double_t Nhits_min     =         0.0 - 0.5;
 
  155   const Double_t Nhits_max     =      1000.0 - 0.5;
 
  157   const Int_t    N_Noverlays   =                40;
 
  158   const Double_t Noverlays_min =         0.0 - 0.5;
 
  159   const Double_t Noverlays_max =      1000.0 - 0.5;
 
  161   const Int_t    N_radius      =               201;
 
  162   const Double_t radius_min    =      -700.0 - 0.5;
 
  163   const Double_t radius_max    =      +700.0 + 0.5;
 
  165   const Int_t    N_height      =                18;
 
  166   const Double_t height_min    =              20.0;
 
  167   const Double_t height_max    =             200.0;
 
  169   const Int_t    N_ToTfrac     =                20;
 
  170   const Double_t ToTfrac_min   =               0.0;
 
  171   const Double_t ToTfrac_max   =               1.0;
 
  173   const Int_t    N_dt          =              1500;
 
  174   const Double_t dt_min        =      -500.0 - 0.5;
 
  175   const Double_t dt_max        =      1000.0 - 0.5;
 
  177   const Int_t    N_zenith      =                21;
 
  178   const Double_t zenith_min    =              -1.0;
 
  179   const Double_t zenith_max    =              +1.0;
 
  181   const Int_t    N_energy      =                60;
 
  182   const Double_t energy_min    =              -2.0;
 
  183   const Double_t energy_max    =               4.0;
 
  185   const Int_t    N_quality     =               100;
 
  186   const Double_t quality_min   =            -200.0;
 
  187   const Double_t quality_max   =            +800.0;
 
  189   const Int_t    N_beta0       =                60;
 
  190   const Double_t beta0_min     =              -2.0;
 
  191   const Double_t beta0_max     =              +3.5;
 
  196   string ordinateLabel(useWeights ? 
"Rate [Hz]" : 
"Number of events");
 
  200   TH1D hs  (
"hs",   
MAKE_CSTRING(
"; #snapshot hits; "                                  << ordinateLabel),
 
  201             N_Nhits,     Nhits_min,     Nhits_max);
 
  202   TH1D hn  (
"hn",   
MAKE_CSTRING(
"; #triggered hits; "                                 << ordinateLabel),
 
  203             N_Nhits,     Nhits_min,     Nhits_max);
 
  204   TH1D ho  (
"ho",   
MAKE_CSTRING(
"; #overlays; "                                       << ordinateLabel),
 
  205             N_Noverlays, Noverlays_min, Noverlays_max);
 
  207   TH1D hz  (
"hz",   
MAKE_CSTRING(
"; cos(#theta); "                                     << ordinateLabel),
 
  208             N_zenith,    zenith_min,    zenith_max);
 
  209   TH1D he  (
"he",   
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); "                      << ordinateLabel),
 
  210             N_energy,    energy_min,    energy_max);
 
  211   TH1D ht  (
"ht",   
MAKE_CSTRING(
"; #Delta t [ns]; "                                   << ordinateLabel),
 
  212             N_dt,        dt_min,        dt_max);
 
  214   TH1D hZ  (
"hZ",   
MAKE_CSTRING(
"; longitudinal ToT-barycenter [m]; "                 << ordinateLabel),
 
  215             N_height,    height_min,    height_max);
 
  216   TH1D hT0 (
"hT0",  
MAKE_CSTRING(
"; ToT-fraction below earliest triggered hit [ns]; "  << ordinateLabel),
 
  217             N_ToTfrac,   ToTfrac_min,   ToTfrac_max);
 
  218   TH1D hT1 (
"hT1",  
MAKE_CSTRING(
"; ToT-fraction above earliest triggered hit [ns]; "  << ordinateLabel),
 
  219             N_ToTfrac,   ToTfrac_min,   ToTfrac_max);  
 
  221   TH1D hq  (
"hq",   
MAKE_CSTRING(
"; quality; "                                         << ordinateLabel),
 
  222             N_quality,   quality_min,   quality_max);
 
  223   TH1D hb0 (
"hb0",  
MAKE_CSTRING(
"; #beta_{0}; "                                       << ordinateLabel),
 
  224             N_beta0,     beta0_min,     beta0_max);
 
  226   TH2D hzo (
"hzo",  
MAKE_CSTRING(
"; cos(#theta); #overlays; "                          << ordinateLabel),
 
  227             N_zenith,    zenith_min,    zenith_max,
 
  228             N_Noverlays, Noverlays_min, Noverlays_max);
 
  229   TH2D hze (
"hze",  
MAKE_CSTRING(
"; cos(#theta); log_{10}(E_{reco} / 1 GeV); "         << ordinateLabel),
 
  230             N_zenith,    zenith_min,    zenith_max,
 
  231             N_energy,    energy_min,    energy_max);
 
  232   TH2D heo (
"heo",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #overlays; "           << ordinateLabel),
 
  233             N_energy,    energy_min,    energy_max,
 
  234             N_Noverlays, Noverlays_min, Noverlays_max);
 
  235   TH2D hzt (
"hzt",  
MAKE_CSTRING(
"; cos(#theta); #Delta t [ns]; "                      << ordinateLabel),
 
  236             N_zenith,    zenith_min,    zenith_max,
 
  237             N_dt,        dt_min,        dt_max);
 
  238   TH2D het (
"het",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #Delta t [ns]; "       << ordinateLabel),
 
  239             N_energy,    energy_min,    energy_max,
 
  240             N_dt,        dt_min,        dt_max);
 
  241   TH2D hot (
"hot",  
MAKE_CSTRING(
"; #overlays; #Delta t [ns]; "                        << ordinateLabel),
 
  242             N_Noverlays, Noverlays_min, Noverlays_max,
 
  243             N_dt,        dt_min,        dt_max);
 
  245   TH2D hzq (
"hzq",  
MAKE_CSTRING(
"; cos(#theta); quality; "                            << ordinateLabel),
 
  246             N_zenith,    zenith_min,    zenith_max,
 
  247             N_quality,   quality_min,   quality_max);
 
  248   TH2D heq (
"heq",  
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); quality; "             << ordinateLabel),
 
  249             N_energy,    energy_min,    energy_max,
 
  250             N_quality,   quality_min,   quality_max);
 
  251   TH2D hoq (
"hoq",  
MAKE_CSTRING(
"; #overlays; quality; "                              << ordinateLabel),
 
  252             N_Noverlays, Noverlays_min, Noverlays_max,
 
  253             N_quality,   quality_min,   quality_max);
 
  255   TH2D hob0(
"hob0", 
MAKE_CSTRING(
"; #overlays; log_{10}(#beta_{0}); "                  << ordinateLabel),
 
  256             N_Noverlays, Noverlays_min, Noverlays_max,
 
  257             N_beta0,     beta0_min,     beta0_max);
 
  258   TH2D heb0(
"heb0", 
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); log_{10}(#beta_{0}); " << ordinateLabel),
 
  259             N_energy,    energy_min,    energy_max,
 
  260             N_beta0,     beta0_min,     beta0_max);     
 
  261   TH2D hzb0(
"hzb0", 
MAKE_CSTRING(
"; cos(#theta); log_{10}(#beta_{0}); "                << ordinateLabel),
 
  262             N_zenith,    zenith_min,    zenith_max,
 
  263             N_beta0,     beta0_min,     beta0_max);
 
  265   TH2D hxy (
"hxy",  
MAKE_CSTRING(
"; x [m]; y [m]; "                                    << ordinateLabel),
 
  266             N_radius,    radius_min,    radius_max,
 
  267             N_radius,    radius_min,    radius_max);
 
  272   if (scanners.
setFlux(fluxMaps) == 0) {
 
  273     WARNING(
"No file found containing all given primaries; Flux function not set." << endl);
 
  282     scanner->setLimit(numberOfEvents);
 
  284     while (scanner->hasNext()) {
 
  286       const Evt* evt = scanner->next();
 
  288       if (!has_reconstruction(*evt)) { 
continue; }
 
  290       const Trk&      best_trk = (*get_best_fit)(*evt);
 
  294       const size_t    NsnapshotHits  = evt->hits.size();
 
  295       const size_t    NtriggeredHits = count_if(evt->hits.begin(), evt->hits.end(),
 
  298       if (!triggeredHitsRange(NtriggeredHits) ||
 
  299           !coszenithRange    (tb.
getDZ())     ||
 
  300           !energyRange       (tb.
getE())) { 
 
  306       const double weight = (useWeights ? scanner->getWeight(*evt) : 1.0);
 
  309              RIGHT     (15)    << scanner->getCounter()               <<
 
  314       hs .Fill(NsnapshotHits,                          weight);
 
  315       hn .Fill(NtriggeredHits,                         weight);
 
  316       ho .Fill(evt->overlays,                          weight);
 
  318       hz .Fill(tb.
getDZ(),                             weight);
 
  319       he .Fill(logE,                                   weight);
 
  320       hq .Fill(best_trk.
lik,                           weight);
 
  322       hzo.Fill(tb.
getDZ(),            evt->overlays,   weight);
 
  323       hze.Fill(tb.
getDZ(),            logE,            weight);
 
  324       heo.Fill(logE,                  evt->overlays,   weight);
 
  326       hoq.Fill(evt->overlays,         best_trk.
lik,    weight);
 
  327       hzq.Fill(tb.
getDZ(),            best_trk.
lik,    weight);
 
  328       heq.Fill(logE,                  best_trk.
lik,    weight);
 
  330       hxy.Fill(tb.
getX(),             tb.
getY(),       weight);
 
  336         hb0 .Fill(logb0,                               weight);
 
  337         hob0.Fill(evt->overlays,      logb0,           weight);   
 
  338         heb0.Fill(logE,               logb0,           weight);
 
  339         hzb0.Fill(tb.
getDZ(),         logb0,           weight);
 
  342       double ToTbelow     = 0.0;
 
  343       double ToTabove     = 0.0;
 
  344       double ToTtotal     = 0.0;
 
  345       double ToTweightedZ = 0.0;
 
  352         if (router.
hasPMT(hit->pmt_id)) {
 
  356           const double    t0   = tb.
getT(pmt);
 
  357           const double    t1   = 
getTime(*hit);
 
  359           ht .Fill(t1 - t0,                            weight);
 
  360           hot.Fill(evt->overlays,     t1 - t0,         weight);
 
  361           hzt.Fill(tb.
getDZ(),        t1 - t0,         weight);
 
  362           het.Fill(
log10(best_trk.
E), t1 - t0,         weight);
 
  366             ToTtotal     += hit->tot;
 
  367             ToTweightedZ += hit->tot * hit->pos.z;
 
  369             if        (hit->pos.z < firstHit->pos.z)  {
 
  370               ToTbelow   += hit->tot;
 
  371             } 
else if (hit->pos.z >= firstHit->pos.z) {
 
  372               ToTabove   += hit->tot;
 
  378       hT0.Fill(ToTbelow / ToTtotal,                     weight);
 
  379       hT1.Fill(ToTabove / ToTtotal,                     weight);
 
  380       hZ .Fill(ToTweightedZ / ToTtotal,                 weight);
 
Router for direct addressing of PMT data in detector data structure. 
 
Utility class to parse command line options. 
 
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member. 
 
int main(int argc, char *argv[])
 
ROOT TTree parameter settings of various packages. 
 
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member. 
 
JTrack3E getTrack(const Trk &track)
Get track. 
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance. 
 
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object 
 
Utility class to parse parameter values. 
 
#define MAKE_CSTRING(A)
Make C-string. 
 
bool hasPMT(const JObjectID &id) const 
Has PMT. 
 
const JPMT & getPMT(const JPMTAddress &address) const 
Get PMT. 
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
double getTime(const Hit &hit)
Get true time of hit. 
 
double E
Energy [GeV] (either MC truth or reconstructed) 
 
Data structure for detector geometry and calibration. 
 
Utility class to parse parameter values. 
 
Auxiliary class for defining the range of iterations of objects. 
 
double getE() const 
Get energy. 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
set_variable E_E log10(E_{fit}/E_{#mu})"
 
Data structure for PMT geometry, calibration and status. 
 
std::vector< double > fitinf
place to store additional fit info, see km3net-dataformat/definitions/fitparameters.csv 
 
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.1.0 https://git.km3net.de/common/km3net-dataformat. 
 
Auxiliary class for parsing multiparticle fluxes. 
 
double getY() const 
Get y position. 
 
Direct access to PMT in detector data structure. 
 
Auxiliary methods to convert data members or return values of member methods of a set of objects to a...
 
double getT(const JVector3D &pos) const 
Get arrival time of Cherenkov light at given position. 
 
General purpose messaging. 
 
Scanning of objects from multiple files according a format that follows from the extension of each fi...
 
Auxiliary base class for list of file names. 
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file. 
 
const char *const track_t
 
std::vector< filescanner_type >::iterator iterator
 
Auxiliary class to define a range between two values. 
 
ULong64_t trig
non-zero if the hit is a trigger hit. 
 
double lik
likelihood or lambda value (for aafit, lambda) 
 
Utility class to parse command line options. 
 
double t
hit time (from tdc+calibration or MC truth) 
 
double getX() const 
Get x position. 
 
size_t setFlux(const int type, const JFlux &flux)
Set flux function for all MC-files corresponding to a given PDG code. 
 
Auxiliary class for organising Monte Carlo file scanners associated with event weighters. 
 
do set_variable DETECTOR_TXT $WORKDIR detector
 
Auxiliaries for defining the range of iterations of objects. 
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower. 
 
Auxiliary data structure for floating point format specification. 
 
double getDZ() const 
Get z direction. 
 
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map. 
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event. 
 
#define DEBUG(A)
Message macros.