source: trunk/source/processes/electromagnetic/standard/src/G4BraggModel.cc @ 1315

Last change on this file since 1315 was 1315, checked in by garnier, 14 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 27.6 KB
Line 
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// $Id: G4BraggModel.cc,v 1.26 2010/06/04 09:08:43 vnivanch Exp $
27// GEANT4 tag $Name: geant4-09-04-beta-cand-01 $
28//
29// -------------------------------------------------------------------
30//
31// GEANT4 Class file
32//
33//
34// File name:   G4BraggModel
35//
36// Author:        Vladimir Ivanchenko
37//
38// Creation date: 03.01.2002
39//
40// Modifications:
41//
42// 04-12-02 Fix problem of G4DynamicParticle constructor (V.Ivanchenko)
43// 23-12-02 Change interface in order to move to cut per region (V.Ivanchenko)
44// 27-01-03 Make models region aware (V.Ivanchenko)
45// 13-02-03 Add name (V.Ivanchenko)
46// 04-06-03 Fix compilation warnings (V.Ivanchenko)
47// 12-09-04 Add lowestKinEnergy and change order of if in DEDX method (VI)
48// 11-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
49// 16-06-05 Fix problem of chemical formula (V.Ivantchenko)
50// 15-02-06 ComputeCrossSectionPerElectron, ComputeCrossSectionPerAtom (mma)
51// 25-04-06 Add stopping data from PSTAR (V.Ivanchenko)
52// 12-08-08 Added methods GetParticleCharge, GetChargeSquareRatio,
53//          CorrectionsAlongStep needed for ions(V.Ivanchenko)
54
55// Class Description:
56//
57// Implementation of energy loss and delta-electron production by
58// slow charged heavy particles
59
60// -------------------------------------------------------------------
61//
62
63
64//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
65//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
66
67#include "G4BraggModel.hh"
68#include "Randomize.hh"
69#include "G4Electron.hh"
70#include "G4ParticleChangeForLoss.hh"
71#include "G4LossTableManager.hh"
72#include "G4EmCorrections.hh"
73
74//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
75
76using namespace std;
77
78G4BraggModel::G4BraggModel(const G4ParticleDefinition* p, const G4String& nam)
79  : G4VEmModel(nam),
80    particle(0),
81    protonMassAMU(1.007276),
82    iMolecula(0),
83    isIon(false),
84    isInitialised(false)
85{
86  if(p) SetParticle(p);
87  SetHighEnergyLimit(2.0*MeV);
88
89  lowestKinEnergy  = 1.0*keV;
90  theZieglerFactor = eV*cm2*1.0e-15;
91  theElectron = G4Electron::Electron();
92
93  corr = G4LossTableManager::Instance()->EmCorrections();
94}
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
97
98G4BraggModel::~G4BraggModel()
99{}
100
101//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
102
103G4double G4BraggModel::MinEnergyCut(const G4ParticleDefinition*,
104                                    const G4MaterialCutsCouple*)
105{
106  return 0.1*keV;
107  // return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy();
108}
109
110//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
111
112void G4BraggModel::Initialise(const G4ParticleDefinition* p,
113                              const G4DataVector&)
114{
115  if(p != particle) { SetParticle(p); }
116
117  // always false before the run
118  SetDeexcitationFlag(false);
119
120  if(!isInitialised) {
121    isInitialised = true;
122
123    G4String pname = particle->GetParticleName();
124    if(particle->GetParticleType() == "nucleus" && 
125       pname != "deuteron" && pname != "triton") { isIon = true; }
126
127    fParticleChange = GetParticleChangeForLoss();
128  }
129}
130
131//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
132
133G4double G4BraggModel::GetChargeSquareRatio(const G4ParticleDefinition* p,
134                                            const G4Material* mat,
135                                            G4double kineticEnergy)
136{
137  // this method is called only for ions
138  G4double q2 = corr->EffectiveChargeSquareRatio(p,mat,kineticEnergy);
139  GetModelOfFluctuations()->SetParticleAndCharge(p, q2);
140  return q2*corr->EffectiveChargeCorrection(p,mat,kineticEnergy);
141}
142
143//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
144
145G4double G4BraggModel::GetParticleCharge(const G4ParticleDefinition* p,
146                                         const G4Material* mat,
147                                         G4double kineticEnergy)
148{
149  // this method is called only for ions, so no check if it is an ion
150  return corr->GetParticleCharge(p,mat,kineticEnergy);
151}
152
153//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
154
155G4double G4BraggModel::ComputeCrossSectionPerElectron(
156                                           const G4ParticleDefinition* p,
157                                                 G4double kineticEnergy,
158                                                 G4double cutEnergy,
159                                                 G4double maxKinEnergy)
160{
161  G4double cross     = 0.0;
162  G4double tmax      = MaxSecondaryEnergy(p, kineticEnergy);
163  G4double maxEnergy = std::min(tmax,maxKinEnergy);
164  if(cutEnergy < maxEnergy) {
165
166    G4double energy  = kineticEnergy + mass;
167    G4double energy2 = energy*energy;
168    G4double beta2   = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2;
169    cross = 1.0/cutEnergy - 1.0/maxEnergy - beta2*log(maxEnergy/cutEnergy)/tmax;
170
171    cross *= twopi_mc2_rcl2*chargeSquare/beta2;
172  }
173 //   G4cout << "BR: e= " << kineticEnergy << " tmin= " << cutEnergy
174 //          << " tmax= " << tmax << " cross= " << cross << G4endl;
175 
176  return cross;
177}
178
179//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
180
181G4double G4BraggModel::ComputeCrossSectionPerAtom(
182                                           const G4ParticleDefinition* p,
183                                                 G4double kineticEnergy,
184                                                 G4double Z, G4double,
185                                                 G4double cutEnergy,
186                                                 G4double maxEnergy)
187{
188  G4double cross = Z*ComputeCrossSectionPerElectron
189                                         (p,kineticEnergy,cutEnergy,maxEnergy);
190  return cross;
191}
192
193//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
194
195G4double G4BraggModel::CrossSectionPerVolume(
196                                           const G4Material* material,
197                                           const G4ParticleDefinition* p,
198                                                 G4double kineticEnergy,
199                                                 G4double cutEnergy,
200                                                 G4double maxEnergy)
201{
202  G4double eDensity = material->GetElectronDensity();
203  G4double cross = eDensity*ComputeCrossSectionPerElectron
204                                         (p,kineticEnergy,cutEnergy,maxEnergy);
205  return cross;
206}
207
208//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
209
210G4double G4BraggModel::ComputeDEDXPerVolume(const G4Material* material,
211                                            const G4ParticleDefinition* p,
212                                            G4double kineticEnergy,
213                                            G4double cutEnergy)
214{
215  G4double tmax  = MaxSecondaryEnergy(p, kineticEnergy);
216  G4double tkin  = kineticEnergy/massRate;
217  G4double dedx  = 0.0;
218  if(tkin > lowestKinEnergy) { dedx = DEDX(material, tkin); }
219  else { dedx = DEDX(material, lowestKinEnergy)*sqrt(tkin/lowestKinEnergy); }
220
221  if (cutEnergy < tmax) {
222
223    G4double tau   = kineticEnergy/mass;
224    G4double gam   = tau + 1.0;
225    G4double bg2   = tau * (tau+2.0);
226    G4double beta2 = bg2/(gam*gam);
227    G4double x     = cutEnergy/tmax;
228
229    dedx += (log(x) + (1.0 - x)*beta2) * twopi_mc2_rcl2
230          * (material->GetElectronDensity())/beta2;
231  }
232
233  // now compute the total ionization loss
234
235  if (dedx < 0.0) dedx = 0.0 ;
236
237  dedx *= chargeSquare;
238
239  return dedx;
240}
241
242//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
243
244void G4BraggModel::SampleSecondaries(vector<G4DynamicParticle*>* vdp,
245                                     const G4MaterialCutsCouple*,
246                                     const G4DynamicParticle* dp,
247                                     G4double xmin,
248                                     G4double maxEnergy)
249{
250  G4double tmax = MaxSecondaryKinEnergy(dp);
251  G4double xmax = std::min(tmax, maxEnergy);
252  if(xmin >= xmax) { return; }
253
254  G4double kineticEnergy = dp->GetKineticEnergy();
255  G4double energy  = kineticEnergy + mass;
256  G4double energy2 = energy*energy;
257  G4double beta2   = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2;
258  G4double grej    = 1.0;
259  G4double deltaKinEnergy, f;
260
261  G4ThreeVector direction = dp->GetMomentumDirection();
262
263  // sampling follows ...
264  do {
265    G4double q = G4UniformRand();
266    deltaKinEnergy = xmin*xmax/(xmin*(1.0 - q) + xmax*q);
267
268    f = 1.0 - beta2*deltaKinEnergy/tmax;
269
270    if(f > grej) {
271        G4cout << "G4BraggModel::SampleSecondary Warning! "
272               << "Majorant " << grej << " < "
273               << f << " for e= " << deltaKinEnergy
274               << G4endl;
275    }
276
277  } while( grej*G4UniformRand() >= f );
278
279  G4double deltaMomentum =
280           sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
281  G4double totMomentum = energy*sqrt(beta2);
282  G4double cost = deltaKinEnergy * (energy + electron_mass_c2) /
283                                   (deltaMomentum * totMomentum);
284  if(cost > 1.0) cost = 1.0;
285  G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
286
287  G4double phi = twopi * G4UniformRand() ;
288
289  G4ThreeVector deltaDirection(sint*cos(phi),sint*sin(phi), cost) ;
290  deltaDirection.rotateUz(direction);
291
292  // Change kinematics of primary particle
293  kineticEnergy       -= deltaKinEnergy;
294  G4ThreeVector finalP = direction*totMomentum - deltaDirection*deltaMomentum;
295  finalP               = finalP.unit();
296 
297  fParticleChange->SetProposedKineticEnergy(kineticEnergy);
298  fParticleChange->SetProposedMomentumDirection(finalP);
299
300  // create G4DynamicParticle object for delta ray
301  G4DynamicParticle* delta = new G4DynamicParticle(theElectron,deltaDirection,
302                                                   deltaKinEnergy);
303
304  vdp->push_back(delta);
305}
306
307//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
308
309G4double G4BraggModel::MaxSecondaryEnergy(const G4ParticleDefinition* pd,
310                                          G4double kinEnergy)
311{
312  if(pd != particle) { SetParticle(pd); }
313  G4double tau  = kinEnergy/mass;
314  G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
315                  (1. + 2.0*(tau + 1.)*ratio + ratio*ratio);
316  return tmax;
317}
318
319//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
320
321G4bool G4BraggModel::HasMaterial(const G4Material* material)
322{
323  const size_t numberOfMolecula = 11 ;
324  SetMoleculaNumber(numberOfMolecula) ;
325  G4String chFormula = material->GetChemicalFormula() ;
326
327  // ICRU Report N49, 1993. Power's model for He.
328  static G4String molName[numberOfMolecula] = {
329    "Al_2O_3",                 "CO_2",                      "CH_4",
330    "(C_2H_4)_N-Polyethylene", "(C_2H_4)_N-Polypropylene",  "(C_8H_8)_N",
331    "C_3H_8",                  "SiO_2",                     "H_2O",
332    "H_2O-Gas",                "Graphite" } ;
333
334  // Special treatment for water in gas state
335  const G4State theState = material->GetState() ;
336
337  if( theState == kStateGas && "H_2O" == chFormula) {
338    chFormula = G4String("H_2O-Gas");
339  }
340
341  // Search for the material in the table
342  for (size_t i=0; i<numberOfMolecula; i++) {
343      if (chFormula == molName[i]) {
344        SetMoleculaNumber(i) ;
345        return true ;
346      }
347  }
348  return false ;
349}
350
351//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
352
353G4double G4BraggModel::StoppingPower(const G4Material* material,
354                                           G4double kineticEnergy) 
355{
356  G4double ionloss = 0.0 ;
357
358  if (iMolecula < 11) {
359 
360    // The data and the fit from:
361    // ICRU Report N49, 1993. Ziegler's model for protons.
362    // Proton kinetic energy for parametrisation (keV/amu) 
363
364    G4double T = kineticEnergy/(keV*protonMassAMU) ; 
365
366     static G4double a[11][5] = {
367   {1.187E+1, 1.343E+1, 1.069E+4, 7.723E+2, 2.153E-2},
368   {7.802E+0, 8.814E+0, 8.303E+3, 7.446E+2, 7.966E-3}, 
369   {7.294E+0, 8.284E+0, 5.010E+3, 4.544E+2, 8.153E-3}, 
370   {8.646E+0, 9.800E+0, 7.066E+3, 4.581E+2, 9.383E-3}, 
371   {1.286E+1, 1.462E+1, 5.625E+3, 2.621E+3, 3.512E-2}, 
372   {3.229E+1, 3.696E+1, 8.918E+3, 3.244E+3, 1.273E-1}, 
373   {1.604E+1, 1.825E+1, 6.967E+3, 2.307E+3, 3.775E-2}, 
374   {8.049E+0, 9.099E+0, 9.257E+3, 3.846E+2, 1.007E-2},
375   {4.015E+0, 4.542E+0, 3.955E+3, 4.847E+2, 7.904E-3}, 
376   {4.571E+0, 5.173E+0, 4.346E+3, 4.779E+2, 8.572E-3},
377   {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2} };
378
379     static G4double atomicWeight[11] = {
380    101.96128, 44.0098, 16.0426, 28.0536, 42.0804,
381    104.1512, 44.665, 60.0843, 18.0152, 18.0152, 12.0};       
382
383    if ( T < 10.0 ) {
384      ionloss = a[iMolecula][0] * sqrt(T) ;
385   
386    } else if ( T < 10000.0 ) {
387      G4double slow  = a[iMolecula][1] * pow(T, 0.45) ;
388      G4double shigh = log( 1.0 + a[iMolecula][3]/
389                     + a[iMolecula][4]*T ) * a[iMolecula][2]/T ;
390      ionloss = slow*shigh / (slow + shigh) ;     
391    } 
392
393    if ( ionloss < 0.0) ionloss = 0.0 ;
394    if ( 10 == iMolecula ) { 
395      if (T < 100.0) {
396        ionloss *= (1.0+0.023+0.0066*log10(T)); 
397      }
398      else if (T < 700.0) {   
399        ionloss *=(1.0+0.089-0.0248*log10(T-99.));
400      } 
401      else if (T < 10000.0) {   
402        ionloss *=(1.0+0.089-0.0248*log10(700.-99.));
403      }
404    }
405    ionloss /= atomicWeight[iMolecula];
406
407  // pure material (normally not the case for this function)
408  } else if(1 == (material->GetNumberOfElements())) {
409    G4double z = material->GetZ() ;
410    ionloss = ElectronicStoppingPower( z, kineticEnergy ) ; 
411  }
412 
413  return ionloss;
414}
415
416//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
417
418G4double G4BraggModel::ElectronicStoppingPower(G4double z,
419                                               G4double kineticEnergy) const
420{
421  G4double ionloss ;
422  G4int i = G4int(z)-1 ;  // index of atom
423  if(i < 0)  i = 0 ;
424  if(i > 91) i = 91 ;
425 
426  // The data and the fit from:
427  // ICRU Report 49, 1993. Ziegler's type of parametrisations.
428  // Proton kinetic energy for parametrisation (keV/amu) 
429
430  G4double T = kineticEnergy/(keV*protonMassAMU) ; 
431 
432  static G4double a[92][5] = {
433   {1.254E+0, 1.440E+0, 2.426E+2, 1.200E+4, 1.159E-1},
434   {1.229E+0, 1.397E+0, 4.845E+2, 5.873E+3, 5.225E-2},
435   {1.411E+0, 1.600E+0, 7.256E+2, 3.013E+3, 4.578E-2},
436   {2.248E+0, 2.590E+0, 9.660E+2, 1.538E+2, 3.475E-2},
437   {2.474E+0, 2.815E+0, 1.206E+3, 1.060E+3, 2.855E-2},
438   {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2},
439   {2.954E+0, 3.350E+0, 1.683E+3, 1.900E+3, 2.513E-2},
440   {2.652E+0, 3.000E+0, 1.920E+3, 2.000E+3, 2.230E-2},
441   {2.085E+0, 2.352E+0, 2.157E+3, 2.634E+3, 1.816E-2},
442   {1.951E+0, 2.199E+0, 2.393E+3, 2.699E+3, 1.568E-2},
443       // Z= 11-20
444   {2.542E+0, 2.869E+0, 2.628E+3, 1.854E+3, 1.472E-2},
445   {3.791E+0, 4.293E+0, 2.862E+3, 1.009E+3, 1.397E-2},
446   {4.154E+0, 4.739E+0, 2.766E+3, 1.645E+2, 2.023E-2},
447   {4.914E+0, 5.598E+0, 3.193E+3, 2.327E+2, 1.419E-2},
448   {3.232E+0, 3.647E+0, 3.561E+3, 1.560E+3, 1.267E-2},
449   {3.447E+0, 3.891E+0, 3.792E+3, 1.219E+3, 1.211E-2},
450   {5.301E+0, 6.008E+0, 3.969E+3, 6.451E+2, 1.183E-2},
451   {5.731E+0, 6.500E+0, 4.253E+3, 5.300E+2, 1.123E-2},
452   {5.152E+0, 5.833E+0, 4.482E+3, 5.457E+2, 1.129E-2},
453   {5.521E+0, 6.252E+0, 4.710E+3, 5.533E+2, 1.112E-2},
454       // Z= 21-30
455   {5.201E+0, 5.884E+0, 4.938E+3, 5.609E+2, 9.995E-3},
456   {4.858E+0, 5.489E+0, 5.260E+3, 6.511E+2, 8.930E-3},
457   {4.479E+0, 5.055E+0, 5.391E+3, 9.523E+2, 9.117E-3},
458   {3.983E+0, 4.489E+0, 5.616E+3, 1.336E+3, 8.413E-3},
459   {3.469E+0, 3.907E+0, 5.725E+3, 1.461E+3, 8.829E-3},
460   {3.519E+0, 3.963E+0, 6.065E+3, 1.243E+3, 7.782E-3},
461   {3.140E+0, 3.535E+0, 6.288E+3, 1.372E+3, 7.361E-3},
462   {3.553E+0, 4.004E+0, 6.205E+3, 5.551E+2, 8.763E-3},
463   {3.696E+0, 4.194E+0, 4.649E+3, 8.113E+1, 2.242E-2},
464   {4.210E+0, 4.750E+0, 6.953E+3, 2.952E+2, 6.809E-3},
465       // Z= 31-40
466   {5.041E+0, 5.697E+0, 7.173E+3, 2.026E+2, 6.725E-3},
467   {5.554E+0, 6.300E+0, 6.496E+3, 1.100E+2, 9.689E-3},
468   {5.323E+0, 6.012E+0, 7.611E+3, 2.925E+2, 6.447E-3},
469   {5.874E+0, 6.656E+0, 7.395E+3, 1.175E+2, 7.684E-3},
470   {6.658E+0, 7.536E+0, 7.694E+3, 2.223E+2, 6.509E-3},
471   {6.413E+0, 7.240E+0, 1.185E+4, 1.537E+2, 2.880E-3},
472   {5.694E+0, 6.429E+0, 8.478E+3, 2.929E+2, 6.087E-3},
473   {6.339E+0, 7.159E+0, 8.693E+3, 3.303E+2, 6.003E-3},
474   {6.407E+0, 7.234E+0, 8.907E+3, 3.678E+2, 5.889E-3},
475   {6.734E+0, 7.603E+0, 9.120E+3, 4.052E+2, 5.765E-3},
476       // Z= 41-50
477   {6.901E+0, 7.791E+0, 9.333E+3, 4.427E+2, 5.587E-3},
478   {6.424E+0, 7.248E+0, 9.545E+3, 4.802E+2, 5.376E-3},
479   {6.799E+0, 7.671E+0, 9.756E+3, 5.176E+2, 5.315E-3},
480   {6.109E+0, 6.887E+0, 9.966E+3, 5.551E+2, 5.151E-3},
481   {5.924E+0, 6.677E+0, 1.018E+4, 5.925E+2, 4.919E-3},
482   {5.238E+0, 5.900E+0, 1.038E+4, 6.300E+2, 4.758E-3},
483   // {5.623,    6.354,    7160.0,   337.6,    0.013940}, // Ag Ziegler77
484   {5.345E+0, 6.038E+0, 6.790E+3, 3.978E+2, 1.676E-2}, // Ag ICRU49
485   {5.814E+0, 6.554E+0, 1.080E+4, 3.555E+2, 4.626E-3},
486   {6.229E+0, 7.024E+0, 1.101E+4, 3.709E+2, 4.540E-3},
487   {6.409E+0, 7.227E+0, 1.121E+4, 3.864E+2, 4.474E-3},
488       // Z= 51-60
489   {7.500E+0, 8.480E+0, 8.608E+3, 3.480E+2, 9.074E-3},
490   {6.979E+0, 7.871E+0, 1.162E+4, 3.924E+2, 4.402E-3},
491   {7.725E+0, 8.716E+0, 1.183E+4, 3.948E+2, 4.376E-3},
492   {8.337E+0, 9.425E+0, 1.051E+4, 2.696E+2, 6.206E-3},
493   {7.287E+0, 8.218E+0, 1.223E+4, 3.997E+2, 4.447E-3},
494   {7.899E+0, 8.911E+0, 1.243E+4, 4.021E+2, 4.511E-3},
495   {8.041E+0, 9.071E+0, 1.263E+4, 4.045E+2, 4.540E-3},
496   {7.488E+0, 8.444E+0, 1.283E+4, 4.069E+2, 4.420E-3},
497   {7.291E+0, 8.219E+0, 1.303E+4, 4.093E+2, 4.298E-3},
498   {7.098E+0, 8.000E+0, 1.323E+4, 4.118E+2, 4.182E-3},
499       // Z= 61-70
500   {6.909E+0, 7.786E+0, 1.343E+4, 4.142E+2, 4.058E-3},
501   {6.728E+0, 7.580E+0, 1.362E+4, 4.166E+2, 3.976E-3},
502   {6.551E+0, 7.380E+0, 1.382E+4, 4.190E+2, 3.877E-3},
503   {6.739E+0, 7.592E+0, 1.402E+4, 4.214E+2, 3.863E-3},
504   {6.212E+0, 6.996E+0, 1.421E+4, 4.239E+2, 3.725E-3},
505   {5.517E+0, 6.210E+0, 1.440E+4, 4.263E+2, 3.632E-3},
506   {5.220E+0, 5.874E+0, 1.460E+4, 4.287E+2, 3.498E-3},
507   {5.071E+0, 5.706E+0, 1.479E+4, 4.330E+2, 3.405E-3},
508   {4.926E+0, 5.542E+0, 1.498E+4, 4.335E+2, 3.342E-3},
509   {4.788E+0, 5.386E+0, 1.517E+4, 4.359E+2, 3.292E-3},
510       // Z= 71-80
511   {4.893E+0, 5.505E+0, 1.536E+4, 4.384E+2, 3.243E-3},
512   {5.028E+0, 5.657E+0, 1.555E+4, 4.408E+2, 3.195E-3},
513   {4.738E+0, 5.329E+0, 1.574E+4, 4.432E+2, 3.186E-3},
514   {4.587E+0, 5.160E+0, 1.541E+4, 4.153E+2, 3.406E-3},
515   {5.201E+0, 5.851E+0, 1.612E+4, 4.416E+2, 3.122E-3},
516   {5.071E+0, 5.704E+0, 1.630E+4, 4.409E+2, 3.082E-3},
517   {4.946E+0, 5.563E+0, 1.649E+4, 4.401E+2, 2.965E-3},
518   {4.477E+0, 5.034E+0, 1.667E+4, 4.393E+2, 2.871E-3},
519   //  {4.856,    5.460,    18320.0,  438.5,    0.002542}, //Ziegler77
520   {4.844E+0, 5.458E+0, 7.852E+3, 9.758E+2, 2.077E-2}, //ICRU49
521   {4.307E+0, 4.843E+0, 1.704E+4, 4.878E+2, 2.882E-3},
522       // Z= 81-90
523   {4.723E+0, 5.311E+0, 1.722E+4, 5.370E+2, 2.913E-3},
524   {5.319E+0, 5.982E+0, 1.740E+4, 5.863E+2, 2.871E-3},
525   {5.956E+0, 6.700E+0, 1.780E+4, 6.770E+2, 2.660E-3},
526   {6.158E+0, 6.928E+0, 1.777E+4, 5.863E+2, 2.812E-3},
527   {6.203E+0, 6.979E+0, 1.795E+4, 5.863E+2, 2.776E-3},
528   {6.181E+0, 6.954E+0, 1.812E+4, 5.863E+2, 2.748E-3},
529   {6.949E+0, 7.820E+0, 1.830E+4, 5.863E+2, 2.737E-3},
530   {7.506E+0, 8.448E+0, 1.848E+4, 5.863E+2, 2.727E-3},
531   {7.648E+0, 8.609E+0, 1.866E+4, 5.863E+2, 2.697E-3},
532   {7.711E+0, 8.679E+0, 1.883E+4, 5.863E+2, 2.641E-3},
533       // Z= 91-92
534   {7.407E+0, 8.336E+0, 1.901E+4, 5.863E+2, 2.603E-3},
535   {7.290E+0, 8.204E+0, 1.918E+4, 5.863E+2, 2.673E-3}
536  };
537
538  G4double fac = 1.0 ;
539
540    // Carbon specific case for E < 40 keV
541  if ( T < 40.0 && 5 == i) {
542    fac = sqrt(T/40.0) ;
543    T = 40.0 ; 
544
545    // Free electron gas model
546  } else if ( T < 10.0 ) { 
547    fac = sqrt(T*0.1) ;
548    T =10.0 ;
549  }
550
551  // Main parametrisation
552  G4double slow  = a[i][1] * pow(T, 0.45) ;
553  G4double shigh = log( 1.0 + a[i][3]/T + a[i][4]*T ) * a[i][2]/T ;
554  ionloss = slow*shigh*fac / (slow + shigh) ;     
555 
556  if ( ionloss < 0.0) ionloss = 0.0 ;
557 
558  return ionloss;
559}
560
561//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
562
563G4double G4BraggModel::DEDX(const G4Material* material,
564                                  G4double kineticEnergy) 
565{
566  G4double eloss = 0.0;
567  const G4int numberOfElements = material->GetNumberOfElements();
568  const G4double* theAtomicNumDensityVector =
569                                 material->GetAtomicNumDensityVector();
570 
571  // compaund material with parametrisation
572  G4int iNist = pstar.GetIndex(material);
573
574  if( iNist >= 0 && kineticEnergy <= 2.01*MeV) {
575    return pstar.GetElectronicDEDX(iNist, kineticEnergy)*material->GetDensity();
576
577  } else if( HasMaterial(material) ) {
578
579    eloss = StoppingPower(material, kineticEnergy)*
580                          material->GetDensity()/amu;
581
582  // pure material
583  } else if(1 == numberOfElements) {
584
585    G4double z = material->GetZ();
586    eloss = ElectronicStoppingPower(z, kineticEnergy)
587                               * (material->GetTotNbOfAtomsPerVolume());
588
589
590  // Experimental data exist only for kinetic energy 125 keV
591  } else if( MolecIsInZiegler1988(material) ) { 
592
593  // Cycle over elements - calculation based on Bragg's rule
594    G4double eloss125 = 0.0 ;
595    const G4ElementVector* theElementVector =
596                           material->GetElementVector();
597 
598    //  loop for the elements in the material
599    for (G4int i=0; i<numberOfElements; i++) {
600      const G4Element* element = (*theElementVector)[i] ;
601      G4double z = element->GetZ() ;
602      eloss    += ElectronicStoppingPower(z,kineticEnergy)
603                                    * theAtomicNumDensityVector[i] ;
604      eloss125 += ElectronicStoppingPower(z,125.0*keV)
605                                    * theAtomicNumDensityVector[i] ;
606    }     
607
608    // Chemical factor is taken into account
609    eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
610 
611  // Brugg's rule calculation
612  } else {
613    const G4ElementVector* theElementVector =
614                           material->GetElementVector() ;
615 
616    //  loop for the elements in the material
617    for (G4int i=0; i<numberOfElements; i++)
618    {
619      const G4Element* element = (*theElementVector)[i] ;
620      eloss   += ElectronicStoppingPower(element->GetZ(), kineticEnergy)
621                                   * theAtomicNumDensityVector[i];
622    }     
623  }
624  return eloss*theZieglerFactor;
625}
626
627//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
628
629G4bool G4BraggModel::MolecIsInZiegler1988(const G4Material* material) 
630{
631  // The list of molecules from
632  // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
633  // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
634 
635  G4String myFormula = G4String(" ") ;
636  const G4String chFormula = material->GetChemicalFormula() ;
637  if (myFormula == chFormula ) return false ;
638 
639  //  There are no evidence for difference of stopping power depended on
640  //  phase of the compound except for water. The stopping power of the
641  //  water in gas phase can be predicted using Bragg's rule.
642  // 
643  //  No chemical factor for water-gas
644   
645  myFormula = G4String("H_2O") ;
646  const G4State theState = material->GetState() ;
647  if( theState == kStateGas && myFormula == chFormula) return false ;
648   
649  const size_t numberOfMolecula = 53 ;
650
651  // The coffecient from Table.4 of Ziegler & Manoyan
652  const G4double HeEff = 2.8735 ;
653 
654  static G4String nameOfMol[numberOfMolecula] = {
655    "H_2O",      "C_2H_4O",    "C_3H_6O",  "C_2H_2",             "C_H_3OH",
656    "C_2H_5OH",  "C_3H_7OH",   "C_3H_4",   "NH_3",               "C_14H_10",
657    "C_6H_6",    "C_4H_10",    "C_4H_6",   "C_4H_8O",            "CCl_4",
658    "CF_4",      "C_6H_8",     "C_6H_12",  "C_6H_10O",           "C_6H_10",
659    "C_8H_16",   "C_5H_10",    "C_5H_8",   "C_3H_6-Cyclopropane","C_2H_4F_2",
660    "C_2H_2F_2", "C_4H_8O_2",  "C_2H_6",   "C_2F_6",             "C_2H_6O",
661    "C_3H_6O",   "C_4H_10O",   "C_2H_4",   "C_2H_4O",            "C_2H_4S",
662    "SH_2",      "CH_4",       "CCLF_3",   "CCl_2F_2",           "CHCl_2F",
663    "(CH_3)_2S", "N_2O",       "C_5H_10O", "C_8H_6",             "(CH_2)_N",
664    "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8",   "C_3H_6-Propylene",   "C_3H_6O",
665    "C_3H_6S",   "C_4H_4S",    "C_7H_8"
666  } ;
667
668  static G4double expStopping[numberOfMolecula] = {
669     66.1,  190.4, 258.7,  42.2, 141.5,
670    210.9,  279.6, 198.8,  31.0, 267.5,
671    122.8,  311.4, 260.3, 328.9, 391.3,
672    206.6,  374.0, 422.0, 432.0, 398.0,
673    554.0,  353.0, 326.0,  74.6, 220.5,
674    197.4,  362.0, 170.0, 330.5, 211.3,
675    262.3,  349.6,  51.3, 187.0, 236.9,
676    121.9,   35.8, 247.0, 292.6, 268.0,
677    262.3,   49.0, 398.9, 444.0,  22.91,
678     68.0,  155.0,  84.0,  74.2, 254.7,
679    306.8,  324.4, 420.0
680  } ;
681
682  static G4double expCharge[numberOfMolecula] = {
683    HeEff, HeEff, HeEff,   1.0, HeEff,
684    HeEff, HeEff, HeEff,   1.0,   1.0,
685      1.0, HeEff, HeEff, HeEff, HeEff,
686    HeEff, HeEff, HeEff, HeEff, HeEff,
687    HeEff, HeEff, HeEff,   1.0, HeEff,
688    HeEff, HeEff, HeEff, HeEff, HeEff,
689    HeEff, HeEff,   1.0, HeEff, HeEff,
690    HeEff,   1.0, HeEff, HeEff, HeEff,
691    HeEff,   1.0, HeEff, HeEff,   1.0,
692      1.0,   1.0,   1.0,   1.0, HeEff,
693    HeEff, HeEff, HeEff
694  } ;
695
696  static G4double numberOfAtomsPerMolecula[numberOfMolecula] = {
697    3.0,  7.0, 10.0,  4.0,  6.0,
698    9.0, 12.0,  7.0,  4.0, 24.0,
699    12.0, 14.0, 10.0, 13.0,  5.0,
700    5.0, 14.0, 18.0, 17.0, 17.0,
701    24.0, 15.0, 13.0,  9.0,  8.0,
702    6.0, 14.0,  8.0,  8.0,  9.0,
703    10.0, 15.0,  6.0,  7.0,  7.0,
704    3.0,  5.0,  5.0,  5.0,  5.0,
705    9.0,  3.0, 16.0, 14.0,  3.0,
706    9.0, 16.0, 11.0,  9.0, 10.0,
707    10.0,  9.0, 15.0
708  } ;
709
710  // Search for the compaund in the table
711  for (size_t i=0; i<numberOfMolecula; i++)
712    {
713      if(chFormula == nameOfMol[i]) {
714        G4double exp125 = expStopping[i] *
715                          (material->GetTotNbOfAtomsPerVolume()) /
716                          (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
717        SetExpStopPower125(exp125);
718        return true;
719      }
720    }
721 
722  return false;
723}
724
725//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
726
727G4double G4BraggModel::ChemicalFactor(G4double kineticEnergy, 
728                                      G4double eloss125) const
729{
730  // Approximation of Chemical Factor according to
731  // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
732  // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
733 
734  G4double gamma    = 1.0 + kineticEnergy/proton_mass_c2 ;   
735  G4double gamma25  = 1.0 + 25.0*keV /proton_mass_c2 ;
736  G4double gamma125 = 1.0 + 125.0*keV/proton_mass_c2 ;
737  G4double beta     = sqrt(1.0 - 1.0/(gamma*gamma)) ;
738  G4double beta25   = sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
739  G4double beta125  = sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
740 
741  G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) *
742                   (1.0 + exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
743                   (1.0 + exp( 1.48 * ( beta/beta25    - 7.0 ) ) ) ;
744
745  return factor ;
746}
747
748//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
749
Note: See TracBrowser for help on using the repository browser.