50{
53
55
58 double epsilon;
59 double E;
60 double R;
61 double z;
66
67 try {
68
70
72
73 JParser<> zap(
"Auxiliary program to draw PDF of Cherenkov light from muon.");
74
78 zap[
'e'] =
make_field(epsilon,
"precision for integration") = 1.0e-10;
81 zap[
'E'] =
make_field(E,
"muon energy at vertex [GeV]")= 1.0;
82 zap[
'R'] =
make_field(R,
"distance of approach [m]");
83 zap[
'z'] =
make_field(z,
"PMT z-position [m]");
84 zap[
'D'] =
make_field(dir,
"(theta, phi) of PMT [rad]");
88
89 zap(argc, argv);
90 }
91 catch(const exception &error) {
92 FATAL(error.what() << endl);
93 }
94
95
97 pdf(NAMESPACE::getPhotocathodeArea(),
98 NAMESPACE::getQE,
99 NAMESPACE::getAngularAcceptance,
102 NAMESPACE::getScatteringProbability,
103 NAMESPACE::getAmbientPressure(),
107 epsilon);
108
109 const double z_emission = z - R/getTanThetaC();
110 const double E_emission = gWater.getE(E, z_emission );
111
113
114 cout << "enter time (^C to exit) > " << flush;
115
116 for (double dt; cin >> dt; ) {
117
118 for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
119
120 cout << setw(2) << *F << ' '
122 <<
FIXED(5,1) << R <<
' '
123 <<
FIXED(5,1) << z <<
' '
126 <<
FIXED(5,1) << dt <<
' '
127 <<
SCIENTIFIC(9,3) << pdf.getLightFromMuon(*F, E_emission, R, dir.
getTheta(), dir.
getPhi(), dt) * E_emission << endl;
128 }
129 }
130
131 return 0;
132 }
133
134
136
137 const double t0 = 0.0;
138
140
141 if (function.size() == 1 && function[0] == DIRECT_LIGHT_FROM_MUON) {
142
144
146
147 } else {
148
150
152 }
153 }
154
156
158
159 if ( E_emission >= MASS_MUON* (1/SIN_THETA_C_WATER ) ) {
160
161 if (z_emission >= 0 && z_emission <= gWater(E)) {
162 for (int i = 1; i <= h0.GetNbinsX(); ++i) {
163
164 const double dt = h0.GetBinCenter(i) - t0;
165
166 double value = 0.0;
167
168 for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
169 value += pdf.getLightFromMuon(*F, E_emission, R, dir.
getTheta(), dir.
getPhi(), dt);
170 }
171
172 h0.SetBinContent(i, value);
173
174 f1[dt] = value;
175 }
176 }
177 }
178
180 f1.compile();
181
182 try {
183
184 const double T_ns = 5;
185
187
188 const double t1 = quantiles.getX();
189 const double y = f1(t1 + T_ns).v - f1(t1 - T_ns).v;
190
191 DEBUG(
"E " << E << endl);
192 DEBUG(
"E_emission" << E_emission << endl);
193 DEBUG(
"R " << R << endl);
194 DEBUG(
"z " << z << endl);
197 DEBUG(
"int " << quantiles.getIntegral() << endl);
198 DEBUG(
"t1 " << t1 << endl);
199 DEBUG(
"max " << quantiles.getY() << endl);
200 DEBUG(
"FWHM " << quantiles.getFWHM() << endl);
201 DEBUG(
"int[] " << y << endl);
202 }
203 catch(const exception&) {}
204
205 out.Write();
206 out.Close();
207}
double getAbsorptionLength(const double lambda)
double getScatteringLength(const double lambda)
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
Data structure for angles in three dimensions.
double getTheta() const
Get theta angle.
double getPhi() const
Get phi angle.
Utility class to parse command line options.
Probability Density Functions of the time response of a PMT with an implementation of the JAbstractPM...
static const JZero zero
Function object to assign zero value.
static double MODULE_RADIUS_M
Radius of optical module [m].
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).
Auxiliary data structure for floating point format specification.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Auxiliary data structure for floating point format specification.