53{
56
60 int function;
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
70 zap[
'e'] =
make_field(epsilon,
"precision for integration") = 1.0e-10;
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;
82
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
99
100 const double P_atm = NAMESPACE::getAmbientPressure();
103
104
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
124
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;
152 JFunction3DTransformer_t transformer = zmap[function].second;
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
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;
322
323 const double alpha = 2.0 * sqrt(1.0 - cos(grid * PI / 180.0));
324
325
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
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) {
358 }
359
361
362 } else {
363
364 if (y_old != 0.0) {
366 }
367 }
368
369 t_old = t;
371 }
372 }
373 }
374 }
375
376 pdf.transform(transformer);
377 pdf.compile();
378
380
381 try {
382
384
386
388 }
391 }
392}
double getAbsorptionLength(const double lambda)
double getScatteringLength(const double lambda)
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
virtual const char * what() const override
Get error message.
Utility class to parse command line options.
Multi-dimensional PDF table for arrival time of Cherenkov light.
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
const JPolynome f1(1.0, 2.0, 3.0)
Function.
double getMinimalWavelength()
Get minimal wavelength for PDF evaluations.
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
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)...
Empty structure for specification of parser element that is not initialised (i.e. does require input)...
Auxiliary data structure for muon PDF.