Geant4-11
Public Member Functions | Private Member Functions | Private Attributes
G4DNACrossSectionDataSet Class Reference

#include <G4DNACrossSectionDataSet.hh>

Inheritance diagram for G4DNACrossSectionDataSet:
G4VEMDataSet

Public Member Functions

virtual void AddComponent (G4VEMDataSet *dataSet)
 
virtual G4double FindValue (G4double e, G4int componentId=0) const
 
 G4DNACrossSectionDataSet (G4VDataSetAlgorithm *algo, G4double xUnit=CLHEP::MeV, G4double dataUnit=CLHEP::barn)
 
virtual const G4VEMDataSetGetComponent (G4int componentId) const
 
virtual const G4DataVectorGetData (G4int componentId) const
 
virtual const G4DataVectorGetEnergies (G4int componentId) const
 
virtual const G4DataVectorGetLogData (G4int componentId) const
 
virtual const G4DataVectorGetLogEnergies (G4int componentId) const
 
virtual G4bool LoadData (const G4String &argFileName)
 
virtual G4bool LoadNonLogData (const G4String &argFileName)
 
virtual size_t NumberOfComponents (void) const
 
virtual void PrintData (void) const
 
virtual G4double RandomSelect (G4int) const
 
virtual G4bool SaveData (const G4String &argFileName) const
 
virtual void SetEnergiesData (G4DataVector *x, G4DataVector *values, G4int componentId)
 
virtual void SetLogEnergiesData (G4DataVector *x, G4DataVector *values, G4DataVector *log_x, G4DataVector *log_values, G4int componentId)
 
virtual ~G4DNACrossSectionDataSet ()
 

Private Member Functions

void CleanUpComponents (void)
 
G4String FullFileName (const G4String &argFileName) const
 
 G4DNACrossSectionDataSet ()
 
 G4DNACrossSectionDataSet (const G4DNACrossSectionDataSet &copy)
 
const G4VDataSetAlgorithmGetAlgorithm () const
 
G4double GetUnitData () const
 
G4double GetUnitEnergies () const
 
G4DNACrossSectionDataSetoperator= (const G4DNACrossSectionDataSet &right)
 

Private Attributes

G4VDataSetAlgorithmalgorithm
 
std::vector< G4VEMDataSet * > components
 
G4double unitData
 
G4double unitEnergies
 
G4int z
 

Detailed Description

Definition at line 54 of file G4DNACrossSectionDataSet.hh.

Constructor & Destructor Documentation

◆ G4DNACrossSectionDataSet() [1/3]

G4DNACrossSectionDataSet::G4DNACrossSectionDataSet ( G4VDataSetAlgorithm algo,
G4double  xUnit = CLHEP::MeV,
G4double  dataUnit = CLHEP::barn 
)

Definition at line 64 of file G4DNACrossSectionDataSet.cc.

67 :
68 algorithm(argAlgorithm), unitEnergies(argUnitEnergies), unitData(argUnitData)
69{
70 z = 0;
71
72}

References z.

◆ ~G4DNACrossSectionDataSet()

G4DNACrossSectionDataSet::~G4DNACrossSectionDataSet ( )
virtual

Definition at line 75 of file G4DNACrossSectionDataSet.cc.

76{
78
79 if (algorithm)
80 delete algorithm;
81}

References algorithm, and CleanUpComponents().

◆ G4DNACrossSectionDataSet() [2/3]

G4DNACrossSectionDataSet::G4DNACrossSectionDataSet ( )
private

◆ G4DNACrossSectionDataSet() [3/3]

G4DNACrossSectionDataSet::G4DNACrossSectionDataSet ( const G4DNACrossSectionDataSet copy)
private

Member Function Documentation

◆ AddComponent()

virtual void G4DNACrossSectionDataSet::AddComponent ( G4VEMDataSet dataSet)
inlinevirtual

Implements G4VEMDataSet.

Definition at line 71 of file G4DNACrossSectionDataSet.hh.

72 { components.push_back(dataSet); }
std::vector< G4VEMDataSet * > components

References components.

Referenced by LoadData(), and LoadNonLogData().

◆ CleanUpComponents()

void G4DNACrossSectionDataSet::CleanUpComponents ( void  )
private

Definition at line 563 of file G4DNACrossSectionDataSet.cc.

564{
565 while (!components.empty())
566 {
567 if (components.back()) delete components.back();
568 components.pop_back();
569 }
570}

References components.

Referenced by LoadData(), LoadNonLogData(), and ~G4DNACrossSectionDataSet().

◆ FindValue()

G4double G4DNACrossSectionDataSet::FindValue ( G4double  e,
G4int  componentId = 0 
) const
virtual

◆ FullFileName()

G4String G4DNACrossSectionDataSet::FullFileName ( const G4String argFileName) const
private

Definition at line 464 of file G4DNACrossSectionDataSet.cc.

465{
466 char* path = std::getenv("G4LEDATA");
467 if (!path)
468 {
469 G4Exception("G4DNACrossSectionDataSet::FullFileName","em0006",
470 FatalException,"G4LEDATA environment variable not set.");
471
472 return "";
473 }
474
475 std::ostringstream fullFileName;
476
477 fullFileName << path << "/" << argFileName << ".dat";
478
479 return G4String(fullFileName.str().c_str());
480}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35

References FatalException, and G4Exception().

Referenced by LoadData(), LoadNonLogData(), and SaveData().

◆ GetAlgorithm()

const G4VDataSetAlgorithm * G4DNACrossSectionDataSet::GetAlgorithm ( ) const
inlineprivate

Definition at line 127 of file G4DNACrossSectionDataSet.hh.

127{ return algorithm; }

References algorithm.

Referenced by LoadData(), and LoadNonLogData().

◆ GetComponent()

virtual const G4VEMDataSet * G4DNACrossSectionDataSet::GetComponent ( G4int  componentId) const
inlinevirtual

◆ GetData()

virtual const G4DataVector & G4DNACrossSectionDataSet::GetData ( G4int  componentId) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 80 of file G4DNACrossSectionDataSet.hh.

81 { return GetComponent(componentId)->GetData(0); }
virtual const G4VEMDataSet * GetComponent(G4int componentId) const
virtual const G4DataVector & GetData(G4int componentId) const =0

References GetComponent(), and G4VEMDataSet::GetData().

◆ GetEnergies()

virtual const G4DataVector & G4DNACrossSectionDataSet::GetEnergies ( G4int  componentId) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 77 of file G4DNACrossSectionDataSet.hh.

78 { return GetComponent(componentId)->GetEnergies(0); }
virtual const G4DataVector & GetEnergies(G4int componentId) const =0

References GetComponent(), and G4VEMDataSet::GetEnergies().

Referenced by SaveData().

◆ GetLogData()

virtual const G4DataVector & G4DNACrossSectionDataSet::GetLogData ( G4int  componentId) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 86 of file G4DNACrossSectionDataSet.hh.

87 { return GetComponent(componentId)->GetLogData(0); }
virtual const G4DataVector & GetLogData(G4int componentId) const =0

References GetComponent(), and G4VEMDataSet::GetLogData().

◆ GetLogEnergies()

virtual const G4DataVector & G4DNACrossSectionDataSet::GetLogEnergies ( G4int  componentId) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 83 of file G4DNACrossSectionDataSet.hh.

84 { return GetComponent(componentId)->GetLogEnergies(0); }
virtual const G4DataVector & GetLogEnergies(G4int componentId) const =0

References GetComponent(), and G4VEMDataSet::GetLogEnergies().

◆ GetUnitData()

G4double G4DNACrossSectionDataSet::GetUnitData ( ) const
inlineprivate

Definition at line 126 of file G4DNACrossSectionDataSet.hh.

126{ return unitData; }

References unitData.

Referenced by LoadData(), LoadNonLogData(), and SaveData().

◆ GetUnitEnergies()

G4double G4DNACrossSectionDataSet::GetUnitEnergies ( ) const
inlineprivate

Definition at line 125 of file G4DNACrossSectionDataSet.hh.

125{ return unitEnergies; }

References unitEnergies.

Referenced by LoadData(), LoadNonLogData(), and SaveData().

◆ LoadData()

G4bool G4DNACrossSectionDataSet::LoadData ( const G4String argFileName)
virtual

Implements G4VEMDataSet.

Definition at line 83 of file G4DNACrossSectionDataSet.cc.

84{
86
87 G4String fullFileName(FullFileName(argFileName));
88 std::ifstream in(fullFileName, std::ifstream::binary|std::ifstream::in);
89
90 if (!in.is_open())
91 {
92 G4String message("Data file \"");
93 message+=fullFileName;
94 message+="\" not found";
95 G4Exception("G4DNACrossSectionDataSet::LoadData","em0003",
96 FatalException,message);
97 return false;
98 }
99
100 std::vector<G4DataVector *> columns;
101 std::vector<G4DataVector *> log_columns;
102
103 std::stringstream *stream(new std::stringstream);
104 char c;
105 G4bool comment(false);
106 G4bool space(true);
107 G4bool first(true);
108
109 try
110 {
111 while (!in.eof())
112 {
113 in.get(c);
114
115 switch (c)
116 {
117 case '\r':
118 case '\n':
119 if (!first)
120 {
121 unsigned long i(0);
122 G4double value;
123
124 while (!stream->eof())
125 {
126 (*stream) >> value;
127
128 while (i>=columns.size())
129 {
130 columns.push_back(new G4DataVector);
131 log_columns.push_back(new G4DataVector);
132 }
133
134 columns[i]->push_back(value);
135
136// N. A. Karakatsanis
137// A condition is applied to check if negative or zero values are present in the dataset.
138// If yes, then a near-zero value is applied to allow the computation of the logarithmic value
139// If a value is zero, this simplification is acceptable
140// If a value is negative, then it is not acceptable and the data of the particular column of
141// logarithmic values should not be used by interpolation methods.
142//
143// Therefore, G4LogLogInterpolation and G4LinLogLogInterpolation should not be used if negative values are present.
144// Instead, G4LinInterpolation is safe in every case
145// SemiLogInterpolation is safe only if the energy columns are non-negative
146// G4LinLogInterpolation is safe only if the cross section data columns are non-negative
147
148 if (value <=0.) value = 1e-300;
149 log_columns[i]->push_back(std::log10(value));
150
151 i++;
152 }
153
154 delete stream;
155 stream=new std::stringstream;
156 }
157
158 first=true;
159 comment=false;
160 space=true;
161 break;
162
163 case '#':
164 comment=true;
165 break;
166
167 case '\t':
168 case ' ':
169 space = true;
170 break;
171
172 default:
173 if (comment) { break; }
174 if (space && (!first)) { (*stream) << ' '; }
175
176 first=false;
177 (*stream) << c;
178 space=false;
179 }
180 }
181 }
182 catch(const std::ios::failure &e)
183 {
184 // some implementations of STL could throw a "failture" exception
185 // when read wants read characters after end of file
186 }
187
188 delete stream;
189
190 std::vector<G4DataVector *>::size_type maxI(columns.size());
191
192 if (maxI<2)
193 {
194 G4String message("Data file \"");
195 message+=fullFileName;
196 message+="\" should have at least two columns";
197 G4Exception("G4DNACrossSectionDataSet::LoadData","em0005",
198 FatalException,message);
199 return false;
200 }
201
202 std::vector<G4DataVector*>::size_type i(1);
203 while (i<maxI)
204 {
205 G4DataVector::size_type maxJ(columns[i]->size());
206
207 if (maxJ!=columns[0]->size())
208 {
209 G4String message("Data file \"");
210 message+=fullFileName;
211 message+="\" has lines with a different number of columns";
212 G4Exception("G4DNACrossSectionDataSet::LoadData","em0005",
213 FatalException,message);
214 return false;
215 }
216
217 G4DataVector::size_type j(0);
218
219 G4DataVector *argEnergies=new G4DataVector;
220 G4DataVector *argData=new G4DataVector;
221 G4DataVector *argLogEnergies=new G4DataVector;
222 G4DataVector *argLogData=new G4DataVector;
223
224 while(j<maxJ)
225 {
226 argEnergies->push_back(columns[0]->operator[] (j)*GetUnitEnergies());
227 argData->push_back(columns[i]->operator[] (j)*GetUnitData());
228 argLogEnergies->push_back(log_columns[0]->operator[] (j) + std::log10(GetUnitEnergies()));
229 argLogData->push_back(log_columns[i]->operator[] (j) + std::log10(GetUnitData()));
230 j++;
231 }
232
233 AddComponent(new G4EMDataSet(i-1, argEnergies, argData, argLogEnergies, argLogData, GetAlgorithm()->Clone(), GetUnitEnergies(), GetUnitData()));
234
235 i++;
236 }
237
238 i=maxI;
239 while (i>0)
240 {
241 i--;
242 delete columns[i];
243 delete log_columns[i];
244 }
245
246 return true;
247}
bool G4bool
Definition: G4Types.hh:86
const G4VDataSetAlgorithm * GetAlgorithm() const
G4String FullFileName(const G4String &argFileName) const
virtual void AddComponent(G4VEMDataSet *dataSet)

References AddComponent(), CleanUpComponents(), FatalException, FullFileName(), G4Exception(), GetAlgorithm(), GetUnitData(), and GetUnitEnergies().

Referenced by G4DNAChampionElasticModel::Initialise(), G4DNACPA100ElasticModel::Initialise(), G4DNAMeltonAttachmentModel::Initialise(), G4DNARuddIonisationExtendedModel::Initialise(), G4DNARuddIonisationModel::Initialise(), G4DNABornExcitationModel1::Initialise(), G4DNABornIonisationModel1::Initialise(), G4DNABornIonisationModel2::Initialise(), G4DNACPA100ExcitationModel::Initialise(), G4DNACPA100IonisationModel::Initialise(), G4DNADiracRMatrixExcitationModel::Initialise(), G4DNAEmfietzoglouExcitationModel::Initialise(), G4DNAEmfietzoglouIonisationModel::Initialise(), G4DNAELSEPAElasticModel::Initialise(), and G4DNAIonElasticModel::Initialise().

◆ LoadNonLogData()

G4bool G4DNACrossSectionDataSet::LoadNonLogData ( const G4String argFileName)
virtual

Implements G4VEMDataSet.

Definition at line 250 of file G4DNACrossSectionDataSet.cc.

251{
253
254 G4String fullFileName(FullFileName(argFileName));
255 std::ifstream in(fullFileName, std::ifstream::binary|std::ifstream::in);
256
257 if (!in.is_open())
258 {
259 G4String message("Data file \"");
260 message+=fullFileName;
261 message+="\" not found";
262 G4Exception("G4DNACrossSectionDataSet::LoadData","em0003",
263 FatalException,message);
264 return false;
265 }
266
267 std::vector<G4DataVector *> columns;
268
269 std::stringstream *stream(new std::stringstream);
270 char c;
271 G4bool comment(false);
272 G4bool space(true);
273 G4bool first(true);
274
275 try
276 {
277 while (!in.eof())
278 {
279 in.get(c);
280
281 switch (c)
282 {
283 case '\r':
284 case '\n':
285 if (!first)
286 {
287 unsigned long i(0);
288 G4double value;
289
290 while (!stream->eof())
291 {
292 (*stream) >> value;
293
294 while (i>=columns.size())
295 {
296 columns.push_back(new G4DataVector);
297 }
298
299 columns[i]->push_back(value);
300
301 i++;
302 }
303
304 delete stream;
305 stream=new std::stringstream;
306 }
307
308 first=true;
309 comment=false;
310 space=true;
311 break;
312
313 case '#':
314 comment=true;
315 break;
316
317 case '\t':
318 case ' ':
319 space = true;
320 break;
321
322 default:
323 if (comment) { break; }
324 if (space && (!first)) { (*stream) << ' '; }
325
326 first=false;
327 (*stream) << c;
328 space=false;
329 }
330 }
331 }
332 catch(const std::ios::failure &e)
333 {
334 // some implementations of STL could throw a "failture" exception
335 // when read wants read characters after end of file
336 }
337
338 delete stream;
339
340 std::vector<G4DataVector *>::size_type maxI(columns.size());
341
342 if (maxI<2)
343 {
344 G4String message("Data file \"");
345 message+=fullFileName;
346 message+="\" should have at least two columns";
347 G4Exception("G4DNACrossSectionDataSet::LoadData","em0005",
348 FatalException,message);
349 return false;
350 }
351
352 std::vector<G4DataVector*>::size_type i(1);
353 while (i<maxI)
354 {
355 G4DataVector::size_type maxJ(columns[i]->size());
356
357 if (maxJ!=columns[0]->size())
358 {
359 G4String message("Data file \"");
360 message+=fullFileName;
361 message+="\" has lines with a different number of columns.";
362 G4Exception("G4DNACrossSectionDataSet::LoadData","em0005",
363 FatalException,message);
364 return false;
365 }
366
367 G4DataVector::size_type j(0);
368
369 G4DataVector *argEnergies=new G4DataVector;
370 G4DataVector *argData=new G4DataVector;
371
372 while(j<maxJ)
373 {
374 argEnergies->push_back(columns[0]->operator[] (j)*GetUnitEnergies());
375 argData->push_back(columns[i]->operator[] (j)*GetUnitData());
376 j++;
377 }
378
379 AddComponent(new G4EMDataSet(i-1, argEnergies, argData, GetAlgorithm()->Clone(), GetUnitEnergies(), GetUnitData()));
380
381 i++;
382 }
383
384 i=maxI;
385 while (i>0)
386 {
387 i--;
388 delete columns[i];
389 }
390
391 return true;
392}

References AddComponent(), CleanUpComponents(), FatalException, FullFileName(), G4Exception(), GetAlgorithm(), GetUnitData(), and GetUnitEnergies().

◆ NumberOfComponents()

virtual size_t G4DNACrossSectionDataSet::NumberOfComponents ( void  ) const
inlinevirtual

◆ operator=()

G4DNACrossSectionDataSet & G4DNACrossSectionDataSet::operator= ( const G4DNACrossSectionDataSet right)
private

◆ PrintData()

void G4DNACrossSectionDataSet::PrintData ( void  ) const
virtual

Implements G4VEMDataSet.

Definition at line 501 of file G4DNACrossSectionDataSet.cc.

502{
503 const size_t n(NumberOfComponents());
504
505 G4cout << "The data set has " << n << " components" << G4endl;
506 G4cout << G4endl;
507
508 size_t i(0);
509
510 while (i<n)
511 {
512 G4cout << "--- Component " << i << " ---" << G4endl;
514 i++;
515 }
516}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual size_t NumberOfComponents(void) const
virtual void PrintData(void) const =0

References G4cout, G4endl, GetComponent(), CLHEP::detail::n, NumberOfComponents(), and G4VEMDataSet::PrintData().

◆ RandomSelect()

virtual G4double G4DNACrossSectionDataSet::RandomSelect ( G4int  ) const
inlinevirtual

Implements G4VEMDataSet.

Definition at line 102 of file G4DNACrossSectionDataSet.hh.

102{ return -1.; };

◆ SaveData()

G4bool G4DNACrossSectionDataSet::SaveData ( const G4String argFileName) const
virtual

Implements G4VEMDataSet.

Definition at line 395 of file G4DNACrossSectionDataSet.cc.

396{
397 const size_t n(NumberOfComponents());
398
399 if (n==0)
400 {
401 G4Exception("G4DNACrossSectionDataSet::SaveData","em0005",
402 FatalException,"Expected at least one component");
403
404 return false;
405 }
406
407 G4String fullFileName(FullFileName(argFileName));
408 std::ofstream out(fullFileName);
409
410 if (!out.is_open())
411 {
412 G4String message("Cannot open \"");
413 message+=fullFileName;
414 message+="\"";
415 G4Exception("G4DNACrossSectionDataSet::SaveData","em0005",
416 FatalException,message);
417 return false;
418 }
419
420 G4DataVector::const_iterator iEnergies(GetComponent(0)->GetEnergies(0).begin());
421 G4DataVector::const_iterator iEnergiesEnd(GetComponent(0)->GetEnergies(0).end());
422 G4DataVector::const_iterator * iData(new G4DataVector::const_iterator[n]);
423
424 size_t k(n);
425
426 while (k>0)
427 {
428 k--;
429 iData[k]=GetComponent(k)->GetData(0).begin();
430 }
431
432 while (iEnergies!=iEnergiesEnd)
433 {
434 out.precision(10);
435 out.width(15);
436 out.setf(std::ofstream::left);
437 out << ((*iEnergies)/GetUnitEnergies());
438
439 k=0;
440
441 while (k<n)
442 {
443 out << ' ';
444 out.precision(10);
445 out.width(15);
446 out.setf(std::ofstream::left);
447 out << ((*(iData[k]))/GetUnitData());
448
449 iData[k]++;
450 k++;
451 }
452
453 out << std::endl;
454
455 iEnergies++;
456 }
457
458 delete[] iData;
459
460 return true;
461}
virtual const G4DataVector & GetEnergies(G4int componentId) const

References FatalException, FullFileName(), G4Exception(), GetComponent(), G4VEMDataSet::GetData(), GetEnergies(), GetUnitData(), GetUnitEnergies(), CLHEP::detail::n, and NumberOfComponents().

◆ SetEnergiesData()

void G4DNACrossSectionDataSet::SetEnergiesData ( G4DataVector x,
G4DataVector values,
G4int  componentId 
)
virtual

Implements G4VEMDataSet.

Definition at line 519 of file G4DNACrossSectionDataSet.cc.

522{
523 G4VEMDataSet * component(components[argComponentId]);
524
525 if (component)
526 {
527 component->SetEnergiesData(argEnergies, argData, 0);
528 return;
529 }
530
531 std::ostringstream message;
532 message << "Component " << argComponentId << " not found";
533
534 G4Exception("G4DNACrossSectionDataSet::SetEnergiesData","em0005",
535 FatalException,message.str().c_str());
536
537}

References components, FatalException, G4Exception(), and G4VEMDataSet::SetEnergiesData().

◆ SetLogEnergiesData()

void G4DNACrossSectionDataSet::SetLogEnergiesData ( G4DataVector x,
G4DataVector values,
G4DataVector log_x,
G4DataVector log_values,
G4int  componentId 
)
virtual

Implements G4VEMDataSet.

Definition at line 540 of file G4DNACrossSectionDataSet.cc.

545{
546 G4VEMDataSet * component(components[argComponentId]);
547
548 if (component)
549 {
550 component->SetLogEnergiesData(argEnergies, argData, argLogEnergies, argLogData, 0);
551 return;
552 }
553
554 std::ostringstream message;
555 message << "Component " << argComponentId << " not found";
556
557 G4Exception("G4DNACrossSectionDataSet::SetLogEnergiesData","em0005",
558 FatalException,message.str().c_str());
559
560}

References components, FatalException, G4Exception(), and G4VEMDataSet::SetLogEnergiesData().

Field Documentation

◆ algorithm

G4VDataSetAlgorithm* G4DNACrossSectionDataSet::algorithm
private

Definition at line 120 of file G4DNACrossSectionDataSet.hh.

Referenced by GetAlgorithm(), and ~G4DNACrossSectionDataSet().

◆ components

std::vector<G4VEMDataSet*> G4DNACrossSectionDataSet::components
private

◆ unitData

G4double G4DNACrossSectionDataSet::unitData
private

Definition at line 123 of file G4DNACrossSectionDataSet.hh.

Referenced by GetUnitData().

◆ unitEnergies

G4double G4DNACrossSectionDataSet::unitEnergies
private

Definition at line 122 of file G4DNACrossSectionDataSet.hh.

Referenced by GetUnitEnergies().

◆ z

G4int G4DNACrossSectionDataSet::z
private

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