53   slaterEffectiveCharge[0] = 0.;
 
   54   slaterEffectiveCharge[1] = 0.;
 
   55   slaterEffectiveCharge[2] = 0.;
 
   60   lowEnergyLimitForZ1 = 0 * 
eV;
 
   61   lowEnergyLimitForZ2 = 0 * 
eV;
 
   62   lowEnergyLimitOfModelForZ1 = 100 * 
eV;
 
   63   lowEnergyLimitOfModelForZ2 = 1 * 
keV;
 
   64   killBelowEnergyForZ1 = lowEnergyLimitOfModelForZ1;
 
   65   killBelowEnergyForZ2 = lowEnergyLimitOfModelForZ2;
 
   77     G4cout << 
"Rudd ionisation model is constructed " << 
G4endl;
 
   85   fAtomDeexcitation = 0;
 
   99   std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator 
pos;
 
  100   for (pos = tableData.begin(); pos != tableData.end(); ++
pos)
 
  118   if (verboseLevel > 3)
 
  120     G4cout << 
"Calling G4DNARuddIonisationModel::Initialise()" << 
G4endl;
 
  125   G4String fileProton(
"dna/sigma_ionisation_p_rudd");
 
  126   G4String fileHydrogen(
"dna/sigma_ionisation_h_rudd");
 
  127   G4String fileAlphaPlusPlus(
"dna/sigma_ionisation_alphaplusplus_rudd");
 
  128   G4String fileAlphaPlus(
"dna/sigma_ionisation_alphaplus_rudd");
 
  129   G4String fileHelium(
"dna/sigma_ionisation_he_rudd");
 
  152   tableFile[
proton] = fileProton;
 
  154   lowEnergyLimit[
proton] = lowEnergyLimitForZ1;
 
  163   tableData[
proton] = tableProton;
 
  168   tableFile[hydrogen] = fileHydrogen;
 
  170   lowEnergyLimit[hydrogen] = lowEnergyLimitForZ1;
 
  171   highEnergyLimit[hydrogen] = 100. * 
MeV;
 
  178   tableHydrogen->
LoadData(fileHydrogen);
 
  180   tableData[hydrogen] = tableHydrogen;
 
  185   tableFile[alphaPlusPlus] = fileAlphaPlusPlus;
 
  187   lowEnergyLimit[alphaPlusPlus] = lowEnergyLimitForZ2;
 
  188   highEnergyLimit[alphaPlusPlus] = 400. * 
MeV;
 
  195   tableAlphaPlusPlus->
LoadData(fileAlphaPlusPlus);
 
  197   tableData[alphaPlusPlus] = tableAlphaPlusPlus;
 
  202   tableFile[alphaPlus] = fileAlphaPlus;
 
  204   lowEnergyLimit[alphaPlus] = lowEnergyLimitForZ2;
 
  205   highEnergyLimit[alphaPlus] = 400. * 
MeV;
 
  212   tableAlphaPlus->
LoadData(fileAlphaPlus);
 
  213   tableData[alphaPlus] = tableAlphaPlus;
 
  218   tableFile[helium] = fileHelium;
 
  220   lowEnergyLimit[helium] = lowEnergyLimitForZ2;
 
  221   highEnergyLimit[helium] = 400. * 
MeV;
 
  229   tableData[helium] = tableHelium;
 
  233   if (particle==protonDef)
 
  239   if (particle==hydrogenDef)
 
  245   if (particle==heliumDef)
 
  251   if (particle==alphaPlusDef)
 
  257   if (particle==alphaPlusPlusDef)
 
  265     G4cout << 
"Rudd ionisation model is initialized " << 
G4endl 
  283   isInitialised = 
true;
 
  295   if (verboseLevel > 3)
 
  297     G4cout << 
"Calling CrossSectionPerVolume() of G4DNARuddIonisationModel" 
  309       particleDefinition != instance->
GetIon(
"hydrogen")
 
  311       particleDefinition != instance->
GetIon(
"alpha++")
 
  313       particleDefinition != instance->
GetIon(
"alpha+")
 
  315       particleDefinition != instance->
GetIon(
"helium")
 
  323       || particleDefinition == instance->
GetIon(
"hydrogen")
 
  326   lowLim = lowEnergyLimitOfModelForZ1;
 
  328   if ( particleDefinition == instance->
GetIon(
"alpha++")
 
  329       || particleDefinition == instance->
GetIon(
"alpha+")
 
  330       || particleDefinition == instance->
GetIon(
"helium")
 
  333   lowLim = lowEnergyLimitOfModelForZ2;
 
  340   if(waterDensity!= 0.0)
 
  356     std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
 
  357     pos2 = highEnergyLimit.find(particleName);
 
  359     if (pos2 != highEnergyLimit.end())
 
  361       highLim = pos2->second;
 
  368       if (k < lowLim) k = lowLim;
 
  372       std::map< G4String,G4DNACrossSectionDataSet*,std::less<G4String> >::iterator 
pos;
 
  373       pos = tableData.find(particleName);
 
  375       if (pos != tableData.end())
 
  385         G4Exception(
"G4DNARuddIonisationModel::CrossSectionPerVolume",
"em0002",
 
  391     if (verboseLevel > 2)
 
  393       G4cout << 
"__________________________________" << 
G4endl;
 
  394       G4cout << 
"G4DNARuddIonisationModel - XS INFO START" << 
G4endl;
 
  396       G4cout << 
"Cross section per water molecule (cm^2)=" << sigma/
cm/
cm << 
G4endl;
 
  397       G4cout << 
"Cross section per water molecule (cm^-1)=" << sigma*waterDensity/(1./
cm) << G4endl;
 
  399       G4cout << 
"G4DNARuddIonisationModel - XS INFO END" << 
G4endl;
 
  405     if (verboseLevel > 2)
 
  407       G4cout << 
"Warning : RuddIonisationModel: WATER DENSITY IS NULL" << 
G4endl;
 
  411   return sigma*waterDensity;
 
  424   if (verboseLevel > 3)
 
  426     G4cout << 
"Calling SampleSecondaries() of G4DNARuddIonisationModel" 
  440   lowLim = killBelowEnergyForZ1;
 
  447   lowLim = killBelowEnergyForZ2;
 
  464   std::map< G4String,G4double,std::less<G4String> >::iterator pos2;
 
  465   pos2 = highEnergyLimit.find(particleName);
 
  467   if (pos2 != highEnergyLimit.end())
 
  469     highLim = pos2->second;
 
  472   if (k >= lowLim && k <= highLim)
 
  483     G4int ionizationShell = RandomSelect(k,particleName);
 
  489     G4int secNumberInit = 0;
 
  490     G4int secNumberFinal = 0;
 
  496     if (k<bindingEnergy) 
return;
 
  500     if(fAtomDeexcitation)
 
  504       if (ionizationShell <5 && ionizationShell >1)
 
  508       else if (ionizationShell <2)
 
  523       secNumberInit = fvect->size();
 
  525       secNumberFinal = fvect->size();
 
  528     G4double secondaryKinetic = RandomizeEjectedElectronEnergy(definition,k,ionizationShell);
 
  554     G4double scatteredEnergy = k-bindingEnergy-secondaryKinetic;
 
  556     for (
G4int j=secNumberInit; j < secNumberFinal; j++)
 
  559       deexSecEnergy = deexSecEnergy + (*fvect)[j]->GetKineticEnergy();
 
  581     fvect->push_back(dp);
 
  606   G4double maximumKineticEnergyTransfer = 0.;
 
  612       || particleDefinition == instance->
GetIon(
"hydrogen"))
 
  617   else if (particleDefinition == instance->
GetIon(
"helium")
 
  618       || particleDefinition == instance->
GetIon(
"alpha+")
 
  619       || particleDefinition == instance->
GetIon(
"alpha++"))
 
  621     maximumKineticEnergyTransfer = 4. * (0.511 / 3728) * k;
 
  631         DifferentialCrossSection(particleDefinition, k, 
value, shell);
 
  632     if (differentialCrossSection >= crossSectionMaximum)
 
  633       crossSectionMaximum = differentialCrossSection;
 
  640     secElecKinetic = 
G4UniformRand()* maximumKineticEnergyTransfer;
 
  641   }
while(
G4UniformRand()*crossSectionMaximum > DifferentialCrossSection(particleDefinition,
 
  646   return (secElecKinetic);
 
  694                                                             G4int ionizationLevelIndex)
 
  712   const G4int j = ionizationLevelIndex;
 
  727   const G4double Bj[5] = { 12.60 * 
eV, 14.70 * 
eV, 18.40 * 
eV, 32.20 * 
eV, 540
 
  761   const G4double Gj[5] = { 0.99, 1.11, 1.11, 0.52, 1. };
 
  771   G4double w = wBig / Bj[ionizationLevelIndex];
 
  780   G4bool isProtonOrHydrogen = 
false;
 
  784       || particleDefinition == instance->
GetIon(
"hydrogen"))
 
  786     isProtonOrHydrogen = 
true;
 
  790   else if (particleDefinition == instance->
GetIon(
"helium")
 
  791       || particleDefinition == instance->
GetIon(
"alpha+")
 
  792       || particleDefinition == instance->
GetIon(
"alpha++"))
 
  795     tau = (0.511 / 3728.) * k;
 
  799       * std::pow((Ry / Bj[ionizationLevelIndex]), 2);
 
  805   G4double v2 = tau / Bj[ionizationLevelIndex];
 
  810   G4double wc = 4. * v2 - 2. * v - (Ry / (4. * Bj[ionizationLevelIndex]));
 
  812     wc = 4. * v2 - 2. * v
 
  815   G4double L1 = (C1 * std::pow(v, (D1))) / (1. + E1 * std::pow(v, (D1 + 4.)));
 
  816   G4double L2 = C2 * std::pow(v, (D2));
 
  817   G4double H1 = (A1 * std::log(1. + v2)) / (v2 + (B1 / v2));
 
  818   G4double H2 = (A2 / v2) + (B2 / (v2 * v2));
 
  821   G4double F2 = (L2 * H2) / (L2 + H2);
 
  824       CorrectionFactor(particleDefinition, k) * Gj[j]
 
  825           * (S / Bj[ionizationLevelIndex])
 
  827               / (std::pow((1. + w), 3)
 
  828                   * (1. + 
G4Exp(alphaConst * (w - wc) / v))));
 
  831     sigma = CorrectionFactor(particleDefinition, k) * Gj[j]
 
  834             / (std::pow((1. + w), 3)
 
  835                 * (1. + 
G4Exp(alphaConst * (w - wc) / v))));
 
  837   if ((particleDefinition == instance->
GetIon(
"hydrogen"))
 
  838       && (ionizationLevelIndex == 4))
 
  843             / (std::pow((1. + w), 3)
 
  844                 * (1. + 
G4Exp(alphaConst * (w - wc) / v))));
 
  849   if (isProtonOrHydrogen)
 
  854   if (particleDefinition == instance->
GetIon(
"alpha++"))
 
  856     slaterEffectiveCharge[0] = 0.;
 
  857     slaterEffectiveCharge[1] = 0.;
 
  858     slaterEffectiveCharge[2] = 0.;
 
  859     sCoefficient[0] = 0.;
 
  860     sCoefficient[1] = 0.;
 
  861     sCoefficient[2] = 0.;
 
  864   else if (particleDefinition == instance->
GetIon(
"alpha+"))
 
  866     slaterEffectiveCharge[0] = 2.0;
 
  868     slaterEffectiveCharge[1] = 2.0;
 
  869     slaterEffectiveCharge[2] = 2.0;
 
  871     sCoefficient[0] = 0.7;
 
  872     sCoefficient[1] = 0.15;
 
  873     sCoefficient[2] = 0.15;
 
  876   else if (particleDefinition == instance->
GetIon(
"helium"))
 
  878     slaterEffectiveCharge[0] = 1.7;
 
  879     slaterEffectiveCharge[1] = 1.15;
 
  880     slaterEffectiveCharge[2] = 1.15;
 
  881     sCoefficient[0] = 0.5;
 
  882     sCoefficient[1] = 0.25;
 
  883     sCoefficient[2] = 0.25;
 
  892     sigma = Gj[j] * (S / Bj[ionizationLevelIndex])
 
  894             / (std::pow((1. + w), 3)
 
  895                 * (1. + 
G4Exp(alphaConst * (w - wc) / v))));
 
  901               / (std::pow((1. + w), 3)
 
  902                   * (1. + 
G4Exp(alphaConst * (w - wc) / v))));
 
  907     zEff -= (sCoefficient[0]
 
  908         * S_1s(k, energyTransfer, slaterEffectiveCharge[0], 1.)
 
  910             * S_2s(k, energyTransfer, slaterEffectiveCharge[1], 2.)
 
  912             * S_2p(k, energyTransfer, slaterEffectiveCharge[2], 2.));
 
  914     return zEff * zEff * sigma;
 
  930   G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
 
  946   G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
 
  948       - 
G4Exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
 
  964   G4double r = R(t, energyTransferred, slaterEffectiveChg, shellNumber);
 
  967           * ((((2. / 3. * r + 4. / 3.) * r + 2.) * r + 2.) * r + 1.);
 
  982   G4double tElectron = 0.511 / 3728. * t;
 
  985   G4double value = std::sqrt(2. * tElectron / H) / (energyTransferred / H)
 
  986       * (slaterEffectiveChg / shellNumber);
 
 1002   } 
else if (particleDefinition == instance->
GetIon(
"hydrogen"))
 
 1004     G4double value = (std::log10(k / 
eV) - 4.2) / 0.5;
 
 1006     return ((0.6 / (1 + 
G4Exp(value))) + 0.9);
 
 1027   std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator 
pos;
 
 1028   pos = tableData.find(particle);
 
 1030   if (pos != tableData.end())
 
 1046         value += valuesBuffer[i];
 
 1057         if (valuesBuffer[i] > value)
 
 1059           delete[] valuesBuffer;
 
 1062         value -= valuesBuffer[i];
 
 1066         delete[] valuesBuffer;
 
 1071     G4Exception(
"G4DNARuddIonisationModel::RandomSelect",
 
 1074                 "Model not applicable to particle type.");
 
 1082 G4double G4DNARuddIonisationModel::PartialCrossSection(
const G4Track& track)
 
 1094   std::map<G4String, G4double, std::less<G4String> >::iterator pos1;
 
 1095   pos1 = lowEnergyLimit.find(particleName);
 
 1097   if (pos1 != lowEnergyLimit.end())
 
 1099     lowLim = pos1->second;
 
 1102   std::map<G4String, G4double, std::less<G4String> >::iterator pos2;
 
 1103   pos2 = highEnergyLimit.find(particleName);
 
 1105   if (pos2 != highEnergyLimit.end())
 
 1107     highLim = pos2->second;
 
 1110   if (k >= lowLim && k <= highLim)
 
 1112     std::map<G4String, G4DNACrossSectionDataSet*, std::less<G4String> >::iterator 
pos;
 
 1113     pos = tableData.find(particleName);
 
 1115     if (pos != tableData.end())
 
 1124       G4Exception(
"G4DNARuddIonisationModel::PartialCrossSection",
 
 1127                   "Model not applicable to particle type.");
 
G4double LowEnergyLimit() const 
 
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
 
static G4LossTableManager * Instance()
 
static constexpr double proton_mass_c2
 
G4double GetKineticEnergy() const 
 
static constexpr double Bohr_radius
 
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()
 
G4VEmAngularDistribution * GetAngularDistribution()
 
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
 
virtual G4bool LoadData(const G4String &argFileName)
 
G4ParticleDefinition * GetDefinition() const 
 
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
 
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
 
const G4String & GetParticleName() 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 *)
 
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 
 
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 G4Proton * Proton()
 
static constexpr double eV
 
static G4DNAGenericIonsManager * Instance(void)
 
virtual G4double FindValue(G4double e, G4int componentId=0) const 
 
virtual size_t NumberOfComponents(void) const 
 
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. 
 
static G4DNAChemistryManager * Instance()
 
static G4DNAMolecularMaterial * Instance()
 
void CreateWaterMolecule(ElectronicModification, G4int, const G4Track *)
 
void SetAngularDistribution(G4VEmAngularDistribution *)
 
const G4Track * GetCurrentTrack() const 
 
static G4Electron * Electron()
 
void SetProposedKineticEnergy(G4double proposedKinEnergy)
 
static constexpr double MeV
 
static constexpr double pi
 
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 
 
G4double bindingEnergy(G4int A, G4int Z)
 
static constexpr double keV
 
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax)
 
G4int GetLeptonNumber() const 
 
static const G4double pos
 
G4ParticleChangeForGamma * GetParticleChangeForGamma()
 
const G4Material * GetMaterial() const 
 
G4ParticleDefinition * GetIon(const G4String &name)