Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-08-02 08:28:28

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 // G4DNADoubleIonisationModel.hh
0027 //
0028 //  Created at 2024/04/03 (Thu.)
0029 //  Author: Shogo OKADA @KEK-CRC (shogo.okada@kek.jp)
0030 //
0031 //  Reference: J.Meesungnoen et. al, DOI: 10.1021/jp058037z
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   // constructor
0063   G4DNADoubleIonisationModel(
0064     const G4ParticleDefinition* p = nullptr,
0065     const G4String& model_name = "G4DNADoubleIonisationModel");
0066 
0067   // destructor
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 // G4DNA_DOUBLE_IONISATION_MODEL_HH_