Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4VMultipleScattering.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// GEANT4 Class header file
31//
32//
33// File name: G4VMultipleScattering
34//
35// Author: Vladimir Ivanchenko on base of Laszlo Urban code
36//
37// Creation date: 12.03.2002
38//
39// Modifications:
40//
41// 16-07-03 Update GetRange interface (V.Ivanchenko)
42//
43//
44// Class Description:
45//
46// It is the generic process of multiple scattering it includes common
47// part of calculations for all charged particles
48//
49// 26-11-03 bugfix in AlongStepDoIt (L.Urban)
50// 25-05-04 add protection against case when range is less than steplimit (VI)
51// 30-06-04 make destructor virtual (V.Ivanchenko)
52// 27-08-04 Add InitialiseForRun method (V.Ivanchneko)
53// 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivanchenko)
54// 15-04-05 optimize internal interfaces (V.Ivanchenko)
55// 15-04-05 remove boundary flag (V.Ivanchenko)
56// 07-10-05 error in a protection in GetContinuousStepLimit corrected (L.Urban)
57// 27-10-05 introduce virtual function MscStepLimitation() (V.Ivanchenko)
58// 26-01-06 Rename GetRange -> GetRangeFromRestricteDEDX (V.Ivanchenko)
59// 17-02-06 Save table of transport cross sections not mfp (V.Ivanchenko)
60// 07-03-06 Move step limit calculation to model (V.Ivanchenko)
61// 13-05-06 Add method to access model by index (V.Ivanchenko)
62// 12-02-07 Add get/set skin (V.Ivanchenko)
63// 27-10-07 Virtual functions moved to source (V.Ivanchenko)
64// 15-07-08 Reorder class members for further multi-thread development (VI)
65// 07-04-09 Moved msc methods from G4VEmModel to G4VMscModel (VI)
66//
67
68// -------------------------------------------------------------------
69//
70
71#ifndef G4VMultipleScattering_h
72#define G4VMultipleScattering_h 1
73
75#include "globals.hh"
76#include "G4Material.hh"
78#include "G4Track.hh"
79#include "G4Step.hh"
80#include "G4EmModelManager.hh"
81#include "G4VMscModel.hh"
82#include "G4MscStepLimitType.hh"
83
87class G4SafetyHelper;
88
89//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
90
92{
93public:
94
95 G4VMultipleScattering(const G4String& name = "msc",
97
98 virtual ~G4VMultipleScattering();
99
100 //------------------------------------------------------------------------
101 // Virtual methods to be implemented for the concrete model
102 //------------------------------------------------------------------------
103
105
106 virtual void PrintInfo() = 0;
107
108protected:
109
110 virtual void InitialiseProcess(const G4ParticleDefinition*) = 0;
111
112public:
113
114 //------------------------------------------------------------------------
115 // Generic methods common to all ContinuousDiscrete processes
116 //------------------------------------------------------------------------
117
118 // Initialise for build of tables
120
121 // Build physics table during initialisation
123
124 // Print out of generic class parameters
125 void PrintInfoDefinition();
126
127 // Store PhysicsTable in a file.
128 // Return false in case of failure at I/O
130 const G4String& directory,
131 G4bool ascii = false);
132
133 // Retrieve Physics from a file.
134 // (return true if the Physics Table can be build by using file)
135 // (return false if the process has no functionality or in case of failure)
136 // File name should is constructed as processName+particleName and the
137 // should be placed under the directory specifed by the argument.
139 const G4String& directory,
140 G4bool ascii);
141
142 // This is called in the beginning of tracking for a new track
143 void StartTracking(G4Track*);
144
145 // The function overloads the corresponding function of the base
146 // class.It limits the step near to boundaries only
147 // and invokes the method GetMscContinuousStepLimit at every step.
149 const G4Track&,
150 G4double previousStepSize,
151 G4double currentMinimalStep,
152 G4double& currentSafety,
153 G4GPILSelection* selection);
154
155 // The function overloads the corresponding function of the base
156 // class.
158 const G4Track&,
159 G4double previousStepSize,
161
162 // Along step actions
164
165 // Post step actions
167
168 // This method does not used for tracking, it is intended only for tests
170 G4double previousStepSize,
171 G4double currentMinimalStep,
172 G4double& currentSafety);
173
174 //------------------------------------------------------------------------
175 // Specific methods to set, access, modify models
176 //------------------------------------------------------------------------
177
178 // Select model in run time
179 inline G4VEmModel* SelectModel(G4double kinEnergy, size_t idx);
180
181public:
182
183 // Add model for region, smaller value of order defines which
184 // model will be selected for a given energy interval
185 void AddEmModel(G4int order, G4VEmModel*, const G4Region* region = 0);
186
187 // Assign a model to a process - obsolete method will be removed
188 void SetModel(G4VMscModel*, G4int index = 1);
189
190 // return the assigned model - obsolete method will be removed
191 G4VMscModel* Model(G4int index = 1);
192
193 // Assign a model to a process
194 void SetEmModel(G4VMscModel*, G4int index = 1);
195
196 // return the assigned model
197 G4VMscModel* EmModel(G4int index = 1);
198
199 // Access to models by index
200 G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false) const;
201
202 //------------------------------------------------------------------------
203 // Get/Set parameters for simulation of multiple scattering
204 //------------------------------------------------------------------------
205
207
208 inline G4bool LateralDisplasmentFlag() const;
209 inline void SetLateralDisplasmentFlag(G4bool val);
210
211 inline G4double Skin() const;
212 inline void SetSkin(G4double val);
213
214 inline G4double RangeFactor() const;
215 inline void SetRangeFactor(G4double val);
216
217 inline G4double GeomFactor() const;
218 inline void SetGeomFactor(G4double val);
219
220 inline G4double PolarAngleLimit() const;
221 inline void SetPolarAngleLimit(G4double val);
222
223 inline G4MscStepLimitType StepLimitType() const;
224 inline void SetStepLimitType(G4MscStepLimitType val);
225
226 inline const G4ParticleDefinition* FirstParticle() const;
227
228 //------------------------------------------------------------------------
229 // Run time methods
230 //------------------------------------------------------------------------
231
232protected:
233
234 // This method is not used for tracking, it returns mean free path value
235 G4double GetMeanFreePath(const G4Track& track,
236 G4double,
238
239 // This method is not used for tracking, it returns step limit
241 G4double previousStepSize,
242 G4double currentMinimalStep,
243 G4double& currentSafety);
244
245private:
246
247 // hide assignment operator
249 G4VMultipleScattering & operator=(const G4VMultipleScattering &right);
250
251 // ======== Parameters of the class fixed at construction =========
252
253 G4EmModelManager* modelManager;
254 G4LossTableManager* emManager;
255 G4double geomMin;
256
257 // ======== Parameters of the class fixed at initialisation =======
258
259 G4SafetyHelper* safetyHelper;
260
261 std::vector<G4VMscModel*> mscModels;
262 G4int numberOfModels;
263
264 const G4ParticleDefinition* firstParticle;
265 const G4ParticleDefinition* currParticle;
266
267 G4MscStepLimitType stepLimit;
268
269 G4double skin;
270 G4double facrange;
271 G4double facgeom;
272 G4double polarAngleLimit;
273 G4double lowestKinEnergy;
274
275 G4bool latDisplasment;
276 G4bool isIon;
277
278 // ======== Cashed values - may be state dependent ================
279
280protected:
281
284
285private:
286
287 // cache
288 G4VMscModel* currentModel;
289 G4VEnergyLossProcess* fIonisation;
290
291 G4double physStepLimit;
292 G4double tPathLength;
293 G4double gPathLength;
294
295 G4ThreeVector fNewPosition;
296 G4bool fPositionChanged;
297 G4bool isActive;
298
299 G4int warn;
300};
301
302// ======== Run time inline methods ================
303
304//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
305
306inline G4VEmModel*
307G4VMultipleScattering::SelectModel(G4double kinEnergy, size_t coupleIndex)
308{
309 return modelManager->SelectModel(kinEnergy, coupleIndex);
310}
311
312//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
313
315{
316 return latDisplasment;
317}
318
319//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
320
322{
323 latDisplasment = val;
324}
325
326//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
327
329{
330 return skin;
331}
332
333//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
334
336{
337 if(val < 1.0) { skin = 0.0; }
338 else { skin = val; }
339}
340
341//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
342
344{
345 return facrange;
346}
347
348//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
349
351{
352 if(val > 0.0) facrange = val;
353}
354
355//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
356
358{
359 return facgeom;
360}
361
362//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
363
365{
366 if(val > 0.0) facgeom = val;
367}
368
369//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
370
372{
373 return polarAngleLimit;
374}
375
376//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
377
379{
380 if(val < 0.0) { polarAngleLimit = 0.0; }
381 else if(val > CLHEP::pi) { polarAngleLimit = CLHEP::pi; }
382 else { polarAngleLimit = val; }
383}
384
385//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
386
388{
389 return stepLimit;
390}
391
392//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
393
395{
396 stepLimit = val;
397 if(val == fMinimal) { facrange = 0.2; }
398}
399
400//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
401
403{
404 return firstParticle;
405}
406
407//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
408
409#endif
G4double condition(const G4ErrorSymMatrix &m)
G4ForceCondition
G4GPILSelection
G4MscStepLimitType
@ fMinimal
G4ProcessType
@ fElectromagnetic
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4VEmModel * SelectModel(G4double &energy, size_t &index)
Definition: G4Step.hh:78
G4GPILSelection valueGPILSelectionMSC
void AddEmModel(G4int order, G4VEmModel *, const G4Region *region=0)
void SetIonisation(G4VEnergyLossProcess *)
virtual void PrintInfo()=0
G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false)
G4VMscModel * EmModel(G4int index=1)
const G4ParticleDefinition * FirstParticle() const
G4double GetMeanFreePath(const G4Track &track, G4double, G4ForceCondition *condition)
G4ParticleChangeForMSC fParticleChange
void SetPolarAngleLimit(G4double val)
G4VParticleChange * AlongStepDoIt(const G4Track &, const G4Step &)
G4VEmModel * GetModelByIndex(G4int idx=0, G4bool ver=false) const
G4double AlongStepGetPhysicalInteractionLength(const G4Track &, G4double previousStepSize, G4double currentMinimalStep, G4double &currentSafety, G4GPILSelection *selection)
G4double ContinuousStepLimit(const G4Track &track, G4double previousStepSize, G4double currentMinimalStep, G4double &currentSafety)
void PreparePhysicsTable(const G4ParticleDefinition &)
void SetRangeFactor(G4double val)
void SetModel(G4VMscModel *, G4int index=1)
G4double PostStepGetPhysicalInteractionLength(const G4Track &, G4double previousStepSize, G4ForceCondition *condition)
G4double PolarAngleLimit() const
void SetStepLimitType(G4MscStepLimitType val)
void SetEmModel(G4VMscModel *, G4int index=1)
virtual void InitialiseProcess(const G4ParticleDefinition *)=0
G4VMscModel * Model(G4int index=1)
G4double GetContinuousStepLimit(const G4Track &track, G4double previousStepSize, G4double currentMinimalStep, G4double &currentSafety)
void BuildPhysicsTable(const G4ParticleDefinition &)
void SetLateralDisplasmentFlag(G4bool val)
G4bool LateralDisplasmentFlag() const
G4VEmModel * SelectModel(G4double kinEnergy, size_t idx)
G4MscStepLimitType StepLimitType() const
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
void SetGeomFactor(G4double val)
virtual G4bool IsApplicable(const G4ParticleDefinition &p)=0
G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii)