Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 (Anton.Lechner@cern.ch)
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 
54 #include "G4ParticleDefinition.hh"
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 
96 void G4IonDEDXScalingICRU73::CreateReferenceParticles() {
97 
98  G4IonTable* ionTable = G4IonTable::GetIonTable();
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 // ###########################################################################
G4double ScalingFactorDEDX(const G4ParticleDefinition *particle, const G4Material *, G4double kineticEnergy)
G4double ScalingFactorEnergy(const G4ParticleDefinition *particle, const G4Material *material)
G4int AtomicNumberBaseIon(G4int atomicNumberIon, const G4Material *)
int G4int
Definition: G4Types.hh:78
string material
Definition: eplot.py:19
G4double GetIonMass(G4int Z, G4int A, G4int L=0, G4int lvl=0) const
Definition: G4IonTable.cc:1232
static G4IonTable * GetIonTable()
Definition: G4IonTable.hh:80
double G4double
Definition: G4Types.hh:76
G4IonDEDXScalingICRU73(G4int minAtomicNumberIon=19, G4int maxAtomicNumberIon=102)