Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4GoudsmitSaundersonMscModel.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//
27// ----------------------------------------------------------------------------
28//
29// GEANT4 Class header file
30//
31// File name: G4GoudsmitSaundersonMscModel
32//
33// Author: Mihaly Novak / (Omrane Kadri)
34//
35// Creation date: 20.02.2009
36//
37// Modifications:
38// 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style
39// 12.05.2010 O.Kadri: adding Qn1 and Qn12 as private doubles
40// 18.05.2015 M. Novak provide PLERIMINARYY version of updated class.
41// All algorithms of the class were revised and updated, new methods added.
42// A new version of Kawrakow-Bielajew Goudsmit-Saunderson MSC model
43// based on the screened Rutherford DCS for elastic scattering of
44// electrons/positrons has been introduced[1,2]. The corresponding MSC
45// angular distributions over a 2D parameter grid have been recomputed
46// and the CDFs are now stored in a variable transformed (smooth) form[2,3]
47// together with the corresponding rational interpolation parameters.
48// These angular distributions are handled by the new
49// G4GoudsmitSaundersonTable class that is responsible to sample if
50// it was no, single, few or multiple scattering case and delivers the
51// angular deflection (i.e. cos(theta) and sin(theta)).
52// Two screening options are provided:
53// - if fgIsUsePWATotalXsecData=TRUE i.e. SetOptionPWAScreening(TRUE)
54// was called before initialisation: screening parameter value A is
55// determined such that the first transport coefficient G1(A)
56// computed according to the screened Rutherford DCS for elastic
57// scattering will reproduce the one computed from the PWA elastic
58// and first transport mean free paths[4].
59// - if fgIsUsePWATotalXsecData=FALSE i.e. default value or
60// SetOptionPWAScreening(FALSE) was called before initialisation:
61// screening parameter value A is computed according to Moliere's
62// formula (by using material dependent parameters \chi_cc2 and b_c
63// precomputed for each material used at initialization in
64// G4GoudsmitSaundersonTable) [3]
65// Elastic and first trasport mean free paths are used consistently.
66// The new version is self-consistent, several times faster, more
67// robust and accurate compared to the earlier version.
68// Spin effects as well as a more accurate energy loss correction and
69// computations of Lewis moments will be implemented later on.
70// 02.09.2015 M. Novak: first version of new step limit is provided.
71// fUseSafetyPlus corresponds to Urban fUseSafety (default)
72// fUseDistanceToBoundary corresponds to Urban fUseDistanceToBoundary
73// fUseSafety corresponds to EGSnrc error-free stepping algorithm
74// Range factor can be significantly higher at each case than in Urban.
75// 23.08.2017 M. Novak: added corrections to account spin effects (Mott-correction).
76// It can be activated by setting the fIsMottCorrection flag to be true
77// before initialization using the SetOptionMottCorrection() public method.
78// The fMottCorrection member is responsible to handle pre-computed Mott
79// correction (rejection) functions obtained by numerically computing
80// Goudsmit-Saunderson agnular distributions based on a DCS accounting spin
81// effects and screening corrections. The DCS used to compute the accurate
82// GS angular distributions is: DCS_{cor} = DCS_{SR}x[ DCS_{R}/DCS_{Mott}] where :
83// # DCS_{SR} is the relativistic Screened-Rutherford DCS (first Born approximate
84// solution of the Klein-Gordon i.e. relativistic Schrodinger equation =>
85// scattering of spinless e- on exponentially screened Coulomb potential)
86// note: the default (without using Mott-correction) GS angular distributions
87// are based on this DCS_{SR} with Moliere's screening parameter!
88// # DCS_{R} is the Rutherford DCS which is the same as above but without
89// screening
90// # DCS_{Mott} is the Mott DCS i.e. solution of the Dirac equation with a bare
91// Coulomb potential i.e. scattering of particles with spin (e- or e+) on a
92// point-like unscreened Coulomb potential
93// # moreover, the screening parameter of the DCS_{cor} was determined such that
94// the DCS_{cor} with this corrected screening parameter reproduce the first
95// transport cross sections obtained from the corresponding most accurate DCS
96// (i.e. from elsepa [4])
97// Unlike the default GS, the Mott-corrected angular distributions are particle type
98// (different for e- and e+ <= the DCS_{Mott} and the screening correction) and target
99// (Z and material) dependent.
100// 02.02.2018 M. Novak: implemented CrossSectionPerVolume interface method (used only for testing)
101//
102// Class description:
103// Kawrakow-Bielajew Goudsmit-Saunderson MSC model based on the screened Rutherford DCS
104// for elastic scattering of e-/e+. Option, to include (Mott) correction (see above), is
105// also available now (SetOptionMottCorrection(true)). An EGSnrc like error-free stepping
106// algorithm (UseSafety) is available beyond the usual Geant4 step limitation algorithms
107// and true to geomerty and geometry to true step length computations that were adopted
108// from the Urban model[5]. The most accurate setting: error-free stepping (UseSafety)
109// with Mott-correction (SetOptionMottCorrection(true)).
110//
111// References:
112// [1] A.F.Bielajew, NIMB 111 (1996) 195-208
113// [2] I.Kawrakow, A.F.Bielajew, NIMB 134(1998) 325-336
114// [3] I.Kawrakow, E.Mainegra-Hing, D.W.O.Rogers, F.Tessier,B.R.B.Walters, NRCC
115// Report PIRS-701 (2013)
116// [4] F.Salvat, A.Jablonski, C.J. Powell, CPC 165(2005) 157-190
117// [5] L.Urban, Preprint CERN-OPEN-2006-077 (2006)
118//
119// -----------------------------------------------------------------------------
120
121#ifndef G4GoudsmitSaundersonMscModel_h
122#define G4GoudsmitSaundersonMscModel_h 1
123
125
126#include "G4VMscModel.hh"
127#include "G4PhysicsTable.hh"
129#include "globals.hh"
130
131
132class G4DataVector;
137
139{
140public:
141
142 G4GoudsmitSaundersonMscModel(const G4String& nam = "GoudsmitSaunderson");
143
145
146 void Initialise(const G4ParticleDefinition*, const G4DataVector&) override;
147
148 void InitialiseLocal(const G4ParticleDefinition* p, G4VEmModel* masterModel) override;
149
150 G4ThreeVector& SampleScattering(const G4ThreeVector&, G4double safety) override;
151
152 G4double ComputeTruePathLengthLimit(const G4Track& track, G4double& currentMinimalStep) override;
153
154 G4double ComputeGeomPathLength(G4double truePathLength) override;
155
156 G4double ComputeTrueStepLength(G4double geomStepLength) override;
157
158 // method to compute first transport cross section per Volume (i.e. macroscropic first transport cross section; this
159 // method is used only for testing and not during a normal simulation)
160 G4double CrossSectionPerVolume(const G4Material*, const G4ParticleDefinition*, G4double kineticEnergy, G4double cutEnergy = 0.0, G4double maxEnergy = DBL_MAX) override;
161
162 void StartTracking(G4Track*) override;
163
164 void SampleMSC();
165
167
168 void SetOptionPWACorrection(G4bool opt) { fIsUsePWACorrection = opt; }
169
170 G4bool GetOptionPWACorrection() const { return fIsUsePWACorrection; }
171
172 void SetOptionMottCorrection(G4bool opt) { fIsUseMottCorrection = opt; }
173
174 G4bool GetOptionMottCorrection() const { return fIsUseMottCorrection; }
175
176 G4GoudsmitSaundersonTable* GetGSTable() { return fGSTable; }
177
178 G4GSPWACorrections* GetPWACorrection() { return fPWACorrection; }
179
180 // hide assignment operator
183
184private:
185 inline void SetParticle(const G4ParticleDefinition* p);
186
187 inline G4double GetLambda(G4double);
188
189 G4double GetTransportMeanFreePathOnly(const G4ParticleDefinition*,G4double);
190
191 inline G4double Randomizetlimit();
192
193private:
194 CLHEP::HepRandomEngine* rndmEngineMod;
195 //
196 G4double currentKinEnergy;
197 G4double currentRange;
198 //
199 G4double fr;
200 G4double rangeinit;
201 G4double geombig;
202 G4double geomlimit;
203 G4double tlimit;
204 G4double tgeom;
205 //
206 G4double par1;
207 G4double par2;
208 G4double par3;
209 G4double tlimitminfix2;
210 G4double tausmall;
211 G4double mass;
212 G4double taulim;
213 //
214 //
215 G4double presafety;
216 G4double fZeff;
217 //
218 G4int charge;
219 G4int currentMaterialIndex;
220 //
221 G4bool firstStep;
222 //
223 G4LossTableManager* theManager;
224 const G4ParticleDefinition* particle;
225 G4ParticleChangeForMSC* fParticleChange;
226 const G4MaterialCutsCouple* currentCouple;
227
229 G4GSPWACorrections* fPWACorrection;
230
231 G4bool fIsUsePWACorrection;
232 G4bool fIsUseMottCorrection;
233 //
234 G4double fLambda0; // elastic mean free path
235 G4double fLambda1; // first transport mean free path
236 G4double fScrA; // screening parameter
237 G4double fG1; // first transport coef.
238 // in case of Mott-correction
239 G4double fMCtoScrA;
240 G4double fMCtoQ1;
241 G4double fMCtoG2PerG1;
242 //
243 G4double fTheTrueStepLenght;
244 G4double fTheTransportDistance;
245 G4double fTheZPathLenght;
246 //
247 G4ThreeVector fTheDisplacementVector;
248 G4ThreeVector fTheNewDirection;
249 //
250 G4bool fIsEndedUpOnBoundary; // step ended up on boundary i.e. transportation is the winer
251 G4bool fIsMultipleSacettring;
252 G4bool fIsSingleScattering;
253 G4bool fIsEverythingWasDone;
254 G4bool fIsNoScatteringInMSC;
255 G4bool fIsNoDisplace;
256 G4bool fIsInsideSkin;
257 G4bool fIsWasOnBoundary;
258 G4bool fIsFirstRealStep;
259 //
260 static G4bool gIsUseAccurate;
261 static G4bool gIsOptimizationOn;
262};
263
264////////////////////////////////////////////////////////////////////////////////
265inline
266void G4GoudsmitSaundersonMscModel::SetParticle(const G4ParticleDefinition* p)
267{
268 if (p != particle) {
269 particle = p;
270 charge = (G4int)(p->GetPDGCharge()/CLHEP::eplus);
271 mass = p->GetPDGMass();
272 }
273}
274
275
276//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
277inline
278G4double G4GoudsmitSaundersonMscModel::Randomizetlimit()
279{
280 G4double temptlimit;
281 do {
282 temptlimit = G4RandGauss::shoot(rndmEngineMod,tlimit,0.1*tlimit);
283 } while ( (temptlimit<0.) || (temptlimit>2.*tlimit));
284
285 return temptlimit;
286}
287
288
289
290#endif
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double &currentMinimalStep) override
G4ThreeVector & SampleScattering(const G4ThreeVector &, G4double safety) override
G4double ComputeGeomPathLength(G4double truePathLength) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4GoudsmitSaundersonMscModel(const G4GoudsmitSaundersonMscModel &)=delete
G4GoudsmitSaundersonTable * GetGSTable()
G4double ComputeTrueStepLength(G4double geomStepLength) override
void InitialiseLocal(const G4ParticleDefinition *p, G4VEmModel *masterModel) override
G4GoudsmitSaundersonMscModel & operator=(const G4GoudsmitSaundersonMscModel &right)=delete
G4double GetTransportMeanFreePath(const G4ParticleDefinition *, G4double)
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX) override
G4double GetPDGCharge() const
#define DBL_MAX
Definition: templates.hh:62