Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4EMDataSet Class Reference

#include <G4EMDataSet.hh>

+ Inheritance diagram for G4EMDataSet:

Public Member Functions

 G4EMDataSet (G4int argZ, G4VDataSetAlgorithm *algo, G4double xUnit=CLHEP::MeV, G4double yUnit=CLHEP::barn, G4bool random=false)
 
 G4EMDataSet (G4int argZ, G4DataVector *xData, G4DataVector *data, G4VDataSetAlgorithm *algo, G4double xUnit=CLHEP::MeV, G4double yUnit=CLHEP::barn, G4bool random=false)
 
 G4EMDataSet (G4int argZ, G4DataVector *xData, G4DataVector *data, G4DataVector *xLogData, G4DataVector *Logdata, G4VDataSetAlgorithm *algo, G4double xUnit=CLHEP::MeV, G4double yUnit=CLHEP::barn, G4bool random=false)
 
virtual ~G4EMDataSet ()
 
virtual G4double FindValue (G4double x, G4int componentId=0) const
 
virtual void PrintData (void) const
 
virtual const G4VEMDataSetGetComponent (G4int) const
 
virtual void AddComponent (G4VEMDataSet *)
 
virtual std::size_t NumberOfComponents (void) const
 
virtual const G4DataVectorGetEnergies (G4int) const
 
virtual const G4DataVectorGetData (G4int) const
 
virtual const G4DataVectorGetLogEnergies (G4int) const
 
virtual const G4DataVectorGetLogData (G4int) const
 
virtual void SetEnergiesData (G4DataVector *xData, G4DataVector *data, G4int componentId)
 
virtual void SetLogEnergiesData (G4DataVector *xData, G4DataVector *data, G4DataVector *xLogData, G4DataVector *Logdata, G4int componentId)
 
virtual G4bool LoadData (const G4String &fileName)
 
virtual G4bool LoadNonLogData (const G4String &fileName)
 
virtual G4bool SaveData (const G4String &fileName) const
 
virtual G4double RandomSelect (G4int componentId=0) const
 
- Public Member Functions inherited from G4VEMDataSet
 G4VEMDataSet ()
 
virtual ~G4VEMDataSet ()
 
 G4VEMDataSet (const G4VEMDataSet &copy)=delete
 
G4VEMDataSetoperator= (const G4VEMDataSet &right)=delete
 

Detailed Description

Definition at line 53 of file G4EMDataSet.hh.

Constructor & Destructor Documentation

◆ G4EMDataSet() [1/3]

G4EMDataSet::G4EMDataSet ( G4int argZ,
G4VDataSetAlgorithm * algo,
G4double xUnit = CLHEP::MeV,
G4double yUnit = CLHEP::barn,
G4bool random = false )
explicit

Definition at line 61 of file G4EMDataSet.cc.

65 :
66 energies(nullptr),
67 data(nullptr),
68 log_energies(nullptr),
69 log_data(nullptr),
70 algorithm(algo),
71 pdf(nullptr),
72 unitEnergies(xUnit),
73 unitData(yUnit),
74 z(Z),
75 randomSet(random)
76{
77 if (algorithm == nullptr) {
78 G4Exception("G4EMDataSet::G4EMDataSet",
79 "em1012",FatalException,"interpolation == 0");
80 } else if (randomSet) { BuildPdf(); }
81}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)

Referenced by G4EMDataSet(), G4EMDataSet(), and G4EMDataSet().

◆ G4EMDataSet() [2/3]

G4EMDataSet::G4EMDataSet ( G4int argZ,
G4DataVector * xData,
G4DataVector * data,
G4VDataSetAlgorithm * algo,
G4double xUnit = CLHEP::MeV,
G4double yUnit = CLHEP::barn,
G4bool random = false )
explicit

Definition at line 85 of file G4EMDataSet.cc.

91 :
92 energies(dataX),
93 data(dataY),
94 log_energies(nullptr),
95 log_data(nullptr),
96 algorithm(algo),
97 pdf(nullptr),
98 unitEnergies(xUnit),
99 unitData(yUnit),
100 z(argZ),
101 randomSet(random)
102{
103 if (!algorithm || !energies || !data) {
104 G4Exception("G4EMDataSet::G4EMDataSet",
105 "em1012",FatalException,"interpolation == 0");
106 } else {
107 if (energies->size() != data->size()) {
108 G4Exception("G4EMDataSet::G4EMDataSet",
109 "em1012",FatalException,"different size for energies and data");
110 } else if (randomSet) {
111 BuildPdf();
112 }
113 }
114}

◆ G4EMDataSet() [3/3]

G4EMDataSet::G4EMDataSet ( G4int argZ,
G4DataVector * xData,
G4DataVector * data,
G4DataVector * xLogData,
G4DataVector * Logdata,
G4VDataSetAlgorithm * algo,
G4double xUnit = CLHEP::MeV,
G4double yUnit = CLHEP::barn,
G4bool random = false )
explicit

Definition at line 118 of file G4EMDataSet.cc.

126 :
127 energies(dataX),
128 data(dataY),
129 log_energies(dataLogX),
130 log_data(dataLogY),
131 algorithm(algo),
132 pdf(nullptr),
133 unitEnergies(xUnit),
134 unitData(yUnit),
135 z(argZ),
136 randomSet(random)
137{
138 if (!algorithm || !energies || !data || !log_energies || !log_data) {
139 G4Exception("G4EMDataSet::G4EMDataSet",
140 "em1012",FatalException,"interpolation == 0");
141 } else {
142 if ((energies->size() != data->size()) ||
143 (energies->size() != log_energies->size()) ||
144 (energies->size() != log_data->size())) {
145 G4Exception("G4EMDataSet::G4EMDataSet",
146 "em1012",FatalException,"different size for energies and data");
147 } else if (randomSet) {
148 BuildPdf();
149 }
150 }
151}

◆ ~G4EMDataSet()

G4EMDataSet::~G4EMDataSet ( )
virtual

Definition at line 155 of file G4EMDataSet.cc.

156{
157 delete algorithm;
158 delete energies;
159 delete data;
160 delete pdf;
161 delete log_energies;
162 delete log_data;
163}

Member Function Documentation

◆ AddComponent()

virtual void G4EMDataSet::AddComponent ( G4VEMDataSet * )
inlinevirtual

Implements G4VEMDataSet.

Definition at line 88 of file G4EMDataSet.hh.

88{}

◆ FindValue()

G4double G4EMDataSet::FindValue ( G4double x,
G4int componentId = 0 ) const
virtual

Implements G4VEMDataSet.

Definition at line 167 of file G4EMDataSet.cc.

168{
169 if (energy <= (*energies)[0]) {
170 return (*data)[0];
171 }
172 std::size_t i = energies->size()-1;
173 if (energy >= (*energies)[i]) { return (*data)[i]; }
174
175 //Nicolas A. Karakatsanis: Check if the logarithmic data have been loaded to decide
176 // which Interpolation-Calculation method will be applied
177 if (log_energies != nullptr)
178 {
179 return algorithm->Calculate(energy, (G4int)FindLowerBound(energy), *energies, *data, *log_energies, *log_data);
180 }
181
182 return algorithm->Calculate(energy, (G4int)FindLowerBound(energy), *energies, *data);
183}
int G4int
Definition G4Types.hh:85
virtual G4double Calculate(G4double point, G4int bin, const G4DataVector &energies, const G4DataVector &data) const =0

◆ GetComponent()

virtual const G4VEMDataSet * G4EMDataSet::GetComponent ( G4int ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 86 of file G4EMDataSet.hh.

86{ return 0; }

◆ GetData()

virtual const G4DataVector & G4EMDataSet::GetData ( G4int ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 93 of file G4EMDataSet.hh.

93{ return *data; }

◆ GetEnergies()

virtual const G4DataVector & G4EMDataSet::GetEnergies ( G4int ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 92 of file G4EMDataSet.hh.

92{ return *energies; }

◆ GetLogData()

virtual const G4DataVector & G4EMDataSet::GetLogData ( G4int ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 95 of file G4EMDataSet.hh.

95{ return *log_data; }

◆ GetLogEnergies()

virtual const G4DataVector & G4EMDataSet::GetLogEnergies ( G4int ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 94 of file G4EMDataSet.hh.

94{ return *log_energies; }

◆ LoadData()

G4bool G4EMDataSet::LoadData ( const G4String & fileName)
virtual

Implements G4VEMDataSet.

Definition at line 263 of file G4EMDataSet.cc.

264{
265 // The file is organized into four columns:
266 // 1st column contains the values of energy
267 // 2nd column contains the corresponding data value
268 // The file terminates with the pattern: -1 -1
269 // -2 -2
270
271 G4String fullFileName(FullFileName(fileName));
272 std::ifstream in(fullFileName);
273
274 if (!in.is_open())
275 {
276 G4String message("data file \"");
277 message += fullFileName;
278 message += "\" not found";
279 G4Exception("G4EMDataSet::LoadData",
280 "em1012",FatalException,message);
281 return false;
282 }
283
284 delete energies;
285 delete data;
286 delete log_energies;
287 delete log_data;
288 energies = new G4DataVector;
289 data = new G4DataVector;
290 log_energies = new G4DataVector;
291 log_data = new G4DataVector;
292
293 G4double a, b;
294 do
295 {
296 in >> a >> b;
297
298 if (a != -1 && a != -2)
299 {
300 if (a==0.) { a=1e-300; }
301 if (b==0.) { b=1e-300; }
302 a *= unitEnergies;
303 b *= unitData;
304 energies->push_back(a);
305 log_energies->push_back(std::log10(a));
306 data->push_back(b);
307 log_data->push_back(std::log10(b));
308 }
309 }
310 while (a != -2);
311
312 if (randomSet) { BuildPdf(); }
313
314 return true;
315}
double G4double
Definition G4Types.hh:83

◆ LoadNonLogData()

G4bool G4EMDataSet::LoadNonLogData ( const G4String & fileName)
virtual

Implements G4VEMDataSet.

Definition at line 319 of file G4EMDataSet.cc.

320{
321 // The file is organized into four columns:
322 // 1st column contains the values of energy
323 // 2nd column contains the corresponding data value
324 // The file terminates with the pattern: -1 -1
325 // -2 -2
326
327 G4String fullFileName(FullFileName(fileName));
328 std::ifstream in(fullFileName);
329 if (!in.is_open())
330 {
331 G4String message("data file \"");
332 message += fullFileName;
333 message += "\" not found";
334 G4Exception("G4EMDataSet::LoadNonLogData",
335 "em1012",FatalException,message);
336 }
337
338 G4DataVector* argEnergies=new G4DataVector;
339 G4DataVector* argData=new G4DataVector;
340
341 G4double a;
342 G4int k = 0;
343 G4int nColumns = 2;
344
345 do
346 {
347 in >> a;
348
349 if (a != -1 && a != -2)
350 {
351 if (k%nColumns == 0)
352 {
353 argEnergies->push_back(a*unitEnergies);
354 }
355 else if (k%nColumns == 1)
356 {
357 argData->push_back(a*unitData);
358 }
359 k++;
360 }
361 }
362 while (a != -2);
363
364 SetEnergiesData(argEnergies, argData, 0);
365
366 if (randomSet) BuildPdf();
367
368 return true;
369}
virtual void SetEnergiesData(G4DataVector *xData, G4DataVector *data, G4int componentId)

◆ NumberOfComponents()

virtual std::size_t G4EMDataSet::NumberOfComponents ( void ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 90 of file G4EMDataSet.hh.

90{ return 0; }

◆ PrintData()

void G4EMDataSet::PrintData ( void ) const
virtual

Implements G4VEMDataSet.

Definition at line 187 of file G4EMDataSet.cc.

188{
189 std::size_t size = energies->size();
190 for (std::size_t i(0); i<size; ++i)
191 {
192 G4cout << "Point: " << ((*energies)[i]/unitEnergies)
193 << " - Data value: " << ((*data)[i]/unitData);
194 if (pdf != 0) G4cout << " - PDF : " << (*pdf)[i];
195 G4cout << G4endl;
196 }
197}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout

◆ RandomSelect()

G4double G4EMDataSet::RandomSelect ( G4int componentId = 0) const
virtual

Implements G4VEMDataSet.

Definition at line 528 of file G4EMDataSet.cc.

529{
530 G4double value = 0.;
531 // Random select a X value according to the cumulative probability distribution
532 // derived from the data
533
534 if (!pdf) {
535 G4Exception("G4EMDataSet::RandomSelect",
536 "em1012",FatalException,"PDF has not been created for this data set");
537 return value;
538 }
539
541
542 // Locate the random value in the X vector based on the PDF
543 G4int bin = (G4int)FindLowerBound(x,pdf);
544
545 // Interpolate the PDF to calculate the X value:
546 // linear interpolation in the first bin (to avoid problem with 0),
547 // interpolation with associated data set algorithm in other bins
548 G4LinInterpolation linearAlgo;
549 if (bin == 0) value = linearAlgo.Calculate(x, bin, *pdf, *energies);
550 else value = algorithm->Calculate(x, bin, *pdf, *energies);
551
552 return value;
553}
#define G4UniformRand()
Definition Randomize.hh:52
G4double Calculate(G4double point, G4int bin, const G4DataVector &energies, const G4DataVector &data) const override

◆ SaveData()

G4bool G4EMDataSet::SaveData ( const G4String & fileName) const
virtual

Implements G4VEMDataSet.

Definition at line 373 of file G4EMDataSet.cc.

374{
375 // The file is organized into two columns:
376 // 1st column is the energy
377 // 2nd column is the corresponding value
378 // The file terminates with the pattern: -1 -1
379 // -2 -2
380
381 G4String fullFileName(FullFileName(name));
382 std::ofstream out(fullFileName);
383
384 if (!out.is_open())
385 {
386 G4String message("cannot open \"");
387 message+=fullFileName;
388 message+="\"";
389 G4Exception("G4EMDataSet::SaveData",
390 "em1012",FatalException,message);
391 }
392
393 out.precision(10);
394 out.width(15);
395 out.setf(std::ofstream::left);
396
397 if (energies!=0 && data!=0)
398 {
399 G4DataVector::const_iterator i(energies->begin());
400 G4DataVector::const_iterator endI(energies->end());
401 G4DataVector::const_iterator j(data->begin());
402
403 while (i!=endI)
404 {
405 out.precision(10);
406 out.width(15);
407 out.setf(std::ofstream::left);
408 out << ((*i)/unitEnergies) << ' ';
409
410 out.precision(10);
411 out.width(15);
412 out.setf(std::ofstream::left);
413 out << ((*j)/unitData) << std::endl;
414
415 i++;
416 j++;
417 }
418 }
419
420 out.precision(10);
421 out.width(15);
422 out.setf(std::ofstream::left);
423 out << -1.f << ' ';
424
425 out.precision(10);
426 out.width(15);
427 out.setf(std::ofstream::left);
428 out << -1.f << std::endl;
429
430 out.precision(10);
431 out.width(15);
432 out.setf(std::ofstream::left);
433 out << -2.f << ' ';
434
435 out.precision(10);
436 out.width(15);
437 out.setf(std::ofstream::left);
438 out << -2.f << std::endl;
439
440 return true;
441}

◆ SetEnergiesData()

void G4EMDataSet::SetEnergiesData ( G4DataVector * xData,
G4DataVector * data,
G4int componentId )
virtual

Implements G4VEMDataSet.

Definition at line 201 of file G4EMDataSet.cc.

204{
205 if(!dataX || !dataY) {
206 G4Exception("G4EMDataSet::SetEnergiesData",
207 "em1012",FatalException,"new interpolation == 0");
208 } else {
209 if (dataX->size() != dataY->size()) {
210 G4Exception("G4EMDataSet::SetEnergiesData",
211 "em1012",FatalException,"different size for energies and data");
212 } else {
213
214 delete energies;
215 energies = dataX;
216
217 delete data;
218 data = dataY;
219 //G4cout << "Size of energies: " << energies->size() << G4endl
220 //<< "Size of data: " << data->size() << G4endl;
221 }
222 }
223}

Referenced by LoadNonLogData().

◆ SetLogEnergiesData()

void G4EMDataSet::SetLogEnergiesData ( G4DataVector * xData,
G4DataVector * data,
G4DataVector * xLogData,
G4DataVector * Logdata,
G4int componentId )
virtual

Implements G4VEMDataSet.

Definition at line 227 of file G4EMDataSet.cc.

232{
233 if(!dataX || !dataY || !data_logX || !data_logY) {
234 G4Exception("G4EMDataSet::SetEnergiesData",
235 "em1012",FatalException,"new interpolation == 0");
236 } else {
237 if (dataX->size() != dataY->size() ||
238 dataX->size() != data_logX->size() ||
239 dataX->size() != data_logY->size()) {
240 G4Exception("G4EMDataSet::SetEnergiesData",
241 "em1012",FatalException,"different size for energies and data");
242 } else {
243
244 delete energies;
245 energies = dataX;
246
247 delete data;
248 data = dataY;
249
250 delete log_energies;
251 log_energies = data_logX;
252
253 delete log_data;
254 log_data = data_logY;
255 //G4cout << "Size of energies: " << energies->size() << G4endl
256 //<< "Size of data: " << data->size() << G4endl;
257 }
258 }
259}

The documentation for this class was generated from the following files: