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 const Int_t ny = 28800;
184 const Double_t ymin = 0.0;
185 const Double_t ymax = 180.0;
189 if (option.find(
'E') != string::npos) {
199 for ( ; x <= 15.5; x += 1.0) { X.push_back(x); }
200 for ( ; x <= 25.5; x += 2.0) { X.push_back(x); }
201 for ( ; x <= 50.5; x += 5.0) { X.push_back(x); }
202 for ( ; x <= 100.5; x += 10.0) { X.push_back(x); }
203 for ( ; x <= 250.5; x += 20.0) { X.push_back(x); }
206 TH2D h2(
"h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
207 TH2D h3(
"h3", NULL, X.size() - 1, X.data(), 2000, 0.0, 100.0);
208 TProfile herrorE(
"herrorE",
"Energy Error", X.size() - 1, X.data());
209 TProfile hfracE(
"hfracE",
"Fractional Energy Error", X.size() - 1, X.data());
210 TProfile he(
"he",
"Reconstruction Efficiency", X.size() - 1, X.data());
211 TProfile htheta_nu_lep(
"htheta_nu_lep",
"Angle between neutrino and primary lepton", X.size() - 1, X.data());
212 TH1D hln1d(
"hln1d",
"Angle between neutrino and lepton",40,0,4);
213 TH2D hb(
"hb", NULL, 100, 0.0, 0.5e6, 100, -100.0, +900.0);
214 TH2S hmca(
"hmca", NULL, X.size() - 1, X.data(), 1000, 0, 180);
215 TH2D hzenith(
"hzenith",
"Reco Zenith vs MC Energy", 100, 0, 100, ny, ymin, ymax);
216 TH2D hY(
"hY",
"Reco Bjorken Y vs MC Bjorken Y", 40, 0, 1, 40, 0, 1);
217 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);
218 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);
226 while (inputFile.hasNext()) {
228 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
230 multi_pointer_type ps = inputFile.next();
253 vector<Trk>::const_iterator lepton =
event->mc_trks.end();
255 for (vector<Trk>::const_iterator mc_evt = event->mc_trks.begin(); mc_evt != event->mc_trks.end(); ++mc_evt) {
261 if (mc_evt->E > Emax) {
267 }
else if(isMuon &&
is_muon(*mc_evt)){
270 if (mc_evt->E > Emax) {
277 if (lepton == event->mc_trks.end()) {
283 double true_BjY = (Enu - Elep) / Enu;
289 if (option.find(
'E') != string::npos){
291 if(wrtNeutrino ==
true && !isMuon) x = volume.
getX(neutrino.
E);
292 else if(!wrtNeutrino && !isMuon) x = volume.
getX(lepton->E);
305 if (evt->begin() == __end) {
312 if (numberOfPrefits > 0 ) {
314 JEvt::iterator __q = __end;
316 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
325 JEvt::iterator best = evt->begin();
333 if(!wrtNeutrino && !isMuon){
335 }
else if(wrtNeutrino ==
true && !isMuon){
341 JEvt::iterator fit_with_smallest_error = best;
344 fit_with_smallest_error = position(evt->begin(), __end);
346 fit_with_smallest_error = energy(evt->begin(), __end);
348 fit_with_smallest_error = pointing(evt->begin(), __end);
350 best = fit_with_smallest_error;
352 const Double_t beta = pointing.
getAngle(*best);
353 const double Efit = best->getE();
358 bool ok = (Efit >= Emin_GeV);
366 hn.Fill((Double_t) best->getNDF());
367 hq.Fill(best->getQ());
368 hi.Fill((Double_t)
distance(evt->begin(), fit_with_smallest_error));
388 double time_true = ta.
getT();
389 double time_reco=tb.
getT();
392 if(!isMuon && !wrtNeutrino){
396 hd.Fill(fabs(distance_m));
397 ht.Fill(fabs(time_reco - time_true));
398 Qp.
put(fabs(distance_m));
399 Qt.
put(fabs(time_reco-time_true));
401 h4D.Fill(distance4d);
403 h3.Fill(x, fabs(distance_m));
407 hd.Fill(fabs(distance_m));
408 ht.Fill(fabs(time_reco - time_true));
409 Qp.
put(fabs(distance_m));
410 Qt.
put(fabs(time_reco-time_true));
412 h4D.Fill(distance4d);
414 h3.Fill(x, fabs(distance_m));
433 if (best->getE() >= EMIN_GEV) {
441 hY.Fill(true_BjY, best->getW(5));
443 if(Efit > 2.5 && Efit < 6) hby3_5GeV.Fill(true_BjY, best->getW(5));
444 else if(Efit > 7.5 && Efit < 11) hby8_10GeV.Fill(true_BjY, best->getW(5));
449 e0.Fill(volume.
getX(Enu,
true));
450 er.Fill(volume.
getX(Efit) - volume.
getX(Enu));
451 ee.Fill(volume.
getX(Enu), volume.
getX(Efit));
453 hzenith.Fill(Enu, zenith);
454 QE.
put(log10(Efit/Enu));
455 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Enu));
456 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Enu))/volume.
getX(Enu));
458 if(Enu >= 3 && Enu <= 5) ed3_5GeV.Fill(Efit - Enu);
459 else if(Enu >= 8 && Enu <= 11) ed8_11GeV.Fill(Efit - Enu);
460 else if(Enu >= 15 && Enu <= 21) ed15_21GeV.Fill(Efit - Enu);
464 e0.Fill(volume.
getX(Elep,
true));
465 er.Fill(volume.
getX(Efit) - volume.
getX(Elep));
466 ee.Fill(volume.
getX(Elep), volume.
getX(Efit));
467 ea.Fill(Efit - Elep);
468 hzenith.Fill(Elep, zenith);
469 QE.
put(log10(Efit/Elep));
470 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Elep));
471 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Elep))/volume.
getX(Elep));
473 if(Elep >= 3 && Elep <= 5) ed3_5GeV.Fill(Efit - Elep);
474 else if(Elep >= 8 && Elep <= 11) ed8_11GeV.Fill(Efit - Elep);
475 else if(Elep >= 15 && Elep <= 21) ed15_21GeV.Fill(Efit - Elep);
478 e2.Fill(volume.
getX(Efit,
true));
487 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
489 NOTICE(
"Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
491 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
493 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
494 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
495 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
496 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);