Files
geant4/source/processes/electromagnetic/pii/src/G4PixeShellDataSet.cc
T
2019-12-06 15:12:28 +01:00

251 lines
6.9 KiB
C++

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
//
// Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
//
// History:
// -----------
// 1 Aug 2001 MGP Created
// 09.10.01 V.Ivanchenko Add case z=0
// 9 Mar 2008 MGP Cleaned up unreadable code modified by former developer
// (Further clean-up needed)
// 31 Jul 2008 MGP Revised
//
// -------------------------------------------------------------------
#include "G4PixeShellDataSet.hh"
#include "G4DataSet.hh"
#include "G4IInterpolator.hh"
#include <fstream>
#include <sstream>
G4PixeShellDataSet::G4PixeShellDataSet(G4int zeta,
G4IInterpolator* algo,
const G4String& modelK,
const G4String& modelL,
const G4String& modelM,
G4double eUnit,
G4double dataUnit):
z(zeta),
algorithm(algo),
unitEnergies(eUnit),
unitData(dataUnit)
{
if (algorithm == 0) G4Exception("G4PixeShellDataSet::G4PixeShellDataSet",
"pii00000301",
FatalException,
"interpolation == 0");
crossModel.push_back(modelK);
crossModel.push_back(modelL);
crossModel.push_back(modelM);
shellName.push_back("k");
shellName.push_back("l");
shellName.push_back("m");
size_t sizeK = modelK.size();
size_t sizeL = modelL.size();
size_t sizeM = modelM.size();
if (sizeK > 0) subShellName.push_back("k");
if (sizeK > 0 && sizeL > 0)
{
subShellName.push_back("l1");
subShellName.push_back("l2");
subShellName.push_back("l3");
}
if (sizeK > 0 && sizeL > 0 && sizeM >0)
{
subShellName.push_back("m1");
subShellName.push_back("m2");
subShellName.push_back("m3");
subShellName.push_back("m4");
subShellName.push_back("m5");
}
}
G4PixeShellDataSet::~G4PixeShellDataSet()
{
CleanUpComponents();
if (algorithm) delete algorithm;
}
G4double G4PixeShellDataSet::FindValue(G4double energy, G4int /* componentId */) const
{
// Returns the sum over the shells corresponding to e
G4double value = 0.;
std::vector<G4IDataSet *>::const_iterator i(components.begin());
std::vector<G4IDataSet *>::const_iterator end(components.end());
while (i != end)
{
value += (*i)->FindValue(energy);
i++;
}
return value;
}
void G4PixeShellDataSet::PrintData(void) const
{
const size_t n = NumberOfComponents();
G4cout << "The data set has " << n << " components" << G4endl;
G4cout << G4endl;
size_t i = 0;
while (i < n)
{
G4cout << "--- Component " << i << " ---" << G4endl;
GetComponent(i)->PrintData();
i++;
}
}
void G4PixeShellDataSet::SetEnergiesData(G4DataVector* energies,
G4DataVector* data,
G4int componentId)
{
G4IDataSet* component = components[componentId];
if (component)
{
component->SetEnergiesData(energies, data, 0);
return;
}
std::ostringstream message;
message << "G4PixeShellDataSet::SetEnergiesData - component " << componentId << " not found";
G4Exception("G4PixeShellDataSet::SetEnergiesData",
"pii000000310",
FatalException,
message.str().c_str());
}
G4bool G4PixeShellDataSet::LoadData(const G4String& file)
{
CleanUpComponents();
// Load shell cross sections
G4int nShells = subShellName.size();
for (G4int subShellIndex=0; subShellIndex<nShells; subShellIndex++)
{
G4String subName = subShellName[subShellIndex];
G4String fullFileName = FullFileName(file,subName);
// Create component DataSet with the data from the current subshell
G4IDataSet* dataSet = new G4DataSet(z,algorithm);
dataSet->LoadData(fullFileName);
// Add component to the ShellDataSet
AddComponent(dataSet);
}
return true;
}
G4bool G4PixeShellDataSet::SaveData(const G4String& /* file */) const
{
// Dummy implementation
return true;
}
void G4PixeShellDataSet::CleanUpComponents(void)
{
while (!components.empty())
{
if (components.back()) delete components.back();
components.pop_back();
}
}
G4String G4PixeShellDataSet::FullFileName(const G4String& file,
const G4String& subShell) const
{
char* path = std::getenv("G4PIIDATA");
if (!path)
G4Exception("G4PixeShellDataSet::FullFileName",
"pii00000320",
FatalException,
"G4PIIDATA environment variable not set");
// Identify the shell this subshell belongs to
G4int shellIndex = TranslateShell(subShell);
G4String shellString = shellName[shellIndex];
G4String shellModel = crossModel[shellIndex];
std::ostringstream fullFileName;
fullFileName
//<< path
<< "pixe/"
<< file
<< '/'
<< shellString
<< '/'
<< shellModel
<< '/'
<< subShell
<< '-' ;
// << z
// << ".dat";
G4String test(fullFileName.str().c_str());
// std::cout << "PixeShellDataSet - Reading data from file " << test << std::endl;
return G4String(fullFileName.str().c_str());
}
G4int G4PixeShellDataSet::TranslateShell(const G4String& subShell) const
{
// By default return K shell
G4int index = 0;
if (subShell == "l1" || subShell == "l2" || subShell == "l3" ) index = 1;
if (subShell == "m1" ||
subShell == "m2" ||
subShell == "m3" ||
subShell == "m4" ||
subShell == "m5" ) index = 2;
return index;
}