Geant4  10.02.p03
G4hParametrisedLossModel Class Reference

#include <G4hParametrisedLossModel.hh>

Inheritance diagram for G4hParametrisedLossModel:
Collaboration diagram for G4hParametrisedLossModel:

Public Member Functions

 G4hParametrisedLossModel (const G4String &name)
 
 ~G4hParametrisedLossModel ()
 
G4double TheValue (const G4DynamicParticle *particle, const G4Material *material)
 
G4double TheValue (const G4ParticleDefinition *aParticle, const G4Material *material, G4double kineticEnergy)
 
G4double HighEnergyLimit (const G4ParticleDefinition *aParticle, const G4Material *material) const
 
G4double LowEnergyLimit (const G4ParticleDefinition *aParticle, const G4Material *material) const
 
G4double HighEnergyLimit (const G4ParticleDefinition *aParticle) const
 
G4double LowEnergyLimit (const G4ParticleDefinition *aParticle) const
 
G4bool IsInCharge (const G4DynamicParticle *particle, const G4Material *material) const
 
G4bool IsInCharge (const G4ParticleDefinition *aParticle, const G4Material *material) const
 
G4String ModelName () const
 
- Public Member Functions inherited from G4VLowEnergyModel
 G4VLowEnergyModel (const G4String &name)
 
virtual ~G4VLowEnergyModel ()
 

Private Member Functions

 G4hParametrisedLossModel (G4hParametrisedLossModel &)
 
G4hParametrisedLossModeloperator= (const G4hParametrisedLossModel &right)
 
void InitializeMe ()
 
G4double StoppingPower (const G4Material *material, G4double kineticEnergy)
 
G4bool MolecIsInZiegler1988 (const G4Material *material)
 
void SetExpStopPower125 (G4double value)
 
G4double ChemicalFactor (G4double kineticEnergy, G4double eloss125) const
 

Private Attributes

G4VhElectronicStoppingPowereStopingPowerTable
 
G4double theZieglerFactor
 
G4String modelName
 
G4double lowEnergyLimit
 
G4double highEnergyLimit
 
G4double expStopPower125
 

Detailed Description

Definition at line 60 of file G4hParametrisedLossModel.hh.

Constructor & Destructor Documentation

◆ G4hParametrisedLossModel() [1/2]

G4hParametrisedLossModel::G4hParametrisedLossModel ( const G4String name)

Definition at line 74 of file G4hParametrisedLossModel.cc.

75  :G4VLowEnergyModel(name), modelName(name)
76 {
77  InitializeMe();
78 }
G4VLowEnergyModel(const G4String &name)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ~G4hParametrisedLossModel()

G4hParametrisedLossModel::~G4hParametrisedLossModel ( )

Definition at line 127 of file G4hParametrisedLossModel.cc.

128 {
129  delete eStopingPowerTable;
130 }
G4VhElectronicStoppingPower * eStopingPowerTable

◆ G4hParametrisedLossModel() [2/2]

G4hParametrisedLossModel::G4hParametrisedLossModel ( G4hParametrisedLossModel )
private

Member Function Documentation

◆ ChemicalFactor()

G4double G4hParametrisedLossModel::ChemicalFactor ( G4double  kineticEnergy,
G4double  eloss125 
) const
private

Definition at line 389 of file G4hParametrisedLossModel.cc.

391 {
392  // Approximation of Chemical Factor according to
393  // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
394  // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
395 
396  G4double gamma = 1.0 + kineticEnergy/proton_mass_c2 ;
397  G4double gamma25 = 1.0 + 25.0*keV /proton_mass_c2 ;
398  G4double gamma125 = 1.0 + 125.0*keV/proton_mass_c2 ;
399  G4double beta = std::sqrt(1.0 - 1.0/(gamma*gamma)) ;
400  G4double beta25 = std::sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
401  G4double beta125 = std::sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
402 
403  G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) *
404  (1.0 + G4Exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
405  (1.0 + G4Exp( 1.48 * ( beta/beta25 - 7.0 ) ) ) ;
406 
407  return factor ;
408 }
float proton_mass_c2
Definition: hepunit.py:275
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
static const G4double factor
static const double keV
Definition: G4SIunits.hh:213
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ HighEnergyLimit() [1/2]

G4double G4hParametrisedLossModel::HighEnergyLimit ( const G4ParticleDefinition aParticle,
const G4Material material 
) const
virtual

Implements G4VLowEnergyModel.

Definition at line 178 of file G4hParametrisedLossModel.cc.

180 {
181  return highEnergyLimit;
182 }

◆ HighEnergyLimit() [2/2]

G4double G4hParametrisedLossModel::HighEnergyLimit ( const G4ParticleDefinition aParticle) const
virtual

Implements G4VLowEnergyModel.

Definition at line 192 of file G4hParametrisedLossModel.cc.

193 {
194  return highEnergyLimit;
195 }

◆ InitializeMe()

void G4hParametrisedLossModel::InitializeMe ( )
private

Definition at line 82 of file G4hParametrisedLossModel.cc.

83 {
84  expStopPower125 = 0.;
85 
86  theZieglerFactor = eV*cm2*1.0e-15 ;
87 
88  // Registration of parametrisation models
89  G4String blank = G4String(" ") ;
90  G4String ir49p = G4String("ICRU_R49p") ;
91  G4String ir49He = G4String("ICRU_R49He") ;
92  G4String zi85p = G4String("Ziegler1985p") ;
93  if(zi85p == modelName) {
95  highEnergyLimit = 100.0*MeV;
96  lowEnergyLimit = 1.0*keV;
97 
98  } else if(ir49p == modelName || blank == modelName) {
100  highEnergyLimit = 2.0*MeV;
101  lowEnergyLimit = 1.0*keV;
102 
103  } else if(ir49He == modelName) {
105  highEnergyLimit = 10.0*MeV/4.0;
106  lowEnergyLimit = 1.0*keV/4.0;
107 
108  } else {
110  highEnergyLimit = 2.0*MeV;
111  lowEnergyLimit = 1.0*keV;
112  G4cout << "G4hParametrisedLossModel Warning: <" << modelName
113  << "> is unknown - default <"
114  << ir49p << ">" << " is used for Electronic Stopping"
115  << G4endl;
116  modelName = ir49p;
117  }
118  /*
119  G4cout << "G4hParametrisedLossModel: the model <"
120  << modelName << ">" << " is used for Electronic Stopping"
121  << G4endl;
122 */
123 }
static const double MeV
Definition: G4SIunits.hh:211
static const double cm2
Definition: G4SIunits.hh:119
G4VhElectronicStoppingPower * eStopingPowerTable
G4GLOB_DLL std::ostream G4cout
static const double eV
Definition: G4SIunits.hh:212
#define G4endl
Definition: G4ios.hh:61
static const double keV
Definition: G4SIunits.hh:213
Here is the caller graph for this function:

◆ IsInCharge() [1/2]

G4bool G4hParametrisedLossModel::IsInCharge ( const G4DynamicParticle particle,
const G4Material material 
) const
virtual

Implements G4VLowEnergyModel.

Definition at line 199 of file G4hParametrisedLossModel.cc.

201 {
202  return true;
203 }

◆ IsInCharge() [2/2]

G4bool G4hParametrisedLossModel::IsInCharge ( const G4ParticleDefinition aParticle,
const G4Material material 
) const
virtual

Implements G4VLowEnergyModel.

Definition at line 207 of file G4hParametrisedLossModel.cc.

209 {
210  return true;
211 }

◆ LowEnergyLimit() [1/2]

G4double G4hParametrisedLossModel::LowEnergyLimit ( const G4ParticleDefinition aParticle,
const G4Material material 
) const
virtual

Implements G4VLowEnergyModel.

Definition at line 170 of file G4hParametrisedLossModel.cc.

172 {
173  return lowEnergyLimit;
174 }

◆ LowEnergyLimit() [2/2]

G4double G4hParametrisedLossModel::LowEnergyLimit ( const G4ParticleDefinition aParticle) const
virtual

Implements G4VLowEnergyModel.

Definition at line 185 of file G4hParametrisedLossModel.cc.

186 {
187  return lowEnergyLimit;
188 }

◆ ModelName()

G4String G4hParametrisedLossModel::ModelName ( ) const
inline

Definition at line 92 of file G4hParametrisedLossModel.hh.

Here is the call graph for this function:

◆ MolecIsInZiegler1988()

G4bool G4hParametrisedLossModel::MolecIsInZiegler1988 ( const G4Material material)
private

Definition at line 290 of file G4hParametrisedLossModel.cc.

292 {
293  // The list of molecules from
294  // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
295  // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
296 
297  G4String myFormula = G4String(" ") ;
298  const G4String chFormula = material->GetChemicalFormula() ;
299  if (myFormula == chFormula ) return false ;
300 
301  // There are no evidence for difference of stopping power depended on
302  // phase of the compound except for water. The stopping power of the
303  // water in gas phase can be predicted using Bragg's rule.
304  //
305  // No chemical factor for water-gas
306 
307  myFormula = G4String("H_2O") ;
308  const G4State theState = material->GetState() ;
309  if( theState == kStateGas && myFormula == chFormula) return false ;
310 
311  const size_t numberOfMolecula = 53 ;
312 
313  // The coffecient from Table.4 of Ziegler & Manoyan
314  static const G4double HeEff = 2.8735 ;
315 
316  static const G4String name[numberOfMolecula] = {
317  "H_2O", "C_2H_4O", "C_3H_6O", "C_2H_2", "C_H_3OH",
318  "C_2H_5OH", "C_3H_7OH", "C_3H_4", "NH_3", "C_14H_10",
319  "C_6H_6", "C_4H_10", "C_4H_6", "C_4H_8O", "CCl_4",
320  "CF_4", "C_6H_8", "C_6H_12", "C_6H_10O", "C_6H_10",
321  "C_8H_16", "C_5H_10", "C_5H_8", "C_3H_6-Cyclopropane","C_2H_4F_2",
322  "C_2H_2F_2", "C_4H_8O_2", "C_2H_6", "C_2F_6", "C_2H_6O",
323  "C_3H_6O", "C_4H_10O", "C_2H_4", "C_2H_4O", "C_2H_4S",
324  "SH_2", "CH_4", "CCLF_3", "CCl_2F_2", "CHCl_2F",
325  "(CH_3)_2S", "N_2O", "C_5H_10O", "C_8H_6", "(CH_2)_N",
326  "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8", "C_3H_6-Propylene", "C_3H_6O",
327  "C_3H_6S", "C_4H_4S", "C_7H_8"
328  };
329 
330  static const G4double expStopping[numberOfMolecula] = {
331  66.1, 190.4, 258.7, 42.2, 141.5,
332  210.9, 279.6, 198.8, 31.0, 267.5,
333  122.8, 311.4, 260.3, 328.9, 391.3,
334  206.6, 374.0, 422.0, 432.0, 398.0,
335  554.0, 353.0, 326.0, 74.6, 220.5,
336  197.4, 362.0, 170.0, 330.5, 211.3,
337  262.3, 349.6, 51.3, 187.0, 236.9,
338  121.9, 35.8, 247.0, 292.6, 268.0,
339  262.3, 49.0, 398.9, 444.0, 22.91,
340  68.0, 155.0, 84.0, 74.2, 254.7,
341  306.8, 324.4, 420.0
342  } ;
343 
344  static const G4double expCharge[numberOfMolecula] = {
345  HeEff, HeEff, HeEff, 1.0, HeEff,
346  HeEff, HeEff, HeEff, 1.0, 1.0,
347  1.0, HeEff, HeEff, HeEff, HeEff,
348  HeEff, HeEff, HeEff, HeEff, HeEff,
349  HeEff, HeEff, HeEff, 1.0, HeEff,
350  HeEff, HeEff, HeEff, HeEff, HeEff,
351  HeEff, HeEff, 1.0, HeEff, HeEff,
352  HeEff, 1.0, HeEff, HeEff, HeEff,
353  HeEff, 1.0, HeEff, HeEff, 1.0,
354  1.0, 1.0, 1.0, 1.0, HeEff,
355  HeEff, HeEff, HeEff
356  } ;
357 
358  static const G4double numberOfAtomsPerMolecula[numberOfMolecula] = {
359  3.0, 7.0, 10.0, 4.0, 6.0,
360  9.0, 12.0, 7.0, 4.0, 24.0,
361  12.0, 14.0, 10.0, 13.0, 5.0,
362  5.0, 14.0, 18.0, 17.0, 17.0,
363  24.0, 15.0, 13.0, 9.0, 8.0,
364  6.0, 14.0, 8.0, 8.0, 9.0,
365  10.0, 15.0, 6.0, 7.0, 7.0,
366  3.0, 5.0, 5.0, 5.0, 5.0,
367  9.0, 3.0, 16.0, 14.0, 3.0,
368  9.0, 16.0, 11.0, 9.0, 10.0,
369  10.0, 9.0, 15.0
370  } ;
371 
372  // Search for the compaund in the table
373  for (size_t i=0; i<numberOfMolecula; i++)
374  {
375  if(chFormula == name[i]) {
376  G4double exp125 = expStopping[i] *
377  (material->GetTotNbOfAtomsPerVolume()) /
378  (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
379  SetExpStopPower125(exp125) ;
380  return true ;
381  }
382  }
383 
384  return false ;
385 }
G4State GetState() const
Definition: G4Material.hh:181
G4State
Definition: G4Material.hh:114
static const G4int numberOfMolecula
G4String name
Definition: TRTMaterials.hh:40
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:209
void SetExpStopPower125(G4double value)
const G4String & GetChemicalFormula() const
Definition: G4Material.hh:179
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

G4hParametrisedLossModel& G4hParametrisedLossModel::operator= ( const G4hParametrisedLossModel right)
private
Here is the caller graph for this function:

◆ SetExpStopPower125()

void G4hParametrisedLossModel::SetExpStopPower125 ( G4double  value)
inlineprivate

Definition at line 109 of file G4hParametrisedLossModel.hh.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StoppingPower()

G4double G4hParametrisedLossModel::StoppingPower ( const G4Material material,
G4double  kineticEnergy 
)
private

Definition at line 215 of file G4hParametrisedLossModel.cc.

217 {
218  G4double eloss = 0.0;
219 
220  const G4int numberOfElements = material->GetNumberOfElements() ;
221  const G4double* theAtomicNumDensityVector =
222  material->GetAtomicNumDensityVector() ;
223 
224 
225  // compound material with parametrisation
226  if( (eStopingPowerTable->HasMaterial(material)) ) {
227 
228  eloss = eStopingPowerTable->StoppingPower(material, kineticEnergy);
229  if ("QAO" != modelName) {
230  eloss *= material->GetTotNbOfAtomsPerVolume();
231  if(1 < numberOfElements) {
232  G4int nAtoms = 0;
233 
234  const G4int* theAtomsVector = material->GetAtomsVector();
235  for (G4int iel=0; iel<numberOfElements; iel++) {
236  nAtoms += theAtomsVector[iel];
237  }
238  eloss /= nAtoms;
239  }
240  }
241 
242  // pure material
243  } else if(1 == numberOfElements) {
244 
245  G4double z = material->GetZ();
246  eloss = (eStopingPowerTable->ElectronicStoppingPower(z, kineticEnergy))
247  * (material->GetTotNbOfAtomsPerVolume()) ;
248 
249  // Experimental data exist only for kinetic energy 125 keV
250  } else if( MolecIsInZiegler1988(material)) {
251 
252  // Cycle over elements - calculation based on Bragg's rule
253  G4double eloss125 = 0.0 ;
254  const G4ElementVector* theElementVector =
255  material->GetElementVector() ;
256 
257 
258  // loop for the elements in the material
259  for (G4int i=0; i<numberOfElements; i++) {
260  const G4Element* element = (*theElementVector)[i] ;
261  G4double z = element->GetZ() ;
262  eloss +=(eStopingPowerTable->ElectronicStoppingPower(z,kineticEnergy))
263  * theAtomicNumDensityVector[i] ;
264  eloss125 +=(eStopingPowerTable->ElectronicStoppingPower(z,125.0*keV))
265  * theAtomicNumDensityVector[i] ;
266  }
267 
268  // Chemical factor is taken into account
269  eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
270 
271  // Brugg's rule calculation
272  } else {
273  const G4ElementVector* theElementVector =
274  material->GetElementVector() ;
275 
276  // loop for the elements in the material
277  for (G4int i=0; i<numberOfElements; i++)
278  {
279  const G4Element* element = (*theElementVector)[i] ;
280  G4double z = element->GetZ() ;
281  eloss += (eStopingPowerTable->ElectronicStoppingPower(z,kineticEnergy))
282  * theAtomicNumDensityVector[i];
283  }
284  }
285  return eloss;
286 }
G4double GetZ() const
Definition: G4Material.cc:625
std::vector< G4Element * > G4ElementVector
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:209
int G4int
Definition: G4Types.hh:78
G4double ChemicalFactor(G4double kineticEnergy, G4double eloss125) const
G4VhElectronicStoppingPower * eStopingPowerTable
virtual G4double ElectronicStoppingPower(G4double z, G4double kineticEnergy) const =0
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:216
virtual G4bool HasMaterial(const G4Material *material)=0
const G4int * GetAtomsVector() const
Definition: G4Material.hh:198
G4bool MolecIsInZiegler1988(const G4Material *material)
size_t GetNumberOfElements() const
Definition: G4Material.hh:186
static const double keV
Definition: G4SIunits.hh:213
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:190
double G4double
Definition: G4Types.hh:76
virtual G4double StoppingPower(const G4Material *material, G4double kineticEnergy)=0
G4double GetZ() const
Definition: G4Element.hh:131
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TheValue() [1/2]

G4double G4hParametrisedLossModel::TheValue ( const G4DynamicParticle particle,
const G4Material material 
)
virtual

Implements G4VLowEnergyModel.

Definition at line 134 of file G4hParametrisedLossModel.cc.

136 {
137  G4double scaledEnergy = (particle->GetKineticEnergy())
138  * proton_mass_c2/(particle->GetMass());
140  if (scaledEnergy < lowEnergyLimit) {
141  if (modelName != "QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
142  scaledEnergy = lowEnergyLimit;
143  }
144  G4double eloss = StoppingPower(material,scaledEnergy) * factor;
145 
146  return eloss;
147 }
G4double GetMass() const
G4double StoppingPower(const G4Material *material, G4double kineticEnergy)
G4double GetKineticEnergy() const
float proton_mass_c2
Definition: hepunit.py:275
static const G4double factor
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:

◆ TheValue() [2/2]

G4double G4hParametrisedLossModel::TheValue ( const G4ParticleDefinition aParticle,
const G4Material material,
G4double  kineticEnergy 
)
virtual

Implements G4VLowEnergyModel.

Definition at line 151 of file G4hParametrisedLossModel.cc.

154 {
155  G4double scaledEnergy = kineticEnergy
156  * proton_mass_c2/(aParticle->GetPDGMass());
157 
159  if (scaledEnergy < lowEnergyLimit) {
160  if (modelName != "QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
161  scaledEnergy = lowEnergyLimit;
162  }
163  G4double eloss = StoppingPower(material,scaledEnergy) * factor;
164 
165  return eloss;
166 }
G4double StoppingPower(const G4Material *material, G4double kineticEnergy)
float proton_mass_c2
Definition: hepunit.py:275
static const G4double factor
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:

Member Data Documentation

◆ eStopingPowerTable

G4VhElectronicStoppingPower* G4hParametrisedLossModel::eStopingPowerTable
private

Definition at line 114 of file G4hParametrisedLossModel.hh.

◆ expStopPower125

G4double G4hParametrisedLossModel::expStopPower125
private

Definition at line 124 of file G4hParametrisedLossModel.hh.

◆ highEnergyLimit

G4double G4hParametrisedLossModel::highEnergyLimit
private

Definition at line 122 of file G4hParametrisedLossModel.hh.

◆ lowEnergyLimit

G4double G4hParametrisedLossModel::lowEnergyLimit
private

Definition at line 121 of file G4hParametrisedLossModel.hh.

◆ modelName

G4String G4hParametrisedLossModel::modelName
private

Definition at line 119 of file G4hParametrisedLossModel.hh.

◆ theZieglerFactor

G4double G4hParametrisedLossModel::theZieglerFactor
private

Definition at line 116 of file G4hParametrisedLossModel.hh.


The documentation for this class was generated from the following files: