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)