File indexing completed on 2026-09-21 09:10:25
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
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059 #ifndef G4ICRU73QOModel_h
0060 #define G4ICRU73QOModel_h 1
0061
0062 #include <CLHEP/Units/PhysicalConstants.h>
0063
0064 #include "G4VEmModel.hh"
0065 #include "G4AtomicShells.hh"
0066 #include "G4DensityEffectData.hh"
0067
0068 class G4ParticleChangeForLoss;
0069
0070 class G4ICRU73QOModel : public G4VEmModel
0071 {
0072
0073 public:
0074
0075 explicit G4ICRU73QOModel(const G4ParticleDefinition* p = nullptr,
0076 const G4String& nam = "ICRU73QO");
0077
0078 ~G4ICRU73QOModel() = default;
0079
0080 void Initialise(const G4ParticleDefinition*, const G4DataVector&) override;
0081
0082 G4double ComputeCrossSectionPerElectron(
0083 const G4ParticleDefinition*,
0084 G4double kineticEnergy,
0085 G4double cutEnergy,
0086 G4double maxEnergy);
0087
0088 G4double ComputeCrossSectionPerAtom(
0089 const G4ParticleDefinition*,
0090 G4double kineticEnergy,
0091 G4double Z, G4double A,
0092 G4double cutEnergy,
0093 G4double maxEnergy) override;
0094
0095 G4double CrossSectionPerVolume(const G4Material*,
0096 const G4ParticleDefinition*,
0097 G4double kineticEnergy,
0098 G4double cutEnergy,
0099 G4double maxEnergy) override;
0100
0101 G4double ComputeDEDXPerVolume(const G4Material*,
0102 const G4ParticleDefinition*,
0103 G4double kineticEnergy,
0104 G4double) override;
0105
0106 void SampleSecondaries(std::vector<G4DynamicParticle*>*,
0107 const G4MaterialCutsCouple*,
0108 const G4DynamicParticle*,
0109 G4double tmin,
0110 G4double maxEnergy) override;
0111
0112
0113 G4ICRU73QOModel & operator=(const G4ICRU73QOModel &right) = delete;
0114 G4ICRU73QOModel(const G4ICRU73QOModel&) = delete;
0115
0116 protected:
0117
0118 G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
0119 G4double kinEnergy) final;
0120
0121 private:
0122
0123 inline void SetParticle(const G4ParticleDefinition* p);
0124 inline void SetLowestKinEnergy(G4double val);
0125
0126 G4double DEDX(const G4Material* material, G4double kineticEnergy);
0127
0128 G4double DEDXPerElement(G4int Z, G4double kineticEnergy);
0129
0130
0131 G4int GetNumberOfShells(G4int Z) const;
0132
0133 G4double GetShellEnergy(G4int Z, G4int nbOfTheShell) const;
0134 G4double GetOscillatorEnergy(G4int Z, G4int nbOfTheShell) const;
0135 G4double GetShellStrength(G4int Z, G4int nbOfTheShell) const;
0136
0137
0138 G4double GetL0(G4double normEnergy) const;
0139
0140 G4double GetL1(G4double normEnergy) const;
0141
0142 G4double GetL2(G4double normEnergy) const;
0143
0144
0145 const G4ParticleDefinition* particle;
0146 G4ParticleDefinition* theElectron;
0147 G4ParticleChangeForLoss* fParticleChange;
0148 G4DensityEffectData* denEffData;
0149
0150 G4double mass;
0151 G4double charge;
0152 G4double chargeSquare;
0153 G4double massRate;
0154 G4double ratio;
0155 G4double lowestKinEnergy;
0156
0157 G4bool isInitialised;
0158
0159
0160 static const G4int NQOELEM = 26;
0161 static const G4int NQODATA = 130;
0162 static const G4int ZElementAvailable[NQOELEM];
0163
0164
0165
0166 static const G4int startElemIndex[NQOELEM];
0167 static const G4int nbofShellsForElement[NQOELEM];
0168 static const G4double ShellEnergy[NQODATA];
0169 static const G4double SubShellOccupation[NQODATA];
0170
0171 G4int indexZ[100];
0172
0173
0174 static const G4double L0[67][2];
0175 static const G4double L1[22][2];
0176 static const G4double L2[14][2];
0177
0178 G4int sizeL0;
0179 G4int sizeL1;
0180 G4int sizeL2;
0181
0182 static const G4double factorBethe[99];
0183
0184 };
0185
0186
0187
0188 inline void G4ICRU73QOModel::SetParticle(const G4ParticleDefinition* p)
0189 {
0190 particle = p;
0191 mass = particle->GetPDGMass();
0192 charge = particle->GetPDGCharge()/CLHEP::eplus;
0193 chargeSquare = charge*charge;
0194 massRate = mass/CLHEP::proton_mass_c2;
0195 ratio = CLHEP::electron_mass_c2/mass;
0196 }
0197
0198
0199
0200 inline void G4ICRU73QOModel::SetLowestKinEnergy(G4double val)
0201 {
0202 lowestKinEnergy = val;
0203 }
0204
0205 #endif