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
00030
00031
00032
00033
00034 #ifndef G4DNASancheExcitationModel_h
00035 #define G4DNASancheExcitationModel_h 1
00036
00037 #include <deque>
00038 #include <CLHEP/Units/SystemOfUnits.h>
00039
00040 #include "G4VEmModel.hh"
00041 #include "G4ParticleChangeForGamma.hh"
00042 #include "G4Electron.hh"
00043 #include "G4NistManager.hh"
00044
00045 class G4DNASancheExcitationModel : public G4VEmModel
00046 {
00047
00048 public:
00049
00050 G4DNASancheExcitationModel(const G4ParticleDefinition* p = 0,
00051 const G4String& nam = "DNASancheExcitationModel");
00052
00053 virtual ~G4DNASancheExcitationModel();
00054
00055 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
00056
00057 virtual G4double CrossSectionPerVolume(const G4Material* material,
00058 const G4ParticleDefinition* p,
00059 G4double ekin,
00060 G4double emin,
00061 G4double emax);
00062
00063 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
00064 const G4MaterialCutsCouple*,
00065 const G4DynamicParticle*,
00066 G4double tmin,
00067 G4double maxEnergy);
00068
00069
00070
00071 G4double PartialCrossSection(G4double energy,G4int level);
00072
00073 inline void ExtendLowEnergyLimit (G4double );
00074
00075 inline void SetVerboseLevel(int verbose){verboseLevel = verbose;}
00076
00077 protected:
00078
00079 G4ParticleChangeForGamma* fParticleChangeForGamma;
00080
00081 private:
00082
00083 const std::vector<G4double>* fpWaterDensity;
00084
00085 G4double lowEnergyLimit;
00086 G4double highEnergyLimit;
00087 G4bool isInitialised;
00088 G4int verboseLevel;
00089
00090
00091
00092 G4int RandomSelect(G4double energy);
00093 G4int nLevels;
00094 G4double VibrationEnergy(G4int level);
00095 G4double Sum(G4double k);
00096 G4double LinInterpolate(G4double e1,
00097 G4double e2,
00098 G4double e,
00099 G4double xs1,
00100 G4double xs2);
00101
00102
00103 typedef std::map<double, std::map<double, double> > TriDimensionMap;
00104 TriDimensionMap map1;
00105 std::vector<double> tdummyVec;
00106
00107
00108 G4DNASancheExcitationModel & operator=(const G4DNASancheExcitationModel &right);
00109 G4DNASancheExcitationModel(const G4DNASancheExcitationModel&);
00110
00111 };
00112
00113 inline void G4DNASancheExcitationModel::ExtendLowEnergyLimit (G4double threshold)
00114 {
00115 lowEnergyLimit = threshold;
00116 if (lowEnergyLimit < 2*CLHEP::eV)
00117 G4Exception ("*** WARNING : the G4DNASancheExcitationModel class is not validated below 2 eV !","",JustWarning,"") ;
00118 }
00119
00120
00121
00122 #endif