Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4ecpssrBaseLixsModel.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#include <iostream>
29#include "globals.hh"
31#include "G4SystemOfUnits.hh"
33#include "G4NistManager.hh"
34#include "G4Proton.hh"
35#include "G4Alpha.hh"
37#include "G4Exp.hh"
38
39//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
40
42{
43 verboseLevel=0;
44
45 // Storing FLi data needed for 0.2 to 3.0 velocities region
46 const char* path = G4FindDataDir("G4LEDATA");
47
48 if (!path) {
49 G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0006", FatalException ,"G4LEDATA environment variable not set");
50 return;
51 }
52 std::ostringstream fileName1;
53 std::ostringstream fileName2;
54
55 fileName1 << path << "/pixe/uf/FL1.dat";
56 fileName2 << path << "/pixe/uf/FL2.dat";
57
58 // Reading of FL1.dat
59 std::ifstream FL1(fileName1.str().c_str());
60 if (!FL1) G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0003",FatalException, "error opening FL1 data file");
61
62 dummyVec1.push_back(0.);
63
64 while(!FL1.eof())
65 {
66 double x1;
67 double y1;
68
69 FL1>>x1>>y1;
70
71 // Mandatory vector initialization
72 if (x1 != dummyVec1.back())
73 {
74 dummyVec1.push_back(x1);
75 aVecMap1[x1].push_back(-1.);
76 }
77
78 FL1>>FL1Data[x1][y1];
79
80 if (y1 != aVecMap1[x1].back()) aVecMap1[x1].push_back(y1);
81 }
82
83 // Reading of FL2.dat
84
85 std::ifstream FL2(fileName2.str().c_str());
86 if (!FL2) G4Exception("G4ecpssrLCrossSection::G4ecpssrBaseLixsModel()","em0003", FatalException," error opening FL2 data file");
87
88 dummyVec2.push_back(0.);
89
90 while(!FL2.eof())
91 {
92 double x2;
93 double y2;
94
95 FL2>>x2>>y2;
96
97 // Mandatory vector initialization
98 if (x2 != dummyVec2.back())
99 {
100 dummyVec2.push_back(x2);
101 aVecMap2[x2].push_back(-1.);
102 }
103
104 FL2>>FL2Data[x2][y2];
105
106 if (y2 != aVecMap2[x2].back()) aVecMap2[x2].push_back(y2);
107 }
108}
109
110//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
111
114
115//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
116
118
119{
120// this function allows fast evaluation of the n order exponential integral function En(x)
121 G4int i;
122 G4int ii;
123 G4int nm1;
124 G4double a;
125 G4double b;
126 G4double c;
127 G4double d;
128 G4double del;
129 G4double fact;
130 G4double h;
131 G4double psi;
132 G4double ans = 0;
133 static const G4double euler= 0.5772156649;
134 static const G4int maxit= 100;
135 static const G4double fpmin = 1.0e-30;
136 static const G4double eps = 1.0e-7;
137 nm1=n-1;
138 if (n<0 || x<0.0 || (x==0.0 && (n==0 || n==1)))
139 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::ExpIntFunction: bad arguments in ExpIntFunction"
140 << G4endl;
141 else {
142 if (n==0) ans=G4Exp(-x)/x;
143 else {
144 if (x==0.0) ans=1.0/nm1;
145 else {
146 if (x > 1.0) {
147 b=x+n;
148 c=1.0/fpmin;
149 d=1.0/b;
150 h=d;
151 for (i=1;i<=maxit;i++) {
152 a=-i*(nm1+i);
153 b +=2.0;
154 d=1.0/(a*d+b);
155 c=b+a/c;
156 del=c*d;
157 h *=del;
158 if (std::fabs(del-1.0) < eps) {
159 ans=h*G4Exp(-x);
160 return ans;
161 }
162 }
163 } else {
164 ans = (nm1!=0 ? 1.0/nm1 : -std::log(x)-euler);
165 fact=1.0;
166 for (i=1;i<=maxit;i++) {
167 fact *=-x/i;
168 if (i !=nm1) del = -fact/(i-nm1);
169 else {
170 psi = -euler;
171 for (ii=1;ii<=nm1;ii++) psi +=1.0/ii;
172 del=fact*(-std::log(x)+psi);
173 }
174 ans += del;
175 if (std::fabs(del) < std::fabs(ans)*eps) return ans;
176 }
177 }
178 }
179 }
180 }
181 return ans;
182}
183
184//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
185
187{
188
189 if (zTarget <=4) return 0.;
190
191 //this L1-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
192 //and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
193
194 G4NistManager* massManager = G4NistManager::Instance();
195
197
198 G4double zIncident = 0;
199 G4Proton* aProtone = G4Proton::Proton();
200 G4Alpha* aAlpha = G4Alpha::Alpha();
201
202 if (massIncident == aProtone->GetPDGMass() )
203 {
204 zIncident = (aProtone->GetPDGCharge())/eplus;
205 }
206 else
207 {
208 if (massIncident == aAlpha->GetPDGMass())
209 {
210 zIncident = (aAlpha->GetPDGCharge())/eplus;
211 }
212 else
213 {
214 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL1CrossSection : Proton or Alpha incident particles only. " << G4endl;
215 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
216 return 0;
217 }
218 }
219
220 G4double l1BindingEnergy = transitionManager->Shell(zTarget,1)->BindingEnergy(); //Observed binding energy of L1-subshell
221 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
222 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2; //Mass of the system (projectile, target)
223 static const G4double zlshell= 4.15;
224 // *** see Benka, ADANDT 22, p 223
225 G4double screenedzTarget = zTarget-zlshell; //Effective nuclear charge as seen by electrons in L1-sub shell
226 static const G4double rydbergMeV= 13.6056923e-6;
227
228 static const G4double nl= 2.;
229 // *** see Benka, ADANDT 22, p 220, f3
230 G4double tetal1 = (l1BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV); //Screening parameter
231 // *** see Benka, ADANDT 22, p 220, f3
232
233 if (verboseLevel>0) G4cout << " tetal1=" << tetal1<< G4endl;
234
235 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
236 // *** also called etaS
237 // *** see Benka, ADANDT 22, p 220, f3
238
239 static const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ; //Bohr radius of hydrogen
240
241 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
242 // *** see Benka, ADANDT 22, p 220, f2, for protons
243 // *** see Basbas, Phys Rev A7, p 1000
244
245 G4double velocityl1 = CalculateVelocity(1, zTarget, massIncident, energyIncident); // Scaled velocity
246
247 if (verboseLevel>0) G4cout << " velocityl1=" << velocityl1<< G4endl;
248
249 static const G4double l1AnalyticalApproximation= 1.5;
250 G4double x1 =(nl*l1AnalyticalApproximation)/velocityl1;
251 // *** 1.5 is cK = cL1 (it is 1.25 for L2 & L3)
252 // *** see Brandt, Phys Rev A20, p 469, f16 in expression of h
253
254 if (verboseLevel>0) G4cout << " x1=" << x1<< G4endl;
255
256 G4double electrIonizationEnergyl1=0.;
257 // *** see Basbas, Phys Rev A17, p1665, f27
258 // *** see Brandt, Phys Rev A20, p469
259 // *** see Liu, Comp Phys Comm 97, p325, f A5
260
261 if ( x1<=0.035) electrIonizationEnergyl1= 0.75*pi*(std::log(1./(x1*x1))-1.);
262 else
263 {
264 if ( x1<=3.)
265 electrIonizationEnergyl1 =G4Exp(-2.*x1)/(0.031+(0.213*std::pow(x1,0.5))+(0.005*x1)-(0.069*std::pow(x1,3./2.))+(0.324*x1*x1));
266 else
267 {if ( x1<=11.) electrIonizationEnergyl1 =2.*G4Exp(-2.*x1)/std::pow(x1,1.6);}
268 }
269
270 G4double hFunctionl1 =(electrIonizationEnergyl1*2.*nl)/(tetal1*std::pow(velocityl1,3)); //takes into account the polarization effect
271 // *** see Brandt, Phys Rev A20, p 469, f16
272
273 if (verboseLevel>0) G4cout << " hFunctionl1=" << hFunctionl1<< G4endl;
274
275 G4double gFunctionl1 = (1.+(9.*velocityl1)+(31.*velocityl1*velocityl1)+(49.*std::pow(velocityl1,3.))+(162.*std::pow(velocityl1,4.))+(63.*std::pow(velocityl1,5.))+(18.*std::pow(velocityl1,6.))+(1.97*std::pow(velocityl1,7.)))/std::pow(1.+velocityl1,9.);//takes into account the reduced binding effect
276 // *** see Brandt, Phys Rev A20, p 469, f19
277
278 if (verboseLevel>0) G4cout << " gFunctionl1=" << gFunctionl1<< G4endl;
279
280 G4double sigmaPSS_l1 = 1.+(((2.*zIncident)/(screenedzTarget*tetal1))*(gFunctionl1-hFunctionl1)); //Binding-polarization factor
281 // *** also called dzeta
282 // *** also called epsilon
283 // *** see Basbas, Phys Rev A17, p1667, f45
284
285 if (verboseLevel>0) G4cout << "sigmaPSS_l1 =" << sigmaPSS_l1<< G4endl;
286
287 const G4double cNaturalUnit= 137.;
288
289 G4double yl1Formula=0.4*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(nl*velocityl1/sigmaPSS_l1);
290 // *** also called yS
291 // *** see Brandt, Phys Rev A20, p467, f6
292 // *** see Brandt, Phys Rev A23, p1728
293
294 G4double l1relativityCorrection = std::pow((1.+(1.1*yl1Formula*yl1Formula)),0.5)+yl1Formula; // Relativistic correction parameter
295 // *** also called mRS
296 // *** see Brandt, Phys Rev A20, p467, f6
297
298 //G4double reducedVelocity_l1 = velocityl1*std::pow(l1relativityCorrection,0.5); //Reduced velocity parameter
299
300 G4double L1etaOverTheta2;
301
302 G4double universalFunction_l1 = 0.;
303
304 G4double sigmaPSSR_l1;
305
306 // low velocity formula
307 // *****************
308 if ( velocityl1 <20. )
309 {
310
311 L1etaOverTheta2 =(reducedEnergy* l1relativityCorrection)/((tetal1*sigmaPSS_l1)*(tetal1*sigmaPSS_l1));
312 // *** 1) RELATIVISTIC CORRECTION ADDED
313 // *** 2) sigma_PSS_l1 ADDED
314 // *** reducedEnergy is etaS, l1relativityCorrection is mRS
315 // *** see Phys Rev A20, p468, top
316
317 if ( ((tetal1*sigmaPSS_l1) >=0.2) && ((tetal1*sigmaPSS_l1) <=2.6670) && (L1etaOverTheta2>=0.1e-3) && (L1etaOverTheta2<=0.866e2) )
318 universalFunction_l1 = FunctionFL1((tetal1*sigmaPSS_l1),L1etaOverTheta2);
319
320 if (verboseLevel>0) G4cout << "at low velocity range, universalFunction_l1 =" << universalFunction_l1 << G4endl;
321
322 sigmaPSSR_l1 = (sigma0/(tetal1*sigmaPSS_l1))*universalFunction_l1;// Plane-wave Born -Aproximation L1-subshell ionisation Cross Section
323 // *** see Benka, ADANDT 22, p220, f1
324
325 if (verboseLevel>0) G4cout << " at low velocity range, sigma PWBA L1 CS = " << sigmaPSSR_l1<< G4endl;
326 }
327 else
328 {
329 L1etaOverTheta2 = reducedEnergy/(tetal1*tetal1);
330 // Medium & high velocity
331 // *** 1) NO RELATIVISTIC CORRECTION
332 // *** 2) NO sigma_PSS_l1
333 // *** see Benka, ADANDT 22, p223
334
335 if ( (tetal1 >=0.2) && (tetal1 <=2.6670) && (L1etaOverTheta2>=0.1e-3) && (L1etaOverTheta2<=0.866e2) )
336 universalFunction_l1 = FunctionFL1(tetal1,L1etaOverTheta2);
337
338 if (verboseLevel>0) G4cout << "at medium and high velocity range, universalFunction_l1 =" << universalFunction_l1 << G4endl;
339
340 sigmaPSSR_l1 = (sigma0/tetal1)*universalFunction_l1;// Plane-wave Born -Aproximation L1-subshell ionisation Cross Section
341 // *** see Benka, ADANDT 22, p220, f1
342
343 if (verboseLevel>0) G4cout << " sigma PWBA L1 CS at medium and high velocity range = " << sigmaPSSR_l1<< G4endl;
344 }
345
346 G4double pssDeltal1 = (4./(systemMass *sigmaPSS_l1*tetal1))*(sigmaPSS_l1/velocityl1)*(sigmaPSS_l1/velocityl1);
347 // *** also called dzeta*delta
348 // *** see Brandt, Phys Rev A23, p1727, f B2
349
350 if (verboseLevel>0) G4cout << " pssDeltal1=" << pssDeltal1<< G4endl;
351
352 if (pssDeltal1>1) return 0.;
353
354 G4double energyLossl1 = std::pow(1-pssDeltal1,0.5);
355 // *** also called z
356 // *** see Brandt, Phys Rev A23, p1727, after f B2
357
358 if (verboseLevel>0) G4cout << " energyLossl1=" << energyLossl1<< G4endl;
359
360 G4double coulombDeflectionl1 =
361 (8.*pi*zIncident/systemMass)*std::pow(tetal1*sigmaPSS_l1,-2.)*std::pow(velocityl1/sigmaPSS_l1,-3.)*(zTarget/screenedzTarget);
362 // *** see Brandt, Phys Rev A20, v2s and f2 and B2
363 // *** with factor n2 compared to Brandt, Phys Rev A23, p1727, f B3
364
365 G4double cParameterl1 =2.* coulombDeflectionl1/(energyLossl1*(energyLossl1+1.));
366 // *** see Brandt, Phys Rev A23, p1727, f B4
367
368 G4double coulombDeflectionFunction_l1 = 9.*ExpIntFunction(10,cParameterl1); //Coulomb-deflection effect correction
369
370 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l1 =" << coulombDeflectionFunction_l1 << G4endl;
371
372 G4double crossSection_L1 = coulombDeflectionFunction_l1 * sigmaPSSR_l1;
373
374 //ECPSSR L1 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
375 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
376
377 if (verboseLevel>0) G4cout << " crossSection_L1 =" << crossSection_L1 << G4endl;
378
379 if (crossSection_L1 >= 0)
380 {
381 return crossSection_L1 * barn;
382 }
383
384 else {return 0;}
385}
386
387//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
388
390
391{
392 if (zTarget <=13 ) return 0.;
393
394 // this L2-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
395 // and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
396
397 G4NistManager* massManager = G4NistManager::Instance();
398
400
401 G4double zIncident = 0;
402
403 G4Proton* aProtone = G4Proton::Proton();
404 G4Alpha* aAlpha = G4Alpha::Alpha();
405
406 if (massIncident == aProtone->GetPDGMass() )
407 zIncident = (aProtone->GetPDGCharge())/eplus;
408
409 else
410 {
411 if (massIncident == aAlpha->GetPDGMass())
412 zIncident = (aAlpha->GetPDGCharge())/eplus;
413
414 else
415 {
416 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL2CrossSection : Proton or Alpha incident particles only. " << G4endl;
417 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
418 return 0;
419 }
420 }
421
422 G4double l2BindingEnergy = transitionManager->Shell(zTarget,2)->BindingEnergy(); //Observed binding energy of L2-subshell
423
424 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
425
426 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2; //Mass of the system (projectile, target)
427
428 const G4double zlshell= 4.15;
429
430 G4double screenedzTarget = zTarget-zlshell; //Effective nuclear charge as seen by electrons in L2-subshell
431
432 const G4double rydbergMeV= 13.6056923e-6;
433
434 const G4double nl= 2.;
435
436 G4double tetal2 = (l2BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV); //Screening parameter
437
438 if (verboseLevel>0) G4cout << " tetal2=" << tetal2<< G4endl;
439
440 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
441
442 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ; //Bohr radius of hydrogen
443
444 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
445
446 G4double velocityl2 = CalculateVelocity(2, zTarget, massIncident, energyIncident); // Scaled velocity
447
448 if (verboseLevel>0) G4cout << " velocityl2=" << velocityl2<< G4endl;
449
450 const G4double l23AnalyticalApproximation= 1.25;
451
452 G4double x2 = (nl*l23AnalyticalApproximation)/velocityl2;
453
454 if (verboseLevel>0) G4cout << " x2=" << x2<< G4endl;
455
456 G4double electrIonizationEnergyl2=0.;
457
458 if ( x2<=0.035) electrIonizationEnergyl2= 0.75*pi*(std::log(1./(x2*x2))-1.);
459 else
460 {
461 if ( x2<=3.)
462 electrIonizationEnergyl2 =G4Exp(-2.*x2)/(0.031+(0.213*std::pow(x2,0.5))+(0.005*x2)-(0.069*std::pow(x2,3./2.))+(0.324*x2*x2));
463 else
464 {if ( x2<=11.) electrIonizationEnergyl2 =2.*G4Exp(-2.*x2)/std::pow(x2,1.6); }
465 }
466
467 G4double hFunctionl2 =(electrIonizationEnergyl2*2.*nl)/(tetal2*std::pow(velocityl2,3)); //takes into account the polarization effect
468
469 if (verboseLevel>0) G4cout << " hFunctionl2=" << hFunctionl2<< G4endl;
470
471 G4double gFunctionl2 = (1.+(10.*velocityl2)+(45.*velocityl2*velocityl2)+(102.*std::pow(velocityl2,3.))+(331.*std::pow(velocityl2,4.))+(6.7*std::pow(velocityl2,5.))+(58.*std::pow(velocityl2,6.))+(7.8*std::pow(velocityl2,7.))+ (0.888*std::pow(velocityl2,8.)) )/std::pow(1.+velocityl2,10.);
472 //takes into account the reduced binding effect
473
474 if (verboseLevel>0) G4cout << " gFunctionl2=" << gFunctionl2<< G4endl;
475
476 G4double sigmaPSS_l2 = 1.+(((2.*zIncident)/(screenedzTarget*tetal2))*(gFunctionl2-hFunctionl2)); //Binding-polarization factor
477
478 if (verboseLevel>0) G4cout << " sigmaPSS_l2=" << sigmaPSS_l2<< G4endl;
479
480 const G4double cNaturalUnit= 137.;
481
482 G4double yl2Formula=0.15*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocityl2/sigmaPSS_l2);
483
484 G4double l2relativityCorrection = std::pow((1.+(1.1*yl2Formula*yl2Formula)),0.5)+yl2Formula; // Relativistic correction parameter
485
486 G4double L2etaOverTheta2;
487
488 G4double universalFunction_l2 = 0.;
489
490 G4double sigmaPSSR_l2 ;
491
492 if ( velocityl2 < 20. )
493 {
494
495 L2etaOverTheta2 = (reducedEnergy*l2relativityCorrection)/((sigmaPSS_l2*tetal2)*(sigmaPSS_l2*tetal2));
496
497 if ( (tetal2*sigmaPSS_l2>=0.2) && (tetal2*sigmaPSS_l2<=2.6670) && (L2etaOverTheta2>=0.1e-3) && (L2etaOverTheta2<=0.866e2) )
498 universalFunction_l2 = FunctionFL2((tetal2*sigmaPSS_l2),L2etaOverTheta2);
499
500 sigmaPSSR_l2 = (sigma0/(tetal2*sigmaPSS_l2))*universalFunction_l2;
501
502 if (verboseLevel>0) G4cout << " sigma PWBA L2 CS at low velocity range = " << sigmaPSSR_l2<< G4endl;
503 }
504 else
505 {
506
507 L2etaOverTheta2 = reducedEnergy /(tetal2*tetal2);
508
509 if ( (tetal2>=0.2) && (tetal2<=2.6670) && (L2etaOverTheta2>=0.1e-3) && (L2etaOverTheta2<=0.866e2) )
510 universalFunction_l2 = FunctionFL2((tetal2),L2etaOverTheta2);
511
512 sigmaPSSR_l2 = (sigma0/tetal2)*universalFunction_l2;
513
514 if (verboseLevel>0) G4cout << " sigma PWBA L2 CS at medium and high velocity range = " << sigmaPSSR_l2<< G4endl;
515
516 }
517
518 G4double pssDeltal2 = (4./(systemMass*sigmaPSS_l2*tetal2))*(sigmaPSS_l2/velocityl2)*(sigmaPSS_l2/velocityl2);
519
520 if (pssDeltal2>1) return 0.;
521
522 G4double energyLossl2 = std::pow(1-pssDeltal2,0.5);
523
524 if (verboseLevel>0) G4cout << " energyLossl2=" << energyLossl2<< G4endl;
525
526 G4double coulombDeflectionl2
527 =(8.*pi*zIncident/systemMass)*std::pow(tetal2*sigmaPSS_l2,-2.)*std::pow(velocityl2/sigmaPSS_l2,-3.)*(zTarget/screenedzTarget);
528
529 G4double cParameterl2 = 2.*coulombDeflectionl2/(energyLossl2*(energyLossl2+1.));
530
531 G4double coulombDeflectionFunction_l2 = 11.*ExpIntFunction(12,cParameterl2); //Coulomb-deflection effect correction
532 // *** see Brandt, Phys Rev A10, p477, f25
533
534 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l2 =" << coulombDeflectionFunction_l2 << G4endl;
535
536 G4double crossSection_L2 = coulombDeflectionFunction_l2 * sigmaPSSR_l2;
537 //ECPSSR L2 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
538 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
539
540 if (verboseLevel>0) G4cout << " crossSection_L2 =" << crossSection_L2 << G4endl;
541
542 if (crossSection_L2 >= 0)
543 {
544 return crossSection_L2 * barn;
545 }
546 else {return 0;}
547}
548
549//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
550
551
553
554{
555 if (zTarget <=13) return 0.;
556
557 //this L3-CrossSection calculation method is done according to Werner Brandt and Grzegorz Lapicki, Phys.Rev.A20 N2 (1979),
558 //and using data tables of O. Benka et al. At.Data Nucl.Data Tables Vol.22 No.3 (1978).
559
560 G4NistManager* massManager = G4NistManager::Instance();
561
563
564 G4double zIncident = 0;
565
566 G4Proton* aProtone = G4Proton::Proton();
567 G4Alpha* aAlpha = G4Alpha::Alpha();
568
569 if (massIncident == aProtone->GetPDGMass() )
570
571 zIncident = (aProtone->GetPDGCharge())/eplus;
572
573 else
574 {
575 if (massIncident == aAlpha->GetPDGMass())
576
577 zIncident = (aAlpha->GetPDGCharge())/eplus;
578
579 else
580 {
581 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateL3CrossSection : Proton or Alpha incident particles only. " << G4endl;
582 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
583 return 0;
584 }
585 }
586
587 G4double l3BindingEnergy = transitionManager->Shell(zTarget,3)->BindingEnergy();
588
589 G4double massTarget = (massManager->GetAtomicMassAmu(zTarget))*amu_c2;
590
591 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2;//Mass of the system (projectile, target)
592
593 const G4double zlshell= 4.15;
594
595 G4double screenedzTarget = zTarget-zlshell;//Effective nuclear charge as seen by electrons in L3-subshell
596
597 const G4double rydbergMeV= 13.6056923e-6;
598
599 const G4double nl= 2.;
600
601 G4double tetal3 = (l3BindingEnergy*nl*nl)/((screenedzTarget*screenedzTarget)*rydbergMeV);//Screening parameter
602
603 if (verboseLevel>0) G4cout << " tetal3=" << tetal3<< G4endl;
604
605 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
606
607 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ;//Bohr radius of hydrogen
608
609 G4double sigma0 = 8.*pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
610
611 G4double velocityl3 = CalculateVelocity(3, zTarget, massIncident, energyIncident);// Scaled velocity
612
613 if (verboseLevel>0) G4cout << " velocityl3=" << velocityl3<< G4endl;
614
615 const G4double l23AnalyticalApproximation= 1.25;
616
617 G4double x3 = (nl*l23AnalyticalApproximation)/velocityl3;
618
619 if (verboseLevel>0) G4cout << " x3=" << x3<< G4endl;
620
621 G4double electrIonizationEnergyl3=0.;
622
623 if ( x3<=0.035) electrIonizationEnergyl3= 0.75*pi*(std::log(1./(x3*x3))-1.);
624 else
625 {
626 if ( x3<=3.) electrIonizationEnergyl3 =G4Exp(-2.*x3)/(0.031+(0.213*std::pow(x3,0.5))+(0.005*x3)-(0.069*std::pow(x3,3./2.))+(0.324*x3*x3));
627 else
628 {
629 if ( x3<=11.) electrIonizationEnergyl3 =2.*G4Exp(-2.*x3)/std::pow(x3,1.6);}
630 }
631
632 G4double hFunctionl3 =(electrIonizationEnergyl3*2.*nl)/(tetal3*std::pow(velocityl3,3));//takes into account the polarization effect
633
634 if (verboseLevel>0) G4cout << " hFunctionl3=" << hFunctionl3<< G4endl;
635
636 G4double gFunctionl3 = (1.+(10.*velocityl3)+(45.*velocityl3*velocityl3)+(102.*std::pow(velocityl3,3.))+(331.*std::pow(velocityl3,4.))+(6.7*std::pow(velocityl3,5.))+(58.*std::pow(velocityl3,6.))+(7.8*std::pow(velocityl3,7.))+ (0.888*std::pow(velocityl3,8.)) )/std::pow(1.+velocityl3,10.);
637 //takes into account the reduced binding effect
638
639 if (verboseLevel>0) G4cout << " gFunctionl3=" << gFunctionl3<< G4endl;
640
641 G4double sigmaPSS_l3 = 1.+(((2.*zIncident)/(screenedzTarget*tetal3))*(gFunctionl3-hFunctionl3));//Binding-polarization factor
642
643 if (verboseLevel>0) G4cout << "sigmaPSS_l3 =" << sigmaPSS_l3<< G4endl;
644
645 const G4double cNaturalUnit= 137.;
646
647 G4double yl3Formula=0.15*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocityl3/sigmaPSS_l3);
648
649 G4double l3relativityCorrection = std::pow((1.+(1.1*yl3Formula*yl3Formula)),0.5)+yl3Formula; // Relativistic correction parameter
650
651 G4double L3etaOverTheta2;
652
653 G4double universalFunction_l3 = 0.;
654
655 G4double sigmaPSSR_l3;
656
657 if ( velocityl3 < 20. )
658 {
659
660 L3etaOverTheta2 = (reducedEnergy* l3relativityCorrection)/((sigmaPSS_l3*tetal3)*(sigmaPSS_l3*tetal3));
661
662 if ( (tetal3*sigmaPSS_l3>=0.2) && (tetal3*sigmaPSS_l3<=2.6670) && (L3etaOverTheta2>=0.1e-3) && (L3etaOverTheta2<=0.866e2) )
663
664 universalFunction_l3 = 2.*FunctionFL2((tetal3*sigmaPSS_l3), L3etaOverTheta2 );
665
666 sigmaPSSR_l3 = (sigma0/(tetal3*sigmaPSS_l3))*universalFunction_l3;
667
668 if (verboseLevel>0) G4cout << " sigma PWBA L3 CS at low velocity range = " << sigmaPSSR_l3<< G4endl;
669
670 }
671
672 else
673
674 {
675
676 L3etaOverTheta2 = reducedEnergy/(tetal3*tetal3);
677
678 if ( (tetal3>=0.2) && (tetal3<=2.6670) && (L3etaOverTheta2>=0.1e-3) && (L3etaOverTheta2<=0.866e2) )
679
680 universalFunction_l3 = 2.*FunctionFL2(tetal3, L3etaOverTheta2 );
681
682 sigmaPSSR_l3 = (sigma0/tetal3)*universalFunction_l3;
683
684 if (verboseLevel>0) G4cout << " sigma PWBA L3 CS at medium and high velocity range = " << sigmaPSSR_l3<< G4endl;
685 }
686
687 G4double pssDeltal3 = (4./(systemMass*sigmaPSS_l3*tetal3))*(sigmaPSS_l3/velocityl3)*(sigmaPSS_l3/velocityl3);
688
689 if (verboseLevel>0) G4cout << " pssDeltal3=" << pssDeltal3<< G4endl;
690
691 if (pssDeltal3>1) return 0.;
692
693 G4double energyLossl3 = std::pow(1-pssDeltal3,0.5);
694
695 if (verboseLevel>0) G4cout << " energyLossl3=" << energyLossl3<< G4endl;
696
697 G4double coulombDeflectionl3 =
698 (8.*pi*zIncident/systemMass)*std::pow(tetal3*sigmaPSS_l3,-2.)*std::pow(velocityl3/sigmaPSS_l3,-3.)*(zTarget/screenedzTarget);
699
700 G4double cParameterl3 = 2.*coulombDeflectionl3/(energyLossl3*(energyLossl3+1.));
701
702 G4double coulombDeflectionFunction_l3 = 11.*ExpIntFunction(12,cParameterl3);//Coulomb-deflection effect correction
703 // *** see Brandt, Phys Rev A10, p477, f25
704
705 if (verboseLevel>0) G4cout << " coulombDeflectionFunction_l3 =" << coulombDeflectionFunction_l3 << G4endl;
706
707 G4double crossSection_L3 = coulombDeflectionFunction_l3 * sigmaPSSR_l3;
708 //ECPSSR L3 -subshell cross section is estimated at perturbed-stationnairy-state(PSS)
709 //and reduced by the energy-loss(E),the Coulomb deflection(C),and the relativity(R) effects
710
711 if (verboseLevel>0) G4cout << " crossSection_L3 =" << crossSection_L3 << G4endl;
712
713 if (crossSection_L3 >= 0)
714 {
715 return crossSection_L3 * barn;
716 }
717 else {return 0;}
718}
719
720//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
721
722G4double G4ecpssrBaseLixsModel::CalculateVelocity(G4int subShell, G4int zTarget, G4double massIncident, G4double energyIncident)
723
724{
725
727
728 G4double liBindingEnergy = transitionManager->Shell(zTarget,subShell)->BindingEnergy();
729
730 G4Proton* aProtone = G4Proton::Proton();
731 G4Alpha* aAlpha = G4Alpha::Alpha();
732
733 if (!((massIncident == aProtone->GetPDGMass()) || (massIncident == aAlpha->GetPDGMass())))
734 {
735 G4cout << "*** WARNING in G4ecpssrBaseLixsModel::CalculateVelocity : Proton or Alpha incident particles only. " << G4endl;
736 G4cout << massIncident << ", " << aAlpha->GetPDGMass() << " (alpha)" << aProtone->GetPDGMass() << " (proton)" << G4endl;
737 return 0;
738 }
739
740 constexpr G4double zlshell= 4.15;
741
742 G4double screenedzTarget = zTarget- zlshell;
743
744 constexpr G4double rydbergMeV= 13.6056923e-6;
745
746 constexpr G4double nl= 2.;
747
748 G4double tetali = (liBindingEnergy*nl*nl)/(screenedzTarget*screenedzTarget*rydbergMeV);
749
750 G4double reducedEnergy = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
751
752 G4double velocity = 2.*nl*std::pow(reducedEnergy,0.5)/tetali;
753 // *** see Brandt, Phys Rev A10, p10, f4
754
755 return velocity;
756}
757
758//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
759
760G4double G4ecpssrBaseLixsModel::FunctionFL1(G4double k, G4double theta)
761{
762 G4double sigma = 0.;
763 G4double valueT1 = 0;
764 G4double valueT2 = 0;
765 G4double valueE21 = 0;
766 G4double valueE22 = 0;
767 G4double valueE12 = 0;
768 G4double valueE11 = 0;
769 G4double xs11 = 0;
770 G4double xs12 = 0;
771 G4double xs21 = 0;
772 G4double xs22 = 0;
773
774 // PROTECTION TO ALLOW INTERPOLATION AT MINIMUM AND MAXIMUM Eta/Theta2 values
775
776 if (
777 theta==8.66e-4 ||
778 theta==8.66e-3 ||
779 theta==8.66e-2 ||
780 theta==8.66e-1 ||
781 theta==8.66e+00 ||
782 theta==8.66e+01
783 ) theta=theta-1e-12;
784
785 if (
786 theta==1.e-4 ||
787 theta==1.e-3 ||
788 theta==1.e-2 ||
789 theta==1.e-1 ||
790 theta==1.e+00 ||
791 theta==1.e+01
792 ) theta=theta+1e-12;
793
794 // END PROTECTION
795
796 auto t2 = std::upper_bound(dummyVec1.begin(),dummyVec1.end(), k);
797 auto t1 = t2-1;
798
799 auto e12 = std::upper_bound(aVecMap1[(*t1)].begin(),aVecMap1[(*t1)].end(), theta);
800 auto e11 = e12-1;
801
802 auto e22 = std::upper_bound(aVecMap1[(*t2)].begin(),aVecMap1[(*t2)].end(), theta);
803 auto e21 = e22-1;
804
805 valueT1 =*t1;
806 valueT2 =*t2;
807 valueE21 =*e21;
808 valueE22 =*e22;
809 valueE12 =*e12;
810 valueE11 =*e11;
811
812 xs11 = FL1Data[valueT1][valueE11];
813 xs12 = FL1Data[valueT1][valueE12];
814 xs21 = FL1Data[valueT2][valueE21];
815 xs22 = FL1Data[valueT2][valueE22];
816
817 if (verboseLevel>0)
818 G4cout
819 << valueT1 << " "
820 << valueT2 << " "
821 << valueE11 << " "
822 << valueE12 << " "
823 << valueE21 << " "
824 << valueE22 << " "
825 << xs11 << " "
826 << xs12 << " "
827 << xs21 << " "
828 << xs22 << " "
829 << G4endl;
830
831 G4double xsProduct = xs11 * xs12 * xs21 * xs22;
832
833 if (xs11==0 || xs12==0 ||xs21==0 ||xs22==0) return (0.);
834
835 if (xsProduct != 0.)
836 {
837 sigma = QuadInterpolator( valueE11, valueE12,
838 valueE21, valueE22,
839 xs11, xs12,
840 xs21, xs22,
841 valueT1, valueT2,
842 k, theta );
843 }
844
845 return sigma;
846}
847
848//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
849
850G4double G4ecpssrBaseLixsModel::FunctionFL2(G4double k, G4double theta)
851{
852
853 G4double sigma = 0.;
854 G4double valueT1 = 0;
855 G4double valueT2 = 0;
856 G4double valueE21 = 0;
857 G4double valueE22 = 0;
858 G4double valueE12 = 0;
859 G4double valueE11 = 0;
860 G4double xs11 = 0;
861 G4double xs12 = 0;
862 G4double xs21 = 0;
863 G4double xs22 = 0;
864
865 // PROTECTION TO ALLOW INTERPOLATION AT MINIMUM AND MAXIMUM Eta/Theta2 values
866
867 if (
868 theta==8.66e-4 ||
869 theta==8.66e-3 ||
870 theta==8.66e-2 ||
871 theta==8.66e-1 ||
872 theta==8.66e+00 ||
873 theta==8.66e+01
874 ) theta=theta-1e-12;
875
876 if (
877 theta==1.e-4 ||
878 theta==1.e-3 ||
879 theta==1.e-2 ||
880 theta==1.e-1 ||
881 theta==1.e+00 ||
882 theta==1.e+01
883 ) theta=theta+1e-12;
884
885 // END PROTECTION
886
887 auto t2 = std::upper_bound(dummyVec2.begin(),dummyVec2.end(), k);
888 auto t1 = t2-1;
889 auto e12 = std::upper_bound(aVecMap2[(*t1)].begin(),aVecMap2[(*t1)].end(), theta);
890 auto e11 = e12-1;
891 auto e22 = std::upper_bound(aVecMap2[(*t2)].begin(),aVecMap2[(*t2)].end(), theta);
892 auto e21 = e22-1;
893
894 valueT1 =*t1;
895 valueT2 =*t2;
896 valueE21 =*e21;
897 valueE22 =*e22;
898 valueE12 =*e12;
899 valueE11 =*e11;
900
901 xs11 = FL2Data[valueT1][valueE11];
902 xs12 = FL2Data[valueT1][valueE12];
903 xs21 = FL2Data[valueT2][valueE21];
904 xs22 = FL2Data[valueT2][valueE22];
905
906 if (verboseLevel>0)
907 G4cout
908 << valueT1 << " "
909 << valueT2 << " "
910 << valueE11 << " "
911 << valueE12 << " "
912 << valueE21 << " "
913 << valueE22 << " "
914 << xs11 << " "
915 << xs12 << " "
916 << xs21 << " "
917 << xs22 << " "
918 << G4endl;
919
920 G4double xsProduct = xs11 * xs12 * xs21 * xs22;
921
922 if (xs11==0 || xs12==0 ||xs21==0 ||xs22==0) return (0.);
923
924 if (xsProduct != 0.)
925 {
926 sigma = QuadInterpolator( valueE11, valueE12,
927 valueE21, valueE22,
928 xs11, xs12,
929 xs21, xs22,
930 valueT1, valueT2,
931 k, theta );
932 }
933
934 return sigma;
935}
936
937//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
938
939G4double G4ecpssrBaseLixsModel::LinLinInterpolate(G4double e1,
940 G4double e2,
941 G4double e,
942 G4double xs1,
943 G4double xs2)
944{
945 G4double value = xs1 + (xs2 - xs1)*(e - e1)/ (e2 - e1);
946 return value;
947}
948
949//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
950
951G4double G4ecpssrBaseLixsModel::LinLogInterpolate(G4double e1,
952 G4double e2,
953 G4double e,
954 G4double xs1,
955 G4double xs2)
956{
957 G4double d1 = std::log(xs1);
958 G4double d2 = std::log(xs2);
959 G4double value = G4Exp(d1 + (d2 - d1)*(e - e1)/ (e2 - e1));
960 return value;
961}
962
963//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
964
965G4double G4ecpssrBaseLixsModel::LogLogInterpolate(G4double e1,
966 G4double e2,
967 G4double e,
968 G4double xs1,
969 G4double xs2)
970{
971 G4double a = (std::log10(xs2)-std::log10(xs1)) / (std::log10(e2)-std::log10(e1));
972 G4double b = std::log10(xs2) - a*std::log10(e2);
973 G4double sigma = a*std::log10(e) + b;
974 G4double value = (std::pow(10.,sigma));
975 return value;
976}
977
978//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
979
980G4double G4ecpssrBaseLixsModel::QuadInterpolator(G4double e11, G4double e12,
981 G4double e21, G4double e22,
982 G4double xs11, G4double xs12,
983 G4double xs21, G4double xs22,
984 G4double t1, G4double t2,
985 G4double t, G4double e)
986{
987 // Log-Log
988 G4double interpolatedvalue1 = LogLogInterpolate(e11, e12, e, xs11, xs12);
989 G4double interpolatedvalue2 = LogLogInterpolate(e21, e22, e, xs21, xs22);
990 G4double value = LogLogInterpolate(t1, t2, t, interpolatedvalue1, interpolatedvalue2);
991 return value;
992
993}
const char * G4FindDataDir(const char *)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4Alpha * Alpha()
Definition G4Alpha.cc:83
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
static G4Proton * Proton()
Definition G4Proton.cc:90
G4double CalculateL1CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident) override
G4double ExpIntFunction(G4int n, G4double x)
G4double CalculateVelocity(G4int subShell, G4int zTarget, G4double massIncident, G4double energyIncident)
G4double CalculateL3CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident) override
G4double CalculateL2CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident) override