77 G4cout <<
"Rudd ionisation model is constructed " <<
G4endl;
95 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
116 G4cout <<
"Calling G4DNARuddIonisationModel::Initialise()" <<
G4endl;
120 G4String fileProton(
"dna/sigma_ionisation_p_rudd");
121 G4String fileHydrogen(
"dna/sigma_ionisation_h_rudd");
122 G4String fileAlphaPlusPlus(
"dna/sigma_ionisation_alphaplusplus_rudd");
123 G4String fileAlphaPlus(
"dna/sigma_ionisation_alphaplus_rudd");
124 G4String fileHelium(
"dna/sigma_ionisation_he_rudd");
173 tableHydrogen->
LoadData(fileHydrogen);
180 tableFile[alphaPlusPlus] = fileAlphaPlusPlus;
190 tableAlphaPlusPlus->
LoadData(fileAlphaPlusPlus);
192 tableData[alphaPlusPlus] = tableAlphaPlusPlus;
207 tableAlphaPlus->
LoadData(fileAlphaPlus);
228 if (particle==protonDef)
234 if (particle==hydrogenDef)
240 if (particle==heliumDef)
246 if (particle==alphaPlusDef)
252 if (particle==alphaPlusPlusDef)
260 G4cout <<
"Rudd ionisation model is initialized " << G4endl
290 G4cout <<
"Calling CrossSectionPerVolume() of G4DNARuddIonisationModel" <<
G4endl;
300 particleDefinition != instance->
GetIon(
"hydrogen")
302 particleDefinition != instance->
GetIon(
"alpha++")
304 particleDefinition != instance->
GetIon(
"alpha+")
306 particleDefinition != instance->
GetIon(
"helium")
314 || particleDefinition == instance->
GetIon(
"hydrogen")
319 if ( particleDefinition == instance->
GetIon(
"alpha++")
320 || particleDefinition == instance->
GetIon(
"alpha+")
321 || particleDefinition == instance->
GetIon(
"helium")
331 if(waterDensity!= 0.0)
347 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
352 highLim = pos2->second;
359 if (k < lowLim) k = lowLim;
363 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
376 G4Exception(
"G4DNARuddIonisationModel::CrossSectionPerVolume",
"em0002",
384 G4cout <<
"__________________________________" <<
G4endl;
385 G4cout <<
"°°° G4DNARuddIonisationModel - XS INFO START" <<
G4endl;
387 G4cout <<
"°°° Cross section per water molecule (cm^2)=" << sigma/
cm/
cm <<
G4endl;
388 G4cout <<
"°°° Cross section per water molecule (cm^-1)=" << sigma*waterDensity/(1./
cm) << G4endl;
390 G4cout <<
"°°° G4DNARuddIonisationModel - XS INFO END" <<
G4endl;
398 G4cout <<
"Warning : RuddIonisationModel: WATER DENSITY IS NULL" <<
G4endl;
402 return sigma*waterDensity;
416 G4cout <<
"Calling SampleSecondaries() of G4DNARuddIonisationModel" <<
G4endl;
452 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
457 highLim = pos2->second;
460 if (k >= lowLim && k <= highLim)
477 G4int secNumberInit = 0;
478 G4int secNumberFinal = 0;
487 if (ionizationShell <5 && ionizationShell >1)
491 else if (ionizationShell <2)
508 secNumberInit = fvect->size();
510 secNumberFinal = fvect->size();
540 G4double scatteredEnergy = k-bindingEnergy-secondaryKinetic;
542 for (
G4int j=secNumberInit; j < secNumberFinal; j++) {
544 deexSecEnergy = deexSecEnergy + (*fvect)[j]->GetKineticEnergy();
558 fvect->push_back(dp);
583 G4double maximumKineticEnergyTransfer = 0.;
589 || particleDefinition == instance->
GetIon(
"hydrogen"))
591 maximumKineticEnergyTransfer= 4.* (electron_mass_c2 / proton_mass_c2) * k;
594 else if (particleDefinition == instance->
GetIon(
"helium")
595 || particleDefinition == instance->
GetIon(
"alpha+")
596 || particleDefinition == instance->
GetIon(
"alpha++"))
598 maximumKineticEnergyTransfer= 4.* (0.511 / 3728) * k;
606 if(differentialCrossSection >= crossSectionMaximum) crossSectionMaximum = differentialCrossSection;
614 secElecKinetic =
G4UniformRand() * maximumKineticEnergyTransfer;
620 return(secElecKinetic);
670 G4int ionizationLevelIndex)
688 const G4int j=ionizationLevelIndex;
737 const G4double Gj[5] = {0.99, 1.11, 1.11, 0.52, 1.};
743 if (wBig<0)
return 0.;
745 G4double w = wBig / Bj[ionizationLevelIndex];
753 G4bool isProtonOrHydrogen =
false;
757 || particleDefinition == instance->
GetIon(
"hydrogen"))
759 isProtonOrHydrogen =
true;
760 tau = (electron_mass_c2/proton_mass_c2) * k ;
763 else if ( particleDefinition == instance->
GetIon(
"helium")
764 || particleDefinition == instance->
GetIon(
"alpha+")
765 || particleDefinition == instance->
GetIon(
"alpha++"))
768 tau = (0.511/3728.) * k ;
771 G4double S = 4.*
pi * Bohr_radius*Bohr_radius * n * std::pow((Ry/Bj[ionizationLevelIndex]),2);
774 G4double v2 = tau / Bj[ionizationLevelIndex];
778 G4double wc = 4.*v2 - 2.*v - (Ry/(4.*Bj[ionizationLevelIndex]));
781 G4double L1 = (C1* std::pow(v,(D1))) / (1.+ E1*std::pow(v, (D1+4.)));
783 G4double H1 = (A1*std::log(1.+v2)) / (v2+(B1/v2));
784 G4double H2 = (A2/v2) + (B2/(v2*v2));
790 * Gj[j] * (S/Bj[ionizationLevelIndex])
791 * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) );
795 * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) );
797 if ( (particleDefinition == instance->
GetIon(
"hydrogen")) && (ionizationLevelIndex==4))
801 * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) );
806 if(isProtonOrHydrogen)
811 if (particleDefinition == instance->
GetIon(
"alpha++") )
821 else if (particleDefinition == instance->
GetIon(
"alpha+") )
833 else if (particleDefinition == instance->
GetIon(
"helium") )
849 sigma = Gj[j] * (S/Bj[ionizationLevelIndex]) * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) );
852 * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) );
860 return zEff * zEff * sigma ;
876 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
877 G4double value = 1. - std::exp(-2 * r) * ( ( 2. * r + 2. ) * r + 1. );
892 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
893 G4double value = 1. - std::exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
909 G4double r =
R(t, energyTransferred, slaterEffectiveChg, shellNumber);
910 G4double value = 1. - std::exp(-2 * r) * (((( 2./3. * r + 4./3.) * r + 2.) * r + 2.) * r + 1.);
925 G4double tElectron = 0.511/3728. * t;
928 G4double value = std::sqrt ( 2. * tElectron / H ) / ( energyTransferred / H ) * (slaterEffectiveChg/shellNumber);
945 if (particleDefinition == instance->
GetIon(
"hydrogen"))
949 return((0.6/(1+std::exp(value))) + 0.9);
970 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
989 value += valuesBuffer[i];
1001 if (valuesBuffer[i] > value)
1003 delete[] valuesBuffer;
1006 value -= valuesBuffer[i];
1009 if (valuesBuffer)
delete[] valuesBuffer;
1015 G4Exception(
"G4DNARuddIonisationModel::RandomSelect",
"em0002",
1036 std::map< G4String,G4double,std::less<G4String> >::iterator pos1;
1041 lowLim = pos1->second;
1044 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
1049 highLim = pos2->second;
1052 if (k >= lowLim && k <= highLim)
1054 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
1067 G4Exception(
"G4DNARuddIonisationModel::PartialCrossSection",
"em0002",
G4double LowEnergyLimit() const
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
G4double killBelowEnergyForZ1
static G4LossTableManager * Instance()
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
G4double HighEnergyLimit() const
const G4DynamicParticle * GetDynamicParticle() const
virtual const G4VEMDataSet * GetComponent(G4int componentId) 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)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
virtual G4bool LoadData(const G4String &argFileName)
G4ParticleDefinition * GetDefinition() const
G4double S_2s(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
G4double slaterEffectiveCharge[3]
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double lowEnergyLimitOfModelForZ1
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
const G4String & GetParticleName() const
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
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
G4GLOB_DLL std::ostream G4cout
const std::vector< double > * GetNumMolPerVolTableFor(const G4Material *) const
G4double lowEnergyLimitForZ2
const G4ThreeVector & GetMomentumDirection() const
const std::vector< G4double > * fpWaterDensity
G4double R(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
std::map< G4String, G4double, std::less< G4String > > highEnergyLimit
static G4Proton * Proton()
G4int RandomSelect(G4double energy, const G4String &particle)
static G4DNAGenericIonsManager * Instance(void)
virtual G4double FindValue(G4double e, G4int componentId=0) const
virtual size_t NumberOfComponents(void) const
G4double Sum(G4double energy, const G4String &particle)
G4double PartialCrossSection(const G4Track &track)
G4double killBelowEnergyForZ2
G4double IonisationEnergy(G4int level)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static G4DNAChemistryManager * Instance()
static G4DNAMolecularMaterial * Instance()
G4double lowEnergyLimitOfModelForZ2
void CreateWaterMolecule(ElectronicModification, G4int, const G4Track *)
Method used by DNA physics model to create a water molecule.
G4double S_1s(G4double t, G4double energyTransferred, G4double slaterEffectiveChg, G4double shellNumber)
void SetAngularDistribution(G4VEmAngularDistribution *)
G4DNAWaterIonisationStructure waterStructure
G4double CorrectionFactor(G4ParticleDefinition *particleDefinition, G4double k)
const G4Track * GetCurrentTrack() const
G4double RandomizeEjectedElectronEnergy(G4ParticleDefinition *particleDefinition, G4double incomingParticleEnergy, G4int shell)
static G4Electron * Electron()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
static MCTruthManager * instance
G4VAtomDeexcitation * AtomDeexcitation()
void ProposeTrackStatus(G4TrackStatus status)
void SetLowEnergyLimit(G4double)
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
void SetDeexcitationFlag(G4bool val)
static const double eplus
G4double GetPDGCharge() const
G4ThreeVector G4ParticleMomentum
G4double bindingEnergy(G4int A, G4int Z)
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)
G4int GetLeptonNumber() const
G4VAtomDeexcitation * fAtomDeexcitation
static const G4double pos
G4ParticleChangeForGamma * GetParticleChangeForGamma()
const G4Material * GetMaterial() const
G4ParticleDefinition * GetIon(const G4String &name)