76 G4cout <<
"Rudd ionisation model is constructed " <<
G4endl;
98 std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator
pos;
119 G4cout <<
"Calling G4DNARuddIonisationModel::Initialise()" <<
G4endl;
124 G4String fileProton(
"dna/sigma_ionisation_p_rudd");
125 G4String fileHydrogen(
"dna/sigma_ionisation_h_rudd");
126 G4String fileAlphaPlusPlus(
"dna/sigma_ionisation_alphaplusplus_rudd");
127 G4String fileAlphaPlus(
"dna/sigma_ionisation_alphaplus_rudd");
128 G4String fileHelium(
"dna/sigma_ionisation_he_rudd");
177 tableHydrogen->
LoadData(fileHydrogen);
184 tableFile[alphaPlusPlus] = fileAlphaPlusPlus;
194 tableAlphaPlusPlus->
LoadData(fileAlphaPlusPlus);
196 tableData[alphaPlusPlus] = tableAlphaPlusPlus;
211 tableAlphaPlus->
LoadData(fileAlphaPlus);
232 if (particle==protonDef)
238 if (particle==hydrogenDef)
244 if (particle==heliumDef)
250 if (particle==alphaPlusDef)
256 if (particle==alphaPlusPlusDef)
264 G4cout <<
"Rudd ionisation model is initialized " <<
G4endl 296 G4cout <<
"Calling CrossSectionPerVolume() of G4DNARuddIonisationModel" 308 particleDefinition != instance->
GetIon(
"hydrogen")
310 particleDefinition != instance->
GetIon(
"alpha++")
312 particleDefinition != instance->
GetIon(
"alpha+")
314 particleDefinition != instance->
GetIon(
"helium")
322 || particleDefinition == instance->
GetIon(
"hydrogen")
327 if ( particleDefinition == instance->
GetIon(
"alpha++")
328 || particleDefinition == instance->
GetIon(
"alpha+")
329 || particleDefinition == instance->
GetIon(
"helium")
339 if(waterDensity!= 0.0)
355 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
360 highLim = pos2->second;
367 if (k < lowLim) k = lowLim;
371 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
384 G4Exception(
"G4DNARuddIonisationModel::CrossSectionPerVolume",
"em0002",
392 G4cout <<
"__________________________________" <<
G4endl;
393 G4cout <<
"G4DNARuddIonisationModel - XS INFO START" <<
G4endl;
395 G4cout <<
"Cross section per water molecule (cm^2)=" << sigma/
cm/
cm <<
G4endl;
396 G4cout <<
"Cross section per water molecule (cm^-1)=" << sigma*waterDensity/(1./
cm) << G4endl;
398 G4cout <<
"G4DNARuddIonisationModel - XS INFO END" <<
G4endl;
406 G4cout <<
"Warning : RuddIonisationModel: WATER DENSITY IS NULL" <<
G4endl;
410 return sigma*waterDensity;
425 G4cout <<
"Calling SampleSecondaries() of G4DNARuddIonisationModel" 463 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
468 highLim = pos2->second;
471 if (k >= lowLim && k <= highLim)
488 G4int secNumberInit = 0;
489 G4int secNumberFinal = 0;
495 if (k<bindingEnergy)
return;
503 if (ionizationShell <5 && ionizationShell >1)
507 else if (ionizationShell <2)
522 secNumberInit = fvect->size();
524 secNumberFinal = fvect->size();
553 G4double scatteredEnergy = k-bindingEnergy-secondaryKinetic;
555 for (
G4int j=secNumberInit; j < secNumberFinal; j++)
558 deexSecEnergy = deexSecEnergy + (*fvect)[j]->GetKineticEnergy();
580 fvect->push_back(dp);
605 G4double maximumKineticEnergyTransfer = 0.;
611 || particleDefinition == instance->
GetIon(
"hydrogen"))
616 else if (particleDefinition == instance->
GetIon(
"helium")
617 || particleDefinition == instance->
GetIon(
"alpha+")
618 || particleDefinition == instance->
GetIon(
"alpha++"))
620 maximumKineticEnergyTransfer = 4. * (0.511 / 3728) * k;
626 value <= 5. *
waterStructure.IonisationEnergy(shell) && k >= value;
631 if (differentialCrossSection >= crossSectionMaximum)
632 crossSectionMaximum = differentialCrossSection;
639 secElecKinetic =
G4UniformRand()* maximumKineticEnergyTransfer;
645 return (secElecKinetic);
693 G4int ionizationLevelIndex)
711 const G4int j = ionizationLevelIndex;
726 const G4double Bj[5] = { 12.60 *
eV, 14.70 *
eV, 18.40 *
eV, 32.20 *
eV, 540
760 const G4double Gj[5] = { 0.99, 1.11, 1.11, 0.52, 1. };
770 G4double w = wBig / Bj[ionizationLevelIndex];
779 G4bool isProtonOrHydrogen =
false;
783 || particleDefinition == instance->
GetIon(
"hydrogen"))
785 isProtonOrHydrogen =
true;
789 else if (particleDefinition == instance->
GetIon(
"helium")
790 || particleDefinition == instance->
GetIon(
"alpha+")
791 || particleDefinition == instance->
GetIon(
"alpha++"))
794 tau = (0.511 / 3728.) * k;
798 * std::pow((Ry / Bj[ionizationLevelIndex]), 2);
801 * std::pow((Ry /
waterStructure.IonisationEnergy(ionizationLevelIndex)),
804 G4double v2 = tau / Bj[ionizationLevelIndex];
809 G4double wc = 4. * v2 - 2. * v - (Ry / (4. * Bj[ionizationLevelIndex]));
811 wc = 4. * v2 - 2. * v
812 - (Ry / (4. *
waterStructure.IonisationEnergy(ionizationLevelIndex)));
814 G4double L1 = (C1 * std::pow(v, (D1))) / (1. + E1 * std::pow(v, (D1 + 4.)));
815 G4double L2 = C2 * std::pow(v, (D2));
816 G4double H1 = (A1 * std::log(1. + v2)) / (v2 + (B1 / v2));
817 G4double H2 = (A2 / v2) + (B2 / (v2 * v2));
820 G4double F2 = (L2 * H2) / (L2 + H2);
824 * (S / Bj[ionizationLevelIndex])
826 / (std::pow((1. + w), 3)
827 * (1. + std::exp(alphaConst * (w - wc) / v))));
833 / (std::pow((1. + w), 3)
834 * (1. + std::exp(alphaConst * (w - wc) / v))));
836 if ((particleDefinition == instance->
GetIon(
"hydrogen"))
837 && (ionizationLevelIndex == 4))
840 sigma = Gj[j] * (S /
waterStructure.IonisationEnergy(ionizationLevelIndex))
842 / (std::pow((1. + w), 3)
843 * (1. + std::exp(alphaConst * (w - wc) / v))));
848 if (isProtonOrHydrogen)
853 if (particleDefinition == instance->
GetIon(
"alpha++"))
863 else if (particleDefinition == instance->
GetIon(
"alpha+"))
875 else if (particleDefinition == instance->
GetIon(
"helium"))
891 sigma = Gj[j] * (S / Bj[ionizationLevelIndex])
893 / (std::pow((1. + w), 3)
894 * (1. + std::exp(alphaConst * (w - wc) / v))));
900 / (std::pow((1. + w), 3)
901 * (1. + std::exp(alphaConst * (w - wc) / v))));
913 return zEff * zEff * sigma;
929 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
930 G4double value = 1. - std::exp(-2 * r) * ((2. * r + 2.) * r + 1.);
945 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
947 - std::exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
963 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
966 * ((((2. / 3. * r + 4. / 3.) * r + 2.) * r + 2.) * r + 1.);
981 G4double tElectron = 0.511 / 3728. * t;
984 G4double value = std::sqrt(2. * tElectron / H) / (energyTransferred / H)
985 * (slaterEffectiveChg / shellNumber);
1001 }
else if (particleDefinition == instance->
GetIon(
"hydrogen"))
1003 G4double value = (std::log10(k /
eV) - 4.2) / 0.5;
1005 return ((0.6 / (1 + std::exp(value))) + 0.9);
1026 std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator
pos;
1045 value += valuesBuffer[i];
1056 if (valuesBuffer[i] > value)
1058 delete[] valuesBuffer;
1061 value -= valuesBuffer[i];
1065 delete[] valuesBuffer;
1070 G4Exception(
"G4DNARuddIonisationModel::RandomSelect",
1073 "Model not applicable to particle type.");
1093 std::map<G4String, G4double, std::less<G4String> >::iterator pos1;
1098 lowLim = pos1->second;
1101 std::map<G4String, G4double, std::less<G4String> >::iterator pos2;
1106 highLim = pos2->second;
1109 if (k >= lowLim && k <= highLim)
1111 std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator
pos;
1123 G4Exception(
"G4DNARuddIonisationModel::PartialCrossSection",
1126 "Model not applicable to particle type.");
G4double LowEnergyLimit() const
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
G4double killBelowEnergyForZ1
static G4LossTableManager * Instance()
const G4Material * GetMaterial() const
G4ParticleChangeForGamma * fParticleChangeForGamma
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
virtual ~G4DNARuddIonisationModel()
static G4Proton * ProtonDefinition()
std::map< G4String, G4double, std::less< G4String > > lowEnergyLimit
G4VEmAngularDistribution * GetAngularDistribution()
G4double DifferentialCrossSection(G4ParticleDefinition *particleDefinition, G4double k, G4double energyTransfer, G4int shell)
const std::vector< double > * GetNumMolPerVolTableFor(const G4Material *) const
virtual G4bool LoadData(const G4String &argFileName)
G4double S_2s(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
G4double slaterEffectiveCharge[3]
G4int GetLeptonNumber() const
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double lowEnergyLimitOfModelForZ1
void SetHighEnergyLimit(G4double)
virtual G4ThreeVector & SampleDirectionForShell(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, G4int shellID, const G4Material *)
G4DNARuddIonisationModel(const G4ParticleDefinition *p=0, const G4String &nam="DNARuddIonisationModel")
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
G4double GetKineticEnergy() const
const G4String & GetParticleName() const
virtual G4double FindValue(G4double e, G4int componentId=0) const
G4GLOB_DLL std::ostream G4cout
virtual const G4VEMDataSet * GetComponent(G4int componentId) const
G4double lowEnergyLimitForZ2
G4double HighEnergyLimit() const
const std::vector< G4double > * fpWaterDensity
G4double R(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
virtual void SampleSecondaries(std::vector< G4DynamicParticle *> *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
std::map< G4String, G4double, std::less< G4String > > highEnergyLimit
static G4Proton * Proton()
G4int RandomSelect(G4double energy, const G4String &particle)
static G4DNAGenericIonsManager * Instance(void)
G4double Sum(G4double energy, const G4String &particle)
G4double PartialCrossSection(const G4Track &track)
G4double killBelowEnergyForZ2
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static G4DNAChemistryManager * Instance()
static G4DNAMolecularMaterial * Instance()
G4double lowEnergyLimitOfModelForZ2
const G4ThreeVector & GetMomentumDirection() const
void GenerateParticles(std::vector< G4DynamicParticle *> *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
void CreateWaterMolecule(ElectronicModification, G4int, const G4Track *)
G4double S_1s(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
void SetAngularDistribution(G4VEmAngularDistribution *)
G4DNAWaterIonisationStructure waterStructure
G4double CorrectionFactor(G4ParticleDefinition *particleDefinition, G4double k)
G4double RandomizeEjectedElectronEnergy(G4ParticleDefinition *particleDefinition, G4double incomingParticleEnergy, G4int shell)
static G4Electron * Electron()
G4ParticleDefinition * GetDefinition() const
static MCTruthManager * instance
G4VAtomDeexcitation * AtomDeexcitation()
void SetLowEnergyLimit(G4double)
void SetDeexcitationFlag(G4bool val)
static const double eplus
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax)
G4double lowEnergyLimitForZ1
G4double S_2p(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
G4double GetPDGCharge() const
G4VAtomDeexcitation * fAtomDeexcitation
static const G4double pos
virtual size_t NumberOfComponents(void) const
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4ParticleDefinition * GetIon(const G4String &name)