414 lines
9.8 KiB
C++
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();
|
|
}
|
|
|
|
|
|
|
|
|