89 G4double t0 = std::max(tMin, lowestE);
91 if(t0 >= tm)
return 0.0;
94 Shell(Z, shell)->BindingEnergy();
96 if(e <= bindingEnergy)
return 0.0;
100 G4double x1 = std::min(0.5,(t0 + bindingEnergy)/energy);
101 G4double x2 = std::min(0.5,(tm + bindingEnergy)/energy);
103 if(verbose > 1 || (Z==4 && e>= 1.0 && e<= 0.0)) {
104 G4cout <<
"G4RDeIonisationSpectrum::Probability: Z= " << Z
105 <<
"; shell= " << shell
106 <<
"; E(keV)= " << e/
keV
107 <<
"; Eb(keV)= " << bindingEnergy/
keV
117 for (
G4int i=0; i<iMax; i++)
124 if(p[3] > 0.5) p[3] = 0.5;
127 p.push_back((2.0*g - 1.0)/(g*g));
129 p[iMax-1] = Function(p[3], p);
131 if(e >= 1. && e <= 0. && Z == 4) p.push_back(0.0);
134 G4double val = IntSpectrum(x1, x2, p);
136 G4double nor = IntSpectrum(x0, 0.5, p);
138 if(verbose > 1 || (Z==4 && e>= 1.0 && e<= 0.0)) {
139 G4cout <<
"tcut= " << tMin
140 <<
"; tMax= " << tMax
156 if(nor > 0.0) val /= nor;
175 G4double t0 = std::max(tMin, lowestE);
177 if(t0 >= tm)
return 0.0;
180 Shell(Z, shell)->BindingEnergy();
182 if(e <= bindingEnergy)
return 0.0;
186 G4double x1 = std::min(0.5,(t0 + bindingEnergy)/energy);
187 G4double x2 = std::min(0.5,(tm + bindingEnergy)/energy);
190 G4cout <<
"G4RDeIonisationSpectrum::AverageEnergy: Z= " << Z
191 <<
"; shell= " << shell
192 <<
"; E(keV)= " << e/
keV
193 <<
"; bindingE(keV)= " << bindingEnergy/
keV
202 for (
G4int i=0; i<iMax; i++)
209 if(p[3] > 0.5) p[3] = 0.5;
212 p.push_back((2.0*g - 1.0)/(g*g));
214 p[iMax-1] = Function(p[3], p);
216 G4double val = AverageValue(x1, x2, p);
218 G4double nor = IntSpectrum(x0, 0.5, p);
223 <<
"; tMax(MeV)= " << tMax/
MeV
238 if(nor > 0.0) val /= nor;
254 G4double t0 = std::max(tMin, lowestE);
256 if(t0 > tm)
return tDelta;
259 Shell(Z, shell)->BindingEnergy();
261 if(e <= bindingEnergy)
return 0.0;
265 G4double x1 = std::min(0.5,(t0 + bindingEnergy)/energy);
266 G4double x2 = std::min(0.5,(tm + bindingEnergy)/energy);
267 if(x1 >= x2)
return tDelta;
270 G4cout <<
"G4RDeIonisationSpectrum::SampleEnergy: Z= " << Z
271 <<
"; shell= " << shell
272 <<
"; E(keV)= " << e/
keV
280 for (
G4int i=0; i<iMax; i++)
287 if(p[3] > 0.5) p[3] = 0.5;
290 p.push_back((2.0*g - 1.0)/(g*g));
292 p[iMax-1] = Function(p[3], p);
297 if(a1 < a2) aria1 = IntSpectrum(a1, a2, p);
301 if(a3 < a4) aria2 = IntSpectrum(a3, a4, p);
304 G4double amaj, fun, q,
x, z1, z2, dx, dx1;
311 for (
G4int j=5; j<iMax; j++) {
312 if(p[j] > amaj) amaj = p[j];
324 dx = (p[2] - p[1]) / 3.0;
325 dx1= std::exp(std::log(p[3]/p[2]) / 16.0);
326 for (i=4; i<iMax-1; i++) {
330 }
else if(iMax-2 == i) {
336 if(x >= z1 && x <= z2)
break;
339 fun = p[i] + (x - z1) * (p[i+1] - p[i])/(z2 - z1);
342 G4cout <<
"WARNING in G4RDeIonisationSpectrum::SampleEnergy:"
343 <<
" Majoranta " << amaj
345 <<
" in the first aria at x= " << x
357 amaj = std::max(p[iMax-1], Function(0.5, p)) * factor;
364 fun = Function(x, p);
367 G4cout <<
"WARNING in G4RDeIonisationSpectrum::SampleEnergy:"
368 <<
" Majoranta " << amaj
370 <<
" in the second aria at x= " << x
386 <<
"; tMax(MeV)= " << tMax/
MeV
392 <<
"; be= " << bindingEnergy
394 <<
"; tDelta= " << tDelta
409 if(xMin >= xMax)
return sum;
420 G4double dx1= std::exp(std::log(p[3]/p[2]) / 16.0);
422 for (
size_t i=0; i<19; i++) {
437 }
else if (xMin < x2) {
447 ys1 += (xs1 -
x1)*(y2 - y1)/(x2 -
x1);
451 ys2 += (xs2 -
x2)*(y1 - y2)/(x1 -
x2);
454 q = (ys1*xs2 - ys2*xs1)/(xs1*xs2)
455 + std::log(xs2/xs1)*(ys2 - ys1)/(xs2 - xs1);
457 if(p.size() == 26) G4cout <<
"i= " << i <<
" q= " << q <<
" sum= " << sum <<
G4endl;
468 x1 = std::max(xMin, p[3]);
469 if(x1 >= xMax)
return sum;
474 q = (xs1 - xs2)*(1.0 - p[0])
475 - p[iMax]*std::log(x2/x1)
476 + (1. - p[iMax])*(x2 - x1)
477 + 1./(1. -
x2) - 1./(1. - x1)
478 + p[iMax]*std::log((1. - x2)/(1. - x1))
479 + 0.25*p[0]*(xs1*xs1 - xs2*xs2);
481 if(p.size() == 26) G4cout <<
"param... q= " << q <<
" sum= " << sum <<
G4endl;
492 if(xMin >= xMax)
return sum;
503 G4double dx1= std::exp(std::log(p[3]/p[2]) / 16.0);
505 for (
size_t i=0; i<19; i++) {
519 }
else if (xMin < x2) {
529 ys1 += (xs1 -
x1)*(y2 - y1)/(x2 -
x1);
533 ys2 += (xs2 -
x2)*(y1 - y2)/(x1 -
x2);
536 sum += std::log(xs2/xs1)*(ys1*xs2 - ys2*xs1)/(xs2 - xs1)
549 x1 = std::max(xMin, p[3]);
550 if(x1 >= xMax)
return sum;
556 sum += std::log(x2/x1)*(1.0 - p[0])
557 + 0.5*(1. - p[iMax])*(x2*x2 - x1*
x1)
558 + 1./(1. - x2) - 1./(1. -
x1)
559 + (1. + p[iMax])*std::log((1. - x2)/(1. - x1))
560 + 0.5*p[0]*(xs1 - xs2);
575 return 0.5 * kineticEnergy;