74 lowEnergyRecoilLimit = 100.*keV;
75 lowEnergyLimitQ = 0.0*GeV;
76 lowEnergyLimitHE = 0.0*GeV;
77 lowestEnergyLimit= 0.0*keV;
78 plabLowLimit = 20.0*MeV;
107 fCofAlphaCoulomb = 0.5;
116 fNuclearRadius1 = fNuclearRadius2 = fNuclearRadiusSquare
117 = fRutherfordRatio = fCoulombPhase0 = fHalfRutThetaTg = fHalfRutThetaTg2
118 = fRutherfordTheta = fProfileLambda = fCofPhase = fCofFar
119 = fSumSigma = fEtaRatio = fReZ = 0.0;
122 fNuclearRadiusCof = 1.0;
132 if ( fEnergyVector ) {
133 delete fEnergyVector;
137 for ( std::vector<G4PhysicsTable*>::iterator it = fAngleBank.begin();
138 it != fAngleBank.end(); ++it ) {
139 if ( (*it) ) (*it)->clearAndDestroy();
163 for(jEl = 0 ; jEl < numOfEl; ++jEl)
165 fAtomicNumber = (*theElementTable)[jEl]->GetZ();
169 fNuclearRadius += R1;
173 G4cout<<
"G4NuclNuclDiffuseElastic::Initialise() the element: "
174 <<(*theElementTable)[jEl]->GetName()<<
G4endl;
176 fElementNumberVector.push_back(fAtomicNumber);
177 fElementNameVector.push_back((*theElementTable)[jEl]->GetName());
180 fAngleBank.push_back(fAngleTable);
195 fParticle = particle;
196 fWaveVector = momentum/hbarc;
223 if (iZ == 1 && iA == 1) theDef = theProton;
224 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
226 else if (iZ == 2 && iA == 3) theDef =
G4He3::He3();
227 else if (iZ == 2 && iA == 4) theDef = theAlpha;
241 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
243 if( cost >= 1.0 ) cost = 1.0;
244 else if( cost <= -1.0) cost = -1.0;
246 G4double thetaCMS = std::acos(cost);
266 fParticle = particle;
267 fWaveVector = momentum/hbarc;
275 G4double kRt = fWaveVector*fNuclearRadius*theta;
278 if( z && (kRt > kRtC) )
283 fAm =
CalculateAm( momentum, fZommerfeld, fAtomicNumber);
310 if (iZ == 1 && iA == 1) theDef = theProton;
311 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
313 else if (iZ == 2 && iA == 3) theDef =
G4He3::He3();
314 else if (iZ == 2 && iA == 4) theDef = theAlpha;
328 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
330 if( cost >= 1.0 ) cost = 1.0;
331 else if( cost <= -1.0) cost = -1.0;
333 G4double thetaCMS = std::acos(cost);
360 if (iZ == 1 && iA == 1) theDef = theProton;
361 else if (iZ == 1 && iA == 2) theDef = theDeuteron;
363 else if (iZ == 2 && iA == 3) theDef =
G4He3::He3();
364 else if (iZ == 2 && iA == 4) theDef = theAlpha;
378 G4double cost = 1 - 0.5*std::fabs(tMand)/ptot2;
380 if( cost >= 1.0 ) cost = 1.0;
381 else if( cost <= -1.0) cost = -1.0;
383 G4double thetaCMS = std::acos(cost);
403 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
411 G4double kr = fWaveVector*fNuclearRadius;
416 bzero2 = bzero*bzero;
420 bonebyarg2 = bonebyarg*bonebyarg;
435 diffuse = 0.63*fermi;
437 delta = 0.1*fermi*fermi;
445 G4double kgamma = lambda*(1.-
G4Exp(-fWaveVector*gamma/lambda));
452 G4double pikdt = lambda*(1.-
G4Exp(-pi*fWaveVector*diffuse*theta/lambda));
457 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
458 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
464 sigma += mode2k2*bone2 + e2dk3t*bzero*bone;
465 sigma += kr2*bonebyarg2;
483 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
491 G4double kr = fWaveVector*fNuclearRadius;
496 bzero2 = bzero*bzero;
500 bonebyarg2 = bonebyarg*bonebyarg;
502 if (fParticle == theProton)
504 diffuse = 0.63*fermi;
507 delta = 0.1*fermi*fermi;
513 diffuse = 0.63*fermi;
515 delta = 0.1*fermi*fermi;
521 G4double kgamma = lambda*(1.-
G4Exp(-fWaveVector*gamma/lambda));
527 G4double sinHalfTheta = std::sin(0.5*theta);
528 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
530 kgamma += 0.5*fZommerfeld/kr/(sinHalfTheta2+fAm);
541 G4double pikdt = lambda*(1.-
G4Exp(-pi*fWaveVector*diffuse*theta/lambda));
548 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
549 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
554 sigma += mode2k2*bone2;
555 sigma += e2dk3t*bzero*bone;
558 sigma += kr2*bonebyarg2;
576 theta = std::sqrt(alpha);
580 G4double sigma, bzero, bzero2, bonebyarg, bonebyarg2, damp, damp2;
588 G4double kr = fWaveVector*fNuclearRadius;
593 bzero2 = bzero*bzero;
597 bonebyarg2 = bonebyarg*bonebyarg;
599 if (fParticle == theProton)
601 diffuse = 0.63*fermi;
604 delta = 0.1*fermi*fermi;
610 diffuse = 0.63*fermi;
612 delta = 0.1*fermi*fermi;
618 G4double kgamma = lambda*(1.-
G4Exp(-fWaveVector*gamma/lambda));
625 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
627 kgamma += 0.5*fZommerfeld/kr/(sinHalfTheta2+fAm);
638 G4double pikdt = lambda*(1.-
G4Exp(-pi*fWaveVector*diffuse*theta/lambda));
645 G4double mode2k2 = (e1*e1+e2*e2)*fWaveVector*fWaveVector;
646 G4double e2dk3t = -2.*e2*delta*fWaveVector*fWaveVector*fWaveVector*theta;
651 sigma += mode2k2*bone2;
652 sigma += e2dk3t*bzero*bone;
655 sigma += kr2*bonebyarg2;
690 fParticle = particle;
691 fWaveVector = momentum/hbarc;
713 G4double t = 2*p*p*( 1 - std::cos(theta) );
727 G4double norm, theta1, theta2, thetaMax;
730 fParticle = particle;
731 fWaveVector = momentum/hbarc;
736 thetaMax = 10.174/fWaveVector/fNuclearRadius;
738 if (thetaMax > pi) thetaMax = pi;
747 for(i = 1; i <= iMax; i++)
749 theta1 = (i-1)*thetaMax/iMax;
750 theta2 = i*thetaMax/iMax;
755 result = 0.5*(theta1 + theta2);
759 if (i > iMax ) result = 0.5*(theta1 + theta2);
763 result += G4RandGauss::shoot(0.,sigma);
765 if(result < 0.) result = 0.;
766 if(result > thetaMax) result = thetaMax;
781 fParticle = aParticle;
785 G4double t(0.), m1 = fParticle->GetPDGMass();
786 G4double totElab = std::sqrt(m1*m1+p*p);
818 fNuclearRadius += R1;
822 fCoulombMuC = fHalfRutThetaTg2/(1.+fHalfRutThetaTg2);
828 mu = fCoulombMuC*rand*fAm;
829 mu /= fAm + fCoulombMuC*( 1. - rand );
859 std::size_t iElement;
860 G4int iMomentum, iAngle;
864 for(iElement = 0; iElement < fElementNumberVector.size(); iElement++)
866 if( std::fabs(Z - fElementNumberVector[iElement]) < 0.5)
break;
868 if ( iElement == fElementNumberVector.size() )
880 fAngleTable = fAngleBank[iElement];
882 G4double kinE = std::sqrt(momentum*momentum + m1*m1) - m1;
884 for( iMomentum = 0; iMomentum < fEnergyBin; iMomentum++)
888 if( kinE < fEnergyVector->GetLowEdgeEnergy(iMomentum) )
break;
893 if ( iMomentum >= fEnergyBin ) iMomentum = fEnergyBin-1;
894 if ( iMomentum < 0 ) iMomentum = 0;
897 if (iMomentum == fEnergyBin -1 || iMomentum == 0 )
903 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
905 if(
position < (*(*fAngleTable)(iMomentum))(iAngle) )
break;
907 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
922 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
925 if(
position > (*(*fAngleTable)(iMomentum))(iAngle) )
break;
927 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
935 E2 = fEnergyVector->GetLowEdgeEnergy(iMomentum);
945 for(iAngle = 0; iAngle < fAngleBin-1; iAngle++)
948 if(
position > (*(*fAngleTable)(iMomentum))(iAngle) )
break;
950 if (iAngle >= fAngleBin-1) iAngle = fAngleBin-2;
956 E1 = fEnergyVector->GetLowEdgeEnergy(iMomentum);
964 randAngle = W1*theta1 + W2*theta2;
991 G4cout<<
"G4NuclNuclDiffuseElastic::Initialise() the element with Z = "
994 fElementNumberVector.push_back(fAtomicNumber);
998 fAngleBank.push_back(fAngleTable);
1011 G4double partMom, kinE, m1 = fParticle->GetPDGMass();
1012 G4double alpha1,
alpha2, alphaMax, alphaCoulomb, delta = 0., sum = 0.;
1020 for( i = 0; i < fEnergyBin; i++)
1022 kinE = fEnergyVector->GetLowEdgeEnergy(i);
1027 partMom = std::sqrt( kinE*(kinE + 2*m1) );
1031 alphaMax = fRutherfordTheta*fCofAlphaMax;
1033 if(alphaMax > pi) alphaMax = pi;
1038 alphaCoulomb = fRutherfordTheta*fCofAlphaCoulomb;
1046 G4double delth = (alphaMax-alphaCoulomb)/fAngleBin;
1054 for(j = fAngleBin-1; j >= 1; j--)
1062 alpha1 = alphaCoulomb + delth*(j-1);
1071 angleVector->
PutValue( j-1 , alpha1, sum );
1074 fAngleTable->insertAt(i,angleVector);
1089 G4double x1, x2, y1, y2, randAngle;
1093 randAngle = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle);
1098 if ( iAngle >=
G4int((*fAngleTable)(iMomentum)->GetVectorLength()) )
1100 iAngle =
G4int((*fAngleTable)(iMomentum)->GetVectorLength() - 1);
1102 y1 = (*(*fAngleTable)(iMomentum))(iAngle-1);
1103 y2 = (*(*fAngleTable)(iMomentum))(iAngle);
1105 x1 = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle-1);
1106 x2 = (*fAngleTable)(iMomentum)->GetLowEdgeEnergy(iAngle);
1108 if ( x1 == x2 ) randAngle = x2;
1111 if ( y1 == y2 ) randAngle = x1 + ( x2 - x1 )*
G4UniformRand();
1114 randAngle = x1 + (
position - y1 )*( x2 - x1 )/( y2 - y1 );
1148 t =
SampleT( theParticle, ptot,
A);
1149 if (t <= 0.0) {
return 0.0; }
1156 G4cout <<
"G4NuclNuclDiffuseElastic:WARNING: A = " <<
A
1157 <<
" mom(GeV)= " << plab/GeV
1158 <<
" S-wave will be sampled"
1165 G4cout <<
" t= " << t <<
" tmax= " << tmax
1166 <<
" ptot= " << ptot <<
G4endl;
1172 G4double sint = std::sqrt((1.0-cost)*(1.0+cost));
1176 G4cout <<
"cos(t)=" << cost <<
" std::sin(t)=" << sint <<
G4endl;
1178 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1219 G4double cost = std::cos(thetaCMS);
1227 else if( cost <= -1.0)
1234 sint = std::sqrt((1.0-cost)*(1.0+cost));
1238 G4cout <<
"cos(tcms)=" << cost <<
" std::sin(tcms)=" << sint <<
G4endl;
1240 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1280 G4double cost = std::cos(thetaLab);
1288 else if( cost <= -1.0)
1295 sint = std::sqrt((1.0-cost)*(1.0+cost));
1299 G4cout <<
"cos(tlab)=" << cost <<
" std::sin(tlab)=" << sint <<
G4endl;
1301 G4ThreeVector v1(sint*std::cos(phi),sint*std::sin(phi),cost);
1329 G4cout<<
"G4NuclNuclDiffuseElastic::TestAngleTable() init the element with Z = "
1332 fElementNumberVector.push_back(fAtomicNumber);
1340 G4double deltaL10 = 0., deltaL96 = 0., deltaAG = 0.;
1341 G4double sumL10 = 0.,sumL96 = 0.,sumAG = 0.;
1348 fWaveVector = partMom/hbarc;
1350 G4double kR = fWaveVector*fNuclearRadius;
1355 alphaMax = kRmax*kRmax/kR2;
1357 if (alphaMax > 4.) alphaMax = 4.;
1359 alphaCoulomb = kRcoul*kRcoul/kR2;
1364 fBeta = a/std::sqrt(1+a*a);
1366 fAm =
CalculateAm( partMom, fZommerfeld, fAtomicNumber);
1373 fAddCoulomb =
false;
1375 for(j = 1; j < fAngleBin; j++)
1380 alpha1 = alphaMax*(j-1)/fAngleBin;
1381 alpha2 = alphaMax*( j )/fAngleBin;
1383 if( (
alpha2 > alphaCoulomb ) && z ) fAddCoulomb =
true;
1397 G4cout<<alpha1<<
"\t"<<std::sqrt(alpha1)/degree<<
"\t"
1398 <<sumL10<<
"\t"<<sumL96<<
"\t"<<sumAG<<
G4endl;
1400 angleVector->
PutValue( j-1 , alpha1, sumL10 );
1402 fAngleTable->insertAt(i,angleVector);
1403 fAngleBank.push_back(fAngleTable);
1428 if ( n < 0 ) legPol = 0.;
1429 else if( n == 0 ) legPol = 1.;
1430 else if( n == 1 ) legPol = x;
1431 else if( n == 2 ) legPol = (3.*x*x-1.)/2.;
1432 else if( n == 3 ) legPol = (5.*x*x*x-3.*x)/2.;
1433 else if( n == 4 ) legPol = (35.*x*x*x*x-30.*x*x+3.)/8.;
1434 else if( n == 5 ) legPol = (63.*x*x*x*x*x-70.*x*x*x+15.*x)/8.;
1435 else if( n == 6 ) legPol = (231.*x*x*x*x*x*x-315.*x*x*x*x+105.*x*x-5.)/16.;
1440 legPol = std::sqrt( 2./(n*CLHEP::pi*std::sin(theta+
epsilon)) )*std::sin( (n+0.5)*theta+0.25*CLHEP::pi );
1452 G4double n2, cofn, shny, chny, fn, gn;
1471 for( n = 1; n <= nMax; n++)
1475 cofn =
G4Exp(-0.5*n2)/(n2+twox2);
1477 chny = std::cosh(n*y);
1478 shny = std::sinh(n*y);
1480 fn = twox - twoxcos2xy*chny + n*sin2xy*shny;
1481 gn = twoxsin2xy*chny + n*cos2xy*shny;
1492 if(std::abs(x) < 0.0001)
1499 outRe +=
GetErf(x) + cof1*(1-cos2xy)/twox;
1500 outIm += cof1*sin2xy/twox;
1523 outRe *= 2./std::sqrt(CLHEP::pi);
1524 outIm *= 2./std::sqrt(CLHEP::pi);
1538 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1539 G4double cosHalfThetaR2 = 1./(1. + fHalfRutThetaTg2);
1541 G4double u = std::sqrt(0.5*fProfileLambda/sinThetaR);
1542 G4double kappa = u/std::sqrt(CLHEP::pi);
1543 G4double dTheta = theta - fRutherfordTheta;
1550 order /= std::sqrt(2.);
1553 G4complex a0 = 0.5*(1. + 4.*(1.+im*u2)*cosHalfThetaR2/3.)/sinThetaR;
1554 G4complex a1 = 0.5*(1. + 2.*(1.+im*u2m2p3)*cosHalfThetaR2)/sinThetaR;
1566 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1567 G4double cosHalfThetaR2 = 1./(1. + fHalfRutThetaTg2);
1569 G4double u = std::sqrt(0.5*fProfileLambda/sinThetaR);
1570 G4double kappa = u/std::sqrt(CLHEP::pi);
1571 G4double dTheta = theta - fRutherfordTheta;
1578 order /= std::sqrt(2.);
1580 G4complex a0 = 0.5*(1. + 4.*(1.+im*u2)*cosHalfThetaR2/3.)/sinThetaR;
1581 G4complex a1 = 0.5*(1. + 2.*(1.+im*u2m2p3)*cosHalfThetaR2)/sinThetaR;
1593 G4double kappa = std::sqrt(0.5*fProfileLambda/std::sin(theta)/CLHEP::pi);
1598 if( theta <= fRutherfordTheta )
1618 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1619 G4double dTheta = 0.5*(theta - fRutherfordTheta);
1620 G4double sindTheta = std::sin(dTheta);
1621 G4double persqrt2 = std::sqrt(0.5);
1624 order *= std::sqrt(0.5*fProfileLambda/sinThetaR)*2.*sindTheta;
1629 if ( theta <= fRutherfordTheta )
1654 for( n = 0; n < fMaxL; n++)
1658 b = ( std::sqrt(
G4double(n*(n+1)) ) )/fWaveVector;
1660 T12b = fSumSigma*
G4Exp(-b2/fNuclearRadiusSquare)/CLHEP::pi/fNuclearRadiusSquare;
1661 shiftN = std::exp( -0.5*(1.-im*fEtaRatio)*T12b ) - 1.;
1664 out /= 2.*im*fWaveVector;
1677 G4double T12b, a, aTemp, b2, sinThetaH = std::sin(0.5*theta);
1678 G4double sinThetaH2 = sinThetaH*sinThetaH;
1682 a = -fSumSigma/CLHEP::twopi/fNuclearRadiusSquare;
1683 b2 = fWaveVector*fWaveVector*fNuclearRadiusSquare*sinThetaH2;
1687 for( n = 1; n < fMaxL; n++)
1689 T12b = aTemp*
G4Exp(-b2/n)/n;
1694 out *= -4.*im*fWaveVector/CLHEP::pi;
1715 fNuclearRadius = fNuclearRadius1 + fNuclearRadius2;
1721 fWaveVector = partMom/CLHEP::hbarc;
1723 G4double lambda = fCofLambda*fWaveVector*fNuclearRadius;
1729 fBeta = a/std::sqrt(1+a*a);
1731 fRutherfordRatio = fZommerfeld/fWaveVector;
1732 fAm =
CalculateAm( partMom, fZommerfeld, fAtomicNumber);
1735 fProfileLambda = lambda;
1737 fProfileDelta = fCofDelta*fProfileLambda;
1738 fProfileAlpha = fCofAlpha*fProfileLambda;
1757 fWaveVector = partMom/CLHEP::hbarc;
1759 G4double lambda = fCofLambda*fWaveVector*fNuclearRadius;
1764 fBeta = a/std::sqrt(1+a*a);
1766 fRutherfordRatio = fZommerfeld/fWaveVector;
1767 fAm =
CalculateAm( partMom, fZommerfeld, fAtomicNumber);
1769 fProfileLambda = lambda;
1770 fProfileDelta = fCofDelta*fProfileLambda;
1771 fProfileAlpha = fCofAlpha*fProfileLambda;
1794 fNuclearRadiusSquare = fNuclearRadius1*fNuclearRadius1+fNuclearRadius2*fNuclearRadius2;
1801 fWaveVector = partMom/CLHEP::hbarc;
1804 if( pN < 0. ) pN = 0.;
1807 if( tN < 0. ) tN = 0.;
1816 G4cout<<
"fSumSigma = "<<fSumSigma/CLHEP::millibarn<<
" mb"<<
G4endl;
1817 G4cout<<
"pi*R2 = "<<CLHEP::pi*fNuclearRadiusSquare/CLHEP::millibarn<<
" mb"<<
G4endl;
1818 kR12 = fWaveVector*std::sqrt(fNuclearRadiusSquare);
1820 fMaxL = (
G4int(kR12)+1)*4;
1826 fBeta = a/std::sqrt(1+a*a);
1828 fAm =
CalculateAm( partMom, fZommerfeld, fAtomicNumber);
1857 G4double proj_energy = proj_mass + pTkin;
1858 G4double proj_momentum = std::sqrt(pTkin*(pTkin+2*proj_mass));
1862 sMand /= CLHEP::GeV*CLHEP::GeV;
1863 proj_momentum /= CLHEP::GeV;
1864 proj_energy /= CLHEP::GeV;
1865 proj_mass /= CLHEP::GeV;
1873 if( proj_momentum >= 1.2 )
1877 else if( proj_momentum >= 0.6 )
1884 fEtaRatio = 15.5*proj_momentum/(27*proj_momentum*proj_momentum*proj_momentum+2);
1890 if( proj_momentum >= 10. )
1900 A0 = 100. - B0*
G4Log(3.0e7);
1902 xsection = A0 + B0*
G4Log(proj_energy) - 11
1904 0.93827*0.93827,-0.165);
1909 if(pParticle == tParticle)
1911 if( proj_momentum < 0.73 )
1915 else if( proj_momentum < 1.05 )
1917 hnXsc = 23 + 40*(
G4Log(proj_momentum/0.73))*
1918 (
G4Log(proj_momentum/0.73));
1929 if( proj_momentum < 0.8 )
1933 else if( proj_momentum < 1.4 )
1946 xsection *= CLHEP::millibarn;
1947 G4cout<<
"xsection = "<<xsection/CLHEP::millibarn<<
" mb"<<
G4endl;
1957 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1958 G4double dTheta = 0.5*(theta - fRutherfordTheta);
1959 G4double sindTheta = std::sin(dTheta);
1964 G4double order = std::sqrt(fProfileLambda/sinThetaR/CLHEP::pi)*2.*sindTheta;
1966 order = std::abs(order);
1974 if ( theta <= fRutherfordTheta )
1976 out = 1. + 0.5*( (0.5-cosFresnel)*(0.5-cosFresnel)+(0.5-sinFresnel)*(0.5-sinFresnel) )*prof2;
1977 out += ( cosFresnel + sinFresnel - 1. )*prof;
1981 out = 0.5*( (0.5-cosFresnel)*(0.5-cosFresnel)+(0.5-sinFresnel)*(0.5-sinFresnel) )*prof2;
1994 const G4double cof[6] = { 76.18009172947146, -86.50532032941677,
1995 24.01409824083091, -1.231739572450155,
1996 0.1208650973866179e-2, -0.5395239384953e-5 } ;
2000 tmp -= (z + 0.5) * std::log(tmp);
2003 for ( j = 0; j <= 5; j++ )
2008 return -tmp + std::log(2.5066282746310005*ser);
2018 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
2020 modvalue = std::fabs(value);
2022 if ( value < 8.0 && value > -8.0 )
2024 value2 = value*value;
2026 fact1 = 57568490574.0 + value2*(-13362590354.0
2027 + value2*( 651619640.7
2028 + value2*(-11214424.18
2029 + value2*( 77392.33017
2030 + value2*(-184.9052456 ) ) ) ) );
2032 fact2 = 57568490411.0 + value2*( 1029532985.0
2033 + value2*( 9494680.718
2034 + value2*(59272.64853
2035 + value2*(267.8532712
2036 + value2*1.0 ) ) ) );
2038 bessel = fact1/fact2;
2046 shift = modvalue-0.785398164;
2048 fact1 = 1.0 + value2*(-0.1098628627e-2
2049 + value2*(0.2734510407e-4
2050 + value2*(-0.2073370639e-5
2051 + value2*0.2093887211e-6 ) ) );
2053 fact2 = -0.1562499995e-1 + value2*(0.1430488765e-3
2054 + value2*(-0.6911147651e-5
2055 + value2*(0.7621095161e-6
2056 - value2*0.934945152e-7 ) ) );
2058 bessel = std::sqrt(0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2 );
2070 G4double modvalue, value2, fact1, fact2, arg, shift, bessel;
2072 modvalue = std::fabs(value);
2074 if ( modvalue < 8.0 )
2076 value2 = value*value;
2078 fact1 = value*(72362614232.0 + value2*(-7895059235.0
2079 + value2*( 242396853.1
2080 + value2*(-2972611.439
2081 + value2*( 15704.48260
2082 + value2*(-30.16036606 ) ) ) ) ) );
2084 fact2 = 144725228442.0 + value2*(2300535178.0
2085 + value2*(18583304.74
2086 + value2*(99447.43394
2087 + value2*(376.9991397
2088 + value2*1.0 ) ) ) );
2089 bessel = fact1/fact2;
2097 shift = modvalue - 2.356194491;
2099 fact1 = 1.0 + value2*( 0.183105e-2
2100 + value2*(-0.3516396496e-4
2101 + value2*(0.2457520174e-5
2102 + value2*(-0.240337019e-6 ) ) ) );
2104 fact2 = 0.04687499995 + value2*(-0.2002690873e-3
2105 + value2*( 0.8449199096e-5
2106 + value2*(-0.88228987e-6
2107 + value2*0.105787412e-6 ) ) );
2109 bessel = std::sqrt( 0.636619772/modvalue)*(std::cos(shift)*fact1 - arg*std::sin(shift)*fact2);
2111 if (value < 0.0) bessel = -bessel;
G4double epsilon(G4double density, G4double temperature)
std::vector< G4Element * > G4ElementTable
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
CLHEP::HepLorentzVector G4LorentzVector
CLHEP::Hep3Vector G4ThreeVector
std::complex< G4double > G4complex
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
static G4Deuteron * Deuteron()
G4ParticleDefinition * GetDefinition() const
G4LorentzVector Get4Momentum() const
G4double GetKineticEnergy() const
G4double GetTotalMomentum() const
static std::size_t GetNumberOfElements()
static const G4ElementTable * GetElementTable()
G4double GetTotalMomentum() const
const G4ParticleDefinition * GetDefinition() const
const G4LorentzVector & Get4Momentum() const
G4HadronElastic(const G4String &name="hElasticLHEP")
void SetMinEnergy(G4double anEnergy)
void SetMaxEnergy(const G4double anEnergy)
G4double GetMaxEnergy() const
static G4HadronicParameters * Instance()
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4Neutron * Neutron()
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double CalcMandelstamS(const G4double mp, const G4double mt, const G4double Plab)
G4double GetInvElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
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 GetRatioGen(G4double theta)
G4double Profile(G4double theta)
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()
G4double BesselJzero(G4double z)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
G4complex AmplitudeGla(G4double theta)
virtual ~G4NuclNuclDiffuseElastic()
G4complex GetErfComp(G4complex z, G4int nMax)
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 IntegralElasticProb(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A)
G4double ProfileNear(G4double theta)
G4double SampleTableThetaCMS(const G4ParticleDefinition *aParticle, G4double p, G4double Z, G4double A)
G4complex GetErfInt(G4complex z)
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)
G4complex PhaseNear(G4double theta)
G4complex GammaLogarithm(G4complex xx)
G4double GetDiffuseElasticSumXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double A, G4double Z)
G4complex CoulombAmplitude(G4double theta)
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position)
G4double GetDiffElasticSumProbA(G4double alpha)
void CalculateCoulombPhaseZero()
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)
G4double GetExpSin(G4double x)
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)
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 GetExpCos(G4double x)
G4double GetErf(G4double x)
G4double SampleCoulombMuCMS(const G4ParticleDefinition *aParticle, G4double p)
G4double DampFactor(G4double z)
G4complex GammaMore(G4double theta)
G4double GetDiffElasticProb(G4double theta)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4complex GammaLess(G4double theta)
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double GetPDGMass() const
G4double GetPDGCharge() const
G4int GetBaryonNumber() const
G4IonTable * GetIonTable() const
static G4ParticleTable * GetParticleTable()
void PutValue(const std::size_t index, const G4double e, const G4double value)
static G4PionMinus * PionMinus()
static G4PionPlus * PionPlus()
static G4Pow * GetInstance()
G4double powA(G4double A, G4double y) const
static G4Proton * Proton()
static G4Triton * Triton()