source: trunk/source/processes/electromagnetic/lowenergy/src/G4IonDEDXScalingICRU73.cc@ 1197

Last change on this file since 1197 was 1192, checked in by garnier, 16 years ago

update par rapport a CVS

File size: 8.5 KB
RevLine 
[1058]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//
[1192]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).
[1058]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
53#include "G4IonDEDXScalingICRU73.hh"
54#include "G4ParticleDefinition.hh"
55#include "G4ParticleTable.hh"
56#include "G4Material.hh"
57
58
59// ###########################################################################
60
61G4IonDEDXScalingICRU73::G4IonDEDXScalingICRU73(
62 G4int minAtomicNumberIon,
[1192]63 G4int maxAtomicNumberIon) :
[1058]64 minAtomicNumber( minAtomicNumberIon ),
65 maxAtomicNumber( maxAtomicNumberIon ),
[1192]66 referenceFe( 0 ),
67 atomicNumberRefFe( 26 ),
68 massNumberRefFe( 56 ),
69 atomicNumberRefPow23Fe( 0 ),
70 chargeRefFe( 0 ),
71 massRefFe( 0 ),
72 referenceAr( 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 ) {
[1058]86
87}
88
89// ###########################################################################
90
91G4IonDEDXScalingICRU73::~G4IonDEDXScalingICRU73() {
92
93}
94
95// ###########################################################################
96
[1192]97void G4IonDEDXScalingICRU73::CreateReferenceParticles() {
[1058]98
99 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
100
101 G4double excitationEnergy = 0.0;
102
[1192]103 referenceFe = particleTable -> GetIon(atomicNumberRefFe, massNumberRefFe,
104 excitationEnergy);
105 referenceAr = particleTable -> GetIon(atomicNumberRefAr, massNumberRefAr,
106 excitationEnergy);
[1058]107
[1192]108 massRefFe = referenceFe -> GetPDGMass();
109 massRefAr = referenceAr -> GetPDGMass();
[1058]110
[1192]111 chargeRefFe = referenceFe -> GetPDGCharge();
112 chargeRefAr = referenceAr -> GetPDGCharge();
113
114 atomicNumberRefPow23Fe = std::pow(G4double(atomicNumberRefFe), 2./3.);
115 atomicNumberRefPow23Ar = std::pow(G4double(atomicNumberRefAr), 2./3.);
[1058]116}
117
118
119// ###########################################################################
120
121
122G4double G4IonDEDXScalingICRU73::ScalingFactorEnergy (
[1192]123 const G4ParticleDefinition* particle, // Projectile (ion)
124 const G4Material* material) { // Target material
[1058]125
126 G4double factor = 1.0;
127
[1192]128 UpdateCacheParticle(particle);
129 UpdateCacheMaterial(material);
[1058]130
[1192]131 if(cacheAtomicNumber >= minAtomicNumber &&
132 cacheAtomicNumber <= maxAtomicNumber &&
133 cacheAtomicNumber != atomicNumberRefFe &&
134 cacheAtomicNumber != atomicNumberRefAr) {
[1058]135
[1192]136 if(referenceFe == 0 || referenceAr == 0) CreateReferenceParticles();
[1058]137
[1192]138 if( useFe )
139 factor = cacheMassNumber * (massRefFe / cacheMass) / massNumberRefFe;
140 else
141 factor = cacheMassNumber * (massRefAr / cacheMass) / massNumberRefAr;
[1058]142 }
143
144 return factor;
145}
146
147// ###########################################################################
148
149G4double G4IonDEDXScalingICRU73::ScalingFactorDEDX(
150 const G4ParticleDefinition* particle, // Projectile (ion)
[1192]151 const G4Material* material, // Target material
[1058]152 G4double kineticEnergy) { // Kinetic energy
153
154 G4double factor = 1.0;
155
[1192]156 UpdateCacheParticle(particle);
157 UpdateCacheMaterial(material);
[1058]158
[1192]159 if(cacheAtomicNumber >= minAtomicNumber &&
160 cacheAtomicNumber <= maxAtomicNumber &&
161 cacheAtomicNumber != atomicNumberRefFe &&
162 cacheAtomicNumber != atomicNumberRefAr) {
[1058]163
[1192]164 if(referenceFe == 0 || referenceAr == 0) CreateReferenceParticles();
[1058]165
[1192]166 if( useFe ) {
167
168 G4double equilibriumCharge = EquilibriumCharge(cacheMass,
[1058]169 cacheCharge,
170 cacheAtomicNumberPow23,
171 kineticEnergy);
172
[1192]173 G4double scaledKineticEnergy = kineticEnergy * (massRefFe / cacheMass);
[1058]174
[1192]175 G4double equilibriumChargeRefFe = EquilibriumCharge(massRefFe,
176 chargeRefFe,
177 atomicNumberRefPow23Fe,
[1058]178 scaledKineticEnergy);
179
[1192]180 factor = equilibriumCharge * equilibriumCharge/
181 ( equilibriumChargeRefFe * equilibriumChargeRefFe );
[1058]182
[1192]183 }
184 else {
185
186 G4double equilibriumCharge = EquilibriumCharge(cacheMass,
187 cacheCharge,
188 cacheAtomicNumberPow23,
189 kineticEnergy);
190
191 G4double scaledKineticEnergy = kineticEnergy * (massRefAr / cacheMass);
192
193 G4double equilibriumChargeRefAr = EquilibriumCharge(massRefAr,
194 chargeRefAr,
195 atomicNumberRefPow23Ar,
196 scaledKineticEnergy);
197
198 factor = equilibriumCharge * equilibriumCharge/
199 ( equilibriumChargeRefAr * equilibriumChargeRefAr );
200
201 }
202 }
203
[1058]204 return factor;
205}
206
207// ###########################################################################
208
209G4int G4IonDEDXScalingICRU73::AtomicNumberBaseIon(
210 G4int atomicNumberIon, // Atomic number of ion
[1192]211 const G4Material* material) { // Target material
[1058]212
[1192]213 UpdateCacheMaterial(material);
214
[1058]215 G4int atomicNumber = atomicNumberIon;
216
217 if(atomicNumberIon >= minAtomicNumber &&
[1192]218 atomicNumberIon <= maxAtomicNumber &&
219 atomicNumberIon != atomicNumberRefFe &&
220 atomicNumberIon != atomicNumberRefAr) {
[1058]221
[1192]222 if(referenceFe == 0 || referenceAr == 0) CreateReferenceParticles();
[1058]223
[1192]224 if( useFe ) atomicNumber = atomicNumberRefFe;
225 else atomicNumber = atomicNumberRefAr;
[1058]226 }
227
228 return atomicNumber;
229}
230
231// ###########################################################################
Note: See TracBrowser for help on using the repository browser.