Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 28 #include "G4DNAMillerGreenExcitationModel.hh" 29 #include "G4SystemOfUnits.hh" 30 #include "G4DNAChemistryManager.hh" 31 #include "G4DNAMolecularMaterial.hh" 32 #include "G4Exp.hh" 33 #include "G4Pow.hh" 34 #include "G4Alpha.hh" 35 36 static G4Pow * gpow = G4Pow::GetInstance(); 37 //....oooOO0OOooo........oooOO0OOooo........oo 38 39 using namespace std; 40 41 //....oooOO0OOooo........oooOO0OOooo........oo 42 43 G4DNAMillerGreenExcitationModel::G4DNAMillerGr 44 45 :G4VEmModel(nam) 46 { 47 fpMolWaterDensity = nullptr; 48 49 nLevels=0; 50 kineticEnergyCorrection[0]=0.; 51 kineticEnergyCorrection[1]=0.; 52 kineticEnergyCorrection[2]=0.; 53 kineticEnergyCorrection[3]=0.; 54 55 verboseLevel= 0; 56 // Verbosity scale: 57 // 0 = nothing 58 // 1 = warning for energy non-conservation 59 // 2 = details of energy budget 60 // 3 = calculation of cross sections, file o 61 // 4 = entering in methods 62 63 if( verboseLevel>0 ) 64 { 65 G4cout << "Miller & Green excitation model 66 } 67 fParticleChangeForGamma = nullptr; 68 69 // Selection of stationary mode 70 71 statCode = false; 72 } 73 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 G4DNAMillerGreenExcitationModel::~G4DNAMillerG 77 = default; 78 79 //....oooOO0OOooo........oooOO0OOooo........oo 80 81 void G4DNAMillerGreenExcitationModel::Initiali 82 83 { 84 85 if (verboseLevel > 3) 86 G4cout << "Calling G4DNAMillerGreenExcitat 87 88 // Energy limits 89 90 G4DNAGenericIonsManager *instance; 91 instance = G4DNAGenericIonsManager::Instance 92 protonDef = G4Proton::ProtonDefinition(); 93 hydrogenDef = instance->GetIon("hydrogen"); 94 alphaPlusPlusDef = G4Alpha::Alpha(); 95 alphaPlusDef = instance->GetIon("alpha+"); 96 heliumDef = instance->GetIon("helium"); 97 98 G4String proton; 99 G4String hydrogen; 100 G4String alphaPlusPlus; 101 G4String alphaPlus; 102 G4String helium; 103 104 // LIMITS AND CONSTANTS 105 106 proton = protonDef->GetParticleName(); 107 lowEnergyLimit[proton] = 10. * eV; 108 highEnergyLimit[proton] = 500. * keV; 109 110 kineticEnergyCorrection[0] = 1.; 111 slaterEffectiveCharge[0][0] = 0.; 112 slaterEffectiveCharge[1][0] = 0.; 113 slaterEffectiveCharge[2][0] = 0.; 114 sCoefficient[0][0] = 0.; 115 sCoefficient[1][0] = 0.; 116 sCoefficient[2][0] = 0.; 117 118 hydrogen = hydrogenDef->GetParticleName(); 119 lowEnergyLimit[hydrogen] = 10. * eV; 120 highEnergyLimit[hydrogen] = 500. * keV; 121 122 kineticEnergyCorrection[0] = 1.; 123 slaterEffectiveCharge[0][0] = 0.; 124 slaterEffectiveCharge[1][0] = 0.; 125 slaterEffectiveCharge[2][0] = 0.; 126 sCoefficient[0][0] = 0.; 127 sCoefficient[1][0] = 0.; 128 sCoefficient[2][0] = 0.; 129 130 alphaPlusPlus = alphaPlusPlusDef->GetParticl 131 lowEnergyLimit[alphaPlusPlus] = 1. * keV; 132 highEnergyLimit[alphaPlusPlus] = 400. * MeV; 133 134 kineticEnergyCorrection[1] = 0.9382723/3.727 135 slaterEffectiveCharge[0][1]=0.; 136 slaterEffectiveCharge[1][1]=0.; 137 slaterEffectiveCharge[2][1]=0.; 138 sCoefficient[0][1]=0.; 139 sCoefficient[1][1]=0.; 140 sCoefficient[2][1]=0.; 141 142 alphaPlus = alphaPlusDef->GetParticleName(); 143 lowEnergyLimit[alphaPlus] = 1. * keV; 144 highEnergyLimit[alphaPlus] = 400. * MeV; 145 146 kineticEnergyCorrection[2] = 0.9382723/3.727 147 slaterEffectiveCharge[0][2]=2.0; 148 149 // Following values provided by M. Dingfelde 150 slaterEffectiveCharge[1][2]=2.00; 151 slaterEffectiveCharge[2][2]=2.00; 152 // 153 sCoefficient[0][2]=0.7; 154 sCoefficient[1][2]=0.15; 155 sCoefficient[2][2]=0.15; 156 157 helium = heliumDef->GetParticleName(); 158 lowEnergyLimit[helium] = 1. * keV; 159 highEnergyLimit[helium] = 400. * MeV; 160 161 kineticEnergyCorrection[3] = 0.9382723/3.727 162 slaterEffectiveCharge[0][3]=1.7; 163 slaterEffectiveCharge[1][3]=1.15; 164 slaterEffectiveCharge[2][3]=1.15; 165 sCoefficient[0][3]=0.5; 166 sCoefficient[1][3]=0.25; 167 sCoefficient[2][3]=0.25; 168 169 // 170 171 if (particle==protonDef) 172 { 173 SetLowEnergyLimit(lowEnergyLimit[proton]); 174 SetHighEnergyLimit(highEnergyLimit[proton] 175 } 176 177 if (particle==hydrogenDef) 178 { 179 SetLowEnergyLimit(lowEnergyLimit[hydrogen] 180 SetHighEnergyLimit(highEnergyLimit[hydroge 181 } 182 183 if (particle==alphaPlusPlusDef) 184 { 185 SetLowEnergyLimit(lowEnergyLimit[alphaPlus 186 SetHighEnergyLimit(highEnergyLimit[alphaPl 187 } 188 189 if (particle==alphaPlusDef) 190 { 191 SetLowEnergyLimit(lowEnergyLimit[alphaPlus 192 SetHighEnergyLimit(highEnergyLimit[alphaPl 193 } 194 195 if (particle==heliumDef) 196 { 197 SetLowEnergyLimit(lowEnergyLimit[helium]); 198 SetHighEnergyLimit(highEnergyLimit[helium] 199 } 200 201 // 202 203 nLevels = waterExcitation.NumberOfLevels(); 204 205 // 206 if( verboseLevel>0 ) 207 { 208 G4cout << "Miller & Green excitation model 209 << "Energy range: " 210 << LowEnergyLimit() / eV << " eV - 211 << HighEnergyLimit() / keV << " keV 212 << particle->GetParticleName() 213 << G4endl; 214 } 215 216 // Initialize water density pointer 217 fpMolWaterDensity = G4DNAMolecularMaterial:: 218 219 if (isInitialised) { return; } 220 fParticleChangeForGamma = GetParticleChangeF 221 isInitialised = true; 222 223 } 224 225 //....oooOO0OOooo........oooOO0OOooo........oo 226 227 G4double G4DNAMillerGreenExcitationModel::Cros 228 229 230 231 232 { 233 if (verboseLevel > 3) 234 G4cout << "Calling CrossSectionPerVolume() 235 236 // Calculate total cross section for model 237 238 if ( 239 particleDefinition != protonDef 240 && 241 particleDefinition != hydrogenDef 242 && 243 particleDefinition != alphaPlusPlusDef 244 && 245 particleDefinition != alphaPlusDef 246 && 247 particleDefinition != heliumDef 248 ) 249 250 return 0; 251 252 G4double lowLim = 0; 253 G4double highLim = 0; 254 G4double crossSection = 0.; 255 256 G4double waterDensity = (*fpMolWaterDensity) 257 258 const G4String& particleName = particleDefin 259 260 std::map< G4String,G4double,std::less<G4Stri 261 pos1 = lowEnergyLimit.find(particleName); 262 263 if (pos1 != lowEnergyLimit.end()) 264 { 265 lowLim = pos1->second; 266 } 267 268 std::map< G4String,G4double,std::less<G4Stri 269 pos2 = highEnergyLimit.find(particleName); 270 271 if (pos2 != highEnergyLimit.end()) 272 { 273 highLim = pos2->second; 274 } 275 276 if (k >= lowLim && k <= highLim) 277 { 278 crossSection = Sum(k,particleDefinition); 279 280 // add ONE or TWO electron-water excitatio 281 /* 282 if ( particleDefinition == alphaPlusDef 283 || 284 particleDefinition == heliumDef 285 ) 286 { 287 288 G4DNAEmfietzoglouExcitationModel * excit 289 excitationXS->Initialise(G4Electron: 290 291 G4double sigmaExcitation=0; 292 G4double tmp =0.; 293 294 if (k*0.511/3728 > 8.23*eV && k*0.511/37 295 excitationXS->CrossSectionPerVolume(ma 296 /material->GetAtomicNumDensityVector() 297 298 if ( particleDefinition == alphaPlusDef 299 crossSection = crossSection + sigmaEx 300 301 if ( particleDefinition == heliumDef ) 302 crossSection = crossSection + 2*sigmaE 303 304 delete excitationXS; 305 306 // Alternative excitation model 307 308 G4DNABornExcitationModel * excitatio 309 excitationXS->Initialise(G4Electron: 310 311 G4double sigmaExcitation=0; 312 G4double tmp=0; 313 314 if (k*0.511/3728 > 9*eV && k*0.511/3728 315 excitationXS->CrossSectionPerVolume(ma 316 /material->GetAtomicNumDensityVector() 317 318 if ( particleDefinition == alphaPlusDef 319 crossSection = crossSection + sigmaEx 320 321 if ( particleDefinition == heliumDef ) 322 crossSection = crossSection + 2*sigmaE 323 324 delete excitationXS; 325 326 } 327 */ 328 329 } 330 331 if (verboseLevel > 2) 332 { 333 G4cout << "_______________________________ 334 G4cout << "G4DNAMillerGreenExcitationModel 335 G4cout << "Kinetic energy(eV)=" << k/eV << 336 G4cout << "Cross section per water molecul 337 G4cout << "Cross section per water molecul 338 // G4cout << " - Cross section per water m 339 G4cout << "G4DNAMillerGreenExcitationModel 340 } 341 342 return crossSection*waterDensity; 343 } 344 345 //....oooOO0OOooo........oooOO0OOooo........oo 346 347 void G4DNAMillerGreenExcitationModel::SampleSe 348 349 350 351 352 { 353 354 if (verboseLevel > 3) 355 G4cout << "Calling SampleSecondaries() of 356 357 G4double particleEnergy0 = aDynamicParticle- 358 359 G4int level = RandomSelect(particleEnergy0,a 360 361 // Dingfelder's excitation levels 362 const G4double excitation[]={ 8.17*eV, 10.13 363 G4double excitationEnergy = excitation[level 364 365 G4double newEnergy = 0.; 366 367 if (!statCode) newEnergy = particleEnergy0 - 368 369 else newEnergy = particleEnergy0; 370 371 if (newEnergy>0) 372 { 373 fParticleChangeForGamma->ProposeMomentumDi 374 fParticleChangeForGamma->SetProposedKineti 375 fParticleChangeForGamma->ProposeLocalEnerg 376 377 const G4Track * theIncomingTrack = fPartic 378 G4DNAChemistryManager::Instance()->CreateW 379 level, theIncomingTrack); 380 381 } 382 383 } 384 385 //....oooOO0OOooo........oooOO0OOooo........oo 386 387 G4double G4DNAMillerGreenExcitationModel::GetP 388 G4in 389 cons 390 G4do 391 { 392 return PartialCrossSection(kineticEnergy, le 393 } 394 395 //....oooOO0OOooo........oooOO0OOooo........oo 396 397 G4double G4DNAMillerGreenExcitationModel::Part 398 399 { 400 // ( ( z * aj 401 // sigma(t) = zEff^2 * sigma0 * ------------ 402 // jj ^ ( omeg 403 // 404 // where t is the kinetic energy corrected b 405 // 406 // zEff is: 407 // 1 for protons 408 // 2 for alpha++ 409 // and 2 - c1 S_1s - c2 S_2s - c3 S_2p for 410 // 411 // Dingfelder et al., RPC 59, 255-275, 2000 412 // Formula (34) and Table 2 413 414 const G4double sigma0(1.E+8 * barn); 415 const G4double nu(1.); 416 const G4double aj[]={876.*eV, 2084.* eV, 137 417 const G4double jj[]={19820.*eV, 23490.*eV, 2 418 const G4double omegaj[]={0.85, 0.88, 0.88, 0 419 420 // Dingfelder's excitation levels 421 const G4double Eliq[5]={ 8.17*eV, 10.13*eV, 422 423 G4int particleTypeIndex = 0; 424 425 if (particleDefinition == protonDef) particl 426 if (particleDefinition == hydrogenDef) parti 427 if (particleDefinition == alphaPlusPlusDef) 428 if (particleDefinition == alphaPlusDef) part 429 if (particleDefinition == heliumDef) particl 430 431 G4double tCorrected; 432 tCorrected = k * kineticEnergyCorrection[par 433 434 // SI - added protection 435 if (tCorrected < Eliq[excitationLevel]) retu 436 // 437 438 G4int z = 10; 439 440 G4double numerator; 441 numerator = gpow->powA(z * aj[excitationLeve 442 gpow->powA(tCorrected - Eliq[exc 443 444 // H case : see S. Uehara et al. IJRB 77, 2, 445 446 if (particleDefinition == hydrogenDef) 447 numerator = gpow->powA(z * 0.75*aj[excit 448 gpow->powA(tCorrected - Eliq 449 450 451 G4double power; 452 power = omegaj[excitationLevel] + nu; 453 454 G4double denominator; 455 denominator = gpow->powA(jj[excitationLevel] 456 457 G4double zEff = particleDefinition->GetPDGCh 458 459 zEff -= ( sCoefficient[0][particleTypeIndex] 460 sCoefficient[1][particleTypeIndex] * 461 sCoefficient[2][particleTypeIndex] * 462 463 if (particleDefinition == hydrogenDef) zEff 464 465 G4double cross = sigma0 * zEff * zEff * nume 466 467 468 return cross; 469 } 470 471 //....oooOO0OOooo........oooOO0OOooo........oo 472 473 G4int G4DNAMillerGreenExcitationModel::RandomS 474 { 475 G4int i = nLevels; 476 G4double value = 0.; 477 std::deque<G4double> values; 478 479 if ( particle == alphaPlusPlusDef || 480 particle == protonDef|| 481 particle == hydrogenDef || 482 particle == alphaPlusDef || 483 particle == heliumDef 484 ) 485 { 486 while (i > 0) 487 { 488 i--; 489 G4double partial = PartialCrossSection(k 490 values.push_front(partial); 491 value += partial; 492 } 493 494 value *= G4UniformRand(); 495 496 i = nLevels; 497 498 while (i > 0) 499 { 500 i--; 501 if (values[i] > value) return i; 502 value -= values[i]; 503 } 504 } 505 506 /* 507 // add ONE or TWO electron-water excitation 508 509 if ( particle == alphaPlusDef 510 || 511 particle == heliumDef 512 ) 513 { 514 while (i>0) 515 { 516 i--; 517 518 G4DNAEmfietzoglouExcitationModel * e 519 excitationXS->Initialise(G4Electron: 520 521 G4double sigmaExcitation=0; 522 523 if (k*0.511/3728 > 8.23*eV && k*0.511/37 524 525 G4double partial = PartialCrossSection(k 526 527 if (particle == alphaPlusDef) partial = 528 if (particle == heliumDef) partial = Par 529 530 values.push_front(partial); 531 value += partial; 532 delete excitationXS; 533 } 534 535 value*=G4UniformRand(); 536 537 i=5; 538 while (i>0) 539 { 540 i--; 541 542 if (values[i]>value) return i; 543 544 value-=values[i]; 545 } 546 } 547 */ 548 549 return 0; 550 } 551 552 //....oooOO0OOooo........oooOO0OOooo........oo 553 554 G4double G4DNAMillerGreenExcitationModel::Sum( 555 { 556 G4double totalCrossSection = 0.; 557 558 for (G4int i=0; i<nLevels; i++) 559 { 560 totalCrossSection += PartialCrossSection(k 561 } 562 return totalCrossSection; 563 } 564 565 //....oooOO0OOooo........oooOO0OOooo........oo 566 567 G4double G4DNAMillerGreenExcitationModel::S_1s 568 569 570 571 { 572 // 1 - e^(-2r) * ( 1 + 2 r + 2 r^2) 573 // Dingfelder, in Chattanooga 2005 proceedin 574 575 G4double r = R(t, energyTransferred, _slater 576 G4double value = 1. - G4Exp(-2 * r) * ( ( 2. 577 578 return value; 579 } 580 581 582 //....oooOO0OOooo........oooOO0OOooo........oo 583 584 G4double G4DNAMillerGreenExcitationModel::S_2s 585 586 587 588 { 589 // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 2 r^4) 590 // Dingfelder, in Chattanooga 2005 proceedin 591 592 G4double r = R(t, energyTransferred, _slater 593 G4double value = 1. - G4Exp(-2 * r) * (((2. 594 595 return value; 596 597 } 598 599 //....oooOO0OOooo........oooOO0OOooo........oo 600 601 G4double G4DNAMillerGreenExcitationModel::S_2p 602 603 604 605 { 606 // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 4/3 r^ 607 // Dingfelder, in Chattanooga 2005 proceedin 608 609 G4double r = R(t, energyTransferred, _slater 610 G4double value = 1. - G4Exp(-2 * r) * (((( 611 612 return value; 613 } 614 615 //....oooOO0OOooo........oooOO0OOooo........oo 616 617 G4double G4DNAMillerGreenExcitationModel::R(G4 618 G4 619 G4 620 G4 621 { 622 // tElectron = m_electron / m_alpha * t 623 // Dingfelder, in Chattanooga 2005 proceedin 624 625 G4double tElectron = 0.511/3728. * t; 626 627 // The following is provided by M. Dingfelde 628 G4double H = 2.*13.60569172 * eV; 629 G4double value = std::sqrt ( 2. * tElectron 630 631 return value; 632 } 633 634