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