Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // GEANT4 Class header file 27 // GEANT4 Class header file 28 // 28 // 29 // File name: G4AtimaEnergyLossModel 29 // File name: G4AtimaEnergyLossModel 30 // 30 // 31 // Author: Jose Luis Rodriguez Sanchez 31 // Author: Jose Luis Rodriguez Sanchez on base of ATIMA code 32 // 32 // 33 // Creation date: 16.01.2018 33 // Creation date: 16.01.2018 34 // 34 // 35 // Modifications: 35 // Modifications: 36 // 36 // 37 // 37 // 38 // Class Description: 38 // Class Description: 39 // 39 // 40 // Implementation of ATIMA model of energy los 40 // Implementation of ATIMA model of energy loss 41 // by heavy charged particles 41 // by heavy charged particles 42 42 43 // ------------------------------------------- 43 // ------------------------------------------------------------------- 44 // 44 // 45 45 46 #ifndef G4AtimaEnergyLossModel_h 46 #ifndef G4AtimaEnergyLossModel_h 47 #define G4AtimaEnergyLossModel_h 1 47 #define G4AtimaEnergyLossModel_h 1 48 48 49 #include <CLHEP/Units/SystemOfUnits.h> 49 #include <CLHEP/Units/SystemOfUnits.h> 50 50 51 #include "G4VEmModel.hh" 51 #include "G4VEmModel.hh" 52 #include "G4NistManager.hh" 52 #include "G4NistManager.hh" 53 53 54 class G4EmCorrections; 54 class G4EmCorrections; 55 class G4ParticleChangeForLoss; 55 class G4ParticleChangeForLoss; 56 56 57 class G4AtimaEnergyLossModel : public G4VEmMod 57 class G4AtimaEnergyLossModel : public G4VEmModel 58 { 58 { 59 59 60 public: 60 public: 61 61 62 explicit G4AtimaEnergyLossModel(const G4Part 62 explicit G4AtimaEnergyLossModel(const G4ParticleDefinition* p = nullptr, 63 const G4Stri 63 const G4String& nam = "Atima"); 64 64 65 ~G4AtimaEnergyLossModel() override; << 65 virtual ~G4AtimaEnergyLossModel(); 66 66 67 void Initialise(const G4ParticleDefinition*, << 67 virtual void Initialise(const G4ParticleDefinition*, >> 68 const G4DataVector&) override; 68 69 69 G4double MinEnergyCut(const G4ParticleDefini << 70 virtual G4double MinEnergyCut(const G4ParticleDefinition*, 70 const G4MaterialCutsCouple* couple) over << 71 const G4MaterialCutsCouple* couple) override; 71 72 72 G4double ComputeCrossSectionPerElectron( << 73 virtual G4double ComputeCrossSectionPerElectron( 73 const G4ParticleDefinition*, 74 const G4ParticleDefinition*, 74 G4double kineticEnergy, 75 G4double kineticEnergy, 75 G4double cutEnergy, 76 G4double cutEnergy, 76 G4double maxEnergy); 77 G4double maxEnergy); 77 78 78 G4double ComputeCrossSectionPerAtom( << 79 virtual G4double ComputeCrossSectionPerAtom( 79 const G4ParticleDefinition*, 80 const G4ParticleDefinition*, 80 G4double kineticEnergy, 81 G4double kineticEnergy, 81 G4double Z, G4double A, 82 G4double Z, G4double A, 82 G4double cutEnergy, 83 G4double cutEnergy, 83 G4double maxEnergy) override; 84 G4double maxEnergy) override; 84 85 85 G4double CrossSectionPerVolume(const G4Mater << 86 virtual G4double CrossSectionPerVolume(const G4Material*, 86 const G4ParticleDefinition*, 87 const G4ParticleDefinition*, 87 G4double kineticEnergy, 88 G4double kineticEnergy, 88 G4double cutEnergy, 89 G4double cutEnergy, 89 G4double maxEnergy) override; 90 G4double maxEnergy) override; 90 91 91 G4double ComputeDEDXPerVolume(const G4Materi << 92 virtual G4double ComputeDEDXPerVolume(const G4Material*, 92 const G4ParticleDefinition*, << 93 const G4ParticleDefinition*, 93 G4double kineticEnergy, << 94 G4double kineticEnergy, 94 G4double) override; << 95 G4double) override; 95 << 96 96 G4double GetChargeSquareRatio(const G4Partic << 97 virtual G4double GetChargeSquareRatio(const G4ParticleDefinition* p, 97 const G4Material* mat, << 98 const G4Material* mat, 98 G4double kineticEnergy) override; << 99 G4double kineticEnergy) override; 99 << 100 100 G4double GetParticleCharge(const G4ParticleD << 101 virtual G4double GetParticleCharge(const G4ParticleDefinition* p, 101 const G4Material* mat, << 102 const G4Material* mat, 102 G4double kineticEnergy) override; << 103 G4double kineticEnergy) override; 103 << 104 104 void CorrectionsAlongStep(const G4MaterialCu << 105 virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*, 105 const G4DynamicParticle*, << 106 const G4DynamicParticle*, 106 const G4double&, << 107 G4double&, 107 G4double&) override; << 108 G4double&, 108 << 109 G4double) override; 109 void SampleSecondaries(std::vector<G4Dynamic << 110 110 const G4MaterialCutsCouple*, << 111 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*, 111 const G4DynamicParticle*, << 112 const G4MaterialCutsCouple*, 112 G4double tmin, << 113 const G4DynamicParticle*, 113 G4double maxEnergy) override; << 114 G4double tmin, >> 115 G4double maxEnergy) override; 114 116 115 protected: 117 protected: 116 118 117 G4double MaxSecondaryEnergy(const G4Particle << 119 virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*, 118 G4double kinEnergy) override; << 120 G4double kinEnergy) override; 119 121 120 inline G4double GetChargeSquareRatio() const 122 inline G4double GetChargeSquareRatio() const; 121 123 122 inline void SetChargeSquareRatio(G4double va 124 inline void SetChargeSquareRatio(G4double val); 123 125 124 private: 126 private: 125 127 126 void SetupParameters(); 128 void SetupParameters(); 127 129 128 inline void SetParticle(const G4ParticleDefi 130 inline void SetParticle(const G4ParticleDefinition* p); 129 131 130 inline void SetGenericIon(const G4ParticleDe 132 inline void SetGenericIon(const G4ParticleDefinition* p); 131 133 132 G4double StoppingPower(G4double ap, G4double 134 G4double StoppingPower(G4double ap, G4double zp, G4double ep, G4double at, G4double zt); 133 G4double Bethek_dedx_e(G4double ap,G4double 135 G4double Bethek_dedx_e(G4double ap,G4double zp,G4double ep,G4double at,G4double zt); 134 G4double dedx_n(const G4double ap, const G4d 136 G4double dedx_n(const G4double ap, const G4double zp, const G4double ep, const G4double at, const G4double zt); 135 G4double sezi_dedx_e(const G4double zp, cons 137 G4double sezi_dedx_e(const G4double zp, const G4double ep, const G4double at, const G4double zt); 136 G4double sezi_p_se(const G4double energy, co 138 G4double sezi_p_se(const G4double energy, const G4double at, const G4double zt); 137 G4double EnergyTable_interpolate(G4double xv 139 G4double EnergyTable_interpolate(G4double xval, const G4double* y); 138 140 139 // hide assignment operator 141 // hide assignment operator 140 G4AtimaEnergyLossModel & operator=(const G4 142 G4AtimaEnergyLossModel & operator=(const G4AtimaEnergyLossModel &right) = delete; 141 G4AtimaEnergyLossModel(const G4AtimaEnergyL 143 G4AtimaEnergyLossModel(const G4AtimaEnergyLossModel&) = delete; 142 144 143 const G4ParticleDefinition* particle; 145 const G4ParticleDefinition* particle; 144 const G4ParticleDefinition* theElectron; << 146 G4ParticleDefinition* theElectron; 145 G4EmCorrections* corr; 147 G4EmCorrections* corr; 146 G4ParticleChangeForLoss* fParticleChange; 148 G4ParticleChangeForLoss* fParticleChange; 147 G4NistManager* nist; 149 G4NistManager* nist; 148 G4Pow* g4calc; 150 G4Pow* g4calc; 149 151 150 G4double mass = 0.0; << 152 G4double mass; 151 G4double tlimit = DBL_MAX; << 153 G4double tlimit; 152 G4double spin = 0.0; << 154 G4double spin; 153 G4double magMoment2 = 0.0; << 155 G4double magMoment2; 154 G4double chargeSquare = 1.0; << 156 G4double chargeSquare; 155 G4double ratio = 1.0; << 157 G4double ratio; 156 G4double formfact = 0.0; << 158 G4double formfact; 157 G4double corrFactor = 1.0; << 159 G4double corrFactor; >> 160 G4bool isIon; 158 G4double MLN10; 161 G4double MLN10; 159 G4double atomic_mass_unit; 162 G4double atomic_mass_unit; 160 G4double dedx_constant; 163 G4double dedx_constant; 161 G4double electron_mass; 164 G4double electron_mass; 162 G4double fine_structure; 165 G4double fine_structure; 163 G4double domega2dx_constant; 166 G4double domega2dx_constant; 164 << 165 G4bool isIon = false; << 166 167 167 static G4double stepE; 168 static G4double stepE; 168 static G4double tableE[200]; 169 static G4double tableE[200]; 169 static const G4double element_atomic_weights 170 static const G4double element_atomic_weights[110]; 170 static const G4double ls_coefficients_a[110] 171 static const G4double ls_coefficients_a[110][200]; 171 static const G4double ls_coefficients_ahi[11 172 static const G4double ls_coefficients_ahi[110][200]; 172 static const G4double proton_stopping_coef[9 173 static const G4double proton_stopping_coef[92][8]; 173 static const G4double ionisation_potentials_ 174 static const G4double ionisation_potentials_z[121]; 174 175 175 static const G4double atima_vfermi[92]; 176 static const G4double atima_vfermi[92]; 176 static const G4double atima_lambda_screening 177 static const G4double atima_lambda_screening[92]; 177 static const G4double x0[92]; 178 static const G4double x0[92]; 178 static const G4double x1[92]; 179 static const G4double x1[92]; 179 static const G4double afermi[92]; 180 static const G4double afermi[92]; 180 static const G4double c[92]; 181 static const G4double c[92]; 181 static const G4double m0[92]; 182 static const G4double m0[92]; 182 static const G4double del_0[92]; 183 static const G4double del_0[92]; 183 184 184 }; 185 }; 185 186 186 //....oooOO0OOooo........oooOO0OOooo........oo 187 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 187 188 188 inline void G4AtimaEnergyLossModel::SetParticl 189 inline void G4AtimaEnergyLossModel::SetParticle(const G4ParticleDefinition* p) 189 { 190 { 190 if(particle != p) { 191 if(particle != p) { 191 particle = p; 192 particle = p; 192 if(p->GetBaryonNumber() > 3 || p->GetPDGCh 193 if(p->GetBaryonNumber() > 3 || p->GetPDGCharge() > CLHEP::eplus) 193 { isIon = true; } 194 { isIon = true; } 194 SetupParameters(); 195 SetupParameters(); 195 } 196 } 196 } 197 } 197 198 198 //....oooOO0OOooo........oooOO0OOooo........oo 199 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 199 200 200 inline void G4AtimaEnergyLossModel::SetGeneric 201 inline void G4AtimaEnergyLossModel::SetGenericIon(const G4ParticleDefinition* p) 201 { 202 { 202 if(p && p->GetParticleName() == "GenericIon" 203 if(p && p->GetParticleName() == "GenericIon") { isIon = true; } 203 } 204 } 204 205 205 //....oooOO0OOooo........oooOO0OOooo........oo 206 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 206 207 207 inline G4double G4AtimaEnergyLossModel::GetCha 208 inline G4double G4AtimaEnergyLossModel::GetChargeSquareRatio() const 208 { 209 { 209 return chargeSquare; 210 return chargeSquare; 210 } 211 } 211 212 212 //....oooOO0OOooo........oooOO0OOooo........oo 213 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 213 214 214 inline void G4AtimaEnergyLossModel::SetChargeS 215 inline void G4AtimaEnergyLossModel::SetChargeSquareRatio(G4double val) 215 { 216 { 216 chargeSquare = val; 217 chargeSquare = val; 217 } 218 } 218 219 219 //....oooOO0OOooo........oooOO0OOooo........oo 220 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 220 221 221 #endif 222 #endif 222 223