Example #1
0
/**
 * 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);
}