Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
software/JSirene/JDomino.cc
Go to the documentation of this file.
1
2#include <string>
3#include <iostream>
4#include <iomanip>
5#include <map>
6#include <sstream>
7
8#include "TROOT.h"
9#include "TFile.h"
10#include "TH1D.h"
11#include "TH2D.h"
12#include "TProfile.h"
13
16
17#include "JAAnet/JHead.hh"
20
25
28#include "JSupport/JSupport.hh"
29
30#include "JROOT/JManager.hh"
32#include "JTools/JWeight.hh"
33#include "JROOT/JRootToolkit.hh"
35
36#include "JLang/JException.hh"
37#include "JLang/JPredicate.hh"
38#include "JLang/JLangToolkit.hh"
39
40#include "Jeep/JPrint.hh"
41#include "Jeep/JParser.hh"
42#include "Jeep/JMessage.hh"
43
44
45namespace {
46
47 /**
48 * Get weight for hits from muon.
49 *
50 * \param E muon energy [GeV]
51 * \param npe number of photo-electrons
52 * \return weight
53 */
54 inline double getMuonWeight(const double E,
55 const double npe)
56 {
57 using namespace JPP;
58
59 return npe / (1.0 + gWater.getB() * E * geanc());
60 }
61
62
63 /**
64 * Get weight for hits from muon.
65 *
66 * \param E muon energy [GeV]
67 * \param R minimal distance of approach [m]
68 * \param npe number of photo-electrons
69 * \return weight
70 */
71 inline double getMuonWeight(const double E,
72 const double R,
73 const double npe)
74 {
75 using namespace JPP;
76
77 static const double l_att = 45.0 * getSinThetaC(); // [m]
78
79 return R * exp(+R/l_att) * getMuonWeight(E, npe);
80 }
81
82
83 /**
84 * Get weight for hits from vertex.
85 *
86 * \param E neutrino energy [GeV]
87 * \param npe number of photo-electrons
88 * \return weight
89 */
90 inline double getNeutrinoWeight(const double E,
91 const double npe)
92 {
93 return npe / E;
94 }
95
96
97 /**
98 * Get weight for hits from vertex.
99 *
100 * \param E neutrino energy [GeV]
101 * \param D distance [m]
102 * \param npe number of photo-electrons
103 * \return weight
104 */
105 inline double getNeutrinoWeight(const double E,
106 const double D,
107 const double npe)
108 {
109 static const double l_att = 45.0; // [m]
110
111 return D*D * exp(+D/l_att) * getNeutrinoWeight(E, npe);
112 }
113
114
115 /**
116 * Function that returns true if second element of first pair is larger than second element of second pair.
117 *
118 * Implemented to provide sort functionality for function `makeSortedH1`
119 *
120 * \param first first instance of a pair
121 * \param second second instance of a pair
122 * \return first.second > second.second
123 */
124 inline bool compare(std::pair<Double_t, Double_t> const& first, std::pair<Int_t, Double_t> const& second)
125 {
126 return first.second > second.second;
127 }
128
129
130 /**
131 * Function to sort input histogram in order of decreasing bin contents.
132 *
133 * \param in pointer to input histogram
134 * \param name name of sorted histogram
135 * \return pointer to sorted histogram
136 */
137 inline TH1D* makeSortedH1(TH1D* in, const TString& name)
138 {
139 using namespace std;
140 using namespace JPP;
141
142 // read bin contents to a vector
143
145
146 for (Int_t ix = 1; ix <= in->GetXaxis()->GetNbins(); ++ix) {
147
148 const Int_t x = (Int_t) in->GetXaxis()->GetBinCenter(ix);
149 const Double_t y = in->GetBinContent(ix);
150
151 if (y > 0.0) {
152 data.push_back(make_pair(x, y));
153 }
154 }
155
156 // sort
157
158 sort(data.begin(), data.end(), compare);
159
160 // create a histogram
161
162 TH1D* out = new TH1D(name, NULL, data.size(), -0.5, data.size() - 0.5);
163
164 for (Int_t i = 0; i < (Int_t) data.size(); i++) {
165
166 const Int_t ix = i + 1;
167
168 out->GetXaxis()->SetBinLabel(ix, MAKE_CSTRING(fixed << setprecision(0) << data[i].first));
169 out->SetBinContent(ix, data[i].second);
170 }
171
172 return out;
173 }
174}
175
176
177/**
178 * \file
179 *
180 * Example program to verify Monte Carlo data.
181 * \author mdejong
182 */
183int main(int argc, char **argv)
184{
185 using namespace std;
186 using namespace JPP;
187
188 //-------------------------------------------------------------------------
189 // command-line arguments
190 //-------------------------------------------------------------------------
191
193 JLimit_t& numberOfEvents = inputFile.getLimit();
194 string outputFile;
195 string detectorFile;
196 set<int> hit_types;
197 int debug;
198
199 try {
200
201 JParser<> zap("Example program to verify Monte Carlo data.");
202
203 zap['f'] = make_field(inputFile);
204 zap['n'] = make_field(numberOfEvents) = JLimit::max();
205 zap['o'] = make_field(outputFile) = "domino.root";
206 zap['a'] = make_field(detectorFile) = "";
207 zap['T'] = make_field(hit_types) = JPARSER::initialised();
208 zap['d'] = make_field(debug) = 2;
209
210 zap(argc, argv);
211 }
212 catch(const exception &error) {
213 FATAL(error.what() << endl);
214 }
215
216
217 //-------------------------------------------------------------------------
218 // load detector file
219 //-------------------------------------------------------------------------
220
222
223 if (detectorFile != "") {
224
225 try {
226 load(detectorFile, detector);
227 }
228 catch(const JException& error) {
229 FATAL(error);
230 }
231 }
232
233 const JPMTRouter router(detector);
234
235 const JHead header = getHeader(inputFile);
236
237
238 //-------------------------------------------------------------------------
239 // try to determine coordinate origin
240 //-------------------------------------------------------------------------
241
242 const Vec offset = getOffset(header);
243
244 NOTICE("Apply detector offset " << offset << endl);
245
246 detector -= getPosition(offset);
247
248
249 //-------------------------------------------------------------------------
250 // calculate instrumented volume
251 //-------------------------------------------------------------------------
252
253 JCylinder3D inst_vol(detector.begin(), detector.end());
254
255 NOTICE("JDomino: Instrumented volume dimensions (x, y, r, zmin, zmax): " << inst_vol << endl);
256
257
258 //-------------------------------------------------------------------------
259 // histogram binning
260 //-------------------------------------------------------------------------
261
263
264 double xmin = 2.0;
265 double xmax = 8.0;
266
267 // energy range is taken from -in order of priority- neutrino or muon data
268
269 if (header.is_valid(&JHead::cut_nu)) {
270 xmin = log10(header.cut_nu.E.getLowerLimit());
271 xmax = log10(header.cut_nu.E.getUpperLimit());
272 } else if (header.is_valid(&JHead::cut_in)) {
273 xmin = log10(header.cut_in.E.getLowerLimit());
274 xmax = log10(header.cut_in.E.getUpperLimit());
275 }
276 const int nx = (int) ((xmax - xmin) / 0.1);
277
278 const Double_t T[] = { -50.0, -20.0, -10.0, -5.0, -2.0, 0.0, +2.0, +5.0, +10.0, +15.0, +20.0, +30.0, +40.0, +50.0,
279 +75.0, +100.0, +150.0, +200.0, +250.0, +300.0, +400.0, +500.0, 1000.0 }; // [ns]
280
281 //-------------------------------------------------------------------------
282 // histograms for events
283 //-------------------------------------------------------------------------
284
285 TH1D hits("hits", NULL, 100, 0.0, 8.0); // number of mc_hits per event
286 TH1D trks("trks", NULL, 10001, -5000.5, 5000.5); // number of track_in type's per event
287 TH1D job ("job" , NULL, 10001, -5000.5, 5000.5); // number of photo-electrons by track_in type
288
289 TProfile hits_per_E_in ("hits_per_E_in", "average number of hits per E_{#nu} inside instrumented volume", nx, xmin, xmax);
290 TProfile hits_per_E_out("hits_per_E_out", "average number of hits per E_{#nu} outside instrumented volume", nx, xmin, xmax);
291
292 typedef JManager<int, TH1D> JManager_t;
293
294 JManager_t npe_per_type(new TH1D("npe[%]", NULL, 5000, 0.5, 5000.5), '%', ios::fmtflags(ios::showpos));
295
296 TH1D npe_per_pmt ("pmt", NULL, 100001, -0.5, 100000.5); // number of photo-electrons per PMT
297
298
299 //-------------------------------------------------------------------------
300 // histograms for neutrino
301 //-------------------------------------------------------------------------
302
303 TH2D nuExD("nuExD", NULL, nx, xmin, xmax, 100, 0.0, 1000.0); // Enu versus distance between vertex and PMT
304 TH2D* nuExD_tmp = (TH2D*) nuExD.Clone("nuExD.tmp"); // normalisation
305
306 TH2D nuExc("nuExc", NULL, nx, xmin, xmax, 100, -1.0, +1.0); // Enu versus emission angle
307 TH2D* nuExc_tmp = (TH2D*) nuExc.Clone("nuExc.tmp"); // normalisation
308
309 TH2D nuDxc("nuDxc", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0); // distance between vertex and PMT versus emission angle
310 TH2D* nuDxc_tmp = (TH2D*) nuDxc.Clone("nuDxc.tmp"); // normalisation
311
312 TH2D nuDxU("nuDxU", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0); // distance between vertex and PMT versus incidence angle
313 TH2D* nuDxU_tmp = (TH2D*) nuDxU.Clone("nuDxU.tmp"); // normalisation
314
315 TH2D nuDxT("nuDxT", NULL, 50, 0.0, 1000.0, getSize(T) - 1, T); // distance between vertex and PMT versus time residual
316 TH2D* nuDxT_tmp = (TH2D*) nuDxT.Clone("nuDxT.tmp"); // normalisation
317
318 nuExD.Sumw2();
319 nuExc.Sumw2();
320 nuDxc.Sumw2();
321 nuDxU.Sumw2();
322 nuDxT.Sumw2();
323
324
325 //-------------------------------------------------------------------------
326 // histograms for muon
327 //-------------------------------------------------------------------------
328
329 TH2D muExR("muExR", NULL, nx, xmin, xmax, 30, 0.0, 300.0); // Emu versus distance between muon and PMT
330 TH2D* muExR_tmp = (TH2D*) muExR.Clone("muExR.tmp"); // normalisation
331
332 TH2D muRxU("muRxU", NULL, 15, 0.0, 300.0, 100, -1.0, +1.0); // distance between muon and PMT versus incidence angle
333 TH2D* muRxU_tmp = (TH2D*) muRxU.Clone("muRxU.tmp"); // normalisation
334
335 TH2D muRxT("muRxT", NULL, 15, 0.0, 300.0, getSize(T) - 1, T); // distance between muon and PMT versus time residual
336 TH2D* muRxT_tmp = (TH2D*) muRxT.Clone("muRxT.tmp"); // normalisation
337
338 muExR.Sumw2();
339 muRxU.Sumw2();
340 muRxT.Sumw2();
341
342
343 //-------------------------------------------------------------------------
344 // loop over events
345 //-------------------------------------------------------------------------
346
347 while (inputFile.hasNext()) {
348
349 STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
350
351 const Evt* event = inputFile.next();
352
353 double NPE = 0.0;
354
355 for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
356 NPE += getNPE(*hit);
357 }
358
359 hits.Fill(log10((Double_t) event->mc_hits.size()));
360
361 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
362 trks.Fill(track->type);
363 }
364
365 JTrack3E neutrino;
366
367 if (has_neutrino(*event)) {
368 neutrino = getTrack(get_neutrino(*event));
369 }
370
371 const JVertex3D vertex = neutrino.getVertex();
372
373 map_type npe_pmt; // temporary buffer to accumulate total npe's by individual PMTs
374 map_type npe_type; // temporary buffer to accumulate total npe's by hit origin track
375
376
377 //-------------------------------------------------------------------------
378 // loop over hits
379 //-------------------------------------------------------------------------
380
381 for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
382
383 const int type = hit->type;
384 const double t1 = getTime(*hit);
385 const double npe = getNPE (*hit);
386
387 npe_pmt[hit->pmt_id].put(npe);
388
389 npe_type[0] .put(npe);
390 npe_type[type].put(npe);
391
392 if (hit_types.empty() || hit_types.count(type) != 0) {
393
394 vector<Trk>::const_iterator track = find_if(event->mc_trks.begin(),
395 event->mc_trks.end(),
396 make_predicate(&Trk::id, hit->origin));
397
398 if (track == event->mc_trks.end()) {
399 ERROR("Hit " << *hit << " has no origin." << endl);
400 continue;
401 }
402
403 if (count_if(event->mc_trks.begin(),
404 event->mc_trks.end(),
405 make_predicate(&Trk::id, hit->origin)) > 1) {
406 ERROR("Hit " << *hit << " has ambiguous origin." << endl);
407 continue;
408 }
409
410 job.Fill((double) track->type, npe);
411
412 if (router.hasPMT(hit->pmt_id)) {
413
414 const JPMT& pmt = router.getPMT(hit->pmt_id);
415
416 if (is_muon(*track)) {
417
418 const JTrack3E muon = getTrack(*track);
419
420 const double E = muon.getE();
421 const double x = log10(E);
422 const double R = muon.getDistance(pmt);
423 const double t0 = muon.getT (pmt);
424 const double ct1 = muon.getDot (pmt);
425
426 muExR.Fill(x, R, getMuonWeight(E, npe));
427 muRxU.Fill(R, ct1, getMuonWeight(E, R, npe));
428 muRxT.Fill(R, t1 - t0, getMuonWeight(E, R, npe));
429
430 } else if (has_neutrino(*event)) {
431
432 const double E = neutrino.getE();
433 const double x = log10(E);
434 const double D = vertex.getDistance(pmt);
435 const double t0 = vertex.getT(pmt);
436 const double ct0 = neutrino.getDot(pmt.getPosition());
437 const double ct1 = vertex.getDot(pmt);
438
439 nuExD.Fill(x, D, getNeutrinoWeight(E, npe));
440 nuExc.Fill(x, ct0, getNeutrinoWeight(E, npe));
441 nuDxc.Fill(D, ct0, getNeutrinoWeight(E, D, npe));
442 nuDxU.Fill(D, ct1, getNeutrinoWeight(E, D, npe));
443 nuDxT.Fill(D, t1 - t0, getNeutrinoWeight(E, D, npe));
444 }
445 }
446 } // end if PMT of hit found in PMT router
447 } // end loop over hits
448
449
450 //-------------------------------------------------------------------------
451 // continue with logic for event, fill histograms common to all input files
452 //-------------------------------------------------------------------------
453
454 for (map_type::const_iterator i = npe_pmt.begin(); i != npe_pmt.end(); ++i) {
455 npe_per_pmt.Fill(i->second.getTotal()); // npe / PMT
456 }
457
458 for (map_type::const_iterator i = npe_type.begin(); i != npe_type.end(); ++i) {
459 npe_per_type[i->first]->Fill(i->second.getTotal()); // npe / type
460 }
461
462
463 //-------------------------------------------------------------------------
464 // normalisation of muon histograms
465 //-------------------------------------------------------------------------
466
467 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
468
469 if (is_muon(*track)) {
470
471 const JTrack3E muon = getTrack(*track);
472
473 const double E = muon.getE();
474 const double x = log10(E);
475
476 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
477
478 const double R = muon.getDistance(*module);
479
480 muExR_tmp->Fill(x, R, module->size());
481
482 if (R < muRxU.GetXaxis()->GetXmax()) {
483 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
484 muRxU_tmp->Fill(R, muon.getDot(*pmt));
485 }
486 }
487
488 if (R < muRxT.GetXaxis()->GetXmax()) {
489 for (Int_t iy = 1; iy <= muRxT_tmp->GetYaxis()->GetNbins(); ++iy) {
490 muRxT_tmp->Fill(R, muRxT_tmp->GetYaxis()->GetBinCenter(iy), muRxT_tmp->GetYaxis()->GetBinWidth(iy));
491 }
492 }
493 }
494 }
495 }
496
497
498 //-------------------------------------------------------------------------
499 // normalisation of neutrino histograms
500 //-------------------------------------------------------------------------
501
502 if (has_neutrino(*event)) {
503
504 const double E = neutrino.getE();
505 const double x = log10(E);
506
507 if (inst_vol.is_inside(vertex))
508 hits_per_E_in .Fill(x, NPE);
509 else
510 hits_per_E_out.Fill(x, NPE);
511
512 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
513
514 const double D = vertex.getDistance(*module);
515 const double ct0 = neutrino.getDot(module->getPosition());
516
517 nuExD_tmp->Fill(x, D, module->size());
518 nuExc_tmp->Fill(x, ct0, module->size());
519 nuDxc_tmp->Fill(D, ct0, module->size());
520
521 if (D < nuDxU.GetXaxis()->GetXmax()) {
522 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
523 nuDxU_tmp->Fill(D, neutrino.getDot(*pmt));
524 }
525 }
526
527 if (D < nuDxT.GetXaxis()->GetXmax()) {
528 for (Int_t iy = 1; iy <= nuDxT_tmp->GetYaxis()->GetNbins(); ++iy) {
529 nuDxT_tmp->Fill(D, nuDxT_tmp->GetYaxis()->GetBinCenter(iy), nuDxT_tmp->GetYaxis()->GetBinWidth(iy));
530 }
531 }
532 }
533 }
534 } // end loop over events
535
536 STATUS(endl);
537
538
539 //-------------------------------------------------------------------------
540 // normalisation of histograms
541 //-------------------------------------------------------------------------
542
543 TH1D *job_sorted = makeSortedH1(&job, "hits_by_pdg"); // hits by track_in particles (PDG codes) per event, sorted
544 TH1D *trks_sorted = makeSortedH1(&trks, "trks_sorted"); // track_in particles (PDG codes) per event, sorted
545
546 if (inputFile.getCounter() != 0) {
547
548 const Double_t W = 1.0 / ((Double_t) inputFile.getCounter());
549
550 for (TH1D* p : { &hits, &npe_per_pmt, &job, &trks, job_sorted, trks_sorted }) {
551 p->Scale(W);
552 }
553
554 for (JManager_t::iterator i = npe_per_type.begin(); i != npe_per_type.end(); ++i) {
555 i->second->Scale(W);
556 }
557
558 nuExD.Divide(nuExD_tmp);
559 nuExc.Divide(nuExc_tmp);
560 nuDxc.Divide(nuDxc_tmp);
561 nuDxU.Divide(nuDxU_tmp);
562 nuDxT.Divide(nuDxT_tmp);
563
564 muExR.Divide(muExR_tmp);
565 muRxU.Divide(muRxU_tmp);
566 muRxT.Divide(muRxT_tmp);
567 }
568
569
570 //-------------------------------------------------------------------------
571 // output
572 //-------------------------------------------------------------------------
573
574 TFile out(outputFile.c_str(), "recreate");
575
576 out << hits << job << *job_sorted << trks << *trks_sorted << hits_per_E_in << hits_per_E_out << npe_per_type << npe_per_pmt;
577
578 out << nuExD << nuExc << nuDxc << nuDxU << nuDxT;
579 out << muExR << muRxU << muRxT;
580
581 out.Write();
582 out.Close();
583}
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
string outputFile
Data structure for detector geometry and calibration.
Exceptions.
Dynamic ROOT object management.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define STATUS(A)
Definition JMessage.hh:63
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Auxiliary methods for PDF calculations.
Direct access to PMT in detector data structure.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
I/O formatting auxiliaries.
#define MAKE_CSTRING(A)
Make C-string.
Definition JPrint.hh:72
ROOT TTree parameter settings of various packages.
Monte Carlo run header.
Definition JHead.hh:1236
JAANET::cut_in cut_in
Definition JHead.hh:1595
JAANET::cut_nu cut_nu
Definition JHead.hh:1596
bool is_valid(T JHead::*pd) const
Check validity of given data member in JHead.
Definition JHead.hh:1319
Detector data structure.
Definition JDetector.hh:96
Router for direct addressing of PMT data in detector data structure.
Definition JPMTRouter.hh:37
bool hasPMT(const JObjectID &id) const
Has PMT.
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT.
Definition JPMTRouter.hh:92
Data structure for PMT geometry, calibration and status.
Definition JPMT.hh:49
double getDistance(const JVector3D &pos) const
Get distance.
Definition JAxis3D.hh:213
bool is_inside(const JVector3D &pos) const
Check whether given point is inside cylinder.
const JPosition3D & getPosition() const
Get position.
double getDot(const JAxis3D &axis) const
Get cosine angle of impact of Cherenkov light on PMT.
Definition JTrack3D.hh:170
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition JTrack3D.hh:126
JVertex3D getVertex() const
Get vertex of this track.
Definition JTrack3D.hh:99
3D track with energy.
Definition JTrack3E.hh:32
double getE() const
Get energy.
Definition JTrack3E.hh:93
double getDistance(const JVector3D &pos) const
Get distance to point.
Definition JVector3D.hh:270
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition JVertex3D.hh:147
double getDot(const JAxis3D &axis) const
Get cosine angle of impact of Cherenkov light on PMT.
Definition JVertex3D.hh:177
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
Definition JManager.hh:47
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
T getLowerLimit() const
Get lower limit.
Definition JRange.hh:202
T getUpperLimit() const
Get upper limit.
Definition JRange.hh:213
JTrack3E getTrack(const Trk &track)
Get track.
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
double getNPE(const Hit &hit)
Get true charge of hit.
Vec getOffset(const JHead &header)
Get offset.
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
size_t getSize(T(&array)[N])
Get size of c-array.
double getSinThetaC()
Get average sine of Cherenkov angle of water corresponding to group velocity.
double geanc()
Equivalent muon track length per unit shower energy.
Definition JGeane.hh:28
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
const char * getTime()
Get current local time conform ISO-8601 standard.
std::map< int, range_type > map_type
int main(int argc, char **argv)
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition Evt.hh:21
JRange_t E
Energy range [GeV].
Definition JHead.hh:419
Detector file.
Definition JHead.hh:227
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:68
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
int id
track identifier
Definition Trk.hh:16
The Vec class is a straightforward 3-d vector, which also works in pyroot.
Definition Vec.hh:13