Geant4 Cross Reference |
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 53 #include "G4IonDEDXScalingICRU73.hh" 54 #include "G4ParticleDefinition.hh" 55 #include "G4ParticleTable.hh" 56 #include "G4IonTable.hh" 57 #include "G4Material.hh" 58 59 60 // ########################################################################### 61 62 G4IonDEDXScalingICRU73::G4IonDEDXScalingICRU73( 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 91 G4IonDEDXScalingICRU73::~G4IonDEDXScalingICRU73() { 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 116 G4double G4IonDEDXScalingICRU73::ScalingFactorEnergy ( 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 143 G4double G4IonDEDXScalingICRU73::ScalingFactorDEDX( 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 203 G4int G4IonDEDXScalingICRU73::AtomicNumberBaseIon( 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 // ########################################################################### 226