79int main(
int argc,
char **argv)
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.");
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;
137 catch(
const exception& error) {
138 FATAL(error.what() << endl);
141 JVolume volume(head, option !=
"LINE");
146 cylinder.
add(offset);
150 containment.
add(origin);
152 NOTICE(
"Offset: " << offset << endl);
153 NOTICE(
"Origin: " << origin << 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",
"Distance between Reco and True position", 2000, 0.0, 100.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, 0, 100.0);
169 TH1D h4D(
"h4D",
"4D-distance between reco and true vertex", 2000, 0.0, 100.0);
171 TH1D ha(
"ha",
"Angle between reco direction and true direction", 1000, 0.0, 180.0);
173 TH1D e0(
"e0",
"True lepton energy", 100, volume.
getXmin(), volume.
getXmax());
174 TH1D e2(
"e2",
"Reconstructed energy", 100, volume.
getXmin(), volume.
getXmax());
175 TH1D er(
"er",
"Ratio of reconstructed energy and true energy", 100, -5.0, +5.0);
176 TH1D ea(
"ea",
"Distribution of Energy error for all the events; E_{reco}-E_{true}", 100, -30, +30);
177 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);
178 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);
179 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);
180 TH2D ee(
"ee",
"; E_{true} [GeV]; E_{reco} [GeV]",
183 TH1D eeres(
"eeres",
"Median reco energy as a function of true energy",40,0,4);
184 TH1D eeres16(
"eeres16",
"16%Quantile reco energy as a function of true energy",40,0,4);
185 TH1D eeres84(
"eeres84",
"84%Quantile reco energy as a function of true energy",40,0,4);
186 const Int_t ny = 28800;
187 const Double_t ymin = 0.0;
188 const Double_t ymax = 180.0;
192 if (option.find(
'E') != string::npos) {
202 for ( ; x <= 15.5; x += 1.0) { X.push_back(x); }
203 for ( ; x <= 25.5; x += 2.0) { X.push_back(x); }
204 for ( ; x <= 50.5; x += 5.0) { X.push_back(x); }
205 for ( ; x <= 100.5; x += 10.0) { X.push_back(x); }
206 for ( ; x <= 250.5; x += 20.0) { X.push_back(x); }
209 TH2D h2(
"h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
211 TProfile herrorE(
"herrorE",
"Energy Error", X.size() - 1, X.data());
212 TProfile hfracE(
"hfracE",
"Fractional Energy Error", X.size() - 1, X.data());
213 TProfile he(
"he",
"Reconstruction Efficiency", X.size() - 1, X.data());
214 TProfile htheta_nu_lep(
"htheta_nu_lep",
"Angle between neutrino and primary lepton", X.size() - 1, X.data());
215 TH2D hgetln(
"hgetln",
"Kinematic angle", 40,0,4,1000,0,180);
216 TH1D hln1d(
"hln1d",
"Angle between neutrino and lepton",40,0,4);
217 TH2D hb(
"hb", NULL, 100, 0.0, 0.5e6, 100, -100.0, +900.0);
218 TH2S hmca(
"hmca", NULL, X.size() - 1, X.data(), 1000, 0, 180);
219 TH2D hae(
"hae",NULL,40,0,4,1000,0,180);
220 TH1D hmae(
"hmae",
"Mean angle deviation as function of log MC energy",40,0,4);
221 TH2D hzenith(
"hzenith",
"Reco Zenith vs MC Energy", 100, 0, 100, ny, ymin, ymax);
222 TH2D hY(
"hY",
"Reco Bjorken Y vs MC Bjorken Y", 40, 0, 1, 40, 0, 1);
223 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);
224 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);
232 while (inputFile.hasNext()) {
234 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
236 multi_pointer_type ps = inputFile.next();
259 vector<Trk>::const_iterator lepton =
event->mc_trks.end();
261 for (vector<Trk>::const_iterator mc_evt = event->mc_trks.begin(); mc_evt != event->mc_trks.end(); ++mc_evt) {
267 if (mc_evt->E > Emax) {
273 }
else if(isMuon &&
is_muon(*mc_evt)){
276 if (mc_evt->E > Emax) {
283 if (lepton == event->mc_trks.end()) {
289 double true_BjY = (Enu - Elep) / Enu;
295 if (option.find(
'E') != string::npos){
297 if(wrtNeutrino ==
true && !isMuon) x = volume.
getX(neutrino.
E);
298 else if(!wrtNeutrino && !isMuon) x = volume.
getX(lepton->E);
309 JEvt::iterator __end = partition(evt->begin(), evt->end(),
JHistory::is_event(application));
311 if (evt->begin() == __end) {
318 if (numberOfPrefits > 0 ) {
320 JEvt::iterator __q = __end;
322 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
331 JEvt::iterator best = evt->begin();
339 if(!wrtNeutrino && !isMuon){
341 }
else if(wrtNeutrino ==
true && !isMuon){
347 JEvt::iterator fit_with_smallest_error = best;
350 fit_with_smallest_error = position(evt->begin(), __end);
352 fit_with_smallest_error = energy(evt->begin(), __end);
354 fit_with_smallest_error = pointing(evt->begin(), __end);
356 best = fit_with_smallest_error;
358 const Double_t beta = pointing.
getAngle(*best);
359 const double Efit = best->getE();
364 bool ok = (Efit >= Emin_GeV);
372 hn.Fill((Double_t) best->getNDF());
373 hq.Fill(best->getQ());
374 hi.Fill((Double_t)
distance(evt->begin(), fit_with_smallest_error));
392 double time_true = ta.
getT();
393 double time_reco=tb.
getT();
396 if(!isMuon && !wrtNeutrino){
400 hd.Fill(fabs(distance_m));
401 ht.Fill(fabs(time_reco - time_true));
402 Qp.
put(fabs(distance_m));
403 Qt.
put(fabs(time_reco-time_true));
405 h4D.Fill(distance4d);
410 hd.Fill(fabs(distance_m));
411 ht.Fill(fabs(time_reco - time_true));
412 Qp.
put(fabs(distance_m));
413 Qt.
put(fabs(time_reco-time_true));
415 h4D.Fill(distance4d);
435 if (best->getE() >= EMIN_GEV) {
443 for (
int i = 1; i <= hgetln.GetNbinsX(); ++i) {
445 for (
int j = 1;
j <= hgetln.GetNbinsY(); ++
j) {
446 double binContent = hgetln.GetBinContent(i,
j);
448 for (
int k = 0; k < binContent; ++k) {
449 double deltaTheta = hgetln.GetYaxis()->GetBinCenter(
j);
450 deltaThetaValues.push_back(deltaTheta);
455 double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
458 hln1d.SetBinContent(i, medianDeltaTheta);
462 for (
int i = 1; i <= hae.GetNbinsX(); ++i) {
464 for (
int j = 1;
j <= hae.GetNbinsY(); ++
j) {
465 double binContent = hae.GetBinContent(i,
j);
467 for (
int k = 0; k < binContent; ++k) {
468 double deltaTheta = hae.GetYaxis()->GetBinCenter(
j);
469 deltaThetaValues.push_back(deltaTheta);
474 double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
477 hmae.SetBinContent(i, medianDeltaTheta);
481 hY.Fill(true_BjY, best->getW(5));
483 if(Efit > 2.5 && Efit < 6) hby3_5GeV.Fill(true_BjY, best->getW(5));
484 else if(Efit > 7.5 && Efit < 11) hby8_10GeV.Fill(true_BjY, best->getW(5));
489 e0.Fill(volume.
getX(Enu,
true));
490 er.Fill(volume.
getX(Efit) - volume.
getX(Enu));
491 ee.Fill(volume.
getX(Enu), volume.
getX(Efit));
493 hzenith.Fill(Enu, zenith);
494 QE.
put(log10(Efit/Enu));
495 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Enu));
496 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Enu))/volume.
getX(Enu));
498 if(Enu >= 3 && Enu <= 5) ed3_5GeV.Fill(Efit - Enu);
499 else if(Enu >= 8 && Enu <= 11) ed8_11GeV.Fill(Efit - Enu);
500 else if(Enu >= 15 && Enu <= 21) ed15_21GeV.Fill(Efit - Enu);
504 e0.Fill(volume.
getX(Elep,
true));
505 er.Fill(volume.
getX(Efit) - volume.
getX(Elep));
506 ee.Fill(volume.
getX(Elep), volume.
getX(Efit));
507 ea.Fill(Efit - Elep);
508 hzenith.Fill(Elep, zenith);
509 QE.
put(log10(Efit/Elep));
510 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Elep));
511 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Elep))/volume.
getX(Elep));
513 if(Elep >= 3 && Elep <= 5) ed3_5GeV.Fill(Efit - Elep);
514 else if(Elep >= 8 && Elep <= 11) ed8_11GeV.Fill(Efit - Elep);
515 else if(Elep >= 15 && Elep <= 21) ed15_21GeV.Fill(Efit - Elep);
518 for (
int i = 1; i <= ee.GetNbinsX(); ++i) {
520 for (
int j = 1;
j <= ee.GetNbinsY(); ++
j) {
521 double binContent = ee.GetBinContent(i,
j);
523 for (
int k = 0; k < binContent; ++k) {
524 double Erecobin = ee.GetYaxis()->GetBinCenter(
j);
525 Erecovalues.push_back(Erecobin);
528 if(Erecovalues.empty())
continue;
529 eeres.SetBinContent(i, Erecovalues[
int(Erecovalues.size()*0.5)]);
530 eeres16.SetBinContent(i, Erecovalues[
int(Erecovalues.size()*0.16)]);
531 eeres84.SetBinContent(i, Erecovalues[
int(Erecovalues.size()*0.84)]);}
532 e2.Fill(volume.
getX(Efit,
true));
543 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
545 NOTICE(
"Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
547 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
549 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
550 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
551 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
552 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);