Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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 ([email protected])
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)