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.