Jpp  17.3.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
26 inline double getAbsorptionLength(const double lambda)
27 {
29 }
30 
31 
32 inline double getScatteringLength(const double lambda)
33 {
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  */
52 int main(int argc, char **argv)
53 {
54  using namespace std;
55  using namespace JPP;
56 
57  string outputFile;
58  int numberOfPoints;
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") =
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
112  P_atm,
113  wmin,
114  wmax,
116  epsilon);
117 
118 
119  typedef JSplineFunction1D_t JFunction1D_t;
120  typedef JMAPLIST<JPolint1FunctionalMap,
121  JPolint1FunctionalGridMap,
122  JPolint1FunctionalGridMap>::maplist JMapList_t;
123  typedef JPDFTable<JFunction1D_t, JMapList_t> JPDF_t;
124 
125  typedef JPDFTransformer<3, JFunction1D_t::argument_type> JFunction3DTransformer_t;
126  typedef JArray<3, JFunction1D_t::argument_type> JArray_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 }
Utility class to parse command line options.
Definition: JParser.hh:1517
int main(int argc, char *argv[])
Definition: Main.cc:15
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
Definition: JDataQuality.sh:76
Properties of Antares PMT and deep-sea water.
double absorptionLengthFactor
Scaling of absorption and scattering length.
Definition: JDrawPD0.cc:24
direct light from EM showers
Definition: JPDFTypes.hh:29
double getScatteringProbability(const double x)
Function to describe light scattering in water.
Definition: Antares.hh:210
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
double getMinimalWavelength()
Get minimal wavelength for PDF evaluations.
Definition: JPDFToolkit.hh:26
data_type r[M+1]
Definition: JPolint.hh:779
string outputFile
direct light from muon
Definition: JPDFTypes.hh:26
Various implementations of functional maps.
then usage set_variable ACOUSTICS_WORKDIR $WORKDIR set_variable FORMULA sin([0]+2 *$PI *([1]+[2]*x)*x)" set_variable DY 1.0e-8 mkdir $WORKDIR for DETECTOR in $DETECTORS[*]
const JPolynome f1(1.0, 2.0, 3.0)
Function.
scattered light from muon
Definition: JPDFTypes.hh:27
Properties of KM3NeT PMT and deep-sea water.
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
Definition: JPDFToolkit.hh:37
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
double getQE(const double R, const double mu)
Get QE for given ratio of hit probabilities and expectation value of the number of photo-electrons...
double getAmbientPressure()
Get ambient pressure.
Definition: Antares.hh:40
scattered light from delta-rays
Definition: JPDFTypes.hh:33
#define NOTICE(A)
Definition: JMessage.hh:64
static const double PI
Mathematical constants.
double getPhotocathodeArea()
Get photo-cathode area of PMT.
Definition: Antares.hh:51
scattered light from EM showers
Definition: JPDFTypes.hh:30
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
direct light from delta-rays
Definition: JPDFTypes.hh:32
Empty structure for specification of parser element that is not initialised (i.e. does require input)...
Definition: JParser.hh:89
then JCookie sh JDataQuality D $DETECTOR_ID R
Definition: JDataQuality.sh:41
double getAbsorptionLength(const double lambda)
Get absorption length.
Definition: Antares.hh:63
Utility class to parse command line options.
double getScatteringLength(const double lambda)
Get scattering length.
Definition: Antares.hh:148
int numberOfPoints
Definition: JResultPDF.cc:22
double scatteringLengthFactor
Definition: JDrawPD0.cc:25
no fit printf nominal n $STRING awk v X
double u[N+1]
Definition: JPolint.hh:776
then echo WARNING
Definition: JTuneHV.sh:91
const double epsilon
Definition: JQuadrature.cc:21
int debug
debug level
double getAngularAcceptance(const double x)
Angular acceptence of PMT.
Definition: JDrawLED.cc:68
Auxiliary data structure for muon PDF.
Definition: JPDF_t.hh:26