82void G4hParametrisedLossModel::InitializeMe()
86 theZieglerFactor = eV*cm2*1.0e-15 ;
93 if(zi85p == modelName) {
95 highEnergyLimit = 100.0*MeV;
96 lowEnergyLimit = 1.0*keV;
98 }
else if(ir49p == modelName || blank == modelName) {
100 highEnergyLimit = 2.0*MeV;
101 lowEnergyLimit = 1.0*keV;
103 }
else if(ir49He == modelName) {
105 highEnergyLimit = 10.0*MeV/4.0;
106 lowEnergyLimit = 1.0*keV/4.0;
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"
129 delete eStopingPowerTable;
138 * proton_mass_c2/(particle->
GetMass());
140 if (scaledEnergy < lowEnergyLimit) {
141 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
142 scaledEnergy = lowEnergyLimit;
144 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
155 G4double scaledEnergy = kineticEnergy
159 if (scaledEnergy < lowEnergyLimit) {
160 if (modelName !=
"QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
161 scaledEnergy = lowEnergyLimit;
163 G4double eloss = StoppingPower(material,scaledEnergy) * factor;
173 return lowEnergyLimit;
181 return highEnergyLimit;
187 return lowEnergyLimit;
194 return highEnergyLimit;
221 const G4double* theAtomicNumDensityVector =
226 if( (eStopingPowerTable->
HasMaterial(material)) ) {
228 eloss = eStopingPowerTable->
StoppingPower(material, kineticEnergy);
229 if (
"QAO" != modelName) {
231 if(1 < numberOfElements) {
235 for (
G4int iel=0; iel<numberOfElements; iel++) {
236 nAtoms += theAtomsVector[iel];
243 }
else if(1 == numberOfElements) {
250 }
else if( MolecIsInZiegler1988(material)) {
259 for (
G4int i=0; i<numberOfElements; i++) {
260 const G4Element* element = (*theElementVector)[i] ;
263 * theAtomicNumDensityVector[i] ;
265 * theAtomicNumDensityVector[i] ;
269 eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
277 for (
G4int i=0; i<numberOfElements; i++)
279 const G4Element* element = (*theElementVector)[i] ;
282 * theAtomicNumDensityVector[i];
290G4bool G4hParametrisedLossModel::MolecIsInZiegler1988(
299 if (myFormula == chFormula )
return false ;
309 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
311 const size_t numberOfMolecula = 53 ;
314 static const G4double HeEff = 2.8735 ;
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"
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,
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,
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,
373 for (
size_t i=0; i<numberOfMolecula; i++)
375 if(chFormula == name[i]) {
378 (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
379 SetExpStopPower125(exp125) ;
389G4double G4hParametrisedLossModel::ChemicalFactor(
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)) ;
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 ) ) ) ;
std::vector< G4Element * > G4ElementVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4GLOB_DLL 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)
const char * name(G4int ptype)