Files
geant4/examples/advanced/xray_fluorescence/src/XrayFluoRunAction.cc
T
2016-06-08 16:18:25 +02:00

414 lines
9.8 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// $Id: XrayFluoRunAction.cc
// GEANT4 tag $Name: xray_fluo-V03-02-00
//
// Author: Elena Guardincerri (Elena.Guardincerri@ge.infn.it)
//
// History:
// -----------
// 28 Nov 2001 Elena Guardincerri Created
//
// -------------------------------------------------------------------
#include "XrayFluoRunAction.hh"
#include "G4Run.hh"
#include "G4UImanager.hh"
#include "G4VVisManager.hh"
#include "G4ios.hh"
#include "XrayFluoDataSet.hh"
#include "G4DataVector.hh"
#include "G4LogLogInterpolation.hh"
#include "g4std/fstream"
#include "g4std/strstream"
#include "XrayFluoNormalization.hh"
#include "XrayFluoAnalysisManager.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#ifdef G4ANALYSIS_USE
XrayFluoRunAction::XrayFluoRunAction()
:dataSet(0),dataGammaSet(0),dataAlphaSet(0),efficiencySet(0)
{
XrayFluoNormalization* normalization = new XrayFluoNormalization();
energies = new G4DataVector;
data = new G4DataVector;
ReadData(MeV, "/examples/advanced/xray_fluorescence/mercury_flx_solmin");
ReadResponse("/examples/advanced/xray_fluorescence/response");
G4double minGamma = 0.*keV;
G4double maxGamma = 10. *keV;
G4int nBinsGamma = 100;
dataGammaSet = normalization->Normalize(minGamma, maxGamma, nBinsGamma,
"/examples/advanced/xray_fluorescence/B_flare");
G4String fileName = "/examples/advanced/xray_fluorescence/efficienza";
G4VDataSetAlgorithm* interpolation4 = new G4LogLogInterpolation();
efficiencySet = new XrayFluoDataSet(1,fileName,interpolation4,keV,1);
}
#else
XrayFluoRunAction::XrayFluoRunAction()
{
}
#endif
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#ifdef G4ANALYSIS_USE
XrayFluoRunAction::~XrayFluoRunAction()
{
G4std::map<G4int,G4DataVector*,G4std::less<G4int> >::iterator pos;
for (pos = energyMap.begin(); pos != energyMap.end(); pos++)
{
G4DataVector* dataSet = (*pos).second;
delete dataSet;
dataSet = 0;
}
for (pos = dataMap.begin(); pos != dataMap.end(); pos++)
{
G4DataVector* dataSet = (*pos).second;
delete dataSet;
dataSet = 0;
}
}
#else
XrayFluoRunAction::~XrayFluoRunAction()
{
}
#endif
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void XrayFluoRunAction::BeginOfRunAction(const G4Run* aRun)
{
G4cout << "### Run " << aRun << " start." << G4endl;
if (G4VVisManager::GetConcreteInstance())
{
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/vis/scene/notifyHandlers");
}
#ifdef G4ANALYSIS_USE
// Book histograms and ntuples
XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance();
analysis->book();
#endif
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
void XrayFluoRunAction::EndOfRunAction(const G4Run* aRun )
{
#ifdef G4ANALYSIS_USE
XrayFluoAnalysisManager* analysis = XrayFluoAnalysisManager::getInstance();
analysis->finish();
#endif
// Run ended, update the visualization
if (G4VVisManager::GetConcreteInstance()) {
G4UImanager::GetUIpointer()->ApplyCommand("/vis/viewer/update");
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
const XrayFluoDataSet* XrayFluoRunAction::GetSet()
{
return dataSet;
}
const XrayFluoDataSet* XrayFluoRunAction::GetGammaSet()
{
return dataGammaSet;
}
const XrayFluoDataSet* XrayFluoRunAction::GetAlphaSet()
{
return dataAlphaSet;
}
const XrayFluoDataSet* XrayFluoRunAction::GetEfficiencySet()
{
return efficiencySet;
}
G4DataVector* XrayFluoRunAction::GetEnergies()
{
return energies;
}
G4DataVector* XrayFluoRunAction::GetData()
{
return data;
}
G4double XrayFluoRunAction::GetDataSum()
{
G4double sum = 0;
size_t size = data->size();
for (size_t i = 0; i <size; i++)
{
sum+=(*data)[i];
}
return sum;
}
G4double XrayFluoRunAction::GetInfData(G4double energy, G4double random)
{
G4double value = 0.;
G4int zMin = 1;
G4int zMax = 10;
G4int Z = ((G4int)(energy/keV));
if (Z<zMin) {Z=zMin;}
if (Z>zMax) {Z=zMax;}
if (Z >= zMin && Z <= zMax)
{
G4std::map<G4int,G4DataVector*,G4std::less<G4int> >::const_iterator pos;
pos = energyMap.find(Z);
G4std::map<G4int,G4DataVector*,G4std::less<G4int> >::const_iterator posData;
posData = dataMap.find(Z);
if (pos!= energyMap.end())
{
G4DataVector energySet = *((*pos).second);
G4DataVector dataSet = *((*posData).second);
G4int nData = energySet.size();
G4double partSum = 0;
G4int index = 0;
while (random> partSum)
{
partSum += dataSet[index];
index++;
}
if (index >= 0 && index < nData)
{
value = energySet[index];
}
}
}
return value;
}
G4double XrayFluoRunAction::GetSupData(G4double energy, G4double random)
{
G4double value = 0.;
G4int zMin = 1;
G4int zMax = 10;
G4int Z = ((G4int)(energy/keV)+1);
if (Z<zMin) {Z=zMin;}
if (Z>zMax) {Z=zMax;}
if (Z >= zMin && Z <= zMax)
{
G4std::map<G4int,G4DataVector*,G4std::less<G4int> >::const_iterator pos;
pos = energyMap.find(Z);
G4std::map<G4int,G4DataVector*,G4std::less<G4int> >::const_iterator posData;
posData = dataMap.find(Z);
if (pos!= energyMap.end())
{
G4DataVector energySet = *((*pos).second);
G4DataVector dataSet = *((*posData).second);
G4int nData = energySet.size();
G4double partSum = 0;
G4int index = 0;
while (random> partSum)
{
partSum += dataSet[index];
index++;
}
if (index >= 0 && index < nData)
{
value = energySet[index];
}
}
}
return value;
}
void XrayFluoRunAction::ReadData(G4double unitE, G4String fileName)
{
char nameChar[100] = {""};
G4std::ostrstream ost(nameChar, 100, G4std::ios::out);
ost << fileName <<".dat";
G4String name(nameChar);
char* path = getenv("G4INSTALL");
G4String pathString(path);
G4String dirFile = pathString + "/" + name;
G4std::ifstream file(dirFile);
G4std::filebuf* lsdp = file.rdbuf();
if (! (lsdp->is_open()) )
{
G4String excep = "XrayFluoRunAction - data file: " + dirFile + " not found";
G4Exception(excep);
}
G4double a = 0;
G4int k = 1;
do
{
file >> a;
G4int nColumns = 2;
// 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
if (a == -1 || a == -2)
{
}
else
{
if (k%nColumns != 0)
{
G4double e = a * unitE;
energies->push_back(e);
k++;
}
else if (k%nColumns == 0)
{
G4double value = a;
data->push_back(value);
k = 1;
}
}
} while (a != -2); // end of file
file.close();
}
void XrayFluoRunAction::ReadResponse(const G4String& fileName)
{
char nameChar[100] = {""};
G4std::ostrstream ost(nameChar, 100, G4std::ios::out);
ost << fileName<<".dat";
G4String name(nameChar);
char* path = getenv("G4INSTALL");
G4String pathString(path);
G4String dirFile = pathString + "/" + name;
G4std::ifstream file(dirFile);
G4std::filebuf* lsdp = file.rdbuf();
if (! (lsdp->is_open()) )
{
G4String excep = "XrayFluoRunAction - data file: " + dirFile + " not found";
G4Exception(excep);
}
G4double a = 0;
G4int k = 1;
G4int s = 0;
G4int Z = 1;
G4DataVector* energies = new G4DataVector;
G4DataVector* data = new G4DataVector;
do
{
file >> a;
G4int nColumns = 2;
if (a == -1)
{
if (s == 0)
{
// End of a data set
energyMap[Z] = energies;
dataMap[Z] = data;
// Start of new shell data set
energies = new G4DataVector;
data = new G4DataVector;
Z++;
}
s++;
if (s == nColumns)
{
s = 0;
}
}
else if (a == -2)
{
// End of file; delete the empty vectors
//created when encountering the last -1 -1 row
delete energies;
delete data;
}
else
{
// 1st column is energy
if(k%nColumns != 0)
{
G4double e = a * keV;
energies->push_back(e);
k++;
}
else if (k%nColumns == 0)
{
// 2nd column is data
data->push_back(a);
k = 1;
}
}
} while (a != -2); // end of file
file.close();
}