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
Functions
JShowerPostfit.cc File Reference

Example program to histogram shower fit results: it handles both neutrino and muon productions. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <set>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TProfile.h"
#include "TMath.h"
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/Evt.hh"
#include "km3net-dataformat/online/JDAQModuleIdentifier.hh"
#include "km3net-dataformat/definitions/reconstruction.hh"
#include "km3net-dataformat/definitions/fitparameters.hh"
#include "km3net-dataformat/tools/time_converter.hh"
#include "JAAnet/JHead.hh"
#include "JAAnet/JHeadToolkit.hh"
#include "JAAnet/JAAnetToolkit.hh"
#include "JAAnet/JVolume.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JPhysics/JConstants.hh"
#include "JTools/JQuantile.hh"
#include "JSupport/JTriggeredFileScanner.hh"
#include "JSupport/JMonteCarloFileSupportkit.hh"
#include "JSupport/JSupport.hh"
#include "JReconstruction/JEvt.hh"
#include "JReconstruction/JEvtToolkit.hh"
#include "JLang/JPredicate.hh"
#include "JPhysics/JGeanz.hh"
#include "JGeometry3D/JShower3E.hh"
#include "JGeometry3D/JCylinder3D.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Example program to histogram shower fit results: it handles both neutrino and muon productions.

Author
mdejong, adomi

Definition in file JShowerPostfit.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 79 of file JShowerPostfit.cc.

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
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.
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.
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)...
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
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.
#define NOTICE(A)
Definition: JMessage.hh:64
static const double PI
Mathematical constants.
static const int JSHOWER_BJORKEN_Y
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
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
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
#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
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
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