77{
   80 
   82  
   84  string      detectorFile;
   86  uint        fix_bug;
   88 
   89  try {
   90 
   91    JParser<> zap(
"Program to histogram event-by-event data of shower light for making PDFs.");
 
   92 
   95    
  100    
  101    if (zap.read(argc, argv) != 0)
  102      return 1;
  103  }
  104  catch(const exception &error) {
  105    FATAL(error.what() << endl);
 
  106  }
  107 
  109 
  111    sort(particles.begin(), particles.end());
  112    string prefix_t = "";
  114      prefix_t += 
to_string((
long long int)*ptype) + 
"_";
 
  115    }
  116    prefix_t.erase(prefix_t.size() - 1);
  117    string::size_type pos_1 = 
outputFile.find(
'%');
 
  119  }
  120  
  121  try {
  123  }
  126  }
  127 
  129 
  131 
  132  NOTICE(
"Apply detector offset " << offset << endl);
 
  133 
  135 
  137  
  138  const double P_atm = NAMESPACE::getAmbientPressure();
  141 
  143 
  144  const double ng[] = { dispersion.getIndexOfRefractionGroup(wmax),
  145                        dispersion.getIndexOfRefractionGroup(wmin) };
  146 
  148 
  155  
  157 
  158  JMultiHistogram_t h0;   
  159  JMultiHistogram_t h1;   
  160 
  161  h1.transformer.reset(
new JFunction5DTransformer_t(21.5, 2, ng[0], 0.0, 
JGeant(
JGeanx(1.00, -2.2)), 1e-2, NAMESPACE::getAngularAcceptance, 0.05));
 
  162  
  164 
  166 
  168    C.insert(i->getX());
  169  }
  170 
  171  C.insert(-1.01);
  172  C.insert(-1.00);
  173  C.insert( 1.00);
  174  C.insert( 1.01);
  175 
  176  const double E_b[] = {0.01, 0.2, 0.4, 0.6, 0.8, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 25.0, 30.0, 40.0, 55.0, 70.0, 85.0, 100.0};
  177 
  178  const double R[]   = {0.0, 1.0, 2.5, 5.0, 7.5, 10.0, 12.5, 15.0, 17.5, 20.0, 25.0, 30.0, 35.0, 40.0, 50.0, 65.0, 80.0};
  179  const double Dmax_m = R[sizeof(R)/sizeof(R[0]) - 1]; 
  180 
  181  for (int iE = 0; iE != sizeof(E_b)/sizeof(E_b[0]); ++iE) {
  182 
  183    const double E_m = E_b[iE];
  184 
  185    for (int i = 0; i != sizeof(R)/sizeof(R[0]); ++i) {
  186 
  187      const double R_m = R[i];
  188 
  190 
  191        const double cd = *c;
  192        
  193        const double grid  = 10.0 +  0.0 * R_m/100.0;                    
  194        const double alpha = 2.0 * sqrt(1.0 - cos(grid * PI / 180.0));   
  195 
  196        const int    number_of_theta_points = (max(2, (int) (180.0/(1.4 * grid))));
  197        const double theta_step             = PI / (number_of_theta_points + 1);
  198        
  199        for (double theta = -0.5*theta_step; theta < PI + theta_step; theta += theta_step) {      
  200          const int    number_of_phi_points = (max(2, (int) (PI * sin(theta) / alpha)));
  201          const double phi_step             = PI / (number_of_phi_points + 1);
  202          
  203          for (double phi = -0.5*phi_step; phi < PI + phi_step; phi += phi_step) {
  204 
  205            for (JMultiHistogram_t* p : { &h0, &h1 }) {
  206              (*p)[E_m][R_m][cd][theta][phi];
  207            }
  208          }
  209        }
  210      }
  211    }
  212  }
  213  
  214  double buffer[] = {-15.0,-10.0,-7.5,-5,-4,-3,-2,-1.5,-1.0,-0.5,-0.1, 0.0,0.1, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.5, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 85.0, 100.0 };
  215  for (JMultiHistogram_t::super_iterator
  216         i1 = h1.super_begin(); i1 != h1.super_end(); ++i1) {
  217    for (
int j = 0; 
j != 
sizeof(buffer)/
sizeof(buffer[0]); ++
j) {
 
  218      i1.getValue()[buffer[
j]];
 
  219    }
  220  }
  221  
  222  
  223  long long int h0_fillcount = 0;
  224  long long int h1_fillcount = 0;
  225  
  227 
  228    
  229    
  230 
  231    const Evt* 
event = inputFile.
next();
 
  233    
  235 
  236    
  237    
  238    
  239    if(fix_bug == 0){
  240      for (vector<Trk>::const_iterator i = mc_tracks->begin(); i != mc_tracks->end(); ++i) {
  241        hit_remap.push_back(i->id);
  242      }
  243    } else if(fix_bug == 1){
  245    } else if(fix_bug == 2){
  246      bool skipevent = false;
  247      for (vector<Trk>::const_iterator i = mc_tracks->begin(); i != mc_tracks->end(); ++i) {
  248        if(i->type == 14){
  249          skipevent = true;
  250          break;
  251        }
  252        hit_remap.push_back(i->id);
  253      }
  254      if(skipevent) continue;
  255    }
  256    
  257 
  258    double t0 = (*mc_tracks)[1].t;
  259    
  260    for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit)  {
  261      
  262      try {
  263        
  264        if(hit->origin >= (int)(*mc_tracks).size()){
  265          std::out_of_range err("Hit origin not in tracklist. Avoided segfault");
  266          throw err;
  267        }
  268 
  269        Int_t corr_origin  = hit_remap[hit->origin];
  270        Trk curr_track     = (*mc_tracks)[corr_origin]; 
 
  273        JAxis3D axis = pmtRouter.getPMT(hit->pmt_id);           
 
  275        
  276        const double E     = curr_track.
E;
 
  279        const double cd    = axis.
getZ()/D_m;
 
  280        const double theta = axis.
getTheta();
 
  281        const double phi   = fabs(axis.
getPhi());
 
  282        const double dt    = 
getTime(*hit) - t1;
 
  283        const double npe   = 
getNPE (*hit);
 
  284 
  285        if(D_m < Dmax_m){
  286          h1.fill(E, D_m, cd, theta, phi, dt, npe);
  287          h1_fillcount += 1;
  288        }       
  289      }
  290      catch(const exception& error) {
  291        std::cout << 
"Fatal error for event: " << inputFile.
getCounter() << std::endl;
 
  292        FATAL(error.what() << endl);
 
  293      }
  294    }
  295    
  296    
  297    for (vector<Trk>::const_iterator tr = event->mc_trks.begin() + 1; tr != event->mc_trks.end(); ++tr) {
  298      
  299      if(find(particles.begin(), particles.end(), tr->type) == particles.end()){
  300        continue;
  301      }
  302      
  303      
  304 
  305 
  308 
  309      for (JDetector::const_iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  310 
  312 
  314 
  316 
  318 
  319          for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
  320            
  323            
  325            h0_fillcount += 1;
  326          }
  327        }
  328      }
  329    }
  330    
  331    if(h1_fillcount > h0_fillcount){
  332      std::cout << "WARNING: recorded hits in normalization histogram that were not recorded in normalization histogram. This should not happen." << std::endl;
  333      std::cout << "h1_fillcount: " << h1_fillcount << ", h0_fillcount: " << h0_fillcount << std::endl;
  334    }
  335  };
  336  
  337  double integral = 0;
  338  for (JMultiHistogram_t::super_iterator i = h0.super_begin(); i != h0.super_end(); ++i) {
  339    integral+=i.getValue().getIntegral();
  340  }
  341  DEBUG(
"Integral:\t" << integral << endl);
 
  342 
  343  
  344 
  346  
  348 
  349  for (const JMultiHistogram_t* p : { &h0, &h1 }) {
  350    out.store(*p);
  351  }
  352 
  353  out.close();
  354  NOTICE(
"JHistHDE done. " << endl);
 
  355  return 1;
  356}
std::vector< Int_t > getHitRemapping(const std::vector< Trk > *tracklist)
 
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Router for direct addressing of PMT data in detector data structure.
 
void transform(const JAxis3D &axis)
Transform axis to reference frame of given axis.
 
Data structure for direction in three dimensions.
 
Data structure for position in three dimensions.
 
JPosition3D & rotate(const JRotation3D &R)
Rotate.
 
double getLength() const
Get length.
 
double getZ() const
Get z position.
 
JVector3D & sub(const JVector3D &vector)
Subtract vector.
 
double getTheta() const
Get theta angle.
 
double getPhi() const
Get phi angle.
 
Binary buffered file output.
 
Utility class to parse command line options.
 
Implementation of dispersion for water in deep sea.
 
Function object for the probability density function of photon emission from EM-shower as a function ...
 
Probability density function of photon emission from EM-shower as a function of cosine of the emissio...
 
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.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
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.
 
std::string to_string(const T &value)
Convert value to string.
 
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity.
 
double getMinimalWavelength()
Get minimal wavelength for PDF evaluations.
 
const double getInverseSpeedOfLight()
Get inverse speed of light.
 
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
 
static const double C
Physics constants.
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
const char * getTime()
Get current local time conform ISO-8601 standard.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
 
double E
Energy [GeV] (either MC truth or reconstructed)
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.