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.