Beam Interpolation Accuracy =========================== This page documents the interpolation accuracy of the three methods available via ``beam_interp_method``. The measurements set the effective noise floor of the sky-map lookup step; they are independent of beam pixel clustering (see :doc:`beam_cluster_calibration` for clustering quality metrics). .. note:: All measurements on this page used a **symmetric Gaussian beam with FWHM = 30 arcmin**. Two complementary tests are reported: * **Accuracy test** — relative RMS error against the harmonically smoothed map. Applicable to scalar (Temperature) fields. * **Rotational stability test** — RMS variation of the same pixel value under random beam rotations. Because the beam is azimuthally symmetric the ideal result is zero. This test is the most relevant benchmark for **polarisation fields (Q, U)**, where scan-angle-dependent artefacts directly bias E/B decomposition. The relative RMS metric is largely independent of beam shape; the main external factor is the ratio of beam FWHM to HEALPix pixel size (see :ref:`Interpolation accuracy floors `). Methods ------- Three interpolation strategies are compared: .. list-table:: :header-rows: 1 :widths: 12 20 68 * - Key value - Short name - Description * - ``'nearest'`` - NP — Nearest Pixel - Single nearest-pixel lookup. No blending; the raw pixel that is closest to the query direction is returned directly. * - ``'bilinear'`` - BI — Bilinear Interpolation - Weighted average of the 4 HEALPix neighbours returned by ``healpy.get_interp_weights``. Implemented as a fused Numba kernel. * - ``'gaussian'`` - GK — Gaussian Kernel - Isotropic Gaussian-weighted average over all pixels within ``beam_interp_radius_deg``. Metrics ------- **Accuracy** (:math:`\varepsilon`) For each combination of ``nside`` and beam pixel resolution the pipeline evaluates pointing directions that lie between pixel centres and computes: .. math:: \varepsilon = \frac{\mathrm{RMS}\!\left(v_{\mathrm{interp}} - v_{\mathrm{true}}\right)} {\mathrm{RMS}\!\left(v_{\mathrm{true}}\right)} where :math:`v_{\mathrm{true}}` is the value from the harmonically smoothed map. A smaller :math:`\varepsilon` means the method reproduces the true beam value more accurately. **Rotational stability** (:math:`\sigma_{\mathrm{rot}}`) The same pixel is evaluated repeatedly under different random rotations of the symmetric beam. The mean over rotations is taken as reference and the RMS spread around that mean is reported. A perfectly stable method returns zero. Any residual spread is a *pure interpolation artefact* — spurious signal that depends on the scan orientation rather than the sky. Accuracy Test Results --------------------- Beam pixel resolution: 0.5 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - RMS\ :sub:`NP` / RMS\ :sub:`true` - RMS\ :sub:`BI` / RMS\ :sub:`true` - RMS\ :sub:`GK` / RMS\ :sub:`true` * - 512 - 6.8838 × 10\ :sup:`−3` - 1.4477 × 10\ :sup:`−2` - 6.0139 × 10\ :sup:`−2` * - 1024 - 1.6464 × 10\ :sup:`−3` - 3.5470 × 10\ :sup:`−3` - 1.6263 × 10\ :sup:`−2` * - 2048 - 4.7922 × 10\ :sup:`−4` - 8.3853 × 10\ :sup:`−4` - 4.0962 × 10\ :sup:`−3` Beam pixel resolution: 1 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - RMS\ :sub:`NP` / RMS\ :sub:`true` - RMS\ :sub:`BI` / RMS\ :sub:`true` - RMS\ :sub:`GK` / RMS\ :sub:`true` * - 512 - 7.5959 × 10\ :sup:`−3` - 1.5329 × 10\ :sup:`−2` - 6.3000 × 10\ :sup:`−2` * - 1024 - 2.1361 × 10\ :sup:`−3` - 3.7801 × 10\ :sup:`−3` - 1.6360 × 10\ :sup:`−2` * - 2048 - 1.1955 × 10\ :sup:`−3` - 9.1339 × 10\ :sup:`−4` - 3.9902 × 10\ :sup:`−3` Beam pixel resolution: 5 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - RMS\ :sub:`NP` / RMS\ :sub:`true` - RMS\ :sub:`BI` / RMS\ :sub:`true` - RMS\ :sub:`GK` / RMS\ :sub:`true` * - 512 - 2.4216 × 10\ :sup:`−2` - 1.4279 × 10\ :sup:`−2` - 6.1118 × 10\ :sup:`−2` * - 1024 - 1.4897 × 10\ :sup:`−2` - 4.5058 × 10\ :sup:`−3` - 1.6636 × 10\ :sup:`−2` * - 2048 - 8.0256 × 10\ :sup:`−3` - 1.0050 × 10\ :sup:`−3` - 4.0215 × 10\ :sup:`−3` Rotational Stability Test Results ---------------------------------- The true value for each entry is taken as the mean of the measurements across all random rotations (per method). A smaller value means the method produces less scan-strategy-dependent noise. Beam pixel resolution: 0.5 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - :math:`\sigma_{\mathrm{rot}}` NP - :math:`\sigma_{\mathrm{rot}}` BI - :math:`\sigma_{\mathrm{rot}}` GK * - 512 - 5.7868 × 10\ :sup:`−8` - 4.9512 × 10\ :sup:`−9` - 3.9031 × 10\ :sup:`−9` * - 1024 - 5.8158 × 10\ :sup:`−8` - 1.8309 × 10\ :sup:`−9` - 1.6435 × 10\ :sup:`−9` * - 2048 - 4.7372 × 10\ :sup:`−8` - 3.1651 × 10\ :sup:`−9` - 3.1725 × 10\ :sup:`−9` Beam pixel resolution: 1 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - :math:`\sigma_{\mathrm{rot}}` NP - :math:`\sigma_{\mathrm{rot}}` BI - :math:`\sigma_{\mathrm{rot}}` GK * - 512 - 2.2433 × 10\ :sup:`−7` - 2.9950 × 10\ :sup:`−9` - 1.6019 × 10\ :sup:`−9` * - 1024 - 1.2888 × 10\ :sup:`−7` - 3.3884 × 10\ :sup:`−9` - 8.5575 × 10\ :sup:`−10` * - 2048 - 5.8937 × 10\ :sup:`−8` - 2.0596 × 10\ :sup:`−9` - 5.9404 × 10\ :sup:`−10` Beam pixel resolution: 5 arcmin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 15 28 28 28 * - ``nside`` - :math:`\sigma_{\mathrm{rot}}` NP - :math:`\sigma_{\mathrm{rot}}` BI - :math:`\sigma_{\mathrm{rot}}` GK * - 512 - 1.0637 × 10\ :sup:`−6` - 1.4274 × 10\ :sup:`−7` - 1.0797 × 10\ :sup:`−8` * - 1024 - 1.1303 × 10\ :sup:`−6` - 1.6688 × 10\ :sup:`−7` - 1.1263 × 10\ :sup:`−8` * - 2048 - 7.5001 × 10\ :sup:`−7` - 3.4450 × 10\ :sup:`−8` - 4.4106 × 10\ :sup:`−9` Key Observations ---------------- The two tests reveal a fundamental trade-off and together point to a clear recommendation. **The method ranking reverses between the two tests:** .. list-table:: :header-rows: 1 :widths: 40 30 30 * - Test - Best → Worst - Notes * - Accuracy (:math:`\varepsilon`) - NP ≤ BI ≪ GK - NP wins at fine beam pixel res (≤ 1 arcmin) * - Rotational stability (:math:`\sigma_{\mathrm{rot}}`) - GK ≤ BI ≪ NP - NP is 15–100× worse than BI at nside = 2048 **NP exhibits discrete-jump behaviour** under rotation. When the beam is rotated, a beam pixel direction can cross a HEALPix pixel boundary and snap to a new centre — a discontinuous jump proportional to the local sky gradient. This artefact is *largely independent of* ``nside`` (the NP rotational RMS barely improves when doubling the resolution) and grows sharply with beam pixel size. It introduces scan-strategy-dependent noise that is especially harmful for polarisation analysis. **GK is the most rotationally stable** method but the least accurate: its explicit smoothing suppresses boundary-crossing artefacts at the cost of blurring the true beam value. It is not recommended as a general-purpose choice; the method is still under development. **BI is the best overall compromise** — smooth (no discrete jumps, good rotational stability) and accurate (below 0.1 % at nside = 2048 for all beam pixel resolutions). **Bilinear interpolation is the recommended default for all use cases.** **All methods scale approximately as** ``nside``\ :sup:`2` **in the accuracy test**: doubling ``nside`` reduces :math:`\varepsilon` by roughly a factor of 4. In the rotational stability test NP shows much weaker scaling (the boundary-jump amplitude is not reduced by finer pixelisation alone), while BI and GK continue to improve. .. _interp_accuracy_floors: Interpolation Accuracy as a Pipeline Error Floor ------------------------------------------------- The interpolation errors measured above set the *noise floor* of the sky-map lookup step. No pipeline configuration — including beam pixel clustering — can reduce the total error below this floor. The table below shows the minimum ``nside`` required for bilinear interpolation to stay within common precision tiers across all beam pixel resolutions tested here. .. list-table:: :header-rows: 1 :widths: 38 22 20 20 * - Precision tier (relative RMS) - Bilinear threshold - Min. ``nside`` (5 arcmin beam) - Min. ``nside`` (0.5 arcmin beam) * - Loose / exploratory (< 5 %) - ``5.0e-2`` - 512 - 512 * - Standard (< 1 %) - ``1.0e-2`` - 1024 - 512 * - Tight (< 0.1 %) - ``1.0e-3`` - 2048 - 2048 * - Very tight (< 0.05 %) - ``5.0e-4`` - > 2048 - 2048 Practical notes: * **Use** ``'bilinear'`` **interpolation** (``beam_interp_method: bilinear``). It is accurate below 0.1 % at nside = 2048 and rotationally stable. The table above is calibrated for BI. * ``'nearest'`` interpolation may look better in the accuracy test at fine beam pixel resolution (≤ 1 arcmin), but its rotational instability (15–100× larger :math:`\sigma_{\mathrm{rot}}` than BI) makes it unsuitable for polarisation analysis and any pipeline that compares observations taken at different orientations. * **For polarisation fields (Q, U, E/B modes)** the rotational stability test is the primary benchmark. The accuracy table alone is insufficient; rotational stability should be considered as well. * The relative RMS metric is largely **independent of beam shape**: the interpolation operates on the HEALPix sky map, and the sub-pixel displacement distribution is determined by the HEALPix geometry, not by beam morphology. The values above apply regardless of beam asymmetry. * The metric **does depend on beam FWHM** relative to the HEALPix pixel size. The tables were measured with a 30 arcmin FWHM beam; for significantly narrower beams — where FWHM / pixel_size drops below ~4–5 — the sky map has more sub-pixel structure and the relative errors will be larger than listed here. .. note:: The ``clustering_error_threshold`` config key governs a *different* metric: the relative RMS divergence of the beam transfer function B_ℓ between the clustered and unclustered beam. That metric is defined and discussed separately on :doc:`beam_cluster_calibration`.