52 template<
class JHit_t>
57 using namespace KM3NETDAQ;
64 buffer.insert(JType_t(*
i));
79 int main(
int argc,
char **argv)
83 using namespace KM3NETDAQ;
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.");
110 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
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;
141 JVolume volume(head, option !=
"LINE");
146 cylinder.add(offset);
152 NOTICE(
"Offset: " << offset << 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",
"Square Distance between Reco and True position", 2000, 0.0, 400.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, -100.0, 100.0);
170 TH1D ha(
"ha",
"Angle between reco direction and true direction", 1000, 0.0, 180.0);
172 TH1D e0(
"e0",
"True lepton energy", 100, volume.
getXmin(), volume.
getXmax());
173 TH1D e2(
"e2",
"Reconstructed energy", 100, volume.
getXmin(), volume.
getXmax());
174 TH1D er(
"er",
"Ratio of reconstructed energy and true energy", 100, -5.0, +5.0);
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]",
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);
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());
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);
216 TH2D hzenith(
"hzenith",
"Reco Zenith vs MC Energy", 100, 0, 100, ny, ymin, ymax);
217 TH2D hY(
"hY",
"Reco Bjorken Y vs MC Bjorken Y", 40, 0, 1, 40, 0, 1);
218 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);
219 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 while (inputFile.hasNext()) {
227 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
229 multi_pointer_type ps = inputFile.next();
260 if (mc_evt->E > Emax) {
266 }
else if(isMuon &&
is_muon(*mc_evt)){
269 if (mc_evt->E > Emax) {
276 if (lepton == event->mc_trks.end()) {
282 double true_BjY = (Enu - Elep) / Enu;
288 if (option.find(
'E') != string::npos){
290 if(wrtNeutrino ==
true && !isMuon) x = volume.
getX(neutrino.
E);
291 else if(!wrtNeutrino && !isMuon) x = volume.
getX(lepton->E);
302 JEvt::iterator __end = partition(evt->begin(), evt->end(),
JHistory::is_event(application));
304 if (evt->begin() == __end) {
311 if (numberOfPrefits > 0 ) {
313 JEvt::iterator __q = __end;
315 advance(__end = evt->begin(), min(numberOfPrefits, (
size_t)
distance(evt->begin(), __q)));
324 JEvt::iterator best = evt->begin();
332 if(!wrtNeutrino && !isMuon){
334 }
else if(wrtNeutrino ==
true && !isMuon){
340 JEvt::iterator fit_with_smallest_error = best;
343 fit_with_smallest_error = position(evt->begin(), __end);
345 fit_with_smallest_error =
energy(evt->begin(), __end);
347 fit_with_smallest_error = pointing(evt->begin(), __end);
350 const Double_t beta = pointing.
getAngle(*best);
351 const double Efit = best->getE();
356 bool ok = (Efit >= Emin_GeV);
364 hn.Fill((Double_t) best->getNDF());
365 hq.Fill(best->getQ());
366 hi.Fill((Double_t)
distance(evt->begin(), fit_with_smallest_error));
386 if(!isMuon && !wrtNeutrino){
390 hd.Fill(distance_m * distance_m);
396 hd.Fill(distance_m * distance_m);
408 if (cylinder.is_inside(mc_vx)) {
416 if (best->getE() >= EMIN_GEV) {
417 hb.Fill(
JVector2D(best->getX() -
origin.getX(), best->getY() -
origin.getY()).getLengthSquared(), best->getZ());
429 hY.Fill(true_BjY, best->getW(5));
431 if(Efit > 2.5 && Efit < 6) hby3_5GeV.Fill(true_BjY, best->getW(5));
432 else if(Efit > 7.5 && Efit < 11) hby8_10GeV.Fill(true_BjY, best->getW(5));
437 e0.Fill(volume.
getX(Enu,
true));
438 er.Fill(volume.
getX(Efit) - volume.
getX(Enu));
439 ee.Fill(volume.
getX(Enu), volume.
getX(Efit));
441 hzenith.Fill(Enu, zenith);
443 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Enu));
444 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Enu))/volume.
getX(Enu));
446 if(Enu >= 3 && Enu <= 5) ed3_5GeV.Fill(Efit - Enu);
447 else if(Enu >= 8 && Enu <= 11) ed8_11GeV.Fill(Efit - Enu);
448 else if(Enu >= 15 && Enu <= 21) ed15_21GeV.Fill(Efit - Enu);
452 e0.Fill(volume.
getX(Elep,
true));
453 er.Fill(volume.
getX(Efit) - volume.
getX(Elep));
454 ee.Fill(volume.
getX(Elep), volume.
getX(Efit));
455 ea.Fill(Efit - Elep);
456 hzenith.Fill(Elep, zenith);
458 herrorE.Fill(x, volume.
getX(Efit) - volume.
getX(Elep));
459 hfracE.Fill(x, fabs(volume.
getX(Efit) - volume.
getX(Elep))/volume.
getX(Elep));
461 if(Elep >= 3 && Elep <= 5) ed3_5GeV.Fill(Efit - Elep);
462 else if(Elep >= 8 && Elep <= 11) ed8_11GeV.Fill(Efit - Elep);
463 else if(Elep >= 15 && Elep <= 21) ed15_21GeV.Fill(Efit - Elep);
467 e2.Fill(volume.
getX(Efit,
true));
478 NOTICE(
"Number of events input " << setw(8) << right << job.GetBinContent(1) << endl);
480 NOTICE(
"Number of events with electron " << setw(8) << right << job.GetBinContent(3) << endl);
482 NOTICE(
"Number of events with muon " << setw(8) << right << job.GetBinContent(3) << endl);
484 NOTICE(
"Number of events with fit " << setw(8) << right << job.GetBinContent(4) << endl);
485 NOTICE(
"Number of events selected " << setw(8) << right << job.GetBinContent(5) << endl);
486 NOTICE(
"Number of events with neutrino " << setw(8) << right << job.GetBinContent(6) << endl);
487 NOTICE(
"Number of events contained " << setw(8) << right << job.GetBinContent(7) << endl);
489 if (Q.getCount() != 0) {
490 NOTICE(
"Median space angle [deg] " <<
FIXED (6,3) << Q.getQuantile(0.5) << endl);
Data structure for vector in two dimensions.
bool is_electron(const Trk &track)
Test whether given track is a (anti-)electron.
Utility class to parse command line options.
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
Double_t getXmin() const
Get minimal abscissa value.
Q(UTCMax_s-UTCMin_s)-livetime_s
int main(int argc, char *argv[])
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.
JTime & sub(const JTime &value)
Subtraction operator.
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.
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.
Double_t getX(const Double_t E, double constrain=false) const
Get abscissa value.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
JCylinder3D & add(const JVector3D &pos)
Add position.
Auxiliary data structure for floating point format specification.
double E
Energy [GeV] (either MC truth or reconstructed)
static const int JSHOWERENERGYPREFIT
JVersor3D getDirection(const JVector3D &pos) const
Get photon direction of Cherenkov light on PMT.
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.
Auxiliary class for defining the range of iterations of objects.
const_iterator< T > end() const
Get end of data.
static const int JSHOWERPREFIT
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.
const_iterator< T > begin() const
Get begin of data.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
static const JGeanz geanz(1.85, 0.62, 0.54)
Function object for longitudinal EM-shower profile.
Auxiliary class to test history.
static const int JSHOWERDIRECTIONPREFIT
double getTheta() const
Get theta angle.
JPosition3D getPosition(const Vec &pos)
Get position.
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.
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.
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
Vec getOrigin(const JHead &header)
Get origin.
then for APP in event gandalf start energy
Data structure for position in two dimensions.
Auxiliary data structure for average.
double getMaximum(const double E) const
Get depth of shower maximum.
Utility class to parse command line options.
void put(const double x)
Put value.
int getCount(const T &hit)
Get hit count.
no fit printf nominal n $STRING awk v X
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
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.
JVector3D & add(const JVector3D &vector)
Add vector.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.