Removed the strange energy-loops in the TrimSPDataHandler and use generic algorithms instead

This commit is contained in:
Bastian M. Wojek 2009-05-15 13:36:15 +00:00
parent 908cf0a478
commit 3dd8b3e73f
2 changed files with 178 additions and 112 deletions

View File

@ -5,7 +5,7 @@
Author: Bastian M. Wojek
e-mail: bastian.wojek@psi.ch
2008/11/21
2009/05/15
***************************************************************************/
@ -15,6 +15,7 @@
#include <string>
#include <cmath>
#include <cassert>
#include <algorithm>
using namespace std;
@ -33,10 +34,15 @@ using namespace std;
// <some_path>021.rge
//
// <some_path>21.rge is explicitly not possible since it is not clear, if this denotes 2.1keV or 21.0keV!
//
// Also always use the same format within one energyVec - otherwise sorting of the vector will not work properly!
//--------------------
TTrimSPData::TTrimSPData(const string &path, vector<string> &energyVec) {
// sort the energies in ascending orders - this might be useful for later applications (energy-interpolations etc.)
sort(energyVec.begin(), energyVec.end());
double zz(0.0), nzz(0.0);
vector<double> vzz, vnzz;
string word, energyStr;
@ -104,6 +110,31 @@ TTrimSPData::TTrimSPData(const string &path, vector<string> &energyVec) {
for(unsigned int i(0); i<fEnergy.size();i++)
fIsNormalized.push_back(false);
fEnergyIter = fEnergy.end();
}
void TTrimSPData::UseHighResolution(double e) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
vector<double> vecZ;
vector<double> vecNZ;
for(double zz(1.); zz<2100.; zz+=1.) {
vecZ.push_back(zz);
vecNZ.push_back(GetNofZ(zz/10.0, e));
}
fDataZ[i] = vecZ;
fDataNZ[i] = vecNZ;
fOrigDataNZ[i] = vecNZ;
fDZ[i] = 1.;
fIsNormalized[i] = false;
return;
}
cout << "TTrimSPData::DataZ: No implantation profile available for the specified energy... Nothing happens." << endl;
return;
}
//---------------------
@ -112,16 +143,15 @@ TTrimSPData::TTrimSPData(const string &path, vector<string> &energyVec) {
vector<double> TTrimSPData::DataZ(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
// cout << tEnergy[i] << " " << e << " " << tEnergy[i] - e << endl;
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
return fDataZ[i];
}
}
// default
cout << "TTrimSPData::DataZ: No implantation profile available for the specified energy... You get back the first one." << endl;
return fDataZ[0];
}
//---------------------
@ -131,11 +161,12 @@ vector<double> TTrimSPData::DataZ(double e) const {
vector<double> TTrimSPData::DataNZ(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
return fDataNZ[i];
}
}
// default
cout << "TTrimSPData::DataNZ: No implantation profile available for the specified energy... You get back the first one." << endl;
return fDataNZ[0];
@ -148,11 +179,12 @@ vector<double> TTrimSPData::DataNZ(double e) const {
vector<double> TTrimSPData::OrigDataNZ(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
return fOrigDataNZ[i];
}
}
// default
cout << "TTrimSPData::OrigDataNZ: No implantation profile available for the specified energy... You get back the first one." << endl;
return fOrigDataNZ[0];
@ -171,8 +203,10 @@ double TTrimSPData::LayerFraction(double e, unsigned int layno, const vector<dou
return 0.0;
}
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
// Because we do not know if the implantation profile is normalized or not, do not care about this and calculate the fraction from the beginning
// Total "number of muons"
double totalNumber(0.0);
@ -197,7 +231,6 @@ double TTrimSPData::LayerFraction(double e, unsigned int layno, const vector<dou
// cout << "Fraction of muons in layer " << layno << ": " << layerNumber/totalNumber << endl;
return layerNumber/totalNumber;
}
}
// default
cout << "TTrimSPData::LayerFraction: No implantation profile available for the specified energy... Returning 0.0" << endl;
@ -241,22 +274,24 @@ void TTrimSPData::WeightLayers(double e, const vector<double>& interface, const
}
}
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
// If all weights are equal to one, use the original n(z) vector
for(unsigned int i(0); i<weight.size(); i++) {
if(weight[i]-1.0)
break;
if(i == weight.size() - 1) {
for(unsigned int j(0); j<fEnergy.size(); j++) {
if(!(fEnergy[j] - e)) {
if(fEnergyIter != fEnergy.end()) {
unsigned int j(fEnergyIter - fEnergy.begin());
fDataNZ[j] = fOrigDataNZ[j];
fIsNormalized[j] = false;
return;
}
}
}
}
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
unsigned int k(0);
for(unsigned int j(0); j<fDataZ[i].size(); j++) {
if(k<interface.size()) {
@ -273,7 +308,6 @@ void TTrimSPData::WeightLayers(double e, const vector<double>& interface, const
fIsNormalized[i] = false;
return;
}
}
cout << "TTrimSPData::WeightLayers: No implantation profile available for the specified energy... No weighting done." << endl;
return;
@ -287,17 +321,16 @@ double TTrimSPData::GetNofZ(double zz, double e) const {
vector<double> z, nz;
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
z = fDataZ[i];
nz = fDataNZ[i];
break;
}
if(i == fEnergy.size() - 1) {
} else {
cout << "TTrimSPData::GetNofZ: No implantation profile available for the specified energy... Quitting!" << endl;
exit(-1);
}
}
if(zz < 0)
return 0.0;
@ -326,8 +359,10 @@ double TTrimSPData::GetNofZ(double zz, double e) const {
void TTrimSPData::Normalize(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
double nZsum = 0.0;
for (unsigned int j(0); j<fDataZ[i].size(); j++)
nZsum += fDataNZ[i][j];
@ -338,7 +373,6 @@ void TTrimSPData::Normalize(double e) const {
fIsNormalized[i] = true;
return;
}
}
// default
cout << "TTrimSPData::Normalize: No implantation profile available for the specified energy... No normalization done." << endl;
return;
@ -350,11 +384,12 @@ void TTrimSPData::Normalize(double e) const {
//---------------------
bool TTrimSPData::IsNormalized(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
return fIsNormalized[i];
}
}
cout << "TTrimSPData::IsNormalized: No implantation profile available for the specified energy... Returning false! Check your code!" << endl;
return false;
@ -365,8 +400,10 @@ bool TTrimSPData::IsNormalized(double e) const {
//---------------------
double TTrimSPData::MeanRange(double e) const {
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
if (!fIsNormalized[i])
Normalize(e);
double mean(0.0);
@ -376,12 +413,37 @@ double TTrimSPData::MeanRange(double e) const {
mean *= fDZ[i]/10.0;
return mean;
}
}
cout << "TTrimSPData::MeanRange: No implantation profile available for the specified energy... Returning -1! Check your code!" << endl;
return -1.;
}
//---------------------
// Find the peak range in (nm) for a given energy e
//---------------------
double TTrimSPData::PeakRange(double e) const {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
vector<double>::const_iterator nziter;
nziter = max_element(fDataNZ[i].begin(),fDataNZ[i].end());
if(nziter != fDataNZ[i].end()){
unsigned int j(nziter - fDataNZ[i].begin());
return fDataZ[i][j];
}
cout << "TTrimSPData::PeakRange: No maximum found in the implantation profile... Returning -1! Please check the profile!" << endl;
return -1.;
}
cout << "TTrimSPData::PeakRange: No implantation profile available for the specified energy... Returning -1! Check your code!" << endl;
return -1.;
}
//---------------------
// Convolve the n(z)-vector calculated by trim.SP for a given energy e [keV] with a gaussian exp(-z^2/(2*w^2))
// No normalization is done!
@ -394,8 +456,10 @@ void TTrimSPData::ConvolveGss(double w, double e) const {
vector<double> z, nz, gss;
double nn;
for(unsigned int i(0); i<fEnergy.size(); i++) {
if(!(fEnergy[i] - e)) {
fEnergyIter = find(fEnergy.begin(), fEnergy.end(), e);
if(fEnergyIter != fEnergy.end()) {
unsigned int i(fEnergyIter - fEnergy.begin());
z = fDataZ[i];
nz = fOrigDataNZ[i];
@ -415,7 +479,6 @@ void TTrimSPData::ConvolveGss(double w, double e) const {
return;
}
}
cout << "TTrimSPData::ConvolveGss: No implantation profile available for the specified energy... No convolution done!" << endl;
return;

View File

@ -5,7 +5,7 @@
Author: Bastian M. Wojek
e-mail: bastian.wojek@psi.ch
2008/11/21
2009/05/15
***************************************************************************/
@ -35,6 +35,7 @@ public:
vector<double> DataZ(double) const;
vector<double> DataNZ(double) const;
vector<double> OrigDataNZ(double) const;
void UseHighResolution(double);
void WeightLayers(double, const vector<double>&, const vector<double>&) const;
double LayerFraction(double, unsigned int, const vector<double>&) const;
double GetNofZ(double, double) const;
@ -42,6 +43,7 @@ public:
bool IsNormalized(double) const;
void ConvolveGss(double, double) const;
double MeanRange(double) const;
double PeakRange(double) const;
private:
vector<double> fEnergy;
@ -50,6 +52,7 @@ private:
mutable vector< vector<double> > fDataNZ;
vector< vector<double> > fOrigDataNZ;
mutable vector<bool> fIsNormalized;
mutable vector<double>::const_iterator fEnergyIter;
};
#endif // _TTrimSPDataHandler_H_