Jpp  19.0.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JShowerPostfit.cc
Go to the documentation of this file.
1 #include <string>
2 #include <iostream>
3 #include <iomanip>
4 #include <vector>
5 #include <set>
6 
7 #include "TROOT.h"
8 #include "TFile.h"
9 #include "TH1D.h"
10 #include "TH2D.h"
11 #include "TProfile.h"
12 #include "TMath.h"
13 
20 #include "JAAnet/JHead.hh"
21 #include "JAAnet/JHeadToolkit.hh"
22 #include "JAAnet/JAAnetToolkit.hh"
23 #include "JAAnet/JVolume.hh"
24 #include "JDAQ/JDAQEventIO.hh"
25 #include "JPhysics/JConstants.hh"
26 #include "JTools/JQuantile.hh"
29 #include "JSupport/JSupport.hh"
30 #include "JReconstruction/JEvt.hh"
32 #include "JLang/JPredicate.hh"
33 #include "JPhysics/JGeanz.hh"
34 #include "JGeometry3D/JShower3E.hh"
36 
37 #include "Jeep/JParser.hh"
38 #include "Jeep/JMessage.hh"
39 
40 namespace {
41 
43 
44 
45  /**
46  * Count number of unique identifiers in event.
47  *
48  * \param __begin begin of data
49  * \param __end end of data
50  * \return number of unique identifiers
51  */
52  template<class JHit_t>
53  inline int getCount(JDAQEvent::const_iterator<JHit_t> __begin,
55  {
56  using namespace std;
57  using namespace KM3NETDAQ;
58 
59  typedef JDAQModuleIdentifier JType_t;
60 
61  set<JType_t> buffer;
62 
63  for (JDAQEvent::const_iterator<JHit_t> i = __begin; i != __end; ++i) {
64  buffer.insert(JType_t(*i));
65  }
66 
67  return buffer.size();
68  }
69 }
70 
71 
72 /**
73  * \file
74  *
75  * Example program to histogram shower fit results: it handles both neutrino and muon productions.
76  *
77  * \author mdejong, adomi
78  */
79 int main(int argc, char **argv)
80 {
81  using namespace std;
82  using namespace JPP;
83  using namespace KM3NETDAQ;
84 
85  typedef JTriggeredFileScanner<JEvt> JTriggeredFileScanner_t;
86  typedef JTriggeredFileScanner_t::multi_pointer_type multi_pointer_type;
87 
88  JTriggeredFileScanner_t inputFile;
89  JLimit_t& numberOfEvents = inputFile.getLimit();
90  string outputFile;
91  size_t numberOfPrefits;
93  JAtmosphericMuon atmosphere;
94  double Emin_GeV;
95  double NPE;
96  int application;
97  string option;
98  bool isMuon;
99  bool wrtNeutrino;
100  double radius;
101  JRange<double> height;
102  int debug;
103 
104  try {
105 
106  JParser<> zap("Example program to histogram fit results.");
107 
108  zap['f'] = make_field(inputFile);
109  zap['o'] = make_field(outputFile) = "postfit.root";
110  zap['n'] = make_field(numberOfEvents) = JLimit::max();
111  zap['N'] = make_field(numberOfPrefits) = 1;
113  zap['E'] = make_field(Emin_GeV) = 0.0;
114  zap['M'] = make_field(NPE) = 0.0;
116  zap['a'] = make_field(atmosphere) = JAtmosphericMuon(90.0, 90.0);
117  zap['O'] = make_field(option) = "E", "N", "LINE", "LOGE";
118  zap['I'] = make_field(isMuon);
119  zap['w'] = make_field(wrtNeutrino);
120  zap['r'] = make_field(radius) = numeric_limits<double>::max(); // no containment
121  zap['z'] = make_field(height) = JRange<double>(); // no containment
122  zap['d'] = make_field(debug) = 2;
123 
124  zap(argc, argv);
125  }
126  catch(const exception& error) {
127  FATAL(error.what() << endl);
128  }
129 
130  cout << "APPLICATION " << application << endl;
131 
132  JHead head;
133 
134  try {
135  head = getCommonHeader(inputFile);
136  }
137  catch(const exception& error) {
138  FATAL(error.what() << endl);
139  }
140 
141  JVolume volume(head, option != "LINE");
142  JPosition3D offset = getPosition(getOffset(head));
144  JCylinder3D cylinder = getCylinder(head);
145 
146  cylinder.add(offset);
147 
148  JCylinder3D containment(JCircle2D(JPosition2D(), radius), height.getLowerLimit(), height.getUpperLimit());
149 
150  containment.add(origin);
151 
152  NOTICE("Offset: " << offset << endl);
153  NOTICE("Origin: " << origin << endl);
154  NOTICE("Cylinder: " << cylinder << endl);
155  NOTICE("Containment: " << containment << endl);
156 
157  const double EMIN_GEV = 10e3; // MUPAGE
158 
159  TFile out(outputFile.c_str(), "recreate");
160 
161  TH1D job("job", NULL, 100, 0.5, 100.5);
162 
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); // to see if the fit with the best quality has also the best resolution
166  TH1D hd("hd", "Distance between Reco and True position", 2000, 0.0, 100.0); // [m]
167  TH1D hz("hz", "Longitudinal Distance between Reco and MC lepton position", 100, -200.0, 200.0); // [m]
168  TH1D ht("ht", "Time difference between Reco and MC lepton", 100, 0, 100.0); // [ns]
169  TH1D h4D("h4D", "4D-distance between reco and true vertex", 2000, 0.0, 100.0); //[m]
170 
171  TH1D ha("ha", "Angle between reco direction and true direction", 1000, 0.0, 180.0); // [ns]
172 
173  TH1D e0("e0", "True lepton energy", 100, volume.getXmin(), volume.getXmax()); // [log(E)]
174  TH1D e2("e2", "Reconstructed energy", 100, volume.getXmin(), volume.getXmax()); // [log(E)]
175  TH1D er("er", "Ratio of reconstructed energy and true energy", 100, -5.0, +5.0); // [log(E/E)]
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]",
181  40, 0, 4,
182  40, 0, 4);
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; // [deg]
188  const Double_t ymax = 180.0; // [deg]
189 
191 
192  if (option.find('E') != string::npos) {
193 
194  for (double x = volume.getXmin(); x <= volume.getXmax(); x += (volume.getXmax() - volume.getXmin()) / 20) {
195  X.push_back(x);
196  }
197 
198  } else {
199 
200  double x = -0.5;
201 
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); }
207  }
208 
209  TH2D h2("h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
210 
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);
225 
226  JQuantile Q("Angle", true);
227  JQuantile O("Omega", true);
228  JQuantile QE("Energy", true);
229  JQuantile Qp("Pos",true);
230  JQuantile Qt("Time",true);
231  JQuantile Q4d("4D",true);
232  while (inputFile.hasNext()) {
233 
234  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
235 
236  multi_pointer_type ps = inputFile.next();
237 
238  JDAQEvent* tev = ps;
239  JEvt* evt = ps; // Reco event
240  Evt* event = ps; // MC event
241 
242  const time_converter converter(*event, *tev);
243 
244  job.Fill(1.0);
245 
246  double Enu = 0.0;
247  double Elep = 0.0;
248  double Emax = 0.0;
249 
250  Trk neutrino;
251 
252  if(has_neutrino(*event)){
253 
254  neutrino = get_neutrino(*event);
255  Enu = neutrino.E;
256 
257  }
258 
259  vector<Trk>::const_iterator lepton = event->mc_trks.end(); // can be electron or muon
260 
261  for (vector<Trk>::const_iterator mc_evt = event->mc_trks.begin(); mc_evt != event->mc_trks.end(); ++mc_evt) {
262 
263  if (!isMuon && is_electron(*mc_evt)) {
264 
265  Elep += mc_evt->E;
266 
267  if (mc_evt->E > Emax) {
268  lepton = mc_evt;
269  Emax = mc_evt->E;
270  }
271 
272 
273  } else if(isMuon && is_muon(*mc_evt)){
274 
275  Elep += mc_evt->E;
276  if (mc_evt->E > Emax) {
277  lepton = mc_evt;
278  Emax = mc_evt->E;
279  }
280  }
281  }
282 
283  if (lepton == event->mc_trks.end()) {
284  continue;
285  }
286 
287  job.Fill(3.0);
288 
289  double true_BjY = (Enu - Elep) / Enu;
290 
291  // abscissa
292 
293  Double_t x = 0.0;
294 
295  if (option.find('E') != string::npos){
296 
297  if(wrtNeutrino == true && !isMuon) x = volume.getX(neutrino.E);
298  else if(!wrtNeutrino && !isMuon) x = volume.getX(lepton->E);
299 
300  } else{
301  x = getCount(tev->begin<JDAQTriggeredHit>(), tev->end<JDAQTriggeredHit>());
302  }
303 
304  // weight for efficiency determination
305  Double_t W = 0.0;
306 
307  if (!evt->empty()) {
308 
309  JEvt::iterator __end = partition(evt->begin(), evt->end(), JHistory::is_event(application));
310 
311  if (evt->begin() == __end) {
312  continue;
313  }
314 
315  job.Fill(4.0);
316 
317  //if (numberOfPrefits > 0 && numberOfPrefits < (size_t) distance(evt->begin(), evt->end())) {
318  if (numberOfPrefits > 0 ) {
319 
320  JEvt::iterator __q = __end;
321 
322  advance(__end = evt->begin(), min(numberOfPrefits, (size_t) distance(evt->begin(), __q)));
323 
324  partial_sort(evt->begin(), __end, __q, quality_sorter);
325 
326  } else {
327 
328  sort(evt->begin(), __end, quality_sorter);
329  }
330 
331  JEvt::iterator best = evt->begin(); // the best shower is the one with the best quality
332 
333  JPosition position(getPosition(lepton->pos)); // by default the lepton pos is the interaction vertex
334  JPointing pointing(getDirection(*lepton));
335  JShowerEnergy energy(lepton->E);
336 
337  JVector3D showerBrightPoint(getPosition(lepton->pos) + offset + getPosition(lepton->dir) * geanz.getMaximum(lepton->E));
338 
339  if(!wrtNeutrino && !isMuon){
340  position = JPosition(showerBrightPoint); // wrt the em shower brightest point
341  } else if(wrtNeutrino == true && !isMuon){
342  position = JPosition(getPosition(neutrino));
343  pointing = JPointing(getDirection(neutrino));
344  energy = JShowerEnergy(Enu);
345  }
346 
347  JEvt::iterator fit_with_smallest_error = best;
348 
349  if(application == JSHOWERPREFIT || application == JSHOWERPOINTSIMPLEX || application == JSHOWERPOSITIONFIT){
350  fit_with_smallest_error = position(evt->begin(), __end);
351  } else if (application == JSHOWERENERGYPREFIT){
352  fit_with_smallest_error = energy(evt->begin(), __end);
353  } else {
354  fit_with_smallest_error = pointing(evt->begin(), __end);
355  }
356  best = fit_with_smallest_error;
357 
358  const Double_t beta = pointing.getAngle(*best);
359  const double Efit = best->getE();
360 
361  if (containment.is_inside(getPosition(*best))){
362 
363  // selection of fit result
364  bool ok = (Efit >= Emin_GeV);
365 
366  if (ok) {
367 
368  W = 1.0;
369 
370  job.Fill(5.0);
371 
372  hn.Fill((Double_t) best->getNDF());
373  hq.Fill(best->getQ());
374  hi.Fill((Double_t) distance(evt->begin(), fit_with_smallest_error));
375  Q.put(beta);
376 
377  JShower3E ta;
378 
379  if(wrtNeutrino){
380  ta = getTrack(neutrino);
381  } else {
382  ta = getTrack(*lepton); // MC event
383  }
384 
385  JShower3E tb = getTrack(*best); // Reco event
386 
387  double zenith = tb.getDirection().getTheta() * 180 / PI;
388 
389  // take into account the difefrent MC/Reco geometry and time
390  ta.add(offset);
391  tb.sub(converter.putTime());
392  double time_true = ta.getT();
393  double time_reco=tb.getT();
394  double distance_m;
395 
396  if(!isMuon && !wrtNeutrino){
397  JPosition3D posDif = tb.getPosition() - JPosition3D(showerBrightPoint);
398  distance_m = posDif.getLength();
399  time_true += geanz.getMaximum(lepton->E)*getInverseSpeedOfLight();
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));
404  double distance4d = sqrt(posDif.getLengthSquared() + pow(getSpeedOfLight()/getIndexOfRefraction()*(time_true-time_reco),2));
405  h4D.Fill(distance4d);
406  Q4d.put(distance4d);
407  } else {
408  JPosition3D posDif = tb.getPosition() - ta.getPosition();
409  distance_m = posDif.getLength();
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));
414  double distance4d = sqrt(posDif.getLengthSquared() + pow(getSpeedOfLight()/getIndexOfRefraction()*(time_true-time_reco),2));
415  h4D.Fill(distance4d);
416  Q4d.put(distance4d);
417  }
418 
419  if (has_neutrino(*event)) {
420 
421  job.Fill(6.0);
422 
423  JPosition3D mc_vx = getPosition(neutrino); // mc vertex
424 
425  mc_vx.add(offset);
426 
427  if (cylinder.is_inside(mc_vx)) {
428 
429  job.Fill(7.0);
430 
431  hz.Fill(tb.getIntersection(mc_vx));
432  }
433  }
434 
435  if (best->getE() >= EMIN_GEV) {
436  hb.Fill(JVector2D(best->getX() - origin.getX(), best->getY() - origin.getY()).getLengthSquared(), best->getZ());
437  }
438 
439  ha.Fill(getAngle(ta.getDirection(), tb.getDirection()));
440 
441  htheta_nu_lep.Fill(x, getAngle(getDirection(neutrino), getDirection(*lepton)));
442  hgetln.Fill(log10(Enu), getAngle(getDirection(neutrino), getDirection(*lepton)));
443  for (int i = 1; i <= hgetln.GetNbinsX(); ++i) {
444  std::vector<double> deltaThetaValues;
445  for (int j = 1; j <= hgetln.GetNbinsY(); ++j) {
446  double binContent = hgetln.GetBinContent(i, j);
447  // Add Delta theta values based on the bin content (number of events)
448  for (int k = 0; k < binContent; ++k) {
449  double deltaTheta = hgetln.GetYaxis()->GetBinCenter(j);
450  deltaThetaValues.push_back(deltaTheta);
451  }
452  }
453 
454  // Calculate the median using TMath::Median
455  double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
456 
457  // Set the median Delta theta as a function of energy in the graph
458  hln1d.SetBinContent(i, medianDeltaTheta);
459  }
460  hmca.Fill(x, getAngle(ta.getDirection(), tb.getDirection()));
461  hae.Fill(log10(Enu),getAngle(ta.getDirection(), tb.getDirection()));
462  for (int i = 1; i <= hae.GetNbinsX(); ++i) {
463  std::vector<double> deltaThetaValues;
464  for (int j = 1; j <= hae.GetNbinsY(); ++j) {
465  double binContent = hae.GetBinContent(i, j);
466  // Add Delta theta values based on the bin content (number of events)
467  for (int k = 0; k < binContent; ++k) {
468  double deltaTheta = hae.GetYaxis()->GetBinCenter(j);
469  deltaThetaValues.push_back(deltaTheta);
470  }
471  }
472 
473  // Calculate the median using TMath::Median
474  double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
475 
476  // Set the median Delta theta as a function of energy in the graph
477  hmae.SetBinContent(i, medianDeltaTheta);
478  }
479  if(application == JSHOWER_BJORKEN_Y) {
480 
481  hY.Fill(true_BjY, best->getW(5));
482 
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));
485 
486  }
487  if(wrtNeutrino){
488 
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));
492  ea.Fill(Efit - Enu);
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));
497 
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);
501 
502  } else {
503 
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));
512 
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);
516 
517  }
518  for (int i = 1; i <= ee.GetNbinsX(); ++i) {
519  std::vector<double> Erecovalues;
520  for (int j = 1; j <= ee.GetNbinsY(); ++j) {
521  double binContent = ee.GetBinContent(i, j);
522  // Add E values based on the bin content (number of events)
523  for (int k = 0; k < binContent; ++k) {
524  double Erecobin = ee.GetYaxis()->GetBinCenter(j);
525  Erecovalues.push_back(Erecobin);
526  }
527  }
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));
533 
534  h2.Fill(x, beta);
535  }
536  }
537  }
538 
539  he.Fill(x, W);}
540 
541  STATUS(endl);
542 
543  NOTICE("Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
544  if(!isMuon){
545  NOTICE("Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
546  } else{
547  NOTICE("Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
548  }
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);
553 
554  if (Q.getCount() != 0) {
555  NOTICE("Median, 70, 80 and 90% quantiles of space angle [deg] " << FIXED (6,3) << Q.getQuantile(0.5) << " "<< Q.getQuantile(0.7) << " "<< Q.getQuantile(0.8)<< " "<< Q.getQuantile(0.9)<< endl);
556  }
557  if (QE.getCount() != 0) {
558  NOTICE("Median, 70%, 80% and 90% quantiles of energy ratio log(Ereco/Etrue) " << FIXED (6,3) << QE.getQuantile(0.5) << " "<< QE.getQuantile(0.7) << " "<< QE.getQuantile(0.8)<< " "<< QE.getQuantile(0.9) << endl);
559  }
560  if(Qp.getCount() != 0){
561  NOTICE("Median distance to vertex: " << setw(8) << Qp.getQuantile(0.5) << " "<< Qp.getQuantile(0.7)<<" "<< Qp.getQuantile(0.8)<< " "<<Qp.getQuantile(0.9)<<endl);
562  NOTICE("Median time to vertex: " << setw(8) << Qt.getQuantile(0.5) << " "<< Qt.getQuantile(0.7)<<" "<< Qt.getQuantile(0.8)<< " "<<Qt.getQuantile(0.9)<<endl);
563  NOTICE("Median 4D-distance to vertex: " << setw(8) << Q4d.getQuantile(0.5) << " "<< Q4d.getQuantile(0.7)<<" "<< Q4d.getQuantile(0.8)<< " "<<Q4d.getQuantile(0.9)<<endl);
564  }
565  out.Write();
566  out.Close();
567 }
Data structure for vector in two dimensions.
Definition: JVector2D.hh:32
bool is_electron(const Trk &track)
Test whether given track is a (anti-)electron.
Utility class to parse command line options.
Definition: JParser.hh:1711
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
Double_t getXmin() const
Get minimal abscissa value.
Definition: JVolume.hh:91
Q(UTCMax_s-UTCMin_s)-livetime_s
int main(int argc, char *argv[])
Definition: Main.cc:15
ROOT TTree parameter settings of various packages.
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.
Synchronously read DAQ events and Monte Carlo events (and optionally other events).
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Head getCommonHeader(const JMultipleFileScanner_t &file_list)
Get common Monte Carlo header.
Data structure for circle in two dimensions.
Definition: JCircle2D.hh:33
JTime & sub(const JTime &value)
Subtraction operator.
Auxiliary data structure for running average, standard deviation and quantiles.
Definition: JQuantile.hh:43
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity.
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
Definition: JVectorize.hh:261
#define STATUS(A)
Definition: JMessage.hh:63
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
Template const_iterator.
Definition: JDAQEvent.hh:66
double getIntersection(const JVector3D &pos) const
Get longitudinal position along axis of position of closest approach with given position.
Definition: JAxis3D.hh:146
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)...
Double_t getXmax() const
Get maximal abscissa value.
Definition: JVolume.hh:102
Double_t getX(const Double_t E, double constrain=false) const
Get abscissa value.
Definition: JVolume.hh:115
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
JCylinder3D & add(const JVector3D &pos)
Add position.
Definition: JCylinder3D.hh:156
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:446
string outputFile
double E
Energy [GeV] (either MC truth or reconstructed)
Definition: Trk.hh:20
static const int JSHOWERENERGYPREFIT
3D track with energy.
Definition: JTrack3E.hh:30
JVersor3D getDirection(const JVector3D &pos) const
Get photon direction of Cherenkov light on PMT.
Definition: JTrack3D.hh:147
JTime & add(const JTime &value)
Addition operator.
static const int JSHOWERPOSITIONFIT
Auxiliary class for histogramming of effective volume.
Definition: JVolume.hh:29
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
const_iterator< T > end() const
Get end of data.
static const int JSHOWERPREFIT
Cylinder object.
Definition: JCylinder3D.hh:39
double getAngle(const JFit &fit) const
Get angle between reference direction and fit result.
JDirection3D getDirection(const Vec &dir)
Get direction.
Data structure for vector in three dimensions.
Definition: JVector3D.hh:34
Acoustic event fit.
Monte Carlo run header.
Definition: JHead.hh:1234
const_iterator< T > begin() const
Get begin of data.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
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.
Definition: JHistory.hh:105
static const int JSHOWERDIRECTIONPREFIT
double getTheta() const
Get theta angle.
Definition: JVersor3D.hh:128
JPosition3D getPosition(const Vec &pos)
Get position.
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
double getQuantile(const double Q, const Quantile_t option=forward_t) const
Get quantile.
Definition: JQuantile.hh:349
#define NOTICE(A)
Definition: JMessage.hh:64
T pow(const T &x, const double y)
Power .
Definition: JMath.hh:97
void put(const double x, const double w=1.0)
Put value.
Definition: JQuantile.hh:133
Physics constants.
double putTime() const
Get Monte Carlo time minus DAQ/trigger time.
static const double PI
Mathematical constants.
static const int JSHOWER_BJORKEN_Y
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
long long int getCount() const
Get total count.
Definition: JQuantile.hh:186
Reconstruction type dependent comparison of track quality.
double getLength() const
Get length.
Definition: JVector3D.hh:246
Auxiliary class to evaluate atmospheric muon hypothesis.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition: JTrack3D.hh:126
double getLengthSquared() const
Get length squared.
Definition: JVector3D.hh:235
General purpose messaging.
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
Auxiliary include file for time conversion between DAQ/trigger hit and Monte Carlo hit...
static const int JSHOWERCOMPLETEFIT
#define FATAL(A)
Definition: JMessage.hh:67
Vec getOrigin(const JHead &header)
Get origin.
then for APP in event gandalf start energy
Definition: JMuonMCEvt.sh:44
Data structure for position in two dimensions.
Definition: JPosition2D.hh:31
const double getSpeedOfLight()
Get speed of light.
double getMaximum(const double E) const
Get depth of shower maximum.
Definition: JGeanz.hh:162
Utility class to parse command line options.
const double getInverseSpeedOfLight()
Get inverse speed of light.
no fit printf nominal n $STRING awk v X
int j
Definition: JPolint.hh:792
Data structure for position in three dimensions.
Definition: JPosition3D.hh:36
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
Longitudinal emission profile EM-shower.
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.
Definition: Trk.hh:14
JVector3D & add(const JVector3D &vector)
Add vector.
Definition: JVector3D.hh:142
int debug
debug level
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:20
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62