43#ifndef G4DiffuseElastic_h
44#define G4DiffuseElastic_h 1
210 std::vector<G4PhysicsTable*> fAngleBank;
212 std::vector<G4double> fElementNumberVector;
213 std::vector<G4String> fElementNameVector;
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;
366 G4double f2 = 2., f3 = 6., f4 = 24.;
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.;
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;
454 else r0 = 1.1*CLHEP::fermi;
456 fNuclearRadius = r0*std::pow(A, 1./3.);
460 r0 = 1.7*CLHEP::fermi;
462 fNuclearRadius = r0*std::pow(A, 0.27);
464 return fNuclearRadius;
476 G4double sinHalfTheta = std::sin(0.5*theta);
477 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
485 G4double xsc = ch2/(sinHalfTheta2+am)/(sinHalfTheta2+am);
507 G4cout<<
"k*Bohr_radius = "<<k*CLHEP::Bohr_radius<<
G4endl;
510 G4double xsc = ch2*CLHEP::pi/(am +am*am);
541 G4double xsc = ch2*CLHEP::twopi*(c1-c2);
542 xsc /= (1 - c1 + am)*(1 - c2 + am);
G4DLLIMPORT std::ostream G4cout
G4double SampleThetaLab(const G4HadProjectile *aParticle, G4double tmass, G4double A)
G4double GetDiffElasticSumProbA(G4double alpha)
G4double BesselOneByArg(G4double z)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4double ThetaCMStoThetaLab(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaCMS)
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
G4double GetInvElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double GetInvCoulombElasticXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
void TestAngleTable(const G4ParticleDefinition *theParticle, G4double partMom, G4double Z, G4double A)
G4double ThetaLabToThetaCMS(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaLab)
G4double GetNuclearRadius()
G4double BesselJzero(G4double z)
G4double SampleThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double A)
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4double GetIntegrandFunction(G4double theta)
void SetHEModelLowLimit(G4double value)
G4double DampFactor(G4double z)
void SetQModelLowLimit(G4double value)
G4double SampleTableThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
void SetLowestEnergyLimit(G4double value)
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
G4double GetDiffuseElasticSumXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double SampleT(const G4ParticleDefinition *aParticle, G4double p, G4double A)
G4double GetDiffElasticSumProb(G4double theta)
G4double GetDiffElasticProb(G4double theta)
G4double IntegralElasticProb(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double CalculateNuclearRad(G4double A)
virtual ~G4DiffuseElastic()
void InitialiseOnFly(G4double Z, G4double A)
void SetRecoilKinEnergyLimit(G4double value)
G4double SampleTableT(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4double BesselJone(G4double z)
G4double GetDiffuseElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position)
void SetPlabLowLimit(G4double value)
G4double GetInvElasticSumXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
G4double GetPDGMass() const
G4double GetPDGCharge() const