From 6a5e9d05b8f85e9a0618015fa72d804561c37da3 Mon Sep 17 00:00:00 2001
From: Duc Le <duc.le@stfc.ac.uk>
Date: Mon, 22 Jan 2018 20:35:36 +0000
Subject: [PATCH] Re #21500 - fixed warnings, updated docs and release notes

---
 Framework/Algorithms/src/SofQW.cpp            |   1 +
 .../Algorithms/src/SofQWNormalisedPolygon.cpp |   1 +
 .../DataObjects/src/FractionalRebinning.cpp   |  22 ++++----
 .../algorithms/SofQWNormalisedPolygon-v1.rst  |  52 +++++++++++++-----
 docs/source/algorithms/SofQWPolygon-v1.rst    |  27 ++++++++-
 docs/source/images/RebinnedOutput.png         | Bin 0 -> 19263 bytes
 docs/source/release/v3.12.0/spectroscopy.rst  |   3 +
 7 files changed, 79 insertions(+), 27 deletions(-)
 create mode 100644 docs/source/images/RebinnedOutput.png

diff --git a/Framework/Algorithms/src/SofQW.cpp b/Framework/Algorithms/src/SofQW.cpp
index 73d21353bd9..2d80eeacebd 100644
--- a/Framework/Algorithms/src/SofQW.cpp
+++ b/Framework/Algorithms/src/SofQW.cpp
@@ -146,6 +146,7 @@ void SofQW::exec() {
  *  @param[in]  binParams The bin parameters from the user
  *  @param[out] newAxis        The 'vertical' axis defined by the given
  * parameters
+ *  @param[out] ebinParams     The 'horizontal' axis parameters (optional)
  *  @return A pointer to the newly-created workspace
  */
 API::MatrixWorkspace_sptr
diff --git a/Framework/Algorithms/src/SofQWNormalisedPolygon.cpp b/Framework/Algorithms/src/SofQWNormalisedPolygon.cpp
index 8ce4215b454..351de53c504 100644
--- a/Framework/Algorithms/src/SofQWNormalisedPolygon.cpp
+++ b/Framework/Algorithms/src/SofQWNormalisedPolygon.cpp
@@ -402,6 +402,7 @@ void SofQWNormalisedPolygon::initAngularCachesPSD(
  *  @param[in]  binParams The bin parameters from the user
  *  @param[out] newAxis        The 'vertical' axis defined by the given
  * parameters
+ *  @param[out] ebinParams     The 'horizontal' axis parameters (optional)
  *  @return A pointer to the newly-created workspace
  */
 RebinnedOutput_sptr SofQWNormalisedPolygon::setUpOutputWorkspace(
diff --git a/Framework/DataObjects/src/FractionalRebinning.cpp b/Framework/DataObjects/src/FractionalRebinning.cpp
index 0f45a52901e..f4ed9c474b6 100644
--- a/Framework/DataObjects/src/FractionalRebinning.cpp
+++ b/Framework/DataObjects/src/FractionalRebinning.cpp
@@ -112,7 +112,7 @@ void calcRectangleIntersections(
     MatrixWorkspace_const_sptr outputWS, const std::vector<double> &yAxis,
     const Quadrilateral &inputQ, const size_t y_start, const size_t y_end,
     const size_t x_start, const size_t x_end,
-    std::vector<std::tuple<int, int, double>> &areaInfo) {
+    std::vector<std::tuple<size_t, size_t, double>> &areaInfo) {
   const auto &xAxis = outputWS->x(0);
   std::vector<double> width;
   for (size_t xi = x_start; xi < x_end; ++xi) {
@@ -162,7 +162,7 @@ void calcTrapezoidYIntersections(
     MatrixWorkspace_const_sptr outputWS, const std::vector<double> &yAxis,
     const Quadrilateral &inputQ, const size_t y_start, const size_t y_end,
     const size_t x_start, const size_t x_end,
-    std::vector<std::tuple<int, int, double>> &areaInfo) {
+    std::vector<std::tuple<size_t, size_t, double>> &areaInfo) {
   // The algorithm proceeds as follows:
   // 1. Determine the left/right bin boundaries on the x- (horizontal)-grid.
   // 2. Loop along x, for each 1-output-bin wide strip construct a new input Q.
@@ -203,7 +203,6 @@ void calcTrapezoidYIntersections(
   }
 
   // Step 1 - construct the left/right bin lims on the lines of the y-grid.
-  // First get equations for the top and bottom diagonal lines
   const double NaN = std::numeric_limits<double>::quiet_NaN();
   const double DBL_EPS = std::numeric_limits<double>::epsilon();
   std::vector<double> leftLim(nx * (ny + 1), NaN);
@@ -214,10 +213,12 @@ void calcTrapezoidYIntersections(
   auto y1_it = yAxis.begin() + y_end + 1;
   const size_t ymax = (y_end == yAxis.size()) ? ny : (ny + 1);
   if ((mTop >= 0 && mBot >= 0) || (mTop < 0 && mBot < 0)) {
-    // Shape: /=/ or \=\  - top diag is left, bot is right or vice versa.
+    // Diagonals in same direction: For a given x-parallel line,
+    // Left limit given by one diagonal, right limit given by other
     double left_val, right_val;
     for (size_t yj = 0; yj < ymax; ++yj) {
       const size_t yjx = yj * nx;
+      // First, find the far left/right limits, given by the inputQ
       if (mTop >= 0) {
         left_val = (yAxis[yj + y_start] - cTop) / mTop;
         right_val = (yAxis[yj + y_start] - cBot) / mBot;
@@ -245,6 +246,7 @@ void calcTrapezoidYIntersections(
         right_it = x1_it - 1;
         rightLim[nx - 1 + yjx] = lr_x;
       }
+      // Now populate the bin boundaries in between
       if (left_it < right_it && right_it != x1_it) {
         for (auto x_it = left_it; x_it != right_it; ++x_it) {
           leftLim[li + 1 + yjx] = *x_it;
@@ -253,7 +255,7 @@ void calcTrapezoidYIntersections(
       }
     }
   } else {
-    // Shape: <=| or |=>  - top diag is upper l/r, bot is lower l/r
+    // In this case, the diagonals are all on one side or the other.
     const size_t y2 =
         std::upper_bound(y0_it, y1_it, (mTop >= 0) ? ll_y : lr_y) - y0_it;
     const size_t y3 =
@@ -302,7 +304,7 @@ void calcTrapezoidYIntersections(
   size_t vertBits = 0;
   size_t yj0, yj1;
   for (size_t xi = x_start; xi < x_end; ++xi) {
-    size_t xj = xi - x_start;
+    const size_t xj = xi - x_start;
     // Define new 1-bin wide input quadrilateral
     if (xi > x_start) {
       nll = nlr;
@@ -450,7 +452,7 @@ void calcGeneralIntersections(
     MatrixWorkspace_const_sptr outputWS, const std::vector<double> &yAxis,
     const Quadrilateral &inputQ, const size_t qstart, const size_t qend,
     const size_t x_start, const size_t x_end,
-    std::vector<std::tuple<int, int, double>> &areaInfo) {
+    std::vector<std::tuple<size_t, size_t, double>> &areaInfo) {
   const auto &xAxis = outputWS->x(0);
   ConvexPolygon intersectOverlap;
   for (size_t yi = qstart; yi < qend; ++yi) {
@@ -606,7 +608,7 @@ void rebinToFractionalOutput(const Quadrilateral &inputQ,
   // defined as rectangular. If the inputQ is is also rectangular or
   // trapezoidal, a simpler/faster way of calculating the intersection area
   // of all or some bins can be used.
-  std::vector<std::tuple<int, int, double>> areaInfo;
+  std::vector<std::tuple<size_t, size_t, double>> areaInfo;
   const double inputQArea = inputQ.area();
   const QuadrilateralType inputQType = getQuadrilateralType(inputQ);
   if (inputQType == Rectangle) {
@@ -621,8 +623,8 @@ void rebinToFractionalOutput(const Quadrilateral &inputQ,
   }
 
   for (auto ai : areaInfo) {
-    const int xi = std::get<0>(ai);
-    const int yi = std::get<1>(ai);
+    const size_t xi = std::get<0>(ai);
+    const size_t yi = std::get<1>(ai);
     const double weight = std::get<2>(ai) / inputQArea;
     PARALLEL_CRITICAL(overlap) {
       outputWS->mutableY(yi)[xi] += signal * weight;
diff --git a/docs/source/algorithms/SofQWNormalisedPolygon-v1.rst b/docs/source/algorithms/SofQWNormalisedPolygon-v1.rst
index c4bbb3ff663..2ff556913a5 100644
--- a/docs/source/algorithms/SofQWNormalisedPolygon-v1.rst
+++ b/docs/source/algorithms/SofQWNormalisedPolygon-v1.rst
@@ -12,25 +12,49 @@ Description
 Converts a 2D workspace from :ref:`units <Unit Factory>` 
 of spectrum number/**energy transfer** 
 to the intensity as a function of **momentum transfer** :math:`Q` 
-and **energy transfer** :math:`\Delta E`. The rebinning is done as a 
-weighted sum of overlapping polygons with
-fractional area tracking. The result is stored in a new workspace type:
-**RebinnedOutput**. The new workspace presents the data as the
-fractional counts divided by the fractional area. The biggest
-consequence of this method is that in places where there are no counts
-and no acceptance (no fractional areas), **nan**\ -s will result.
-
+and **energy transfer** :math:`\Delta E`. 
+
+.. figure:: /images/RebinnedOutput.png
+   :align: center
+
+As shown in the figure, the input grid (pink-shaded parallelopiped,
+aligned in scattering angle and energy transfer) is not parallel to the
+output grid (square grid, aligned in :math:`Q` and energy). This means
+that the output bins will only ever partially overlap the input data. To
+account for this, the signal :math:`Y` and errors :math:`E` in the output
+bin is calculated as the sum of all the input bins which overlap the
+output bin, weighted by the fractional overlap area :math:`F_i`:
+
+.. math:: Y^{\mathrm{out}} = (\sum_i Y^{\mathrm{in}}_i F_i) / \sum_i F_i
+.. math:: E^{\mathrm{out}} = \sqrt{\sum_i (E^{\mathrm{in}}_i F_i)^2} / \sum_i F_i
+
+.. warning:: Note that because the output bins contain fractions of multiple
+   input bins, the errors calculated for each output bins are no longer
+   independent, and so cannot be combined in quadrature. This means that
+   rebinning, summing, or integrating the output of this algorithm will 
+   give *incorrect error values* because those Mantid algorithms use the
+   quadrature formular and assume independent bins. The *signal*, on the
+   other hand should still be correct on rebinning. Unary operations, such
+   as scaling the signal will not encounter this problem.
+   
 The algorithm operates in non-PSD mode by default. This means that all
 azimuthal angles and widths are forced to zero. PSD mode will determine
 the azimuthal angles and widths from the instrument geometry. This mode
-is activated by placing the following named parameter in a Parameter
+is activated by placing the following named parameter in the instrument definition 
 file: *detector-neighbour-offset*. The integer value of this parameter
 should be the number of pixels that separates two pixels at the same
-vertical position in adjacent tubes.
-
-
-See  :ref:`algm-SofQWCentre` for centre-point binning  or :ref:`algm-SofQWPolygon`
-for simpler and less precise but faster binning strategies.
+vertical position in adjacent tubes. Note that in both non-PSD and PSD
+modes, the scattering angle widths are determined from the detector
+geometry and may vary from detector to detector as defined by the
+instrument definition files.
+
+See :ref:`algm-SofQWCentre` for centre-point binning or :ref:`algm-SofQWPolygon`
+for simpler and less precise but faster binning strategies. The speed-up
+is from ignoring the azimuthal positions of the detectors (as for the non-PSD
+mode in this algorithm) but in addition, :ref:`algm-SofQWPolygon` treats 
+all detectors as being the same, and characterised by a single width in
+scattering angle. Thereafter, it weights the signal and error by the fractional
+overlap, but does not then scale the weighted sum by :math:`\sum_i F_i`.
 
 Usage
 -----
diff --git a/docs/source/algorithms/SofQWPolygon-v1.rst b/docs/source/algorithms/SofQWPolygon-v1.rst
index 17c4c3c0327..8028ef3cc85 100644
--- a/docs/source/algorithms/SofQWPolygon-v1.rst
+++ b/docs/source/algorithms/SofQWPolygon-v1.rst
@@ -14,9 +14,30 @@ of spectrum number/**energy transfer** to
 the intensity as a function of momentum transfer 
 :math:`Q` and energy transfer :math:`\Delta E`. 
 
-The rebinning is done as a weighted sum of overlapping polygons. See 
-:ref:`algm-SofQWCentre` for centre-point binning  or :ref:`algm-SofQWNormalisedPolygon` for
-more complex and precise (but slower) binning strategy.
+The rebinning is done as a weighted sum of overlapping polygons.
+The polygon in :math:`Q-\Delta E` space is calculated from the
+energy bin boundaries and the detector scattering angle :math:`2\theta`.
+The detectors (pixels) are assumed to be uniform, and characterised
+by a single angular width :math:`\Delta2\theta`. The signal and error
+of the rebinned data (in :math:`Q-\Delta E` space) is then the
+sum of the contributing pixels in each bin weighted by their fractional
+overlap area:
+
+.. math:: Y^{\mathrm{out}} = (\sum_i Y^{\mathrm{in}}_i F_i)
+.. math:: E^{\mathrm{out}} = \sqrt{\sum_i (E^{\mathrm{in}}_i F_i)^2}
+
+Unlike the more precise :ref:`algm-SofQWNormalisedPolygon`
+algorithm, the final counts is not weighted by the sum of fractional
+areas which means that the signal will be underestimated where the
+bins are smaller, for example at the edges of detectors.
+However, like the other algorithm, the output workspace has bins which
+are no longer independent. Thus subsequent rebinning (or integration)
+of the output of the algorithm will give incorrect error values.
+
+See :ref:`algm-SofQWCentre` for centre-point binning.
+Alternatively, see :ref:`algm-SofQWNormalisedPolygon` for a
+more complex and precise (but slower) binning strategy, where the actual
+detector shape is calculated to obtain the input polygon.
 
 Usage
 -----
diff --git a/docs/source/images/RebinnedOutput.png b/docs/source/images/RebinnedOutput.png
new file mode 100644
index 0000000000000000000000000000000000000000..39e1a7c688435941fc70623fb6faf712097f5c18
GIT binary patch
literal 19263
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

literal 0
HcmV?d00001

diff --git a/docs/source/release/v3.12.0/spectroscopy.rst b/docs/source/release/v3.12.0/spectroscopy.rst
index 7839e668f78..c327a21767b 100644
--- a/docs/source/release/v3.12.0/spectroscopy.rst
+++ b/docs/source/release/v3.12.0/spectroscopy.rst
@@ -9,6 +9,9 @@ Spectroscopy Changes
     putting new features at the top of the section, followed by
     improvements, followed by bug fixes.
 
+- The algorithms :ref:`algm-SofQWCentre`, :ref:`algm-SofQWPolygon` and :ref:`algm-SofQWNormalisedPolygon`, which rebin an inelastic workspace (has a `DeltaE` axis) from spectrum numbers (angle) to `MomentumTransfer` may now rebin the energy (`DeltaE`) axis as well as the :math:`|Q|` (`MomentumTransfer`) axes.
+- :ref:`algm-SofQWNormalisedPolygon` now has uses a faster method for calculating the polygon intersections.
+
 Direct Geometry
 ---------------
 
-- 
GitLab