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);
225 if (detectorFile !=
"") {
246 NOTICE(
"Apply detector offset " << center << endl);
257 NOTICE(
"JDomino: Instrumented volume dimensions (x, y, r, zmin, zmax): " << inst_vol << endl);
272 if (header.is_valid(&JHead::cut_nu)) {
273 xmin = log10(header.cut_nu.Emin);
274 xmax = log10(header.cut_nu.Emax);
275 }
else if (header.is_valid(&JHead::cut_in)) {
276 xmin = log10(header.cut_in.Emin);
277 xmax = log10(header.cut_in.Emax);
279 const int nx = (int) ((xmax - xmin) / 0.1);
281 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,
282 +75.0, +100.0, +150.0, +200.0, +250.0, +300.0, +400.0, +500.0, 1000.0 };
288 TH1D hits(
"hits", NULL, 100, 0.0, 8.0);
289 TH1D trks(
"trks", NULL, 10001, -5000.5, 5000.5);
290 TH1D job (
"job" , NULL, 10001, -5000.5, 5000.5);
292 TProfile hits_per_E_in (
"hits_per_E_in",
"average number of hits per E_{#nu} inside instrumented volume", nx, xmin, xmax);
293 TProfile hits_per_E_out(
"hits_per_E_out",
"average number of hits per E_{#nu} outside instrumented volume", nx, xmin, xmax);
297 JManager_t npe_per_type(
new TH1D(
"npe[%]", NULL, 5000, 0.5, 5000.5),
'%', ios::fmtflags(ios::showpos));
299 TH1D npe_per_pmt (
"pmt", NULL, 100001, -0.5, 100000.5);
306 TH2D nuExD(
"nuExD", NULL, nx, xmin, xmax, 100, 0.0, 1000.0);
307 TH2D* nuExD_tmp = (TH2D*) nuExD.Clone(
"nuExD.tmp");
309 TH2D nuExc(
"nuExc", NULL, nx, xmin, xmax, 100, -1.0, +1.0);
310 TH2D* nuExc_tmp = (TH2D*) nuExc.Clone(
"nuExc.tmp");
312 TH2D nuDxc(
"nuDxc", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0);
313 TH2D* nuDxc_tmp = (TH2D*) nuDxc.Clone(
"nuDxc.tmp");
315 TH2D nuDxU(
"nuDxU", NULL, 50, 0.0, 1000.0, 100, -1.0, +1.0);
316 TH2D* nuDxU_tmp = (TH2D*) nuDxU.Clone(
"nuDxU.tmp");
318 TH2D nuDxT(
"nuDxT", NULL, 50, 0.0, 1000.0,
getSize(
T) - 1,
T);
319 TH2D* nuDxT_tmp = (TH2D*) nuDxT.Clone(
"nuDxT.tmp");
332 TH2D muExR(
"muExR", NULL, nx, xmin, xmax, 30, 0.0, 300.0);
333 TH2D* muExR_tmp = (TH2D*) muExR.Clone(
"muExR.tmp");
335 TH2D muRxU(
"muRxU", NULL, 15, 0.0, 300.0, 100, -1.0, +1.0);
336 TH2D* muRxU_tmp = (TH2D*) muRxU.Clone(
"muRxU.tmp");
338 TH2D muRxT(
"muRxT", NULL, 15, 0.0, 300.0,
getSize(
T) - 1,
T);
339 TH2D* muRxT_tmp = (TH2D*) muRxT.Clone(
"muRxT.tmp");
350 while (inputFile.hasNext()) {
352 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
354 const Evt*
event = inputFile.next();
362 hits.Fill(log10((Double_t) event->mc_hits.size()));
365 trks.Fill(track->type);
386 const int type = hit->type;
387 const double t1 = hit->pure_t;
388 const double npe = hit->pure_a;
390 npe_pmt[hit->pmt_id].put(npe);
392 npe_type[0] .put(npe);
393 npe_type[type].put(npe);
395 if (hit_types.empty() || hit_types.count(type) != 0) {
398 event->mc_trks.end(),
401 if (track == event->mc_trks.end()) {
402 ERROR(
"Hit " << *hit <<
" has no origin." << endl);
406 if (count_if(event->mc_trks.begin(),
407 event->mc_trks.end(),
409 ERROR(
"Hit " << *hit <<
" has ambiguous origin." << endl);
413 job.Fill((
double) track->type, npe);
415 if (router.hasPMT(hit->pmt_id)) {
423 const double E = muon.
getE();
424 const double x = log10(E);
426 const double t0 = muon.
getT (pmt);
427 const double ct1 = muon.
getDot (pmt);
429 muExR.Fill(x, R, getMuonWeight(E, npe));
430 muRxU.Fill(R, ct1, getMuonWeight(E, R, npe));
431 muRxT.Fill(R, t1 - t0, getMuonWeight(E, R, npe));
435 const double E = neutrino.
getE();
436 const double x = log10(E);
438 const double t0 = vertex.
getT(pmt);
440 const double ct1 = vertex.
getDot(pmt);
442 nuExD.Fill(x, D, getNeutrinoWeight(E, npe));
443 nuExc.Fill(x, ct0, getNeutrinoWeight(E, npe));
444 nuDxc.Fill(D, ct0, getNeutrinoWeight(E, D, npe));
445 nuDxU.Fill(D, ct1, getNeutrinoWeight(E, D, npe));
446 nuDxT.Fill(D, t1 - t0, getNeutrinoWeight(E, D, npe));
457 for (map_type::const_iterator i = npe_pmt.begin(); i != npe_pmt.end(); ++i) {
458 npe_per_pmt.Fill(i->second.getTotal());
461 for (map_type::const_iterator i = npe_type.begin(); i != npe_type.end(); ++i) {
462 npe_per_type[i->first]->Fill(i->second.getTotal());
476 const double E = muon.
getE();
477 const double x = log10(E);
479 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
483 muExR_tmp->Fill(x, R, module->size());
485 if (R < muRxU.GetXaxis()->GetXmax()) {
486 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++
pmt) {
487 muRxU_tmp->Fill(R, muon.
getDot(*pmt));
491 if (R < muRxT.GetXaxis()->GetXmax()) {
492 for (Int_t iy = 1; iy <= muRxT_tmp->GetYaxis()->GetNbins(); ++iy) {
493 muRxT_tmp->Fill(R, muRxT_tmp->GetYaxis()->GetBinCenter(iy), muRxT_tmp->GetYaxis()->GetBinWidth(iy));
507 const double E = neutrino.
getE();
508 const double x = log10(E);
510 if (inst_vol.is_inside(vertex))
511 hits_per_E_in .Fill(x, NPE);
513 hits_per_E_out.Fill(x, NPE);
515 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
518 const double ct0 = neutrino.
getDot(module->getPosition());
520 nuExD_tmp->Fill(x, D, module->size());
521 nuExc_tmp->Fill(x, ct0, module->size());
522 nuDxc_tmp->Fill(D, ct0, module->size());
524 if (D < nuDxU.GetXaxis()->GetXmax()) {
525 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++
pmt) {
526 nuDxU_tmp->Fill(D, neutrino.
getDot(*pmt));
530 if (D < nuDxT.GetXaxis()->GetXmax()) {
531 for (Int_t iy = 1; iy <= nuDxT_tmp->GetYaxis()->GetNbins(); ++iy) {
532 nuDxT_tmp->Fill(D, nuDxT_tmp->GetYaxis()->GetBinCenter(iy), nuDxT_tmp->GetYaxis()->GetBinWidth(iy));
546 TH1D *job_sorted = makeSortedH1(&job,
"hits_by_pdg");
547 TH1D *trks_sorted = makeSortedH1(&trks,
"trks_sorted");
549 if (inputFile.getCounter() != 0) {
551 const Double_t W = 1.0 / ((Double_t) inputFile.getCounter());
553 for (TH1D* buffer[] = { &hits, &npe_per_pmt, &job, &trks, job_sorted, trks_sorted, NULL }, **i = buffer; *i != NULL; ++i) {
557 for (JManager_t::iterator i = npe_per_type.begin(); i != npe_per_type.end(); ++i) {
561 nuExD.Divide(nuExD_tmp);
562 nuExc.Divide(nuExc_tmp);
563 nuDxc.Divide(nuDxc_tmp);
564 nuDxU.Divide(nuDxU_tmp);
565 nuDxT.Divide(nuDxT_tmp);
567 muExR.Divide(muExR_tmp);
568 muRxU.Divide(muRxU_tmp);
569 muRxT.Divide(muRxT_tmp);
579 out << hits << job << *job_sorted << trks << *trks_sorted << hits_per_E_in << hits_per_E_out << npe_per_type << npe_per_pmt;
581 out << nuExD << nuExc << nuDxc << nuDxU << nuDxT;
582 out << muExR << muRxU << muRxT;
Router for direct addressing of PMT data in detector data structure.
Utility class to parse command line options.
do echo Generating $dir eval D
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)...
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT parameters.
double getDistance(const JVector3D &pos) const
Get distance to point.
size_t getSize(T(&array)[N])
Get size of c-array.
esac $JPP_DIR examples JDetector JTransitTime o $OUTPUT_FILE n N $NPE T $TTS_NS d $DEBUG for HISTOGRAM in tts tt2 pmt
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
Auxiliary class to manage set of compatible ROOT objects (e.g.
Auxiliary class for defining the range of iterations of objects.
double getE() const
Get energy.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
do set_variable OUTPUT_DIRECTORY $WORKDIR T
Data structure for PMT geometry and calibration.
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
const JPosition3D & getPosition() const
Get position.
then usage $script[distance] fi case set_variable R
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
JVertex3D getVertex() const
Get vertex of this track.
double getDistance(const JVector3D &pos) const
Get distance.
General purpose class for object reading from a list of file names.
Data structure for position in three dimensions.
const JLimit & getLimit() const
Get limit.
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
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.
then usage $script[input file[working directory[option]]] nWhere option can be E
#define DEBUG(A)
Message macros.