73 G4cout <<
"Calling G4DNAQuadrupleIonisationModel::Initialise()" <<
G4endl;
80 constexpr G4double kScaleFactor = 1.0 * m * m;
85 G4String alpha_param_file{
"dna/multipleionisation_alphaparam_champion.dat"};
91 const auto& proton =
proton_def_->GetParticleName();
98 xs_proton->LoadData(
"dna/sigma_ionisation_p_rudd");
106 alpha_param_file =
"dna/multipleionisation_alphaparam_p.dat";
116 const auto& alpha =
alpha_def_->GetParticleName();
123 xs_alpha->LoadData(
"dna/sigma_ionisation_alphaplusplus_rudd");
131 alpha_param_file =
"dna/multipleionisation_alphaparam_alphaplusplus.dat";
141 const auto& carbon =
carbon_def_->GetParticleName();
148 xs_carbon->LoadData(
"dna/sigma_ionisation_c_rudd");
156 alpha_param_file =
"dna/multipleionisation_alphaparam_c.dat";
168 G4cout <<
"G4DNAQuadrupleIonisationModel is initialized " <<
G4endl
194 G4cout <<
"Calling G4DNAQuadrupleIonisationModel::CrossSectionPerVolume()"
212 if (ekin <= upp_energy_lim) {
214 if (ekin < low_energy_lim) { ekin = low_energy_lim; }
216 CrossSectionDataTable::iterator pos =
xs_tab_.find(pname);
218 G4Exception(
"G4DNAQuadrupleIonisationModel::CrossSectionPerVolume",
220 "Model not applicable to particle type.");
224 if (table !=
nullptr) {
226 scale_param = ::g4pow->powA(scale_param, 3.0);
227 sigma = table->
FindValue(ekin) * scale_param;
234 std::stringstream msg;
236 msg <<
"----------------------------------------------------------------\n";
237 msg <<
" G4DNAQuadrupleIonisationModel - XS INFO START\n";
238 msg <<
" - Kinetic energy(eV): " << ekin/eV <<
", Particle : "
240 msg <<
" - Cross section per water molecule (cm^2): "
241 << sigma / cm / cm <<
"\n";
242 msg <<
" - Cross section per water molecule (cm^-1): "
243 << sigma * water_dens / (1.0 / cm) <<
"\n";
244 msg <<
" G4DNAQuadrupleIonisationModel - XS INFO END\n";
245 msg <<
"----------------------------------------------------------------\n";
251 return (sigma * water_dens);
262 G4cout <<
"Calling SampleSecondaries() of G4DNAQuadrupleIonisationModel"
273 const auto& pname = pdef->GetParticleName();
281 if (ekin < low_energy_lim) {
289 constexpr G4int kNumSecondaries = 4;
290 constexpr G4double kDeltaTheta = pi * 0.5;
292 G4int ioni_shell[kNumSecondaries] = {0, 0, 0, 0};
293 G4double shell_energy[kNumSecondaries];
296 scale_param = ::g4pow->powA(scale_param, 3.0);
305 (ioni_shell[0] == ioni_shell[1] && ioni_shell[1] == ioni_shell[2]) ||
306 (ioni_shell[1] == ioni_shell[2] && ioni_shell[2] == ioni_shell[3]) ||
307 (ioni_shell[2] == ioni_shell[3] && ioni_shell[3] == ioni_shell[0]) ||
308 (ioni_shell[3] == ioni_shell[0] && ioni_shell[0] == ioni_shell[1]) ||
309 (ioni_shell[0] == ioni_shell[1] && ioni_shell[1] == ioni_shell[2] &&
310 ioni_shell[2] == ioni_shell[3]);
311 if (!is_continue) {
break; }
315 for (
int i = 0; i < kNumSecondaries; i++) {
316 shell_energy[i] = ::water_structure.IonisationEnergy(ioni_shell[i]);
317 tot_ioni_energy += shell_energy[i];
325 G4double theta{0.0}, phi{0.0}, tot_ekin2{0.0};
326 for (
int i = 0; i < kNumSecondaries; i++) {
328 theta, phi, shell_energy[i]);
329 theta += kDeltaTheta;
335 G4Exception(
"G4DNAQuadrupleIonisatioModel::SampleSecondaries()",
344 const auto scattered_energy = ekin - tot_ioni_energy - tot_ekin2;
347 tot_ioni_energy = shell_energy[0] + shell_energy[1] +
348 shell_energy[2] + shell_energy[3];
353 ekin - scattered_energy);
@ eQuadrupleIonisedMolecule
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
G4DNAQuadrupleIonisationModel(const G4ParticleDefinition *p=nullptr, const G4String &model_name="G4DNAQuadrupleIonisationModel")
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
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 G4Pow * GetInstance()
static G4Proton * ProtonDefinition()
void SetHighEnergyLimit(G4double)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
void SetLowEnergyLimit(G4double)