Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4OrlicLiXsModel.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 // Author: Haifa Ben Abdelouahed
27 //
28 //
29 // History:
30 // -----------
31 // 23 Apr 2008 H. Ben Abdelouahed 1st implementation
32 // 28 Apr 2008 MGP Major revision according to a design iteration
33 // 21 Apr 2009 ALF Some correction for compatibility to G4VShellCrossSection
34 // and changed name to G4OrlicLiCrossSection
35 // 21 Mar 2011 ALF some bug fixing (Z checks, )
36 // 29 Oct 2011 ALF Changed name to G4OrlicLiXsModel
37 //
38 // -------------------------------------------------------------------
39 // Class description:
40 // Low Energy Electromagnetic Physics, Cross section, proton ionisation, L shell
41 // Further documentation available from http://www.ge.infn.it/geant4/lowE
42 // -------------------------------------------------------------------
43 
44 #include "G4OrlicLiXsModel.hh"
45 
46 #include "globals.hh"
47 #include "G4PhysicalConstants.hh"
48 #include "G4SystemOfUnits.hh"
49 #include "G4Proton.hh"
50 
51 
53 {
54 
55  transitionManager = G4AtomicTransitionManager::Instance();
56 
57 }
58 
60 {
61 
62 }
63 
64 //this L-CrossSection calculation method is done according to
65 //I.ORLIC, C.H.SOW and S.M.TANG,International Journal of PIXE.Vol.4(1994) 217-230
66 
67 
68 //********************************************************************************
69 
71 
72 {
73 
74  if ( /*(energyIncident < 0.1*MeV || energyIncident > 10*MeV) ||*/ zTarget < 41 )//fixed: no control on z!
75 
76  {
77  //G4cout << "WARNING: L1 Cross-Section exist only for ZTarget between 41 and 92, zero returned " << G4endl;
78  //G4cout << "energyIncident(MeV): " << energyIncident/MeV << G4endl;
79  //G4cout << "zTarget: " << zTarget << G4endl;
80  return 0;
81  }
82 
83 
84  /*
85  G4double massIncident;
86  G4Proton* aProtone = G4Proton::Proton();
87  massIncident = aProtone->GetPDGMass();
88  */
89 
90  G4double l1BindingEnergy = transitionManager->Shell(zTarget,1)->BindingEnergy()/keV;
91 // G4double l1BindingEnergy = (transitionManager->Shell(zTarget,1)->BindingEnergy())/keV;
92 
93  G4double lamda = 1836.109; //massIncident/electron_mass_c2;
94 
95  G4double normalizedEnergy = (energyIncident/keV)/(lamda*l1BindingEnergy);
96 
97  G4double x = std::log(normalizedEnergy);
98 
99  G4double a0 = 0.;
100  G4double a1 = 0.;
101  G4double a2 = 0.;
102  G4double a3 = 0.;
103  G4double a4 = 0.;
104  G4double a5 = 0.;
105  G4double a6 = 0.;
106  G4double a7 = 0.;
107  G4double a8 = 0.;
108  G4double a9 = 0.;
109 
110 
111  if ( (zTarget>=41 && zTarget<=50) && (normalizedEnergy>=0.013 && normalizedEnergy<=1) )
112  {
113 
114  //G4cout << "Energy1 (keV) = " << normalizedEnergy * lamda*l1BindingEnergy << G4endl; //debug
115 
116  a0=11.274881;
117  a1=-0.187401;
118  a2=-0.943341;
119  a3=-1.47817;
120  a4=-1.282343;
121  a5=-0.386544;
122  a6=-0.037932;
123  a7=0.;
124  a8=0.;
125  a9=0.;
126  }
127 
128  else if ( (zTarget>=51 && zTarget<=60) && (normalizedEnergy>=0.012 && normalizedEnergy<=0.95))
129  {
130 
131  // G4cout << "Energy2 (keV) = " << normalizedEnergy * lamda*l1BindingEnergy << G4endl; //debug
132 
133  a0=11.242637;
134  a1=-0.162515;
135  a2=1.035774;
136  a3=3.970908;
137  a4=3.968233;
138  a5=1.655714;
139  a6=0.058885;
140  a7=-0.155743;
141  a8=-0.042228;
142  a9=-0.003371;
143  }
144 
145  else if ( (zTarget>=61 && zTarget<=70) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.6) )
146  {
147 
148  // G4cout << "Energy3 (keV) = " << normalizedEnergy * lamda*l1BindingEnergy << G4endl; //debug
149 
150  a0=6.476722;
151  a1=-25.804787;
152  a2=-54.061629;
153  a3=-56.684589;
154  a4=-33.223367;
155  a5=-11.034979;
156  a6=-2.042851;
157  a7=-0.194075;
158  a8=-0.007252;
159  a9=0.;
160  }
161  else if ( (zTarget>=71 && zTarget<=80) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.45) )
162  {
163 
164  // G4cout << "Energy4 (keV) = " << normalizedEnergy * lamda*l1BindingEnergy << G4endl; //debug
165 
166  a0=12.776794;
167  a1=6.562907;
168  a2=10.158703;
169  a3=7.432592;
170  a4=2.332036;
171  a5=0.317946;
172  a6=0.014479;
173  a7=0.;
174  a8=0.;
175  a9=0.;
176  }
177  else if ( (zTarget>=81 && zTarget<=92) && (normalizedEnergy>=0.008 && normalizedEnergy<=0.3) )
178  {
179 
180  // G4cout << "Energy5 (keV) = " << normalizedEnergy * lamda*l1BindingEnergy << G4endl; //debug
181 
182  a0=28.243087;
183  a1=50.199585;
184  a2=58.281684;
185  a3=34.130538;
186  a4=10.268531;
187  a5=1.525302;
188  a6=0.08835;
189  a7=0.;
190  a8=0.;
191  a9=0.;
192  }
193  else {return 0;}
194 
195 
196 G4double analyticalFunction = a0 + (a1*x)+(a2*x*x)+(a3*std::pow(x,3))+(a4*std::pow(x,4))+(a5*std::pow(x,5))+(a6*std::pow(x,6))+
197  (a7*std::pow(x,7))+(a8*std::pow(x,8))+(a9*std::pow(x,9));
198 
199 
200 
201  G4double L1crossSection = std::exp(analyticalFunction)/(l1BindingEnergy*l1BindingEnergy);
202 
203 
204  if (L1crossSection >= 0) {
205  return L1crossSection * barn;
206  }
207  else {return 0;}
208 
209 }
210 
211 //*****************************************************************************************************************************************
212 
213 
215 
216 {
217 
218 
219  if ( /*(energyIncident < 0.1*MeV || energyIncident > 10*MeV) ||*/zTarget < 41) //fixed: no control on z!)
220 
221  {
222  //G4cout << "WARNING: L2 Cross-Section exist only for ZTarget between 41 and 92, zero returned " << G4endl;
223  // G4cout << "energyIncident(MeV): " << energyIncident/MeV << G4endl;
224  //G4cout << "zTarget: " << zTarget << G4endl;
225  return 0;
226  }
227 
228 
229 
230  G4double massIncident;
231 
232  G4Proton* aProtone = G4Proton::Proton();
233 
234  massIncident = aProtone->GetPDGMass();
235 
236  G4double L2crossSection;
237 
238  G4double l2BindingEnergy = (transitionManager->Shell(zTarget,2)->BindingEnergy())/keV;
239 
240  G4double lamda = massIncident/electron_mass_c2;
241 
242  G4double normalizedEnergy = (energyIncident/keV)/(lamda*l2BindingEnergy);
243 
244  G4double x = std::log(normalizedEnergy);
245 
246  G4double a0 = 0.;
247  G4double a1 = 0.;
248  G4double a2 = 0.;
249  G4double a3 = 0.;
250  G4double a4 = 0.;
251  G4double a5 = 0.;
252 
253  if ( (zTarget>=41 && zTarget<=50) && (normalizedEnergy>=0.015 && normalizedEnergy<=1.5))
254  {
255  a0=11.194798;
256  a1=0.178807;
257  a2=-0.449865;
258  a3=-0.063528;
259  a4=-0.015364;
260  a5=0.;
261  }
262 
263  else if ( (zTarget>=51 && zTarget<=60) && (normalizedEnergy>=0.012 && normalizedEnergy<=1.0))
264  {
265  a0=11.241409;
266  a1=0.149635;
267  a2=-0.633269;
268  a3=-0.17834;
269  a4=-0.034743;
270  a5=0.006474; // a little bit better if this is zero (respect to ecpssr)
271 
272  }
273 
274  else if ( (zTarget>=61 && zTarget<=70) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.65))
275  {
276  a0=11.247424;
277  a1=0.203051;
278  a2=-0.219083;
279  a3=0.164514;
280  a4=0.058692;
281  a5=0.007866;
282  }
283  else if ( (zTarget>=71 && zTarget<=80) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.47))
284  {
285  a0=11.229924;
286  a1=-0.087241;
287  a2=-0.753908;
288  a3=-0.181546;
289  a4=-0.030406;
290  a5=0.;
291  }
292  else if ( (zTarget>=81 && zTarget<=92) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.35))
293  {
294  a0=11.586671;
295  a1=0.730838;
296  a2=-0.056713;
297  a3=0.053262;
298  a4=-0.003672;
299  a5=0.;
300  }
301  else {return 0;}
302 
303  G4double analyticalFunction = a0 + (a1*x)+(a2*x*x)+(a3*std::pow(x,3))+(a4*std::pow(x,4))+(a5*std::pow(x,5));
304 
305 
306  L2crossSection = std::exp(analyticalFunction)/(l2BindingEnergy*l2BindingEnergy);
307 
308 
309 
310  if (L2crossSection >= 0) {
311  return L2crossSection * barn;
312  }
313  else {return 0;}
314 
315 }
316 
317 //*****************************************************************************************************************************************
318 
319 
321 
322 {
323 
324  if ( /*(energyIncident < 0.1*MeV || energyIncident > 10*MeV) ||*/zTarget < 41) //fixed: no control on z!
325 
326  {
327  //G4cout << "WARNING: L3 Cross-Section exist only for ZTarget between 41 and 92, zero returned " << G4endl;
328  //G4cout << "energyIncident(MeV): " << energyIncident/MeV << G4endl;
329  //G4cout << "zTarget: " << zTarget << G4endl;
330  return 0;
331  }
332 
333  G4double massIncident;
334 
335  G4Proton* aProtone = G4Proton::Proton();
336 
337  massIncident = aProtone->GetPDGMass();
338 
339 
340  G4double L3crossSection;
341 
342  G4double l3BindingEnergy = (transitionManager->Shell(zTarget,3)->BindingEnergy())/keV;
343 
344 
345  G4double lamda = massIncident/electron_mass_c2;
346 
347  G4double normalizedEnergy = (energyIncident/keV)/(lamda*l3BindingEnergy);
348 
349  G4double x = std::log(normalizedEnergy);
350 
351 
352  G4double a0 = 0.;
353  G4double a1 = 0.;
354  G4double a2 = 0.;
355  G4double a3 = 0.;
356  G4double a4 = 0.;
357  G4double a5 = 0.;
358 
359  if ( (zTarget>=41 && zTarget<=50 ) && (normalizedEnergy>=0.015 && normalizedEnergy<=1.5))
360  {
361  a0=11.91837;
362  a1=0.03064;
363  a2=-0.657644;
364  a3=-0.14532;
365  a4=-0.026059;
366  //a5=-0.044735; Correction to Orlic model as explained in
367  //Abdelhwahed H Incerti S and Mantero A 2009 Nucl. Instrum. Meth.B 267 37
368  }
369 
370  else if ( (zTarget>=51 && zTarget<=60 ) && (normalizedEnergy>=0.013 && normalizedEnergy<=1.1))
371  {
372  a0=11.909485;
373  a1=0.15918;
374  a2=-0.588004;
375  a3=-0.159466;
376  a4=-0.033184;
377  }
378 
379  else if ( (zTarget>=61 && zTarget<=70 ) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.67))
380  {
381  a0=11.878472;
382  a1=-0.137007;
383  a2=-0.959475;
384  a3=-0.316505;
385  a4=-0.054154;
386  }
387  else if ( (zTarget>=71 && zTarget<=80 ) && (normalizedEnergy>=0.013 && normalizedEnergy<=0.5))
388  {
389  a0=11.802538;
390  a1=-0.371796;
391  a2=-1.052238;
392  a3=-0.28766;
393  a4=-0.042608;
394  }
395  else if ( (zTarget>=81 && zTarget<=92 ) && (normalizedEnergy>=0.01 && normalizedEnergy<=0.35))
396  {
397  a0=11.423712;
398  a1=-1.428823;
399  a2=-1.946979;
400  a3=-0.585198;
401  a4=-0.076467;
402  }
403  else {return 0;}
404 
405 
406  G4double analyticalFunction = a0 + (a1*x)+(a2*x*x)+(a3*std::pow(x,3))+(a4*std::pow(x,4))+(a5*std::pow(x,5));
407 
408 
409  L3crossSection = std::exp(analyticalFunction)/(l3BindingEnergy*l3BindingEnergy);
410 
411 
412  if (L3crossSection >= 0) {
413  return L3crossSection * barn;
414  }
415  else {return 0;}
416 
417 
418 }
G4double BindingEnergy() const
int G4int
Definition: G4Types.hh:78
virtual ~G4OrlicLiXsModel()
static G4Proton * Proton()
Definition: G4Proton.cc:93
float electron_mass_c2
Definition: hepunit.py:274
G4double CalculateL3CrossSection(G4int zTarget, G4double energyIncident)
G4double GetPDGMass() const
double G4double
Definition: G4Types.hh:76
static G4AtomicTransitionManager * Instance()
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
G4double CalculateL2CrossSection(G4int zTarget, G4double energyIncident)
G4double CalculateL1CrossSection(G4int zTarget, G4double energyIncident)