Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JMakePDF.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <fstream>
4#include <iomanip>
5#include <set>
6#include <map>
7
10#include "JPhysics/JPDF.hh"
11#include "JPhysics/JPDFTable.hh"
12#include "JPhysics/Antares.hh"
13#include "JPhysics/KM3NeT.hh"
14
15#include "Jeep/JParser.hh"
16#include "Jeep/JMessage.hh"
17
18
19/**
20 * Scaling of absorption and scattering length.
21 */
24
25
26inline double getAbsorptionLength(const double lambda)
27{
28 return absorptionLengthFactor * NAMESPACE::getAbsorptionLength(lambda);
29}
30
31
32inline double getScatteringLength(const double lambda)
33{
34 return scatteringLengthFactor * NAMESPACE::getScatteringLength(lambda);
35}
36
37
38/**
39 * \file
40 *
41 * Program to create interpolation tables of the PDF of the arrival time of the Cherenkov light from a muon.
42 *
43 * The PDFs are tabulated as a function of <tt>(R, theta, phi, t)</tt>, where:
44 * - <tt>R</tt> is the minimal distance of approach of the muon to the PMT;
45 * - <tt>(theta, phi)</tt> the orientation of the PMT; and
46 * - <tt>t</tt> the arrival time of the light with respect to the Cherenkov hypothesis.
47 *
48 * The orientation of the PMT is defined in the coordinate system in which
49 * the muon travels along the z-axis and the PMT is located in the x-z plane.
50 * \author mdejong
51 */
52int main(int argc, char **argv)
53{
54 using namespace std;
55 using namespace JPP;
56
57 string outputFile;
59 double epsilon;
60 int function;
61 set<double> R; // distance [m]
62 int debug;
63
64 try {
65
66 JParser<> zap("Program to create interpolation tables of the PDF of the arrival time of the Cherenkov light from a muon.");
67
68 zap['o'] = make_field(outputFile);
69 zap['n'] = make_field(numberOfPoints, "points for integration") = 25;
70 zap['e'] = make_field(epsilon, "precision for integration") = 1.0e-10;
71 zap['A'] = make_field(absorptionLengthFactor, "scaling factor") = 1.0;
72 zap['S'] = make_field(scatteringLengthFactor, "scaling factor") = 1.0;
73 zap['F'] = make_field(function, "PDF type") =
74 DIRECT_LIGHT_FROM_MUON,
75 DIRECT_LIGHT_FROM_EMSHOWERS,
76 DIRECT_LIGHT_FROM_DELTARAYS,
77 SCATTERED_LIGHT_FROM_MUON,
78 SCATTERED_LIGHT_FROM_EMSHOWERS,
79 SCATTERED_LIGHT_FROM_DELTARAYS;
80 zap['R'] = make_field(R, "distance of approach [m]") = JPARSER::initialised();
81 zap['d'] = make_field(debug) = 0;
82
83 zap['F'] = JPARSER::not_initialised();
84
85 zap(argc, argv);
86 }
87 catch(const exception &error) {
88 FATAL(error.what() << endl);
89 }
90
91
92 typedef double (JPDF::*fcn)(const double,
93 const double,
94 const double,
95 const double) const;
96
97
98 // set global parameters
99
100 const double P_atm = NAMESPACE::getAmbientPressure();
101 const double wmin = getMinimalWavelength();
102 const double wmax = getMaximalWavelength();
103
104
105 const JPDF_C
106 pdf_c(NAMESPACE::getPhotocathodeArea(),
107 NAMESPACE::getQE,
108 NAMESPACE::getAngularAcceptance,
111 NAMESPACE::getScatteringProbability,
112 P_atm,
113 wmin,
114 wmax,
116 epsilon);
117
118
119 typedef JSplineFunction1D_t JFunction1D_t;
122 JPolint1FunctionalGridMap>::maplist JMapList_t;
124
125 typedef JPDFTransformer<3, JFunction1D_t::argument_type> JFunction3DTransformer_t;
127
128 JPDF_t pdf;
129
130
131 NOTICE("building multi-dimensional function object <" << function << ">... " << flush);
132
133
134 const double kmin = pdf_c.getKappa(wmax);
135 const double kmax = pdf_c.getKappa(wmin);
136 const double cmin = pdf_c.getKmin (wmax);
137
139
140 zmap[DIRECT_LIGHT_FROM_MUON] = make_pair((fcn) &JPDF::getDirectLightFromMuon, JFunction3DTransformer_t(21.5, 2, kmin, kmax, NAMESPACE::getAngularAcceptance, 0.001));
141 zmap[SCATTERED_LIGHT_FROM_MUON] = make_pair((fcn) &JPDF::getScatteredLightFromMuon, JFunction3DTransformer_t(35.0, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
142 zmap[DIRECT_LIGHT_FROM_EMSHOWERS] = make_pair((fcn) &JPDF::getDirectLightFromEMshowers, JFunction3DTransformer_t(21.5, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
143 zmap[SCATTERED_LIGHT_FROM_EMSHOWERS] = make_pair((fcn) &JPDF::getScatteredLightFromEMshowers, JFunction3DTransformer_t(35.0, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
144 zmap[DIRECT_LIGHT_FROM_DELTARAYS] = make_pair((fcn) &JPDF::getDirectLightFromDeltaRays, JFunction3DTransformer_t(21.5, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
145 zmap[SCATTERED_LIGHT_FROM_DELTARAYS] = make_pair((fcn) &JPDF::getScatteredLightFromDeltaRays, JFunction3DTransformer_t(35.0, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
146
147 if (zmap.find(function) == zmap.end()) {
148 FATAL("illegal function specifier" << endl);
149 }
150
151 fcn f = zmap[function].first; // PDF
152 JFunction3DTransformer_t transformer = zmap[function].second; // transformer
153
154
155 if (R.empty()) {
156 R.insert( 0.10);
157 R.insert( 0.30);
158 R.insert( 0.50);
159 R.insert( 1.00);
160 R.insert( 2.00);
161 R.insert( 3.00);
162 R.insert( 4.00);
163 R.insert( 5.00);
164 R.insert( 6.00);
165 R.insert( 7.00);
166 R.insert( 8.00);
167 R.insert( 9.00);
168 R.insert( 10.00);
169 R.insert( 11.00);
170 R.insert( 12.00);
171 R.insert( 13.00);
172 R.insert( 14.00);
173 R.insert( 15.00);
174 R.insert( 16.00);
175 R.insert( 17.00);
176 R.insert( 18.00);
177 R.insert( 19.00);
178 R.insert( 20.00);
179 R.insert( 22.00);
180 R.insert( 24.00);
181 R.insert( 26.00);
182 R.insert( 28.00);
183 R.insert( 30.00);
184 R.insert( 32.00);
185 R.insert( 34.00);
186 R.insert( 36.00);
187 R.insert( 38.00);
188 R.insert( 40.00);
189 R.insert( 42.00);
190 R.insert( 44.00);
191 R.insert( 46.00);
192 R.insert( 48.00);
193 R.insert( 50.00);
194 R.insert( 55.00);
195 R.insert( 60.00);
196 R.insert( 65.00);
197 R.insert( 70.00);
198 R.insert( 75.00);
199 R.insert( 80.00);
200 R.insert( 85.00);
201 R.insert( 90.00);
202 R.insert( 95.00);
203 R.insert(100.00);
204 R.insert(110.00);
205 R.insert(120.00);
206 R.insert(130.00);
207 R.insert(140.00);
208 R.insert(150.00);
209 R.insert(170.00);
210 R.insert(190.00);
211 R.insert(210.00);
212 R.insert(250.00);
213 }
214
215 set<double> X;
216
217 if (function == DIRECT_LIGHT_FROM_MUON) {
218
219 for (double buffer[] = { -0.01, -0.005, 0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, -1.0 }, *x = buffer; *x != -1.0; ++x) {
220 X.insert(0.0 + *x);
221 X.insert(1.0 - *x);
222 }
223
224 for (double x = 0.01; x < 0.1; x += 0.0025) {
225 X.insert(0.0 + x);
226 X.insert(1.0 - x);
227 }
228
229 for (double x = 0.10; x < 0.5; x += 0.010) {
230 X.insert(0.0 + x);
231 X.insert(1.0 - x);
232 }
233
234 } else {
235
236 X.insert( 0.00);
237 X.insert( 0.01);
238 X.insert( 0.02);
239 X.insert( 0.03);
240 X.insert( 0.04);
241 X.insert( 0.05);
242 X.insert( 0.06);
243 X.insert( 0.07);
244 X.insert( 0.08);
245 X.insert( 0.09);
246 X.insert( 0.10);
247 X.insert( 0.12);
248 X.insert( 0.15);
249 X.insert( 0.20);
250 X.insert( 0.25);
251 X.insert( 0.30);
252 X.insert( 0.40);
253 X.insert( 0.50);
254 X.insert( 0.60);
255 X.insert( 0.70);
256 X.insert( 0.80);
257 X.insert( 0.90);
258 X.insert( 1.00);
259 X.insert( 1.10);
260 X.insert( 1.20);
261 X.insert( 1.30);
262 X.insert( 1.40);
263 X.insert( 1.50);
264 X.insert( 1.60);
265 X.insert( 1.70);
266 X.insert( 1.80);
267 X.insert( 1.90);
268 X.insert( 2.00);
269 X.insert( 2.20);
270 X.insert( 2.40);
271 X.insert( 2.60);
272 X.insert( 2.80);
273 X.insert( 3.00);
274 X.insert( 3.25);
275 X.insert( 3.50);
276 X.insert( 3.75);
277 X.insert( 4.00);
278 X.insert( 4.25);
279 X.insert( 4.50);
280 X.insert( 4.75);
281 X.insert( 5.0);
282 X.insert( 6.0);
283 X.insert( 7.0);
284 X.insert( 8.0);
285 X.insert( 9.0);
286 X.insert( 10.0);
287 X.insert( 12.0);
288 X.insert( 14.0);
289 X.insert( 16.0);
290 X.insert( 18.0);
291 X.insert( 20.0);
292 X.insert( 25.0);
293 X.insert( 30.0);
294 X.insert( 40.0);
295 X.insert( 50.0);
296 X.insert( 60.0);
297 X.insert( 70.0);
298 X.insert( 80.0);
299 X.insert( 90.0);
300 X.insert(100.0);
301 X.insert(120.0);
302 X.insert(140.0);
303 X.insert(160.0);
304 X.insert(180.0);
305 X.insert(200.0);
306 X.insert(250.0);
307 X.insert(300.0);
308 X.insert(350.0);
309 X.insert(400.0);
310 X.insert(450.0);
311 X.insert(500.0);
312 X.insert(600.0);
313 X.insert(700.0);
314 X.insert(800.0);
315 X.insert(900.0);
316 X.insert(1200.0);
317 X.insert(1500.0);
318 }
319
320
321 const double grid = 5.0; // [deg]
322
323 const double alpha = 2.0 * sqrt(1.0 - cos(grid * PI / 180.0)); // azimuth angle unit step size
324
325
326 for (set<double>::const_iterator r = R.begin(); r != R.end(); ++r) {
327
328 const double R_m = *r;
329
330 const unsigned int number_of_theta_points = max(2u, (unsigned int) (180.0/(1.4 * grid)));
331
332 for (double theta = 0.0; theta <= PI + epsilon; theta += PI/number_of_theta_points) {
333
334 const unsigned int number_of_phi_points = max(2u, (unsigned int) (PI * sin(theta) / alpha));
335
336 for (double phi = 0.0; phi <= PI + epsilon; phi += PI/number_of_phi_points) {
337
338 JFunction1D_t& f1 = pdf[R_m][theta][phi];
339
340 const JArray_t array(R_m, theta, phi);
341
342 double t_old = transformer.getXn(array, *X.begin());
343 double y_old = 0.0;
344
345 for (set<double>::const_iterator x = X.begin(); x != X.end(); ++x) {
346
347 const double t = transformer.getXn(array, *x);
348 const double y = (pdf_c.*f)(R_m, theta, phi, t);
349
350 if (y != 0.0) {
351
352 if (*x < 0.0) {
353 WARNING("dt < 0 " << *x << ' ' << R_m << ' ' << t << ' ' << y << endl);
354 }
355
356 if (y_old == 0.0) {
357 f1[t_old] = y_old;
358 }
359
360 f1[t] = y;
361
362 } else {
363
364 if (y_old != 0.0) {
365 f1[t] = y;
366 }
367 }
368
369 t_old = t;
370 y_old = y;
371 }
372 }
373 }
374 }
375
376 pdf.transform(transformer);
377 pdf.compile();
378
379 NOTICE("OK" << endl);
380
381 try {
382
383 NOTICE("storing output to file " << outputFile << "... " << flush);
384
385 pdf.store(outputFile.c_str());
386
387 NOTICE("OK" << endl);
388 }
389 catch(const JException& error) {
390 FATAL(error.what() << endl);
391 }
392}
Properties of Antares PMT and deep-sea water.
string outputFile
Various implementations of functional maps.
int main(int argc, char **argv)
Definition JMakePDF.cc:52
double getAbsorptionLength(const double lambda)
Definition JMakePDF.cc:26
double getScatteringLength(const double lambda)
Definition JMakePDF.cc:32
double absorptionLengthFactor
Scaling of absorption and scattering length.
Definition JMakePDF.cc:22
double scatteringLengthFactor
Definition JMakePDF.cc:23
General purpose messaging.
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define WARNING(A)
Definition JMessage.hh:65
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
int numberOfPoints
Definition JResultPDF.cc:22
Properties of KM3NeT PMT and deep-sea water.
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
double getKappa(const double lambda) const
Get effective index of refraction for muon light.
double getKmin(const double lambda) const
Get smallest index of refraction for Bremsstrahlung light (i.e. point at which dt/dz = 0).
Multi-dimensional PDF table for arrival time of Cherenkov light.
Definition JPDFTable.hh:44
Template definition of transformer of the probability density function (PDF) of the time response of ...
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
Definition JPDF.hh:2185
One dimensional array of template objects with fixed length.
Definition JArray.hh:43
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:68
Empty structure for specification of parser element that is not initialised (i.e. does require input)...
Definition JParser.hh:74
Auxiliary data structure for muon PDF.
Definition JPDF_t.hh:26
Auxiliary class for recursive map list generation.
Definition JMapList.hh:109
Type definition of a 1st degree polynomial interpolation based on a JGridMap implementation.
Type definition of a 1st degree polynomial interpolation based on a JMap implementation.
Type definition of a spline interpolation method based on a JCollection with double result type.