Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PAIxSection.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4PAIxSection.hh -- header file
27//
28// GEANT 4 class header file --- Copyright CERN 1995
29// CERB Geneva Switzerland
30//
31// for information related to this code, please, contact
32// CERN, CN Division, ASD Group
33//
34// Preparation of ionizing collision cross section according to Photo Absorption
35// Ionization (PAI) model for simulation of ionization energy losses in very thin
36// absorbers. Author: [email protected]
37//
38// History:
39//
40// 28.10.11, V. Ivanchenko: Migration of exceptions to the new design
41// 19.10.03, V. Grichine: Integral dEdx was added for G4PAIModel class
42// 13.05.03, V. Grichine: Numerical instability was fixed in SumOverInterval/Border
43// functions
44// 10.02.02, V. Grichine: New functions and arrays/gets for Cerenkov and
45// plasmon collisions dN/dx
46// 27.10.99, V. Grichine: Bug fixed in constructors, 3rd constructor and
47// GetStepEnergyLoss(step) were added, fDelta = 0.005
48// 30.11.97, V. Grichine: 2nd version
49// 11.06.97, V. Grichine: 1st version
50
51#ifndef G4PAIXSECTION_HH
52#define G4PAIXSECTION_HH
53
54#include "G4ios.hh"
55#include "globals.hh"
56#include "Randomize.hh"
57
58#include "G4SandiaTable.hh"
59
61class G4Sandiatable;
62
63
65{
66public:
67 // Constructors
70
71 G4PAIxSection( G4int materialIndex, G4double maxEnergyTransfer );
72
73 G4PAIxSection( G4int materialIndex, // for proton loss table
74 G4double maxEnergyTransfer,
75 G4double betaGammaSq ,
76 G4double** photoAbsCof, G4int intNumber );
77
78 G4PAIxSection( G4int materialIndex, // test constructor
79 G4double maxEnergyTransfer,
80 G4double betaGammaSq );
81
83
84 void Initialize(const G4Material* material, G4double maxEnergyTransfer,
85 G4double betaGammaSq, G4SandiaTable*);
86
87 // General control functions
88
89 void ComputeLowEnergyCof(const G4Material* material);
91
92 void InitPAI();
93
94 void NormShift( G4double betaGammaSq );
95
96 void SplainPAI( G4double betaGammaSq );
97
98 // Physical methods
99
100 G4double RutherfordIntegral( G4int intervalNumber,
101 G4double limitLow,
102 G4double limitHigh );
103
104 G4double ImPartDielectricConst( G4int intervalNumber,
105 G4double energy );
106
109
111
112 G4double DifPAIxSection( G4int intervalNumber,
113 G4double betaGammaSq );
114
115 G4double PAIdNdxCerenkov( G4int intervalNumber,
116 G4double betaGammaSq );
117 G4double PAIdNdxMM( G4int intervalNumber,
118 G4double betaGammaSq );
119
120 G4double PAIdNdxPlasmon( G4int intervalNumber,
121 G4double betaGammaSq );
122
123 G4double PAIdNdxResonance( G4int intervalNumber,
124 G4double betaGammaSq );
125
126
127 void IntegralPAIxSection();
128 void IntegralCerenkov();
129 void IntegralMM();
130 void IntegralPlasmon();
131 void IntegralResonance();
132
133 G4double SumOverInterval(G4int intervalNumber);
134 G4double SumOverIntervaldEdx(G4int intervalNumber);
135 G4double SumOverInterCerenkov(G4int intervalNumber);
136 G4double SumOverInterMM(G4int intervalNumber);
137 G4double SumOverInterPlasmon(G4int intervalNumber);
138 G4double SumOverInterResonance(G4int intervalNumber);
139
140 G4double SumOverBorder( G4int intervalNumber,
141 G4double energy );
142 G4double SumOverBorderdEdx( G4int intervalNumber,
143 G4double energy );
144 G4double SumOverBordCerenkov( G4int intervalNumber,
145 G4double energy );
146 G4double SumOverBordMM( G4int intervalNumber,
147 G4double energy );
148 G4double SumOverBordPlasmon( G4int intervalNumber,
149 G4double energy );
150 G4double SumOverBordResonance( G4int intervalNumber,
151 G4double energy );
152
158
165
166 // Inline access functions
167
168 G4int GetNumberOfGammas() const { return fNumberOfGammas; }
169
170 G4int GetSplineSize() const { return fSplineNumber; }
171
172 G4int GetIntervalNumber() const { return fIntervalNumber; }
173
174 G4double GetEnergyInterval(G4int i){ return fEnergyInterval[i]; }
175
176 G4double GetDifPAIxSection(G4int i){ return fDifPAIxSection[i]; }
177 G4double GetPAIdNdxCerenkov(G4int i){ return fdNdxCerenkov[i]; }
178 G4double GetPAIdNdxMM(G4int i){ return fdNdxMM[i]; }
179 G4double GetPAIdNdxPlasmon(G4int i){ return fdNdxPlasmon[i]; }
180 G4double GetPAIdNdxResonance(G4int i){ return fdNdxResonance[i]; }
181
182 G4double GetMeanEnergyLoss() const {return fIntegralPAIxSection[0]; }
183 G4double GetMeanCerenkovLoss() const {return fIntegralCerenkov[0]; }
184 G4double GetMeanMMLoss() const {return fIntegralMM[0]; }
185 G4double GetMeanPlasmonLoss() const {return fIntegralPlasmon[0]; }
186 G4double GetMeanResonanceLoss() const {return fIntegralResonance[0]; }
187
188 G4double GetNormalizationCof() const { return fNormalizationCof; }
189
190 G4double GetLowEnergyCof() const { return fLowEnergyCof; }
191
193
194 inline void SetVerbose(G4int v) { fVerbose=v; };
195
196
197 inline G4double GetPAItable(G4int i,G4int j) const;
198
199 inline G4double GetSplineEnergy(G4int i) const;
200
201 inline G4double GetIntegralPAIxSection(G4int i) const;
202 inline G4double GetIntegralPAIdEdx(G4int i) const;
203 inline G4double GetIntegralCerenkov(G4int i) const;
204 inline G4double GetIntegralMM(G4int i) const;
205 inline G4double GetIntegralPlasmon(G4int i) const;
206 inline G4double GetIntegralResonance(G4int i) const;
207
208 G4PAIxSection & operator=(const G4PAIxSection &right) = delete;
209 G4PAIxSection(const G4PAIxSection&) = delete;
210
211private :
212
213 void CallError(G4int i, const G4String& methodName) const;
214
215 // Local class constants
216
217 static const G4double fDelta; // energy shift from interval border = 0.001
218 static const G4double fError; // error in lin-log approximation = 0.005
219
220 static G4int fNumberOfGammas; // = 111;
221 static const G4double fLorentzFactor[112]; // static gamma array
222
223 static
224 const G4int fRefGammaNumber; // The number of gamma for creation of spline (15)
225
226 G4int fIntervalNumber ; // The number of energy intervals
227 G4double fNormalizationCof; // Normalization cof for PhotoAbsorptionXsection
228
229 G4int fMaterialIndex; // current material index
230 G4double fDensity; // Current density
231 G4double fElectronDensity; // Current electron (number) density
232 G4double fLowEnergyCof; // Correction cof for low energy region
233 G4int fSplineNumber; // Current size of spline
234 G4int fVerbose; // verbose flag
235
236 // Arrays of Sandia coefficients
237
238 G4OrderedTable* fMatSandiaMatrix;
239
240 G4SandiaTable* fSandia;
241
242 G4DataVector fEnergyInterval;
243 G4DataVector fA1;
244 G4DataVector fA2;
245 G4DataVector fA3;
246 G4DataVector fA4;
247
248 static
249 const G4int fMaxSplineSize ; // Max size of output splain arrays = 500
250
251 G4DataVector fSplineEnergy; // energy points of splain
252 G4DataVector fRePartDielectricConst; // Real part of dielectric const
253 G4DataVector fImPartDielectricConst; // Imaginary part of dielectric const
254 G4DataVector fIntegralTerm; // Integral term in PAI cross section
255 G4DataVector fDifPAIxSection; // Differential PAI cross section
256 G4DataVector fdNdxCerenkov; // dNdx of Cerenkov collisions
257 G4DataVector fdNdxPlasmon; // dNdx of Plasmon collisions
258 G4DataVector fdNdxMM; // dNdx of MM-Cerenkov collisions
259 G4DataVector fdNdxResonance; // dNdx of Resonance collisions
260
261 G4DataVector fIntegralPAIxSection; // Integral PAI cross section ?
262 G4DataVector fIntegralPAIdEdx; // Integral PAI dEdx ?
263 G4DataVector fIntegralCerenkov; // Integral Cerenkov N>omega ?
264 G4DataVector fIntegralPlasmon; // Integral Plasmon N>omega ?
265 G4DataVector fIntegralMM; // Integral MM N>omega ?
266 G4DataVector fIntegralResonance; // Integral resonance N>omega ?
267
268 G4double fPAItable[500][112]; // Output array
269
270};
271
272//////////////// Inline methods //////////////////////////////////
273//
274
276{
277 return fPAItable[i][j];
278}
279
281{
282 if(i < 1 || i > fSplineNumber) { CallError(i, "GetSplineEnergy"); }
283 return fSplineEnergy[i];
284}
285
287{
288 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPAIxSection"); }
289 return fIntegralPAIxSection[i];
290}
291
293{
294 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPAIdEdx"); }
295 return fIntegralPAIdEdx[i];
296}
297
299{
300 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralCerenkov"); }
301 return fIntegralCerenkov[i];
302}
303
305{
306 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralMM"); }
307 return fIntegralMM[i];
308}
309
311{
312 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralPlasmon"); }
313 return fIntegralPlasmon[i];
314}
315
317{
318 if(i < 1 || i > fSplineNumber) { CallError(i, "GetIntegralResonance"); }
319 return fIntegralResonance[i];
320}
321
322#endif
323
324// ----------------- end of G4PAIxSection header file -------------------
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
G4double GetIntegralCerenkov(G4int i) const
G4int GetSplineSize() const
G4double RutherfordIntegral(G4int intervalNumber, G4double limitLow, G4double limitHigh)
G4double ImPartDielectricConst(G4int intervalNumber, G4double energy)
G4double GetPlasmonEnergyTransfer()
G4double SumOverIntervaldEdx(G4int intervalNumber)
G4double SumOverInterCerenkov(G4int intervalNumber)
G4double GetStepMMLoss(G4double step)
G4double GetIntegralPAIdEdx(G4int i) const
G4double GetDifPAIxSection(G4int i)
G4double GetMeanResonanceLoss() const
G4double SumOverBordCerenkov(G4int intervalNumber, G4double energy)
G4double GetStepPlasmonLoss(G4double step)
G4double GetRutherfordEnergyTransfer()
G4int GetNumberOfGammas() const
G4double SumOverBordResonance(G4int intervalNumber, G4double energy)
G4double GetPAIdNdxPlasmon(G4int i)
void ComputeLowEnergyCof()
G4double SumOverInterMM(G4int intervalNumber)
G4double GetEnergyInterval(G4int i)
G4double RePartDielectricConst(G4double energy)
G4double GetElectronRange(G4double energy)
G4double GetIntegralPlasmon(G4int i) const
G4double GetPAItable(G4int i, G4int j) const
G4double SumOverInterPlasmon(G4int intervalNumber)
G4double GetMMEnergyTransfer()
G4double PAIdNdxMM(G4int intervalNumber, G4double betaGammaSq)
G4double GetPAIdNdxCerenkov(G4int i)
G4double SumOverBorderdEdx(G4int intervalNumber, G4double energy)
G4double SumOverBordMM(G4int intervalNumber, G4double energy)
G4double GetLowEnergyCof() const
G4double DifPAIxSection(G4int intervalNumber, G4double betaGammaSq)
void SetVerbose(G4int v)
G4double GetPAIdNdxMM(G4int i)
G4double GetMeanPlasmonLoss() const
G4double GetPAIdNdxResonance(G4int i)
G4double PAIdNdxCerenkov(G4int intervalNumber, G4double betaGammaSq)
G4double GetStepResonanceLoss(G4double step)
G4double GetResonanceEnergyTransfer()
G4double PAIdNdxResonance(G4int intervalNumber, G4double betaGammaSq)
G4PAIxSection & operator=(const G4PAIxSection &right)=delete
void SplainPAI(G4double betaGammaSq)
G4double GetEnergyTransfer()
G4double GetCerenkovEnergyTransfer()
G4double GetMeanCerenkovLoss() const
G4double GetSplineEnergy(G4int i) const
G4double GetIntegralMM(G4int i) const
void NormShift(G4double betaGammaSq)
G4PAIxSection(const G4PAIxSection &)=delete
G4int GetIntervalNumber() const
G4double PAIdNdxPlasmon(G4int intervalNumber, G4double betaGammaSq)
G4double GetPhotonRange(G4double energy)
void IntegralPAIxSection()
G4double GetNormalizationCof() const
G4double SumOverInterval(G4int intervalNumber)
G4double SumOverBorder(G4int intervalNumber, G4double energy)
G4double GetStepCerenkovLoss(G4double step)
G4double GetIntegralPAIxSection(G4int i) const
G4double GetIntegralResonance(G4int i) const
G4double GetMeanEnergyLoss() const
G4double GetStepEnergyLoss(G4double step)
G4double GetMeanMMLoss() const
G4double SumOverInterResonance(G4int intervalNumber)
G4double SumOverBordPlasmon(G4int intervalNumber, G4double energy)
G4double GetLorentzFactor(G4int i) const
void Initialize(const G4Material *material, G4double maxEnergyTransfer, G4double betaGammaSq, G4SandiaTable *)