#include <G4ionEffectiveCharge.hh>
Public Member Functions | |
G4ionEffectiveCharge () | |
virtual | ~G4ionEffectiveCharge () |
G4double | EffectiveChargeSquareRatio (const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy) |
G4double | EffectiveCharge (const G4ParticleDefinition *p, const G4Material *material, G4double kineticEnergy) |
Definition at line 62 of file G4ionEffectiveCharge.hh.
G4ionEffectiveCharge::G4ionEffectiveCharge | ( | ) |
Definition at line 62 of file G4ionEffectiveCharge.cc.
References G4NistManager::Instance().
00063 { 00064 chargeCorrection = 1.0; 00065 energyHighLimit = 20.0*MeV; 00066 energyLowLimit = 1.0*keV; 00067 energyBohr = 25.*keV; 00068 massFactor = amu_c2/(proton_mass_c2*keV); 00069 minCharge = 1.0; 00070 lastPart = 0; 00071 lastMat = 0; 00072 lastKinEnergy = 0.0; 00073 effCharge = eplus; 00074 nist = G4NistManager::Instance(); 00075 }
G4ionEffectiveCharge::~G4ionEffectiveCharge | ( | ) | [virtual] |
G4double G4ionEffectiveCharge::EffectiveCharge | ( | const G4ParticleDefinition * | p, | |
const G4Material * | material, | |||
G4double | kineticEnergy | |||
) |
Definition at line 84 of file G4ionEffectiveCharge.cc.
References G4IonisParamMat::GetFermiEnergy(), G4Material::GetIonisation(), G4ParticleDefinition::GetPDGCharge(), G4ParticleDefinition::GetPDGMass(), G4NistManager::GetZ13(), G4IonisParamMat::GetZeffective(), and G4InuclParticleNames::lambda.
Referenced by G4MuElecInelasticModel::CrossSectionPerVolume(), EffectiveChargeSquareRatio(), and G4EmCorrections::GetParticleCharge().
00087 { 00088 if(p == lastPart && material == lastMat && kineticEnergy == lastKinEnergy) 00089 return effCharge; 00090 00091 lastPart = p; 00092 lastMat = material; 00093 lastKinEnergy = kineticEnergy; 00094 00095 G4double mass = p->GetPDGMass(); 00096 G4double charge = p->GetPDGCharge(); 00097 G4double Zi = charge/eplus; 00098 00099 chargeCorrection = 1.0; 00100 effCharge = charge; 00101 00102 // The aproximation of ion effective charge from: 00103 // J.F.Ziegler, J.P. Biersack, U. Littmark 00104 // The Stopping and Range of Ions in Matter, 00105 // Vol.1, Pergamon Press, 1985 00106 // Fast ions or hadrons 00107 G4double reducedEnergy = kineticEnergy * proton_mass_c2/mass ; 00108 00109 //G4cout << "e= " << reducedEnergy << " Zi= " << Zi << " " << material->GetName() << G4endl; 00110 00111 if( reducedEnergy > Zi*energyHighLimit || Zi < 1.5 || !material) return charge; 00112 00113 G4double z = material->GetIonisation()->GetZeffective(); 00114 reducedEnergy = std::max(reducedEnergy,energyLowLimit); 00115 00116 // Helium ion case 00117 if( Zi < 2.5 ) { 00118 00119 static G4double c[6] = {0.2865, 0.1266, -0.001429, 00120 0.02402,-0.01135, 0.001475} ; 00121 00122 G4double Q = std::max(0.0,std::log(reducedEnergy*massFactor)); 00123 G4double x = c[0]; 00124 G4double y = 1.0; 00125 for (G4int i=1; i<6; i++) { 00126 y *= Q; 00127 x += y * c[i] ; 00128 } 00129 G4double ex; 00130 if(x < 0.2) ex = x * (1 - 0.5*x); 00131 else ex = 1. - std::exp(-x); 00132 00133 G4double tq = 7.6 - Q; 00134 G4double tq2= tq*tq; 00135 G4double tt = ( 0.007 + 0.00005 * z ); 00136 if(tq2 < 0.2) tt *= (1.0 - tq2 + 0.5*tq2*tq2); 00137 else tt *= std::exp(-tq2); 00138 00139 effCharge = charge*(1.0 + tt) * std::sqrt(ex); 00140 00141 // Heavy ion case 00142 } else { 00143 00144 G4double y; 00145 // = nist->GetZ13(z); 00146 //G4double z23 = y*y; 00147 G4double zi13 = nist->GetZ13(Zi); 00148 G4double zi23 = zi13*zi13; 00149 // G4double e = std::max(reducedEnergy,energyBohr/z23); 00150 //G4double e = reducedEnergy; 00151 00152 // v1 is ion velocity in vF unit 00153 G4double eF = material->GetIonisation()->GetFermiEnergy(); 00154 G4double v1sq = reducedEnergy/eF; 00155 G4double vFsq = eF/energyBohr; 00156 G4double vF = std::sqrt(eF/energyBohr); 00157 00158 // Faster than Fermi velocity 00159 if ( v1sq > 1.0 ) { 00160 y = vF * std::sqrt(v1sq) * ( 1.0 + 0.2/v1sq ) / zi23 ; 00161 00162 // Slower than Fermi velocity 00163 } else { 00164 y = 0.692308 * vF * (1.0 + 0.666666*v1sq + v1sq*v1sq/15.0) / zi23 ; 00165 } 00166 00167 G4double q; 00168 G4double y3 = std::pow(y, 0.3) ; 00169 // G4cout<<"y= "<<y<<" y3= "<<y3<<" v1= "<<v1<<" vF= "<<vF<<G4endl; 00170 q = 1.0 - std::exp( 0.803*y3 - 1.3167*y3*y3 - 0.38157*y - 0.008983*y*y ) ; 00171 00172 //y *= 0.77; 00173 //y *= (0.75 + 0.52/Zi); 00174 00175 //if( y < 0.2 ) q = y*(1.0 - 0.5*y); 00176 //else q = 1.0 - std::exp(-y); 00177 00178 G4double qmin = minCharge/Zi; 00179 if(q < qmin) q = qmin; 00180 00181 effCharge = q*charge; 00182 00183 /* 00184 G4double x1 = 1.0*effCharge*(1.0 - 0.132*std::log(y))/(y*std::sqrt(z)); 00185 G4double x2 = 0.1*effCharge*effCharge*energyBohr/reducedEnergy; 00186 00187 chargeCorrection = 1.0 + x1 - x2; 00188 00189 G4cout << "x1= "<<x1<<" x2= "<< x2<<" corr= "<<chargeCorrection<<G4endl; 00190 */ 00191 00192 G4double tq = 7.6 - std::log(reducedEnergy/keV); 00193 G4double tq2= tq*tq; 00194 G4double sq = ( 0.18 + 0.0015 * z ) / (Zi*Zi); 00195 if(tq2 < 0.2) sq *= (1.0 - tq2 + 0.5*tq2*tq2); 00196 else sq *= std::exp(-tq2); 00197 sq += 1.0; 00198 // G4cout << "sq= " << sq << G4endl; 00199 00200 // Screen length according to 00201 // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds, 00202 // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228. 00203 00204 G4double lambda = 10.0 * vF / (zi13 * (6.0 + q)); 00205 if(q < 0.2) lambda *= (1.0 - 0.66666667*q - q*q/9.0); 00206 else lambda *= std::pow(1.0-q, 0.666666); 00207 00208 G4double lambda2 = lambda*lambda; 00209 00210 G4double xx = (0.5/q - 0.5)/vFsq; 00211 if(lambda2 < 0.2) xx *= lambda2*(1.0 - 0.5*lambda2); 00212 else xx *= std::log(1.0 + lambda2); 00213 00214 chargeCorrection = sq * (1.0 + xx); 00215 00216 } 00217 // G4cout << "G4ionEffectiveCharge: charge= " << charge << " q= " << q 00218 // << " chargeCor= " << chargeCorrection 00219 // << " e(MeV)= " << kineticEnergy/MeV << G4endl; 00220 return effCharge; 00221 }
G4double G4ionEffectiveCharge::EffectiveChargeSquareRatio | ( | const G4ParticleDefinition * | p, | |
const G4Material * | material, | |||
G4double | kineticEnergy | |||
) | [inline] |
Definition at line 105 of file G4ionEffectiveCharge.hh.
References EffectiveCharge().
Referenced by G4EmCorrections::EffectiveChargeSquareRatio().
00109 { 00110 G4double charge = effCharge; 00111 if( kineticEnergy != lastKinEnergy || material != lastMat || p != lastPart) { 00112 charge = EffectiveCharge(p,material,kineticEnergy); 00113 } 00114 charge *= chargeCorrection/CLHEP::eplus; 00115 00116 return charge*charge; 00117 }