/** * Return a pair of (minimum Q, maximum Q) for given * indirect geometry workspace. Estimates the Q range from all detectors. * If workspace contains grouped detectors/not all detectors are linked * to a spectrum, the returned interval may be larger than actually needed. * @param ws a workspace * @param minE minimum energy transfer in ws * @param maxE maximum energy transfer in ws * @return a pair containing global minimun and maximum Q */ std::pair<double, double> SofQCommon::qBinHintsIndirect(const API::MatrixWorkspace &ws, const double minE, const double maxE) const { using namespace Mantid::PhysicalConstants; auto minQ = std::numeric_limits<double>::max(); auto maxQ = std::numeric_limits<double>::lowest(); const auto &detectorInfo = ws.detectorInfo(); for (size_t i = 0; i < detectorInfo.size(); ++i) { if (detectorInfo.isMasked(i) || detectorInfo.isMonitor(i)) { continue; } const auto twoTheta = detectorInfo.twoTheta(i); const auto &det = detectorInfo.detector(i); const auto Q1 = indirectQ(minE, twoTheta, &det); const auto Q2 = indirectQ(maxE, twoTheta, &det); const auto minmaxQ = std::minmax(Q1, Q2); if (minmaxQ.first < minQ) { minQ = minmaxQ.first; } if (minmaxQ.second > maxQ) { maxQ = minmaxQ.second; } } if (minQ == std::numeric_limits<double>::max()) { throw std::runtime_error("Could not determine Q binning: workspace does " "not contain usable spectra."); } return std::make_pair(minQ, maxQ); }