Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4EnergyLossForExtrapolator.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// $Id$
27//
28//---------------------------------------------------------------------------
29//
30// ClassName: G4EnergyLossForExtrapolator
31//
32// Description: This class provide calculation of energy loss, fluctuation,
33// and msc angle
34//
35// Author: 09.12.04 V.Ivanchenko
36//
37// Modification:
38// 08-04-05 Rename Propogator -> Extrapolator
39// 16-03-06 Add muon tables
40// 21-03-06 Add verbosity defined in the constructor and Initialisation
41// start only when first public method is called (V.Ivanchenko)
42// 03-05-06 Remove unused pointer G4Material* from number of methods (VI)
43// 28-07-07 Add maxEnergyTransfer for computation of energy loss (VI)
44//
45//----------------------------------------------------------------------------
46//
47
48//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
49
50#ifndef G4EnergyLossForExtrapolator_h
51#define G4EnergyLossForExtrapolator_h 1
52
53#include <vector>
55
56#include "globals.hh"
57#include "G4PhysicsTable.hh"
58
60class G4Material;
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
65
67{
68public:
70
72
74
76
78
80 const G4Material*, const G4ParticleDefinition*);
81
83 const G4Material*, const G4ParticleDefinition*);
84
86 const G4Material*, const G4ParticleDefinition* part);
87
88 inline G4double EnergyAfterStep(G4double kinEnergy, G4double step,
89 const G4Material*, const G4String& particleName);
90
91 inline G4double EnergyBeforeStep(G4double kinEnergy, G4double step,
92 const G4Material*, const G4String& particleName);
93
94 inline G4double AverageScatteringAngle(G4double kinEnergy, G4double step,
95 const G4Material*,
96 const G4ParticleDefinition* part);
97
98 inline G4double AverageScatteringAngle(G4double kinEnergy, G4double step,
99 const G4Material*,
100 const G4String& particleName);
101
102 inline G4double ComputeTrueStep(const G4Material*, const G4ParticleDefinition* part,
103 G4double kinEnergy, G4double stepLength);
104
105 inline G4double EnergyDispersion(G4double kinEnergy, G4double step,
106 const G4Material*, const G4ParticleDefinition*);
107
108 inline G4double EnergyDispersion(G4double kinEnergy, G4double step,
109 const G4Material*, const G4String& particleName);
110
111 inline void SetVerbose(G4int val);
112
113 inline void SetMinKinEnergy(G4double);
114
115 inline void SetMaxKinEnergy(G4double);
116
117 inline void SetMaxEnergyTransfer(G4double);
118
119private:
120
121 void Initialisation();
122
123 G4bool SetupKinematics(const G4ParticleDefinition*, const G4Material*,
124 G4double kinEnergy);
125
126 G4PhysicsTable* PrepareTable();
127
128 const G4ParticleDefinition* FindParticle(const G4String& name);
129
130 void ComputeElectronDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table);
131
132 void ComputeMuonDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table);
133
134 void ComputeProtonDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table);
135
136 void ComputeTrasportXS(const G4ParticleDefinition* part, G4PhysicsTable* table);
137
138 inline G4double ComputeValue(G4double x, const G4PhysicsTable* table);
139
140 // hide assignment operator
143
144 const G4ParticleDefinition* currentParticle;
145 const G4ParticleDefinition* electron;
146 const G4ParticleDefinition* positron;
147 const G4ParticleDefinition* muonPlus;
148 const G4ParticleDefinition* muonMinus;
149 const G4ParticleDefinition* proton;
150
151 G4ProductionCuts* cuts;
152 std::vector<const G4MaterialCutsCouple*> couples;
153
154 G4String currentParticleName;
155
156 G4PhysicsTable* dedxElectron;
157 G4PhysicsTable* dedxPositron;
158 G4PhysicsTable* dedxMuon;
159 G4PhysicsTable* dedxProton;
160 G4PhysicsTable* rangeElectron;
161 G4PhysicsTable* rangePositron;
162 G4PhysicsTable* rangeMuon;
163 G4PhysicsTable* rangeProton;
164 G4PhysicsTable* invRangeElectron;
165 G4PhysicsTable* invRangePositron;
166 G4PhysicsTable* invRangeMuon;
167 G4PhysicsTable* invRangeProton;
168 G4PhysicsTable* mscElectron;
169
170 const G4Material* currentMaterial;
171 G4int index;
172 G4double electronDensity;
173 G4double radLength;
174 G4double mass;
175 G4double charge2;
176 G4double kineticEnergy;
177 G4double gam;
178 G4double bg2;
179 G4double beta2;
180 G4double tmax;
181
182 G4double linLossLimit;
183 G4double emin;
184 G4double emax;
185 G4double maxEnergyTransfer;
186
187 G4int nbins;
188 G4int nmat;
189 G4int verbose;
190 G4bool isInitialised;
191};
192
193//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
194
196 G4double step,
197 const G4Material* mat,
198 const G4String& name)
199{
200 return EnergyAfterStep(kinEnergy,step,mat,FindParticle(name));
201}
202
203//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
204
206 G4double step,
207 const G4Material* mat,
208 const G4String& name)
209{
210 return EnergyBeforeStep(kinEnergy,step,mat,FindParticle(name));
211}
212
213//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
214
216 G4double step,
217 const G4Material* mat,
218 const G4String& name)
219{
220 return AverageScatteringAngle(kinEnergy,step,mat,FindParticle(name));
221}
222
223//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
224
225inline G4double
227 G4double step,
228 const G4Material* mat,
229 const G4String& name)
230{
231 return EnergyDispersion(kinEnergy,step,mat,FindParticle(name));
232}
233
234//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
235
236inline G4double
238 G4double stepLength,
239 const G4Material* mat,
240 const G4ParticleDefinition* part)
241{
242 G4double theta = 0.0;
243 if(SetupKinematics(part, mat, kinEnergy)) {
244 G4double t = stepLength/radLength;
245 G4double y = std::max(0.001, t);
246 theta = 19.23*CLHEP::MeV*std::sqrt(charge2*t)*(1.0 + 0.038*std::log(y))/(beta2*gam*mass);
247 }
248 return theta;
249}
250
251//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
252
253inline G4double
255 const G4ParticleDefinition* part,
256 G4double kinEnergy,
257 G4double stepLength)
258{
259 G4double theta = AverageScatteringAngle(kinEnergy,stepLength,mat,part);
260 return stepLength*std::sqrt(1.0 + 0.625*theta*theta);
261}
262
263//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
264
265inline
267 G4double stepLength,
268 const G4Material* mat,
269 const G4ParticleDefinition* part)
270{
271 G4double sig2 = 0.0;
272 if(SetupKinematics(part, mat, kinEnergy)) {
273 G4double step = ComputeTrueStep(mat,part,kinEnergy,stepLength);
274 sig2 = (1.0/beta2 - 0.5)*CLHEP::twopi_mc2_rcl2*tmax*step*electronDensity*charge2;
275 }
276 return sig2;
277}
278
279//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
280
281inline G4double G4EnergyLossForExtrapolator::ComputeValue(G4double x,
282 const G4PhysicsTable* table)
283{
284 G4double res = 0.0;
285 G4bool b;
286 if(table) res = ((*table)[index])->GetValue(x, b);
287 return res;
288}
289
290//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
291
293{
294 verbose = val;
295}
296
297//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
298
300{
301 emin = val;
302}
303
304//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
305
307{
308 emax = val;
309}
310
311//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
312
314{
315 maxEnergyTransfer = val;
316}
317
318//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
319
320#endif
321
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4double TrueStepLength(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *part)
G4double EnergyDispersion(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *)
G4double ComputeRange(G4double kinEnergy, const G4ParticleDefinition *)
G4double EnergyBeforeStep(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *)
G4double AverageScatteringAngle(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *part)
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *)
G4double ComputeEnergy(G4double range, const G4ParticleDefinition *)
G4double ComputeTrueStep(const G4Material *, const G4ParticleDefinition *part, G4double kinEnergy, G4double stepLength)
G4double EnergyAfterStep(G4double kinEnergy, G4double step, const G4Material *, const G4ParticleDefinition *)