84void G4hParametrisedLossModel::InitializeMe()
88 theZieglerFactor = eV*cm2*1.0e-15 ;
99 if(zi77p == modelName) {
101 highEnergyLimit = 100.0*MeV;
102 lowEnergyLimit = 1.0*keV;
104 }
else if(zi77He == modelName) {
106 highEnergyLimit = 10.0*MeV/4.0;
107 lowEnergyLimit = 1.0*keV/4.0;
109 }
else if(zi85p == modelName) {
111 highEnergyLimit = 100.0*MeV;
112 lowEnergyLimit = 1.0*keV;
114 }
else if(zi00p == modelName ) {
116 highEnergyLimit = 100.0*MeV;
117 lowEnergyLimit = 1.0*keV;
119 }
else if(ir49p == modelName || blank == modelName) {
121 highEnergyLimit = 2.0*MeV;
122 lowEnergyLimit = 1.0*keV;
124 }
else if(ir49He == modelName) {
126 highEnergyLimit = 10.0*MeV/4.0;
127 lowEnergyLimit = 1.0*keV/4.0;
136 highEnergyLimit = 2.0*MeV;
137 lowEnergyLimit = 1.0*keV;
138 G4cout <<
"G4hParametrisedLossModel Warning: <" << modelName
139 <<
"> is unknown - default <"
140 << ir49p <<
">" <<
" is used for Electronic Stopping"
155 delete eStopingPowerTable;
164 * proton_mass_c2/(particle->
GetMass());
166 if (scaledEnergy < lowEnergyLimit) {
167 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
168 scaledEnergy = lowEnergyLimit;
170 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
181 G4double scaledEnergy = kineticEnergy
185 if (scaledEnergy < lowEnergyLimit) {
186 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
187 scaledEnergy = lowEnergyLimit;
189 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
199 return lowEnergyLimit;
207 return highEnergyLimit;
213 return lowEnergyLimit;
220 return highEnergyLimit;
247 const G4double* theAtomicNumDensityVector =
252 if( (eStopingPowerTable->
HasMaterial(material)) ) {
254 eloss = eStopingPowerTable->
StoppingPower(material, kineticEnergy);
255 if (
"QAO" != modelName) {
257 if(1 < numberOfElements) {
261 for (
G4int iel=0; iel<numberOfElements; iel++) {
262 nAtoms += theAtomsVector[iel];
269 }
else if(1 == numberOfElements) {
276 }
else if( MolecIsInZiegler1988(material)) {
285 for (
G4int i=0; i<numberOfElements; i++) {
286 const G4Element* element = (*theElementVector)[i] ;
289 * theAtomicNumDensityVector[i] ;
291 * theAtomicNumDensityVector[i] ;
295 eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
303 for (
G4int i=0; i<numberOfElements; i++)
305 const G4Element* element = (*theElementVector)[i] ;
308 * theAtomicNumDensityVector[i];
316G4bool G4hParametrisedLossModel::MolecIsInZiegler1988(
325 if (myFormula == chFormula )
return false ;
335 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
337 const size_t numberOfMolecula = 53 ;
342 static G4String name[numberOfMolecula] = {
343 "H_2O",
"C_2H_4O",
"C_3H_6O",
"C_2H_2",
"C_H_3OH",
344 "C_2H_5OH",
"C_3H_7OH",
"C_3H_4",
"NH_3",
"C_14H_10",
345 "C_6H_6",
"C_4H_10",
"C_4H_6",
"C_4H_8O",
"CCl_4",
346 "CF_4",
"C_6H_8",
"C_6H_12",
"C_6H_10O",
"C_6H_10",
347 "C_8H_16",
"C_5H_10",
"C_5H_8",
"C_3H_6-Cyclopropane",
"C_2H_4F_2",
348 "C_2H_2F_2",
"C_4H_8O_2",
"C_2H_6",
"C_2F_6",
"C_2H_6O",
349 "C_3H_6O",
"C_4H_10O",
"C_2H_4",
"C_2H_4O",
"C_2H_4S",
350 "SH_2",
"CH_4",
"CCLF_3",
"CCl_2F_2",
"CHCl_2F",
351 "(CH_3)_2S",
"N_2O",
"C_5H_10O",
"C_8H_6",
"(CH_2)_N",
352 "(C_3H_6)_N",
"(C_8H_8)_N",
"C_3H_8",
"C_3H_6-Propylene",
"C_3H_6O",
353 "C_3H_6S",
"C_4H_4S",
"C_7H_8"
356 static G4double expStopping[numberOfMolecula] = {
357 66.1, 190.4, 258.7, 42.2, 141.5,
358 210.9, 279.6, 198.8, 31.0, 267.5,
359 122.8, 311.4, 260.3, 328.9, 391.3,
360 206.6, 374.0, 422.0, 432.0, 398.0,
361 554.0, 353.0, 326.0, 74.6, 220.5,
362 197.4, 362.0, 170.0, 330.5, 211.3,
363 262.3, 349.6, 51.3, 187.0, 236.9,
364 121.9, 35.8, 247.0, 292.6, 268.0,
365 262.3, 49.0, 398.9, 444.0, 22.91,
366 68.0, 155.0, 84.0, 74.2, 254.7,
370 static G4double expCharge[numberOfMolecula] = {
371 HeEff, HeEff, HeEff, 1.0, HeEff,
372 HeEff, HeEff, HeEff, 1.0, 1.0,
373 1.0, HeEff, HeEff, HeEff, HeEff,
374 HeEff, HeEff, HeEff, HeEff, HeEff,
375 HeEff, HeEff, HeEff, 1.0, HeEff,
376 HeEff, HeEff, HeEff, HeEff, HeEff,
377 HeEff, HeEff, 1.0, HeEff, HeEff,
378 HeEff, 1.0, HeEff, HeEff, HeEff,
379 HeEff, 1.0, HeEff, HeEff, 1.0,
380 1.0, 1.0, 1.0, 1.0, HeEff,
384 static G4double numberOfAtomsPerMolecula[numberOfMolecula] = {
385 3.0, 7.0, 10.0, 4.0, 6.0,
386 9.0, 12.0, 7.0, 4.0, 24.0,
387 12.0, 14.0, 10.0, 13.0, 5.0,
388 5.0, 14.0, 18.0, 17.0, 17.0,
389 24.0, 15.0, 13.0, 9.0, 8.0,
390 6.0, 14.0, 8.0, 8.0, 9.0,
391 10.0, 15.0, 6.0, 7.0, 7.0,
392 3.0, 5.0, 5.0, 5.0, 5.0,
393 9.0, 3.0, 16.0, 14.0, 3.0,
394 9.0, 16.0, 11.0, 9.0, 10.0,
399 for (
size_t i=0; i<numberOfMolecula; i++)
401 if(chFormula == name[i]) {
404 (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
405 SetExpStopPower125(exp125) ;
415G4double G4hParametrisedLossModel::ChemicalFactor(
422 G4double gamma = 1.0 + kineticEnergy/proton_mass_c2 ;
423 G4double gamma25 = 1.0 + 25.0*keV /proton_mass_c2 ;
424 G4double gamma125 = 1.0 + 125.0*keV/proton_mass_c2 ;
425 G4double beta = std::sqrt(1.0 - 1.0/(gamma*gamma)) ;
426 G4double beta25 = std::sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
427 G4double beta125 = std::sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
429 G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) *
430 (1.0 + std::exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
431 (1.0 + std::exp( 1.48 * ( beta/beta25 - 7.0 ) ) ) ;
std::vector< G4Element * > G4ElementVector
G4DLLIMPORT std::ostream G4cout
G4double GetKineticEnergy() const
const G4String & GetChemicalFormula() const
const G4ElementVector * GetElementVector() const
G4double GetTotNbOfAtomsPerVolume() const
size_t GetNumberOfElements() const
const G4double * GetAtomicNumDensityVector() const
const G4int * GetAtomsVector() const
G4double GetPDGMass() const
virtual G4double StoppingPower(const G4Material *material, G4double kineticEnergy)=0
virtual G4bool HasMaterial(const G4Material *material)=0
virtual G4double ElectronicStoppingPower(G4double z, G4double kineticEnergy) const =0
G4double LowEnergyLimit(const G4ParticleDefinition *aParticle, const G4Material *material) const
G4double TheValue(const G4DynamicParticle *particle, const G4Material *material)
G4double HighEnergyLimit(const G4ParticleDefinition *aParticle, const G4Material *material) const
G4bool IsInCharge(const G4DynamicParticle *particle, const G4Material *material) const
~G4hParametrisedLossModel()
G4hParametrisedLossModel(const G4String &name)