42int main(
int argc,
char **argv)
62 JParser<> zap(
"Program to determine the energy loss due to visible delta-rays.");
66 zap[
'N'] =
make_field(use_numerical,
"perform numeric integration");
67 zap[
'T'] =
make_field(T_GeV,
"kinetic energy range of electron [GeV]") = JRange_t();
68 zap[
'L'] =
make_field(lepton) = muon, tau, positron, electron;
69 zap[
'A'] =
make_field(A,
"atomic mass") = 18.0;
70 zap[
'Z'] =
make_field(Z,
"atomic number") = 10.0;
77 catch(
const exception &error) {
78 FATAL(error.what() << endl);
81 if (option.find(
'R') == string::npos) { option +=
'R'; }
82 if (option.find(
'S') == string::npos) { option +=
'S'; }
88 MASS_LEPTON = MASS_MUON;
89 else if (lepton == tau)
90 MASS_LEPTON = MASS_TAU;
91 else if (lepton == positron)
92 MASS_LEPTON = MASS_ELECTRON;
93 else if (lepton == electron)
94 MASS_LEPTON = MASS_ELECTRON;
96 FATAL(
"Invalid lepton " << lepton << endl);
98 const double Tmin = (T_GeV.is_valid() ?
99 T_GeV.constrain(JDeltaRays::getTmin()) : JDeltaRays::getTmin());
103 const double error = 1.0e-12;
105 const double xmin = log10(MASS_LEPTON);
106 const double xmax = 9.25;
108 TH1D h0(
"h0", NULL, 320, xmin, xmax);
109 TH1D h1(
"h1", NULL, 320, xmin, xmax);
111 for (
int i = 1; i <= h0.GetNbinsX(); ++i) {
113 const double x = h0.GetBinCenter(i);
114 const double E = pow(10.0,x);
116 double Tmax = (lepton != electron ?
117 JDeltaRays::getTmax (E, MASS_LEPTON) :
118 0.5 * getKineticEnergy(E, MASS_ELECTRON));
120 if (T_GeV.is_valid()) { Tmax = T_GeV.constrain(Tmax); }
127 const double gamma = E / MASS_LEPTON;
128 const double beta = sqrt((1.0 + 1.0/gamma) * (1 - 1.0/gamma));
132 dEdx = JDeltaRays::getEnergyLoss(E, MASS_LEPTON, Tmin, Tmax, Z, A, F,
numberOfPoints) * 1.0e3;
133 dNdx = JDeltaRays::getCount (E, MASS_LEPTON, Tmin, Tmax, Z, A, F,
numberOfPoints);
137 dEdx = JDeltaRays::getEnergyLoss(E, MASS_LEPTON, Tmin, Tmax, Z, A) * 1.0e3;
138 dNdx = JDeltaRays::getCount (E, MASS_LEPTON, Tmin, Tmax, Z, A);
144 DEBUG(
"dE/dx [MeV g^-1 cm^2] " <<
FIXED(5,4) << dEdx << endl);
145 DEBUG(
"dE/dx [g^-1 cm^2] " <<
FIXED(5,2) << dNdx << endl);
147 h0.SetBinContent(i, dEdx);
148 h0.SetBinError (i, error);
149 h1.SetBinContent(i, dNdx);
154 TF1 f1(
"f1",
"[0] + [1]*x + [2]*x*x + [3]*x*x*x");
156 if (option.find(
'W') == string::npos) {
160 f1.SetParameter(0, h0.GetMinimum());
161 f1.SetParameter(1, (h0.GetMaximum() - h0.GetMinimum()) / (h0.GetXaxis()->GetXmax() - h0.GetXaxis()->GetXmin()));
162 f1.SetParameter(2, 0.0);
163 f1.SetParameter(3, 0.0);
165 f1.SetLineColor(kRed);
169 const TFitResultPtr result = h0.Fit(&f1, option.c_str(),
"same", xmin, xmax);
171 cout <<
"chi2/NDF " << result->Chi2() <<
'/' << result->Ndf() << endl;
173 cout <<
"\t// " << lepton << endl;
174 cout <<
"\t// dE/dX = a + bx + cx^2 + dx^3; // [MeV g^-1 cm^2]; x = log10(E/GeV);" << endl;
176 for (
int i = 0; i != 4; ++i) {
177 cout <<
"\tstatic const double " << (char) (
'a' + i) <<
" = " <<
SCIENTIFIC(10,3) << f1.GetParameter(i) <<
";" << endl;
180 double Emin = 1 * MASS_LEPTON;
181 double Emax = 5 * MASS_LEPTON;
183 for (
double E = 0.5 * (Emin + Emax); ; E = 0.5 * (Emin + Emax)) {
185 const double Tmax = JDeltaRays::getTmax(E, MASS_LEPTON);
187 if (fabs(Tmax - Tmin) < precision) {
188 cout <<
"\tstatic const double Emin = " <<
FIXED(7,5) << E <<
"; // [GeV]" << endl;