Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNARuddIonisationExtendedModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// Modified by Z. Francis, S. Incerti to handle HZE
28// && inverse rudd function sampling 26-10-2010
29//
30// Rewitten by V.Ivanchenko 21.05.2023
31//
32
33#include "G4EmCorrections.hh"
36#include "G4SystemOfUnits.hh"
38#include "G4LossTableManager.hh"
39#include "G4NistManager.hh"
42
43#include "G4IonTable.hh"
44#include "G4DNARuddAngle.hh"
45#include "G4DeltaAngle.hh"
46#include "G4Exp.hh"
47#include "G4Log.hh"
48#include "G4Pow.hh"
49#include "G4Alpha.hh"
50#include "G4Proton.hh"
51#include "G4AutoLock.hh"
52
53//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
54
55G4DNACrossSectionDataSet* G4DNARuddIonisationExtendedModel::xsdata[] = {nullptr};
56G4DNACrossSectionDataSet* G4DNARuddIonisationExtendedModel::xshelium = nullptr;
57G4DNACrossSectionDataSet* G4DNARuddIonisationExtendedModel::xsalphaplus = nullptr;
58const std::vector<G4double>* G4DNARuddIonisationExtendedModel::fpWaterDensity = nullptr;
59
60namespace
61{
62 G4Mutex ionDNAMutex = G4MUTEX_INITIALIZER;
63 const G4double scaleFactor = CLHEP::m*CLHEP::m;
64 const G4double tolerance = 1*CLHEP::eV;
65 const G4double Ry = 13.6*CLHEP::eV;
66 const G4double Gj[5] = {0.99, 1.11, 1.11, 0.52, 1.};
67
68 // Following values provided by M. Dingfelder (priv. comm)
69 const G4double Bj[5] = {12.60*CLHEP::eV, 14.70*CLHEP::eV, 18.40*CLHEP::eV,
70 32.20*CLHEP::eV, 539*CLHEP::eV};
71}
72
73//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
74
76 const G4String& nam)
77 : G4VEmModel(nam)
78{
79 fEmCorrections = G4LossTableManager::Instance()->EmCorrections();
80 fGpow = G4Pow::GetInstance();
81 fLowestEnergy = 100*CLHEP::eV;
82 fLimitEnergy = 1*CLHEP::keV;
83
84 // Mark this model as "applicable" for atomic deexcitation
86
87 // Define default angular generator
89}
90
91//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
92
94{
95 if(isFirst) {
96 for(auto & i : xsdata) { delete i; }
97 }
98}
99
100//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
101
103 const G4DataVector&)
104{
105 if(p != fParticle) { SetParticle(p); }
106
107 // initialisation of static data once
108 if(nullptr == xsdata[0]) {
109 G4AutoLock l(&ionDNAMutex);
110 if(nullptr == xsdata[0]) {
111 isFirst = true;
112 G4String filename("dna/sigma_ionisation_h_rudd");
113 xsdata[0] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
114 xsdata[0]->LoadData(filename);
115
116 filename = "dna/sigma_ionisation_p_rudd";
117 xsdata[1] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
118 xsdata[1]->LoadData(filename);
119
120 filename = "dna/sigma_ionisation_alphaplusplus_rudd";
121 xsdata[2] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
122 xsdata[2]->LoadData(filename);
123
124 filename = "dna/sigma_ionisation_li_rudd";
125 xsdata[3] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
126 xsdata[3]->LoadData(filename);
127
128 filename = "dna/sigma_ionisation_be_rudd";
129 xsdata[4] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
130 xsdata[4]->LoadData(filename);
131
132 filename = "dna/sigma_ionisation_b_rudd";
133 xsdata[5] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
134 xsdata[5]->LoadData(filename);
135
136 filename = "dna/sigma_ionisation_c_rudd";
137 xsdata[6] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
138 xsdata[6]->LoadData(filename);
139
140 filename = "dna/sigma_ionisation_n_rudd";
141 xsdata[7] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
142 xsdata[7]->LoadData(filename);
143
144 filename = "dna/sigma_ionisation_o_rudd";
145 xsdata[8] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
146 xsdata[8]->LoadData(filename);
147
148 filename = "dna/sigma_ionisation_si_rudd";
149 xsdata[14] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
150 xsdata[14]->LoadData(filename);
151
152 filename = "dna/sigma_ionisation_fe_rudd";
153 xsdata[26] = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
154 xsdata[26]->LoadData(filename);
155 filename = "dna/sigma_ionisation_alphaplus_rudd";
156 xsalphaplus = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
157 xsalphaplus->LoadData(filename);
158
159 filename = "dna/sigma_ionisation_he_rudd";
160 xshelium = new G4DNACrossSectionDataSet(new G4LogLogInterpolation, CLHEP::eV, scaleFactor);
161 xshelium->LoadData(filename);
162 }
163 // to avoid possible threading problem fill this vector only once
164 auto water = G4NistManager::Instance()->FindMaterial("G4_WATER");
165 fpWaterDensity =
167
168 l.unlock();
169 }
170
171 // initialisation once in each thread
172 if(nullptr == fParticleChangeForGamma) {
174 const G4String& pname = fParticle->GetParticleName();
175 if(pname == "proton") {
176 idx = 1;
177 xscurrent = xsdata[1];
178 fElow = fLowestEnergy;
179 } else if(pname == "hydrogen") {
180 idx = 0;
181 xscurrent = xsdata[0];
182 fElow = fLowestEnergy;
183 } else if(pname == "alpha") {
184 idx = 1;
185 xscurrent = xsdata[2];
186 isHelium = true;
187 fElow = fLimitEnergy;
188 } else if(pname == "alpha+") {
189 idx = 1;
190 isHelium = true;
191 xscurrent = xsalphaplus;
192 fElow = fLimitEnergy;
193 // The following values are provided by M. Dingfelder (priv. comm)
194 slaterEffectiveCharge[0]=2.0;
195 slaterEffectiveCharge[1]=2.0;
196 slaterEffectiveCharge[2]=2.0;
197 sCoefficient[0]=0.7;
198 sCoefficient[1]=0.15;
199 sCoefficient[2]=0.15;
200 } else if(pname == "helium") {
201 idx = 0;
202 isHelium = true;
203 fElow = fLimitEnergy;
204 xscurrent = xshelium;
205 slaterEffectiveCharge[0]=1.7;
206 slaterEffectiveCharge[1]=1.15;
207 slaterEffectiveCharge[2]=1.15;
208 sCoefficient[0]=0.5;
209 sCoefficient[1]=0.25;
210 sCoefficient[2]=0.25;
211 } else {
212 isIon = true;
213 }
214 // defined stationary mode
216
217 // initialise atomic de-excitation
218 fAtomDeexcitation = G4LossTableManager::Instance()->AtomDeexcitation();
219
220 if (verbose > 0) {
221 G4cout << "### G4DNARuddIonisationExtendedModel::Initialise(..) " << pname
222 << "/n idx=" << idx << " Amass=" << fAmass
223 << " isIon=" << isIon << " isHelium=" << isHelium << G4endl;
224 }
225 }
226}
227
228//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
229
230void G4DNARuddIonisationExtendedModel::SetParticle(const G4ParticleDefinition* p)
231{
232 fParticle = p;
233 fMass = p->GetPDGMass();
234 fAmass = p->GetAtomicMass();
235
236 // for generic ions idx is dynamic, -1 means that data for the ion does not exist
237 if(isIon) {
238 G4int i = p->GetAtomicNumber();
239 idx = -1;
240 if (i < RUDDZMAX && nullptr != xsdata[i]) {
241 idx = i;
242 fElow = fAmass*fLowestEnergy;
243 }
244 }
245}
246
247//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
248
251 const G4ParticleDefinition* part,
252 G4double kinE,
254{
255 // check if model is applicable for given material
256 G4double density = (material->GetIndex() < fpWaterDensity->size())
257 ? (*fpWaterDensity)[material->GetIndex()] : 0.0;
258 if (0.0 == density) { return 0.0; }
259
260 // ion may be different
261 if (fParticle != part) { SetParticle(part); }
262
263 // initilise mass rate
264 fMassRate = 1.0;
265
266 // ion shoud be stopped - check on kinetic energy and not scaled energy
267 if (kinE < fLowestEnergy) { return DBL_MAX; }
268
269 G4double sigma = 0.;
270
271 // use ion table if available for given energy
272 // for proton, hydrogen, alpha, alpha+, and helium no scaling to proton x-section
273 if (idx == 0 || idx == 1) {
274 sigma = (kinE > fElow) ? xscurrent->FindValue(kinE)
275 : xscurrent->FindValue(fElow)*kinE/fElow;
276
277 // for ions with data above limit energy
278 } else if (idx > 1) {
279 sigma = (kinE > fElow) ? xsdata[idx]->FindValue(kinE)
280 : xsdata[idx]->FindValue(fElow)*kinE/fElow;
281
282 // scaling from proton
283 } else {
284 fMassRate = CLHEP::proton_mass_c2/fMass;
285 G4double e = kinE*fMassRate;
286 sigma = (e > fLowestEnergy) ? xsdata[1]->FindValue(e)
287 : xsdata[1]->FindValue(fLowestEnergy)*e/fLowestEnergy;
288 sigma *= fEmCorrections->EffectiveChargeSquareRatio(part, material, kinE);
289 }
290 sigma *= density;
291
292 if (verbose > 1) {
293 G4cout << "G4DNARuddIonisationExtendedModel for " << part->GetParticleName()
294 << " Ekin(keV)=" << kinE/CLHEP::keV
295 << " sigma(cm^2)=" << sigma/CLHEP::cm2 << G4endl;
296 }
297 return sigma;
298}
299
300//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
301
302void
303G4DNARuddIonisationExtendedModel::SampleSecondaries(std::vector<G4DynamicParticle*>* fvect,
304 const G4MaterialCutsCouple* couple,
305 const G4DynamicParticle* dpart,
307{
308 const G4ParticleDefinition* pd = dpart->GetDefinition();
309 if (fParticle != pd) { SetParticle(pd); }
310
311 // stop ion with energy below low energy limit
312 G4double kinE = dpart->GetKineticEnergy();
313 // ion shoud be stopped - check on kinetic energy and not scaled energy
314 if (kinE <= fLowestEnergy) {
318 return;
319 }
320
321 G4int shell = SelectShell(kinE);
322 G4double bindingEnergy = (useDNAWaterStructure)
323 ? waterStructure.IonisationEnergy(shell) : Bj[shell];
324
325 //Si: additional protection if tcs interpolation method is modified
326 if (kinE < bindingEnergy) return;
327
328 G4double esec = SampleElectronEnergy(kinE, bindingEnergy, shell);
329 G4double esum = 0.0;
330
331 // sample deexcitation
332 // here we assume that H2O electronic levels are the same as Oxygen.
333 // this can be considered true with a rough 10% error in energy on K-shell,
334 G4int Z = 8;
335 G4ThreeVector deltaDir =
336 GetAngularDistribution()->SampleDirectionForShell(dpart, esec, Z, shell, couple->GetMaterial());
337
338 // SI: only atomic deexcitation from K shell is considered
339 if(fAtomDeexcitation != nullptr && shell == 4) {
340 auto as = G4AtomicShellEnumerator(0);
341 auto ashell = fAtomDeexcitation->GetAtomicShell(Z, as);
342 fAtomDeexcitation->GenerateParticles(fvect, ashell, Z, 0, 0);
343
344 // compute energy sum from de-excitation
345 std::size_t nn = fvect->size();
346 for (std::size_t i=0; i<nn; ++i) {
347 esum += (*fvect)[i]->GetKineticEnergy();
348 }
349 }
350 // check energy balance
351 // remaining excitation energy of water molecule
352 G4double exc = bindingEnergy - esum;
353
354 // remaining projectile energy
355 G4double scatteredEnergy = kinE - bindingEnergy - esec;
356 if(scatteredEnergy < -tolerance || exc < -tolerance) {
357 G4cout << "G4DNARuddIonisationExtendedModel::SampleSecondaries: "
358 << "negative final E(keV)=" << scatteredEnergy/CLHEP::keV << " Ein(keV)="
359 << kinE/CLHEP::keV << " " << pd->GetParticleName()
360 << " Edelta(keV)=" << esec/CLHEP::keV << " MeV, Exc(keV)=" << exc/CLHEP::keV
361 << G4endl;
362 }
363
364 // projectile
365 if (!statCode) {
368 } else {
370 fParticleChangeForGamma->ProposeLocalEnergyDeposit(kinE - scatteredEnergy);
371 }
372
373 // delta-electron
374 auto dp = new G4DynamicParticle(G4Electron::Electron(), deltaDir, esec);
375 fvect->push_back(dp);
376
377 // create radical
378 const G4Track* theIncomingTrack = fParticleChangeForGamma->GetCurrentTrack();
380 theIncomingTrack);
381}
382
383//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
384
385G4int G4DNARuddIonisationExtendedModel::SelectShell(G4double e)
386{
387 G4double sum = 0.0;
388 G4double xs;
389 for(G4int i=0; i<5; ++i) {
390 if (idx == 0 || idx == 1) {
391 auto ptr = xscurrent->GetComponent(i);
392 xs = (e > fElow) ? ptr->FindValue(e) : ptr->FindValue(fElow)*e/fElow;
393
394 } else if (idx > 1) {
395 auto ptr = xsdata[idx]->GetComponent(i);
396 xs = (e > fElow) ? ptr->FindValue(e) : ptr->FindValue(fElow)*e/fElow;
397
398 } else {
399 // use scaling from proton
400 auto ptr = xsdata[1]->GetComponent(i);
401 G4double x = e*fMassRate;
402 xs = (x >= fLowestEnergy) ? ptr->FindValue(x)
403 : ptr->FindValue(fLowestEnergy)*x/fLowestEnergy;
404 }
405 sum += xs;
406 fTemp[i] = sum;
407 }
408 sum *= G4UniformRand();
409 for(G4int i=0; i<5; ++i) {
410 if(sum <= fTemp[i]) { return i; }
411 }
412 return 0;
413}
414
415//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
416
417G4double G4DNARuddIonisationExtendedModel::SampleElectronEnergy(G4double kine,
418 G4double eexc,
419 G4int shell)
420{
421 // kinematic limit
422 G4double tau = kine/fMass;
423 G4double emax = 2.0*CLHEP::electron_mass_c2*tau*(tau + 2.0);
424 // compute cumulative probability function
425 G4double step = 1*CLHEP::eV;
426 auto nn = (G4int)(emax/step);
427 nn = std::max(nn, 10);
428 step = emax/(G4double)nn;
429
430 // find max probability
431 G4double pmax = ProbabilityFunction(kine, 0.0, eexc, shell);
432 //G4cout << "E(keV)=" << kine/keV << " emax=" << emax/keV
433 // << " pmax(0)=" << pmax << " shell=" << shell << " nn=" << nn << G4endl;
434
435 G4double e2 = 0.0; // backup energy
436 G4double e0 = 0.0; // energy with max probability
437 G4double e = 0.0;
438 for (G4int i=0; i<nn; ++i) {
439 e += step;
440 G4double prob = ProbabilityFunction(kine, e, eexc, shell);
441 if (prob < pmax) {
442 e2 = 2*e;
443 break;
444 }
445 pmax = prob;
446 e0 = e;
447 }
448 //G4cout << " E0(keV)=" << e0/keV << " pmax=" << pmax << G4endl;
449 pmax *= 1.05;
450 // regression method with two regions
451 G4double e1 = emax;
452 G4double p1 = 0.0;
453 if (2*e0 < emax) {
454 e1 = e0 + 0.25*(emax - e0);
455 p1 = ProbabilityFunction(kine, e1, eexc, shell);
456 }
457 G4double s2 = p1*(emax - e1);
458 s2 /= (s2 + e1*pmax);
459 G4double s1 = 1.0 - s2;
460
461 // sampling
462 G4int count = 0;
463 G4double ymax, y, deltae;
464 for (G4int i = 0; i<100000; ++i) {
466 if (q <= s1) {
467 ymax = pmax;
468 deltae = e1 * q / s1;
469 } else {
470 ymax = p1;
471 deltae = e1 + (emax - e1)* (q - s1) / s2;
472 }
473 y = ProbabilityFunction(kine, deltae, eexc, shell);
474 //G4cout << " " << i << ". deltae=" << deltae/CLHEP::keV
475 // << " y=" << y << " ymax=" << ymax << G4endl;
476 if (y > ymax && count < 10) {
477 ++count;
478 G4cout << "G4DNARuddIonisationExtendedModel::SampleElectronEnergy warning: "
479 << fParticle->GetParticleName() << " E(keV)=" << kine/CLHEP::keV
480 << " Edelta(keV)=" << deltae/CLHEP::keV
481 << " y=" << y << " ymax=" << ymax << " n=" << i << G4endl;
482 }
483 if (ymax * G4UniformRand() < y) {
484 return deltae;
485 }
486 }
487 deltae = e2;
488 return deltae;
489}
490
491//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
492
493G4double G4DNARuddIonisationExtendedModel::ProbabilityFunction(G4double kine,
494 G4double deltae,
495 G4double bindingEnergy,
496 G4int shell)
497{
498 // Shells ids are 0 1 2 3 4 (4 is k shell)
499 // !!Attention, "energyTransfer" here is the energy transfered to the electron which means
500 // that the secondary kinetic energy is w = energyTransfer - bindingEnergy
501 //
502 // ds S F1(nu) + w * F2(nu)
503 // ---- = G(k) * ---- -------------------------------------------
504 // dw Bj (1+w)^3 * [1 + exp{alpha * (w - wc) / nu}]
505 //
506 // w is the secondary electron kinetic Energy in eV
507 //
508 // All the other parameters can be found in Rudd's Papers
509 //
510 // M.Eugene Rudd, 1988, User-Friendly model for the energy distribution of
511 // electrons from protons or electron collisions. Nucl. Tracks Rad. Meas.Vol 16 N0 2/3 pp 219-218
512 //
513 G4double A1, B1, C1, D1, E1, A2, B2, C2, D2, alphaConst;
514 if (shell == 4) {
515 //Data For Liquid Water K SHELL from Dingfelder (Protons in Water)
516 A1 = 1.25;
517 B1 = 0.5;
518 C1 = 1.00;
519 D1 = 1.00;
520 E1 = 3.00;
521 A2 = 1.10;
522 B2 = 1.30;
523 C2 = 1.00;
524 D2 = 0.00;
525 alphaConst = 0.66;
526 } else {
527 //Data For Liquid Water from Dingfelder (Protons in Water)
528 A1 = 1.02;
529 B1 = 82.0;
530 C1 = 0.45;
531 D1 = -0.80;
532 E1 = 0.38;
533 A2 = 1.07;
534 // Value provided by M. Dingfelder (priv. comm)
535 B2 = 11.6;
536 C2 = 0.60;
537 D2 = 0.04;
538 alphaConst = 0.64;
539 }
540 G4double bEnergy = Bj[shell];
541 G4double w = deltae/bEnergy;
542 G4double u = Ry/bEnergy;
543 G4double tau = kine/fMass;
544 G4double gam = 1.0 + tau;;
545
546 G4double v2 = 0.5*CLHEP::electron_mass_c2*tau*(tau + 2.0)/(bEnergy*gam*gam);
547 G4double v = std::sqrt(v2);
548 G4double wc = 4.*v2 - 2.*v - 0.25*u;
549
550 G4double x = alphaConst*(w - wc)/v;
551 G4double y = (x > -15.) ? 1.0 + G4Exp(x) : 1.0;
552
553 G4double L1 = (C1 * fGpow->powA(v, D1)) / (1. + E1 * fGpow->powA(v, (D1 + 4.)));
554 G4double L2 = C2 * fGpow->powA(v, D2);
555 G4double H1 = (A1 * G4Log(1. + v2)) / (v2 + (B1 / v2));
556 G4double H2 = (A2 / v2) + (B2 / (v2 * v2));
557
558 G4double F1 = L1 + H1;
559 G4double F2 = (L2 * H2) / (L2 + H2);
560
561 G4double res = CorrectionFactor(kine, shell) * (F1 + w*F2) * Gj[shell] /
562 (fGpow->powN((1. + w)/u, 3) * y);
563
564 if(isHelium) {
565 G4double energyTransfer = deltae + bindingEnergy;
566 G4double Zeff = 2.0 -
567 (sCoefficient[0] * S_1s(kine, energyTransfer, slaterEffectiveCharge[0], 1.) +
568 sCoefficient[1] * S_2s(kine, energyTransfer, slaterEffectiveCharge[1], 2.) +
569 sCoefficient[2] * S_2p(kine, energyTransfer, slaterEffectiveCharge[2], 2.) );
570
571 res *= Zeff * Zeff;
572 }
573 return std::max(res, 0.0);
574}
575
576//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
577
579 const G4ParticleDefinition* p, G4double e, G4double deltae, G4int shell)
580{
581 if (fParticle != p) { SetParticle(p); }
582 G4double bEnergy = (useDNAWaterStructure)
583 ? waterStructure.IonisationEnergy(shell) : Bj[shell];
584 return ProbabilityFunction(e, deltae, bEnergy, shell);
585}
586
587//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
588
589G4double G4DNARuddIonisationExtendedModel::S_1s(G4double kine,
590 G4double energyTransfer,
591 G4double slaterEffCharge,
592 G4double shellNumber)
593{
594 // 1 - e^(-2r) * ( 1 + 2 r + 2 r^2)
595 // Dingfelder, in Chattanooga 2005 proceedings, formula (7)
596
597 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
598 G4double value = 1. - G4Exp(-2 * r) * ( ( 2. * r + 2. ) * r + 1. );
599 return value;
600}
601
602//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
603
604G4double G4DNARuddIonisationExtendedModel::S_2s(G4double kine,
605 G4double energyTransfer,
606 G4double slaterEffCharge,
607 G4double shellNumber)
608{
609 // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 2 r^4)
610 // Dingfelder, in Chattanooga 2005 proceedings, formula (8)
611
612 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
613 G4double value =
614 1. - G4Exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
615
616 return value;
617}
618
619//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
620
621G4double G4DNARuddIonisationExtendedModel::S_2p(G4double kine,
622 G4double energyTransfer,
623 G4double slaterEffCharge,
624 G4double shellNumber)
625{
626 // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 4/3 r^3 + 2/3 r^4)
627 // Dingfelder, in Chattanooga 2005 proceedings, formula (9)
628
629 G4double r = Rh(kine, energyTransfer, slaterEffCharge, shellNumber);
630 G4double value =
631 1. - G4Exp(-2 * r) * (((( 2./3. * r + 4./3.) * r + 2.) * r + 2.) * r + 1.);
632
633 return value;
634}
635
636//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
637
638G4double G4DNARuddIonisationExtendedModel::Rh(G4double ekin, G4double etrans,
639 G4double q, G4double shell)
640{
641 // The following values are provided by M. Dingfelder (priv. comm)
642 // Dingfelder, in Chattanooga 2005 proceedings, p 4
643
644 G4double escaled = CLHEP::electron_mass_c2/fMass * ekin;
645 const G4double H = 13.60569172 * CLHEP::eV;
646 G4double value = 2.0*std::sqrt(escaled / H)*q*H /(etrans*shell);
647
648 return value;
649}
650
651//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
652
654G4DNARuddIonisationExtendedModel::CorrectionFactor(G4double kine, G4int shell)
655{
656 // ZF Shortened
657 G4double res = 1.0;
658 if (shell < 4 && 0 != idx) {
659 const G4double ln10 = fGpow->logZ(10);
660 G4double x = 2.0*((G4Log(kine/CLHEP::eV)/ln10) - 4.2);
661 // The following values are provided by M. Dingfelder (priv. comm)
662 res = 0.6/(1.0 + G4Exp(x)) + 0.9;
663 }
664 return res;
665}
666
667//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ eIonizedMolecule
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
G4double G4Log(G4double x)
Definition G4Log.hh:227
#define G4MUTEX_INITIALIZER
std::mutex G4Mutex
@ fStopButAlive
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
const double C2
#define C1
#define G4UniformRand()
Definition Randomize.hh:52
static G4DNAChemistryManager * Instance()
void CreateWaterMolecule(ElectronicModification, G4int, const G4Track *)
G4bool LoadData(const G4String &argFileName) override
const G4VEMDataSet * GetComponent(G4int componentId) const override
G4double FindValue(G4double e, G4int componentId=0) const override
const std::vector< G4double > * GetNumMolPerVolTableFor(const G4Material *) const
Retrieve a table of molecular densities (number of molecules per unit volume) in the G4 unit system f...
static G4DNAMolecularMaterial * Instance()
G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax) override
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double ComputeProbabilityFunction(const G4ParticleDefinition *, G4double kine, G4double deltae, G4int shell)
G4DNARuddIonisationExtendedModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="DNARuddIonisationExtendedModel")
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
Definition G4Electron.cc:91
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, const G4double kineticEnergy)
static G4EmParameters * Instance()
G4bool DNAStationary() const
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
G4EmCorrections * EmCorrections()
const G4Material * GetMaterial() const
std::size_t GetIndex() const
G4Material * FindMaterial(const G4String &name) const
static G4NistManager * Instance()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
G4int GetAtomicNumber() const
G4int GetAtomicMass() const
const G4String & GetParticleName() const
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double logZ(G4int Z) const
Definition G4Pow.hh:137
G4double powN(G4double x, G4int n) const
Definition G4Pow.cc:162
G4double powA(G4double A, G4double y) const
Definition G4Pow.hh:230
virtual const G4AtomicShell * GetAtomicShell(G4int Z, G4AtomicShellEnumerator shell)=0
void GenerateParticles(std::vector< G4DynamicParticle * > *secVect, const G4AtomicShell *, G4int Z, G4int coupleIndex)
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
virtual G4ThreeVector & SampleDirectionForShell(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, G4int shellID, const G4Material *)
G4VEmAngularDistribution * GetAngularDistribution()
G4ParticleChangeForGamma * GetParticleChangeForGamma()
void SetDeexcitationFlag(G4bool val)
void SetAngularDistribution(G4VEmAngularDistribution *)
void ProposeTrackStatus(G4TrackStatus status)
const G4Track * GetCurrentTrack() const
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
G4double bindingEnergy(G4int A, G4int Z)
#define DBL_MAX
Definition templates.hh:62