42 #ifndef G4NuclNuclDiffuseElastic_h
43 #define G4NuclNuclDiffuseElastic_h 1
46 #include <CLHEP/Units/PhysicalConstants.h>
73 void BuildAngleTable();
79 void SetPlabLowLimit(
G4double value);
81 void SetHEModelLowLimit(
G4double value);
83 void SetQModelLowLimit(
G4double value);
85 void SetLowestEnergyLimit(
G4double value);
87 void SetRecoilKinEnergyLimit(
G4double value);
218 void CalculateCoulombPhaseZero();
220 void CalculateRutherfordAnglePar();
289 inline G4double GetCofAlphaCoulomb(){
return fCofAlphaCoulomb;};
364 lowEnergyRecoilLimit = value;
369 plabLowLimit = value;
374 lowEnergyLimitHE = value;
379 lowEnergyLimitQ = value;
384 lowestEnergyLimit = value;
398 if( std::fabs(x) < 0.01 )
400 df = 1./(1. + x/f2 + x*x/
f3 + x*x*x/
f4);
418 if( std::fabs(x) < 0.01 )
422 result = 2. - x2 + x2*x2/6.;
426 result = BesselJone(x)/x;
441 fBeta = a/std::sqrt(1+a*a);
453 fZommerfeld = CLHEP::fine_structure_const*Z1*Z2/beta;
467 G4double zn = 1.77*k*std::pow(Z,-1./3.)*CLHEP::Bohr_radius;
483 r0 *= fNuclearRadiusCof;
500 radius = r0*std::pow(A, 1./3.);
514 G4double sinHalfTheta = std::sin(0.5*theta);
515 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
516 G4double beta = CalculateParticleBeta( particle, momentum);
518 G4double n = CalculateZommerfeld( beta, z, Z );
519 G4double am = CalculateAm( momentum, n, Z);
523 G4double xsc = ch2/((sinHalfTheta2+am)*(sinHalfTheta2+am));
534 G4double sinHalfTheta = std::sin(0.5*theta);
535 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
537 G4double ch2 = fRutherfordRatio*fRutherfordRatio;
539 G4double xsc = ch2/(sinHalfTheta2+fAm)/(sinHalfTheta2+fAm);
551 G4double beta = CalculateParticleBeta( particle, momentum);
554 G4double n = CalculateZommerfeld( beta, z, Z );
556 G4double am = CalculateAm( momentum, n, Z);
560 G4cout<<
"k*Bohr_radius = "<<k*CLHEP::Bohr_radius<<
G4endl;
582 G4double beta = CalculateParticleBeta( particle, momentum);
585 G4double n = CalculateZommerfeld( beta, z, Z );
587 G4double am = CalculateAm( momentum, n, Z);
595 G4double xsc = ch2*CLHEP::twopi*(c1-
c2)/((1 - c1 + am)*(1 - c2 + am));
617 G4complex result = (z-0.5)*std::log(z)-z+0.5*std::log(CLHEP::twopi);
618 result += 1./z1 - 1./z3 +1./z5 -1./z7;
633 tmp = t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
634 t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
635 t*(-0.82215223+t*0.17087277)))))))));
637 if( x >= 0.) result = 1. - tmp;
638 else result = 1. + tmp;
649 G4complex erfcz = 1. - GetErfComp( z, nMax);
659 G4complex erfcz = 1. - GetErfSer( z, nMax);
681 G4complex erfcz = 1. - GetErfComp( miz, nMax);
693 G4complex erfcz = 1. - GetErfSer( miz, nMax);
720 for( n = 1; n <= nMax; n++)
730 sum *= 2.*std::exp(-z*z)/std::sqrt(
CLHEP::pi);
741 result = std::exp(x*x-fReZ*fReZ);
742 result *= std::cos(2.*x*fReZ);
752 result = std::exp(x*x-fReZ*fReZ);
753 result *= std::sin(2.*x*fReZ);
796 G4double sinHalfTheta = std::sin(0.5*theta);
797 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
798 sinHalfTheta2 += fAm;
800 G4double order = 2.*fCoulombPhase0 - fZommerfeld*std::log(sinHalfTheta2);
804 ca *= -fZommerfeld/(2.*fWaveVector*sinHalfTheta2);
816 G4double out = ca.real()*ca.real() + ca.imag()*ca.imag();
831 fCoulombPhase0 = gammalog.imag();
844 return gammalog.imag();
855 fHalfRutThetaTg = fZommerfeld/fProfileLambda;
856 fRutherfordTheta = 2.*std::atan(fHalfRutThetaTg);
857 fHalfRutThetaTg2 = fHalfRutThetaTg*fHalfRutThetaTg;
868 G4double dTheta = fRutherfordTheta - theta;
869 G4double result = 0., argument = 0.;
871 if(std::abs(dTheta) < 0.001) result = fProfileAlpha*fProfileDelta;
874 argument = fProfileDelta*dTheta;
875 result =
CLHEP::pi*argument*std::exp(fProfileAlpha*argument);
889 G4double dTheta = fRutherfordTheta + theta;
890 G4double argument = fProfileDelta*dTheta;
905 G4double dTheta = fRutherfordTheta - theta;
906 G4double result = 0., argument = 0.;
908 if(std::abs(dTheta) < 0.001) result = 1.;
911 argument = fProfileDelta*dTheta;
913 result /= std::sinh(result);
924 G4double twosigma = 2.*fCoulombPhase0;
925 twosigma -= fZommerfeld*std::log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
926 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
927 twosigma -= fProfileLambda*theta - 0.25*
CLHEP::pi;
929 twosigma *= fCofPhase;
942 G4double twosigma = 2.*fCoulombPhase0;
943 twosigma -= fZommerfeld*std::log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
944 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
945 twosigma += fProfileLambda*theta - 0.25*
CLHEP::pi;
947 twosigma *= fCofPhase;
963 out *= ProfileFar(theta);
964 out *= PhaseFar(theta);
976 G4complex out = AmplitudeNear(theta) + fCofFar*AmplitudeFar(theta);
989 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1000 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1001 G4double dTheta = 0.5*(theta - fRutherfordTheta);
1002 G4double sindTheta = std::sin(dTheta);
1006 G4double cosFresnel = 0.5 - GetCint(order);
1007 G4double sinFresnel = 0.5 - GetSint(order);
1009 G4double out = 0.5*( cosFresnel*cosFresnel + sinFresnel*sinFresnel );
1020 G4double ratio = GetRatioGen(theta);
1021 G4double ruthXsc = GetRutherfordXsc(theta);
1033 G4double xsc = GetFresnelDiffuseXsc(theta);
1044 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1056 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1067 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1079 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
1080 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4double lowestEnergyLimit
static c2_factory< G4double > c2
G4double CalculateNuclearRad(G4double A)
G4double Legendre96(T &typeT, F f, G4double a, G4double b)
G4complex GetErfcComp(G4complex z, G4int nMax)
void SetProfileLambda(G4double pl)
void SetNuclearRadiusCof(G4double r)
G4double AmplitudeSimMod2(G4double theta)
G4double GetExpSin(G4double x)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4double fNuclearRadiusSquare
G4double GetCofAlphaMax()
void SetCofAlphaCoulomb(G4double pa)
G4double DampFactor(G4double z)
void SetProfileDelta(G4double pd)
G4double GetExpCos(G4double x)
G4complex PhaseNear(G4double theta)
G4double fHalfRutThetaTg2
G4complex CoulombAmplitude(G4double theta)
G4double GetErf(G4double x)
G4double GetRatioSim(G4double theta)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
void CalculateCoulombPhaseZero()
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
std::vector< G4String > fElementNameVector
G4PhysicsLogVector * fEnergyVector
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
G4double Profile(G4double theta)
G4double GetSinHaPit2(G4double t)
G4ParticleDefinition * theNeutron
G4ParticleDefinition * theDeuteron
G4complex GammaLogB2n(G4complex xx)
void SetEtaRatio(G4double pa)
void SetPlabLowLimit(G4double value)
const G4ParticleDefinition * thePionPlus
G4double CalculateCoulombPhase(G4int n)
std::complex< G4double > G4complex
G4GLOB_DLL std::ostream G4cout
G4double fRutherfordTheta
void SetCofDelta(G4double pa)
void CalculateRutherfordAnglePar()
void SetRecoilKinEnergyLimit(G4double value)
G4double fRutherfordRatio
void SetLowestEnergyLimit(G4double value)
G4double CoulombAmplitudeMod2(G4double theta)
void SetCofAlphaMax(G4double pa)
G4ParticleDefinition * theAlpha
G4double GetRutherfordXsc(G4double theta)
std::vector< G4PhysicsTable * > fAngleBank
G4double fNuclearRadiusCof
G4complex TestErfcInt(G4complex z)
void SetHEModelLowLimit(G4double value)
static const G4double A[nN]
G4double GetFresnelDiffuseXsc(G4double theta)
void SetProfileAlpha(G4double pa)
G4double GetProfileLambda()
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double GetPDGMass() const
void SetQModelLowLimit(G4double value)
G4double ProfileNear(G4double theta)
G4double GetFresnelIntegrandXsc(G4double alpha)
void SetCofPhase(G4double pa)
const G4ParticleDefinition * fParticle
G4complex GetErfcSer(G4complex z, G4int nMax)
G4double AmplitudeMod2(G4double theta)
std::vector< G4double > fElementNumberVector
G4complex GetErfcInt(G4complex z)
G4complex Amplitude(G4double theta)
void SetCofLambda(G4double pa)
G4complex AmplitudeFar(G4double theta)
G4double CalcMandelstamS(const G4double mp, const G4double mt, const G4double Plab)
G4double fCofAlphaCoulomb
G4double AmplitudeGGMod2(G4double theta)
G4complex TestErfcComp(G4complex z, G4int nMax)
G4double GetCosHaPit2(G4double t)
G4double lowEnergyRecoilLimit
G4double GetPDGCharge() const
static const G4double alpha
G4double GetSint(G4double x)
const G4ParticleDefinition * thePionMinus
G4double AmplitudeGlaMod2(G4double theta)
void SetCofFar(G4double pa)
G4complex PhaseFar(G4double theta)
G4double lowEnergyLimitHE
G4double GetNuclearRadius()
G4double ProfileFar(G4double theta)
static const double fermi
G4complex GetErfSer(G4complex z, G4int nMax)
G4complex TestErfcSer(G4complex z, G4int nMax)
G4double GetCint(G4double x)
void SetCofAlpha(G4double pa)
G4PhysicsTable * fAngleTable
G4double BesselOneByArg(G4double z)