Jpp test-rotations-new
the software that should make you happy
Loading...
Searching...
No Matches
JMakePD0.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#include <cmath>
8
11#include "JTools/JQuadrature.hh"
12#include "JPhysics/JPDF.hh"
13#include "JPhysics/JPDFTable.hh"
14#include "JPhysics/Antares.hh"
15#include "JPhysics/KM3NeT.hh"
16
17#include "Jeep/JParser.hh"
18#include "Jeep/JMessage.hh"
19
20
21/**
22 * Scaling of absorption and scattering length.
23 */
26
27
28inline double getAbsorptionLength(const double lambda)
29{
30 return absorptionLengthFactor * NAMESPACE::getAbsorptionLength(lambda);
31}
32
33
34inline double getScatteringLength(const double lambda)
35{
36 return scatteringLengthFactor * NAMESPACE::getScatteringLength(lambda);
37}
38
39
40/**
41 * \file
42 *
43 * Program to create interpolation tables of the PDF of the arrival time of the Cherenkov light from a bright point.
44 *
45 * The PDFs are tabulated as a function of <tt>(D, cos(theta), t)</tt>, where:
46 * - <tt>D</tt> is the distance between the bright point and the PMT;
47 * - <tt>cos(theta)</tt> the cosine of the PMT angle;
48 * - <tt>t</tt> the arrival time of the light with respect to the Cherenkov hypothesis.
49 *
50 * The orientation of the PMT is defined in the coordinate system in which
51 * the position of the bright point and that of the PMT are along the x-axis and the PMT is oriented in the x-y plane.
52 * \author mdejong
53 */
54int main(int argc, char **argv)
55{
56 using namespace std;
57 using namespace JPP;
58
59 string outputFile;
61 double epsilon;
62 int function;
63 set<double> D; // distance [m]
64 int debug;
65
66 try {
67
68 JParser<> zap("Program to create interpolation tables of the PDF of the arrival time of the Cherenkov light from a bright point.");
69
70 zap['o'] = make_field(outputFile);
71 zap['n'] = make_field(numberOfPoints, "points for integration") = 25;
72 zap['e'] = make_field(epsilon, "precision for integration") = 1.0e-10;
73 zap['A'] = make_field(absorptionLengthFactor, "scaling factor") = 1.0;
74 zap['S'] = make_field(scatteringLengthFactor, "scaling factor") = 1.0;
75 zap['F'] = make_field(function, "PDF type") =
76 DIRECT_LIGHT_FROM_BRIGHT_POINT,
77 SCATTERED_LIGHT_FROM_BRIGHT_POINT;
78 zap['D'] = make_field(D, "distance [m]") = JPARSER::initialised();
79 zap['d'] = make_field(debug) = 0;
80
81 zap['F'] = JPARSER::not_initialised();
82
83 zap(argc, argv);
84 }
85 catch(const exception &error) {
86 FATAL(error.what() << endl);
87 }
88
89
90 typedef double (JPDF::*fcn)(const double,
91 const double,
92 const double) const;
93
94
95 // set global parameters
96
97 const double P_atm = NAMESPACE::getAmbientPressure();
98 const double wmin = getMinimalWavelength();
99 const double wmax = getMaximalWavelength();
100
101
102 const JPDF_C
103 pdf_c(NAMESPACE::getPhotocathodeArea(),
104 NAMESPACE::getQE,
105 NAMESPACE::getAngularAcceptance,
108 NAMESPACE::getScatteringProbability,
109 P_atm,
110 wmin,
111 wmax,
113 epsilon);
114
115
116 typedef JSplineFunction1D_t JFunction1D_t;
118 JPolint1FunctionalGridMap>::maplist JMapList_t;
120
121 typedef JPDFTransformer<2, JFunction1D_t::argument_type> JFunction2DTransformer_t;
123
124 JPDF_t pdf;
125
126
127 NOTICE("building multi-dimensional function object <" << function << ">... " << flush);
128
129 const double ng[] = { pdf_c.getIndexOfRefractionGroup(wmax),
130 pdf_c.getIndexOfRefractionGroup(wmin) };
131
133
134 zmap[DIRECT_LIGHT_FROM_BRIGHT_POINT] = make_pair((fcn) &JPDF::getDirectLightFromBrightPoint, JFunction2DTransformer_t(21.5, 2, ng[0], ng[1]));
135 zmap[SCATTERED_LIGHT_FROM_BRIGHT_POINT] = make_pair((fcn) &JPDF::getScatteredLightFromBrightPoint, JFunction2DTransformer_t(21.5, 2, ng[0], 0.0));
136
137 if (zmap.find(function) == zmap.end()) {
138 FATAL("illegal function specifier" << endl);
139 }
140
141 fcn f = zmap[function].first; // PDF
142 JFunction2DTransformer_t transformer = zmap[function].second; // transformer
143
144
145 if (D.empty()) {
146 D.insert( 0.10);
147 D.insert( 0.50);
148 D.insert( 1.00);
149 D.insert( 5.00);
150 D.insert( 10.00);
151 D.insert( 20.00);
152 D.insert( 30.00);
153 D.insert( 40.00);
154 D.insert( 50.00);
155 D.insert( 60.00);
156 D.insert( 70.00);
157 D.insert( 80.00);
158 D.insert( 90.00);
159 D.insert(100.00);
160 }
161
162 set<double> X; // time [ns]
163
164 if (function == DIRECT_LIGHT_FROM_BRIGHT_POINT) {
165
166 for (double buffer[] = { 0.0, 0.005, 0.01, 0.015, -1 }, *x = buffer; *x >= 0; ++x) {
167 X.insert(0.0 + *x);
168 X.insert(1.0 - *x);
169 }
170
171 for (double x = 0.02; x < 0.99; x += 0.01)
172 X.insert(x);
173
174 } else {
175
176 X.insert( 0.00);
177 X.insert( 0.10);
178 X.insert( 0.20);
179 X.insert( 0.30);
180 X.insert( 0.40);
181 X.insert( 0.50);
182 X.insert( 0.60);
183 X.insert( 0.70);
184 X.insert( 0.80);
185 X.insert( 0.90);
186 X.insert( 1.00);
187 X.insert( 1.00);
188 X.insert( 1.10);
189 X.insert( 1.20);
190 X.insert( 1.30);
191 X.insert( 1.40);
192 X.insert( 1.50);
193 X.insert( 1.60);
194 X.insert( 1.70);
195 X.insert( 1.80);
196 X.insert( 1.90);
197 X.insert( 2.00);
198 X.insert( 2.20);
199 X.insert( 2.40);
200 X.insert( 2.60);
201 X.insert( 2.80);
202 X.insert( 3.00);
203 X.insert( 3.25);
204 X.insert( 3.50);
205 X.insert( 3.75);
206 X.insert( 4.00);
207 X.insert( 4.25);
208 X.insert( 4.50);
209 X.insert( 4.75);
210 X.insert( 5.0);
211 X.insert( 6.0);
212 X.insert( 7.0);
213 X.insert( 8.0);
214 X.insert( 9.0);
215 X.insert( 10.0);
216 X.insert( 15.0);
217 X.insert( 20.0);
218 X.insert( 25.0);
219 X.insert( 30.0);
220 X.insert( 40.0);
221 X.insert( 50.0);
222 X.insert( 60.0);
223 X.insert( 70.0);
224 X.insert( 80.0);
225 X.insert( 90.0);
226 X.insert(100.0);
227 X.insert(120.0);
228 X.insert(140.0);
229 X.insert(160.0);
230 X.insert(180.0);
231 X.insert(200.0);
232 }
233
234
235 for (set<double>::const_iterator d = D.begin(); d != D.end(); ++d) {
236
237 const double D_m = *d;
238
239 for (double dc = 0.1, ct = -1.0; ct < +1.0 + 0.5*dc; ct += dc) {
240
241 JFunction1D_t& f1 = pdf[D_m][ct];
242
243 const JArray_t array(D_m, ct);
244
245 double t_old = transformer.getXn(array, *X.begin());
246 double y_old = 0.0;
247
248 for (set<double>::const_iterator x = X.begin(); x != X.end(); ++x) {
249
250 const double t = transformer.getXn(array, *x);
251 const double y = (pdf_c.*f)(D_m, ct, t);
252
253 if (y != 0.0) {
254
255 if (*x < 0.0) {
256 WARNING("dt < 0 " << *x << ' ' << D_m << ' ' << t << ' ' << y << endl);
257 }
258
259 if (y_old == 0.0) {
260 f1[t_old] = y_old;
261 }
262
263 f1[t] = y;
264
265 } else {
266
267 if (y_old != 0.0) {
268 f1[t] = y;
269 }
270 }
271
272 t_old = t;
273 y_old = y;
274 }
275 }
276 }
277
278 pdf.transform(transformer);
279 pdf.compile();
280
281 NOTICE("OK" << endl);
282
283 try {
284
285 NOTICE("storing output to file " << outputFile << "... " << flush);
286
287 pdf.store(outputFile.c_str());
288
289 NOTICE("OK" << endl);
290 }
291 catch(const JException& error) {
292 FATAL(error.what() << endl);
293 }
294}
Properties of Antares PMT and deep-sea water.
string outputFile
Various implementations of functional maps.
int main(int argc, char **argv)
Definition JMakePD0.cc:54
double getAbsorptionLength(const double lambda)
Definition JMakePD0.cc:28
double getScatteringLength(const double lambda)
Definition JMakePD0.cc:34
double absorptionLengthFactor
Scaling of absorption and scattering length.
Definition JMakePD0.cc:24
double scatteringLengthFactor
Definition JMakePD0.cc:25
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
Auxiliary classes for numerical integration.
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
virtual double getIndexOfRefractionGroup(const double lambda) const
Index of refraction for group velocity.
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.