31{
34
36
39 double E;
40 double D;
41 double cd;
43 double TTS_ns;
44 size_t profile;
45 bool cms;
48
49 try {
50
51 JParser<> zap(
"Auxiliary program to plot PDF of Cherenkov light from EM-shower using interpolation tables.");
52
55 zap[
'E'] =
make_field(E,
"shower energy [GeV]") = 1.0;
57 zap[
'c'] =
make_field(cd,
"cosine emission angle");
58 zap[
'D'] =
make_field(dir,
"(theta, phi) of PMT [rad]");
59 zap[
'T'] =
make_field(TTS_ns,
"PMT time smearing [ns]") = 0.0;
60 zap[
'N'] =
make_field(profile,
"steps shower profile") = 0;
61 zap[
'C'] =
make_field(cms,
"center shower profile");
64
65 zap(argc, argv);
66 }
67 catch(const exception &error) {
68 FATAL(error.what() << endl);
69 }
70
71
78
79 const int N = inputFile.size();
80
81 int type[N];
82 JPDF_t pdf [N];
83
84 try {
85
86 for (int i = 0; i != N; ++i) {
87
88 NOTICE(
"loading input from file " << inputFile[i] <<
"... " << flush);
89
91
92 pdf [i].load(inputFile[i].c_str());
93
94 pdf [i].setExceptionHandler(
new JFunction1D_t::JDefaultResult(
JMATH::zero));
95
96 if (TTS_ns > 0.0) {
97 pdf[i].blur(TTS_ns);
98 }
99
101 }
102 }
105 }
106
107
109
110 for (double dt; cin >> dt; ) {
111
112 for (int i = 0; i != N; ++i) {
113
114 JFunction1D_t::result_type
y = pdf[i](D, cd, dir.
getTheta(), dir.
getPhi(), dt);
115
116 cout << setw(2) << type[i] << ' '
118 <<
FIXED(5,1) << D <<
' '
119 <<
FIXED(5,2) << cd <<
' '
122 <<
FIXED(5,1) << dt <<
' '
127 }
128 }
129
130 return 0;
131 }
132
133
135
136 int function = 0;
137
138 if (inputFile.size() == 1 &&
139 inputFile.begin()->find(
getLabel(SCATTERED_LIGHT_FROM_EMSHOWER)) == string::npos) {
140 function = 1;
141 }
142
143
144 const double t0 = 0.0;
145
147
148 if (function == 1) {
149
151
153
154 } else {
155
157
159 }
160 }
161
163
164 const double D0 = D;
165 const double z0 = D0 * cd;
166 const double R = D0 * sqrt((1.0 + cd) * (1.0 - cd));
167
168 double W = 1.0;
169
171
172 if (profile >= 2) {
173
174 const double z1 = (cms ? geanz.getMaximum(E) :0.0);
175
176 W = 1.0 / (double) profile;
177
178 for (
double x = 0.5*W;
x < 1.0;
x += W) {
179 Z.push_back(geanz.getLength(E, x) - z1);
180 }
181
182 } else {
183
184 W = 1.0;
185 Z = { 0.0 };
186 }
187
188 for (int i = 1; i <= h0.GetNbinsX(); ++i) {
189
190 const double dt = h0.GetBinCenter(i) - t0;
191
193
194 for (const double z1 : Z) {
195
196 const double z = z0 - z1;
197
198 D = sqrt(R*R + z*z);
199 cd = z / D;
200
201 const double t1 = dt - (z1 + (D - D0) * getIndexOfRefraction()) / C;
202
203 for (
int j = 0;
j != N; ++
j) {
205 }
206
208 <<
FIXED(7,2) << dt <<
' '
209 <<
FIXED(7,2) << z1 <<
' '
210 <<
FIXED(7,2) << t1 <<
' '
212 }
214
215 h0.SetBinContent(i, get_value(Y));
216 }
217
218 out.Write();
219 out.Close();
220}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Data structure for angles in three dimensions.
double getTheta() const
Get theta angle.
double getPhi() const
Get phi angle.
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.
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
static const JZero zero
Function object to assign zero value.
int getPDFType(const std::string &file_name)
Get PDF type.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Auxiliary data structure for floating point format specification.