#include <G4mplIonisationWithDeltaModel.hh>
Inheritance diagram for G4mplIonisationWithDeltaModel:
Definition at line 57 of file G4mplIonisationWithDeltaModel.hh.
G4mplIonisationWithDeltaModel::G4mplIonisationWithDeltaModel | ( | G4double | mCharge, | |
const G4String & | nam = "mplIonisationWithDelta" | |||
) |
Definition at line 69 of file G4mplIonisationWithDeltaModel.cc.
References G4Electron::Electron(), G4cout, G4endl, G4lrint(), and G4INCL::Math::pi.
00071 : G4VEmModel(nam),G4VEmFluctuationModel(nam), 00072 magCharge(mCharge), 00073 twoln10(log(100.0)), 00074 betalow(0.01), 00075 betalim(0.1), 00076 beta2lim(betalim*betalim), 00077 bg2lim(beta2lim*(1.0 + beta2lim)) 00078 { 00079 nmpl = G4lrint(std::fabs(magCharge) * 2 * fine_structure_const); 00080 if(nmpl > 6) { nmpl = 6; } 00081 else if(nmpl < 1) { nmpl = 1; } 00082 pi_hbarc2_over_mc2 = pi * hbarc * hbarc / electron_mass_c2; 00083 chargeSquare = magCharge * magCharge; 00084 dedxlim = 45.*nmpl*nmpl*GeV*cm2/g; 00085 fParticleChange = 0; 00086 theElectron = G4Electron::Electron(); 00087 G4cout << "### Monopole ionisation model with d-electron production, Gmag= " 00088 << magCharge/eplus << G4endl; 00089 monopole = 0; 00090 mass = 0.0; 00091 }
G4mplIonisationWithDeltaModel::~G4mplIonisationWithDeltaModel | ( | ) | [virtual] |
G4double G4mplIonisationWithDeltaModel::ComputeCrossSectionPerAtom | ( | const G4ParticleDefinition * | , | |
G4double | kineticEnergy, | |||
G4double | Z, | |||
G4double | A, | |||
G4double | cutEnergy, | |||
G4double | maxEnergy | |||
) | [virtual] |
Reimplemented from G4VEmModel.
Definition at line 221 of file G4mplIonisationWithDeltaModel.cc.
References ComputeCrossSectionPerElectron().
00227 { 00228 G4double cross = 00229 Z*ComputeCrossSectionPerElectron(p,kineticEnergy,cutEnergy,maxEnergy); 00230 return cross; 00231 }
G4double G4mplIonisationWithDeltaModel::ComputeCrossSectionPerElectron | ( | const G4ParticleDefinition * | , | |
G4double | kineticEnergy, | |||
G4double | cutEnergy, | |||
G4double | maxEnergy | |||
) | [virtual] |
Definition at line 201 of file G4mplIonisationWithDeltaModel.cc.
References G4VEmModel::LowEnergyLimit(), MaxSecondaryEnergy(), and SetParticle().
Referenced by ComputeCrossSectionPerAtom().
00206 { 00207 if(!monopole) { SetParticle(p); } 00208 G4double cross = 0.0; 00209 G4double tmax = MaxSecondaryEnergy(p, kineticEnergy); 00210 G4double maxEnergy = std::min(tmax,maxKinEnergy); 00211 G4double cutEnergy = std::max(LowEnergyLimit(), cut); 00212 if(cutEnergy < maxEnergy) { 00213 cross = (0.5/cutEnergy - 0.5/maxEnergy)*pi_hbarc2_over_mc2 * nmpl * nmpl; 00214 } 00215 return cross; 00216 }
G4double G4mplIonisationWithDeltaModel::ComputeDEDXPerVolume | ( | const G4Material * | , | |
const G4ParticleDefinition * | , | |||
G4double | kineticEnergy, | |||
G4double | cutEnergy | |||
) | [virtual] |
Reimplemented from G4VEmModel.
Definition at line 125 of file G4mplIonisationWithDeltaModel.cc.
References G4InuclParticleNames::gam, G4Material::GetDensity(), G4VEmModel::LowEnergyLimit(), MaxSecondaryEnergy(), and SetParticle().
00129 { 00130 if(!monopole) { SetParticle(p); } 00131 G4double tmax = MaxSecondaryEnergy(p,kineticEnergy); 00132 G4double cutEnergy = std::min(tmax, maxEnergy); 00133 cutEnergy = std::max(LowEnergyLimit(), cutEnergy); 00134 G4double tau = kineticEnergy / mass; 00135 G4double gam = tau + 1.0; 00136 G4double bg2 = tau * (tau + 2.0); 00137 G4double beta2 = bg2 / (gam * gam); 00138 G4double beta = sqrt(beta2); 00139 00140 // low-energy asymptotic formula 00141 G4double dedx = dedxlim*beta*material->GetDensity(); 00142 00143 // above asymptotic 00144 if(beta > betalow) { 00145 00146 // high energy 00147 if(beta >= betalim) { 00148 dedx = ComputeDEDXAhlen(material, bg2, cutEnergy); 00149 00150 } else { 00151 00152 G4double dedx1 = dedxlim*betalow*material->GetDensity(); 00153 G4double dedx2 = ComputeDEDXAhlen(material, bg2lim, cutEnergy); 00154 00155 // extrapolation between two formula 00156 G4double kapa2 = beta - betalow; 00157 G4double kapa1 = betalim - beta; 00158 dedx = (kapa1*dedx1 + kapa2*dedx2)/(kapa1 + kapa2); 00159 } 00160 } 00161 return dedx; 00162 }
G4double G4mplIonisationWithDeltaModel::Dispersion | ( | const G4Material * | , | |
const G4DynamicParticle * | , | |||
G4double & | tmax, | |||
G4double & | length | |||
) | [virtual] |
Implements G4VEmFluctuationModel.
Definition at line 323 of file G4mplIonisationWithDeltaModel.cc.
References G4InuclParticleNames::gam, G4Material::GetElectronDensity(), and G4DynamicParticle::GetKineticEnergy().
Referenced by SampleFluctuations().
00327 { 00328 G4double siga = 0.0; 00329 G4double tau = dp->GetKineticEnergy()/mass; 00330 if(tau > 0.0) { 00331 G4double electronDensity = material->GetElectronDensity(); 00332 G4double gam = tau + 1.0; 00333 G4double invbeta2 = (gam*gam)/(tau * (tau+2.0)); 00334 siga = (invbeta2 - 0.5) * twopi_mc2_rcl2 * tmax * length 00335 * electronDensity * chargeSquare; 00336 } 00337 return siga; 00338 }
void G4mplIonisationWithDeltaModel::Initialise | ( | const G4ParticleDefinition * | , | |
const G4DataVector & | ||||
) | [virtual] |
Implements G4VEmModel.
Definition at line 115 of file G4mplIonisationWithDeltaModel.cc.
References G4VEmModel::GetParticleChangeForLoss(), and SetParticle().
00117 { 00118 if(!monopole) { SetParticle(p); } 00119 if(!fParticleChange) { fParticleChange = GetParticleChangeForLoss(); } 00120 }
G4double G4mplIonisationWithDeltaModel::MaxSecondaryEnergy | ( | const G4ParticleDefinition * | , | |
G4double | kinEnergy | |||
) | [protected, virtual] |
Reimplemented from G4VEmModel.
Definition at line 343 of file G4mplIonisationWithDeltaModel.cc.
Referenced by ComputeCrossSectionPerElectron(), and ComputeDEDXPerVolume().
00345 { 00346 G4double tau = kinEnergy/mass; 00347 return 2.0*electron_mass_c2*tau*(tau + 2.); 00348 }
G4double G4mplIonisationWithDeltaModel::SampleFluctuations | ( | const G4Material * | , | |
const G4DynamicParticle * | , | |||
G4double & | tmax, | |||
G4double & | length, | |||
G4double & | meanLoss | |||
) | [virtual] |
Implements G4VEmFluctuationModel.
Definition at line 294 of file G4mplIonisationWithDeltaModel.cc.
References Dispersion(), and G4UniformRand.
00300 { 00301 G4double siga = Dispersion(material,dp,tmax,length); 00302 G4double loss = meanLoss; 00303 siga = sqrt(siga); 00304 G4double twomeanLoss = meanLoss + meanLoss; 00305 00306 if(twomeanLoss < siga) { 00307 G4double x; 00308 do { 00309 loss = twomeanLoss*G4UniformRand(); 00310 x = (loss - meanLoss)/siga; 00311 } while (1.0 - 0.5*x*x < G4UniformRand()); 00312 } else { 00313 do { 00314 loss = G4RandGauss::shoot(meanLoss,siga); 00315 } while (0.0 > loss || loss > twomeanLoss); 00316 } 00317 return loss; 00318 }
virtual void G4mplIonisationWithDeltaModel::SampleSecondaries | ( | std::vector< G4DynamicParticle * > * | , | |
const G4MaterialCutsCouple * | , | |||
const G4DynamicParticle * | , | |||
G4double | tmin, | |||
G4double | maxEnergy | |||
) | [virtual] |
Implements G4VEmModel.
void G4mplIonisationWithDeltaModel::SetParticle | ( | const G4ParticleDefinition * | p | ) |
Definition at line 100 of file G4mplIonisationWithDeltaModel.cc.
References G4ParticleDefinition::GetPDGMass(), G4VEmModel::HighEnergyLimit(), G4VEmModel::LowEnergyLimit(), G4VEmModel::SetHighEnergyLimit(), and G4VEmModel::SetLowEnergyLimit().
Referenced by ComputeCrossSectionPerElectron(), ComputeDEDXPerVolume(), Initialise(), and G4mplIonisation::InitialiseEnergyLossProcess().
00101 { 00102 monopole = p; 00103 mass = monopole->GetPDGMass(); 00104 G4double emin = 00105 std::min(LowEnergyLimit(),0.1*mass*(1/sqrt(1 - betalow*betalow) - 1)); 00106 G4double emax = 00107 std::max(HighEnergyLimit(),10*mass*(1/sqrt(1 - beta2lim) - 1)); 00108 SetLowEnergyLimit(emin); 00109 SetHighEnergyLimit(emax); 00110 }