Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4IonDEDXScalingICRU73.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 source file
30//
31// Class: G4IonDEDXScalingICRU73
32//
33// Base class: G4VIonDEDXScalingAlgorithm
34//
35// Author: Anton Lechner ([email protected])
36//
37// First implementation: 10. 05. 2009
38//
39// Modifications: 06. 08. 2009 - Minor bug fix (initialization of cache) AL
40// 12. 11. 2009 - Moved all decision logic concerning ICRU 73
41// scaling for heavy ions into this class.
42// Adapting ScalingFactorEnergy class according
43// to changes in base class (AL).
44//
45// Class description:
46// dE/dx scaling algorithm applied on top of ICRU 73 data (for ions not
47// covered by the ICRU 73 report)
48//
49// Comments:
50//
51// ===========================================================================
52
55#include "G4ParticleTable.hh"
56#include "G4IonTable.hh"
57#include "G4Material.hh"
58
59
60// ###########################################################################
61
63 G4int minAtomicNumberIon,
64 G4int maxAtomicNumberIon) :
65 minAtomicNumber( minAtomicNumberIon ),
66 maxAtomicNumber( maxAtomicNumberIon ),
67 referencePrepared( false ),
68 atomicNumberRefFe( 26 ),
69 massNumberRefFe( 56 ),
70 atomicNumberRefPow23Fe( 0 ),
71 chargeRefFe( 0 ),
72 massRefFe( 0 ),
73 atomicNumberRefAr( 18 ),
74 massNumberRefAr( 40 ),
75 atomicNumberRefPow23Ar( 0 ),
76 chargeRefAr( 0 ),
77 massRefAr( 0 ),
78 useFe( true ),
79 cacheParticle( 0 ),
80 cacheMassNumber( 0 ),
81 cacheAtomicNumber( 0 ),
82 cacheAtomicNumberPow23( 0 ),
83 cacheCharge( 0 ),
84 cacheMass( 0 ),
85 cacheMaterial( 0 ) {
86
87}
88
89// ###########################################################################
90
92}
93
94// ###########################################################################
95
96void G4IonDEDXScalingICRU73::CreateReferenceParticles() {
97
99
100 massRefFe = ionTable->GetIonMass(atomicNumberRefFe,massNumberRefFe);
101 massRefAr = ionTable->GetIonMass(atomicNumberRefAr,massNumberRefAr);
102
103 chargeRefFe = G4double(atomicNumberRefFe)*CLHEP::eplus;
104 chargeRefAr = G4double(atomicNumberRefAr)*CLHEP::eplus;
105
106 atomicNumberRefPow23Fe = std::pow(G4double(atomicNumberRefFe), 2./3.);
107 atomicNumberRefPow23Ar = std::pow(G4double(atomicNumberRefAr), 2./3.);
108
109 referencePrepared = true;
110}
111
112
113// ###########################################################################
114
115
117 const G4ParticleDefinition* particle, // Projectile (ion)
118 const G4Material* material) { // Target material
119
120 G4double factor = 1.0;
121
122 UpdateCacheParticle(particle);
123 UpdateCacheMaterial(material);
124
125 if(cacheAtomicNumber >= minAtomicNumber &&
126 cacheAtomicNumber <= maxAtomicNumber &&
127 cacheAtomicNumber != atomicNumberRefFe &&
128 cacheAtomicNumber != atomicNumberRefAr) {
129
130 if(!referencePrepared) CreateReferenceParticles();
131
132 if( useFe )
133 factor = cacheMassNumber * (massRefFe / cacheMass) / massNumberRefFe;
134 else
135 factor = cacheMassNumber * (massRefAr / cacheMass) / massNumberRefAr;
136 }
137
138 return factor;
139}
140
141// ###########################################################################
142
144 const G4ParticleDefinition* particle, // Projectile (ion)
145 const G4Material* material, // Target material
146 G4double kineticEnergy) { // Kinetic energy
147
148 G4double factor = 1.0;
149
150 UpdateCacheParticle(particle);
151 UpdateCacheMaterial(material);
152
153 if(cacheAtomicNumber >= minAtomicNumber &&
154 cacheAtomicNumber <= maxAtomicNumber &&
155 cacheAtomicNumber != atomicNumberRefFe &&
156 cacheAtomicNumber != atomicNumberRefAr) {
157
158 if(!referencePrepared) CreateReferenceParticles();
159
160 if( useFe ) {
161
162 G4double equilibriumCharge = EquilibriumCharge(cacheMass,
163 cacheCharge,
164 cacheAtomicNumberPow23,
165 kineticEnergy);
166
167 G4double scaledKineticEnergy = kineticEnergy * (massRefFe / cacheMass);
168
169 G4double equilibriumChargeRefFe = EquilibriumCharge(massRefFe,
170 chargeRefFe,
171 atomicNumberRefPow23Fe,
172 scaledKineticEnergy);
173
174 factor = equilibriumCharge * equilibriumCharge/
175 ( equilibriumChargeRefFe * equilibriumChargeRefFe );
176
177 }
178 else {
179
180 G4double equilibriumCharge = EquilibriumCharge(cacheMass,
181 cacheCharge,
182 cacheAtomicNumberPow23,
183 kineticEnergy);
184
185 G4double scaledKineticEnergy = kineticEnergy * (massRefAr / cacheMass);
186
187 G4double equilibriumChargeRefAr = EquilibriumCharge(massRefAr,
188 chargeRefAr,
189 atomicNumberRefPow23Ar,
190 scaledKineticEnergy);
191
192 factor = equilibriumCharge * equilibriumCharge/
193 ( equilibriumChargeRefAr * equilibriumChargeRefAr );
194
195 }
196 }
197
198 return factor;
199}
200
201// ###########################################################################
202
204 G4int atomicNumberIon, // Atomic number of ion
205 const G4Material* material) { // Target material
206
207 UpdateCacheMaterial(material);
208
209 G4int atomicNumber = atomicNumberIon;
210
211 if(atomicNumberIon >= minAtomicNumber &&
212 atomicNumberIon <= maxAtomicNumber &&
213 atomicNumberIon != atomicNumberRefFe &&
214 atomicNumberIon != atomicNumberRefAr) {
215
216 if(!referencePrepared) CreateReferenceParticles();
217
218 if( useFe ) atomicNumber = atomicNumberRefFe;
219 else atomicNumber = atomicNumberRefAr;
220 }
221
222 return atomicNumber;
223}
224
225// ###########################################################################
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4double ScalingFactorDEDX(const G4ParticleDefinition *particle, const G4Material *, G4double kineticEnergy) override
G4IonDEDXScalingICRU73(G4int minAtomicNumberIon=19, G4int maxAtomicNumberIon=102)
G4int AtomicNumberBaseIon(G4int atomicNumberIon, const G4Material *) override
G4double ScalingFactorEnergy(const G4ParticleDefinition *particle, const G4Material *material) override
static G4IonTable * GetIonTable()
Definition: G4IonTable.cc:170
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
Definition: G4IonTable.cc:1517