Changeset 961 for trunk/source/processes/electromagnetic/lowenergy/src/G4FinalStateIonisationRudd.cc
- Timestamp:
- Apr 6, 2009, 12:21:12 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/processes/electromagnetic/lowenergy/src/G4FinalStateIonisationRudd.cc
r819 r961 24 24 // ******************************************************************** 25 25 // 26 // 27 // $Id: G4FinalStateIonisationRudd.cc,v 1.5 2007/11/26 17:27:09 pia Exp $ 28 // GEANT4 tag $Name: $ 29 // 30 // Contact Author: Sebastien Incerti (incerti@cenbg.in2p3.fr) 31 // Maria Grazia Pia (Maria.Grazia.Pia@cern.ch) 32 // 33 /// 34 // Reference: TNS Geant4-DNA paper 35 // Reference for implementation model: NIM. 155, pp. 145-156, 1978 36 // 37 // History: 38 // ----------- 39 // Date Name Modification 40 // 28 Apr 2007 M.G. Pia Created in compliance with design described in TNS paper 41 // Nov 2007 S. Incerti Implementation 42 // 26 Nov 2007 MGP Cleaned up std:: 43 // 44 // ------------------------------------------------------------------- 45 46 // Class description: 47 // Reference: TNS Geant4-DNA paper 48 // S. Chauvie et al., Geant4 physics processes for microdosimetry simulation: 49 // design foundation and implementation of the first set of models, 50 // IEEE Trans. Nucl. Sci., vol. 54, no. 6, Dec. 2007. 51 // Further documentation available from http://www.ge.infn.it/geant4/dna 52 53 // ------------------------------------------------------------------- 54 26 // $Id: G4FinalStateIonisationRudd.cc,v 1.8 2008/08/20 14:51:48 sincerti Exp $ 27 // GEANT4 tag $Name: geant4-09-02-ref-02 $ 55 28 56 29 #include "G4FinalStateIonisationRudd.hh" 57 #include "G4Track.hh" 58 #include "G4Step.hh" 59 #include "G4DynamicParticle.hh" 60 #include "Randomize.hh" 61 62 #include "G4ParticleTypes.hh" 63 #include "G4ParticleDefinition.hh" 64 #include "G4Electron.hh" 65 #include "G4Proton.hh" 66 #include "G4SystemOfUnits.hh" 67 #include "G4ParticleMomentum.hh" 68 #include "G4DNAGenericIonsManager.hh" 69 30 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 70 32 71 33 G4FinalStateIonisationRudd::G4FinalStateIonisationRudd() 72 34 { 73 name = "IonisationBorn";74 // Default energy limits (defined for protection against anomalous behaviour only)75 35 lowEnergyLimitDefault = 100 * eV; 76 36 highEnergyLimitDefault = 100 * MeV; … … 112 72 } 113 73 74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 114 75 115 76 G4FinalStateIonisationRudd::~G4FinalStateIonisationRudd() 116 { 117 118 77 {} 78 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 119 80 120 81 const G4FinalStateProduct& G4FinalStateIonisationRudd::GenerateFinalState(const G4Track& track, const G4Step& /* step */) 121 82 { 122 // Clear previous secondaries, energy deposit and particle kill status123 83 product.Clear(); 124 84 … … 132 92 const G4String& particleName = particle->GetDefinition()->GetParticleName(); 133 93 134 // Retrieve energy limits for the current particle type135 136 94 std::map< G4String,G4double,std::less<G4String> >::iterator pos1; 137 95 pos1 = lowEnergyLimit.find(particleName); 138 96 139 // Lower limit140 97 if (pos1 != lowEnergyLimit.end()) 141 { 142 lowLim = pos1->second; 143 } 144 145 // Upper limit 98 { 99 lowLim = pos1->second; 100 } 101 146 102 std::map< G4String,G4double,std::less<G4String> >::iterator pos2; 147 103 pos2 = highEnergyLimit.find(particleName); 148 104 149 105 if (pos2 != highEnergyLimit.end()) 150 { 151 highLim = pos2->second; 152 } 153 154 // Verify that the current track is within the energy limits of validity of the cross section model 106 { 107 highLim = pos2->second; 108 } 155 109 156 110 if (k >= lowLim && k <= highLim) 157 { 158 // Kinetic energy of primary particle 159 111 { 160 112 G4ParticleDefinition* definition = particle->GetDefinition(); 161 113 G4ParticleMomentum primaryDirection = particle->GetMomentumDirection(); … … 186 138 G4double deltaTotalMomentum = std::sqrt(secondaryKinetic*(secondaryKinetic + 2.*electron_mass_c2 )); 187 139 188 // Primary Particle Direction189 140 G4double finalPx = totalMomentum*primaryDirection.x() - deltaTotalMomentum*deltaDirection.x(); 190 141 G4double finalPy = totalMomentum*primaryDirection.y() - deltaTotalMomentum*deltaDirection.y(); … … 200 151 G4DynamicParticle* aElectron = new G4DynamicParticle(G4Electron::Electron(),deltaDirection,secondaryKinetic); 201 152 product.AddSecondary(aElectron); 202 } 203 204 if (k < lowLim) {product.KillPrimaryParticle();product.AddEnergyDeposit(k);} 153 } 154 155 if (k < lowLim) 156 { 157 product.KillPrimaryParticle(); 158 } 205 159 206 160 return product; 207 161 } 208 162 209 163 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 210 164 211 165 G4double G4FinalStateIonisationRudd::RandomizeEjectedElectronEnergy(G4ParticleDefinition* particleDefinition, … … 220 174 if (particleDefinition == G4Proton::ProtonDefinition() 221 175 || particleDefinition == instance->GetIon("hydrogen")) 222 223 { 176 { 224 177 maximumKineticEnergyTransfer= 4.* (electron_mass_c2 / proton_mass_c2) * k; 225 178 } 226 179 227 180 if (particleDefinition == instance->GetIon("helium") 228 181 || particleDefinition == instance->GetIon("alpha+") 229 182 || particleDefinition == instance->GetIon("alpha++")) 230 183 { 231 184 maximumKineticEnergyTransfer= 4.* (0.511 / 3728) * k; 232 185 } 233 186 234 187 G4double crossSectionMaximum = 0.; 188 235 189 for(G4double value=waterStructure.IonisationEnergy(shell); value<=4.*waterStructure.IonisationEnergy(shell) ; value+=0.1*eV) 236 190 { 237 191 G4double differentialCrossSection = DifferentialCrossSection(particleDefinition, k, value, shell); 238 192 if(differentialCrossSection >= crossSectionMaximum) crossSectionMaximum = differentialCrossSection; 239 } 193 } 194 240 195 G4double secElecKinetic = 0.; 241 do{ 196 197 do 198 { 242 199 secElecKinetic = G4UniformRand() * maximumKineticEnergyTransfer; 243 200 } while(G4UniformRand()*crossSectionMaximum > DifferentialCrossSection(particleDefinition, … … 249 206 } 250 207 208 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 209 251 210 252 211 void G4FinalStateIonisationRudd::RandomizeEjectedElectronDirection(G4ParticleDefinition* particleDefinition, 253 212 G4double k, 254 213 G4double secKinetic, 255 G4double cosTheta,256 G4double phi )214 G4double & cosTheta, 215 G4double & phi ) 257 216 { 258 217 G4DNAGenericIonsManager *instance; … … 263 222 if (particleDefinition == G4Proton::ProtonDefinition() 264 223 || particleDefinition == instance->GetIon("hydrogen")) 265 224 { 266 225 maxSecKinetic = 4.* (electron_mass_c2 / proton_mass_c2) * k; 267 226 } 268 227 269 228 if (particleDefinition == instance->GetIon("helium") 270 229 || particleDefinition == instance->GetIon("alpha+") 271 230 || particleDefinition == instance->GetIon("alpha++")) 272 231 { 273 232 maxSecKinetic = 4.* (0.511 / 3728) * k; 274 233 } 275 234 276 235 phi = twopi * G4UniformRand(); 277 236 cosTheta = std::sqrt(secKinetic / maxSecKinetic); 278 237 } 238 239 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 279 240 280 241 … … 314 275 315 276 if (j == 4) 316 277 { 317 278 //Data For Liquid Water K SHELL from Dingfelder (Protons in Water) 318 279 A1 = 1.25; … … 326 287 D2 = 0.00; 327 288 alphaConst = 0.66; 328 289 } 329 290 else 330 291 { 331 292 //Data For Liquid Water from Dingfelder (Protons in Water) 332 293 A1 = 1.02; … … 340 301 D2 = 0.04; 341 302 alphaConst = 0.64; 342 303 } 343 304 344 305 const G4double n = 2.; 345 306 const G4double Gj[5] = {0.99, 1.11, 1.11, 0.52, 1.}; 346 347 //const G4double I[5]={12.61*eV, 14.73*eV, 18.55*eV, 32.2*eV, 539.7*eV}; // for water Vapor348 //const G4double energyConstant[]={10.79*eV, 13.39*eV, 16.05*eV, 32.30*eV, 539.*eV};349 307 350 308 G4DNAGenericIonsManager* instance; … … 359 317 if (particleDefinition == G4Proton::ProtonDefinition() 360 318 || particleDefinition == instance->GetIon("hydrogen")) 361 319 { 362 320 tau = (electron_mass_c2/proton_mass_c2) * k ; 363 321 } 364 322 365 323 if ( particleDefinition == instance->GetIon("helium") 366 324 || particleDefinition == instance->GetIon("alpha+") 367 325 || particleDefinition == instance->GetIon("alpha++")) 368 326 { 369 327 tau = (0.511/3728.) * k ; 370 328 } 371 329 372 330 G4double S = 4.*pi * Bohr_radius*Bohr_radius * n * std::pow((Ry/waterStructure.IonisationEnergy(ionizationLevelIndex)),2); … … 390 348 || particleDefinition == instance->GetIon("hydrogen") 391 349 ) 392 350 { 393 351 return(sigma); 394 } 395 396 // ------------ 397 352 } 353 398 354 if (particleDefinition == instance->GetIon("alpha++") ) 399 355 { 400 356 slaterEffectiveCharge[0]=0.; 401 357 slaterEffectiveCharge[1]=0.; … … 404 360 sCoefficient[1]=0.; 405 361 sCoefficient[2]=0.; 406 362 } 407 363 408 364 if (particleDefinition == instance->GetIon("alpha+") ) 409 365 { 410 366 slaterEffectiveCharge[0]=2.0; 411 367 slaterEffectiveCharge[1]=1.15; … … 414 370 sCoefficient[1]=0.15; 415 371 sCoefficient[2]=0.15; 416 372 } 417 373 418 374 if (particleDefinition == instance->GetIon("helium") ) 419 375 { 420 376 slaterEffectiveCharge[0]=1.7; 421 377 slaterEffectiveCharge[1]=1.15; … … 424 380 sCoefficient[1]=0.25; 425 381 sCoefficient[2]=0.25; 426 382 } 427 383 428 384 if ( particleDefinition == instance->GetIon("helium") … … 430 386 || particleDefinition == instance->GetIon("alpha++") 431 387 ) 432 388 { 433 389 sigma = Gj[j] * (S/waterStructure.IonisationEnergy(ionizationLevelIndex)) * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(alphaConst*(w-wc)/v))) ); 434 390 … … 440 396 441 397 return zEff * zEff * sigma ; 442 398 } 443 399 444 400 return 0; 445 401 } 402 403 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 446 404 447 405 G4double G4FinalStateIonisationRudd::S_1s(G4double t, … … 459 417 } 460 418 461 419 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 462 420 463 421 G4double G4FinalStateIonisationRudd::S_2s(G4double t, … … 476 434 } 477 435 478 436 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 479 437 480 438 G4double G4FinalStateIonisationRudd::S_2p(G4double t, … … 492 450 } 493 451 494 452 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 495 453 496 454 G4double G4FinalStateIonisationRudd::R(G4double t, … … 500 458 { 501 459 // tElectron = m_electron / m_alpha * t 502 // Hardcoded in Riccardo's implementation; to be corrected503 460 // Dingfelder, in Chattanooga 2005 proceedings, p 4 504 461 … … 509 466 } 510 467 511 468 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 512 469 513 470 G4double G4FinalStateIonisationRudd::CorrectionFactor(G4ParticleDefinition* particleDefinition, G4double k) … … 517 474 518 475 if (particleDefinition == G4Proton::Proton()) 519 476 { 520 477 return(1.); 521 478 } 522 479 else 523 480 if (particleDefinition == instance->GetIon("hydrogen")) 524 481 { 525 482 G4double value = (std::log(k/eV)-4.2)/0.5; 526 483 return((0.8/(1+std::exp(value))) + 0.9); 527 484 } 528 485 else 529 486 { 530 487 return(1.); 531 532 } 488 } 489 }
Note: See TracChangeset
for help on using the changeset viewer.