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)