Jpp  18.6.0-rc.1
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 = getHeader(inputFile);
136  }
137  catch(const JException& error) {
138  FATAL(error);
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", "Square Distance between Reco and True position", 2000, 0.0, 400.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, -100.0, 100.0); // [ns]
169 
170  TH1D ha("ha", "Angle between reco direction and true direction", 1000, 0.0, 180.0); // [ns]
171 
172  TH1D e0("e0", "True lepton energy", 100, volume.getXmin(), volume.getXmax()); // [log(E)]
173  TH1D e2("e2", "Reconstructed energy", 100, volume.getXmin(), volume.getXmax()); // [log(E)]
174  TH1D er("er", "Ratio of reconstructed energy and true energy", 100, -5.0, +5.0); // [log(E/E)]
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]",
180  40, 0, 4,
181  40, 0, 4);
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; // [deg]
187  const Double_t ymax = 180.0; // [deg]
188 
190 
191  if (option.find('E') != string::npos) {
192 
193  for (double x = volume.getXmin(); x <= volume.getXmax(); x += (volume.getXmax() - volume.getXmin()) / 20) {
194  X.push_back(x);
195  }
196 
197  } else {
198 
199  double x = -0.5;
200 
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); }
206  }
207 
208  TH2D h2("h2", NULL, X.size() - 1, X.data(), ny, ymin, ymax);
209 
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);
224 
225  JQuantile Q("Angle", true);
226  JQuantile O("Omega", true);
227  JQuantile QE("Energy", true);
228 
229  while (inputFile.hasNext()) {
230 
231  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
232 
233  multi_pointer_type ps = inputFile.next();
234 
235  JDAQEvent* tev = ps;
236  JEvt* evt = ps; // Reco event
237  Evt* event = ps; // MC event
238 
239  const time_converter converter(*event, *tev);
240 
241  job.Fill(1.0);
242 
243  double Enu = 0.0;
244  double Elep = 0.0;
245  double Emax = 0.0;
246 
247  Trk neutrino;
248 
249  if(has_neutrino(*event)){
250 
251  neutrino = get_neutrino(*event);
252  Enu = neutrino.E;
253 
254  }
255 
256  vector<Trk>::const_iterator lepton = event->mc_trks.end(); // can be electron or muon
257 
258  for (vector<Trk>::const_iterator mc_evt = event->mc_trks.begin(); mc_evt != event->mc_trks.end(); ++mc_evt) {
259 
260  if (!isMuon && is_electron(*mc_evt)) {
261 
262  Elep += mc_evt->E;
263 
264  if (mc_evt->E > Emax) {
265  lepton = mc_evt;
266  Emax = mc_evt->E;
267  }
268 
269 
270  } else if(isMuon && is_muon(*mc_evt)){
271 
272  Elep += mc_evt->E;
273  if (mc_evt->E > Emax) {
274  lepton = mc_evt;
275  Emax = mc_evt->E;
276  }
277  }
278  }
279 
280  if (lepton == event->mc_trks.end()) {
281  continue;
282  }
283 
284  job.Fill(3.0);
285 
286  double true_BjY = (Enu - Elep) / Enu;
287 
288  // abscissa
289 
290  Double_t x = 0.0;
291 
292  if (option.find('E') != string::npos){
293 
294  if(wrtNeutrino == true && !isMuon) x = volume.getX(neutrino.E);
295  else if(!wrtNeutrino && !isMuon) x = volume.getX(lepton->E);
296 
297  } else{
298  x = getCount(tev->begin<JDAQTriggeredHit>(), tev->end<JDAQTriggeredHit>());
299  }
300 
301  // weight for efficiency determination
302  Double_t W = 0.0;
303 
304  if (!evt->empty()) {
305 
306  JEvt::iterator __end = partition(evt->begin(), evt->end(), JHistory::is_event(application));
307 
308  if (evt->begin() == __end) {
309  continue;
310  }
311 
312  job.Fill(4.0);
313 
314  //if (numberOfPrefits > 0 && numberOfPrefits < (size_t) distance(evt->begin(), evt->end())) {
315  if (numberOfPrefits > 0 ) {
316 
317  JEvt::iterator __q = __end;
318 
319  advance(__end = evt->begin(), min(numberOfPrefits, (size_t) distance(evt->begin(), __q)));
320 
321  partial_sort(evt->begin(), __end, __q, quality_sorter);
322 
323  } else {
324 
325  sort(evt->begin(), __end, quality_sorter);
326  }
327 
328  JEvt::iterator best = evt->begin(); // the best shower is the one with the best quality
329 
330  JPosition position(getPosition(lepton->pos)); // by default the lepton pos is the interaction vertex
331  JPointing pointing(getDirection(*lepton));
332  JShowerEnergy energy(lepton->E);
333 
334  JVector3D showerBrightPoint(getPosition(lepton->pos) + offset + getPosition(lepton->dir) * geanz.getMaximum(lepton->E));
335 
336  if(!wrtNeutrino && !isMuon){
337  position = JPosition(showerBrightPoint); // wrt the em shower brightest point
338  } else if(wrtNeutrino == true && !isMuon){
339  position = JPosition(getPosition(neutrino));
340  pointing = JPointing(getDirection(neutrino));
341  energy = JShowerEnergy(Enu);
342  }
343 
344  JEvt::iterator fit_with_smallest_error = best;
345 
346  if(application == JSHOWERPREFIT || application == JSHOWERPOINTSIMPLEX || application == JSHOWERPOSITIONFIT){
347  fit_with_smallest_error = position(evt->begin(), __end);
348  } else if (application == JSHOWERENERGYPREFIT){
349  fit_with_smallest_error = energy(evt->begin(), __end);
350  } else {
351  fit_with_smallest_error = pointing(evt->begin(), __end);
352  }
353 
354  const Double_t beta = pointing.getAngle(*best);
355  const double Efit = best->getE();
356 
357  if (containment.is_inside(getPosition(*best))){
358 
359  // selection of fit result
360  bool ok = (Efit >= Emin_GeV);
361 
362  if (ok) {
363 
364  W = 1.0;
365 
366  job.Fill(5.0);
367 
368  hn.Fill((Double_t) best->getNDF());
369  hq.Fill(best->getQ());
370  hi.Fill((Double_t) distance(evt->begin(), fit_with_smallest_error));
371 
372  Q.put(beta);
373 
374  JShower3E ta;
375 
376  if(wrtNeutrino){
377  ta = getTrack(neutrino);
378  } else {
379  ta = getTrack(*lepton); // MC event
380  }
381 
382  JShower3E tb = getTrack(*best); // Reco event
383 
384  double zenith = tb.getDirection().getTheta() * 180 / PI;
385 
386  // take into account the difefrent MC/Reco geometry and time
387  ta.add(offset);
388  tb.sub(converter.putTime());
389 
390  if(!isMuon && !wrtNeutrino){
391 
392  double distance_m = (tb.getPosition() - JPosition3D(showerBrightPoint)).getLength();
393 
394  hd.Fill(distance_m * distance_m);
395 
396  } else {
397 
398  double distance_m = (tb.getPosition() - ta.getPosition()).getLength();
399 
400  hd.Fill(distance_m * distance_m);
401 
402  }
403 
404  if (has_neutrino(*event)) {
405 
406  job.Fill(6.0);
407 
408  JPosition3D mc_vx = getPosition(neutrino); // mc vertex
409 
410  mc_vx.add(offset);
411 
412  if (cylinder.is_inside(mc_vx)) {
413 
414  job.Fill(7.0);
415 
416  hz.Fill(tb.getIntersection(mc_vx));
417  }
418  }
419 
420  if (best->getE() >= EMIN_GEV) {
421  hb.Fill(JVector2D(best->getX() - origin.getX(), best->getY() - origin.getY()).getLengthSquared(), best->getZ());
422  }
423 
424  ht.Fill(tb.getT() - ta.getT());
425 
426  ha.Fill(getAngle(ta.getDirection(), tb.getDirection()));
427 
428  htheta_nu_lep.Fill(x, getAngle(getDirection(neutrino), getDirection(*lepton)));
429  hgetln.Fill(log10(Enu), getAngle(getDirection(neutrino), getDirection(*lepton)));
430  for (int i = 1; i <= hgetln.GetNbinsX(); ++i) {
431  std::vector<double> deltaThetaValues;
432  for (int j = 1; j <= hgetln.GetNbinsY(); ++j) {
433  double binContent = hgetln.GetBinContent(i, j);
434  // Add Delta theta values based on the bin content (number of events)
435  for (int k = 0; k < binContent; ++k) {
436  double deltaTheta = hgetln.GetYaxis()->GetBinCenter(j);
437  deltaThetaValues.push_back(deltaTheta);
438  }
439  }
440 
441  // Calculate the median using TMath::Median
442  double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
443 
444  // Set the median Delta theta as a function of energy in the graph
445  hln1d.SetBinContent(i, medianDeltaTheta);
446  }
447  hmca.Fill(x, getAngle(ta.getDirection(), tb.getDirection()));
448  hae.Fill(log10(Enu),getAngle(ta.getDirection(), tb.getDirection()));
449  for (int i = 1; i <= hae.GetNbinsX(); ++i) {
450  std::vector<double> deltaThetaValues;
451  for (int j = 1; j <= hae.GetNbinsY(); ++j) {
452  double binContent = hae.GetBinContent(i, j);
453  // Add Delta theta values based on the bin content (number of events)
454  for (int k = 0; k < binContent; ++k) {
455  double deltaTheta = hae.GetYaxis()->GetBinCenter(j);
456  deltaThetaValues.push_back(deltaTheta);
457  }
458  }
459 
460  // Calculate the median using TMath::Median
461  double medianDeltaTheta = TMath::Median(deltaThetaValues.size(), &deltaThetaValues[0]);
462 
463  // Set the median Delta theta as a function of energy in the graph
464  hmae.SetBinContent(i, medianDeltaTheta);
465  }
466  if(application == JSHOWER_BJORKEN_Y) {
467 
468  hY.Fill(true_BjY, best->getW(5));
469 
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));
472 
473  }
474  if(wrtNeutrino){
475 
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));
479  ea.Fill(Efit - Enu);
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));
484 
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);
488 
489  } else {
490 
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));
499 
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);
503 
504  }
505  for (int i = 1; i <= ee.GetNbinsX(); ++i) {
506  std::vector<double> Erecovalues;
507  for (int j = 1; j <= ee.GetNbinsY(); ++j) {
508  double binContent = ee.GetBinContent(i, j);
509  // Add E values based on the bin content (number of events)
510  for (int k = 0; k < binContent; ++k) {
511  double Erecobin = ee.GetYaxis()->GetBinCenter(j);
512  Erecovalues.push_back(Erecobin);
513  }
514  }
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));
520 
521  h2.Fill(x, beta);
522  }
523  }
524  }
525 
526  he.Fill(x, W);}
527 
528  STATUS(endl);
529 
530  NOTICE("Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
531  if(!isMuon){
532  NOTICE("Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
533  } else{
534  NOTICE("Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
535  }
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);
540 
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);
543  }
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);
546  }
547 
548  out.Write();
549  out.Close();
550 }
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.
General exception.
Definition: JException.hh:24
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.
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
#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
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
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
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.
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
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
double getMaximum(const double E) const
Get depth of shower maximum.
Definition: JGeanz.hh:162
Utility class to parse command line options.
int getCount(const T &hit)
Get hit count.
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