195{
198
200
204 bool use_numerical;
205 string lepton;
206 double A;
207 double Z;
208 string option;
209 double precision;
211
212 try {
213
214 JParser<> zap(
"Program to determine the energy loss due to visible delta-rays.");
215
218 zap[
'N'] =
make_field(use_numerical,
"perform numeric integration");
220 zap[
'L'] =
make_field(lepton) = muon, tau, positron, electron;
221 zap[
'A'] =
make_field(A,
"atomic mass") = 18.0;
222 zap[
'Z'] =
make_field(Z,
"atomic number") = 10.0;
226
227 zap(argc, argv);
228 }
229 catch(const exception &error) {
230 FATAL(error.what() << endl);
231 }
232
233 if (option.find('R') == string::npos) { option += 'R'; }
234 if (option.find('S') == string::npos) { option += 'S'; }
236
237 double MASS_LEPTON;
238
239 if (lepton == muon)
241 else if (lepton == tau)
243 else if (lepton == positron)
245 else if (lepton == electron)
247 else
248 FATAL(
"Invalid lepton " << lepton << endl);
249
250 const double Tmin = (T_GeV.
is_valid() ?
252
254
255 const double error = 1.0e-12;
256
257 const double xmin = log10(MASS_LEPTON);
258 const double xmax = 9.25;
259
260 TH1D h0("h0", NULL, 320, xmin, xmax);
261 TH1D h1("h1", NULL, 320, xmin, xmax);
262
263 for (int i = 1; i <= h0.GetNbinsX(); ++i) {
264
265 const double x = h0.GetBinCenter(i);
266 const double E =
pow(10.0,x);
267
268 double Tmax = (lepton != electron ?
271
272 if (T_GeV.
is_valid()) { Tmax = T_GeV.constrain(Tmax); }
273
274 double dEdx = 0.0;
275 double dNdx = 0.0;
276
278
279 const double gamma = E / MASS_LEPTON;
280 const double beta = sqrt((1.0 + 1.0/gamma) * (1 - 1.0/gamma));
281
282 const JFormFactor F(0.5/(E*E), -beta*beta/Tmax, 1.0);
283
286
287 } else {
288
291 }
292
296 DEBUG(
"dE/dx [MeV g^-1 cm^2] " <<
FIXED(5,4) << dEdx << endl);
297 DEBUG(
"dE/dx [g^-1 cm^2] " <<
FIXED(5,2) << dNdx << endl);
298
299 h0.SetBinContent(i, dEdx);
300 h0.SetBinError (i, error);
301 h1.SetBinContent(i, dNdx);
302 }
303
304 if (use_numerical) {
305
306 TF1
f1(
"f1",
"[0] + [1]*x + [2]*x*x + [3]*x*x*x");
307
308 if (option.find('W') == string::npos) {
309 option += "W";
310 }
311
312 f1.SetParameter(0, h0.GetMinimum());
313 f1.SetParameter(1, (h0.GetMaximum() - h0.GetMinimum()) / (h0.GetXaxis()->GetXmax() - h0.GetXaxis()->GetXmin()));
314 f1.SetParameter(2, 0.0);
315 f1.SetParameter(3, 0.0);
316
317 f1.SetLineColor(kRed);
318
319
320
321 const TFitResultPtr
result = h0.Fit(&f1, option.c_str(),
"same", xmin, xmax);
322
323 cout <<
"chi2/NDF " <<
result->Chi2() <<
'/' <<
result->Ndf() << endl;
324
325 cout << "\t// " << lepton << endl;
326 cout << "\t// dE/dX = a + bx + cx^2 + dx^3; // [MeV g^-1 cm^2]; x = log10(E/GeV);" << endl;
327
328 for (int i = 0; i != 4; ++i) {
329 cout <<
"\tstatic const double " << (char) (
'a' + i) <<
" = " <<
SCIENTIFIC(10,3) <<
f1.GetParameter(i) <<
";" << endl;
330 }
331
332 double Emin = 1 * MASS_LEPTON;
333 double Emax = 5 * MASS_LEPTON;
334
335 for (double E = 0.5 * (Emin + Emax); ; E = 0.5 * (Emin + Emax)) {
336
338
339 if (fabs(Tmax - Tmin) < precision) {
340 cout <<
"\tstatic const double Emin = " <<
FIXED(7,5) << E <<
"; // [GeV]" << endl;
341 break;
342 }
343
344 if (Tmax > Tmin)
345 Emax = E;
346 else
347 Emin = E;
348 }
349 }
350
351 out.Write();
352 out.Close();
353}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Utility class to parse command line options.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
size_t getCount(const array_type< T > &buffer, const JCompare_t &compare)
Count number of unique values.
T pow(const T &x, const double y)
Power .
double getDeltaRayTmin()
Get minimum delta-ray kinetic energy.
static const double DENSITY_SEA_WATER
Fixed environment values.
static const double MASS_MUON
muon mass [GeV]
static const double MASS_ELECTRON
electron mass [GeV]
double getDeltaRayTmax(const double E, const double M)
Get maximum delta-ray kinetic energy for given lepton energy and mass.
static const double MASS_TAU
tau mass [GeV]
double getDeltaRays(const double E, const double M, const double Tmin, const double Tmax, const double Z, const double A)
Get equivalent EM-shower energy due to delta-rays per unit track length for an ionising particle with...
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Auxiliary data structure for floating point format specification.
Type definition of range.
Auxiliary data structure for floating point format specification.