91 JParser<> zap(
"Program to histogram event-by-event data of shower light for making PDFs.");
101 if (zap.read(argc, argv) != 0)
104 catch(
const exception &error) {
105 FATAL(error.what() << endl);
111 sort(particles.begin(), particles.end());
112 string prefix_t =
"";
114 prefix_t +=
to_string((
long long int)*ptype) +
"_";
116 prefix_t.erase(prefix_t.size() - 1);
117 string::size_type pos_1 =
outputFile.find(
'%');
132 NOTICE(
"Apply detector offset " << offset << endl);
144 const double ng[] = { dispersion.getIndexOfRefractionGroup(wmax),
145 dispersion.getIndexOfRefractionGroup(wmin) };
158 JMultiHistogram_t h0;
159 JMultiHistogram_t h1;
167 for (JQuadrature::const_iterator i = qeant.begin(); i != qeant.end(); ++i) {
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};
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];
181 for (
int iE = 0; iE !=
sizeof(E_b)/
sizeof(E_b[0]); ++iE) {
183 const double E_m = E_b[iE];
185 for (
int i = 0; i !=
sizeof(R)/
sizeof(R[0]); ++i) {
187 const double R_m = R[i];
191 const double cd = *c;
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));
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);
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);
203 for (
double phi = -0.5*phi_step; phi <
PI + phi_step; phi += phi_step) {
205 for (JMultiHistogram_t* p : { &h0, &h1 }) {
206 (*p)[E_m][R_m][cd][theta][phi];
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]];
223 long long int h0_fillcount = 0;
224 long long int h1_fillcount = 0;
231 const Evt*
event = inputFile.
next();
241 hit_remap.push_back(i->id);
243 }
else if(fix_bug == 1){
245 }
else if(fix_bug == 2){
246 bool skipevent =
false;
252 hit_remap.push_back(i->id);
254 if(skipevent)
continue;
258 double t0 = (*mc_tracks)[1].t;
264 if(hit->origin >= (
int)(*mc_tracks).size()){
265 std::out_of_range err(
"Hit origin not in tracklist. Avoided segfault");
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);
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);
286 h1.fill(E, D_m, cd, theta, phi, dt, npe);
290 catch(
const exception& error) {
291 std::cout <<
"Fatal error for event: " << inputFile.
getCounter() << std::endl;
292 FATAL(error.what() << endl);
299 if(find(particles.begin(), particles.end(), tr->type) == particles.end()){
309 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
319 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
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;
338 for (JMultiHistogram_t::super_iterator i = h0.super_begin(); i != h0.super_end(); ++i) {
339 integral+=i.getValue().getIntegral();
341 DEBUG(
"Integral:\t" << integral << endl);
349 for (
const JMultiHistogram_t* p : { &h0, &h1 }) {
354 NOTICE(
"JHistHDE done. " << endl);
double getAngularAcceptance(const double x)
Angular acceptence of PMT.
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.
const JPosition3D & getPosition() const
Get position.
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...
Template specialisation of JMultipleFileScanner for Monte Carlo header.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
double getAmbientPressure()
Get ambient pressure.
JDirection3D getDirection(const Vec &dir)
Get direction.
double getTime(const Hit &hit)
Get true time of hit.
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.
static const double PI
Mathematical constants.
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.
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.