00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef G4DNAScreenedRutherfordElasticModel_h
00030 #define G4DNAScreenedRutherfordElasticModel_h 1
00031
00032 #include <CLHEP/Units/SystemOfUnits.h>
00033
00034 #include "G4VEmModel.hh"
00035 #include "G4ParticleChangeForGamma.hh"
00036 #include "G4ProductionCutsTable.hh"
00037 #include "G4NistManager.hh"
00038
00039 class G4DNAScreenedRutherfordElasticModel : public G4VEmModel
00040 {
00041
00042 public:
00043
00044 G4DNAScreenedRutherfordElasticModel(const G4ParticleDefinition* p = 0,
00045 const G4String& nam = "DNAScreenedRutherfordElasticModel");
00046
00047 virtual ~G4DNAScreenedRutherfordElasticModel();
00048
00049 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
00050
00051 virtual G4double CrossSectionPerVolume(const G4Material* material,
00052 const G4ParticleDefinition* p,
00053 G4double ekin,
00054 G4double emin,
00055 G4double emax);
00056
00057 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
00058 const G4MaterialCutsCouple*,
00059 const G4DynamicParticle*,
00060 G4double tmin,
00061 G4double maxEnergy);
00062
00063 inline void SetKillBelowThreshold (G4double threshold);
00064 G4double GetKillBelowThreshold () { return killBelowEnergy; }
00065
00066 protected:
00067
00068 G4ParticleChangeForGamma* fParticleChangeForGamma;
00069
00070 private:
00071
00072 const std::vector<G4double>* fpWaterDensity;
00073
00074 G4double killBelowEnergy;
00075 G4double lowEnergyLimit;
00076 G4double intermediateEnergyLimit;
00077 G4double highEnergyLimit;
00078 G4bool isInitialised;
00079 G4int verboseLevel;
00080
00081
00082
00083 G4double RutherfordCrossSection(G4double energy, G4double z);
00084
00085 G4double ScreeningFactor(G4double energy, G4double z);
00086
00087
00088
00089 G4double BrennerZaiderRandomizeCosTheta(G4double k);
00090 G4double CalculatePolynomial(G4double k, std::vector<G4double>& vec);
00091 std::vector<G4double> betaCoeff;
00092 std::vector<G4double> deltaCoeff;
00093 std::vector<G4double> gamma035_10Coeff;
00094 std::vector<G4double> gamma10_100Coeff;
00095 std::vector<G4double> gamma100_200Coeff;
00096
00097
00098
00099 G4double ScreenedRutherfordRandomizeCosTheta(G4double k, G4double z);
00100
00101
00102
00103 G4DNAScreenedRutherfordElasticModel & operator=(const G4DNAScreenedRutherfordElasticModel &right);
00104 G4DNAScreenedRutherfordElasticModel(const G4DNAScreenedRutherfordElasticModel&);
00105
00106 };
00107
00108 inline void G4DNAScreenedRutherfordElasticModel::SetKillBelowThreshold (G4double threshold)
00109 {
00110 killBelowEnergy = threshold;
00111 if (threshold < 9*CLHEP::eV)
00112 G4Exception ("*** WARNING : the G4DNAScreenedRutherfordElasticModel class is not validated below 9 eV !","",JustWarning,"") ;
00113 }
00114
00115
00116
00117 #endif