28   static const int JQUALITY = -1;   
 
   41     JKey(
const char* 
name,
 
   56     friend inline bool operator<(
const JKey& 
first, 
const JKey& second)
 
   58       return first.index < second.index;
 
   72 #define make_key(PARAMETER) JKey(#PARAMETER, PARAMETER) 
  121     void Fill(
const Double_t xA, 
const Double_t xB, 
const bool option)
 
  123       hA->Fill(logx ? 
log10(xA) : xA);
 
  124       hB->Fill(logx ? 
log10(xB) : xB);
 
  126         hC->Fill(logx ? 
log10(xB/xA) : xB - xA);
 
  128         hD->Fill(logx ? 
log10(xB/xA) : xB - xA);
 
  137       if (hA->GetEntries() != 0) { hA->Scale(1.0/hA->GetEntries()); }
 
  138       if (hB->GetEntries() != 0) { hB->Scale(1.0/hB->GetEntries()); }
 
  139       if (hC->GetEntries() != 0) { hC->Scale(1.0/hC->GetEntries()); }
 
  140       if (hD->GetEntries() != 0) { hD->Scale(1.0/hD->GetEntries()); }
 
  149     void Write(TFile& out)
 
  151       out.WriteTObject(hA);
 
  152       out.WriteTObject(hB);
 
  153       out.WriteTObject(hC);
 
  154       out.WriteTObject(hD);
 
  181     void insert(
const JKey&    key,
 
  185                 const double   logx = 
false)
 
  189       TH1D* hA = 
new TH1D((
"[A]." + key.name).c_str(), NULL, nx,  
xmin, 
xmax);
 
  190       TH1D* hB = 
new TH1D((
"[B]." + key.name).c_str(), NULL, nx,  
xmin, 
xmax);
 
  191       TH1D* hC = 
new TH1D((
"[C]." + key.name).c_str(), NULL, nx, -
xmax, 
xmax);
 
  192       TH1D* hD = 
new TH1D((
"[D]." + key.name).c_str(), NULL, nx, -
xmax, 
xmax);
 
  205     void Fill(
const JFit& fA, 
const JFit& fB, 
const bool option)
 
  209         const int index = 
i->first.index;
 
  211         if (index == JQUALITY) {
 
  212           i->second.Fill(fA.getQ(),      fB.getQ(),      option);
 
  213         } 
else if (fA.hasW(index) && fB.hasW(index)) {
 
  214           i->second.Fill(fA.getW(index), fB.getW(index), option);
 
  225       for (
iterator i = this->begin(); 
i != this->end(); ++
i) {
 
  236     void Write(TFile& out)
 
  238       for (
iterator i = this->begin(); 
i != this->end(); ++
i) {
 
  239         i->second.Write(out);
 
  249     void Write(
const char* file_name)
 
  251       TFile out(file_name, 
"RECREATE");
 
  267 int main(
int argc, 
char **argv)
 
  273   typedef JTriggeredFileScanner_t::multi_pointer_type   multi_pointer_type;
 
  275   JTriggeredFileScanner_t inputFileA;
 
  276   JTriggeredFileScanner_t inputFileB;
 
  284     JParser<> zap(
"Example program to compare fit results from two files.");
 
  289     zap[
'n'] = 
make_field(numberOfEvents)      = JLimit::max();
 
  295   catch(
const exception& error) {
 
  296     FATAL(error.what() << endl);
 
  307   const double E_nu_min = head.cut_nu.E.getLowerLimit(); 
 
  308   const double E_nu_max = head.cut_nu.E.getUpperLimit(); 
 
  310   inputFileA.setLimit(numberOfEvents);
 
  311   inputFileB.setLimit(numberOfEvents);
 
  318   manager.insert(
make_key(JQUALITY),                501, 0.0, 1.0e3);
 
  328   TH1D hA(
"h[A]", NULL,  100,   -3.0,  +2.3);    
 
  329   TH1D hB(
"h[B]", NULL,  100,   -3.0,  +2.3);    
 
  330   TH2D hA_angle_E(
"hA_angle_E", NULL, 20, E_nu_min, E_nu_max, 100, 0,90);  
 
  331   TH2D hB_angle_E(
"hB_angle_E", NULL, 20, E_nu_min, E_nu_max, 100, 0,90);  
 
  334           360, -180.0, +180.0);                  
 
  336   while (inputFileA.hasNext() && inputFileB.hasNext()) {
 
  338     STATUS(
"event: " << setw(10) << inputFileA.getCounter() << 
'\r'); 
DEBUG(endl);
 
  340     multi_pointer_type psA = inputFileA.next();
 
  341     multi_pointer_type psB = inputFileB.next();
 
  345     while (psA.get<
Evt>()->
mc_id < psB.get<
Evt>()->
mc_id && inputFileA.hasNext()) { psA = inputFileA.next(); }
 
  346     while (psB.get<
Evt>()->
mc_id < psA.get<
Evt>()->
mc_id && inputFileB.hasNext()) { psB = inputFileB.next(); }
 
  348     if (!psA.is_valid()) { 
continue; }
 
  349     if (!psB.is_valid()) { 
continue; }
 
  351     if (psA.get<
Evt>()->
mc_id == psB.get<
Evt>()->mc_id) {
 
  361       if (muon == event->mc_trks.end()) { 
continue; }
 
  363       if (evtA->empty())                { 
continue; }
 
  364       if (evtB->empty())                { 
continue; }
 
  366       JEvt::const_iterator fitA = evtA->begin();
 
  367       JEvt::const_iterator fitB = evtB->begin();
 
  372       hA.Fill(
log10(angleA));
 
  373       hB.Fill(
log10(angleB));
 
  375       h2.Fill(fitB->getQ() - fitA->getQ(), angleB - angleA);
 
  377       const double Enu = neutrino.
E;    
 
  378       hA_angle_E.Fill(Enu, angleA);
 
  379       hB_angle_E.Fill(Enu, angleB);
 
  381       if (angleA >= angle_Deg) { 
 
  382         manager.Fill(*fitA, *fitB, angleB < angle_Deg);
 
Utility class to parse command line options. 
 
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions. 
 
static const int JSTART_NPE_MIP_TOTAL
number of photo-electrons along the whole track from JStart.cc 
 
int main(int argc, char *argv[])
 
ROOT TTree parameter settings of various packages. 
 
static const int JENERGY_ENERGY
uncorrected energy [GeV] from JEnergy.cc 
 
Synchronously read DAQ events and Monte Carlo events (and optionally other events). 
 
bool operator<(const Head &first, const Head &second)
Less than operator. 
 
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon. 
 
then echo Enter input within $TIMEOUT_S seconds echo n User name
 
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
 
static const int JGANDALF_BETA1_RAD
angular resolution [rad] from JGandalf.cc 
 
static const int JENERGY_CHI2
chi2 from JEnergy.cc 
 
double E
Energy [GeV] (either MC truth or reconstructed) 
 
then echo The file $DIR KM3NeT_00000001_00000000 root already please rename or remove it first
 
static const int JSTART_NPE_MIP
number of photo-electrons up to the barycentre from JStart.cc 
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header. 
 
#define make_key(PARAMETER)
Make key. 
 
Auxiliary class for defining the range of iterations of objects. 
 
static const int JGANDALF_NUMBER_OF_HITS
number of hits from JGandalf.cc 
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
 
JDirection3D getDirection(const Vec &dir)
Get direction. 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
set_variable E_E log10(E_{fit}/E_{#mu})"
 
int mc_id
identifier of the MC event (as found in ascii or antcc file). 
 
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.1.0 https://git.km3net.de/common/km3net-dataformat. 
 
General purpose messaging. 
 
static const int JSTART_LENGTH_METRES
distance between first and last hits in metres from JStart.cc 
 
Utility class to parse command line options. 
 
Wrapper class around template object. 
 
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino. 
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower. 
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event. 
 
#define DEBUG(A)
Message macros.