/** Calculates Sn as estimator of scale for given vector * * This method implements a naive calculation of Sn, as defined by Rousseeuw *and Croux (http://dx.doi.org/10.2307%2F2291267). * In contrast to standard deviation, this is more robust towards outliers. * * @param begin :: Beginning of vector. * @param end :: End of vector. * @return Sn of supplied data. */ double PoldiPeakSearch::getSn(MantidVec::const_iterator begin, MantidVec::const_iterator end) const { size_t numberOfPoints = std::distance(begin, end); MantidVec absoluteDifferenceMedians(numberOfPoints); PARALLEL_FOR_NO_WSP_CHECK() for (int i = 0; i < static_cast<int>(numberOfPoints); ++i) { double currentValue = *(begin + i); MantidVec temp; temp.reserve(numberOfPoints - 1); for (int j = 0; j < static_cast<int>(numberOfPoints); ++j) { if (j != i) { temp.push_back(fabs(*(begin + j) - currentValue)); } } std::sort(temp.begin(), temp.end()); absoluteDifferenceMedians[i] = getMedianFromSortedVector(temp.begin(), temp.end()); } std::sort(absoluteDifferenceMedians.begin(), absoluteDifferenceMedians.end()); return 1.1926 * getMedianFromSortedVector(absoluteDifferenceMedians.begin(), absoluteDifferenceMedians.end()); }
/** Retrieves a vector with all counts that belong to the background * * In this method, a vector is assembled which contains all count data that is *considered to be background. * Whether a point is considered background depends on its distance to the *given peak positions. * * @param peakPositions :: Peak positions. * @param correlationCounts :: Vector with the complete correlation spectrum. * @return Vector only with counts that belong to the background. */ MantidVec PoldiPeakSearch::getBackground( std::list<MantidVec::const_iterator> peakPositions, const MantidVec &correlationCounts) const { size_t backgroundPoints = getNumberOfBackgroundPoints(peakPositions, correlationCounts); MantidVec background; background.reserve(backgroundPoints); for (MantidVec::const_iterator point = correlationCounts.begin() + 1; point != correlationCounts.end() - 1; ++point) { if (distanceToPeaksGreaterThanMinimum(peakPositions, point)) { background.push_back(*point); } } return background; }