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)
 
  207       for (
iterator i = begin(); i != end(); ++i) {
 
  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);
 
  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; }
 
  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);
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Utility class to parse command line options.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
int main(int argc, char **argv)
 
#define make_key(PARAMETER)
Make key.
 
ROOT TTree parameter settings of various packages.
 
Synchronously read DAQ events and Monte Carlo events (and optionally other events).
 
Wrapper class around template object.
 
Utility class to parse command line options.
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
 
static const int JENERGY_ENERGY
uncorrected energy [GeV] from JEnergy.cc
 
static const int JENERGY_CHI2
chi2 from JEnergy.cc
 
static const int JSTART_NPE_MIP_TOTAL
number of photo-electrons along the whole track from JStart.cc
 
static const int JSTART_LENGTH_METRES
distance between first and last hits in metres from JStart.cc
 
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.4.0-8-ge14cb17 https://git.km3net.de/common/km3net-dataformat.
 
static const int JGANDALF_BETA1_RAD
angular resolution [rad] from JGandalf.cc
 
static const int JSTART_NPE_MIP
number of photo-electrons up to the barycentre from JStart.cc
 
static const int JGANDALF_NUMBER_OF_HITS
number of hits from JGandalf.cc
 
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
 
bool operator<(const Head &first, const Head &second)
Less than operator.
 
Auxiliary classes and methods for linear and iterative data regression.
 
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
int mc_id
identifier of the MC event (as found in ascii or antcc file).
 
JRange_t E
Energy range [GeV].
 
Auxiliary class for defining the range of iterations of objects.
 
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)