Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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