116 for(
G4int i = 0; i < 500; ++i )
134 fSandia = (*theMaterialTable)[matIndex]->GetSandiaTable();
149 for(j = 1; j < 5; j++)
170 fDensity = (*theMaterialTable)[materialIndex]->GetDensity();
172 GetElectronDensity();
174 GetSandiaTable()->GetMatNbOfIntervals();
186 if(((*theMaterialTable)[materialIndex]->
187 GetSandiaTable()->GetSandiaCofForMaterial(i-1,0) >= maxEnergyTransfer) ||
195 GetSandiaTable()->GetSandiaCofForMaterial(i-1,0);
196 fA1[i] = (*theMaterialTable)[materialIndex]->
197 GetSandiaTable()->GetSandiaCofForMaterial(i-1,1);
198 fA2[i] = (*theMaterialTable)[materialIndex]->
199 GetSandiaTable()->GetSandiaCofForMaterial(i-1,2);
200 fA3[i] = (*theMaterialTable)[materialIndex]->
201 GetSandiaTable()->GetSandiaCofForMaterial(i-1,3);
202 fA4[i] = (*theMaterialTable)[materialIndex]->
203 GetSandiaTable()->GetSandiaCofForMaterial(i-1,4);
299 for(
G4int i = 0; i < 500; ++i )
310 fDensity = (*theMaterialTable)[materialIndex]->GetDensity();
311 fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity();
333 if( ( photoAbsCof[i-1][0] >= maxEnergyTransfer ) ||
341 fA1[i] = photoAbsCof[i-1][1];
342 fA2[i] = photoAbsCof[i-1][2];
343 fA3[i] = photoAbsCof[i-1][3];
344 fA4[i] = photoAbsCof[i-1][4];
442 G4int i, j, numberOfElements;
445 fDensity = (*theMaterialTable)[materialIndex]->GetDensity();
446 fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity();
447 numberOfElements = (*theMaterialTable)[materialIndex]->GetNumberOfElements();
449 G4int* thisMaterialZ =
new G4int[numberOfElements];
451 for( i = 0; i < numberOfElements; i++ )
453 thisMaterialZ[i] = (
G4int)(*theMaterialTable)[materialIndex]->
454 GetElement(i)->GetZ();
457 fSandia = (*theMaterialTable)[materialIndex]->GetSandiaTable();
463 (*theMaterialTable)[materialIndex]->GetFractionVector() ,
614 G4cout<<
"G4PAIxSection::Initialize(...,G4SandiaTable* sandia)"<<
G4endl;
751 static const G4double p0 = 1.20923e+00;
752 static const G4double p1 = 3.53256e-01;
753 static const G4double p2 = -1.45052e-03;
758 for( i = 0; i < numberOfElements; i++ )
760 thisMaterialZ[i] =
material->GetElement(i)->GetZ();
761 sumZ += thisMaterialZ[i];
762 thisMaterialCof[i] = p0+p1*thisMaterialZ[i]+p2*thisMaterialZ[i]*thisMaterialZ[i];
764 for( i = 0; i < numberOfElements; i++ )
766 sumCof += thisMaterialCof[i]*thisMaterialZ[i]/sumZ;
769 delete [] thisMaterialZ;
770 delete [] thisMaterialCof;
792 for( i = 0; i < numberOfElements; i++ )
794 thisMaterialZ[i] = (*theMaterialTable)[
fMaterialIndex]->GetElement(i)->GetZ();
795 sumZ += thisMaterialZ[i];
796 thisMaterialCof[i] = p0+p1*thisMaterialZ[i]+p2*thisMaterialZ[i]*thisMaterialZ[i];
798 for( i = 0; i < numberOfElements; i++ )
800 sumCof += thisMaterialCof[i]*thisMaterialZ[i]/sumZ;
804 delete [] thisMaterialZ;
805 delete [] thisMaterialCof;
840 for(
G4int j = 1; j < 112; j++)
882 for( j = 1; j <= 2; j++ )
924 for( j = 1; j <= 2; j++ )
952 G4int j, k = 1, i = 1;
990 if(
fVerbose>0)
G4cout<<
"Spline: x1 = "<<x1<<
"; x2 = "<<x2<<
", yy1 = "<<yy1<<
"; y2 = "<<y2<<
G4endl;
1002 G4double a = log10(y2/yy1)/log10(x2/x1);
1003 G4double b = log10(yy1) - a*log10(x1);
1038 if( x >
fError && fSplineNumber < fMaxSplineSize-1 && delta > 2.*
fDelta )
1061 c1 = (x2 - x1)/x1/x2;
1062 c2 = (x2 - x1)*(x2 + x1)/x1/x1/x2/x2;
1063 c3 = (x2 - x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2;
1066 return fA1[k]*log(x2/x1) +
fA2[k]*c1 +
fA3[k]*c2/2 +
fA4[k]*c3/3;
1079 G4double energy2,energy3,energy4,result;
1081 energy2 = energy1*energy1;
1082 energy3 = energy2*energy1;
1083 energy4 = energy3*energy1;
1085 result =
fA1[k]/energy1+
fA2[k]/energy2+
fA3[k]/energy3+
fA4[k]/energy4;
1086 result *=
hbarc/energy1;
1101 energy2 = energy1*energy1;
1102 energy3 = energy2*energy1;
1103 energy4 = energy3*energy1;
1116 result =
fA1[i]/energy1+
fA2[i]/energy2+
fA3[i]/energy3+
fA4[i]/energy4;
1173 G4double x0, x02, x03, x04, x05, x1, x2, xx1 ,xx2 , xx12,
1174 c1, c2, c3, cof1, cof2, xln1, xln2, xln3, result;
1193 xln3 = log((x2 + x0)/(x1 + x0));
1198 c1 = (x2 - x1)/x1/x2;
1199 c2 = (x2 - x1)*(x2 +x1)/x1/x1/x2/x2;
1200 c3 = (x2 -x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2;
1202 result -= (
fA1[i]/x02 +
fA3[i]/x04)*xln1;
1203 result -= (
fA2[i]/x02 +
fA4[i]/x04)*c1;
1204 result -=
fA3[i]*c2/2/x02;
1205 result -=
fA4[i]*c3/3/x02;
1207 cof1 =
fA1[i]/x02 +
fA3[i]/x04;
1208 cof2 =
fA2[i]/x03 +
fA4[i]/x05;
1210 result += 0.5*(cof1 +cof2)*xln2;
1211 result += 0.5*(cof1 - cof2)*xln3;
1228 G4double cof,x1,x2,x3,x4,x5,x6,x7,x8,result;
1234 G4double be2 = betaGammaSq/(1 + betaGammaSq);
1241 if( betaGammaSq < 0.01 ) x2 = log(be2);
1273 if( result < 1.0e-8 ) result = 1.0e-8;
1281 result *= (1 - exp(-
beta/betaBohr/lowCof));
1305 G4double logarithm, x3, x5, argument, modul2, dNdxC;
1306 G4double be2, betaBohr2, cofBetaBohr;
1310 G4double betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr;
1312 be2 = betaGammaSq/(1 + betaGammaSq);
1315 if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq);
1321 logarithm += log(1+1.0/betaGammaSq);
1334 if( x3 == 0.0 ) argument = 0.5*
pi;
1340 if(dNdxC < 1.0e-8) dNdxC = 1.0e-8;
1344 dNdxC *= (1-exp(-be4/betaBohr4));
1363 G4double logarithm, x3, x5, argument, dNdxC;
1364 G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr;
1368 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr;
1370 be2 = betaGammaSq/(1 + betaGammaSq);
1373 if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq);
1379 logarithm += log(1+1.0/betaGammaSq);
1390 if( x3 == 0.0 ) argument = 0.5*
pi;
1396 if(dNdxC < 1.0e-8) dNdxC = 1.0e-8;
1400 dNdxC *= (1-exp(-be4/betaBohr4));
1413 G4double resonance, modul2, dNdxP, cof = 1.;
1417 be2 = betaGammaSq/(1 + betaGammaSq);
1427 if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8;
1454 G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr;
1458 betaBohr4 = betaBohr2*betaBohr2*cofBetaBohr;
1460 be2 = betaGammaSq/(1 + betaGammaSq);
1469 if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8;
1472 dNdxP *= (1-exp(-be4/betaBohr4));
1640 G4double x0,x1,y0,yy1,a,b,c,result;
1646 if( x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1654 a = log10(yy1/y0)/log10(c);
1661 if( std::abs(a) < 1.e-6 )
1663 result = b*log(x1/x0);
1667 result = y0*(x1*pow(c,a-1) - x0)/a;
1670 if( std::abs(a) < 1.e-6 )
1687 G4double x0,x1,y0,yy1,a,b,c,result;
1692 if(x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1697 a = log10(yy1/y0)/log10(c);
1703 result = b*log(x1/x0);
1707 result = y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
1721 G4double x0,x1,y0,yy1,a,b,c,result;
1726 if(x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1734 a = log10(yy1/y0)/log10(c);
1738 if(a == 0) result = b*log(c);
1739 else result = y0*(x1*pow(c,a-1) - x0)/a;
1757 G4double x0,x1,y0,yy1,a,b,c,result;
1762 if(x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1771 a = log10(yy1/y0)/log10(c);
1772 if(a > 10.0)
return 0.;
1776 if(a == 0) result = b*log(c);
1777 else result = y0*(x1*pow(c,a-1) - x0)/a;
1781 else fIntegralMM[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
1795 G4double x0,x1,y0,yy1,a,b,c,result;
1800 if(x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1805 a = log10(yy1/y0)/log10(c);
1806 if(a > 10.0)
return 0.;
1811 if(a == 0) result = b*log(x1/x0);
1812 else result = y0*(x1*pow(c,a-1) - x0)/a;
1830 G4double x0,x1,y0,yy1,a,b,c,result;
1835 if(x1+x0 <= 0.0 || std::abs( 2.*(x1-x0)/(x1+x0) ) < 1.e-6)
return 0.;
1840 a = log10(yy1/y0)/log10(c);
1841 if(a > 10.0)
return 0.;
1846 if(a == 0) result = b*log(x1/x0);
1847 else result = y0*(x1*pow(c,a-1) - x0)/a;
1865 G4double x0,x1,y0,yy1,a,b,d,e0,result;
1875 a = log10(yy1/y0)/log10(x1/x0);
1876 if(a > 10.0)
return 0.;
1884 if( std::abs(a) < 1.e-6 )
1886 result = b*log(x0/e0);
1890 result = y0*(x0 - e0*pow(d,a-1))/a;
1893 if( std::abs(a) < 1.e-6 )
1908 a = log10(yy1/y0)/log10(x1/x0);
1912 if( std::abs(a) < 1.e-6 )
1914 result += b*log(e0/x0);
1918 result += y0*(e0*pow(d,a-1) - x0)/a;
1921 if( std::abs(a) < 1.e-6 )
1938 G4double x0,x1,y0,yy1,a,b,d,e0,result;
1948 a = log10(yy1/y0)/log10(x1/x0);
1949 if(a > 10.0)
return 0.;
1956 result = b*log(x0/e0);
1960 result = y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
1969 a = log10(yy1/y0)/log10(x1/x0);
1975 result += b*log(e0/x0);
1979 result += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
1993 G4double x0,x1,y0,yy1,a,b,e0,c,d,result;
2006 a = log10(yy1/y0)/log10(c);
2007 if(a > 10.0)
return 0.;
2012 if( a == 0 ) result = b*log(x0/e0);
2013 else result = y0*(x0 - e0*pow(d,a-1))/a;
2031 a = log10(yy1/y0)/log10(x1/x0);
2036 if( a == 0 ) result += b*log(e0/x0);
2037 else result += y0*(e0*pow(d,a-1) - x0 )/a;
2058 G4double x0,x1,y0,yy1,a,b,e0,c,d,result;
2071 a = log10(yy1/y0)/log10(c);
2072 if(a > 10.0)
return 0.;
2077 if( a == 0 ) result = b*log(x0/e0);
2078 else result = y0*(x0 - e0*pow(d,a-1))/a;
2082 else fIntegralMM[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
2096 a = log10(yy1/y0)/log10(x1/x0);
2101 if( a == 0 ) result += b*log(e0/x0);
2102 else result += y0*(e0*pow(d,a-1) - x0 )/a;
2106 else fIntegralMM[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
2123 G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
2133 a = log10(yy1/y0)/log10(c);
2134 if(a > 10.0)
return 0.;
2139 if( a == 0 ) result = b*log(x0/e0);
2140 else result = y0*(x0 - e0*pow(d,a-1))/a;
2153 a = log10(yy1/y0)/log10(c);
2158 if( a == 0 ) result += b*log(e0/x0);
2159 else result += y0*(e0*pow(d,a-1) - x0)/a;
2177 G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
2187 a = log10(yy1/y0)/log10(c);
2188 if(a > 10.0)
return 0.;
2193 if( a == 0 ) result = b*log(x0/e0);
2194 else result = y0*(x0 - e0*pow(d,a-1))/a;
2207 a = log10(yy1/y0)/log10(c);
2212 if( a == 0 ) result += b*log(e0/x0);
2213 else result += y0*(e0*pow(d,a-1) - x0)/a;
2235 numOfCollisions =
G4Poisson(meanNumber);
2239 while(numOfCollisions)
2262 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2274 return energyTransfer;
2289 numOfCollisions =
G4Poisson(meanNumber);
2293 while(numOfCollisions)
2316 numOfCollisions =
G4Poisson(meanNumber);
2320 while(numOfCollisions)
2343 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2355 return energyTransfer;
2370 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2382 return energyTransfer;
2397 numOfCollisions =
G4Poisson(meanNumber);
2401 while(numOfCollisions)
2424 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2436 return energyTransfer;
2451 numOfCollisions =
G4Poisson(meanNumber);
2455 while(numOfCollisions)
2479 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2491 return energyTransfer;
2507 for( iTransfer = 1; iTransfer <=
fSplineNumber; iTransfer++ )
2519 return energyTransfer;
2527 G4String head =
"G4PAIxSection::" + methodName +
"()";
2529 ed <<
"Wrong index " << i <<
" fSplineNumber= " <<
fSplineNumber;
25431.094989e+00, 1.107813e+00, 1.122369e+00, 1.138890e+00, 1.157642e+00,
25441.178925e+00, 1.203082e+00, 1.230500e+00, 1.261620e+00, 1.296942e+00,
25451.337032e+00, 1.382535e+00, 1.434181e+00, 1.492800e+00, 1.559334e+00,
25461.634850e+00, 1.720562e+00, 1.817845e+00, 1.928263e+00, 2.053589e+00,
25472.195835e+00, 2.357285e+00, 2.540533e+00, 2.748522e+00, 2.984591e+00,
25483.252533e+00, 3.556649e+00, 3.901824e+00, 4.293602e+00, 4.738274e+00,
25495.242981e+00, 5.815829e+00, 6.466019e+00, 7.203990e+00, 8.041596e+00,
25508.992288e+00, 1.007133e+01, 1.129606e+01, 1.268614e+01, 1.426390e+01,
25511.605467e+01, 1.808721e+01, 2.039417e+01, 2.301259e+01, 2.598453e+01,
25522.935771e+01, 3.318630e+01, 3.753180e+01, 4.246399e+01, 4.806208e+01,
25535.441597e+01, 6.162770e+01, 6.981310e+01, 7.910361e+01, 8.964844e+01,
25541.016169e+02, 1.152013e+02, 1.306197e+02, 1.481198e+02, 1.679826e+02,
25551.905270e+02, 2.161152e+02, 2.451581e+02, 2.781221e+02, 3.155365e+02,
25563.580024e+02, 4.062016e+02, 4.609081e+02, 5.230007e+02, 5.934765e+02,
25576.734672e+02, 7.642575e+02, 8.673056e+02, 9.842662e+02, 1.117018e+03,
25581.267692e+03, 1.438709e+03, 1.632816e+03, 1.853128e+03, 2.103186e+03,
25592.387004e+03, 2.709140e+03, 3.074768e+03, 3.489760e+03, 3.960780e+03,
25604.495394e+03, 5.102185e+03, 5.790900e+03, 6.572600e+03, 7.459837e+03,
25618.466860e+03, 9.609843e+03, 1.090714e+04, 1.237959e+04, 1.405083e+04,
25621.594771e+04, 1.810069e+04, 2.054434e+04, 2.331792e+04, 2.646595e+04,
25633.003901e+04, 3.409446e+04, 3.869745e+04, 4.392189e+04, 4.985168e+04,
25645.658206e+04, 6.422112e+04, 7.289153e+04, 8.273254e+04, 9.390219e+04,
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
std::vector< G4Material * > G4MaterialTable
G4long G4Poisson(G4double mean)
static constexpr double cm2
static constexpr double keV
static constexpr double eV
static constexpr double g
static constexpr double pi
G4GLOB_DLL std::ostream G4cout
const G4Material * GetMaterial() const
G4double GetDensity() const
static G4MaterialTable * GetMaterialTable()
G4double RutherfordIntegral(G4int intervalNumber, G4double limitLow, G4double limitHigh)
G4double ImPartDielectricConst(G4int intervalNumber, G4double energy)
G4double GetPlasmonEnergyTransfer()
G4double SumOverIntervaldEdx(G4int intervalNumber)
G4DataVector fImPartDielectricConst
G4DataVector fRePartDielectricConst
G4double SumOverInterCerenkov(G4int intervalNumber)
G4DataVector fdNdxPlasmon
G4double GetStepMMLoss(G4double step)
G4double SumOverBordCerenkov(G4int intervalNumber, G4double energy)
G4double fPAItable[500][112]
G4double GetStepPlasmonLoss(G4double step)
G4double GetRutherfordEnergyTransfer()
G4double fElectronDensity
G4double SumOverBordResonance(G4int intervalNumber, G4double energy)
G4DataVector fIntegralPAIdEdx
void ComputeLowEnergyCof()
G4DataVector fIntegralPlasmon
G4double SumOverInterMM(G4int intervalNumber)
G4double RePartDielectricConst(G4double energy)
static const G4double fDelta
G4DataVector fdNdxCerenkov
G4DataVector fDifPAIxSection
G4double GetElectronRange(G4double energy)
static const G4double fError
static const G4int fMaxSplineSize
G4double SumOverInterPlasmon(G4int intervalNumber)
G4double GetMMEnergyTransfer()
G4double PAIdNdxMM(G4int intervalNumber, G4double betaGammaSq)
G4double SumOverBorderdEdx(G4int intervalNumber, G4double energy)
static const G4double fLorentzFactor[112]
G4double SumOverBordMM(G4int intervalNumber, G4double energy)
G4double DifPAIxSection(G4int intervalNumber, G4double betaGammaSq)
G4DataVector fEnergyInterval
G4double PAIdNdxCerenkov(G4int intervalNumber, G4double betaGammaSq)
static const G4int fRefGammaNumber
G4double GetStepResonanceLoss(G4double step)
static G4int fNumberOfGammas
G4double GetResonanceEnergyTransfer()
G4double PAIdNdxResonance(G4int intervalNumber, G4double betaGammaSq)
void SplainPAI(G4double betaGammaSq)
G4double GetEnergyTransfer()
G4OrderedTable * fMatSandiaMatrix
G4double GetCerenkovEnergyTransfer()
void NormShift(G4double betaGammaSq)
G4double PAIdNdxPlasmon(G4int intervalNumber, G4double betaGammaSq)
G4DataVector fIntegralResonance
G4DataVector fIntegralCerenkov
G4double GetPhotonRange(G4double energy)
void IntegralPAIxSection()
G4double SumOverInterval(G4int intervalNumber)
G4double SumOverBorder(G4int intervalNumber, G4double energy)
G4double fNormalizationCof
G4double GetStepCerenkovLoss(G4double step)
G4DataVector fdNdxResonance
void CallError(G4int i, const G4String &methodName) const
G4DataVector fSplineEnergy
G4double GetStepEnergyLoss(G4double step)
G4double SumOverInterResonance(G4int intervalNumber)
G4DataVector fIntegralPAIxSection
G4DataVector fIntegralTerm
G4double SumOverBordPlasmon(G4int intervalNumber, G4double energy)
G4double GetLorentzFactor(G4int i) const
void Initialize(const G4Material *material, G4double maxEnergyTransfer, G4double betaGammaSq, G4SandiaTable *)
G4int GetMaxInterval() const
G4double GetSandiaMatTablePAI(G4int, G4int) const
G4int SandiaMixing(G4int Z[], const G4double *fractionW, G4int el, G4int mi)
G4int SandiaIntervals(G4int Z[], G4int el)
G4double GetSandiaMatTable(G4int, G4int) const
G4double GetPhotoAbsorpCof(G4int i, G4int j) const
G4double energy(const ThreeVector &p, const G4double m)