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
G4LowEWentzelVIModel.cc
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 file
30//
31//
32// File name: G4LowEWentzelVIModel
33//
34// Author: V.Ivanchenko
35//
36// Creation date: 11.02.2014 from G4WentzelVIModel
37//
38// Modifications:
39//
40// Class Description:
41//
42
43// -------------------------------------------------------------------
44//
45
46//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
47//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
48
51#include "G4SystemOfUnits.hh"
52
53//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
54
55using namespace std;
56
58 G4WentzelVIModel(false,"LowEnWentzelVI")
59{
61}
62
63//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
64
66{}
67
68//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
69
71 const G4Track& track,
72 G4double& currentMinimalStep)
73{
74 G4double tlimit = currentMinimalStep;
75 const G4DynamicParticle* dp = track.GetDynamicParticle();
76 G4StepPoint* sp = track.GetStep()->GetPreStepPoint();
77 G4StepStatus stepStatus = sp->GetStepStatus();
79
80 // initialisation for each step, lambda may be computed from scratch
86
87 // extra check for abnormal situation
88 // this check needed to run MSC with eIoni and eBrem inactivated
89 tlimit = std::min(tlimit, currentRange);
90
91 // stop here if small range particle
92 if(tlimit < tlimitminfix) {
93 return ConvertTrueToGeom(tlimit, currentMinimalStep);
94 }
95
96 // pre step
97 G4double presafety = sp->GetSafety();
98 // far from geometry boundary
99 if(currentRange < presafety) {
100 return ConvertTrueToGeom(tlimit, currentMinimalStep);
101 }
102
103 // compute presafety again if presafety <= 0 and no boundary
104 // i.e. when it is needed for optimization purposes
105 if(stepStatus != fGeomBoundary && presafety < tlimitminfix) {
106 presafety = ComputeSafety(sp->GetPosition(), tlimit);
107 if(currentRange < presafety) {
108 return ConvertTrueToGeom(tlimit, currentMinimalStep);
109 }
110 }
111 /*
112 G4cout << "e(MeV)= " << preKinEnergy/MeV
113 << " " << particle->GetParticleName()
114 << " CurLimit(mm)= " << tlimit/mm <<" safety(mm)= " << presafety/mm
115 << " R(mm)= " <<currentRange/mm
116 << " L0(mm^-1)= " << lambdaeff*mm
117 <<G4endl;
118 */
119 // natural limit for high energy
120 G4double rlimit = std::max(facrange*currentRange, lambdaeff);
121
122 // low-energy e-
123 rlimit = std::max(rlimit, facsafety*presafety);
124
125 tlimit = std::min(tlimit, rlimit);
126 tlimit = std::max(tlimit, tlimitminfix);
127
128 // step limit in infinite media
129 tlimit = std::min(tlimit, 50*currentMaterial->GetRadlen()/facgeom);
130
131 //compute geomlimit and force few steps within a volume
133 && stepStatus == fGeomBoundary) {
134
135 G4double geomlimit = ComputeGeomLimit(track, presafety, currentRange);
136 tlimit = std::min(tlimit, geomlimit/facgeom);
137 }
138 /*
139 G4cout << particle->GetParticleName() << " E(MeV)= " << preKinEnergy
140 << " L0= " << lambdaeff << " R= " << currentRange
141 << " tlimit= " << tlimit
142 << " currentMinimalStep= " << currentMinimalStep << G4endl;
143 */
144 return ConvertTrueToGeom(tlimit, currentMinimalStep);
145}
146
147//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ fUseDistanceToBoundary
G4StepStatus
Definition: G4StepStatus.hh:40
@ fGeomBoundary
Definition: G4StepStatus.hh:43
double G4double
Definition: G4Types.hh:83
G4double GetKineticEnergy() const
G4double ComputeTruePathLengthLimit(const G4Track &track, G4double &currentMinimalStep) override
G4double GetRadlen() const
Definition: G4Material.hh:215
G4StepPoint * GetPreStepPoint() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
const G4Step * GetStep() const
G4double facrange
Definition: G4VMscModel.hh:199
G4double ComputeGeomLimit(const G4Track &, G4double &presafety, G4double limit)
Definition: G4VMscModel.hh:296
G4double GetTransportMeanFreePath(const G4ParticleDefinition *part, G4double kinEnergy)
Definition: G4VMscModel.hh:325
G4double GetRange(const G4ParticleDefinition *part, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
Definition: G4VMscModel.cc:188
G4MscStepLimitType steppingAlgorithm
Definition: G4VMscModel.hh:209
G4double ConvertTrueToGeom(G4double &tLength, G4double &gLength)
Definition: G4VMscModel.hh:286
G4double ComputeSafety(const G4ThreeVector &position, G4double limit=DBL_MAX)
Definition: G4VMscModel.hh:278
G4double facsafety
Definition: G4VMscModel.hh:201
G4double facgeom
Definition: G4VMscModel.hh:200
virtual G4double SetupKinematic(G4double kinEnergy, const G4Material *mat)
const G4MaterialCutsCouple * currentCouple
void DefineMaterial(const G4MaterialCutsCouple *)
const G4ParticleDefinition * particle
const G4Material * currentMaterial
void SetSingleScatteringFactor(G4double)
G4WentzelOKandVIxSection * wokvi