#include <G4DNAMillerGreenExcitationModel.hh>
Inheritance diagram for G4DNAMillerGreenExcitationModel:
Public Member Functions | |
G4DNAMillerGreenExcitationModel (const G4ParticleDefinition *p=0, const G4String &nam="DNAMillerGreenExcitationModel") | |
virtual | ~G4DNAMillerGreenExcitationModel () |
virtual void | Initialise (const G4ParticleDefinition *, const G4DataVector &) |
virtual G4double | CrossSectionPerVolume (const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax) |
virtual void | SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) |
Protected Attributes | |
G4ParticleChangeForGamma * | fParticleChangeForGamma |
Definition at line 43 of file G4DNAMillerGreenExcitationModel.hh.
G4DNAMillerGreenExcitationModel::G4DNAMillerGreenExcitationModel | ( | const G4ParticleDefinition * | p = 0 , |
|
const G4String & | nam = "DNAMillerGreenExcitationModel" | |||
) |
Definition at line 41 of file G4DNAMillerGreenExcitationModel.cc.
References fParticleChangeForGamma, G4cout, and G4endl.
00043 :G4VEmModel(nam),isInitialised(false) 00044 { 00045 // nistwater = G4NistManager::Instance()->FindOrBuildMaterial("G4_WATER"); 00046 fpMolWaterDensity = 0; 00047 00048 nLevels=0; 00049 kineticEnergyCorrection[0]=0.; 00050 kineticEnergyCorrection[1]=0.; 00051 kineticEnergyCorrection[2]=0.; 00052 kineticEnergyCorrection[3]=0.; 00053 00054 verboseLevel= 0; 00055 // Verbosity scale: 00056 // 0 = nothing 00057 // 1 = warning for energy non-conservation 00058 // 2 = details of energy budget 00059 // 3 = calculation of cross sections, file openings, sampling of atoms 00060 // 4 = entering in methods 00061 00062 if( verboseLevel>0 ) 00063 { 00064 G4cout << "Miller & Green excitation model is constructed " << G4endl; 00065 } 00066 fParticleChangeForGamma = 0; 00067 }
G4DNAMillerGreenExcitationModel::~G4DNAMillerGreenExcitationModel | ( | ) | [virtual] |
G4double G4DNAMillerGreenExcitationModel::CrossSectionPerVolume | ( | const G4Material * | material, | |
const G4ParticleDefinition * | p, | |||
G4double | ekin, | |||
G4double | emin, | |||
G4double | emax | |||
) | [virtual] |
Reimplemented from G4VEmModel.
Definition at line 222 of file G4DNAMillerGreenExcitationModel.cc.
References G4cout, G4endl, G4Material::GetIndex(), G4DNAGenericIonsManager::GetIon(), G4ParticleDefinition::GetParticleName(), G4DNAGenericIonsManager::Instance(), and G4Proton::ProtonDefinition().
00227 { 00228 if (verboseLevel > 3) 00229 G4cout << "Calling CrossSectionPerVolume() of G4DNAMillerGreenExcitationModel" << G4endl; 00230 00231 // Calculate total cross section for model 00232 00233 G4DNAGenericIonsManager *instance; 00234 instance = G4DNAGenericIonsManager::Instance(); 00235 00236 if ( 00237 particleDefinition != G4Proton::ProtonDefinition() 00238 && 00239 particleDefinition != instance->GetIon("hydrogen") 00240 && 00241 particleDefinition != instance->GetIon("alpha++") 00242 && 00243 particleDefinition != instance->GetIon("alpha+") 00244 && 00245 particleDefinition != instance->GetIon("helium") 00246 ) 00247 00248 return 0; 00249 00250 G4double lowLim = 0; 00251 G4double highLim = 0; 00252 G4double crossSection = 0.; 00253 00254 G4double waterDensity = (*fpMolWaterDensity)[material->GetIndex()]; 00255 00256 if(waterDensity!= 0.0) 00257 // if (material == nistwater || material->GetBaseMaterial() == nistwater) 00258 { 00259 // G4cout << "WATER DENSITY = " << waterDensity*G4Material::GetMaterial("G4_WATER")->GetMassOfMolecule()/(g/cm3) 00260 // << G4endl; 00261 const G4String& particleName = particleDefinition->GetParticleName(); 00262 00263 std::map< G4String,G4double,std::less<G4String> >::iterator pos1; 00264 pos1 = lowEnergyLimit.find(particleName); 00265 00266 if (pos1 != lowEnergyLimit.end()) 00267 { 00268 lowLim = pos1->second; 00269 } 00270 00271 std::map< G4String,G4double,std::less<G4String> >::iterator pos2; 00272 pos2 = highEnergyLimit.find(particleName); 00273 00274 if (pos2 != highEnergyLimit.end()) 00275 { 00276 highLim = pos2->second; 00277 } 00278 00279 if (k >= lowLim && k < highLim) 00280 { 00281 crossSection = Sum(k,particleDefinition); 00282 00283 // add ONE or TWO electron-water excitation for alpha+ and helium 00284 /* 00285 if ( particleDefinition == instance->GetIon("alpha+") 00286 || 00287 particleDefinition == instance->GetIon("helium") 00288 ) 00289 { 00290 00291 G4DNAEmfietzoglouExcitationModel * excitationXS = new G4DNAEmfietzoglouExcitationModel(); 00292 excitationXS->Initialise(G4Electron::ElectronDefinition()); 00293 00294 G4double sigmaExcitation=0; 00295 G4double tmp =0.; 00296 00297 if (k*0.511/3728 > 8.23*eV && k*0.511/3728 < 10*MeV ) sigmaExcitation = 00298 excitationXS->CrossSectionPerVolume(material,G4Electron::ElectronDefinition(),k*0.511/3728,tmp,tmp) 00299 /material->GetAtomicNumDensityVector()[1]; 00300 00301 if ( particleDefinition == instance->GetIon("alpha+") ) 00302 crossSection = crossSection + sigmaExcitation ; 00303 00304 if ( particleDefinition == instance->GetIon("helium") ) 00305 crossSection = crossSection + 2*sigmaExcitation ; 00306 00307 delete excitationXS; 00308 00309 // Alternative excitation model 00310 00311 G4DNABornExcitationModel * excitationXS = new G4DNABornExcitationModel(); 00312 excitationXS->Initialise(G4Electron::ElectronDefinition()); 00313 00314 G4double sigmaExcitation=0; 00315 G4double tmp=0; 00316 00317 if (k*0.511/3728 > 9*eV && k*0.511/3728 < 1*MeV ) sigmaExcitation = 00318 excitationXS->CrossSectionPerVolume(material,G4Electron::ElectronDefinition(),k*0.511/3728,tmp,tmp) 00319 /material->GetAtomicNumDensityVector()[1]; 00320 00321 if ( particleDefinition == instance->GetIon("alpha+") ) 00322 crossSection = crossSection + sigmaExcitation ; 00323 00324 if ( particleDefinition == instance->GetIon("helium") ) 00325 crossSection = crossSection + 2*sigmaExcitation ; 00326 00327 delete excitationXS; 00328 00329 } 00330 */ 00331 00332 } 00333 00334 if (verboseLevel > 2) 00335 { 00336 G4cout << "__________________________________" << G4endl; 00337 G4cout << "°°° G4DNAMillerGreenExcitationModel - XS INFO START" << G4endl; 00338 G4cout << "°°° Kinetic energy(eV)=" << k/eV << " particle : " << particleDefinition->GetParticleName() << G4endl; 00339 G4cout << "°°° Cross section per water molecule (cm^2)=" << crossSection/cm/cm << G4endl; 00340 G4cout << "°°° Cross section per water molecule (cm^-1)=" << crossSection*waterDensity/(1./cm) << G4endl; 00341 // G4cout << " - Cross section per water molecule (cm^-1)=" << sigma*material->GetAtomicNumDensityVector()[1]/(1./cm) << G4endl; 00342 G4cout << "°°° G4DNAMillerGreenExcitationModel - XS INFO END" << G4endl; 00343 } 00344 } 00345 else 00346 { 00347 if (verboseLevel > 2) 00348 { 00349 G4cout << "MillerGreenExcitationModel : WARNING Water density is NULL" << G4endl; 00350 } 00351 } 00352 00353 return crossSection*waterDensity; 00354 // return crossSection*material->GetAtomicNumDensityVector()[1]; 00355 00356 }
void G4DNAMillerGreenExcitationModel::Initialise | ( | const G4ParticleDefinition * | , | |
const G4DataVector & | ||||
) | [virtual] |
Implements G4VEmModel.
Definition at line 76 of file G4DNAMillerGreenExcitationModel.cc.
References fParticleChangeForGamma, G4cout, G4endl, G4DNAGenericIonsManager::GetIon(), G4Material::GetMaterial(), G4DNAMolecularMaterial::GetNumMolPerVolTableFor(), G4VEmModel::GetParticleChangeForGamma(), G4ParticleDefinition::GetParticleName(), G4VEmModel::HighEnergyLimit(), G4DNAMolecularMaterial::Instance(), G4DNAGenericIonsManager::Instance(), G4VEmModel::LowEnergyLimit(), G4DNAWaterExcitationStructure::NumberOfLevels(), G4InuclParticleNames::proton, G4Proton::ProtonDefinition(), G4VEmModel::SetHighEnergyLimit(), and G4VEmModel::SetLowEnergyLimit().
00078 { 00079 00080 if (verboseLevel > 3) 00081 G4cout << "Calling G4DNAMillerGreenExcitationModel::Initialise()" << G4endl; 00082 00083 // Energy limits 00084 00085 G4DNAGenericIonsManager *instance; 00086 instance = G4DNAGenericIonsManager::Instance(); 00087 G4ParticleDefinition* protonDef = G4Proton::ProtonDefinition(); 00088 G4ParticleDefinition* hydrogenDef = instance->GetIon("hydrogen"); 00089 G4ParticleDefinition* alphaPlusPlusDef = instance->GetIon("alpha++"); 00090 G4ParticleDefinition* alphaPlusDef = instance->GetIon("alpha+"); 00091 G4ParticleDefinition* heliumDef = instance->GetIon("helium"); 00092 00093 G4String proton; 00094 G4String hydrogen; 00095 G4String alphaPlusPlus; 00096 G4String alphaPlus; 00097 G4String helium; 00098 00099 // LIMITS AND CONSTANTS 00100 00101 proton = protonDef->GetParticleName(); 00102 lowEnergyLimit[proton] = 10. * eV; 00103 highEnergyLimit[proton] = 500. * keV; 00104 00105 kineticEnergyCorrection[0] = 1.; 00106 slaterEffectiveCharge[0][0] = 0.; 00107 slaterEffectiveCharge[1][0] = 0.; 00108 slaterEffectiveCharge[2][0] = 0.; 00109 sCoefficient[0][0] = 0.; 00110 sCoefficient[1][0] = 0.; 00111 sCoefficient[2][0] = 0.; 00112 00113 hydrogen = hydrogenDef->GetParticleName(); 00114 lowEnergyLimit[hydrogen] = 10. * eV; 00115 highEnergyLimit[hydrogen] = 500. * keV; 00116 00117 kineticEnergyCorrection[0] = 1.; 00118 slaterEffectiveCharge[0][0] = 0.; 00119 slaterEffectiveCharge[1][0] = 0.; 00120 slaterEffectiveCharge[2][0] = 0.; 00121 sCoefficient[0][0] = 0.; 00122 sCoefficient[1][0] = 0.; 00123 sCoefficient[2][0] = 0.; 00124 00125 alphaPlusPlus = alphaPlusPlusDef->GetParticleName(); 00126 lowEnergyLimit[alphaPlusPlus] = 1. * keV; 00127 highEnergyLimit[alphaPlusPlus] = 400. * MeV; 00128 00129 kineticEnergyCorrection[1] = 0.9382723/3.727417; 00130 slaterEffectiveCharge[0][1]=0.; 00131 slaterEffectiveCharge[1][1]=0.; 00132 slaterEffectiveCharge[2][1]=0.; 00133 sCoefficient[0][1]=0.; 00134 sCoefficient[1][1]=0.; 00135 sCoefficient[2][1]=0.; 00136 00137 alphaPlus = alphaPlusDef->GetParticleName(); 00138 lowEnergyLimit[alphaPlus] = 1. * keV; 00139 highEnergyLimit[alphaPlus] = 400. * MeV; 00140 00141 kineticEnergyCorrection[2] = 0.9382723/3.727417; 00142 slaterEffectiveCharge[0][2]=2.0; 00143 00144 // Following values provided by M. Dingfelder 00145 slaterEffectiveCharge[1][2]=2.00; 00146 slaterEffectiveCharge[2][2]=2.00; 00147 // 00148 sCoefficient[0][2]=0.7; 00149 sCoefficient[1][2]=0.15; 00150 sCoefficient[2][2]=0.15; 00151 00152 helium = heliumDef->GetParticleName(); 00153 lowEnergyLimit[helium] = 1. * keV; 00154 highEnergyLimit[helium] = 400. * MeV; 00155 00156 kineticEnergyCorrection[3] = 0.9382723/3.727417; 00157 slaterEffectiveCharge[0][3]=1.7; 00158 slaterEffectiveCharge[1][3]=1.15; 00159 slaterEffectiveCharge[2][3]=1.15; 00160 sCoefficient[0][3]=0.5; 00161 sCoefficient[1][3]=0.25; 00162 sCoefficient[2][3]=0.25; 00163 00164 // 00165 00166 if (particle==protonDef) 00167 { 00168 SetLowEnergyLimit(lowEnergyLimit[proton]); 00169 SetHighEnergyLimit(highEnergyLimit[proton]); 00170 } 00171 00172 if (particle==hydrogenDef) 00173 { 00174 SetLowEnergyLimit(lowEnergyLimit[hydrogen]); 00175 SetHighEnergyLimit(highEnergyLimit[hydrogen]); 00176 } 00177 00178 if (particle==alphaPlusPlusDef) 00179 { 00180 SetLowEnergyLimit(lowEnergyLimit[alphaPlusPlus]); 00181 SetHighEnergyLimit(highEnergyLimit[alphaPlusPlus]); 00182 } 00183 00184 if (particle==alphaPlusDef) 00185 { 00186 SetLowEnergyLimit(lowEnergyLimit[alphaPlus]); 00187 SetHighEnergyLimit(highEnergyLimit[alphaPlus]); 00188 } 00189 00190 if (particle==heliumDef) 00191 { 00192 SetLowEnergyLimit(lowEnergyLimit[helium]); 00193 SetHighEnergyLimit(highEnergyLimit[helium]); 00194 } 00195 00196 // 00197 00198 nLevels = waterExcitation.NumberOfLevels(); 00199 00200 // 00201 if( verboseLevel>0 ) 00202 { 00203 G4cout << "Miller & Green excitation model is initialized " << G4endl 00204 << "Energy range: " 00205 << LowEnergyLimit() / eV << " eV - " 00206 << HighEnergyLimit() / keV << " keV for " 00207 << particle->GetParticleName() 00208 << G4endl; 00209 } 00210 00211 // Initialize water density pointer 00212 fpMolWaterDensity = G4DNAMolecularMaterial::Instance()->GetNumMolPerVolTableFor(G4Material::GetMaterial("G4_WATER")); 00213 00214 if (isInitialised) { return; } 00215 fParticleChangeForGamma = GetParticleChangeForGamma(); 00216 isInitialised = true; 00217 00218 }
void G4DNAMillerGreenExcitationModel::SampleSecondaries | ( | std::vector< G4DynamicParticle * > * | , | |
const G4MaterialCutsCouple * | , | |||
const G4DynamicParticle * | , | |||
G4double | tmin, | |||
G4double | maxEnergy | |||
) | [virtual] |
Implements G4VEmModel.
Definition at line 360 of file G4DNAMillerGreenExcitationModel.cc.
References G4DNAChemistryManager::CreateWaterMolecule(), eExcitedMolecule, fParticleChangeForGamma, G4cout, G4endl, G4ParticleChangeForGamma::GetCurrentTrack(), G4DynamicParticle::GetDefinition(), G4DynamicParticle::GetKineticEnergy(), G4DynamicParticle::GetMomentumDirection(), G4DNAChemistryManager::Instance(), G4VParticleChange::ProposeLocalEnergyDeposit(), G4ParticleChangeForGamma::ProposeMomentumDirection(), and G4ParticleChangeForGamma::SetProposedKineticEnergy().
00365 { 00366 00367 if (verboseLevel > 3) 00368 G4cout << "Calling SampleSecondaries() of G4DNAMillerGreenExcitationModel" << G4endl; 00369 00370 G4double particleEnergy0 = aDynamicParticle->GetKineticEnergy(); 00371 00372 G4int level = RandomSelect(particleEnergy0,aDynamicParticle->GetDefinition()); 00373 00374 // G4double excitationEnergy = waterExcitation.ExcitationEnergy(level); 00375 00376 // Dingfelder's excitation levels 00377 const G4double excitation[]={ 8.17*eV, 10.13*eV, 11.31*eV, 12.91*eV, 14.50*eV}; 00378 G4double excitationEnergy = excitation[level]; 00379 00380 G4double newEnergy = particleEnergy0 - excitationEnergy; 00381 00382 if (newEnergy>0) 00383 { 00384 fParticleChangeForGamma->ProposeMomentumDirection(aDynamicParticle->GetMomentumDirection()); 00385 fParticleChangeForGamma->SetProposedKineticEnergy(newEnergy); 00386 fParticleChangeForGamma->ProposeLocalEnergyDeposit(excitationEnergy); 00387 00388 const G4Track * theIncomingTrack = fParticleChangeForGamma->GetCurrentTrack(); 00389 G4DNAChemistryManager::Instance()->CreateWaterMolecule(eExcitedMolecule, 00390 level, 00391 theIncomingTrack); 00392 00393 } 00394 00395 }
Definition at line 69 of file G4DNAMillerGreenExcitationModel.hh.
Referenced by G4DNAMillerGreenExcitationModel(), Initialise(), and SampleSecondaries().