/** * Estimated the FWHM for Gaussian peak fitting * */ void ConvertEmptyToTof::estimateFWHM(const Mantid::MantidVec &spec, double ¢er, double &sigma, double &height, double &minX, double &maxX) { auto maxValueIt = std::max_element(spec.begin() + static_cast<size_t>(minX), spec.begin() + static_cast<size_t>(maxX)); // max value double maxValue = *maxValueIt; size_t maxIndex = std::distance(spec.begin(), maxValueIt); // index of max value auto minFwhmIt = std::find_if(MantidVec::const_reverse_iterator(maxValueIt), MantidVec::const_reverse_iterator(spec.cbegin()), [maxValue](double value) { return value < 0.5 * maxValue; }); auto maxFwhmIt = std::find_if(maxValueIt, spec.end(), [maxValue](double value) { return value < 0.5 * maxValue; }); // double fwhm = thisSpecX[maxFwhmIndex] - thisSpecX[minFwhmIndex + 1]; double fwhm = static_cast<double>(std::distance(minFwhmIt.base(), maxFwhmIt) + 1); // parameters for the gaussian peak fit center = static_cast<double>(maxIndex); sigma = fwhm; height = maxValue; g_log.debug() << "Peak estimate : center=" << center << "\t sigma=" << sigma << "\t h=" << height << '\n'; // determination of the range used for the peak definition size_t ipeak_min = std::max( std::size_t{0}, maxIndex - static_cast<size_t>(2.5 * static_cast<double>(std::distance( maxValueIt, maxFwhmIt)))); size_t ipeak_max = std::min( spec.size(), maxIndex + static_cast<size_t>(2.5 * static_cast<double>(std::distance( maxFwhmIt, maxValueIt)))); size_t i_delta_peak = ipeak_max - ipeak_min; g_log.debug() << "Peak estimate xmin/max: " << ipeak_min - 1 << "\t" << ipeak_max + 1 << '\n'; minX = static_cast<double>(ipeak_min - 2 * i_delta_peak); maxX = static_cast<double>(ipeak_max + 2 * i_delta_peak); }