Geant4  10.02
G4IonisParamMat.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 // $Id: G4IonisParamMat.cc 93568 2015-10-26 14:52:36Z gcosmo $
27 //
28 //
29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
30 
31 // 09-07-98, data moved from G4Material, M.Maire
32 // 18-07-98, bug corrected in ComputeDensityEffect() for gas
33 // 16-01-01, bug corrected in ComputeDensityEffect() E100eV (L.Urban)
34 // 08-02-01, fShellCorrectionVector correctly handled (mma)
35 // 28-10-02, add setMeanExcitationEnergy (V.Ivanchenko)
36 // 06-09-04, factor 2 to shell correction term (V.Ivanchenko)
37 // 10-05-05, add a missing coma in FindMeanExcitationEnergy() - Bug#746 (mma)
38 // 27-09-07, add computation of parameters for ions (V.Ivanchenko)
39 // 04-03-08, remove reference to G4NistManager. Add fBirks constant (mma)
40 // 30-10-09, add G4DensityEffectData class and density effect computation (VI)
41 
42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
43 
44 #include "G4IonisParamMat.hh"
45 #include "G4Material.hh"
46 #include "G4DensityEffectData.hh"
47 #include "G4NistManager.hh"
48 #include "G4Pow.hh"
49 #include "G4PhysicalConstants.hh"
50 #include "G4SystemOfUnits.hh"
51 
53 
54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
55 
57  : fMaterial(material)
58 {
59  fBirks = 0.;
60  fMeanEnergyPerIon = 0.0;
61  twoln10 = 2.*G4Pow::GetInstance()->logZ(10);
62 
63  // minimal set of default parameters for density effect
64  fCdensity = 0.0;
65  fD0density = 0.0;
66  fAdjustmentFactor = 1.0;
68 
69  // compute parameters
74 }
75 
76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
77 
78 // Fake default constructor - sets only member data and allocates memory
79 // for usage restricted to object persistency
80 
82  : fMaterial(0), fShellCorrectionVector(0)
83 {
85  fLogMeanExcEnergy = 0.0;
86  fTaul = 0.0;
87  fCdensity = 0.0;
88  fMdensity = 0.0;
89  fAdensity = 0.0;
90  fX0density = 0.0;
91  fX1density = 0.0;
92  fD0density = 0.0;
93  fPlasmaEnergy = 0.0;
94  fAdjustmentFactor = 0.0;
95  fF1fluct = 0.0;
96  fF2fluct = 0.0;
97  fEnergy1fluct = 0.0;
98  fLogEnergy1fluct = 0.0;
99  fEnergy2fluct = 0.0;
100  fLogEnergy2fluct = 0.0;
101  fEnergy0fluct = 0.0;
102  fRateionexcfluct = 0.0;
103  fZeff = 0.0;
104  fFermiEnergy = 0.0;
105  fLfactor = 0.0;
106  fInvA23 = 0.0;
107  fBirks = 0.0;
108  fMeanEnergyPerIon = 0.0;
109  twoln10 = 2.*G4Pow::GetInstance()->logZ(10);
110 
112 }
113 
114 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
115 
117 {
119  if (fDensityData) { delete fDensityData; }
120  fDensityData = 0;
122 }
123 
124 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
125 
127 {
128  // compute mean excitation energy and shell correction vector
129  fTaul = (*(fMaterial->GetElementVector()))[0]->GetIonisation()->GetTaul();
130 
132  fLogMeanExcEnergy = 0.;
133 
134  size_t nElements = fMaterial->GetNumberOfElements();
135  const G4ElementVector* elmVector = fMaterial->GetElementVector();
136  const G4double* nAtomsPerVolume = fMaterial->GetVecNbOfAtomsPerVolume();
137 
139 
140  if(ch != "") { fMeanExcitationEnergy = FindMeanExcitationEnergy(ch); }
141 
142  // Chemical formula defines mean excitation energy
143  if(fMeanExcitationEnergy > 0.0) {
145 
146  // Compute average
147  } else {
148  for (size_t i=0; i < nElements; i++) {
149  const G4Element* elm = (*elmVector)[i];
150  fLogMeanExcEnergy += nAtomsPerVolume[i]*elm->GetZ()
152  }
155  }
156 
158 
159  for (G4int j=0; j<=2; j++)
160  {
161  fShellCorrectionVector[j] = 0.;
162 
163  for (size_t k=0; k<nElements; k++) {
164  fShellCorrectionVector[j] += nAtomsPerVolume[k]
165  *(((*elmVector)[k])->GetIonisation()->GetShellCorrectionVector())[j];
166  }
168  }
169 }
170 
171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
172 
174 {
175  return fDensityData;
176 }
177 
178 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
179 
181 {
183 
184  // Check if density effect data exist in the table
185  // R.M. Sternheimer, Atomic Data and Nuclear Data Tables, 30: 261 (1984)
188  G4int Z0 = G4lrint((*(fMaterial->GetElementVector()))[0]->GetZ());
189 
190  // for simple non-NIST materials
191  G4double corr = 0.0;
192  if(idx < 0 && 1 == nelm) {
194 
195  // Correction for base material or for non-nominal density
196  // Except cases of very different density defined in user code
197  if(idx >= 0) {
198  const G4Material* bmat = fMaterial->GetBaseMaterial();
199  if(bmat) {
200  corr = G4Log(bmat->GetDensity()/fMaterial->GetDensity());
201  } else {
203  if(dens <= 0.0) { idx = -1; }
204  else {
205  corr = G4Log(dens/fMaterial->GetDensity());
206  }
207  }
208  // 1.0 is an arbitrary empirical limit
209  // parameterisation with very different density is not applicable
210  if(std::abs(corr) > 1.0) { idx = -1; }
211  }
212  }
213 
214  //G4cout<<"DensityEffect for "<<fMaterial->GetName()<<" "<< idx << G4endl;
215 
216  if(idx >= 0) {
217 
218  // Take parameters for the density effect correction from
219  // R.M. Sternheimer et al. Density Effect For The Ionization Loss
220  // of Charged Particles in Various Substances.
221  // Atom. Data Nucl. Data Tabl. 30 (1984) 261-271.
222 
231 
232  // correction on nominal density
233  fCdensity += corr;
234  fX0density += corr/twoln10;
235  fX1density += corr/twoln10;
236 
237  } else {
238 
239  static const G4double Cd2 = 4*pi*hbarc_squared*classic_electr_radius;
241 
242  // Compute parameters for the density effect correction in DE/Dx formula.
243  // The parametrization is from R.M. Sternheimer, Phys. Rev.B,3:3681 (1971)
244  G4int icase;
245 
247  //
248  // condensed materials
249  //
250  if ((State == kStateSolid)||(State == kStateLiquid)) {
251 
252  static const G4double E100eV = 100.*eV;
253  static const G4double ClimiS[] = {3.681 , 5.215 };
254  static const G4double X0valS[] = {1.0 , 1.5 };
255  static const G4double X1valS[] = {2.0 , 3.0 };
256 
257  if(fMeanExcitationEnergy < E100eV) { icase = 0; }
258  else { icase = 1; }
259 
260  if(fCdensity < ClimiS[icase]) { fX0density = 0.2; }
261  else { fX0density = 0.326*fCdensity - X0valS[icase]; }
262 
263  fX1density = X1valS[icase]; fMdensity = 3.0;
264 
265  //special: Hydrogen
266  if (1 == nelm && 1 == Z0) {
267  fX0density = 0.425; fX1density = 2.0; fMdensity = 5.949;
268  }
269  }
270  //
271  // gases
272  //
273  if (State == kStateGas) {
274 
275  fMdensity = 3.;
276  fX1density = 4.0;
277  //static const G4double ClimiG[] = {10.,10.5,11.,11.5,12.25,13.804};
278  //static const G4double X0valG[] = {1.6,1.7,1.8,1.9,2.0,2.0};
279  //static const G4double X1valG[] = {4.0,4.0,4.0,4.0,4.0,5.0};
280 
281  if(fCdensity < 10.) {
282  fX0density = 1.6;
283  } else if(fCdensity < 11.5) {
284  fX0density = 1.6 + 0.2*(fCdensity - 10.);
285  } else if(fCdensity < 12.25) {
286  fX0density = 1.9 + (fCdensity - 11.5)/7.5;
287  } else if(fCdensity < 13.804) {
288  fX0density = 2.0;
289  fX1density = 4.0 + (fCdensity - 12.25)/1.554;
290  } else {
291  fX0density = 0.326*fCdensity-2.5; fX1density = 5.0;
292  }
293 
294  //special: Hydrogen
295  if (1 == nelm && 1 == Z0) {
296  fX0density = 1.837; fX1density = 3.0; fMdensity = 4.754;
297  }
298 
299  //special: Helium
300  if (1 == nelm && 2 == Z0) {
301  fX0density = 2.191; fX1density = 3.0; fMdensity = 3.297;
302  }
303  }
304  }
305 
306  // change parameters if the gas is not in STP.
307  // For the correction the density(STP) is needed.
308  // Density(STP) is calculated here :
309 
310 
311  if (State == kStateGas) {
312  G4double Density = fMaterial->GetDensity();
313  G4double Pressure = fMaterial->GetPressure();
315 
316  G4double DensitySTP = Density*STP_Pressure*Temp/(Pressure*NTP_Temperature);
317 
318  G4double ParCorr = G4Log(Density/DensitySTP);
319 
320  fCdensity -= ParCorr;
321  fX0density -= ParCorr/twoln10;
322  fX1density -= ParCorr/twoln10;
323  }
324 
325  // fAdensity parameter can be fixed for not conductive materials
326  if(0.0 == fD0density) {
329  /std::pow((fX1density-fX0density),fMdensity);
330  }
331  /*
332  G4cout << "G4IonisParamMat: density effect data for <"
333  << fMaterial->GetName()
334  << "> " << G4endl;
335  G4cout << "Eplasma(eV)= " << fPlasmaEnergy/eV
336  << " rho= " << fAdjustmentFactor
337  << " -C= " << fCdensity
338  << " x0= " << fX0density
339  << " x1= " << fX1density
340  << " a= " << fAdensity
341  << " m= " << fMdensity
342  << G4endl;
343  */
344 }
345 
346 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
347 
349 {
350  // compute parameters for the energy loss fluctuation model
351  // needs an 'effective Z'
352  G4double Zeff = 0.;
353  for (size_t i=0;i<fMaterial->GetNumberOfElements();i++) {
354  Zeff += (fMaterial->GetFractionVector())[i]
355  *((*(fMaterial->GetElementVector()))[i]->GetZ());
356  }
357  if (Zeff > 2.) { fF2fluct = 2./Zeff; }
358  else { fF2fluct = 0.; }
359 
360  fF1fluct = 1. - fF2fluct;
361  fEnergy2fluct = 10.*Zeff*Zeff*eV;
364  /fF1fluct;
366  fEnergy0fluct = 10.*eV;
367  fRateionexcfluct = 0.4;
368 }
369 
370 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
371 
373 {
374  // get elements in the actual material,
375  const G4ElementVector* theElementVector = fMaterial->GetElementVector() ;
376  const G4double* theAtomicNumDensityVector =
378  const G4int NumberOfElements = fMaterial->GetNumberOfElements() ;
379 
380  // loop for the elements in the material
381  // to find out average values Z, vF, lF
382  G4double z(0.0), vF(0.0), lF(0.0), norm(0.0), a23(0.0);
383 
384  G4Pow* g4pow = G4Pow::GetInstance();
385  if( 1 == NumberOfElements ) {
386  const G4Element* element = (*theElementVector)[0];
387  z = element->GetZ();
388  vF= element->GetIonisation()->GetFermiVelocity();
389  lF= element->GetIonisation()->GetLFactor();
390  a23 = 1.0/g4pow->A23(element->GetN());
391 
392  } else {
393  for (G4int iel=0; iel<NumberOfElements; iel++)
394  {
395  const G4Element* element = (*theElementVector)[iel];
396  const G4double weight = theAtomicNumDensityVector[iel];
397  norm += weight ;
398  z += element->GetZ() * weight;
399  vF += element->GetIonisation()->GetFermiVelocity() * weight;
400  lF += element->GetIonisation()->GetLFactor() * weight;
401  a23 += weight/g4pow->A23(element->GetN());
402  }
403  z /= norm;
404  vF /= norm;
405  lF /= norm;
406  a23 /= norm;
407  }
408  fZeff = z;
409  fLfactor = lF;
410  fFermiEnergy = 25.*keV*vF*vF;
411  fInvA23 = a23;
412 }
413 
414 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
415 
417 {
418  if(value == fMeanExcitationEnergy || value <= 0.0) { return; }
419  if (G4NistManager::Instance()->GetVerbose() > 1) {
420  G4cout << "G4Material: Mean excitation energy is changed for "
421  << fMaterial->GetName()
422  << " Iold= " << fMeanExcitationEnergy/eV
423  << "eV; Inew= " << value/eV << " eV;"
424  << G4endl;
425  }
426 
427  fMeanExcitationEnergy = value;
428 
429  // add corrections to density effect
430  G4double newlog = G4Log(value);
431  G4double corr = 2*(newlog - fLogMeanExcEnergy);
432  fCdensity += corr;
433  fX0density += corr/twoln10;
434  fX1density += corr/twoln10;
435 
436  // recompute parameters of fluctuation model
437  fLogMeanExcEnergy = newlog;
439 }
440 
441 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
442 
444 {
445  // The data on mean excitation energy for compaunds
446  // from "Stopping Powers for Electrons and Positrons"
447  // ICRU Report N#37, 1984 (energy in eV)
448 
449  size_t numberOfMolecula = 54;
450  static const G4String name[54] = {
451  // gas 0 - 12
452  "NH_3", "C_4H_10", "CO_2", "C_2H_6", "C_7H_16-Gas",
453  // "G4_AMMONIA", "G4_BUTANE","G4_CARBON_DIOXIDE","G4_ETHANE", "G4_N-HEPTANE"
454  "C_6H_14-Gas", "CH_4", "NO", "N_2O", "C_8H_18-Gas",
455  // "G4_N-HEXANE" , "G4_METHANE", "x", "G4_NITROUS_OXIDE", "G4_OCTANE"
456  "C_5H_12-Gas", "C_3H_8", "H_2O-Gas",
457  // "G4_N-PENTANE", "G4_PROPANE", "G4_WATER_VAPOR"
458 
459  // liquid 13 - 39
460  "C_3H_6O", "C_6H_5NH_2", "C_6H_6", "C_4H_9OH", "CCl_4",
461  //"G4_ACETONE","G4_ANILINE","G4_BENZENE","G4_N-BUTYL_ALCOHOL","G4_CARBON_TETRACHLORIDE"
462  "C_6H_5Cl", "CHCl_3", "C_6H_12", "C_6H_4Cl_2", "C_4Cl_2H_8O",
463  //"G4_CHLOROBENZENE","G4_CHLOROFORM","G4_CYCLOHEXANE","G4_1,2-DICHLOROBENZENE","G4_DICHLORODIETHYL_ETHER"
464  "C_2Cl_2H_4", "(C_2H_5)_2O", "C_2H_5OH", "C_3H_5(OH)_3","C_7H_16",
465  //"G4_1,2-DICHLOROETHANE","G4_DIETHYL_ETHER","G4_ETHYL_ALCOHOL","G4_GLYCEROL","G4_N-HEPTANE"
466  "C_6H_14", "CH_3OH", "C_6H_5NO_2","C_5H_12", "C_3H_7OH",
467  //"G4_N-HEXANE","G4_METHANOL","G4_NITROBENZENE","G4_N-PENTANE","G4_N-PROPYL_ALCOHOL",
468  "C_5H_5N", "C_8H_8", "C_2Cl_4", "C_7H_8", "C_2Cl_3H",
469  //"G4_PYRIDINE","G4_POLYSTYRENE","G4_TETRACHLOROETHYLENE","G4_TOLUENE","G4_TRICHLOROETHYLENE"
470  "H_2O", "C_8H_10",
471  // "G4_WATER", "G4_XYLENE"
472 
473  // solid 40 - 53
474  "C_5H_5N_5", "C_5H_5N_5O", "(C_6H_11NO)-nylon", "C_25H_52",
475  // "G4_ADENINE", "G4_GUANINE", "G4_NYLON-6-6", "G4_PARAFFIN"
476  "(C_2H_4)-Polyethylene", "(C_5H_8O_2)-Polymethil_Methacrylate",
477  // "G4_ETHYLENE", "G4_PLEXIGLASS"
478  "(C_8H_8)-Polystyrene", "A-150-tissue", "Al_2O_3", "CaF_2",
479  // "G4_POLYSTYRENE", "G4_A-150_TISSUE", "G4_ALUMINUM_OXIDE", "G4_CALCIUM_FLUORIDE"
480  "LiF", "Photo_Emulsion", "(C_2F_4)-Teflon", "SiO_2"
481  // "G4_LITHIUM_FLUORIDE", "G4_PHOTO_EMULSION", "G4_TEFLON", "G4_SILICON_DIOXIDE"
482  } ;
483 
484  static const G4double meanExcitation[54] = {
485 
486  53.7, 48.3, 85.0, 45.4, 49.2,
487  49.1, 41.7, 87.8, 84.9, 49.5,
488  48.2, 47.1, 71.6,
489 
490  64.2, 66.2, 63.4, 59.9, 166.3,
491  89.1, 156.0, 56.4, 106.5, 103.3,
492  111.9, 60.0, 62.9, 72.6, 54.4,
493  54.0, 67.6, 75.8, 53.6, 61.1,
494  66.2, 64.0, 159.2, 62.5, 148.1,
495  75.0, 61.8,
496 
497  71.4, 75.0, 63.9, 48.3, 57.4,
498  74.0, 68.7, 65.1, 145.2, 166.,
499  94.0, 331.0, 99.1, 139.2
500  };
501 
503 
504  for(size_t i=0; i<numberOfMolecula; i++) {
505  if(chFormula == name[i]) {
506  x = meanExcitation[i]*eV;
507  break;
508  }
509  }
510  return x;
511 }
512 
513 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... ....oooOO0OOooo....
514 
G4double GetPressure() const
Definition: G4Material.hh:183
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
G4double fLogEnergy2fluct
G4double GetTotNbOfElectPerVolume() const
Definition: G4Material.hh:212
std::vector< G4Element * > G4ElementVector
Definition: G4Pow.hh:56
G4double GetN() const
Definition: G4Element.hh:134
G4int GetElementIndex(G4int Z, G4State mState)
G4State
Definition: G4Material.hh:114
G4double z
Definition: TRTMaterials.hh:39
G4double FindMeanExcitationEnergy(const G4String &chFormula)
static const G4int numberOfMolecula
const G4String & GetChemicalFormula() const
Definition: G4Material.hh:179
void SetMeanExcitationEnergy(G4double value)
G4String name
Definition: TRTMaterials.hh:40
const G4String & GetName() const
Definition: G4Material.hh:178
G4double GetZ() const
Definition: G4Element.hh:131
#define State(X)
G4double fAdjustmentFactor
G4double GetDensity() const
Definition: G4Material.hh:180
G4double GetLFactor() const
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:190
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
G4double logZ(G4int Z) const
Definition: G4Pow.hh:166
G4double GetFermiVelocity() const
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:206
G4double GetMeanExcitationEnergy() const
G4double A23(G4double A) const
Definition: G4Pow.hh:160
G4double fRateionexcfluct
G4GLOB_DLL std::ostream G4cout
G4double GetX1density(G4int idx)
G4int GetIndex(const G4String &matName)
virtual ~G4IonisParamMat()
G4double GetPlasmaEnergy(G4int idx)
G4double fLogMeanExcEnergy
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:216
G4double fMeanEnergyPerIon
G4double fLogEnergy1fluct
static G4DensityEffectData * GetDensityEffectData()
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
G4double GetAdensity(G4int idx)
G4double fMeanExcitationEnergy
static const double eV
Definition: G4SIunits.hh:212
G4double * fShellCorrectionVector
static const double pi
Definition: G4SIunits.hh:74
int G4lrint(double ad)
Definition: templates.hh:163
G4Material * fMaterial
G4IonisParamMat(G4Material *)
const G4double x[NPOINTSGL]
G4IonisParamElm * GetIonisation() const
Definition: G4Element.hh:198
const G4Material * GetBaseMaterial() const
Definition: G4Material.hh:233
G4double GetCdensity(G4int idx)
static const G4double NTP_Temperature
Definition: G4Material.hh:116
G4double GetTemperature() const
Definition: G4Material.hh:182
#define G4endl
Definition: G4ios.hh:61
G4double GetMdensity(G4int idx)
size_t GetNumberOfElements() const
Definition: G4Material.hh:186
static const double keV
Definition: G4SIunits.hh:213
G4State GetState() const
Definition: G4Material.hh:181
G4double GetNominalDensity(G4int Z) const
double G4double
Definition: G4Types.hh:76
G4double GetDelta0density(G4int idx)
const G4double * GetFractionVector() const
Definition: G4Material.hh:194
G4double GetAdjustmentFactor(G4int idx)
G4double GetX0density(G4int idx)
static G4DensityEffectData * fDensityData
void ComputeMeanParameters()