Import Geant4 9.3.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 16:15:05 +02:00
parent b79225fb37
commit 74cad5e589
3877 changed files with 234205 additions and 167127 deletions
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4EMDataSet.cc,v 1.18 2008/03/17 13:40:53 pia Exp $
// GEANT4 tag $Name: geant4-09-02 $
// $Id: G4EMDataSet.cc,v 1.20 2009/09/25 07:41:34 sincerti Exp $
// GEANT4 tag $Name: geant4-09-03 $
//
// Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
//
@@ -33,6 +33,26 @@
// -----------
// 31 Jul 2001 MGP Created
//
// 15 Jul 2009 Nicolas A. Karakatsanis
//
// - New Constructor was added when logarithmic data are loaded as well
// to enhance CPU performance
//
// - Destructor was modified accordingly
//
// - LoadNonLogData method was created to load only the non-logarithmic data from G4EMLOW
// dataset. It is essentially performing the data loading operations as in the past.
//
// - LoadData method was revised in order to calculate the logarithmic values of the data
// It retrieves the data values from the G4EMLOW data files but, then, calculates the
// respective log values and loads them to seperate data structures.
//
// - SetLogEnergiesData method was cretaed to set logarithmic values to G4 data vectors.
// The EM data sets, initialized this way, contain both non-log and log values.
// These initialized data sets can enhance the computing performance of data interpolation
// operations
//
//
// -------------------------------------------------------------------
#include "G4EMDataSet.hh"
@@ -52,6 +72,8 @@ G4EMDataSet::G4EMDataSet(G4int Z,
z(Z),
energies(0),
data(0),
log_energies(0),
log_data(0),
algorithm(algo),
unitEnergies(xUnit),
unitData(yUnit),
@@ -72,6 +94,8 @@ G4EMDataSet::G4EMDataSet(G4int argZ,
z(argZ),
energies(dataX),
data(dataY),
log_energies(0),
log_data(0),
algorithm(algo),
unitEnergies(xUnit),
unitData(yUnit),
@@ -91,14 +115,59 @@ G4EMDataSet::G4EMDataSet(G4int argZ,
if (randomSet) BuildPdf();
}
G4EMDataSet::G4EMDataSet(G4int argZ,
G4DataVector* dataX,
G4DataVector* dataY,
G4DataVector* dataLogX,
G4DataVector* dataLogY,
G4VDataSetAlgorithm* algo,
G4double xUnit,
G4double yUnit,
G4bool random):
z(argZ),
energies(dataX),
data(dataY),
log_energies(dataLogX),
log_data(dataLogY),
algorithm(algo),
unitEnergies(xUnit),
unitData(yUnit),
pdf(0),
randomSet(random)
{
if (algorithm == 0) G4Exception("G4EMDataSet::G4EMDataSet - interpolation == 0");
if ((energies == 0) ^ (data == 0))
G4Exception("G4EMDataSet::G4EMDataSet - different size for energies and data (zero case)");
if (energies == 0) return;
if (energies->size() != data->size())
G4Exception("G4EMDataSet::G4EMDataSet - different size for energies and data");
if ((log_energies == 0) ^ (log_data == 0))
G4Exception("G4EMDataSet::G4EMDataSet - different size for log energies and log data (zero case)");
if (log_energies == 0) return;
if (log_energies->size() != log_data->size())
G4Exception("G4EMDataSet::G4EMDataSet - different size for log energies and log data");
if (randomSet) BuildPdf();
}
G4EMDataSet::~G4EMDataSet()
{
delete algorithm;
if (energies) delete energies;
if (data) delete data;
if (pdf) delete pdf;
if (log_energies) delete log_energies;
if (log_data) delete log_data;
}
G4double G4EMDataSet::FindValue(G4double energy, G4int /* componentId */) const
{
if (!energies) G4Exception("G4EMDataSet::FindValue - energies == 0");
@@ -108,6 +177,13 @@ G4double G4EMDataSet::FindValue(G4double energy, G4int /* componentId */) const
size_t i = energies->size()-1;
if (energy >= (*energies)[i]) return (*data)[i];
//Nicolas A. Karakatsanis: Check if the logarithmic data have been loaded to decide
// which Interpolation-Calculation method will be applied
if (log_energies != 0)
{
return algorithm->Calculate(energy, FindLowerBound(energy), *energies, *data, *log_energies, *log_data);
}
return algorithm->Calculate(energy, FindLowerBound(energy), *energies, *data);
}
@@ -146,19 +222,62 @@ void G4EMDataSet::SetEnergiesData(G4DataVector* dataX,
G4Exception("G4EMDataSet::SetEnergiesData - different size for energies and data (zero case)");
if (energies == 0) return;
//G4cout << "Size of energies: " << energies->size() << G4endl << "Size of data: " << data->size() << G4endl;
if (energies->size() != data->size())
G4Exception("G4EMDataSet::SetEnergiesData - different size for energies and data");
}
void G4EMDataSet::SetLogEnergiesData(G4DataVector* dataX,
G4DataVector* dataY,
G4DataVector* data_logX,
G4DataVector* data_logY,
G4int /* componentId */)
{
//Load of the actual energy and data values
if (energies) delete energies;
energies = dataX;
if (data) delete data;
data = dataY;
//Check if data loaded properly from data files
if ((energies == 0) ^ (data==0))
G4Exception("G4EMDataSet::SetLogEnergiesData - different size for energies and data (zero case)");
if (energies == 0) return;
//G4cout << "Size of energies: " << energies->size() << G4endl << "Size of data: " << data->size() << G4endl << G4endl;
if (energies->size() != data->size())
G4Exception("G4EMDataSet::SetLogEnergiesData - different size for energies and data");
//Load of the logarithmic energy and data values
if (log_energies) delete log_energies;
log_energies = data_logX;
if (log_data) delete log_data;
log_data = data_logY;
//Check if logarithmic data loaded properly from data files
if ((log_energies == 0) ^ (log_data==0))
G4Exception("G4EMDataSet::SetLogEnergiesData - different size for log energies and log data (zero case)");
if (log_energies == 0) G4cout << "G4EMDataSet::SetLogEnergiesData - log_energies == 0" << G4endl;
if (log_energies == 0) return;
//G4cout << "Size of log energies: " << log_energies->size() << G4endl << "Size of log data: " << log_data->size() << G4endl << G4endl;
if (log_energies->size() != log_data->size())
G4Exception("G4EMDataSet::SetLogEnergiesData - different size for log energies and log data");
}
G4bool G4EMDataSet::LoadData(const G4String& fileName)
{
// The file is organized into two columns:
// 1st column is the energy
// 2nd column is the corresponding value
// The file terminates with the pattern: -1 -1
// -2 -2
// The file is organized into four columns:
// 1st column contains the values of energy
// 2nd column contains the corresponding data value
// The file terminates with the pattern: -1 -1
// -2 -2
G4String fullFileName(FullFileName(fileName));
std::ifstream in(fullFileName);
@@ -172,31 +291,98 @@ G4bool G4EMDataSet::LoadData(const G4String& fileName)
G4DataVector* argEnergies=new G4DataVector;
G4DataVector* argData=new G4DataVector;
G4DataVector* argLogEnergies=new G4DataVector;
G4DataVector* argLogData=new G4DataVector;
G4double a;
bool energyColumn(true);
G4int k = 0;
G4int nColumns = 2;
do
{
in >> a;
if (a==0.) a=1e-300;
if (a != -1 && a != -2)
{
if (k%nColumns == 0)
{
argEnergies->push_back(a*unitEnergies);
argLogEnergies->push_back(std::log10(a)+std::log10(unitEnergies));
}
else if (k%nColumns == 1)
{
argData->push_back(a*unitData);
argLogData->push_back(std::log10(a)+std::log10(unitData));
}
k++;
}
}
while (a != -2);
SetLogEnergiesData(argEnergies, argData, argLogEnergies, argLogData, 0);
if (randomSet) BuildPdf();
return true;
}
G4bool G4EMDataSet::LoadNonLogData(const G4String& fileName)
{
// The file is organized into four columns:
// 1st column contains the values of energy
// 2nd column contains the corresponding data value
// The file terminates with the pattern: -1 -1
// -2 -2
G4String fullFileName(FullFileName(fileName));
std::ifstream in(fullFileName);
if (!in.is_open())
{
G4String message("G4EMDataSet::LoadData - data file \"");
message += fullFileName;
message += "\" not found";
G4Exception(message);
}
G4DataVector* argEnergies=new G4DataVector;
G4DataVector* argData=new G4DataVector;
G4double a;
G4int k = 0;
G4int nColumns = 2;
do
{
in >> a;
if (a!=-1 && a!=-2)
if (a != -1 && a != -2)
{
if (energyColumn)
argEnergies->push_back(a*unitEnergies);
else
argData->push_back(a*unitData);
energyColumn=(!energyColumn);
if (k%nColumns == 0)
{
argEnergies->push_back(a*unitEnergies);
}
else if (k%nColumns == 1)
{
argData->push_back(a*unitData);
}
k++;
}
}
while (a != -2);
SetEnergiesData(argEnergies, argData, 0);
if (randomSet) BuildPdf();
return true;
}
G4bool G4EMDataSet::SaveData(const G4String& name) const
{
// The file is organized into two columns:
@@ -266,6 +452,8 @@ G4bool G4EMDataSet::SaveData(const G4String& name) const
return true;
}
size_t G4EMDataSet::FindLowerBound(G4double x) const
{
size_t lowerBound = 0;
@@ -313,6 +501,7 @@ G4String G4EMDataSet::FullFileName(const G4String& name) const
}
void G4EMDataSet::BuildPdf()
{
pdf = new G4DataVector;