81 void G4hParametrisedLossModel::InitializeMe()
85 theZieglerFactor =
eV*
cm2*1.0e-15 ;
92 if(zi85p == modelName) {
94 highEnergyLimit = 100.0*
MeV;
95 lowEnergyLimit = 1.0*
keV;
97 }
else if(ir49p == modelName || blank == modelName) {
99 highEnergyLimit = 2.0*
MeV;
100 lowEnergyLimit = 1.0*
keV;
102 }
else if(ir49He == modelName) {
104 highEnergyLimit = 10.0*
MeV/4.0;
105 lowEnergyLimit = 1.0*
keV/4.0;
109 highEnergyLimit = 2.0*
MeV;
110 lowEnergyLimit = 1.0*
keV;
111 G4cout <<
"G4hParametrisedLossModel Warning: <" << modelName
112 <<
"> is unknown - default <"
113 << ir49p <<
">" <<
" is used for Electronic Stopping"
128 delete eStopingPowerTable;
139 if (scaledEnergy < lowEnergyLimit) {
140 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
141 scaledEnergy = lowEnergyLimit;
143 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
154 G4double scaledEnergy = kineticEnergy
158 if (scaledEnergy < lowEnergyLimit) {
159 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
160 scaledEnergy = lowEnergyLimit;
162 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
172 return lowEnergyLimit;
180 return highEnergyLimit;
186 return lowEnergyLimit;
193 return highEnergyLimit;
220 const G4double* theAtomicNumDensityVector =
225 if( (eStopingPowerTable->
HasMaterial(material)) ) {
227 eloss = eStopingPowerTable->
StoppingPower(material, kineticEnergy);
228 if (
"QAO" != modelName) {
230 if(1 < numberOfElements) {
234 for (
G4int iel=0; iel<numberOfElements; iel++) {
235 nAtoms += theAtomsVector[iel];
242 }
else if(1 == numberOfElements) {
249 }
else if( MolecIsInZiegler1988(material)) {
258 for (
G4int i=0; i<numberOfElements; i++) {
259 const G4Element* element = (*theElementVector)[i] ;
262 * theAtomicNumDensityVector[i] ;
264 * theAtomicNumDensityVector[i] ;
268 eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
276 for (
G4int i=0; i<numberOfElements; i++)
278 const G4Element* element = (*theElementVector)[i] ;
281 * theAtomicNumDensityVector[i];
289 G4bool G4hParametrisedLossModel::MolecIsInZiegler1988(
298 if (myFormula == chFormula )
return false ;
308 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
310 const size_t numberOfMolecula = 53 ;
313 static const G4double HeEff = 2.8735 ;
316 "H_2O",
"C_2H_4O",
"C_3H_6O",
"C_2H_2",
"C_H_3OH",
317 "C_2H_5OH",
"C_3H_7OH",
"C_3H_4",
"NH_3",
"C_14H_10",
318 "C_6H_6",
"C_4H_10",
"C_4H_6",
"C_4H_8O",
"CCl_4",
319 "CF_4",
"C_6H_8",
"C_6H_12",
"C_6H_10O",
"C_6H_10",
320 "C_8H_16",
"C_5H_10",
"C_5H_8",
"C_3H_6-Cyclopropane",
"C_2H_4F_2",
321 "C_2H_2F_2",
"C_4H_8O_2",
"C_2H_6",
"C_2F_6",
"C_2H_6O",
322 "C_3H_6O",
"C_4H_10O",
"C_2H_4",
"C_2H_4O",
"C_2H_4S",
323 "SH_2",
"CH_4",
"CCLF_3",
"CCl_2F_2",
"CHCl_2F",
324 "(CH_3)_2S",
"N_2O",
"C_5H_10O" "C_8H_6",
"(CH_2)_N",
325 "(C_3H_6)_N",
"(C_8H_8)_N",
"C_3H_8",
"C_3H_6-Propylene",
"C_3H_6O",
326 "C_3H_6S",
"C_4H_4S",
"C_7H_8"
329 static const G4double expStopping[numberOfMolecula] = {
330 66.1, 190.4, 258.7, 42.2, 141.5,
331 210.9, 279.6, 198.8, 31.0, 267.5,
332 122.8, 311.4, 260.3, 328.9, 391.3,
333 206.6, 374.0, 422.0, 432.0, 398.0,
334 554.0, 353.0, 326.0, 74.6, 220.5,
335 197.4, 362.0, 170.0, 330.5, 211.3,
336 262.3, 349.6, 51.3, 187.0, 236.9,
337 121.9, 35.8, 247.0, 292.6, 268.0,
338 262.3, 49.0, 398.9, 444.0, 22.91,
339 68.0, 155.0, 84.0, 74.2, 254.7,
343 static const G4double expCharge[numberOfMolecula] = {
344 HeEff, HeEff, HeEff, 1.0, HeEff,
345 HeEff, HeEff, HeEff, 1.0, 1.0,
346 1.0, HeEff, HeEff, HeEff, HeEff,
347 HeEff, HeEff, HeEff, HeEff, HeEff,
348 HeEff, HeEff, HeEff, 1.0, HeEff,
349 HeEff, HeEff, HeEff, HeEff, HeEff,
350 HeEff, HeEff, 1.0, HeEff, HeEff,
351 HeEff, 1.0, HeEff, HeEff, HeEff,
352 HeEff, 1.0, HeEff, HeEff, 1.0,
353 1.0, 1.0, 1.0, 1.0, HeEff,
357 static const G4double numberOfAtomsPerMolecula[numberOfMolecula] = {
358 3.0, 7.0, 10.0, 4.0, 6.0,
359 9.0, 12.0, 7.0, 4.0, 24.0,
360 12.0, 14.0, 10.0, 13.0, 5.0,
361 5.0, 14.0, 18.0, 17.0, 17.0,
362 24.0, 15.0, 13.0, 9.0, 8.0,
363 6.0, 14.0, 8.0, 8.0, 9.0,
364 10.0, 15.0, 6.0, 7.0, 7.0,
365 3.0, 5.0, 5.0, 5.0, 5.0,
366 9.0, 3.0, 16.0, 14.0, 3.0,
367 9.0, 16.0, 11.0, 9.0, 10.0,
372 for (
size_t i=0; i<numberOfMolecula; i++)
374 if(chFormula == name[i]) {
377 (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
378 SetExpStopPower125(exp125) ;
388 G4double G4hParametrisedLossModel::ChemicalFactor(
398 G4double beta = std::sqrt(1.0 - 1.0/(gamma*gamma)) ;
399 G4double beta25 = std::sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
400 G4double beta125 = std::sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
402 G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) *
403 (1.0 + std::exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
404 (1.0 + std::exp( 1.48 * ( beta/beta25 - 7.0 ) ) ) ;
G4double TheValue(const G4DynamicParticle *particle, const G4Material *material)
G4hParametrisedLossModel(const G4String &name)
std::vector< G4Element * > G4ElementVector
G4double GetKineticEnergy() const
const G4String & GetChemicalFormula() const
G4bool IsInCharge(const G4DynamicParticle *particle, const G4Material *material) const
const G4ElementVector * GetElementVector() const
virtual G4double ElectronicStoppingPower(G4double z, G4double kineticEnergy) const =0
G4GLOB_DLL std::ostream G4cout
~G4hParametrisedLossModel()
virtual G4bool HasMaterial(const G4Material *material)=0
const G4double * GetAtomicNumDensityVector() const
G4double GetTotNbOfAtomsPerVolume() const
G4double GetPDGMass() const
G4double HighEnergyLimit(const G4ParticleDefinition *aParticle, const G4Material *material) const
const G4int * GetAtomsVector() const
size_t GetNumberOfElements() const
virtual G4double StoppingPower(const G4Material *material, G4double kineticEnergy)=0
G4double LowEnergyLimit(const G4ParticleDefinition *aParticle, const G4Material *material) const