83 using namespace KM3NETDAQ;
86 typedef JTriggeredFileScanner_t::multi_pointer_type multi_pointer_type;
88 JTriggeredFileScanner_t inputFile;
91 size_t numberOfPrefits;
106 JParser<> zap(
"Example program to histogram fit results.");
110 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
117 zap[
'O'] =
make_field(option) =
"E",
"N",
"LINE",
"LOGE";
120 zap[
'r'] =
make_field(radius) = numeric_limits<double>::max();
126 catch(
const exception& error) {
127 FATAL(error.what() << endl);
130 cout <<
"APPLICATION " << application << endl;
141 JVolume volume(head, option !=
"LINE");
146 cylinder.add(offset);
152 NOTICE(
"Offset: " << offset << endl);
154 NOTICE(
"Cylinder: " << cylinder << endl);
155 NOTICE(
"Containment: " << containment << endl);
157 const double EMIN_GEV = 10e3;
161 TH1D job(
"job", NULL, 100, 0.5, 100.5);
163 TH1D hn(
"hn",
"NDF (Number of Degrees of Freedom)", 250, -0.5, 249.5);
164 TH1D hq(
"hq",
"Fit Quality", 300, 0.0, 600.0);
165 TH1D hi(
"hi",
"Fit Index vs Best Resolution", 101, -0.5, 100.5);
166 TH1D hd(
"hd",
"Square Distance between Reco and True position", 2000, 0.0, 400.0);
167 TH1D hz(
"hz",
"Longitudinal Distance between Reco and MC lepton position", 100, -200.0, 200.0);
168 TH1D ht(
"ht",
"Time difference between Reco and MC lepton", 100, -100.0, 100.0);
170 TH1D ha(
"ha",
"Angle between reco direction and true direction", 1000, 0.0, 180.0);
172 TH1D e0(
"e0",
"True lepton energy", 100, volume.getXmin(), volume.getXmax());
173 TH1D e2(
"e2",
"Reconstructed energy", 100, volume.getXmin(), volume.getXmax());
174 TH1D er(
"er",
"Ratio of reconstructed energy and true energy", 100, -5.0, +5.0);
175 TH1D ea(
"ea",
"Distribution of Energy error for all the events; E_{reco}-E_{true}", 100, -30, +30);
176 TH1D ed3_5GeV(
"ed3_5GeV",
"Distribution of Energy error for events with MC energy #in [3,5] GeV; E_{reco}-E_{true}", 100, -30, +30);
177 TH1D ed8_11GeV(
"ed8_11GeV",
"Distribution of Energy error for events with MC energy #in [8,11] GeV; E_{reco}-E_{true}", 100, -30, +30);
178 TH1D ed15_21GeV(
"ed15_21GeV",
"Distribution of Energy error for events with MC energy #in [15,21] GeV; E_{reco}-E_{true}", 100, -30, +30);
179 TH2D ee(
"ee",
"; E_{true} [GeV]; E_{reco} [GeV]",
182 TH1D eeres(
"eeres",
"Median reco energy as a function of true energy",40,0,4);
183 TH1D eeres16(
"eeres16",
"16%Quantile reco energy as a function of true energy",40,0,4);
184 TH1D eeres84(
"eeres84",
"84%Quantile reco energy as a function of true energy",40,0,4);
185 const Int_t ny = 28800;
186 const Double_t ymin = 0.0;
187 const Double_t ymax = 180.0;
191 if (option.find(
'E') != string::npos) {
193 for (
double x = volume.getXmin();
x <= volume.getXmax();
x += (volume.getXmax() - volume.getXmin()) / 20) {
201 for ( ; x <= 15.5; x += 1.0) {
X.push_back(x); }
202 for ( ; x <= 25.5; x += 2.0) {
X.push_back(x); }
203 for ( ; x <= 50.5; x += 5.0) {
X.push_back(x); }
204 for ( ; x <= 100.5; x += 10.0) {
X.push_back(x); }
205 for ( ; x <= 250.5; x += 20.0) {
X.push_back(x); }
208 TH2D h2(
"h2", NULL,
X.size() - 1,
X.data(), ny, ymin, ymax);
210 TProfile herrorE(
"herrorE",
"Energy Error",
X.size() - 1,
X.data());
211 TProfile hfracE(
"hfracE",
"Fractional Energy Error",
X.size() - 1,
X.data());
212 TProfile he(
"he",
"Reconstruction Efficiency",
X.size() - 1,
X.data());
213 TProfile htheta_nu_lep(
"htheta_nu_lep",
"Angle between neutrino and primary lepton",
X.size() - 1,
X.data());
214 TH2D hgetln(
"hgetln",
"Kinematic angle", 40,0,4,1000,0,180);
215 TH1D hln1d(
"hln1d",
"Angle between neutrino and lepton",40,0,4);
216 TH2D hb(
"hb", NULL, 100, 0.0, 0.5e6, 100, -100.0, +900.0);
217 TH2S hmca(
"hmca", NULL,
X.size() - 1,
X.data(), 1000, 0, 180);
218 TH2D hae(
"hae",NULL,40,0,4,1000,0,180);
219 TH1D hmae(
"hmae",
"Mean angle deviation as function of log MC energy",40,0,4);
220 TH2D hzenith(
"hzenith",
"Reco Zenith vs MC Energy", 100, 0, 100, ny, ymin, ymax);
221 TH2D hY(
"hY",
"Reco Bjorken Y vs MC Bjorken Y", 40, 0, 1, 40, 0, 1);
222 TH2D hby3_5GeV(
"hby3_5GeV",
"Reco Bjorken Y vs MC Bjorken Y for events with Reco E #in [3, 5] GeV", 40, 0, 1, 40, 0, 1);
223 TH2D hby8_10GeV(
"hby8_10GeV",
"Reco Bjorken Y vs MC Bjorken Y for events with Reco E #in [8, 10] GeV", 40, 0, 1, 40, 0, 1);
229 while (inputFile.hasNext()) {
231 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
233 multi_pointer_type ps = inputFile.next();
264 if (mc_evt->E > Emax) {
270 }
else if(isMuon &&
is_muon(*mc_evt)){
273 if (mc_evt->E > Emax) {
280 if (lepton == event->mc_trks.end()) {
286 double true_BjY = (Enu - Elep) / Enu;
292 if (option.find(
'E') != string::npos){
294 if(wrtNeutrino ==
true && !isMuon) x = volume.getX(neutrino.
E);
295 else if(!wrtNeutrino && !isMuon) x = volume.getX(lepton->E);
306 JEvt::iterator __end = partition(evt->begin(), evt->end(),
JHistory::is_event(application));
308 if (evt->begin() == __end) {
315 if (numberOfPrefits > 0 ) {
317 JEvt::iterator __q = __end;
319 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
328 JEvt::iterator best = evt->begin();
336 if(!wrtNeutrino && !isMuon){
338 }
else if(wrtNeutrino ==
true && !isMuon){
344 JEvt::iterator fit_with_smallest_error = best;
347 fit_with_smallest_error = position(evt->begin(), __end);
349 fit_with_smallest_error =
energy(evt->begin(), __end);
351 fit_with_smallest_error = pointing(evt->begin(), __end);
354 const Double_t beta = pointing.getAngle(*best);
355 const double Efit = best->getE();
360 bool ok = (Efit >= Emin_GeV);
368 hn.Fill((Double_t) best->getNDF());
369 hq.Fill(best->getQ());
370 hi.Fill((Double_t)
distance(evt->begin(), fit_with_smallest_error));
388 tb.
sub(converter.putTime());
390 if(!isMuon && !wrtNeutrino){
394 hd.Fill(distance_m * distance_m);
400 hd.Fill(distance_m * distance_m);
412 if (cylinder.is_inside(mc_vx)) {
420 if (best->getE() >= EMIN_GEV) {
421 hb.Fill(
JVector2D(best->getX() -
origin.getX(), best->getY() -
origin.getY()).getLengthSquared(), best->getZ());
430 for (
int i = 1;
i <= hgetln.GetNbinsX(); ++
i) {
432 for (
int j = 1;
j <= hgetln.GetNbinsY(); ++
j) {
433 double binContent = hgetln.GetBinContent(
i,
j);
435 for (
int k = 0;
k < binContent; ++
k) {
436 double deltaTheta = hgetln.GetYaxis()->GetBinCenter(
j);
437 deltaThetaValues.push_back(deltaTheta);
442 double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
445 hln1d.SetBinContent(
i, medianDeltaTheta);
449 for (
int i = 1;
i <= hae.GetNbinsX(); ++
i) {
451 for (
int j = 1;
j <= hae.GetNbinsY(); ++
j) {
452 double binContent = hae.GetBinContent(
i,
j);
454 for (
int k = 0;
k < binContent; ++
k) {
455 double deltaTheta = hae.GetYaxis()->GetBinCenter(
j);
456 deltaThetaValues.push_back(deltaTheta);
461 double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
464 hmae.SetBinContent(
i, medianDeltaTheta);
468 hY.Fill(true_BjY, best->getW(5));
470 if(Efit > 2.5 && Efit < 6) hby3_5GeV.Fill(true_BjY, best->getW(5));
471 else if(Efit > 7.5 && Efit < 11) hby8_10GeV.Fill(true_BjY, best->getW(5));
476 e0.Fill(volume.getX(Enu,
true));
477 er.Fill(volume.getX(Efit) - volume.getX(Enu));
478 ee.Fill(volume.getX(Enu), volume.getX(Efit));
480 hzenith.Fill(Enu, zenith);
481 QE.put(
log10(Efit/Enu));
482 herrorE.Fill(x, volume.getX(Efit) - volume.getX(Enu));
483 hfracE.Fill(x, fabs(volume.getX(Efit) - volume.getX(Enu))/volume.getX(Enu));
485 if(Enu >= 3 && Enu <= 5) ed3_5GeV.Fill(Efit - Enu);
486 else if(Enu >= 8 && Enu <= 11) ed8_11GeV.Fill(Efit - Enu);
487 else if(Enu >= 15 && Enu <= 21) ed15_21GeV.Fill(Efit - Enu);
491 e0.Fill(volume.getX(Elep,
true));
492 er.Fill(volume.getX(Efit) - volume.getX(Elep));
493 ee.Fill(volume.getX(Elep), volume.getX(Efit));
494 ea.Fill(Efit - Elep);
495 hzenith.Fill(Elep, zenith);
496 QE.put(
log10(Efit/Elep));
497 herrorE.Fill(x, volume.getX(Efit) - volume.getX(Elep));
498 hfracE.Fill(x, fabs(volume.getX(Efit) - volume.getX(Elep))/volume.getX(Elep));
500 if(Elep >= 3 && Elep <= 5) ed3_5GeV.Fill(Efit - Elep);
501 else if(Elep >= 8 && Elep <= 11) ed8_11GeV.Fill(Efit - Elep);
502 else if(Elep >= 15 && Elep <= 21) ed15_21GeV.Fill(Efit - Elep);
505 for (
int i = 1;
i <= ee.GetNbinsX(); ++
i) {
507 for (
int j = 1;
j <= ee.GetNbinsY(); ++
j) {
508 double binContent = ee.GetBinContent(
i,
j);
510 for (
int k = 0;
k < binContent; ++
k) {
511 double Erecobin = ee.GetYaxis()->GetBinCenter(
j);
512 Erecovalues.push_back(Erecobin);
515 if(Erecovalues.empty())
continue;
516 eeres.SetBinContent(
i, Erecovalues[
int(Erecovalues.size()*0.5)]);
517 eeres16.SetBinContent(
i, Erecovalues[
int(Erecovalues.size()*0.16)]);
518 eeres84.SetBinContent(
i, Erecovalues[
int(Erecovalues.size()*0.84)]);}
519 e2.Fill(volume.getX(Efit,
true));
530 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
532 NOTICE(
"Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
534 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
536 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
537 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
538 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
539 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);
541 if (
Q.getCount() != 0) {
542 NOTICE(
"Median space angle and 1 sigma band [deg] " <<
FIXED (6,3) <<
Q.getQuantile(0.5) <<
" "<<
Q.getQuantile(0.16) <<
" "<<
Q.getQuantile(0.86)<< endl);
544 if (QE.getCount() != 0) {
545 NOTICE(
"Median energy ratio log(Ereco/Etrue) and 1 sigma band " <<
FIXED (6,3) << QE.getQuantile(0.5) <<
" "<< QE.getQuantile(0.16) <<
" "<< QE.getQuantile(0.86)<< endl);
Data structure for vector in two dimensions.
bool is_electron(const Trk &track)
Test whether given track is a (anti-)electron.
Utility class to parse command line options.
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
Q(UTCMax_s-UTCMin_s)-livetime_s
Auxiliary class to compare fit results with respect to a reference position (e.g. true muon)...
Auxiliary class to compare fit results with respect to a reference direction (e.g. true muon).
Vec getOffset(const JHead &header)
Get offset.
JCylinder3D getCylinder(const JHead &header)
Get cylinder corresponding to the positions of generated tracks (i.e.
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.
Data structure for circle in two dimensions.
JTime & sub(const JTime &value)
Subtraction operator.
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
double getIntersection(const JVector3D &pos) const
Get longitudinal position along axis of position of closest approach with given position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
static const int JSHOWERPOINTSIMPLEX
General purpose sorter of fit results.
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
JCylinder3D & add(const JVector3D &pos)
Add position.
Auxiliary data structure for floating point format specification.
double E
Energy [GeV] (either MC truth or reconstructed)
static const int JSHOWERENERGYPREFIT
JVersor3D getDirection(const JVector3D &pos) const
Get photon direction of Cherenkov light on PMT.
JTime & add(const JTime &value)
Addition operator.
static const int JSHOWERPOSITIONFIT
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
Auxiliary class for histogramming of effective volume.
Auxiliary class for defining the range of iterations of objects.
const_iterator< T > end() const
Get end of data.
static const int JSHOWERPREFIT
JDirection3D getDirection(const Vec &dir)
Get direction.
Data structure for vector in three dimensions.
const_iterator< T > begin() const
Get begin of data.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
static const JGeanz geanz(1.85, 0.62, 0.54)
Function object for longitudinal EM-shower profile.
Auxiliary class to test history.
static const int JSHOWERDIRECTIONPREFIT
double getTheta() const
Get theta angle.
JPosition3D getPosition(const Vec &pos)
Get position.
static const double PI
Mathematical constants.
static const int JSHOWER_BJORKEN_Y
const JPosition3D & getPosition() const
Get position.
Reconstruction type dependent comparison of track quality.
Auxiliary class to evaluate atmospheric muon hypothesis.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
static const int JSHOWERCOMPLETEFIT
Vec getOrigin(const JHead &header)
Get origin.
then for APP in event gandalf start energy
Data structure for position in two dimensions.
double getMaximum(const double E) const
Get depth of shower maximum.
int getCount(const T &hit)
Get hit count.
no fit printf nominal n $STRING awk v X
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
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.
JVector3D & add(const JVector3D &vector)
Add vector.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.