43 #ifndef G4DiffuseElastic_h
44 #define G4DiffuseElastic_h 1
280 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
282 modvalue = std::fabs(value);
286 value2 = value*
value;
288 fact1 = 57568490574.0 + value2*(-13362590354.0
289 + value2*( 651619640.7
290 + value2*(-11214424.18
291 + value2*( 77392.33017
292 + value2*(-184.9052456 ) ) ) ) );
294 fact2 = 57568490411.0 + value2*( 1029532985.0
295 + value2*( 9494680.718
296 + value2*(59272.64853
297 + value2*(267.8532712
298 + value2*1.0 ) ) ) );
300 bessel = fact1/fact2;
308 shift = modvalue-0.785398164;
310 fact1 = 1.0 + value2*(-0.1098628627e-2
311 + value2*(0.2734510407e-4
312 + value2*(-0.2073370639e-5
313 + value2*0.2093887211e-6 ) ) );
315 fact2 = -0.1562499995e-1 + value2*(0.1430488765e-3
316 + value2*(-0.6911147651e-5
317 + value2*(0.7621095161e-6
318 - value2*0.934945152e-7 ) ) );
320 bessel = std::sqrt(0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2 );
332 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
334 modvalue = std::fabs(value);
336 if ( modvalue < 8.0 )
338 value2 = value*
value;
340 fact1 = value*(72362614232.0 + value2*(-7895059235.0
341 + value2*( 242396853.1
342 + value2*(-2972611.439
343 + value2*( 15704.48260
344 + value2*(-30.16036606 ) ) ) ) ) );
346 fact2 = 144725228442.0 + value2*(2300535178.0
347 + value2*(18583304.74
348 + value2*(99447.43394
349 + value2*(376.9991397
350 + value2*1.0 ) ) ) );
351 bessel = fact1/fact2;
359 shift = modvalue - 2.356194491;
361 fact1 = 1.0 + value2*( 0.183105e-2
362 + value2*(-0.3516396496e-4
363 + value2*(0.2457520174e-5
364 + value2*(-0.240337019e-6 ) ) ) );
366 fact2 = 0.04687499995 + value2*(-0.2002690873e-3
367 + value2*( 0.8449199096e-5
368 + value2*(-0.88228987e-6
369 + value2*0.105787412e-6 ) ) );
371 bessel = std::sqrt( 0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2);
373 if (value < 0.0) bessel = -bessel;
389 if( std::fabs(x) < 0.01 )
391 df = 1./(1. + x/f2 + x*x/
f3 + x*x*x/
f4);
409 if( std::fabs(x) < 0.01 )
413 result = 2. - x2 + x2*x2/6.;
431 fBeta = a/std::sqrt(1+a*a);
535 G4double sinHalfTheta = std::sin(0.5*theta);
536 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
544 G4double xsc = ch2/(sinHalfTheta2+am)/(sinHalfTheta2+am);
601 xsc /= (1 - c1 + am)*(1 - c2 + am);
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
G4double BesselOneByArg(G4double z)
static G4PionMinus * PionMinus()
G4double GetDiffElasticProb(G4double theta)
G4double GetInvCoulombElasticXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
G4double GetDiffuseElasticSumXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double SampleT(const G4ParticleDefinition *aParticle, G4double p, G4double A)
std::vector< ExP01TrackerHit * > a
G4double A13(G4double A) const
G4double GetDiffuseElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4PhysicsLogVector * fEnergyVector
static constexpr double hbarc
void SetHEModelLowLimit(G4double value)
G4double A23(G4double A) const
static G4PionPlus * PionPlus()
G4double GetPDGCharge() const
G4PhysicsTable * fAngleTable
G4double lowEnergyRecoilLimit
const G4ParticleDefinition * fParticle
G4double NeutronTuniform(G4int Z)
std::vector< G4String > fElementNameVector
static G4Proton * Proton()
static G4KaonMinus * KaonMinus()
void SetRecoilKinEnergyLimit(G4double value)
void TestAngleTable(const G4ParticleDefinition *theParticle, G4double partMom, G4double Z, G4double A)
G4double GetPDGMass() const
static G4KaonPlus * KaonPlus()
virtual ~G4DiffuseElastic()
G4double lowestEnergyLimit
G4double IntegralElasticProb(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
static constexpr double fermi
void SetQModelLowLimit(G4double value)
static G4Pow * GetInstance()
const XML_Char int const XML_Char * value
G4double GetDiffElasticSumProb(G4double theta)
G4double powA(G4double A, G4double y) const
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4double GetIntegrandFunction(G4double theta)
G4double GetDiffElasticSumProbA(G4double alpha)
G4double GetNuclearRadius()
static const G4double alpha
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position)
double A(double temperature)
G4ParticleDefinition * theDeuteron
std::vector< G4PhysicsTable * > fAngleBank
void SetPlabLowLimit(G4double value)
virtual G4bool IsApplicable(const G4HadProjectile &, G4Nucleus &)
const G4ParticleDefinition * thePionPlus
G4double G4ParticleHPJENDLHEData::G4double result
static constexpr double twopi
const G4ParticleDefinition * GetDefinition() const
static G4Neutron * Neutron()
G4ParticleDefinition * theNeutron
G4double ThetaCMStoThetaLab(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaCMS)
G4double SampleThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double A)
G4double BesselJone(G4double z)
G4double BesselJzero(G4double z)
void InitialiseOnFly(G4double Z, G4double A)
std::vector< G4double > fElementNumberVector
G4double DampFactor(G4double z)
G4GLOB_DLL std::ostream G4cout
G4double lowEnergyLimitHE
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
void SetLowestEnergyLimit(G4double value)
G4ParticleDefinition * theProton
G4double CalculateNuclearRad(G4double A)
G4ParticleDefinition * theAlpha
static constexpr double fine_structure_const
Float_t x2[n_points_geant4]
G4double ThetaLabToThetaCMS(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaLab)
G4double GetInvElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double SampleThetaLab(const G4HadProjectile *aParticle, G4double tmass, G4double A)
G4double SampleTableThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
static constexpr double Bohr_radius
G4double GetInvElasticSumXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
G4double SampleTableT(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
static constexpr double pi
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
const G4ParticleDefinition * thePionMinus