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
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef G4PAIYSECTION_HH
00044 #define G4PAIYSECTION_HH
00045
00046 #include "G4ios.hh"
00047 #include "globals.hh"
00048 #include "Randomize.hh"
00049
00050 #include "G4SandiaTable.hh"
00051
00052 class G4PAIySection
00053 {
00054 public:
00055
00056 G4PAIySection();
00057
00058 ~G4PAIySection();
00059
00060 void Initialize(const G4Material* material,
00061 G4double maxEnergyTransfer,
00062 G4double betaGammaSq);
00063
00064 void ComputeLowEnergyCof(const G4Material* material);
00065
00066 void InitPAI();
00067
00068 void NormShift( G4double betaGammaSq );
00069
00070 void SplainPAI( G4double betaGammaSq );
00071
00072
00073 G4double RutherfordIntegral( G4int intervalNumber,
00074 G4double limitLow,
00075 G4double limitHigh );
00076
00077 G4double ImPartDielectricConst( G4int intervalNumber,
00078 G4double energy );
00079
00080 G4double RePartDielectricConst(G4double energy);
00081
00082 G4double DifPAIySection( G4int intervalNumber,
00083 G4double betaGammaSq );
00084
00085 G4double PAIdNdxCerenkov( G4int intervalNumber,
00086 G4double betaGammaSq );
00087
00088 G4double PAIdNdxPlasmon( G4int intervalNumber,
00089 G4double betaGammaSq );
00090
00091 void IntegralPAIySection();
00092 void IntegralCerenkov();
00093 void IntegralPlasmon();
00094
00095 G4double SumOverInterval(G4int intervalNumber);
00096 G4double SumOverIntervaldEdx(G4int intervalNumber);
00097 G4double SumOverInterCerenkov(G4int intervalNumber);
00098 G4double SumOverInterPlasmon(G4int intervalNumber);
00099
00100 G4double SumOverBorder( G4int intervalNumber,
00101 G4double energy );
00102 G4double SumOverBorderdEdx( G4int intervalNumber,
00103 G4double energy );
00104 G4double SumOverBordCerenkov( G4int intervalNumber,
00105 G4double energy );
00106 G4double SumOverBordPlasmon( G4int intervalNumber,
00107 G4double energy );
00108
00109 G4double GetStepEnergyLoss( G4double step );
00110 G4double GetStepCerenkovLoss( G4double step );
00111 G4double GetStepPlasmonLoss( G4double step );
00112
00113
00114
00115 inline G4int GetNumberOfGammas() const { return fNumberOfGammas; }
00116
00117 inline G4int GetSplineSize() const { return fSplineNumber; }
00118
00119 inline G4int GetIntervalNumber() const { return fIntervalNumber; }
00120
00121 inline G4double GetEnergyInterval(G4int i){ return fEnergyInterval[i]; }
00122
00123 inline G4double GetDifPAIySection(G4int i){ return fDifPAIySection[i]; }
00124 inline G4double GetPAIdNdxCrenkov(G4int i){ return fdNdxCerenkov[i]; }
00125 inline G4double GetPAIdNdxPlasmon(G4int i){ return fdNdxPlasmon[i]; }
00126
00127 inline G4double GetMeanEnergyLoss() const {return fIntegralPAIySection[0]; }
00128 inline G4double GetMeanCerenkovLoss() const {return fIntegralCerenkov[0]; }
00129 inline G4double GetMeanPlasmonLoss() const {return fIntegralPlasmon[0]; }
00130
00131 inline G4double GetNormalizationCof() const { return fNormalizationCof; }
00132
00133 inline G4double GetPAItable(G4int i,G4int j) const;
00134
00135 inline G4double GetLorentzFactor(G4int i) const;
00136
00137 inline G4double GetSplineEnergy(G4int i) const;
00138
00139 inline G4double GetIntegralPAIySection(G4int i) const;
00140 inline G4double GetIntegralPAIdEdx(G4int i) const;
00141 inline G4double GetIntegralCerenkov(G4int i) const;
00142 inline G4double GetIntegralPlasmon(G4int i) const;
00143
00144 inline void SetVerbose(G4int v) { fVerbose = v; };
00145
00146 private :
00147
00148 void CallError(G4int i, const G4String& methodName) const;
00149
00150
00151
00152 static const G4double fDelta;
00153 static const G4double fError;
00154
00155 static G4int fNumberOfGammas;
00156 static const G4double fLorentzFactor[112];
00157
00158 static
00159 const G4int fRefGammaNumber ;
00160
00161 G4int fIntervalNumber ;
00162 G4double fNormalizationCof;
00163
00164 G4double fDensity;
00165 G4double fElectronDensity;
00166 G4double fLowEnergyCof;
00167 G4int fSplineNumber;
00168 G4int fVerbose;
00169
00170 G4SandiaTable* fSandia;
00171
00172 G4double fEnergyInterval[500];
00173 G4double fA1[500];
00174 G4double fA2[500];
00175 G4double fA3[500];
00176 G4double fA4[500];
00177
00178 static
00179 const G4int fMaxSplineSize ;
00180
00181 G4double fSplineEnergy[500];
00182 G4double fRePartDielectricConst[500];
00183 G4double fImPartDielectricConst[500];
00184 G4double fIntegralTerm[500];
00185 G4double fDifPAIySection[500];
00186 G4double fdNdxCerenkov[500];
00187 G4double fdNdxPlasmon[500];
00188
00189 G4double fIntegralPAIySection[500];
00190 G4double fIntegralPAIdEdx[500];
00191 G4double fIntegralCerenkov[500];
00192 G4double fIntegralPlasmon[500];
00193
00194 G4double fPAItable[500][112];
00195
00196 };
00197
00199
00200
00201
00202 inline G4double G4PAIySection::GetPAItable(G4int i, G4int j) const
00203 {
00204 return fPAItable[i][j];
00205 }
00206
00207 inline G4double G4PAIySection::GetLorentzFactor(G4int j) const
00208 {
00209 return fLorentzFactor[j];
00210 }
00211
00212 inline G4double G4PAIySection::GetSplineEnergy(G4int i) const
00213 {
00214 if(i < 1 || i > fSplineNumber) { CallError(i, "GetSplineEnergy"); }
00215 return fSplineEnergy[i];
00216 }
00217
00218 inline G4double G4PAIySection::GetIntegralPAIySection(G4int i) const
00219 {
00220 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPAIySection"); }
00221 return fIntegralPAIySection[i];
00222 }
00223
00224 inline G4double G4PAIySection::GetIntegralPAIdEdx(G4int i) const
00225 {
00226 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPAIdEdx"); }
00227 return fIntegralPAIdEdx[i];
00228 }
00229
00230 inline G4double G4PAIySection::GetIntegralCerenkov(G4int i) const
00231 {
00232 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralCerenkov"); }
00233 return fIntegralCerenkov[i];
00234 }
00235
00236 inline G4double G4PAIySection::GetIntegralPlasmon(G4int i) const
00237 {
00238 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPlasmon"); }
00239 return fIntegralPlasmon[i];
00240 }
00241
00242 #endif
00243
00244