71 G4cout <<
"Calling G4DNATripleIonisationModel::Initialise()" <<
G4endl;
78 constexpr G4double kScaleFactor = 1.0 * m * m;
83 G4String alpha_param_file{
"dna/multipleionisation_alphaparam_champion.dat"};
89 const auto& proton =
proton_def_->GetParticleName();
96 xs_proton->LoadData(
"dna/sigma_ionisation_p_rudd");
104 alpha_param_file =
"dna/multipleionisation_alphaparam_p.dat";
114 const auto& alpha =
alpha_def_->GetParticleName();
121 xs_alpha->LoadData(
"dna/sigma_ionisation_alphaplusplus_rudd");
129 alpha_param_file =
"dna/multipleionisation_alphaparam_alphaplusplus.dat";
139 const auto& carbon =
carbon_def_->GetParticleName();
146 xs_carbon->LoadData(
"dna/sigma_ionisation_c_rudd");
154 alpha_param_file =
"dna/multipleionisation_alphaparam_c.dat";
166 G4cout <<
"G4DNATripleIonisationModel is initialized " <<
G4endl
192 G4cout <<
"Calling G4DNATripleIonisationModel::CrossSectionPerVolume()"
210 if (ekin <= upp_energy_lim) {
212 if (ekin < low_energy_lim) { ekin = low_energy_lim; }
214 CrossSectionDataTable::iterator pos =
xs_tab_.find(pname);
216 G4Exception(
"G4DNATripleIonisationModel::CrossSectionPerVolume",
218 "Model not applicable to particle type.");
222 if (table !=
nullptr) {
231 std::stringstream msg;
233 msg <<
"----------------------------------------------------------------\n";
234 msg <<
" G4DNATripleIonisationModel - XS INFO START\n";
235 msg <<
" - Kinetic energy(eV): " << ekin/eV <<
", Particle : "
237 msg <<
" - Cross section per water molecule (cm^2): "
238 << sigma / cm / cm <<
"\n";
239 msg <<
" - Cross section per water molecule (cm^-1): "
240 << sigma * water_dens / (1.0 / cm) <<
"\n";
241 msg <<
" G4DNATripleIonisationModel - XS INFO END\n";
242 msg <<
"----------------------------------------------------------------\n";
248 return (sigma * water_dens);
259 G4cout <<
"Calling SampleSecondaries() of G4DNATripleIonisationModel"
270 const auto& pname = pdef->GetParticleName();
278 if (ekin < low_energy_lim) {
286 constexpr G4int kNumSecondaries = 3;
287 constexpr G4double kDeltaTheta = pi * 0.666666667;
289 G4int ioni_shell[kNumSecondaries] = {0, 0, 0};
290 G4double shell_energy[kNumSecondaries];
293 scale_param *= scale_param;
300 is_continue = (ioni_shell[0] == ioni_shell[1] &&
301 ioni_shell[1] == ioni_shell[2]);
302 if (!is_continue) {
break; }
306 for (
int i = 0; i < kNumSecondaries; i++) {
307 shell_energy[i] = ::water_structure.IonisationEnergy(ioni_shell[i]);
308 tot_ioni_energy += shell_energy[i];
316 G4double theta{0.0}, phi{0.0}, tot_ekin2{0.0};
317 for (
int i = 0; i < kNumSecondaries; i++) {
319 theta, phi, shell_energy[i]);
320 theta += kDeltaTheta;
325 G4Exception(
"G4DNATripleIonisatioModel::SampleSecondaries()",
334 const auto scattered_energy = ekin - tot_ioni_energy - tot_ekin2;
337 tot_ioni_energy = shell_energy[0] + shell_energy[1] + shell_energy[2];
342 ekin - scattered_energy);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4GLOB_DLL std::ostream G4cout
G4double FindValue(G4double e, G4int componentId=0) const override
G4DNAMultipleIonisationManager * mioni_manager_
G4int RandomSelect(G4double energy, G4double scale_param, const G4String &pname)
G4VAtomDeexcitation * atom_deex_
std::map< G4double, G4double > model_elow_tab_
G4ParticleDefinition * proton_def_
G4DNADoubleIonisationModel(const G4ParticleDefinition *p=nullptr, const G4String &model_name="G4DNADoubleIonisationModel")
G4ParticleDefinition * carbon_def_
G4double GetUppEnergyLimit(const G4String &pname)
EnergyLimitTable eupp_tab_
G4double GetLowEnergyLimit(const G4String &pname)
G4double GenerateSecondaries(std::vector< G4DynamicParticle * > *vsec, const G4MaterialCutsCouple *couple, const G4DynamicParticle *particle, G4int ioni_shell, G4double &theta, G4double &phi, G4double &shell_energy)
G4ParticleDefinition * alpha_def_
EnergyLimitTable elow_tab_
G4bool use_champion_param_
const std::vector< G4double > * water_density_
G4ParticleChangeForGamma * particle_change_
G4double energy_threshold_
CrossSectionDataTable xs_tab_
static G4DNAGenericIonsManager * Instance()
G4ParticleDefinition * GetIon(const G4String &name)
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()
void Initialise(const G4ParticleDefinition *particle, const G4DataVector &) override
G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *pdef, G4double ekin, G4double, G4double) override
void SampleSecondaries(std::vector< G4DynamicParticle * > *vsec, const G4MaterialCutsCouple *couple, const G4DynamicParticle *particle, G4double, G4double) override
G4DNATripleIonisationModel(const G4ParticleDefinition *p=nullptr, const G4String &model_name="G4DNATripleIonisationModel")
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4GenericIon * GenericIonDefinition()
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
static G4IonTable * GetIonTable()
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
std::size_t GetIndex() const
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
const G4String & GetParticleName() const
static G4Proton * ProtonDefinition()
void SetHighEnergyLimit(G4double)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
void SetLowEnergyLimit(G4double)