68const std::vector<G4double>* G4DNARuddIonisationDynamicModel::fpWaterDensity =
nullptr;
72 const G4double scaleFactor = CLHEP::m*CLHEP::m;
73 const G4double tolerance = 1*CLHEP::eV;
77 const G4double Bj[5] = {12.60*CLHEP::eV, 14.70*CLHEP::eV, 18.40*CLHEP::eV,
78 32.20*CLHEP::eV, 539*CLHEP::eV};
89 fLowestEnergy = 100*CLHEP::eV;
90 fAbsorptionEnergy = 50*CLHEP::eV;
98 if (
nullptr == xsdata_p) {
110 delete xsdata_alphap;
112 delete xsdata_hydrogen;
113 delete xsdata_helium;
119void G4DNARuddIonisationDynamicModel::LoadData()
124 G4String filename =
"dna/sigma_ionisation_p_rudd.dat";
128 filename =
"dna/sigma_ionisation_alphaplusplus_rudd.dat";
132 filename =
"dna/sigma_ionisation_alphaplus_rudd.dat";
136 filename =
"dna/sigma_ionisation_h_rudd.dat";
140 filename =
"dna/sigma_ionisation_he_rudd.dat";
155 if (p != fParticle) { SetParticle(p); }
165 if (pname !=
"deuteron" && pname !=
"triton" &&
166 pname !=
"He3" && pname !=
"alpha" && pname !=
"alpha+" &&
167 pname !=
"helium" && pname !=
"hydrogen") {
173 if (!isInitialised) {
174 isInitialised =
true;
177 if (pname ==
"helium") {
179 xsdata = xsdata_helium;
180 slaterEffectiveCharge[0]=1.7;
181 slaterEffectiveCharge[1]=1.15;
182 slaterEffectiveCharge[2]=1.15;
184 sCoefficient[1]=0.25;
185 sCoefficient[2]=0.25;
186 fLowestEnergy = 1*CLHEP::keV;
187 }
else if (pname ==
"alpha+") {
189 xsdata = xsdata_alphap;
191 slaterEffectiveCharge[0]=2.0;
192 slaterEffectiveCharge[1]=2.0;
193 slaterEffectiveCharge[2]=2.0;
195 sCoefficient[1]=0.15;
196 sCoefficient[2]=0.15;
197 }
else if (pname ==
"alpha") {
199 xsdata = xsdata_alpha;
200 }
else if (pname ==
"hydrogen") {
201 xsdata = xsdata_hydrogen;
202 }
else if (pname !=
"proton") {
205 if (isHelium) { fLowestEnergy = 1*CLHEP::keV; }
215 if (chem->IsChemistryActivated()) {
222 G4cout <<
"### G4DNARuddIonisationDynamicModel::Initialise(..) "
223 << fParticle->GetParticleName() <<
G4endl;
235 fMassRate = CLHEP::proton_mass_c2/fMass;
236 fMass = CLHEP::proton_mass_c2;
257 ? (*fpWaterDensity)[material->
GetIndex()] : 0.0;
258 if (0.0 == density) {
return 0.0; }
261 if (kinE < fAbsorptionEnergy) {
return DBL_MAX; }
264 if (fParticle != part) { SetParticle(part); }
269 G4double sigma = (e > fLowestEnergy) ? xsdata->LogLogValue(e, idx)
270 : xsdata->LogLogValue(fLowestEnergy, idx) * e / fLowestEnergy;
274 sigma *= fEmCorrections->EffectiveChargeSquareRatio(part, material, kinE);
279 <<
" Ekin(keV)=" << kinE/CLHEP::keV
280 <<
" sigma(cm^2)=" << sigma/CLHEP::cm2 <<
G4endl;
294 if (fParticle != pd) { SetParticle(pd); }
299 if (kinE <= fAbsorptionEnergy) {
306 fScaledEnergy = kinE*fMassRate;
307 fSelectedShell = SelectShell();
308 G4double bindingEnergy = (useDNAWaterStructure)
309 ? waterStructure.IonisationEnergy(fSelectedShell) : Bj[fSelectedShell];
312 if (kinE < bindingEnergy) {
return; }
314 G4double esec = SampleElectronEnergy();
327 if (fAtomDeexcitation !=
nullptr && fSelectedShell == 4) {
329 auto ashell = fAtomDeexcitation->GetAtomicShell(Z, as);
330 fAtomDeexcitation->GenerateParticles(fvect, ashell, Z, 0, 0);
333 for (
auto const & ptr : *fvect) {
334 esum += ptr->GetKineticEnergy();
339 G4double exc = std::max(bindingEnergy - esum, 0.0);
342 G4double scatteredEnergy = kinE - bindingEnergy - esec;
343 if(scatteredEnergy < -tolerance || exc < -tolerance) {
344 G4cout <<
"G4DNARuddIonisationDynamicModel::SampleSecondaries: "
345 <<
"negative final E(keV)=" << scatteredEnergy/CLHEP::keV <<
" Ein(keV)="
347 <<
" Edelta(keV)=" << esec/CLHEP::keV <<
" MeV, Exc(keV)=" << exc/CLHEP::keV
350 scatteredEnergy = std::max(scatteredEnergy, 0.0);
367 fvect->push_back(dp);
370 if (
nullptr != fChemistry) {
377G4int G4DNARuddIonisationDynamicModel::SelectShell()
385G4DNARuddIonisationDynamicModel::MaxEnergy()
390 G4double emax = 2.0*CLHEP::electron_mass_c2*tau*(tau + 2.0);
394 if (fSelectedShell == 4) {
420 bEnergy = Bj[fSelectedShell];
424 wc = 4.*v2 - 2.*v - 0.25*u;
426 G4double L1 = (
C1 * fGpow->powA(v, D1)) / (1. + E1 * fGpow->powA(v, (D1 + 4.)));
427 G4double L2 = C2 * fGpow->powA(v, D2);
429 G4double H2 = (A2 / v2) + (B2 / (v2 * v2));
432 F2 = (L2 * H2) / (L2 + H2);
439G4DNARuddIonisationDynamicModel::SampleElectronEnergy()
447 G4cout <<
"G4DNARuddIonisationDynamicModel::SampleElectronEnergy: "
448 << fParticle->GetParticleName()
449 <<
" Escaled(keV)=" << fScaledEnergy/CLHEP::keV <<
" Ee(keV)=" << e/CLHEP::keV
450 <<
" Emax(keV)=" << emax/CLHEP::keV <<
" shell=" << fSelectedShell
479 G4double res = CorrectionFactor() * (F1 + w*F2) /
480 (fGpow->powN((1. + w)/u, 3) * y);
483 G4double energyTransfer = e + bEnergy;
485 (sCoefficient[0] * S_1s(fScaledEnergy, energyTransfer, slaterEffectiveCharge[0], 1.) +
486 sCoefficient[1] * S_2s(fScaledEnergy, energyTransfer, slaterEffectiveCharge[1], 2.) +
487 sCoefficient[2] * S_2p(fScaledEnergy, energyTransfer, slaterEffectiveCharge[2], 2.) );
491 return std::max(res, 0.0);
504 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
505 G4double value = 1. -
G4Exp(-2 * r) * ( ( 2. * r + 2. ) * r + 1. );
519 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
521 1. -
G4Exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
536 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
538 1. -
G4Exp(-2 * r) * (((( 2./3. * r + 4./3.) * r + 2.) * r + 2.) * r + 1.);
551 G4double escaled = CLHEP::electron_mass_c2/fMass * ekin;
552 const G4double H = 13.60569172 * CLHEP::eV;
553 G4double value = 2.0*std::sqrt(escaled / H)*q*H /(etrans*
shell);
560G4double G4DNARuddIonisationDynamicModel::CorrectionFactor()
564 if (fSelectedShell < 4) {
565 const G4double ln10 = fGpow->logZ(10);
566 G4double x = 2.0*((
G4Log(fScaledEnergy/(fMassRate*CLHEP::eV))/ln10) - 4.2);
568 res = 0.6/(1.0 +
G4Exp(x)) + 0.9;
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
static G4DNAChemistryManager * Instance()
const std::vector< G4double > * GetNumMolPerVolTableFor(const G4Material *) const
Retrieve a table of molecular densities (number of molecules per unit volume) in the G4 unit system f...
static G4DNAMolecularMaterial * Instance()
G4DNARuddIonisationDynamicModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="DNARuddIonisationDynamicModel")
G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax) override
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
void StartTracking(G4Track *) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double ProbabilityDensityFunction(G4double ekin) override
~G4DNARuddIonisationDynamicModel() override
G4ParticleChangeForGamma * fParticleChangeForGamma
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
static G4EmParameters * Instance()
G4bool DNAStationary() const
const G4String & GetDirLEDATA() const
G4int SampleReactionChannel(const G4double energy, const G4double rand, std::size_t &lastidx) const
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
G4EmCorrections * EmCorrections()
static G4ExtendedPhysicsVector * BuildExtendedVector(const G4String &dirpath, const G4String &filename, const G4int N, const G4int length, const G4double unitE=1.0, const G4double unitS=1.0)
const G4Material * GetMaterial() const
std::size_t GetIndex() const
G4Material * FindMaterial(const G4String &name) const
static G4NistManager * Instance()
const G4String & GetParticleType() const
G4double GetPDGMass() const
const G4String & GetParticleName() const
const G4String & GetParticleSubType() const
static G4Pow * GetInstance()
virtual G4ThreeVector & SampleDirectionForShell(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, G4int shellID, const G4Material *)
G4VEmAngularDistribution * GetAngularDistribution()
G4ParticleChangeForGamma * GetParticleChangeForGamma()
void SetDeexcitationFlag(G4bool val)
G4VEmModel(const G4String &nam)
void SetAngularDistribution(G4VEmAngularDistribution *)
G4double ComputeIntegral(const G4double emin, const G4double emax)
void InitialiseIntegrator(G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)