File indexing completed on 2025-09-17 08:58:20
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 #ifndef G4eBremsstrahlungRelModel_h
0053 #define G4eBremsstrahlungRelModel_h 1
0054
0055 #include "G4VEmModel.hh"
0056 #include <memory>
0057
0058 class G4ParticleChangeForLoss;
0059
0060 class G4eBremsstrahlungRelModel : public G4VEmModel {
0061
0062 public:
0063
0064 explicit G4eBremsstrahlungRelModel(const G4ParticleDefinition* p=nullptr,
0065 const G4String& nam="eBremLPM");
0066
0067 ~G4eBremsstrahlungRelModel() override;
0068
0069 void Initialise(const G4ParticleDefinition*, const G4DataVector&) override;
0070
0071 void InitialiseLocal(const G4ParticleDefinition*,
0072 G4VEmModel* masterModel) override;
0073
0074 G4double ComputeDEDXPerVolume(const G4Material*,
0075 const G4ParticleDefinition*,
0076 G4double ekin,
0077 G4double cutEnergy) override;
0078
0079 G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
0080 G4double ekin,
0081 G4double zet,
0082 G4double,
0083 G4double cutEnergy,
0084 G4double maxEnergy = DBL_MAX) override;
0085
0086 void SampleSecondaries(std::vector<G4DynamicParticle*>*,
0087 const G4MaterialCutsCouple*,
0088 const G4DynamicParticle*,
0089 G4double cutEnergy,
0090 G4double maxEnergy) override;
0091
0092 void SetupForMaterial(const G4ParticleDefinition*,
0093 const G4Material*, G4double) override;
0094
0095 G4double MinPrimaryEnergy(const G4Material*,
0096 const G4ParticleDefinition*,
0097 G4double cutEnergy) override;
0098
0099 protected:
0100
0101 virtual G4double ComputeDXSectionPerAtom(G4double gammaEnergy);
0102
0103 void SetParticle(const G4ParticleDefinition* p);
0104
0105 private:
0106
0107 G4double ComputeBremLoss(G4double cutEnergy);
0108
0109 G4double ComputeXSectionPerAtom(G4double cutEnergy);
0110
0111 G4double ComputeRelDXSectionPerAtom(G4double gammaEnergy);
0112
0113
0114 void InitialiseElementData();
0115
0116
0117 void InitLPMFunctions();
0118
0119 void ComputeLPMfunctions(G4double& funcXiS,
0120 G4double& funcGS,
0121 G4double& funcPhiS,
0122 const G4double egamma);
0123
0124 void GetLPMFunctions(G4double& lpmGs,
0125 G4double& lpmPhis,
0126 const G4double ss);
0127
0128 void ComputeLPMGsPhis(G4double& funcGS,
0129 G4double& funcPhiS,
0130 const G4double varShat);
0131
0132
0133 void ComputeScreeningFunctions(G4double& phi1,
0134 G4double& phi1m2,
0135 G4double& psi1,
0136 G4double& psi1m2,
0137 const G4double gam,
0138 const G4double eps);
0139
0140 G4eBremsstrahlungRelModel& operator=
0141 (const G4eBremsstrahlungRelModel& right) = delete;
0142 G4eBremsstrahlungRelModel(const G4eBremsstrahlungRelModel&) = delete;
0143
0144 private:
0145
0146 G4bool fIsUseCompleteScreening = false;
0147 G4bool fIsInitializer = false;
0148 G4bool fUseLPM = true;
0149
0150 protected:
0151
0152 G4bool fIsElectron = true;
0153 G4bool fIsScatOffElectron = false;
0154 G4bool fIsLPMActive = false;
0155
0156 G4int fCurrentIZ = 0;
0157 const G4ParticleDefinition* fPrimaryParticle = nullptr;
0158 G4ParticleDefinition* fGammaParticle = nullptr;
0159 G4ParticleChangeForLoss* fParticleChange = nullptr;
0160
0161 G4double fPrimaryParticleMass = 0.;
0162 G4double fPrimaryKinEnergy = 0.;
0163 G4double fPrimaryTotalEnergy = 0.;
0164 G4double fDensityFactor = 0.;
0165 G4double fDensityCorr = 0.;
0166 G4double fLowestKinEnergy;
0167
0168 G4double fNucTerm = 0.;
0169 G4double fSumTerm = 0.;
0170
0171 private:
0172
0173
0174 G4double fLPMEnergyThreshold;
0175 G4double fLPMEnergy;
0176
0177 protected:
0178
0179 static const G4double gBremFactor;
0180 static const G4double gMigdalConstant;
0181
0182 private:
0183
0184 static const G4int gMaxZet;
0185
0186 static const G4double gLPMconstant;
0187
0188 static const G4double gXGL[8];
0189 static const G4double gWGL[8];
0190 static const G4double gFelLowZet[8];
0191 static const G4double gFinelLowZet[8];
0192
0193 struct ElementData {
0194
0195 G4double fLogZ;
0196
0197 G4double fFz;
0198
0199 G4double fZFactor1;
0200
0201 G4double fZFactor11;
0202
0203 G4double fZFactor2;
0204
0205 G4double fVarS1;
0206 G4double fILVarS1;
0207 G4double fILVarS1Cond;
0208
0209 G4double fGammaFactor;
0210 G4double fEpsilonFactor;
0211 };
0212
0213 struct LPMFuncs {
0214 LPMFuncs() : fIsInitialized(false), fISDelta(100.), fSLimit(2.) {}
0215 G4bool fIsInitialized;
0216 G4double fISDelta;
0217 G4double fSLimit;
0218 std::vector<G4double> fLPMFuncG;
0219 std::vector<G4double> fLPMFuncPhi;
0220 };
0221
0222 static std::shared_ptr<LPMFuncs> gLPMFuncs();
0223 static std::shared_ptr<std::vector<ElementData*>> gElementData();
0224 std::shared_ptr<LPMFuncs> fLPMFuncs;
0225 std::shared_ptr<std::vector<ElementData*>> fElementData;
0226 };
0227
0228 #endif