53{
56
59 double epsilon;
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
86 }
87 catch(const exception &error) {
89 }
90
91
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,
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));
146
147 if (zmap.find(function) == zmap.end()) {
148 FATAL(
"illegal function specifier" <<
endl);
149 }
150
151 fcn f = zmap[function].first;
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
331
333
335
337
338 JFunction1D_t& f1 = pdf[
R_m][theta][phi];
339
341
342 double t_old = transformer.getXn(
array, *X.begin());
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
358 }
359
361
362 } else {
363
366 }
367 }
368
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.
Template definition of a multi-dimensional oscillation probability interpolation table.
Utility class to parse command line options.
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
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.