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
G4CompositeEMDataSet.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// 1 Aug 2001 MGP Created
33//
34// 15 Jul 2009 Nicolas A. Karakatsanis
35//
36// - LoadNonLogData method was created to load only the non-logarithmic data from G4EMLOW
37// dataset. It is essentially performing the data loading operations as in the past.
38//
39// - LoadData method was revised in order to calculate the logarithmic values of the data
40// It retrieves the data values from the G4EMLOW data files but, then, calculates the
41// respective log values and loads them to seperate data structures.
42//
43// - SetLogEnergiesData method was cretaed to set logarithmic values to G4 data vectors.
44// The EM data sets, initialized this way, contain both non-log and log values.
45// These initialized data sets can enhance the computing performance of data interpolation
46// operations
47//
48// -------------------------------------------------------------------
49
51#include "G4EMDataSet.hh"
53#include <fstream>
54#include <sstream>
55
56//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57
59 G4double argUnitEnergies,
60 G4double argUnitData,
61 G4int argMinZ,
62 G4int argMaxZ)
63 :
64 algorithm(argAlgorithm),
65 unitEnergies(argUnitEnergies),
66 unitData(argUnitData),
67 minZ(argMinZ),
68 maxZ(argMaxZ)
69{
70 if (algorithm == nullptr)
71 G4Exception("G4CompositeEMDataSet::G4CompositeEMDataSet",
72 "em1003",FatalException,"interpolation == 0");
73
74}
75
76//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
77
79{
80 CleanUpComponents();
81 if (algorithm) delete algorithm;
82}
83//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
84
86{
87 const G4VEMDataSet* component(GetComponent(argComponentId));
88
89 if (component) return component->FindValue(argEnergy);
90
91 std::ostringstream message;
92 message << "G4CompositeEMDataSet::FindValue - component " << argComponentId << " not found";
93
94 G4Exception("G4CompositeEMDataSet::FindValue",
95 "em1004",FatalException,message.str().c_str());
96
97 return 0.;
98}
99
100//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
101
103{
104 const G4int n = (G4int)NumberOfComponents();
105
106 G4cout << "The data set has " << n << " components" << G4endl;
107 G4cout << G4endl;
108
109 G4int i(0);
110
111 while (i<n)
112 {
113 G4cout << "--- Component " << i << " ---" << G4endl;
115 ++i;
116 }
117}
118
119//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
120
121void G4CompositeEMDataSet::SetEnergiesData(G4DataVector* argEnergies, G4DataVector* argData, G4int argComponentId)
122{
123 G4VEMDataSet * component(components[argComponentId]);
124
125 if (component)
126 {
127 component->SetEnergiesData(argEnergies, argData, 0);
128 return;
129 }
130
131 std::ostringstream message;
132 message << "G4CompositeEMDataSet::SetEnergiesData - component " << argComponentId << " not found";
133
134 G4Exception("G4CompositeEMDataSet::SetEnergiesData",
135 "em1004",FatalException,message.str().c_str());
136}
137
138//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
139
141 G4DataVector* argData,
142 G4DataVector* argLogEnergies,
143 G4DataVector* argLogData,
144 G4int argComponentId)
145{
146 G4VEMDataSet * component(components[argComponentId]);
147
148 if (component)
149 {
150 component->SetLogEnergiesData(argEnergies, argData, argLogEnergies, argLogData, 0);
151 return;
152 }
153
154 std::ostringstream message;
155 message << "G4CompositeEMDataSet::SetEnergiesData - component " << argComponentId << " not found";
156
157 G4Exception("G4CompositeEMDataSet::SetLogEnergiesData",
158 "em1004",FatalException,message.str().c_str());
159}
160
161//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
162
164{
165 CleanUpComponents();
166
167 for (G4int z(minZ); z<maxZ; ++z)
168 {
169 G4VEMDataSet* component = new G4EMDataSet(z, algorithm->Clone(), unitEnergies, unitData);
170 if (!component->LoadData(argFileName))
171 {
172 delete component;
173 return false;
174 }
175 AddComponent(component);
176 }
177 return true;
178}
179
180//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
181
183{
184 CleanUpComponents();
185
186 for (G4int z(minZ); z<maxZ; ++z)
187 {
188 G4VEMDataSet* component = new G4EMDataSet(z, algorithm->Clone(), unitEnergies, unitData);
189 if (!component->LoadNonLogData(argFileName))
190 {
191 delete component;
192 return false;
193 }
194 AddComponent(component);
195 }
196 return true;
197}
198
199//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
200
202{
203 for (G4int z=minZ; z<maxZ; ++z)
204 {
205 const G4VEMDataSet* component(GetComponent(z-minZ));
206
207 if (!component)
208 {
209 std::ostringstream message;
210 message << "G4CompositeEMDataSet::SaveData - component " << (z-minZ) << " not found";
211 G4Exception("G4CompositeEMDataSet::SaveData",
212 "em1004",FatalException,message.str().c_str());
213 return false;
214 }
215
216 if (!component->SaveData(argFileName))
217 return false;
218 }
219
220 return true;
221}
222
223//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
224
225void G4CompositeEMDataSet::CleanUpComponents(void)
226{
227 while (!components.empty())
228 {
229 if (components.back())
230 delete components.back();
231 components.pop_back();
232 }
233}
234
235//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
236
238{
239 G4double value = 0.;
240 if (componentId >= 0 && componentId < (G4int)components.size())
241 {
242 const G4VEMDataSet* dataSet = GetComponent(componentId);
243 value = dataSet->RandomSelect();
244 }
245 return value;
246}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual void PrintData(void) const
virtual G4double RandomSelect(G4int componentId) const
virtual size_t NumberOfComponents() const
virtual void SetEnergiesData(G4DataVector *x, G4DataVector *data, G4int componentId)
virtual void AddComponent(G4VEMDataSet *dataSet)
virtual G4double FindValue(G4double x, G4int componentId=0) const
virtual void SetLogEnergiesData(G4DataVector *xData, G4DataVector *data, G4DataVector *xLogData, G4DataVector *Logdata, G4int componentId)
G4CompositeEMDataSet(G4VDataSetAlgorithm *argAlgorithm, G4double eUnit=CLHEP::MeV, G4double dataUnit=CLHEP::barn, G4int zMin=1, G4int zMax=99)
virtual const G4VEMDataSet * GetComponent(G4int componentId) const
virtual G4bool LoadNonLogData(const G4String &fileName)
virtual G4bool LoadData(const G4String &fileName)
virtual G4bool SaveData(const G4String &fileName) const
virtual G4VDataSetAlgorithm * Clone() const =0
virtual G4bool SaveData(const G4String &fileName) const =0
virtual void SetEnergiesData(G4DataVector *x, G4DataVector *data, G4int component=0)=0
virtual G4bool LoadNonLogData(const G4String &fileName)=0
virtual G4double RandomSelect(G4int componentId=0) const =0
virtual void SetLogEnergiesData(G4DataVector *x, G4DataVector *data, G4DataVector *Log_x, G4DataVector *Log_data, G4int component=0)=0
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
virtual G4bool LoadData(const G4String &fileName)=0
virtual void PrintData(void) const =0