File indexing completed on 2025-08-02 08:28:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 #ifndef G4DNA_DOUBLE_IONISATION_MODEL_HH_
0035 #define G4DNA_DOUBLE_IONISATION_MODEL_HH_
0036
0037 #include "G4VEmModel.hh"
0038 #include "G4ParticleChangeForGamma.hh"
0039 #include "G4ProductionCutsTable.hh"
0040
0041 #include "G4DNAGenericIonsManager.hh"
0042 #include "G4DNACrossSectionDataSet.hh"
0043 #include "G4Electron.hh"
0044 #include "G4Proton.hh"
0045 #include "G4LogLogInterpolation.hh"
0046
0047 #include "G4DNAWaterIonisationStructure.hh"
0048 #include "G4VAtomDeexcitation.hh"
0049 #include "G4NistManager.hh"
0050 #include "G4DNAMultipleIonisationManager.hh"
0051
0052 using EnergyLimitTable = std::map<G4String, G4double, std::less<G4String>>;
0053
0054 using CrossSectionDataTable = std::map<G4String, G4DNACrossSectionDataSet*,
0055 std::less<G4String>>;
0056
0057
0058
0059 class G4DNADoubleIonisationModel : public G4VEmModel {
0060 public:
0061
0062
0063 G4DNADoubleIonisationModel(
0064 const G4ParticleDefinition* p = nullptr,
0065 const G4String& model_name = "G4DNADoubleIonisationModel");
0066
0067
0068 ~G4DNADoubleIonisationModel() override;
0069
0070 G4DNADoubleIonisationModel& operator=(
0071 const G4DNADoubleIonisationModel&) = delete;
0072 G4DNADoubleIonisationModel(const G4DNADoubleIonisationModel&) = delete;
0073
0074 void Initialise(
0075 const G4ParticleDefinition* particle, const G4DataVector&) override;
0076
0077 G4double CrossSectionPerVolume(
0078 const G4Material* material, const G4ParticleDefinition* pdef,
0079 G4double ekin, G4double, G4double) override;
0080
0081 void SampleSecondaries(
0082 std::vector<G4DynamicParticle*>* vsec, const G4MaterialCutsCouple* couple,
0083 const G4DynamicParticle* particle, G4double, G4double) override;
0084
0085 void SelectStationary(G4bool in);
0086
0087 void SelectVerboseLevel(G4int in);
0088
0089 void UseChampionAlphaParameter(G4bool in);
0090
0091 void SetMultipleIonisationEnergy(G4double in);
0092
0093 protected:
0094
0095 G4double RandomizeEjectedElectronEnergy(
0096 G4ParticleDefinition* pdef, G4double ekin, G4int shell);
0097
0098 G4ParticleChangeForGamma* particle_change_ = nullptr;
0099
0100 G4int RandomSelect(G4double energy, G4double scale_param,
0101 const G4String& pname);
0102
0103 G4double GenerateSecondaries(std::vector<G4DynamicParticle*>* vsec,
0104 const G4MaterialCutsCouple* couple,
0105 const G4DynamicParticle* particle,
0106 G4int ioni_shell,
0107 G4double& theta, G4double& phi,
0108 G4double& shell_energy);
0109
0110 G4double GetLowEnergyLimit(const G4String& pname);
0111
0112 G4double GetUppEnergyLimit(const G4String& pname);
0113
0114 G4bool stat_code_;
0115
0116 G4VAtomDeexcitation* atom_deex_;
0117
0118 EnergyLimitTable elow_tab_;
0119 EnergyLimitTable eupp_tab_;
0120
0121 CrossSectionDataTable xs_tab_;
0122
0123 G4ParticleDefinition* proton_def_{nullptr};
0124 G4ParticleDefinition* alpha_def_{nullptr};
0125 G4ParticleDefinition* carbon_def_{nullptr};
0126
0127 const std::vector<G4double>* water_density_;
0128
0129 G4bool is_initialized_;
0130 G4int verbose_level_;
0131
0132 std::map<G4double, G4double> model_elow_tab_;
0133
0134 G4DNAMultipleIonisationManager* mioni_manager_{nullptr};
0135
0136 G4bool use_champion_param_;
0137
0138 G4double energy_threshold_;
0139 };
0140
0141
0142 inline void G4DNADoubleIonisationModel::SelectStationary(G4bool in)
0143 {
0144 stat_code_ = in;
0145 }
0146
0147
0148 inline void G4DNADoubleIonisationModel::SelectVerboseLevel(G4int in)
0149 {
0150 verbose_level_ = in;
0151 }
0152
0153
0154 inline void G4DNADoubleIonisationModel::UseChampionAlphaParameter(G4bool in)
0155 {
0156 use_champion_param_ = in;
0157 }
0158
0159
0160 inline void G4DNADoubleIonisationModel::SetMultipleIonisationEnergy(G4double in)
0161 {
0162 energy_threshold_ = in;
0163 }
0164
0165 #endif