Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4DopplerProfile.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//
27//
28// Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
29//
30// History:
31// -----------
32// 31 Jul 2001 MGP Created
33//
34// -------------------------------------------------------------------
35
36#include "G4DopplerProfile.hh"
37#include "G4DataVector.hh"
38#include "G4SystemOfUnits.hh"
39#include "G4VEMDataSet.hh"
40#include "G4EMDataSet.hh"
44
45#include <fstream>
46#include <sstream>
47#include "Randomize.hh"
48
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
50
52 : zMin(minZ), zMax(maxZ)
53{
54 LoadBiggsP("/doppler/p-biggs");
55
56 for (G4int Z=zMin; Z<zMax+1; Z++)
57 {
58 LoadProfile("/doppler/profile",Z);
59 }
60}
61
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
63
64// Destructor
66{
67 for (auto& pos : profileMap)
68 {
69 G4VEMDataSet* dataSet = pos.second;
70 delete dataSet;
71 dataSet = nullptr;
72 }
73}
74
75//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
76
78{
79 G4int n = 0;
80 if (Z>= zMin && Z <= zMax) n = nShells[Z-1];
81 return n;
82}
83
84//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
85
87{
88 if (Z < zMin || Z > zMax)
89 G4Exception("G4DopplerProfile::Profiles",
90 "em1005",FatalException,"Z outside boundaries");
91 auto pos = profileMap.find(Z);
92 G4VEMDataSet* dataSet = (*pos).second;
93 return dataSet;
94}
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
97
99{
100 const G4VEMDataSet* profis = Profiles(Z);
101 const G4VEMDataSet* profi = profis->GetComponent(shellIndex);
102 return profi;
103}
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
106
108{
109 for (G4int Z=zMin; Z<zMax; Z++)
110 {
111 const G4VEMDataSet* profis = Profiles(Z);
112 profis->PrintData();
113 }
114}
115
116//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
117
118void G4DopplerProfile::LoadBiggsP(const G4String& fileName)
119{
120 std::ostringstream ost;
121 ost << fileName << ".dat";
122 G4String name(ost.str());
123
124 const char* path = G4FindDataDir("G4LEDATA");
125 if (!path)
126 {
127 G4Exception("G4DopplerProfile::LoadBiggsP",
128 "em0006",FatalException,"G4LEDATA environment variable not set");
129 return;
130 }
131
132 G4String pathString(path);
133 G4String dirFile = pathString + name;
134 std::ifstream file(dirFile);
135 std::filebuf* lsdp = file.rdbuf();
136
137 if (! (lsdp->is_open()) )
138 {
139 G4String s1("data file: ");
140 G4String s2(" not found");
141 G4String excep = s1 + dirFile + s2;
142 G4Exception("G4DopplerProfile::LoadBiggsP",
143 "em0003",FatalException,excep);
144 }
145
146 G4double p;
147 while(!file.eof())
148 {
149 file >> p;
150 biggsP.push_back(p);
151 }
152
153 // Make sure that the number of data loaded corresponds to the number in Biggs' paper
154 if (biggsP.size() != nBiggs)
155 G4Exception("G4DopplerProfile::LoadBiggsP",
156 "em1006",FatalException,"Number of momenta read in is not 31");
157}
158
159//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
160
161void G4DopplerProfile::LoadProfile(const G4String& fileName,G4int Z)
162{
163 std::ostringstream ost;
164 ost << fileName << "-" << Z << ".dat";
165 G4String name(ost.str());
166
167 const char* path = G4FindDataDir("G4LEDATA");
168 if (!path)
169 {
170 G4String excep("G4LEDATA environment variable not set");
171 G4Exception("G4DopplerProfile::LoadProfile",
172 "em0006",FatalException,excep);
173 return;
174 }
175
176 G4String pathString(path);
177 G4String dirFile = pathString + name;
178 std::ifstream file(dirFile);
179 std::filebuf* lsdp = file.rdbuf();
180
181 if (! (lsdp->is_open()) )
182 {
183 G4String s1("data file: ");
184 G4String s2(" not found");
185 G4String excep = s1 + dirFile + s2;
186 G4Exception("G4DopplerProfile::LoadProfile",
187 "em0003",FatalException,excep);
188 }
189
190 G4double p;
191 G4int nShell = 0;
192
193 // Create CompositeDataSet for the current Z
194 G4VDataSetAlgorithm* interpolation = new G4LogLogInterpolation;
195 G4VEMDataSet* dataSetForZ = new G4CompositeEMDataSet(interpolation,1.,1.,1,1);
196
197 while (!file.eof())
198 {
199 nShell++;
200 G4DataVector* profi = new G4DataVector;
201 G4DataVector* biggs = new G4DataVector;
202
203 // Read in profile data for the current shell
204 for (size_t i=0; i<nBiggs; i++)
205 {
206 file >> p;
207 profi->push_back(p);
208 biggs->push_back(biggsP[i]);
209 }
210
211 // Create G4EMDataSet for the current shell
212 G4VDataSetAlgorithm* algo = interpolation->Clone();
213 G4VEMDataSet* dataSet = new G4EMDataSet(Z, biggs, profi, algo, 1., 1., true);
214
215 // Add current shell profile component to G4CompositeEMDataSet for the current Z
216 dataSetForZ->AddComponent(dataSet);
217 }
218
219 // Fill in number of shells for the current Z
220 nShells.push_back(nShell);
221
222 profileMap[Z] = dataSetForZ;
223}
224
225//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
226
228{
229 G4double value = 0.;
230 const G4VEMDataSet* profis = Profiles(Z);
231 value = profis->RandomSelect(shellIndex);
232 return value;
233}
const char * G4FindDataDir(const char *)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4VEMDataSet * Profiles(G4int Z) const
void PrintData() const
size_t NumberOfProfiles(G4int Z) const
G4DopplerProfile(G4int minZ=1, G4int maxZ=100)
const G4VEMDataSet * Profile(G4int Z, G4int ShellIndex) const
G4double RandomSelectMomentum(G4int Z, G4int shellIndex) const
virtual G4VDataSetAlgorithm * Clone() const =0
virtual const G4VEMDataSet * GetComponent(G4int componentId) const =0
virtual G4double RandomSelect(G4int componentId=0) const =0
virtual void AddComponent(G4VEMDataSet *dataSet)=0
virtual void PrintData(void) const =0
const char * name(G4int ptype)