201 JParser<> zap(
"Example program to verify Monte Carlo data.");
204 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
212 catch(
const exception &error) {
213 FATAL(error.what() << endl);
223 if (detectorFile !=
"") {
244 NOTICE(
"Apply detector offset " << center << endl);
255 NOTICE(
"JDomino: Instrumented volume dimensions (x, y, r, zmin, zmax): " << inst_vol << endl);
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());
276 const int nx = (int) ((xmax -
xmin) / 0.1);
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 };
285 TH1D hits(
"hits", NULL, 100, 0.0, 8.0);
286 TH1D trks(
"trks", NULL, 10001, -5000.5, 5000.5);
287 TH1D job (
"job" , NULL, 10001, -5000.5, 5000.5);
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);
294 JManager_t npe_per_type(
new TH1D(
"npe[%]", NULL, 5000, 0.5, 5000.5),
'%', ios::fmtflags(ios::showpos));
296 TH1D npe_per_pmt (
"pmt", NULL, 100001, -0.5, 100000.5);
303 TH2D nuExD(
"nuExD", NULL, nx,
xmin, xmax, 100, 0.0, 1000.0);
304 TH2D* nuExD_tmp = (TH2D*) nuExD.Clone(
"nuExD.tmp");
306 TH2D nuExc(
"nuExc", NULL, nx,
xmin, xmax, 100, -1.0, +1.0);
307 TH2D* nuExc_tmp = (TH2D*) nuExc.Clone(
"nuExc.tmp");
309 TH2D nuDxc(
"nuDxc", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0);
310 TH2D* nuDxc_tmp = (TH2D*) nuDxc.Clone(
"nuDxc.tmp");
312 TH2D nuDxU(
"nuDxU", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0);
313 TH2D* nuDxU_tmp = (TH2D*) nuDxU.Clone(
"nuDxU.tmp");
315 TH2D nuDxT(
"nuDxT", NULL, 50, 0.0, 1000.0,
getSize(
T) - 1,
T);
316 TH2D* nuDxT_tmp = (TH2D*) nuDxT.Clone(
"nuDxT.tmp");
329 TH2D muExR(
"muExR", NULL, nx,
xmin, xmax, 30, 0.0, 300.0);
330 TH2D* muExR_tmp = (TH2D*) muExR.Clone(
"muExR.tmp");
332 TH2D muRxU(
"muRxU", NULL, 15, 0.0, 300.0, 100, -1.0, +1.0);
333 TH2D* muRxU_tmp = (TH2D*) muRxU.Clone(
"muRxU.tmp");
335 TH2D muRxT(
"muRxT", NULL, 15, 0.0, 300.0,
getSize(
T) - 1,
T);
336 TH2D* muRxT_tmp = (TH2D*) muRxT.Clone(
"muRxT.tmp");
347 while (inputFile.hasNext()) {
349 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
351 const Evt*
event = inputFile.next();
359 hits.Fill(
log10((Double_t) event->mc_hits.size()));
362 trks.Fill(track->type);
383 const int type = hit->type;
384 const double t1 =
getTime(*hit);
385 const double npe =
getNPE (*hit);
387 npe_pmt[hit->pmt_id].put(npe);
389 npe_type[0] .put(npe);
390 npe_type[type].put(npe);
392 if (hit_types.empty() || hit_types.count(type) != 0) {
395 event->mc_trks.end(),
398 if (track == event->mc_trks.end()) {
399 ERROR(
"Hit " << *hit <<
" has no origin." << endl);
403 if (count_if(event->mc_trks.begin(),
404 event->mc_trks.end(),
406 ERROR(
"Hit " << *hit <<
" has ambiguous origin." << endl);
410 job.Fill((
double) track->type, npe);
412 if (router.hasPMT(hit->pmt_id)) {
414 const JPMT& pmt = router.getPMT(hit->pmt_id);
420 const double E = muon.
getE();
421 const double x =
log10(E);
423 const double t0 = muon.
getT (pmt);
424 const double ct1 = muon.
getDot (pmt);
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));
432 const double E = neutrino.
getE();
433 const double x =
log10(E);
435 const double t0 = vertex.
getT(pmt);
437 const double ct1 = vertex.
getDot(pmt);
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));
454 for (map_type::const_iterator i = npe_pmt.begin(); i != npe_pmt.end(); ++i) {
455 npe_per_pmt.Fill(i->second.getTotal());
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());
473 const double E = muon.
getE();
474 const double x =
log10(E);
476 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
480 muExR_tmp->Fill(x, R, module->size());
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));
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));
504 const double E = neutrino.
getE();
505 const double x =
log10(E);
507 if (inst_vol.is_inside(vertex))
508 hits_per_E_in .Fill(x, NPE);
510 hits_per_E_out.Fill(x, NPE);
512 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
515 const double ct0 = neutrino.
getDot(module->getPosition());
517 nuExD_tmp->Fill(x, D, module->size());
518 nuExc_tmp->Fill(x, ct0, module->size());
519 nuDxc_tmp->Fill(D, ct0, module->size());
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));
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));
543 TH1D *job_sorted = makeSortedH1(&job,
"hits_by_pdg");
544 TH1D *trks_sorted = makeSortedH1(&trks,
"trks_sorted");
546 if (inputFile.getCounter() != 0) {
548 const Double_t W = 1.0 / ((Double_t) inputFile.getCounter());
550 for (TH1D* p : { &hits, &npe_per_pmt, &job, &trks, job_sorted, trks_sorted }) {
554 for (JManager_t::iterator i = npe_per_type.begin(); i != npe_per_type.end(); ++i) {
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);
564 muExR.Divide(muExR_tmp);
565 muRxU.Divide(muRxU_tmp);
566 muRxT.Divide(muRxT_tmp);
576 out << hits << job << *job_sorted << trks << *trks_sorted << hits_per_E_in << hits_per_E_out << npe_per_type << npe_per_pmt;
578 out << nuExD << nuExc << nuDxc << nuDxU << nuDxT;
579 out << muExR << muRxU << muRxT;
Router for direct addressing of PMT data in detector data structure.
Utility class to parse command line options.
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
JTrack3E getTrack(const Trk &track)
Get track.
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
double getDot(const JAxis3D &axis) const
Get cosine angle of impact of Cherenkov light on PMT.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
double getTime(const Hit &hit)
Get true time of hit.
double getDistance(const JVector3D &pos) const
Get distance to point.
size_t getSize(T(&array)[N])
Get size of c-array.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
Auxiliary class for defining the range of iterations of objects.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
double getE() const
Get energy.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Data structure for PMT geometry, calibration and status.
const JPosition3D & getPosition() const
Get position.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
JVertex3D getVertex() const
Get vertex of this track.
then JCookie sh JDataQuality D $DETECTOR_ID R
double getDistance(const JVector3D &pos) const
Get distance.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
double getNPE(const Hit &hit)
Get true charge of hit.
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
do set_variable DETECTOR_TXT $WORKDIR detector
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
do echo Generating $dir eval D
double getDot(const JAxis3D &axis) const
Get cosine angle of impact of Cherenkov light on PMT.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.