Geant4  10.02.p03
G4hIonEffChargeSquare Class Reference

#include <G4hIonEffChargeSquare.hh>

Inheritance diagram for G4hIonEffChargeSquare:
Collaboration diagram for G4hIonEffChargeSquare:

Public Member Functions

 G4hIonEffChargeSquare (const G4String &name)
 
 ~G4hIonEffChargeSquare ()
 
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
 
- Public Member Functions inherited from G4VLowEnergyModel
 G4VLowEnergyModel (const G4String &name)
 
virtual ~G4VLowEnergyModel ()
 

Private Member Functions

G4double IonEffChargeSquare (const G4Material *material, G4double kineticEnergy, G4double particleMass, G4double ionCharge) const
 

Private Attributes

const G4double theHeMassAMU
 

Detailed Description

Definition at line 61 of file G4hIonEffChargeSquare.hh.

Constructor & Destructor Documentation

◆ G4hIonEffChargeSquare()

G4hIonEffChargeSquare::G4hIonEffChargeSquare ( const G4String name)

Definition at line 67 of file G4hIonEffChargeSquare.cc.

68  : G4VLowEnergyModel(name),
69  theHeMassAMU(4.0026)
70 {;}
G4VLowEnergyModel(const G4String &name)

◆ ~G4hIonEffChargeSquare()

G4hIonEffChargeSquare::~G4hIonEffChargeSquare ( )

Definition at line 74 of file G4hIonEffChargeSquare.cc.

75 {;}

Member Function Documentation

◆ HighEnergyLimit() [1/2]

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

Implements G4VLowEnergyModel.

Definition at line 108 of file G4hIonEffChargeSquare.cc.

111 {
112  return 1.0*TeV ;
113 }
static const double TeV
Definition: G4SIunits.hh:215

◆ HighEnergyLimit() [2/2]

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

Implements G4VLowEnergyModel.

Definition at line 126 of file G4hIonEffChargeSquare.cc.

128 {
129  return 1.0*TeV ;
130 }
static const double TeV
Definition: G4SIunits.hh:215

◆ IonEffChargeSquare()

G4double G4hIonEffChargeSquare::IonEffChargeSquare ( const G4Material material,
G4double  kineticEnergy,
G4double  particleMass,
G4double  ionCharge 
) const
private

Definition at line 158 of file G4hIonEffChargeSquare.cc.

163 {
164  // The aproximation of ion effective charge from:
165  // J.F.Ziegler, J.P. Biersack, U. Littmark
166  // The Stopping and Range of Ions in Matter,
167  // Vol.1, Pergamon Press, 1985
168 
169  // Fast ions or hadrons
170  G4double reducedEnergy = kineticEnergy * proton_mass_c2/particleMass ;
171  if(reducedEnergy < 1.0*keV) reducedEnergy = 1.0*keV;
172  if( (reducedEnergy > ionCharge * 10.0 * MeV) ||
173  (ionCharge < 1.5) ) return ionCharge*ionCharge ;
174 
175  static const G4double vFermi[92] = {
176  1.0309, 0.15976, 0.59782, 1.0781, 1.0486, 1.0, 1.058, 0.93942, 0.74562, 0.3424,
177  0.45259, 0.71074, 0.90519, 0.97411, 0.97184, 0.89852, 0.70827, 0.39816, 0.36552, 0.62712,
178  0.81707, 0.9943, 1.1423, 1.2381, 1.1222, 0.92705, 1.0047, 1.2, 1.0661, 0.97411,
179  0.84912, 0.95, 1.0903, 1.0429, 0.49715, 0.37755, 0.35211, 0.57801, 0.77773, 1.0207,
180  1.029, 1.2542, 1.122, 1.1241, 1.0882, 1.2709, 1.2542, 0.90094, 0.74093, 0.86054,
181  0.93155, 1.0047, 0.55379, 0.43289, 0.32636, 0.5131, 0.695, 0.72591, 0.71202, 0.67413,
182  0.71418, 0.71453, 0.5911, 0.70263, 0.68049, 0.68203, 0.68121, 0.68532, 0.68715, 0.61884,
183  0.71801, 0.83048, 1.1222, 1.2381, 1.045, 1.0733, 1.0953, 1.2381, 1.2879, 0.78654,
184  0.66401, 0.84912, 0.88433, 0.80746, 0.43357, 0.41923, 0.43638, 0.51464, 0.73087, 0.81065,
185  1.9578, 1.0257} ;
186 
187  static const G4double lFactor[92] = {
188  1.0, 1.0, 1.1, 1.06, 1.01, 1.03, 1.04, 0.99, 0.95, 0.9,
189  0.82, 0.81, 0.83, 0.88, 1.0, 0.95, 0.97, 0.99, 0.98, 0.97,
190  0.98, 0.97, 0.96, 0.93, 0.91, 0.9, 0.88, 0.9, 0.9, 0.9,
191  0.9, 0.85, 0.9, 0.9, 0.91, 0.92, 0.9, 0.9, 0.9, 0.9,
192  0.9, 0.88, 0.9, 0.88, 0.88, 0.9, 0.9, 0.88, 0.9, 0.9,
193  0.9, 0.9, 0.96, 1.2, 0.9, 0.88, 0.88, 0.85, 0.9, 0.9,
194  0.92, 0.95, 0.99, 1.03, 1.05, 1.07, 1.08, 1.1, 1.08, 1.08,
195  1.08, 1.08, 1.09, 1.09, 1.1, 1.11, 1.12, 1.13, 1.14, 1.15,
196  1.17, 1.2, 1.18, 1.17, 1.17, 1.16, 1.16, 1.16, 1.16, 1.16,
197  1.16, 1.16} ;
198 
199  static const G4double c[6] = {0.2865, 0.1266, -0.001429,
200  0.02402,-0.01135, 0.001475} ;
201 
202  // get elements in the actual material,
203  const G4ElementVector* theElementVector = material->GetElementVector() ;
204  const G4double* theAtomicNumDensityVector =
205  material->GetAtomicNumDensityVector() ;
206  const G4int NumberOfElements = material->GetNumberOfElements() ;
207 
208  // loop for the elements in the material
209  // to find out average values Z, vF, lF
210  G4double z = 0.0, vF = 0.0, lF = 0.0, norm = 0.0 ;
211 
212  if( 1 == NumberOfElements ) {
213  z = material->GetZ() ;
214  G4int iz = G4int(z) - 1 ;
215  if(iz < 0) iz = 0 ;
216  else if(iz > 91) iz = 91 ;
217  vF = vFermi[iz] ;
218  lF = lFactor[iz] ;
219 
220  } else {
221  for (G4int iel=0; iel<NumberOfElements; iel++)
222  {
223  const G4Element* element = (*theElementVector)[iel] ;
224  G4double z2 = element->GetZ() ;
225  const G4double weight = theAtomicNumDensityVector[iel] ;
226  norm += weight ;
227  z += z2 * weight ;
228  G4int iz = G4int(z2) - 1 ;
229  if(iz < 0) iz = 0 ;
230  else if(iz > 91) iz =91 ;
231  vF += vFermi[iz] * weight ;
232  lF += lFactor[iz] * weight ;
233  }
234  z /= norm ;
235  vF /= norm ;
236  lF /= norm ;
237  }
238 
239  // Helium ion case
240  if( ionCharge < 2.5 ) {
241 
242  G4double e = std::log(std::max(1.0, kineticEnergy / (keV*theHeMassAMU) )) ;
243  G4double x = c[0] ;
244  G4double y = 1.0 ;
245  for (G4int i=1; i<6; i++) {
246  y *= e ;
247  x += y * c[i] ;
248  }
249  G4double q = 7.6 - e ;
250  q = 1.0 + ( 0.007 + 0.00005 * z ) * G4Exp( -q*q ) ;
251  return 4.0 * q * q * (1.0 - G4Exp(-x)) ;
252 
253  // Heavy ion case
254  } else {
255 
256  // v1 is ion velocity in vF unit
257  G4double v1 = std::sqrt( reducedEnergy / (25.0 * keV) )/ vF ;
258  G4double y ;
259  G4double z13 = std::pow(ionCharge, 0.3333) ;
260 
261  // Faster than Fermi velocity
262  if ( v1 > 1.0 ) {
263  y = vF * v1 * ( 1.0 + 0.2 / (v1*v1) ) / (z13*z13) ;
264 
265  // Slower than Fermi velocity
266  } else {
267  y = 0.6923 * vF * (1.0 + 2.0*v1*v1/3.0 + v1*v1*v1*v1/15.0) / (z13*z13) ;
268  }
269 
270  G4double y3 = std::pow(y, 0.3) ;
271  G4double q = 1.0 - G4Exp( 0.803*y3 - 1.3167*y3*y3 -
272  0.38157*y - 0.008983*y*y ) ;
273  if( q < 0.0 ) q = 0.0 ;
274 
275  G4double sLocal = 7.6 - std::log(std::max(1.0, reducedEnergy/keV)) ;
276  sLocal = 1.0 + ( 0.18 + 0.0015 * z ) * G4Exp( -sLocal*sLocal )/ (ionCharge*ionCharge) ;
277 
278  // Screen length according to
279  // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
280  // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
281 
282  G4double lambda = 10.0 * vF * std::pow(1.0-q, 0.6667) / (z13 * (6.0 + q)) ;
283  G4double qeff = ionCharge * sLocal *
284  ( q + 0.5*(1.0-q) * std::log(1.0 + lambda*lambda) / (vF*vF) ) ;
285  if( 0.1 > qeff ) qeff = 0.1 ;
286  return qeff*qeff ;
287  }
288 }
G4double GetZ() const
Definition: G4Material.cc:625
static const double MeV
Definition: G4SIunits.hh:211
std::vector< G4Element * > G4ElementVector
Float_t norm
double weight
Definition: plottest35.C:25
int G4int
Definition: G4Types.hh:78
Double_t y
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:216
G4double iz
Definition: TRTMaterials.hh:39
float proton_mass_c2
Definition: hepunit.py:275
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
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
G4double GetZ() const
Definition: G4Element.hh:131
Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsInCharge() [1/2]

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

Implements G4VLowEnergyModel.

Definition at line 142 of file G4hIonEffChargeSquare.cc.

144 {
145  return true ;
146 }

◆ IsInCharge() [2/2]

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

Implements G4VLowEnergyModel.

Definition at line 150 of file G4hIonEffChargeSquare.cc.

152 {
153  return true ;
154 }

◆ LowEnergyLimit() [1/2]

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

Implements G4VLowEnergyModel.

Definition at line 117 of file G4hIonEffChargeSquare.cc.

120 {
121  return 0.0 ;
122 }

◆ LowEnergyLimit() [2/2]

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

Implements G4VLowEnergyModel.

Definition at line 134 of file G4hIonEffChargeSquare.cc.

136 {
137  return 0.0 ;
138 }

◆ TheValue() [1/2]

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

Implements G4VLowEnergyModel.

Definition at line 79 of file G4hIonEffChargeSquare.cc.

81 {
82  G4double energy = particle->GetKineticEnergy() ;
83  G4double particleMass = particle->GetMass() ;
84  G4double charge = (particle->GetDefinition()->GetPDGCharge())/eplus ;
85 
86  G4double q = IonEffChargeSquare(material,energy,particleMass,charge) ;
87 
88  return q ;
89 }
G4double GetMass() const
G4double GetKineticEnergy() const
double energy
Definition: plottest35.C:25
G4double IonEffChargeSquare(const G4Material *material, G4double kineticEnergy, G4double particleMass, G4double ionCharge) const
G4ParticleDefinition * GetDefinition() const
double G4double
Definition: G4Types.hh:76
static const double eplus
Definition: G4SIunits.hh:196
G4double GetPDGCharge() const
Here is the call graph for this function:

◆ TheValue() [2/2]

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

Implements G4VLowEnergyModel.

Definition at line 93 of file G4hIonEffChargeSquare.cc.

96 {
97  // SetRateMass(aParticle) ;
98  G4double particleMass = aParticle->GetPDGMass() ;
99  G4double charge = (aParticle->GetPDGCharge())/eplus ;
100 
101  G4double q = IonEffChargeSquare(material,kineticEnergy,particleMass,charge) ;
102 
103  return q ;
104 }
G4double IonEffChargeSquare(const G4Material *material, G4double kineticEnergy, G4double particleMass, G4double ionCharge) const
double G4double
Definition: G4Types.hh:76
static const double eplus
Definition: G4SIunits.hh:196
G4double GetPDGCharge() const
Here is the call graph for this function:

Member Data Documentation

◆ theHeMassAMU

const G4double G4hIonEffChargeSquare::theHeMassAMU
private

Definition at line 103 of file G4hIonEffChargeSquare.hh.


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