54   inline double getMuonWeight(
const double E,
 
   71   inline double getMuonWeight(
const double E,
 
   79     return R * exp(+R/l_att) * getMuonWeight(E, npe);
 
   90   inline double getNeutrinoWeight(
const double E,
 
  105   inline double getNeutrinoWeight(
const double E,
 
  109     static const double l_att = 45.0;                    
 
  111     return D*D * exp(+D/l_att) * getNeutrinoWeight(E, npe);
 
  126     return first.second > second.second;
 
  137   inline TH1D* makeSortedH1(TH1D* in, 
const TString& name)
 
  146     for (Int_t ix = 1; ix <= in->GetXaxis()->GetNbins(); ++ix) {
 
  148       const Int_t    
x = (Int_t) in->GetXaxis()->GetBinCenter(ix);
 
  149       const Double_t 
y = in->GetBinContent(ix);
 
  152         data.push_back(make_pair(
x, 
y));
 
  158     sort(
data.begin(), 
data.end(), compare);
 
  162     TH1D* out = 
new TH1D(name, NULL, 
data.size(), -0.5, 
data.size() - 0.5);
 
  164     for (Int_t i = 0; i < (Int_t) 
data.size(); i++) {
 
  166       const Int_t ix = i + 1;
 
  168       out->GetXaxis()->SetBinLabel(ix, 
MAKE_CSTRING(fixed << setprecision(0) << 
data[i].first));
 
  169       out->SetBinContent(ix, 
data[i].second);
 
  183 int main(
int argc, 
char **argv)
 
  193   JLimit_t&      numberOfEvents = inputFile.getLimit();
 
  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 " << offset << endl); 
 
  255   NOTICE(
"JDomino: Instrumented volume dimensions (x, y, r, zmin, zmax): " << inst_vol << endl);
 
  269   if        (header.
is_valid(&JHead::cut_nu)) {
 
  272   } 
else if (header.
is_valid(&JHead::cut_in)) {
 
  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");                
 
  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)) {
 
  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);
 
  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"); 
 
  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;
 
Data structure for detector geometry and calibration.
 
Dynamic ROOT object management.
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Scanning of objects from multiple files according a format that follows from the extension of each fi...
 
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
 
I/O formatting auxiliaries.
 
#define MAKE_CSTRING(A)
Make C-string.
 
ROOT TTree parameter settings of various packages.
 
bool is_valid(T JHead::*pd) const
Check validity of given data member in JHead.
 
Router for direct addressing of PMT data in detector data structure.
 
bool hasPMT(const JObjectID &id) const
Has PMT.
 
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT.
 
Data structure for PMT geometry, calibration and status.
 
double getDistance(const JVector3D &pos) const
Get distance.
 
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.
 
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
 
JVertex3D getVertex() const
Get vertex of this track.
 
double getE() const
Get energy.
 
double getDistance(const JVector3D &pos) const
Get distance to point.
 
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.
 
Utility class to parse command line options.
 
virtual double getB() const override
Get energy loss constant.
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
 
virtual bool hasNext() override
Check availability of next element.
 
counter_type getCounter() const
Get counter.
 
virtual const pointer_type & next() override
Get next element.
 
const Trk & get_neutrino(const Evt &evt)
Get incoming neutrino.
 
JTrack3E getTrack(const Trk &track)
Get track.
 
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
 
double getTime(const Hit &hit)
Get true time of hit.
 
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.
 
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.
 
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
 
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
 
double getSinThetaC()
Get average sine of Cherenkov angle of water corresponding to group velocity.
 
double geanc()
Equivalent muon track length per unit shower energy.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
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.
 
JRange_t E
Energy range [GeV].
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for defining the range of iterations of objects.
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.