60 slaterEffectiveCharge[0]=0.;
61 slaterEffectiveCharge[1]=0.;
62 slaterEffectiveCharge[2]=0.;
67 lowEnergyLimitForA[1] = 0 *
eV;
68 lowEnergyLimitForA[2] = 0 *
eV;
69 lowEnergyLimitForA[3] = 0 *
eV;
70 lowEnergyLimitOfModelForA[1] = 100 *
eV;
71 lowEnergyLimitOfModelForA[4] = 1 *
keV;
72 lowEnergyLimitOfModelForA[5] = 0.5 *
MeV;
73 killBelowEnergyForA[1] = lowEnergyLimitOfModelForA[1];
74 killBelowEnergyForA[4] = lowEnergyLimitOfModelForA[4];
75 killBelowEnergyForA[5] = lowEnergyLimitOfModelForA[5];
87 G4cout <<
"Rudd ionisation model is constructed " <<
G4endl;
95 fAtomDeexcitation = 0;
109 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
110 for (pos = tableData.begin(); pos != tableData.end(); ++
pos)
127 if (verboseLevel > 3)
128 G4cout <<
"Calling G4DNARuddIonisationExtendedModel::Initialise()" <<
G4endl;
132 G4String fileProton(
"dna/sigma_ionisation_p_rudd");
133 G4String fileHydrogen(
"dna/sigma_ionisation_h_rudd");
134 G4String fileAlphaPlusPlus(
"dna/sigma_ionisation_alphaplusplus_rudd");
135 G4String fileAlphaPlus(
"dna/sigma_ionisation_alphaplus_rudd");
136 G4String fileHelium(
"dna/sigma_ionisation_he_rudd");
137 G4String fileLithium(
"dna/sigma_ionisation_li_rudd");
138 G4String fileBeryllium(
"dna/sigma_ionisation_be_rudd");
139 G4String fileBoron(
"dna/sigma_ionisation_b_rudd");
140 G4String fileCarbon(
"dna/sigma_ionisation_c_rudd");
141 G4String fileNitrogen(
"dna/sigma_ionisation_n_rudd");
142 G4String fileOxygen(
"dna/sigma_ionisation_o_rudd");
143 G4String fileSilicon(
"dna/sigma_ionisation_si_rudd");
144 G4String fileIron(
"dna/sigma_ionisation_fe_rudd");
191 tableFile[
proton] = fileProton;
192 lowEnergyLimit[
proton] = lowEnergyLimitForA[1];
201 tableData[
proton] = tableProton;
206 tableFile[hydrogen] = fileHydrogen;
208 lowEnergyLimit[hydrogen] = lowEnergyLimitForA[1];
209 highEnergyLimit[hydrogen] = 100. *
MeV;
216 tableHydrogen->
LoadData(fileHydrogen);
218 tableData[hydrogen] = tableHydrogen;
223 tableFile[alphaPlusPlus] = fileAlphaPlusPlus;
225 lowEnergyLimit[alphaPlusPlus] = lowEnergyLimitForA[4];
226 highEnergyLimit[alphaPlusPlus] = 400. *
MeV;
233 tableAlphaPlusPlus->
LoadData(fileAlphaPlusPlus);
235 tableData[alphaPlusPlus] = tableAlphaPlusPlus;
240 tableFile[alphaPlus] = fileAlphaPlus;
242 lowEnergyLimit[alphaPlus] = lowEnergyLimitForA[4];
243 highEnergyLimit[alphaPlus] = 400. *
MeV;
250 tableAlphaPlus->
LoadData(fileAlphaPlus);
251 tableData[alphaPlus] = tableAlphaPlus;
256 tableFile[helium] = fileHelium;
258 lowEnergyLimit[helium] = lowEnergyLimitForA[4];
259 highEnergyLimit[helium] = 400. *
MeV;
267 tableData[helium] = tableHelium;
272 tableFile[lithium] = fileLithium;
277 lowEnergyLimit[lithium] = 0.5*7*
MeV;
278 highEnergyLimit[lithium] = 1e6*7*
MeV;
286 tableLithium->
LoadData(fileLithium);
287 tableData[lithium] = tableLithium;
292 tableFile[beryllium] = fileBeryllium;
297 lowEnergyLimit[beryllium] = 0.5*9*
MeV;
298 highEnergyLimit[beryllium] = 1e6*9*
MeV;
306 tableBeryllium->
LoadData(fileBeryllium);
307 tableData[beryllium] = tableBeryllium;
312 tableFile[boron] = fileBoron;
317 lowEnergyLimit[boron] = 0.5*11*
MeV;
318 highEnergyLimit[boron] = 1e6*11*
MeV;
327 tableData[boron] = tableBoron;
332 tableFile[carbon] = fileCarbon;
337 lowEnergyLimit[carbon] = 0.5*12*
MeV;
338 highEnergyLimit[carbon] = 1e6*12*
MeV;
347 tableData[carbon] = tableCarbon;
352 tableFile[oxygen] = fileOxygen;
357 lowEnergyLimit[oxygen] = 0.5*16*
MeV;
358 highEnergyLimit[oxygen] = 1e6*16*
MeV;
367 tableData[oxygen] = tableOxygen;
372 tableFile[nitrogen] = fileNitrogen;
377 lowEnergyLimit[nitrogen] = 0.5*14*
MeV;
378 highEnergyLimit[nitrogen] = 1e6*14*
MeV;
386 tableNitrogen->
LoadData(fileNitrogen);
387 tableData[nitrogen] = tableNitrogen;
392 tableFile[silicon] = fileSilicon;
396 lowEnergyLimit[silicon] = 0.5*28*
MeV;
397 highEnergyLimit[silicon] = 1e6*28*
MeV;
405 tableSilicon->
LoadData(fileSilicon);
406 tableData[silicon] = tableSilicon;
411 tableFile[iron] = fileIron;
416 lowEnergyLimit[iron] = 0.5*56*
MeV;
417 highEnergyLimit[iron] = 1e6*56*
MeV;
426 tableData[iron] = tableIron;
436 if (particle==protonDef)
442 if (particle==hydrogenDef)
448 if (particle==heliumDef)
454 if (particle==alphaPlusDef)
460 if (particle==alphaPlusPlusDef)
466 if (particle==lithiumDef)
472 if (particle==berylliumDef)
478 if (particle==boronDef)
484 if (particle==carbonDef)
490 if (particle==nitrogenDef)
496 if (particle==oxygenDef)
502 if (particle==siliconDef)
508 if (particle==ironDef)
518 G4cout <<
"Rudd ionisation model is initialized " << G4endl
533 if (isInitialised) {
return; }
535 isInitialised =
true;
550 if (verboseLevel > 3)
551 G4cout <<
"Calling CrossSectionPerVolume() of G4DNARuddIonisationExtendedModel" <<
G4endl;
561 particleDefinition != instance->
GetIon(
"hydrogen")
563 particleDefinition != instance->
GetIon(
"alpha++")
565 particleDefinition != instance->
GetIon(
"alpha+")
567 particleDefinition != instance->
GetIon(
"helium")
600 || particleDefinition == instance->
GetIon(
"hydrogen")
603 lowLim = lowEnergyLimitOfModelForA[1];
605 else if ( particleDefinition == instance->
GetIon(
"alpha++")
606 || particleDefinition == instance->
GetIon(
"alpha+")
607 || particleDefinition == instance->
GetIon(
"helium")
610 lowLim = lowEnergyLimitOfModelForA[4];
612 else lowLim = lowEnergyLimitOfModelForA[5];
620 if(waterDensity!= 0.0)
625 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
626 pos2 = highEnergyLimit.find(particleName);
628 if (pos2 != highEnergyLimit.end())
630 highLim = pos2->second;
638 if (k < lowLim) k = lowLim;
642 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
643 pos = tableData.find(particleName);
645 if (pos != tableData.end())
655 G4Exception(
"G4DNARuddIonisationExtendedModel::CrossSectionPerVolume",
"em0002",
661 if (verboseLevel > 2)
663 G4cout <<
"__________________________________" <<
G4endl;
664 G4cout <<
"G4DNARuddIonisationExtendedModel - XS INFO START" <<
G4endl;
666 G4cout <<
"Cross section per water molecule (cm^2)=" << sigma/
cm/
cm <<
G4endl;
667 G4cout <<
"Cross section per water molecule (cm^-1)=" << sigma*waterDensity/(1./
cm) << G4endl;
669 G4cout <<
"G4DNARuddIonisationExtendedModel - XS INFO END" <<
G4endl;
675 return sigma*waterDensity;
693 if (verboseLevel > 3)
694 G4cout <<
"Calling SampleSecondaries() of G4DNARuddIonisationExtendedModel" <<
G4endl;
740 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
741 pos2 = highEnergyLimit.find(particleName);
743 if (pos2 != highEnergyLimit.end())highLim = pos2->second;
745 if (k >= lowLim && k < highLim)
756 G4int ionizationShell = RandomSelect(k,particleName);
762 G4int secNumberInit = 0;
763 G4int secNumberFinal = 0;
768 if (k<bindingEnergy)
return;
773 if(fAtomDeexcitation) {
776 if (ionizationShell <5 && ionizationShell >1)
780 else if (ionizationShell <2)
796 secNumberInit = fvect->size();
798 secNumberFinal = fvect->size();
801 G4double secondaryKinetic = RandomizeEjectedElectronEnergy(definition,k,ionizationShell);
841 G4double scatteredEnergy = k-bindingEnergy-secondaryKinetic;
843 for (
G4int j=secNumberInit; j < secNumberFinal; j++) {
845 deexSecEnergy = deexSecEnergy + (*fvect)[j]->GetKineticEnergy();
861 fvect->push_back(dp);
894 proposed_energy = ProposedSampledEnergy(particleDefinition, k, shell);
898 for(
G4double en=0.; en<20.; en+=1.)
if(RejectionFunction(particleDefinition, k, en, shell) > max1)
899 max1=RejectionFunction(particleDefinition, k, en, shell);
903 value_sampling = RejectionFunction(particleDefinition, k, proposed_energy, shell);
905 }
while(random1 > value_sampling);
907 return(proposed_energy);
958 G4int ionizationLevelIndex)
960 const G4int j=ionizationLevelIndex;
963 const G4double Gj[5] = {0.99, 1.11, 1.11, 0.52, 1.};
980 Bj_energy = Bj[ionizationLevelIndex];
983 G4double energyTransfer = proposed_ws + Bj_energy;
984 proposed_ws/=Bj_energy;
995 if((tau/
MeV)<5.447761194e-2)
997 v2 = tau / Bj_energy;
1008 G4double wc = 4.*v2 - 2.*v - (Ry/(4.*Bj_energy));
1009 G4double rejection_term = 1.+
G4Exp(alphaConst*(proposed_ws - wc) / v);
1010 rejection_term = (1./rejection_term)*CorrectionFactor(particleDefinition,k,ionizationLevelIndex) * Gj[j];
1016 || particleDefinition == instance->
GetIon(
"hydrogen")
1019 return(rejection_term);
1026 G4double x = 100.*std::sqrt(beta2)/std::pow(Z,(2./3.));
1027 G4double Zeffion = Z*(1.-
G4Exp(-1.316*x+0.112*x*x-0.0650*x*x*x));
1028 rejection_term*=Zeffion*Zeffion;
1031 else if (particleDefinition == instance->
GetIon(
"alpha++") )
1034 slaterEffectiveCharge[0]=0.;
1035 slaterEffectiveCharge[1]=0.;
1036 slaterEffectiveCharge[2]=0.;
1042 else if (particleDefinition == instance->
GetIon(
"alpha+") )
1045 slaterEffectiveCharge[0]=2.0;
1047 slaterEffectiveCharge[1]=2.0;
1048 slaterEffectiveCharge[2]=2.0;
1050 sCoefficient[0]=0.7;
1051 sCoefficient[1]=0.15;
1052 sCoefficient[2]=0.15;
1055 else if (particleDefinition == instance->
GetIon(
"helium") )
1058 slaterEffectiveCharge[0]=1.7;
1059 slaterEffectiveCharge[1]=1.15;
1060 slaterEffectiveCharge[2]=1.15;
1061 sCoefficient[0]=0.5;
1062 sCoefficient[1]=0.25;
1063 sCoefficient[2]=0.25;
1076 zEff -= ( sCoefficient[0] * S_1s(k, energyTransfer, slaterEffectiveCharge[0], 1.) +
1077 sCoefficient[1] * S_2s(k, energyTransfer, slaterEffectiveCharge[1], 2.) +
1078 sCoefficient[2] * S_2p(k, energyTransfer, slaterEffectiveCharge[2], 2.) );
1080 rejection_term*= zEff * zEff;
1083 return (rejection_term);
1092 G4int ionizationLevelIndex)
1095 const G4int j=ionizationLevelIndex;
1140 Bj_energy = Bj[ionizationLevelIndex];
1151 if((tau/
MeV)<5.447761194e-2)
1153 v2 = tau / Bj_energy;
1165 G4double L1 = (C1* std::pow(v,(D1))) / (1.+ E1*std::pow(v, (D1+4.)));
1167 G4double H1 = (A1*std::log(1.+v2)) / (v2+(B1/v2));
1168 G4double H2 = (A2/v2) + (B2/(v2*v2));
1183 G4double gamma = 1./sqrt(1.-beta2);
1192 G4double wmax = maximumEnergy/Bj_energy;
1193 G4double c = wmax*(F2*wmax+F1*(2.+wmax))/(2.*(1.+wmax)*(1.+wmax));
1196 G4double proposed_ws = F1*F1*c*c + 2.*F2*c*randVal - 2.*F1*c*randVal;
1197 proposed_ws = -F1*c+2.*randVal+std::sqrt(proposed_ws);
1199 proposed_ws/= ( F1*c + F2*c - 2.*randVal );
1200 proposed_ws*=Bj_energy;
1202 return(proposed_ws);
1216 G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
1232 G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
1249 G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
1250 G4double value = 1. -
G4Exp(-2 * r) * (((( 2./3. * r + 4./3.) * r + 2.) * r + 2.) * r + 1.);
1265 G4double tElectron = 0.511/3728. * t;
1268 G4double value = std::sqrt ( 2. * tElectron / H ) / ( energyTransferred / H ) * (slaterEffectiveChg/shellNumber);
1281 if (particleDefinition == instance->
GetIon(
"hydrogen") && shell < 4)
1285 return((0.6/(1+
G4Exp(value))) + 0.9);
1302 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
1303 pos = tableData.find(particle);
1305 if (pos != tableData.end())
1322 value += valuesBuffer[i];
1333 if (valuesBuffer[i] > value)
1335 delete[] valuesBuffer;
1338 value -= valuesBuffer[i];
1341 if (valuesBuffer)
delete[] valuesBuffer;
1347 G4Exception(
"G4DNARuddIonisationExtendedModel::RandomSelect",
"em0002",
1356 G4double G4DNARuddIonisationExtendedModel::PartialCrossSection(
const G4Track& track )
1368 std::map< G4String,G4double,std::less<G4String> >::iterator pos1;
1369 pos1 = lowEnergyLimit.find(particleName);
1371 if (pos1 != lowEnergyLimit.end())
1373 lowLim = pos1->second;
1376 std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
1377 pos2 = highEnergyLimit.find(particleName);
1379 if (pos2 != highEnergyLimit.end())
1381 highLim = pos2->second;
1384 if (k >= lowLim && k <= highLim)
1386 std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator
pos;
1387 pos = tableData.find(particleName);
1389 if (pos != tableData.end())
1399 G4Exception(
"G4DNARuddIonisationExtendedModel::PartialCrossSection",
"em0002",
G4DNARuddIonisationExtendedModel(const G4ParticleDefinition *p=0, const G4String &nam="DNARuddIonisationExtendedModel")
G4double LowEnergyLimit() const
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
static G4LossTableManager * Instance()
G4double GetKineticEnergy() const
G4double HighEnergyLimit() const
const G4DynamicParticle * GetDynamicParticle() const
virtual const G4VEMDataSet * GetComponent(G4int componentId) const
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
virtual ~G4DNARuddIonisationExtendedModel()
static G4Proton * ProtonDefinition()
G4VEmAngularDistribution * GetAngularDistribution()
virtual G4bool LoadData(const G4String &argFileName)
G4ParticleDefinition * GetDefinition() const
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
const G4String & GetParticleName() const
G4int GetAtomicNumber() const
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static constexpr double electron_mass_c2
void SetHighEnergyLimit(G4double)
virtual G4ThreeVector & SampleDirectionForShell(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, G4int shellID, const G4Material *)
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
G4ParticleChangeForGamma * fParticleChangeForGamma
G4GLOB_DLL std::ostream G4cout
const std::vector< double > * GetNumMolPerVolTableFor(const G4Material *) const
static constexpr double m
const XML_Char int const XML_Char * value
const G4ThreeVector & GetMomentumDirection() const
static constexpr double cm
static constexpr double eplus
static constexpr double eV
static G4DNAGenericIonsManager * Instance(void)
virtual G4double FindValue(G4double e, G4int componentId=0) const
G4int GetAtomicMass() const
virtual size_t NumberOfComponents(void) const
static G4IonTable * GetIonTable()
G4double IonisationEnergy(G4int level)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
static G4DNAChemistryManager * Instance()
static G4DNAMolecularMaterial * Instance()
G4double GetPDGMass() const
void CreateWaterMolecule(ElectronicModification, G4int, const G4Track *)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4Track * GetCurrentTrack() const
static G4Electron * Electron()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
static constexpr double MeV
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)
G4double GetPDGCharge() const
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax)
G4double bindingEnergy(G4int A, G4int Z)
static constexpr double keV
G4int GetLeptonNumber() const
static const G4double pos
G4ParticleChangeForGamma * GetParticleChangeForGamma()
const G4Material * GetMaterial() const
G4ParticleDefinition * GetIon(const G4String &name)