41#ifndef G4NuclNuclDiffuseElastic_h
42#define G4NuclNuclDiffuseElastic_h 1
316 std::vector<G4PhysicsTable*> fAngleBank;
318 std::vector<G4double> fElementNumberVector;
319 std::vector<G4String> fElementNameVector;
369 lowEnergyRecoilLimit = value;
374 plabLowLimit = value;
379 lowEnergyLimitHE = value;
384 lowEnergyLimitQ = value;
389 lowestEnergyLimit = value;
399 G4double f2 = 2., f3 = 6., f4 = 24.;
403 if( std::fabs(x) < 0.01 )
405 df = 1./(1. + x/f2 + x*x/f3 + x*x*x/f4);
423 if( std::fabs(x) < 0.01 )
427 result = 2. - x2 + x2*x2/6.;
446 fBeta = a/std::sqrt(1+a*a);
458 fZommerfeld = CLHEP::fine_structure_const*Z1*Z2/beta;
485 G4double r0 = 1.*CLHEP::fermi, radius;
488 r0 *= fNuclearRadiusCof;
519 G4double sinHalfTheta = std::sin(0.5*theta);
520 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
528 G4double xsc = ch2/((sinHalfTheta2+am)*(sinHalfTheta2+am));
539 G4double sinHalfTheta = std::sin(0.5*theta);
540 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
542 G4double ch2 = fRutherfordRatio*fRutherfordRatio;
544 G4double xsc = ch2/(sinHalfTheta2+fAm)/(sinHalfTheta2+fAm);
565 G4cout<<
"k*Bohr_radius = "<<k*CLHEP::Bohr_radius<<
G4endl;
568 G4double xsc = ch2*CLHEP::pi/(am +am*am);
600 G4double xsc = ch2*CLHEP::twopi*(c1-c2)/((1 - c1 + am)*(1 - c2 + am));
623 result += 1./z1 - 1./z3 +1./z5 -1./z7;
638 tmp = t*std::exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
639 t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
640 t*(-0.82215223+t*0.17087277)))))))));
642 if( x >= 0.) result = 1. - tmp;
643 else result = 1. + tmp;
725 for( n = 1; n <= nMax; n++)
735 sum *= 2.*std::exp(-z*z)/std::sqrt(CLHEP::pi);
746 result =
G4Exp(x*x-fReZ*fReZ);
747 result *= std::cos(2.*x*fReZ);
757 result =
G4Exp(x*x-fReZ*fReZ);
758 result *= std::sin(2.*x*fReZ);
801 G4double sinHalfTheta = std::sin(0.5*theta);
802 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
803 sinHalfTheta2 += fAm;
805 G4double order = 2.*fCoulombPhase0 - fZommerfeld*
G4Log(sinHalfTheta2);
809 ca *= -fZommerfeld/(2.*fWaveVector*sinHalfTheta2);
821 G4double out = ca.real()*ca.real() + ca.imag()*ca.imag();
836 fCoulombPhase0 = gammalog.imag();
849 return gammalog.imag();
860 fHalfRutThetaTg = fZommerfeld/fProfileLambda;
861 fRutherfordTheta = 2.*std::atan(fHalfRutThetaTg);
862 fHalfRutThetaTg2 = fHalfRutThetaTg*fHalfRutThetaTg;
873 G4double dTheta = fRutherfordTheta - theta;
874 G4double result = 0., argument = 0.;
876 if(std::abs(dTheta) < 0.001) result = fProfileAlpha*fProfileDelta;
879 argument = fProfileDelta*dTheta;
880 result = CLHEP::pi*argument*
G4Exp(fProfileAlpha*argument);
881 result /= std::sinh(CLHEP::pi*argument);
894 G4double dTheta = fRutherfordTheta + theta;
895 G4double argument = fProfileDelta*dTheta;
897 G4double result = CLHEP::pi*argument*
G4Exp(fProfileAlpha*argument);
898 result /= std::sinh(CLHEP::pi*argument);
910 G4double dTheta = fRutherfordTheta - theta;
911 G4double result = 0., argument = 0.;
913 if(std::abs(dTheta) < 0.001) result = 1.;
916 argument = fProfileDelta*dTheta;
917 result = CLHEP::pi*argument;
918 result /= std::sinh(result);
929 G4double twosigma = 2.*fCoulombPhase0;
930 twosigma -= fZommerfeld*
G4Log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
931 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
932 twosigma -= fProfileLambda*theta - 0.25*CLHEP::pi;
934 twosigma *= fCofPhase;
947 G4double twosigma = 2.*fCoulombPhase0;
948 twosigma -= fZommerfeld*
G4Log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
949 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
950 twosigma += fProfileLambda*theta - 0.25*CLHEP::pi;
952 twosigma *= fCofPhase;
966 G4double kappa = std::sqrt(0.5*fProfileLambda/std::sin(theta)/CLHEP::pi);
994 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1005 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1006 G4double dTheta = 0.5*(theta - fRutherfordTheta);
1007 G4double sindTheta = std::sin(dTheta);
1009 G4double order = std::sqrt(fProfileLambda/sinThetaR/CLHEP::pi)*2.*sindTheta;
1014 G4double out = 0.5*( cosFresnel*cosFresnel + sinFresnel*sinFresnel );
1049 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1061 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1072 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1084 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
1085 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
std::complex< G4double > G4complex
G4GLOB_DLL std::ostream G4cout
G4double Legendre96(T &typeT, F f, G4double a, G4double b)
G4double CalcMandelstamS(const G4double mp, const G4double mt, const G4double Plab)
G4double GetRatioSim(G4double theta)
G4double GetInvElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
void SetProfileAlpha(G4double pa)
G4double ThetaLabToThetaCMS(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaLab)
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double SampleThetaLab(const G4HadProjectile *aParticle, G4double tmass, G4double A)
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
void TestAngleTable(const G4ParticleDefinition *theParticle, G4double partMom, G4double Z, G4double A)
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
void SetCofAlphaCoulomb(G4double pa)
G4double GetRatioGen(G4double theta)
G4double Profile(G4double theta)
G4double GetCofAlphaMax()
void SetCofLambda(G4double pa)
G4complex AmplitudeSim(G4double theta)
G4double GetDiffElasticSumProb(G4double theta)
G4double GetInvCoulombElasticXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
void InitialiseOnFly(G4double Z, G4double A)
G4NuclNuclDiffuseElastic()
void SetNuclearRadiusCof(G4double r)
G4double GetNuclearRadius()
G4double BesselJzero(G4double z)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
void SetRecoilKinEnergyLimit(G4double value)
G4complex AmplitudeFar(G4double theta)
void SetCofAlphaMax(G4double pa)
G4complex AmplitudeGla(G4double theta)
virtual ~G4NuclNuclDiffuseElastic()
G4complex GetErfComp(G4complex z, G4int nMax)
void SetEtaRatio(G4double pa)
G4complex GammaLogB2n(G4complex xx)
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4complex TestErfcInt(G4complex z)
G4complex Amplitude(G4double theta)
G4double AmplitudeSimMod2(G4double theta)
G4double CalculateCoulombPhase(G4int n)
G4double GetInvElasticSumXsc(const G4ParticleDefinition *particle, G4double tMand, G4double momentum, G4double A, G4double Z)
G4double GetLegendrePol(G4int n, G4double x)
G4double GetIntegrandFunction(G4double theta)
G4complex AmplitudeNear(G4double theta)
G4complex AmplitudeGG(G4double theta)
G4double GetSint(G4double x)
G4double GetHadronNucleonXscNS(G4ParticleDefinition *pParticle, G4double pTkin, G4ParticleDefinition *tParticle)
G4double CoulombAmplitudeMod2(G4double theta)
G4double IntegralElasticProb(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
void SetCofFar(G4double pa)
G4double ProfileNear(G4double theta)
G4double SampleTableThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4complex GetErfInt(G4complex z)
G4double GetFresnelDiffuseXsc(G4double theta)
G4double SampleT(const G4ParticleDefinition *aParticle, G4double p, G4double A)
void CalculateRutherfordAnglePar()
G4double GetCint(G4double x)
void InitParametersGla(const G4DynamicParticle *aParticle, G4double partMom, G4double Z, G4double A)
G4double BesselOneByArg(G4double z)
G4double GetSinHaPit2(G4double t)
G4complex PhaseNear(G4double theta)
void SetHEModelLowLimit(G4double value)
G4complex GammaLogarithm(G4complex xx)
G4double GetDiffuseElasticSumXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4double GetCosHaPit2(G4double t)
G4complex GetErfcSer(G4complex z, G4int nMax)
G4complex CoulombAmplitude(G4double theta)
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position)
G4double GetDiffElasticSumProbA(G4double alpha)
void SetPlabLowLimit(G4double value)
G4double AmplitudeMod2(G4double theta)
G4double AmplitudeGlaMod2(G4double theta)
void CalculateCoulombPhaseZero()
G4complex TestErfcSer(G4complex z, G4int nMax)
G4complex GetErfcComp(G4complex z, G4int nMax)
G4double GetRutherfordXsc(G4double theta)
G4double ThetaCMStoThetaLab(const G4DynamicParticle *aParticle, G4double tmass, G4double thetaCMS)
G4double SampleTableT(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4double SampleThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double A)
void SetCofDelta(G4double pa)
void SetQModelLowLimit(G4double value)
G4complex GetErfSer(G4complex z, G4int nMax)
G4double GetExpSin(G4double x)
void SetLowestEnergyLimit(G4double value)
G4complex TestErfcComp(G4complex z, G4int nMax)
void SetCofPhase(G4double pa)
void SetCofAlpha(G4double pa)
void SetProfileDelta(G4double pd)
G4double AmplitudeGGMod2(G4double theta)
G4double BesselJone(G4double z)
void InitDynParameters(const G4ParticleDefinition *theParticle, G4double partMom)
G4double CalculateNuclearRad(G4double A)
void InitParameters(const G4ParticleDefinition *theParticle, G4double partMom, G4double Z, G4double A)
G4complex GetErfcInt(G4complex z)
void SetProfileLambda(G4double pl)
G4double GetDiffuseElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
virtual G4double SampleInvariantT(const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
G4double GetFresnelIntegrandXsc(G4double alpha)
G4double GetCofAlphaCoulomb()
G4double GetExpCos(G4double x)
G4complex PhaseFar(G4double theta)
G4double GetErf(G4double x)
G4double SampleCoulombMuCMS(const G4ParticleDefinition *aParticle, G4double p)
G4double DampFactor(G4double z)
G4double ProfileFar(G4double theta)
G4double GetProfileLambda()
G4complex GammaMore(G4double theta)
G4double GetDiffElasticProb(G4double theta)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4complex GammaLess(G4double theta)
G4double GetPDGMass() const
G4double GetPDGCharge() const
static G4Pow * GetInstance()
G4double A13(G4double A) const