Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/lowenergy/src/G4ecpssrBaseLixsModel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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>
 28 #include "G4ecpssrBaseLixsModel.hh"
 29 #include "globals.hh"
 30 #include "G4PhysicalConstants.hh"
 31 #include "G4SystemOfUnits.hh"
 32 #include "G4AtomicTransitionManager.hh"
 33 #include "G4NistManager.hh"
 34 #include "G4Proton.hh"
 35 #include "G4Alpha.hh"
 36 #include "G4LinLogInterpolation.hh"
 37 #include "G4Exp.hh"
 38 
 39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 40 
 41 G4ecpssrBaseLixsModel::G4ecpssrBaseLixsModel()
 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 
112 G4ecpssrBaseLixsModel::~G4ecpssrBaseLixsModel()
113 {}
114 
115 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
116 
117 G4double G4ecpssrBaseLixsModel::ExpIntFunction(G4int n,G4double x)
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 
186 G4double G4ecpssrBaseLixsModel::CalculateL1CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
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 
196   G4AtomicTransitionManager*  transitionManager =  G4AtomicTransitionManager::Instance();
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 
389 G4double G4ecpssrBaseLixsModel::CalculateL2CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
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 
399   G4AtomicTransitionManager*  transitionManager =  G4AtomicTransitionManager::Instance();
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 
552 G4double G4ecpssrBaseLixsModel::CalculateL3CrossSection(G4int zTarget,G4double massIncident, G4double energyIncident)
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 
562   G4AtomicTransitionManager*  transitionManager =  G4AtomicTransitionManager::Instance();
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 
722 G4double G4ecpssrBaseLixsModel::CalculateVelocity(G4int subShell, G4int zTarget, G4double massIncident,  G4double energyIncident)
723 
724 {
725 
726   G4AtomicTransitionManager*  transitionManager =  G4AtomicTransitionManager::Instance();
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 
760 G4double 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 
850 G4double 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 
939 G4double 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 
951 G4double 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 
965 G4double 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 
980 G4double 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 }
994