43 #ifndef G4DiffuseElastic_h
44 #define G4DiffuseElastic_h 1
46 #include <CLHEP/Units/PhysicalConstants.h>
76 void BuildAngleTable();
85 void SetPlabLowLimit(
G4double value);
87 void SetHEModelLowLimit(
G4double value);
89 void SetQModelLowLimit(
G4double value);
91 void SetLowestEnergyLimit(
G4double value);
93 void SetRecoilKinEnergyLimit(
G4double value);
186 G4double GetNuclearRadius(){
return fNuclearRadius;};
230 lowEnergyRecoilLimit = value;
235 plabLowLimit = value;
240 lowEnergyLimitHE = value;
245 lowEnergyLimitQ = value;
250 lowestEnergyLimit = value;
261 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
263 modvalue = fabs(value);
265 if ( value < 8.0 && value > -8.0 )
267 value2 = value*value;
269 fact1 = 57568490574.0 + value2*(-13362590354.0
270 + value2*( 651619640.7
271 + value2*(-11214424.18
272 + value2*( 77392.33017
273 + value2*(-184.9052456 ) ) ) ) );
275 fact2 = 57568490411.0 + value2*( 1029532985.0
276 + value2*( 9494680.718
277 + value2*(59272.64853
278 + value2*(267.8532712
279 + value2*1.0 ) ) ) );
281 bessel = fact1/fact2;
289 shift = modvalue-0.785398164;
291 fact1 = 1.0 + value2*(-0.1098628627e-2
292 + value2*(0.2734510407e-4
293 + value2*(-0.2073370639e-5
294 + value2*0.2093887211e-6 ) ) );
296 fact2 = -0.1562499995e-1 + value2*(0.1430488765e-3
297 + value2*(-0.6911147651e-5
298 + value2*(0.7621095161e-6
299 - value2*0.934945152e-7 ) ) );
301 bessel = sqrt(0.636619772/modvalue)*(cos(shift)*fact1 - arg*sin(shift)*fact2 );
313 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
315 modvalue = fabs(value);
317 if ( modvalue < 8.0 )
319 value2 = value*value;
321 fact1 = value*(72362614232.0 + value2*(-7895059235.0
322 + value2*( 242396853.1
323 + value2*(-2972611.439
324 + value2*( 15704.48260
325 + value2*(-30.16036606 ) ) ) ) ) );
327 fact2 = 144725228442.0 + value2*(2300535178.0
328 + value2*(18583304.74
329 + value2*(99447.43394
330 + value2*(376.9991397
331 + value2*1.0 ) ) ) );
332 bessel = fact1/fact2;
340 shift = modvalue - 2.356194491;
342 fact1 = 1.0 + value2*( 0.183105e-2
343 + value2*(-0.3516396496e-4
344 + value2*(0.2457520174e-5
345 + value2*(-0.240337019e-6 ) ) ) );
347 fact2 = 0.04687499995 + value2*(-0.2002690873e-3
348 + value2*( 0.8449199096e-5
349 + value2*(-0.88228987e-6
350 + value2*0.105787412e-6 ) ) );
352 bessel = sqrt( 0.636619772/modvalue)*(cos(shift)*fact1 - arg*sin(shift)*fact2);
354 if (value < 0.0) bessel = -bessel;
370 if( std::fabs(x) < 0.01 )
372 df = 1./(1. + x/f2 + x*x/
f3 + x*x*x/
f4);
390 if( std::fabs(x) < 0.01 )
394 result = 2. - x2 + x2*x2/6.;
398 result = BesselJone(x)/x;
412 fBeta = a/std::sqrt(1+a*a);
423 fZommerfeld = CLHEP::fine_structure_const*Z1*Z2/beta;
436 G4double zn = 1.77*k*std::pow(Z,-1./3.)*CLHEP::Bohr_radius;
453 if( A > 10. ) r0 = 1.16*( 1 - std::pow(A, -2./3.) )*
CLHEP::fermi;
456 fNuclearRadius = r0*std::pow(A, 1./3.);
462 fNuclearRadius = r0*std::pow(A, 0.27);
464 return fNuclearRadius;
476 G4double sinHalfTheta = std::sin(0.5*theta);
477 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
478 G4double beta = CalculateParticleBeta( particle, momentum);
480 G4double n = CalculateZommerfeld( beta, z, Z );
481 G4double am = CalculateAm( momentum, n, Z);
485 G4double xsc = ch2/(sinHalfTheta2+am)/(sinHalfTheta2+am);
498 G4double beta = CalculateParticleBeta( particle, momentum);
501 G4double n = CalculateZommerfeld( beta, z, Z );
503 G4double am = CalculateAm( momentum, n, Z);
507 G4cout<<
"k*Bohr_radius = "<<k*CLHEP::Bohr_radius<<
G4endl;
528 G4double beta = CalculateParticleBeta( particle, momentum);
531 G4double n = CalculateZommerfeld( beta, z, Z );
533 G4double am = CalculateAm( momentum, n, Z);
542 xsc /= (1 - c1 + am)*(1 - c2 + am);
static c2_factory< G4double > c2
G4double CalculateNuclearRad(G4double A)
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
G4double lowEnergyLimitHE
G4double BesselJzero(G4double z)
std::vector< G4String > fElementNameVector
G4double BesselJone(G4double z)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
void SetLowestEnergyLimit(G4double value)
const G4ParticleDefinition * thePionPlus
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
void SetRecoilKinEnergyLimit(G4double value)
const G4ParticleDefinition * thePionMinus
G4GLOB_DLL std::ostream G4cout
std::vector< G4PhysicsTable * > fAngleBank
void SetQModelLowLimit(G4double value)
G4double lowestEnergyLimit
static const G4double A[nN]
G4ParticleDefinition * theAlpha
G4double DampFactor(G4double z)
G4PhysicsLogVector * fEnergyVector
G4double GetPDGMass() const
G4double lowEnergyRecoilLimit
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
G4ParticleDefinition * theDeuteron
G4double BesselOneByArg(G4double z)
const G4ParticleDefinition * fParticle
void SetHEModelLowLimit(G4double value)
G4double GetPDGCharge() const
static const G4double alpha
std::vector< G4double > fElementNumberVector
void SetPlabLowLimit(G4double value)
G4PhysicsTable * fAngleTable
static const double fermi
G4ParticleDefinition * theNeutron