/** * Corrects a spectra for the detector efficiency calculated from detector * information. Gets the detector information and uses this to calculate its * efficiency * @param spectraIndex :: index of the spectrum to get the efficiency for * @throw invalid_argument if the shape of a detector is isn't a cylinder * aligned along one axis * @throw runtime_error if the SpectraDetectorMap has not been filled * @throw NotFoundError if the detector or its gas pressure or wall thickness * were not found */ void He3TubeEfficiency::correctForEfficiency(std::size_t spectraIndex) { Geometry::IDetector_const_sptr det = this->inputWS->getDetector(spectraIndex); if( det->isMonitor() || det->isMasked() ) { return; } const double exp_constant = this->calculateExponential(spectraIndex, det); const double scale = this->getProperty("ScaleFactor"); Mantid::MantidVec &yout = this->outputWS->dataY(spectraIndex); Mantid::MantidVec &eout = this->outputWS->dataE(spectraIndex); // Need the original values so this is not a reference const Mantid::MantidVec yValues = this->inputWS->readY(spectraIndex); const Mantid::MantidVec eValues = this->inputWS->readE(spectraIndex); std::vector<double>::const_iterator yinItr = yValues.begin(); std::vector<double>::const_iterator einItr = eValues.begin(); Mantid::MantidVec::const_iterator xItr = this->inputWS->readX(spectraIndex).begin(); Mantid::MantidVec::iterator youtItr = yout.begin(); Mantid::MantidVec::iterator eoutItr = eout.begin(); for( ; youtItr != yout.end(); ++youtItr, ++eoutItr) { const double wavelength = (*xItr + *(xItr + 1)) / 2.0; const double effcorr = this->detectorEfficiency(exp_constant * wavelength, scale); *youtItr = (*yinItr) * effcorr; *eoutItr = (*einItr) * effcorr; ++yinItr; ++einItr; ++xItr; } return; }
/** * 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); }