Geant4-11
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ANSTOecpssrMixsModel.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// History:
27// -----------
28// 10 Nov 2021 S. Guatelli & S. Bakr, Wollongong University - 1st implementation
29//
30// Class description
31// ----------------
32// Computation of K, L & M shell ECPSSR ionisation cross sections for protons and alphas
33// Based on the work of
34// - S. Bakr et al. (2021) NIM B, 507:11�19.
35// - S. Bakr et al (2018), NIMB B, 436: 285-291.
36// ---------------------------------------------------------------------------------------
37
38#include <fstream>
39#include <iomanip>
40
41#include "globals.hh"
42#include "G4ios.hh"
43#include "G4SystemOfUnits.hh"
44
45#include "G4EMDataSet.hh"
46#include "G4LinInterpolation.hh"
47#include "G4Proton.hh"
48#include "G4Alpha.hh"
49
51
52//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53
55{
56 G4cout << "Using ANSTO M Cross Sections! "<< G4endl;
57
59
60 for (G4int i=67; i<93; i++)
61 {
63 protonM1DataSetMap[i]->LoadData("pixe_ANSTO/proton/m1-");
64
66 protonM2DataSetMap[i]->LoadData("pixe_ANSTO/proton/m2-");
67
69 protonM3DataSetMap[i]->LoadData("pixe_ANSTO/proton/m3-");
70
72 protonM4DataSetMap[i]->LoadData("pixe_ANSTO/proton/m4-");
73
75 protonM5DataSetMap[i]->LoadData("pixe_ANSTO/proton/m5-");
76 }
77
83
84
85 for (G4int i=67; i<93; i++)
86 {
88 alphaM1DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m1-");
89
91 alphaM2DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m2-");
92
94 alphaM3DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m3-");
95
97 alphaM4DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m4-");
98
100 alphaM5DataSetMap[i]->LoadData("pixe_ANSTO/alpha/m5-");
101 }
102
108}
109
110//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
111
113{
114 protonM1DataSetMap.clear();
115 alphaM1DataSetMap.clear();
116
117 protonM2DataSetMap.clear();
118 alphaM2DataSetMap.clear();
119
120 protonM3DataSetMap.clear();
121 alphaM3DataSetMap.clear();
122
123 protonM4DataSetMap.clear();
124 alphaM4DataSetMap.clear();
125
126 protonM5DataSetMap.clear();
127 alphaM5DataSetMap.clear();
128
129 delete interpolation;
130}
131
132//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
133
135{
136 G4Proton* aProton = G4Proton::Proton();
137 G4Alpha* aAlpha = G4Alpha::Alpha();
138 G4double sigma = 0;
139 G4int mShellIndex = mShellId -1;
140
141 if (massIncident == aProton->GetPDGMass())
142 {
143 if (energyIncident > 0.2*MeV && energyIncident < 5.*MeV && zTarget < 93 && zTarget > 66) {
144
145 sigma = protonMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV);
146 if (sigma !=0 && energyIncident > protonMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.;
147 }
148 }
149
150 else if (massIncident == aAlpha->GetPDGMass())
151 {
152 if (energyIncident > 0.2*MeV && energyIncident < 10.*MeV && zTarget < 93 && zTarget > 66) {
153
154 sigma = alphaMiXsVector[mShellIndex][zTarget]->FindValue(energyIncident/MeV);
155 if (sigma !=0 && energyIncident > alphaMiXsVector[mShellIndex][zTarget]->GetEnergies(0).back()*MeV) return 0.;
156 }
157 }
158
159 else
160 {
161 sigma = 0.;
162 }
163
164
165 // sigma is in internal units: it has been converted from
166 // the input file in barns bt the EmDataset
167 return sigma;
168}
169
170//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
171
173{
174
175 // mShellId
176 return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 1);
177
178}
179
180//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
181
183{
184
185 // mShellId
186 return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 2);
187
188 /*
189
190 G4Proton* aProton = G4Proton::Proton();
191 G4Alpha* aAlpha = G4Alpha::Alpha();
192 G4double sigma = 0;
193
194 if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
195
196 if (massIncident == aProton->GetPDGMass())
197 {
198 sigma = protonM2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
199 if (sigma !=0 && energyIncident > protonM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
200 }
201 else if (massIncident == aAlpha->GetPDGMass())
202 {
203 sigma = alphaM2DataSetMap[zTarget]->FindValue(energyIncident/MeV);
204 if (sigma !=0 && energyIncident > alphaM2DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
205 }
206 else
207 {
208 sigma = 0.;
209 }
210 }
211
212 // sigma is in internal units: it has been converted from
213 // the input file in barns bt the EmDataset
214 return sigma;
215 */
216}
217
218//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
219
221{
222
223 return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 3);
224 /*
225
226
227 G4Proton* aProton = G4Proton::Proton();
228 G4Alpha* aAlpha = G4Alpha::Alpha();
229 G4double sigma = 0;
230
231 if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
232
233 if (massIncident == aProton->GetPDGMass())
234 {
235 sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
236 if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
237 }
238 else if (massIncident == aAlpha->GetPDGMass())
239 {
240 sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
241 if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
242 }
243 else
244 {
245 sigma = 0.;
246 }
247 }
248
249 // sigma is in internal units: it has been converted from
250 // the input file in barns bt the EmDataset
251 return sigma;
252 */
253}
254
255//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
256
258{
259
260 return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 4);
261 /*
262 G4Proton* aProton = G4Proton::Proton();
263 G4Alpha* aAlpha = G4Alpha::Alpha();
264 G4double sigma = 0;
265
266 if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
267
268 if (massIncident == aProton->GetPDGMass())
269 {
270 sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
271 if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
272 }
273 else if (massIncident == aAlpha->GetPDGMass())
274 {
275 sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
276 if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
277 }
278 else
279 {
280 sigma = 0.;
281 }
282 }
283
284 // sigma is in internal units: it has been converted from
285 // the input file in barns bt the EmDataset
286 return sigma;
287 */
288}
289
290//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
291
293{
294
295 return CalculateMiCrossSection (zTarget, massIncident, energyIncident, 5);
296 /*
297 G4Proton* aProton = G4Proton::Proton();
298 G4Alpha* aAlpha = G4Alpha::Alpha();
299 G4double sigma = 0;
300
301 if (energyIncident > 0.1*MeV && energyIncident < 10*MeV && zTarget < 93 && zTarget > 61) {
302
303 if (massIncident == aProton->GetPDGMass())
304 {
305 sigma = protonM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
306 if (sigma !=0 && energyIncident > protonM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
307 }
308 else if (massIncident == aAlpha->GetPDGMass())
309 {
310 sigma = alphaM3DataSetMap[zTarget]->FindValue(energyIncident/MeV);
311 if (sigma !=0 && energyIncident > alphaM3DataSetMap[zTarget]->GetEnergies(0).back()*MeV) return 0.;
312 }
313 else
314 {
315 sigma = 0.;
316 }
317 }
318
319 // sigma is in internal units: it has been converted from
320 // the input file in barns bt the EmDataset
321 return sigma;
322 */
323}
static constexpr double MeV
Definition: G4SIunits.hh:200
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4double CalculateM2CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
G4VDataSetAlgorithm * interpolation
G4double CalculateM5CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
G4double CalculateM4CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
std::map< G4int, G4VEMDataSet * > alphaM5DataSetMap
std::map< G4int, G4VEMDataSet * > protonM5DataSetMap
std::map< G4int, G4VEMDataSet * > protonM4DataSetMap
G4double CalculateM1CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
std::map< G4int, G4VEMDataSet * > alphaM2DataSetMap
std::map< G4int, G4VEMDataSet * > alphaM3DataSetMap
G4double CalculateMiCrossSection(G4int zTarget, G4double massIncident, G4double energyIncident, G4int mShellId)
std::vector< std::map< G4int, G4VEMDataSet * > > alphaMiXsVector
std::map< G4int, G4VEMDataSet * > protonM1DataSetMap
std::map< G4int, G4VEMDataSet * > protonM2DataSetMap
G4double CalculateM3CrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
std::vector< std::map< G4int, G4VEMDataSet * > > protonMiXsVector
std::map< G4int, G4VEMDataSet * > alphaM4DataSetMap
std::map< G4int, G4VEMDataSet * > alphaM1DataSetMap
std::map< G4int, G4VEMDataSet * > protonM3DataSetMap
static G4Alpha * Alpha()
Definition: G4Alpha.cc:88
static G4Proton * Proton()
Definition: G4Proton.cc:92