50{
53
55
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 for (double dt; cin >> dt; ) {
115
116 for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
117
118 cout << setw(2) << *F << ' '
120 <<
FIXED(5,1) << R <<
' '
121 <<
FIXED(5,1) << z <<
' '
124 <<
FIXED(5,1) << dt <<
' '
125 <<
SCIENTIFIC(9,3) << pdf.getLightFromMuon(*F, E_emission, R, dir.
getTheta(), dir.
getPhi(), dt) * E_emission << endl;
126 }
127 }
128
129 return 0;
130 }
131
132
134
135 const double t0 = 0.0;
136
138
139 if (function.size() == 1 && function[0] == DIRECT_LIGHT_FROM_MUON) {
140
142
144
145 } else {
146
148
150 }
151 }
152
154
156
157 if ( E_emission > MASS_MUON* (1/COS_THETA_C_WATER) ) {
158
159 if (z_emission >= 0 && z_emission <= gWater(E)) {
160 for (int i = 1; i <= h0.GetNbinsX(); ++i) {
161
162 const double dt = h0.GetBinCenter(i) - t0;
163
164 double value = 0.0;
165
166 for (vector<int>::const_iterator F = function.begin(); F != function.end(); ++F) {
167 value += pdf.getLightFromMuon(*F, E_emission, R, dir.
getTheta(), dir.
getPhi(), dt);
168 }
169
170 h0.SetBinContent(i, value);
171
173 }
174 }
175 }
176
177 f1.setExceptionHandler(
new JSplineFunction1S_t::JDefaultResult(
JMATH::zero));
179
180 const double T = 5;
181
183
184 const double t1 = quantiles.getX();
185 const double y =
f1(t1 + T).v -
f1(t1 - T).v;
186
187 DEBUG(
"E " << E << endl);
188 DEBUG(
"E_emission" << E_emission << endl);
189 DEBUG(
"R " << R << endl);
190 DEBUG(
"z " << z << endl);
193 DEBUG(
"int " << quantiles.getIntegral() << endl);
194 DEBUG(
"t1 " << t1 << endl);
195 DEBUG(
"max " << quantiles.getY() << endl);
196 DEBUG(
"FWHM " << quantiles.getFWHM() << endl);
197 DEBUG(
"int[] " << y << endl);
198
199
200 out.Write();
201 out.Close();
202}
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...
const JPolynome f1(1.0, 2.0, 3.0)
Function.
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.