Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-10 09:18:17

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 //
0027 // -------------------------------------------------------------------
0028 //
0029 // GEANT4 Class header file
0030 //
0031 //
0032 // File name:     G4eBremsstrahlungRelModel
0033 //                extention of standard G4eBremsstrahlungModel
0034 //
0035 // Author:        Andreas Schaelicke
0036 //
0037 // Creation date: 28.03.2008
0038 //
0039 // Modifications:
0040 //
0041 // 15.07.18  introduced data structures to store LPM functions and element depen
0042 //           dent data for faster run-time computation (see more in .cc M.Novak)
0043 //
0044 // Class Description:
0045 //
0046 // Implementation of energy loss for gamma emission by electrons and
0047 // positrons including an improved version of the LPM effect
0048 
0049 // -------------------------------------------------------------------
0050 //
0051 
0052 #ifndef G4eBremsstrahlungRelModel_h
0053 #define G4eBremsstrahlungRelModel_h 1
0054 
0055 #include "G4VEmModel.hh"
0056 
0057 class G4ParticleChangeForLoss;
0058 
0059 class G4eBremsstrahlungRelModel : public G4VEmModel {
0060 
0061 public:
0062 
0063   explicit G4eBremsstrahlungRelModel(const G4ParticleDefinition* p=nullptr,
0064                                      const G4String& nam="eBremLPM");
0065 
0066   ~G4eBremsstrahlungRelModel() override;
0067 
0068   void Initialise(const G4ParticleDefinition*, const G4DataVector&) override;
0069 
0070   void InitialiseLocal(const G4ParticleDefinition*,
0071                        G4VEmModel* masterModel) override;
0072 
0073   G4double ComputeDEDXPerVolume(const G4Material*,
0074                                 const G4ParticleDefinition*,
0075                                 G4double ekin,
0076                                 G4double cutEnergy) override;
0077 
0078   G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
0079                                       G4double ekin,
0080                                       G4double zet,
0081                                       G4double,
0082                                       G4double cutEnergy,
0083                                       G4double maxEnergy = DBL_MAX) override;
0084 
0085   void SampleSecondaries(std::vector<G4DynamicParticle*>*,
0086                          const G4MaterialCutsCouple*,
0087                          const G4DynamicParticle*,
0088                          G4double cutEnergy,
0089                          G4double maxEnergy) override;
0090 
0091   void SetupForMaterial(const G4ParticleDefinition*,
0092                         const G4Material*, G4double) override;
0093 
0094   G4double MinPrimaryEnergy(const G4Material*,
0095                             const G4ParticleDefinition*,
0096                             G4double cutEnergy) override;
0097 
0098 protected:
0099 
0100   virtual G4double ComputeDXSectionPerAtom(G4double gammaEnergy);
0101 
0102   void SetParticle(const G4ParticleDefinition* p);
0103 
0104 private:
0105 
0106   G4double ComputeBremLoss(G4double cutEnergy);
0107 
0108   G4double ComputeXSectionPerAtom(G4double cutEnergy);
0109 
0110   G4double ComputeRelDXSectionPerAtom(G4double gammaEnergy);
0111 
0112   // init special data per element i.e. per Z
0113   void InitialiseElementData();
0114 
0115   void ComputeLPMfunctions(G4double& funcXiS,
0116                            G4double& funcGS,
0117                            G4double& funcPhiS,
0118                            const G4double egamma);
0119 
0120   // for evaluating screening related functions
0121   void ComputeScreeningFunctions(G4double& phi1,
0122                                  G4double& phi1m2,
0123                                  G4double& psi1,
0124                                  G4double& psi1m2,
0125                                  const G4double gam,
0126                                  const G4double eps);
0127   // hide assignment operator and cctr
0128   G4eBremsstrahlungRelModel& operator=
0129   (const G4eBremsstrahlungRelModel& right) = delete;
0130   G4eBremsstrahlungRelModel(const  G4eBremsstrahlungRelModel&) = delete;
0131 
0132 private:
0133 
0134   G4bool                      fIsUseCompleteScreening = false;
0135   G4bool                      fIsInitializer = false;
0136   G4bool                      fUseLPM = true;
0137 
0138 protected:
0139 
0140   G4bool                      fIsElectron = true;
0141   G4bool                      fIsScatOffElectron = false;
0142   G4bool                      fIsLPMActive = false;
0143   //
0144   G4int                       fCurrentIZ = 0;
0145   const G4ParticleDefinition* fPrimaryParticle = nullptr;
0146   G4ParticleDefinition*       fGammaParticle = nullptr;
0147   G4ParticleChangeForLoss*    fParticleChange = nullptr;
0148   // cash
0149   G4double                    fPrimaryParticleMass = 0.;
0150   G4double                    fPrimaryKinEnergy = 0.;
0151   G4double                    fPrimaryTotalEnergy = 0.;
0152   G4double                    fDensityFactor = 0.;
0153   G4double                    fDensityCorr = 0.;
0154   G4double                    fLowestKinEnergy;
0155   // scattering off electrons
0156   G4double                    fNucTerm = 0.;
0157   G4double                    fSumTerm = 0.;
0158 
0159 private:
0160 
0161   // LPM related members
0162   G4double                    fLPMEnergyThreshold;
0163   G4double                    fLPMEnergy;
0164 
0165 protected:
0166 
0167   static const G4double       gBremFactor;
0168   static const G4double       gMigdalConstant;
0169 
0170 private:
0171 
0172   static const G4int          gMaxZet;
0173   //
0174   static const G4double       gLPMconstant;
0175   //
0176   static const G4double       gXGL[8];
0177   static const G4double       gWGL[8];
0178   static const G4double       gFelLowZet[8];
0179   static const G4double       gFinelLowZet[8];
0180   //
0181   struct ElementData {
0182     /** @brief \f$ \ln(Z) \f$  */
0183     G4double  fLogZ;
0184     /** @brief \f$ \ln(Z)/3 + f_c \f$  */
0185     G4double  fFz;
0186     /** @brief \f$ ((Fel-fc)+Finel*invZ)\f$  */
0187     G4double  fZFactor1;
0188     /** @brief \f$ (Fel-fc)\f$  */
0189     G4double  fZFactor11;
0190     /** @brief \f$ (1.0+invZ)/12  \f$  */
0191     G4double  fZFactor2;
0192     // LPM variables
0193     G4double  fVarS1;
0194     G4double  fILVarS1;
0195     G4double  fILVarS1Cond;
0196     // constant factors to the screening function evaluations
0197     G4double  fGammaFactor;
0198     G4double  fEpsilonFactor;
0199   };
0200   static std::vector<ElementData*>  gElementData;
0201 
0202 };
0203 
0204 #endif