diff --git a/src/external/TFitPofB-lib/classes/TTrimSPDataHandler.cpp b/src/external/TFitPofB-lib/classes/TTrimSPDataHandler.cpp index 10e308cc..ecc90653 100644 --- a/src/external/TFitPofB-lib/classes/TTrimSPDataHandler.cpp +++ b/src/external/TFitPofB-lib/classes/TTrimSPDataHandler.cpp @@ -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 #include #include +#include using namespace std; @@ -33,10 +34,15 @@ using namespace std; // 021.rge // // 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 &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 vzz, vnzz; string word, energyStr; @@ -104,6 +110,31 @@ TTrimSPData::TTrimSPData(const string &path, vector &energyVec) { for(unsigned int i(0); i vecZ; + vector 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 &energyVec) { vector TTrimSPData::DataZ(double e) const { - for(unsigned int i(0); i TTrimSPData::DataZ(double e) const { vector TTrimSPData::DataNZ(double e) const { - for(unsigned int i(0); i TTrimSPData::DataNZ(double e) const { vector TTrimSPData::OrigDataNZ(double e) const { - for(unsigned int i(0); i= *(interface.end()-1)*10.0) - layerNumber += fDataNZ[i][j]; - } else { - for(unsigned int j(0); j= interface[layno-2]*10.0 && fDataZ[i][j] < interface[layno-1]*10.0) - layerNumber += fDataNZ[i][j]; - } - // fraction of muons in layer layno - // cout << "Fraction of muons in layer " << layno << ": " << layerNumber/totalNumber << endl; - return layerNumber/totalNumber; + if(fDataZ[i][j] < interface[0]*10.0) + layerNumber += fDataNZ[i][j]; + } else if(!(layno-interface.size()-1)){ + for(unsigned int j(0); j= *(interface.end()-1)*10.0) + layerNumber += fDataNZ[i][j]; + } else { + for(unsigned int j(0); j= interface[layno-2]*10.0 && fDataZ[i][j] < interface[layno-1]*10.0) + layerNumber += fDataNZ[i][j]; } + // fraction of muons in layer layno + // cout << "Fraction of muons in layer " << layno << ": " << layerNumber/totalNumber << endl; + return layerNumber/totalNumber; } // default @@ -241,38 +274,39 @@ void TTrimSPData::WeightLayers(double e, const vector& 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 z, nz; - for(unsigned int i(0); i::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,27 +456,28 @@ void TTrimSPData::ConvolveGss(double w, double e) const { vector z, nz, gss; double nn; - for(unsigned int i(0); i DataZ(double) const; vector DataNZ(double) const; vector OrigDataNZ(double) const; + void UseHighResolution(double); void WeightLayers(double, const vector&, const vector&) const; double LayerFraction(double, unsigned int, const vector&) 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 fEnergy; @@ -50,6 +52,7 @@ private: mutable vector< vector > fDataNZ; vector< vector > fOrigDataNZ; mutable vector fIsNormalized; + mutable vector::const_iterator fEnergyIter; }; #endif // _TTrimSPDataHandler_H_