28 double fmlambda,
double fmthetac)
36 mfunname(
"HeedDeltaElectronCS::HeedDeltaElectronCS(...)");
38 const long qe =
hmd->energy_mesh->get_q();
42 std::vector<double> beta2(qe, 0.);
43 std::vector<double> momentum2(qe, 0.);
45 const double rho =
hmd->matter->density();
46 const double zmean =
hmd->matter->Z_mean();
47 const double amean =
hmd->matter->A_mean();
48 const double ZA = zmean / amean;
49 const double I_eff = 15.8 * eV * zmean;
51 for (
long ne = 0; ne < qe; ne++) {
52 const double ec =
hmd->energy_mesh->get_ec(ne) * MeV;
53 const double gamma_1 = ec / electron_mass_c2;
56 const double en = electron_mass_c2 + ec;
58 (en * en - electron_mass_c2 * electron_mass_c2) / (MeV * MeV);
60 const double dedx =
e_cont_enloss(ZA, I_eff, rho, ec, DBL_MAX, -1);
61 if (smax < dedx) smax = dedx;
62 eLoss[ne] = dedx / (MeV / cm);
64 smax = smax / (MeV / cm);
66 double deriv_min = 0.0;
68 for (
long ne = 1; ne < qe; ne++) {
71 (
hmd->energy_mesh->get_ec(ne) -
hmd->energy_mesh->get_ec(ne - 1));
77 for (
long ne = 0; ne < n_deriv_min - 1; ne++) {
79 deriv_min * (
hmd->energy_mesh->get_ec(ne) -
80 hmd->energy_mesh->get_ec(n_deriv_min - 1))) /
88 const double amin = 0.3;
89 const double amax = 180.0;
100 const long qes =
eesls->get_ees()->get_qe();
104 coef_low_sigma.resize(qes);
106 for (
long ne = 0; ne < qes; ne++) {
107 long qat =
hmd->matter->qatom();
109 for (
long nat = 0; nat < qat; nat++) {
111 s +=
eesls->get_mean_coef(
hmd->matter->atom(nat)->Z(), ne) *
112 hmd->matter->weight_quan(nat);
114 s +=
eesls->get_coef(
hmd->matter->atom(nat)->Z(), ne) *
115 hmd->matter->weight_quan(nat);
121 coef_low_sigma[ne] = s;
126 for (
long ne = 0; ne < qe; ne++) {
128 double ek =
hmd->energy_mesh->get_ec(ne) * 1000.0;
130 rr = 1.0e-3 * amean / (gram / mole) / zmean * 3.872e-3 *
pow(ek, 1.492);
132 rr = 1.0e-3 * 6.97e-3 *
pow(ek, 1.6);
134 rr = rr / (rho / (gram / cm3));
145 double k = b / ((x - a) * (x - a));
147 double r = b - k * (x - a) * (x - a);
159 double mT = 2.0 *
asin(1.0 / (2.0 *
momentum[ne] * zmean * 5.07e2));
163 double A =
hmd->Rutherford_const / cor / (momentum2[ne] * beta2[ne]) /
165 double B =
lambda[ne] * A;
166 B =
sqrt(B / (B + 1.0));
168 double thetac = 2.0 *
asin(B);
175 double r =
sin(0.5 * B);
176 lambda[ne] = 1 / A * 2.0 * r * r / (1 +
cos(B));
186 }
else if (
sruth == 0) {
191 x = x *
hmd->radiation_length * cor;
196 }
else if (
sruth == 2) {
199 const double energy =
hmd->energy_mesh->get_ec(ne);
200 const long qat =
hmd->matter->qatom();
204 for (
long nat = 0; nat < qat; nat++) {
205 const int z =
hmd->matter->atom(nat)->Z();
206 const double w =
hmd->matter->weight_quan(nat);
207 s +=
ees->get_CS(z, energy, angle) * w;
213 smat[nan] = s * twopi *
sin(angle);
220 Avogadro * rho / (gram / cm3) / (amean / (gram / mole));
230 mfunname(
"double HeedDeltaElectronCS::get_sigma(...)");
234 const long qe =
ees->get_qe();
235 double energyKeV = energy * 1000.0;
236 energyKeV = std::max(energyKeV,
ees->get_energy_mesh(0));
237 energyKeV = std::min(energyKeV,
ees->get_energy_mesh(qe - 1));
240 while (n2 - n1 > 1) {
241 const long n3 = n1 + (n2 - n1) / 2;
242 if (energyKeV < ees->get_energy_mesh(n3))
247 const double e1 =
ees->get_energy_mesh(n1);
248 const double e2 =
ees->get_energy_mesh(n2);
253 const double v1 = nscat * coef_low_sigma[n1];
254 const double v2 = nscat * coef_low_sigma[n2];
256 return v1 + (v2 - v1) / (e2 - e1) * (energyKeV - e1);