50 XrayFluoSiLiDetectorType::XrayFluoSiLiDetectorType():
51 detectorMaterial(
"SiLi"),efficiencySet(0)
53 LoadResponseData(
"SILIresponse");
55 LoadEfficiencyData(
"SILIefficiency");
61 std::map<G4int,G4DataVector*,std::less<G4int> >::iterator pos;
63 for (pos = energyMap.begin(); pos != energyMap.end(); pos++)
69 for (pos = dataMap.begin(); pos != dataMap.end(); pos++)
76 delete interpolation4;
81 return detectorMaterial;
109 energyVector.push_back(1.486*
keV);
110 energyVector.push_back(1.740*
keV);
111 energyVector.push_back(3.688*
keV);
112 energyVector.push_back(4.510*
keV);
113 energyVector.push_back(5.414*
keV);
114 energyVector.push_back(6.404*
keV);
118 G4int energyNumber = 0;
121 if (energy>=eMin && energy <=eMax)
124 for (
G4int i=0; i<(
G4int)energyVector.size(); i++){
125 if (energyVector[i]/
keV < energy/
keV){
127 infEnergy = energyVector[i];
128 supEnergy = energyVector[i+1];
140 value = (std::log10(infData)*std::log10(supEnergy/energy) +
141 std::log10(supData)*std::log10(energy/infEnergy)) /
142 std::log10(supEnergy/infEnergy);
143 value = std::pow(10,value);
164 else if (energy > eMax)
169 value = (
GetSupData(energy, random, energyNumber))+(energy - 6.404*
keV);
180 value = (
GetInfData(energy, random, energyNumber))+(energy - 1.486*
keV);
192 efficiency = dataSet->
FindValue(value,
id);
193 if ( RandomNum>efficiency )
210 if (Z<zMin) {Z=zMin;}
211 if (Z>zMax) {Z=zMax;}
213 if (Z >= zMin && Z <= zMax)
215 std::map<G4int,G4DataVector*,std::less<G4int> >::const_iterator pos;
216 pos = energyMap.find(Z);
217 std::map<G4int,G4DataVector*,std::less<G4int> >::const_iterator posData;
218 posData = dataMap.find(Z);
221 if (pos!= energyMap.end())
225 G4int nData = energySet.size();
236 for (
G4int i = 0; i<nData; i++){
237 dataSum += dataSet[i];
240 G4double normRandom = random*dataSum;
243 while (normRandom> partSum)
246 partSum += dataSet[index];
251 if (index >= 0 && index < nData)
253 value = energySet[index];
266 G4int Z = (posIndex+1);
268 if (Z<zMin) {Z=zMin;}
269 if (Z>zMax) {Z=zMax;}
270 if (Z >= zMin && Z <= zMax)
272 std::map<G4int,G4DataVector*,std::less<G4int> >::const_iterator pos;
273 pos = energyMap.find(Z);
274 std::map<G4int,G4DataVector*,std::less<G4int> >::const_iterator posData;
275 posData = dataMap.find(Z);
276 if (pos!= energyMap.end())
280 G4int nData = energySet.size();
289 for (
G4int i = 0; i<nData; i++){
290 dataSum += dataSet[i];
293 G4double normRandom = random*dataSum;
296 while (normRandom> partSum)
298 partSum += dataSet[index];
303 if (index >= 0 && index < nData)
305 value = energySet[index];
313 std::ostringstream ost;
315 ost << fileName<<
".dat";
319 char* path = getenv(
"XRAYDATA");
323 std::ifstream file(dirFile);
324 std::filebuf* lsdp = file.rdbuf();
326 if (! (lsdp->is_open()) )
329 execp <<
"XrayFluoSiLiDetectorType - data file: " + dirFile +
" not found";
330 G4Exception(
"XrayFluoSiLiDetectorType::LoadResponseData()",
"example-xray_fluorescence07",
350 energyMap[Z] = energies;
377 energies->push_back(e);
380 else if (k%nColumns == 0)
394 char* path = getenv(
"XRAYDATA");
398 dirFile = pathString +
"/" + fileName;
401 path = getenv(
"PWD");
403 dirFile = pathString +
"/" + fileName;
G4String GetDetectorMaterial()
void LoadEfficiencyData(G4String)
std::ostringstream G4ExceptionDescription
void LoadResponseData(G4String)
G4double ResponseFunction(G4double)
static XrayFluoSiLiDetectorType * GetInstance()
double precision function energy(A, Z)
G4double GetInfData(G4double, G4double, G4int)
G4double GetSupData(G4double, G4double, G4int)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double FindValue(G4double e, G4int) const
const XML_Char int const XML_Char * value
const XML_Char const XML_Char * data
~XrayFluoSiLiDetectorType()