Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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"
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
196G4double 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}
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
G4double CalculateL2CrossSection(G4int zTarget, G4double energyIncident)
G4double CalculateL1CrossSection(G4int zTarget, G4double energyIncident)
G4double CalculateL3CrossSection(G4int zTarget, G4double energyIncident)
virtual ~G4OrlicLiXsModel()
static G4Proton * Proton()
Definition: G4Proton.cc:93