Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:58:10

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   // methods for initialisation and run-time evaluation of LPM functions:
0116   void InitLPMFunctions();
0117 
0118   void ComputeLPMfunctions(G4double& funcXiS,
0119                            G4double& funcGS,
0120                            G4double& funcPhiS,
0121                            const G4double egamma);
0122 
0123   void GetLPMFunctions(G4double& lpmGs,
0124                        G4double& lpmPhis,
0125                        const G4double ss);
0126 
0127   void ComputeLPMGsPhis(G4double& funcGS,
0128                         G4double& funcPhiS,
0129                         const G4double varShat);
0130 
0131   // for evaluating screening related functions
0132   void ComputeScreeningFunctions(G4double& phi1,
0133                                  G4double& phi1m2,
0134                                  G4double& psi1,
0135                                  G4double& psi1m2,
0136                                  const G4double gam,
0137                                  const G4double eps);
0138   // hide assignment operator and cctr
0139   G4eBremsstrahlungRelModel& operator=
0140   (const G4eBremsstrahlungRelModel& right) = delete;
0141   G4eBremsstrahlungRelModel(const  G4eBremsstrahlungRelModel&) = delete;
0142 
0143 private:
0144 
0145   G4bool                      fIsUseCompleteScreening = false;
0146   G4bool                      fIsInitializer = false;
0147   G4bool                      fUseLPM = true;
0148 
0149 protected:
0150 
0151   G4bool                      fIsElectron = true;
0152   G4bool                      fIsScatOffElectron = false;
0153   G4bool                      fIsLPMActive = false;
0154   //
0155   G4int                       fCurrentIZ = 0;
0156   const G4ParticleDefinition* fPrimaryParticle = nullptr;
0157   G4ParticleDefinition*       fGammaParticle = nullptr;
0158   G4ParticleChangeForLoss*    fParticleChange = nullptr;
0159   // cash
0160   G4double                    fPrimaryParticleMass = 0.;
0161   G4double                    fPrimaryKinEnergy = 0.;
0162   G4double                    fPrimaryTotalEnergy = 0.;
0163   G4double                    fDensityFactor = 0.;
0164   G4double                    fDensityCorr = 0.;
0165   G4double                    fLowestKinEnergy;
0166   // scattering off electrons
0167   G4double                    fNucTerm = 0.;
0168   G4double                    fSumTerm = 0.;
0169 
0170 private:
0171 
0172   // LPM related members
0173   G4double                    fLPMEnergyThreshold;
0174   G4double                    fLPMEnergy;
0175 
0176 protected:
0177 
0178   static const G4double       gBremFactor;
0179   static const G4double       gMigdalConstant;
0180 
0181 private:
0182 
0183   static const G4int          gMaxZet;
0184   //
0185   static const G4double       gLPMconstant;
0186   //
0187   static const G4double       gXGL[8];
0188   static const G4double       gWGL[8];
0189   static const G4double       gFelLowZet[8];
0190   static const G4double       gFinelLowZet[8];
0191   //
0192   struct ElementData {
0193     /** @brief \f$ \ln(Z) \f$  */
0194     G4double  fLogZ;
0195     /** @brief \f$ \ln(Z)/3 + f_c \f$  */
0196     G4double  fFz;
0197     /** @brief \f$ ((Fel-fc)+Finel*invZ)\f$  */
0198     G4double  fZFactor1;
0199     /** @brief \f$ (Fel-fc)\f$  */
0200     G4double  fZFactor11;
0201     /** @brief \f$ (1.0+invZ)/12  \f$  */
0202     G4double  fZFactor2;
0203     // LPM variables
0204     G4double  fVarS1;
0205     G4double  fILVarS1;
0206     G4double  fILVarS1Cond;
0207     // constant factors to the screening function evaluations
0208     G4double  fGammaFactor;
0209     G4double  fEpsilonFactor;
0210   };
0211   //
0212   struct LPMFuncs {
0213     LPMFuncs() : fIsInitialized(false), fISDelta(100.), fSLimit(2.) {}
0214     G4bool                 fIsInitialized;
0215     G4double               fISDelta;
0216     G4double               fSLimit;
0217     std::vector<G4double>  fLPMFuncG;
0218     std::vector<G4double>  fLPMFuncPhi;
0219   };
0220   //
0221   static LPMFuncs                   gLPMFuncs;
0222   static std::vector<ElementData*>  gElementData;
0223 
0224 };
0225 
0226 #endif