00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include "G4hICRU49He.hh"
00057
00058 #include "globals.hh"
00059 #include "G4PhysicalConstants.hh"
00060 #include "G4SystemOfUnits.hh"
00061 #include "G4UnitsTable.hh"
00062 #include "G4Material.hh"
00063
00064
00065
00066 G4hICRU49He::G4hICRU49He():G4VhElectronicStoppingPower(),
00067 rateMass(4.0026/1.007276),
00068 iMolecula(0)
00069 {;}
00070
00071
00072
00073 G4hICRU49He::~G4hICRU49He()
00074 {;}
00075
00076
00077
00078 G4bool G4hICRU49He::HasMaterial(const G4Material* material)
00079 {
00080 G4String chFormula = material->GetChemicalFormula() ;
00081 G4String myFormula = G4String(" ");
00082
00083 if (myFormula == chFormula ) {
00084 if(1 == (material->GetNumberOfElements())) {return true;}
00085 return false ;
00086 }
00087
00088
00089 const size_t numberOfMolecula = 30 ;
00090 static G4String name[numberOfMolecula] = {
00091 "H_2", "Be-Solid", "C-Solid", "Graphite", "N_2",
00092 "O_2", "Al-Solid", "Si-Solid", "Ar-Solid", "Cu-Solid",
00093 "Ge", "W-Solid", "Au-Solid", "Pb-Solid", "C_2H_2",
00094 "CO_2", "Cellulose-Nitrat", "C_2H_4", "LiF",
00095 "CH_4", "Nylon", "Polycarbonate", "(CH_2)_N-Polyetilene", "PMMA",
00096 "(C_8H_8)_N", "SiO_2", "CsI", "H_2O", "H_2O-Gas"} ;
00097
00098
00099
00100 myFormula = G4String("H_2O") ;
00101 const G4State theState = material->GetState() ;
00102 if( theState == kStateGas && myFormula == chFormula) {
00103 chFormula = G4String("H_2O-Gas");
00104 }
00105
00106
00107 for (size_t i=0; i<numberOfMolecula; i++) {
00108 if (chFormula == name[i]) {
00109 SetMoleculaNumber(i) ;
00110 return true ;
00111 }
00112 }
00113 return false ;
00114 }
00115
00116
00117
00118 G4double G4hICRU49He::StoppingPower(const G4Material* material,
00119 G4double kineticEnergy)
00120 {
00121 G4double ionloss = 0.0 ;
00122
00123
00124 if(1 == (material->GetNumberOfElements())) {
00125 G4double z = material->GetZ() ;
00126 ionloss = ElectronicStoppingPower( z, kineticEnergy ) ;
00127
00128
00129
00130 } else if ( iMolecula < 30 ) {
00131
00132
00133
00134 G4double T = kineticEnergy*rateMass/MeV ;
00135
00136 static G4double c[30][7] = {
00137 {8.0080, 3.6287, 23.0700, 14.9900, 0.8507, 0.60, 2.0
00138 },{ 13.3100, 3.7432, 39.4130, 12.1990, 1.0950, 0.38, 1.4
00139 },{ 22.7240, 3.6040, 47.1810, 17.5490, 0.9040, 0.40, 1.4
00140 },{ 24.4040, 2.4032, 48.9440, 27.9730, 1.2933, 0.40, 1.6
00141 },{ 58.4719, 1.5115, 77.6421, 102.490, 1.5811, 0.50, 2.0
00142 },{ 60.5408, 1.6297, 91.7601, 94.1260, 1.3662, 0.50, 2.0
00143 },{ 48.4480, 6.4323, 59.2890, 18.3810, 0.4937, 0.48, 1.6
00144 },{ 59.0346, 5.1305, 47.0866, 30.0857, 0.3500, 0.60, 2.0
00145 },{ 71.8691, 2.8250, 51.1658, 57.1235, 0.4477, 0.60, 2.0
00146 },{ 78.3520, 4.0961, 136.731, 28.4470, 1.0621, 0.52, 1.2
00147 },{ 120.553, 1.5374, 49.8740, 82.2980, 0.8733, 0.45, 1.6
00148 },{ 249.896, 0.6996, -37.274, 248.592, 1.1052, 0.50, 1.5
00149 },{ 246.698, 0.6219, -58.391, 292.921, 0.8186, 0.56, 1.8
00150 },{ 248.563, 0.6235, -36.8968, 306.960, 1.3214, 0.50, 2.0
00151 },{ 25.5860, 1.7125, 154.723, 118.620, 2.2580, 0.50, 2.0
00152 },{ 138.294, 25.6413, 231.873, 17.3780, 0.3218, 0.58, 1.3
00153 },{ 83.2091, 1.1294, 135.7457, 190.865, 2.3461, 0.50, 2.0
00154 },{ 263.542, 1.4754, 1541.446, 781.898, 1.9209, 0.40, 2.0
00155 },{ 59.5545, 1.5354, 132.1523, 153.3537, 2.0262, 0.50, 2.0
00156 },{ 31.7380, 19.820, 125.2100, 6.8910, 0.7242, 0.50, 1.1
00157 },{ 31.7549, 1.5682, 97.4777, 106.0774, 2.3204, 0.50, 2.0
00158 },{ 230.465, 4.8967, 1845.320, 358.641, 1.0774, 0.46, 1.2
00159 },{ 423.444, 5.3761, 1189.114, 319.030, 0.7652, 0.48, 1.5
00160 },{ 86.3410, 3.3322, 91.0433, 73.1091, 0.4650, 0.50, 2.0
00161 },{ 146.105, 9.4344, 515.1500, 82.8860, 0.6239, 0.55, 1.5
00162 },{ 238.050, 5.6901, 372.3575, 146.1835, 0.3992, 0.50, 2.0
00163 },{ 124.2338, 2.6730, 133.8175, 99.4109, 0.7776, 0.50, 2.0
00164 },{ 221.723, 1.5415, 87.7315, 192.5266, 1.0742, 0.50, 2.0
00165 },{ 26.7537, 1.3717, 90.8007, 77.1587, 2.3264, 0.50, 2.0
00166 },{ 37.6121, 1.8052, 73.0250, 66.2070, 1.4038, 0.50, 2.0} };
00167
00168 G4double a1,a2 ;
00169
00170
00171 if ( T < 0.001 ) {
00172 G4double T0 = 0.001 ;
00173 a1 = 1.0 - std::exp(-c[iMolecula][1]*std::pow(T0,-2.0+c[iMolecula][5])) ;
00174 a2 = (c[iMolecula][0]*std::log(T0)/T0 + c[iMolecula][2]/T0) *
00175 std::exp(-c[iMolecula][4]*std::pow(T0,-c[iMolecula][6])) +
00176 c[iMolecula][3]/(T0*T0) ;
00177
00178 ionloss *= std::sqrt(T/T0) ;
00179
00180
00181 } else {
00182 a1 = 1.0 - std::exp(-c[iMolecula][1]*std::pow(T,-2.0+c[iMolecula][5])) ;
00183 a2 = (c[iMolecula][0]*std::log(T)/T + c[iMolecula][2]/T) *
00184 std::exp(-c[iMolecula][4]*std::pow(T,-c[iMolecula][6])) +
00185 c[iMolecula][3]/(T*T) ;
00186 }
00187
00188
00189 G4double z = (material->GetTotNbOfElectPerVolume()) /
00190 (material->GetTotNbOfAtomsPerVolume()) ;
00191
00192 ionloss = a1*a2 / HeEffChargeSquare(z, kineticEnergy*rateMass) ;
00193
00194 if ( ionloss < 0.0) ionloss = 0.0 ;
00195 }
00196
00197 return ionloss ;
00198 }
00199
00200
00201
00202 G4double G4hICRU49He::ElectronicStoppingPower(G4double z,
00203 G4double kineticEnergy) const
00204 {
00205 G4double ionloss ;
00206 G4int i = G4int(z)-1 ;
00207 if(i < 0) i = 0 ;
00208 if(i > 91) i = 91 ;
00209
00210
00211
00212
00213
00214
00215 G4double T = kineticEnergy*rateMass/MeV ;
00216
00217 static G4double a[92][5] = {
00218 {0.35485, 0.6456, 6.01525, 20.8933, 4.3515
00219 },{ 0.58, 0.59, 6.3, 130.0, 44.07
00220 },{ 1.42, 0.49, 12.25, 32.0, 9.161
00221 },{ 2.1895, 0.47183,7.2362, 134.30, 197.96
00222 },{ 3.691, 0.4128, 18.48, 50.72, 9.0
00223 },{ 3.83523, 0.42993,12.6125, 227.41, 188.97
00224 },{ 1.9259, 0.5550, 27.15125, 26.0665, 6.2768
00225 },{ 2.81015, 0.4759, 50.0253, 10.556, 1.0382
00226 },{ 1.533, 0.531, 40.44, 18.41, 2.718
00227 },{ 2.303, 0.4861, 37.01, 37.96, 5.092
00228 },{ 9.894, 0.3081, 23.65, 0.384, 92.93
00229 },{ 4.3, 0.47, 34.3, 3.3, 12.74
00230 },{ 2.5, 0.625, 45.7, 0.1, 4.359
00231 },{ 2.1, 0.65, 49.34, 1.788, 4.133
00232 },{ 1.729, 0.6562, 53.41, 2.405, 3.845
00233 },{ 1.402, 0.6791, 58.98, 3.528, 3.211
00234 },{ 1.117, 0.7044, 69.69, 3.705, 2.156
00235 },{ 2.291, 0.6284, 73.88, 4.478, 2.066
00236 },{ 8.554, 0.3817, 83.61, 11.84, 1.875
00237 },{ 6.297, 0.4622, 65.39, 10.14, 5.036
00238 },{ 5.307, 0.4918, 61.74, 12.4, 6.665
00239 },{ 4.71, 0.5087, 65.28, 8.806, 5.948
00240 },{ 6.151, 0.4524, 83.0, 18.31, 2.71
00241 },{ 6.57, 0.4322, 84.76, 15.53, 2.779
00242 },{ 5.738, 0.4492, 84.6, 14.18, 3.101
00243 },{ 5.013, 0.4707, 85.8, 16.55, 3.211
00244 },{ 4.32, 0.4947, 76.14, 10.85, 5.441
00245 },{ 4.652, 0.4571, 80.73, 22.0, 4.952
00246 },{ 3.114, 0.5236, 76.67, 7.62, 6.385
00247 },{ 3.114, 0.5236, 76.67, 7.62, 7.502
00248 },{ 3.114, 0.5236, 76.67, 7.62, 8.514
00249 },{ 5.746, 0.4662, 79.24, 1.185, 7.993
00250 },{ 2.792, 0.6346, 106.1, 0.2986, 2.331
00251 },{ 4.667, 0.5095, 124.3, 2.102, 1.667
00252 },{ 2.44, 0.6346, 105.0, 0.83, 2.851
00253 },{ 1.413, 0.7377, 147.9, 1.466, 1.016
00254 },{ 11.72, 0.3826, 102.8, 9.231, 4.371
00255 },{ 7.126, 0.4804, 119.3, 5.784, 2.454
00256 },{ 11.61, 0.3955, 146.7, 7.031, 1.423
00257 },{ 10.99, 0.41, 163.9, 7.1, 1.052
00258 },{ 9.241, 0.4275, 163.1, 7.954, 1.102
00259 },{ 9.276, 0.418, 157.1, 8.038, 1.29
00260 },{ 3.999, 0.6152, 97.6, 1.297, 5.792
00261 },{ 4.306, 0.5658, 97.99, 5.514, 5.754
00262 },{ 3.615, 0.6197, 86.26, 0.333, 8.689
00263 },{ 5.8, 0.49, 147.2, 6.903, 1.289
00264 },{ 5.6, 0.49, 130.0, 10.0, 2.844
00265 },{ 3.55, 0.6068, 124.7, 1.112, 3.119
00266 },{ 3.6, 0.62, 105.8, 0.1692, 6.026
00267 },{ 5.4, 0.53, 103.1, 3.931, 7.767
00268 },{ 3.97, 0.6459, 131.8, 0.2233, 2.723
00269 },{ 3.65, 0.64, 126.8, 0.6834, 3.411
00270 },{ 3.118, 0.6519, 164.9, 1.208, 1.51
00271 },{ 3.949, 0.6209, 200.5, 1.878, 0.9126
00272 },{ 14.4, 0.3923, 152.5, 8.354, 2.597
00273 },{ 10.99, 0.4599, 138.4, 4.811, 3.726
00274 },{ 16.6, 0.3773, 224.1, 6.28, 0.9121
00275 },{ 10.54, 0.4533, 159.3, 4.832, 2.529
00276 },{ 10.33, 0.4502, 162.0, 5.132, 2.444
00277 },{ 10.15, 0.4471, 165.6, 5.378, 2.328
00278 },{ 9.976, 0.4439, 168.0, 5.721, 2.258
00279 },{ 9.804, 0.4408, 176.2, 5.675, 1.997
00280 },{ 14.22, 0.363, 228.4, 7.024, 1.016
00281 },{ 9.952, 0.4318, 233.5, 5.065, 0.9244
00282 },{ 9.272, 0.4345, 210.0, 4.911, 1.258
00283 },{ 10.13, 0.4146, 225.7, 5.525, 1.055
00284 },{ 8.949, 0.4304, 213.3, 5.071, 1.221
00285 },{ 11.94, 0.3783, 247.2, 6.655, 0.849
00286 },{ 8.472, 0.4405, 195.5, 4.051, 1.604
00287 },{ 8.301, 0.4399, 203.7, 3.667, 1.459
00288 },{ 6.567, 0.4858, 193.0, 2.65, 1.66
00289 },{ 5.951, 0.5016, 196.1, 2.662, 1.589
00290 },{ 7.495, 0.4523, 251.4, 3.433, 0.8619
00291 },{ 6.335, 0.4825, 255.1, 2.834, 0.8228
00292 },{ 4.314, 0.5558, 214.8, 2.354, 1.263
00293 },{ 4.02, 0.5681, 219.9, 2.402, 1.191
00294 },{ 3.836, 0.5765, 210.2, 2.742, 1.305
00295 },{ 4.68, 0.5247, 244.7, 2.749, 0.8962
00296 },{ 3.223, 0.5883, 232.7, 2.954, 1.05
00297 },{ 2.892, 0.6204, 208.6, 2.415, 1.416
00298 },{ 4.728, 0.5522, 217.0, 3.091, 1.386
00299 },{ 6.18, 0.52, 170.0, 4.0, 3.224
00300 },{ 9.0, 0.47, 198.0, 3.8, 2.032
00301 },{ 2.324, 0.6997, 216.0, 1.599, 1.399
00302 },{ 1.961, 0.7286, 223.0, 1.621, 1.296
00303 },{ 1.75, 0.7427, 350.1, 0.9789, 0.5507
00304 },{ 10.31, 0.4613, 261.2, 4.738, 0.9899
00305 },{ 7.962, 0.519, 235.7, 4.347, 1.313
00306 },{ 6.227, 0.5645, 231.9, 3.961, 1.379
00307 },{ 5.246, 0.5947, 228.6, 4.027, 1.432
00308 },{ 5.408, 0.5811, 235.7, 3.961, 1.358
00309 },{ 5.218, 0.5828, 245.0, 3.838, 1.25}
00310 };
00311
00312
00313 if ( T < 0.001 ) {
00314 G4double slow = a[i][0] ;
00315 G4double shigh = std::log( 1.0 + a[i][3]*1000.0 + a[i][4]*0.001 )
00316 * a[i][2]*1000.0 ;
00317 ionloss = slow*shigh / (slow + shigh) ;
00318 ionloss *= std::sqrt(T*1000.0) ;
00319
00320
00321 } else {
00322 G4double slow = a[i][0] * std::pow((T*1000.0), a[i][1]) ;
00323 G4double shigh = std::log( 1.0 + a[i][3]/T + a[i][4]*T ) * a[i][2]/T ;
00324 ionloss = slow*shigh / (slow + shigh) ;
00325
00326 }
00327 if ( ionloss < 0.0) ionloss = 0.0 ;
00328
00329
00330 ionloss /= HeEffChargeSquare(z, kineticEnergy*rateMass) ;
00331
00332 return ionloss;
00333 }
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345