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 G4DNABornIonisationModel_h
00030 #define G4DNABornIonisationModel_h 1
00031
00032 #include "G4VEmModel.hh"
00033 #include "G4ParticleChangeForGamma.hh"
00034 #include "G4ProductionCutsTable.hh"
00035
00036 #include "G4DNACrossSectionDataSet.hh"
00037 #include "G4Electron.hh"
00038 #include "G4Proton.hh"
00039 #include "G4DNAGenericIonsManager.hh"
00040
00041 #include "G4LogLogInterpolation.hh"
00042
00043 #include "G4DNAWaterIonisationStructure.hh"
00044 #include "G4VAtomDeexcitation.hh"
00045 #include "G4NistManager.hh"
00046
00047
00048 class G4DNABornIonisationModel : public G4VEmModel
00049 {
00050
00051 public:
00052
00053 G4DNABornIonisationModel(const G4ParticleDefinition* p = 0,
00054 const G4String& nam = "DNABornIonisationModel");
00055
00056 virtual ~G4DNABornIonisationModel();
00057
00058 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector& = *(new G4DataVector()));
00059
00060 virtual G4double CrossSectionPerVolume( const G4Material* material,
00061 const G4ParticleDefinition* p,
00062 G4double ekin,
00063 G4double emin,
00064 G4double emax);
00065
00066 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
00067 const G4MaterialCutsCouple*,
00068 const G4DynamicParticle*,
00069 G4double tmin,
00070 G4double maxEnergy);
00071
00072 double DifferentialCrossSection(G4ParticleDefinition * aParticleDefinition, G4double k, G4double energyTransfer, G4int shell);
00073
00074 protected:
00075
00076 G4ParticleChangeForGamma* fParticleChangeForGamma;
00077
00078 private:
00079
00080
00081 const std::vector<G4double>* fpMolWaterDensity;
00082
00083
00084 G4VAtomDeexcitation* fAtomDeexcitation;
00085
00086 std::map<G4String,G4double,std::less<G4String> > lowEnergyLimit;
00087 std::map<G4String,G4double,std::less<G4String> > highEnergyLimit;
00088
00089 G4bool isInitialised;
00090 G4int verboseLevel;
00091
00092
00093
00094 typedef std::map<G4String,G4String,std::less<G4String> > MapFile;
00095 MapFile tableFile;
00096
00097 typedef std::map<G4String,G4DNACrossSectionDataSet*,std::less<G4String> > MapData;
00098 MapData tableData;
00099
00100
00101
00102 G4DNAWaterIonisationStructure waterStructure;
00103
00104 G4double RandomizeEjectedElectronEnergy(G4ParticleDefinition * aParticleDefinition, G4double incomingParticleEnergy, G4int shell) ;
00105
00106 void RandomizeEjectedElectronDirection(G4ParticleDefinition * aParticleDefinition, G4double incomingParticleEnergy, G4double
00107 outgoingParticleEnergy, G4double & cosTheta, G4double & phi );
00108
00109 G4double LogLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2);
00110
00111 G4double QuadInterpolator( G4double e11,
00112 G4double e12,
00113 G4double e21,
00114 G4double e22,
00115 G4double x11,
00116 G4double x12,
00117 G4double x21,
00118 G4double x22,
00119 G4double t1,
00120 G4double t2,
00121 G4double t,
00122 G4double e);
00123
00124 typedef std::map<double, std::map<double, double> > TriDimensionMap;
00125 TriDimensionMap eDiffCrossSectionData[6];
00126 TriDimensionMap pDiffCrossSectionData[6];
00127 std::vector<double> eTdummyVec;
00128 std::vector<double> pTdummyVec;
00129
00130 typedef std::map<double, std::vector<double> > VecMap;
00131 VecMap eVecm;
00132 VecMap pVecm;
00133
00134
00135
00136 G4int RandomSelect(G4double energy,const G4String& particle );
00137
00138
00139
00140 G4DNABornIonisationModel & operator=(const G4DNABornIonisationModel &right);
00141 G4DNABornIonisationModel(const G4DNABornIonisationModel&);
00142
00143 };
00144
00145
00146
00147 #endif