Task 1 — Can pixell replace CMBpipeline's projection + flat-sky Fourier step?
SO configuration, signal only, binary mask. Plan: docs/02_test_plan.md (revision 4). Analysis: notebooks/01_pixell_validation.ipynb.
CMBpipeline commit 68ce262 (read-only); pixell 0.32.7, ducc0 0.38.0, healpy 1.18.1. 50 realizations, seeds 1000–1049.
1. What the original pipeline does in the projection/Fourier step
Documented in detail, with line references, in docs/01_current_pipeline.md. In short (SO case):
| step | CMBpipeline function | what it does |
|---|---|---|
| sky | utilities.make_maps → hp.synfast(pol=True) | Q, U on HEALPix nside 512, lmax 1535, no pixel window, COSMO convention |
| region | sph_mask.make_SO_mask | binary mask: hits > 0.25 within 100° of the maximum-hits pixel; f_sky = 0.111; no apodization |
| frame | rotate_geo.psi_Q_to_P, make_rot | rotates Q/U of every pixel to the frame of the patch centre, ψ ∈ [−76°, 78°] |
| projection | proj_2d.proj_conventions | azimuthal equidistant, x = θ sin φ (west), y = θ cos φ (north); pixels up to 56° from the centre |
| grid | proj_2d.grid_bins_mask_from_res_margin | griddata(method='cubic') (Clough–Tocher) onto 704 × 416 at 9.6′, 0 outside mask2d |
| Fourier | utilities.transf_eb2_np, PowerSpectrum.power | FFT with tfac = √(dx dy / nx ny), ℓ = |k|, dx = 9.553′, dy = 9.315′ (≠ 9.6′ grid pitch) |
| E/B | transf_eb2_np | E = cos2φ Q + sin2φ U, B = −sin2φ Q + cos2φ U with 2φ = 2 atan2(ℓ_y, −ℓ_x); periodic boundaries |
2. Which pixell functions replace each operation
| operation | CMBpipeline (A) | pixell, sphere (B) | why the pixell operation is appropriate |
|---|---|---|---|
| pixelization | HEALPix → equidistant plane 704 × 416 | enmap.fullsky_geometry(res=9.6′, variant='fejer1'), 2250 × 1125 | 9.6′ divides the sphere (1125 rings); fejer1 has exact ducc quadrature (quad_weights) |
| a_ℓm → Q/U | hp.alm2map then interpolation | curvedsky.alm2map(spin=[0,2]) | exact spin-2 synthesis at the pixel centres; same local (θ, φ) basis and sign as healpy (checked to 10⁻¹²) |
| frame rotation | ψ per pixel | none | CAR pixels are addressed in (Dec, RA): Q/U are defined w.r.t. local north everywhere, as on the sphere |
| projection + interpolation | equidistant + Clough–Tocher | none | maps are samples of the band-limited field, no resampling |
| mask | define_region_mask_from_res_margins | HEALPix mask read at each CAR pixel centre | the same nearest-pixel rule as CMBpipeline, same physical region (4583 deg²) |
| Q/U → E/B | flat FFT, transf_eb2_np | curvedsky.map2alm(spin=2, lmax=1124) | spherical spin-2 analysis with exact quadrature up to ℓ = 1124 (round trip 2×10⁻¹²) |
| E/B maps | irfft2 / tfac | curvedsky.alm2map(spin=0) | E, B are scalar fields |
| power spectrum | PowerSpectrum.power, ℓ = |k|, / w₂ | curvedsky.alm2cl of the a_E, a_B of the masked Q/U, / w₂ | multipoles are true ℓ; w₂ = area-weighted ⟨mask²⟩; no re-masking, no MASTER |
| cut-out region | — | B on the 1110 × 324 region of the mask: alm2map, map2alm(..., method='2d'), alm2map | pixell pads to the full sphere with exact weights: identical to full-sky B (10⁻¹³); default 'cyl' is approximate (4×10⁻⁴) |
Intermediate pipeline C uses curvedsky.rotate_alm (patch centre → (0, 0), exact Wigner-D rotation), alm2map on a 708 × 397 CAR patch,
and enmap.map2harm(normalize='phys', spin=[2]), whose queb_rotmat uses the HEALPix convention with the signed pixel step of laxes.
It keeps the flat FFT of A but samples the field exactly in a grid-aligned frame, so A − C isolates projection + interpolation + ψ, and C − B isolates the flat-sky Fourier treatment.
3. The mathematical difference between the approaches
Flat sky (A, C). The map is treated as a function on a periodic rectangle; with Fourier modes ℓ = (ℓ_x, ℓ_y) and φ_ℓ the angle of ℓ,
This is exact only for a field on a flat, periodic plane. On the SO patch three things break it: (i) the map from the sphere to the plane is not an isometry (equidistant: tangential stretch θ/sin θ up to 1.18; CAR: horizontal scale cos Dec), so a spherical multipole spreads over a range of |ℓ| and its centre shifts; (ii) Q/U must first be expressed in one global frame (A's ψ rotation), which is only approximate for a non-conformal map; (iii) the FFT assumes periodicity across the zero-filled edges.
Curved sky (B). Q ± iU are expanded in spin-weighted harmonics on the sphere,
which is defined in the local basis at every point, needs no global frame and assigns the true multipole ℓ. map2alm evaluates these integrals with exact
quadrature on the CAR rings. With a mask, the result is the harmonic transform of (mask × field): the only remaining effect is the coupling due to the footprint
itself (a narrow kernel, ~7 in ℓ for this mask) and the cut-sky E/B mixing (ambiguous modes near the edge), common to any method that does not purify.
4. Exact test configuration
| parameter | value |
|---|---|
| input | one set of a_ℓm^{T,E,B} from utilities.signal_spectrum(r=0.034) (CAMB lensed + tensor), TE = TB = EB = 0, curvedsky.rand_alm(seed) |
| band limit | lmax = 1535 (3 nside − 1) |
| beam | Gaussian FWHM 23′ (σ = 9.77′), applied once to a_E, a_B with almxfl; no pixel window |
| noise | none (signal only) |
| mask | SO binary mask on HEALPix nside 512 (349,440 pixels, 4582.5 deg², f_sky 0.1111), transferred by nearest HEALPix pixel; no apodization |
| A | 704 × 416 plane, 9.6′ pitch, margin 76.8′; FFT dx = 9.553′, dy = 9.315′; 189,097 pixels in mask2d |
| B | CAR fejer1 9.6′, 2250 × 1125 (full sky; patch in a 1110 × 324 box); map2alm lmax 1124; 286,159 pixels in the mask |
| C | rotated CAR patch 9.6′, 708 × 397, same margin; 186,278 pixels in the mask |
| controls | A′: FFT with dx = dy = 9.6′; B 6′: CAR fejer1 6′, 3600 × 1800, map2alm lmax 1535 |
| binning | compute_bins_fractional(4, 1000, 0.2, 20) = 4, 24, 44, 64, 84, 104, 125, 150, 180, 216, 259, 311, 373, 447, 537, 644, 773, 927, 1113; low ℓ: Δℓ = 10 from 2 to 102 |
| references | full-sky: alm2cl of the input; cut-sky (per pipeline): true E/B × its own 2D mask through its own transform |
| realizations | map level: seed 1000; spectra: 50 seeds (1000–1049), full and E-only inputs; mode mixing: 7 shells ℓ₀ ± 2, 10 realizations each |
5. Plots and quantitative results
5.1 Validation of the ingredients
| check | result |
|---|---|
cached triangulation vs CMBpipeline griddata | bit-identical |
pixell alm2map vs healpy Q/U | max difference 1.0×10⁻¹² of the RMS (same polarization convention) |
9.6′ fejer1 map2alm round trip, ℓ ≤ 1124 | 2.2×10⁻¹² (fails at ℓ = 1200: 0.96) |
rotate_alm(−λ_c, δ_c, 0) | T′(R n) = T(n) to 2.6×10⁻¹² |
| correlation of E with E_true (seed 1000) | A −0.9961 (sign flip predicted in Phase 1), B +0.9964, C +0.9961 |
| RMS(E − E_true)/RMS(E_true) in the mask | A 0.0918, B 0.0860, C 0.0931 |
5.2 E/B leakage (E-only input)
| distance to mask edge | 0–1° | 1–2° | 2–4° | 4–8° | > 8° |
|---|---|---|---|---|---|
| A | 0.291 | 0.115 | 0.096 | 0.080 | 0.052 |
| B | 0.263 | 0.084 | 0.065 | 0.053 | 0.035 |
| C | 0.277 | 0.101 | 0.082 | 0.067 | 0.056 |
RMS of the leaked B map / RMS of the true E map, seed 1000. The leakage sits at the edge in all pipelines; away from it B leaks ~30 % less than A.
| ℓ bin | B: leaked BB / theory BB | A − B | σ | C − B | σ |
|---|---|---|---|---|---|
| 4–24 | 23.76 | -15.414 | -9.1 | -15.818 | -9.1 |
| 24–44 | 2.63 | +0.224 | 9.4 | +0.140 | 6.2 |
| 44–64 | 2.30 | +0.290 | 11.6 | +0.193 | 8.8 |
| 64–84 | 2.34 | +0.375 | 16.4 | +0.215 | 13.1 |
| 84–104 | 2.28 | +0.427 | 15.6 | +0.303 | 18.1 |
| 104–125 | 2.22 | +0.426 | 20.6 | +0.264 | 17.0 |
| 125–150 | 1.90 | +0.373 | 27.6 | +0.251 | 19.9 |
| 150–180 | 1.45 | +0.244 | 31.0 | +0.159 | 20.8 |
| 180–216 | 1.08 | +0.200 | 27.9 | +0.137 | 27.2 |
| 216–259 | 1.04 | +0.344 | 45.1 | +0.186 | 30.4 |
| 259–311 | 1.29 | +0.671 | 82.1 | +0.385 | 46.5 |
| 311–373 | 1.72 | +0.998 | 75.5 | +0.588 | 82.7 |
| 373–447 | 1.96 | +0.805 | 78.5 | +0.621 | 87.4 |
| 447–537 | 1.93 | +0.333 | 54.9 | +0.342 | 51.7 |
| 537–644 | 2.68 | +0.549 | 61.4 | +0.453 | 55.3 |
| 644–773 | 5.67 | +1.263 | 66.1 | +1.281 | 70.1 |
| 773–927 | 19.64 | +5.820 | 65.2 | +5.545 | 73.0 |
| 927–1113 | 177.34 | +93.318 | 65.1 | +84.468 | 88.8 |
Mean over 50 realizations, paired differences in units of their standard error. From ℓ = 24 on, A leaks systematically more than B (9–82 σ), by 9–33 % of B's leakage below ℓ ≈ 260, 41–58 % at 260–450 and 17–53 % above; C's excess is 55–75 % of A's below ℓ ≈ 450 and about equal to it above. The first bin (4–24) goes the other way; see §7.
5.3 Power-spectrum recovery
| ℓ bin | A | A′ | B | C | B 6′ |
|---|---|---|---|---|---|
| 4–24 | 0.344 | 0.348 | 0.746 | 0.329 | 0.747 |
| 24–44 | 1.044 | 1.112 | 0.984 | 1.000 | 0.984 |
| 44–64 | 0.995 | 1.053 | 0.965 | 0.941 | 0.965 |
| 64–84 | 1.006 | 1.057 | 0.978 | 0.951 | 0.978 |
| 84–104 | 0.991 | 1.026 | 0.977 | 0.954 | 0.977 |
| 104–125 | 0.965 | 0.977 | 0.967 | 0.947 | 0.967 |
| 125–150 | 0.970 | 0.967 | 0.980 | 0.976 | 0.980 |
| 150–180 | 0.959 | 0.920 | 0.990 | 0.994 | 0.990 |
| 180–216 | 1.019 | 1.028 | 1.011 | 1.029 | 1.011 |
| 216–259 | 1.114 | 1.251 | 1.006 | 0.972 | 1.006 |
| 259–311 | 1.036 | 1.125 | 0.983 | 0.939 | 0.983 |
| 311–373 | 0.983 | 0.998 | 0.984 | 0.957 | 0.984 |
| 373–447 | 0.933 | 0.870 | 0.992 | 1.004 | 0.992 |
| 447–537 | 0.937 | 0.820 | 1.012 | 1.107 | 1.012 |
| 537–644 | 1.008 | 1.031 | 1.012 | 0.983 | 1.012 |
| 644–773 | 0.898 | 0.774 | 1.011 | 1.060 | 1.011 |
| 773–927 | 1.085 | 0.911 | 1.160 | 1.417 | 1.149 |
| 927–1113 | 1.542 | 1.369 | 1.526 | 1.854 | 1.440 |
EE / input realization (full-sky reference), mean of 50. This ratio contains both the mask and the pipeline: B stays within 0.965–1.012 for 24 ≤ ℓ < 773; A oscillates between 0.898 and 1.114 (power displaced in ℓ by the projection); A′ (true 9.6′ pitch) is worse (0.774–1.251); C deviates up to +10.7 % (cos Dec scale of the CAR patch). All pipelines lose power in the first bin and gain it above ℓ ≈ 800, where the beam has reduced the signal to ~10⁻³ and mask-edge power dominates.
| ℓ bin | B: EE / cut-sky ref | A − B | σ | C − B | σ |
|---|---|---|---|---|---|
| 4–24 | 0.778 | -0.087 | -3.5 | -0.085 | -3.2 |
| 24–44 | 0.917 | -0.006 | -2.0 | -0.002 | -0.6 |
| 44–64 | 0.963 | -0.002 | -1.9 | -0.003 | -2.5 |
| 64–84 | 0.976 | -0.003 | -4.5 | -0.001 | -1.3 |
| 84–104 | 0.982 | -0.003 | -3.7 | -0.003 | -4.7 |
| 104–125 | 0.986 | -0.004 | -6.0 | -0.003 | -4.4 |
| 125–150 | 0.987 | -0.003 | -6.7 | -0.002 | -4.4 |
| 150–180 | 0.986 | -0.004 | -8.3 | -0.002 | -5.9 |
| 180–216 | 0.981 | -0.004 | -7.3 | -0.002 | -4.4 |
| 216–259 | 0.987 | -0.003 | -7.2 | -0.003 | -7.8 |
| 259–311 | 0.994 | -0.004 | -20.9 | -0.002 | -11.4 |
| 311–373 | 0.996 | -0.003 | -31.7 | -0.002 | -14.2 |
| 373–447 | 0.996 | -0.004 | -43.8 | -0.001 | -12.4 |
| 447–537 | 0.990 | -0.006 | -35.1 | -0.001 | -5.1 |
| 537–644 | 0.988 | -0.012 | -75.0 | -0.002 | -14.2 |
| 644–773 | 0.987 | -0.021 | -93.0 | -0.002 | -11.0 |
| 773–927 | 0.914 | -0.052 | -69.5 | -0.003 | -4.1 |
| 927–1113 | 0.774 | -0.087 | -43.7 | -0.035 | -27.3 |
Relative to each pipeline's own cut-sky reference (which cancels the mask coupling), A loses systematically more EE to B than B does, 0.3 % at ℓ ≈ 100–450 growing to 2 % at 644–773 and 5–9 % above. Note that for the flat pipelines this reference also contains the projection's own mode mixing (see 5.4), so this table measures only the E/B-separation part.
5.4 Mode mixing
| ℓ₀ | width A | B | C | A ref | B ref | C ref | A no mask | C no mask | shift A | B | C |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 30 | 7.9 | 7.1 | 7.1 | 8.4 | 7.7 | 7.9 | 7.5 | 6.9 | +0.2 | +0.7 | +0.8 |
| 60 | 7.4 | 6.8 | 8.2 | 7.6 | 6.9 | 8.5 | 8.0 | 7.5 | -0.1 | +0.5 | +1.2 |
| 100 | 9.1 | 6.7 | 9.2 | 9.4 | 6.8 | 9.4 | 10.0 | 9.3 | -0.6 | +0.5 | +1.6 |
| 200 | 14.8 | 6.8 | 12.7 | 15.1 | 6.9 | 12.9 | 16.7 | 14.8 | -1.9 | +0.5 | +2.3 |
| 400 | 24.9 | 6.8 | 21.9 | 25.3 | 6.9 | 22.2 | 31.5 | 27.3 | -3.7 | +0.3 | +4.0 |
| 600 | 36.5 | 6.9 | 31.6 | 36.8 | 6.9 | 31.9 | 46.9 | 38.9 | -6.3 | +0.1 | +5.8 |
| 800 | 48.5 | 6.9 | 39.6 | 48.6 | 6.9 | 39.9 | 62.5 | 49.8 | -9.0 | -0.1 | +7.5 |
Width = 84th − 16th percentile of the response (the paper's Table 5 definition); shift = ⟨ℓ⟩ − ℓ₀. B's width is constant (~6.9): it is the SO footprint kernel (the unmasked B returns the shell exactly, width ~5 = the shell itself). A's width grows linearly with ℓ₀ (48.5 at 800) and its centroid moves to lower ℓ (−9.0 at 800), consistent with the paper's App. B (23.8 at ℓ₀ = 800 for a smaller patch without mask). A's cut-sky reference has the same width, so the broadening comes from placing the exact field on the plane and FFT-ing it, not from the E/B separation. Without mask A is even wider (62.5), because the whole rectangle reaches larger distances from the centre. C broadens too (39.6) and shifts to higher ℓ (+7.5), from the cos Dec scale of the CAR patch.
5.5 Computational time
| pipeline | steps | time per realization |
|---|---|---|
| A as in CMBpipeline | alm2map 0.47 s + rotate/project/griddata 8.47 s + flat E/B 0.02 s | 8.97 s |
| A, cached triangulation | same interpolant, triangulation built once | 3.27 s |
| B (full sky) | alm2map 0.24 s + map2alm 0.21 s | 0.45 s |
| B on the cut-out region | alm2map + map2alm (method 2d) + alm2map on 1110 × 324 | 0.37 s |
| C | rotate_alm + alm2map + map2harm | 1.12 s |
One realization, 12 threads available (pixell/ducc and healpy are multi-threaded; scipy's interpolation is not).
6. Which flat-sky/projection approximations are removed, reduced, or still present
| approximation (Phase 1) | A | C | B | evidence |
|---|---|---|---|---|
| sphere → plane map (equidistant, non-isometric) | present | replaced by CAR patch (cos Dec 0.79–1) | removed | mode-mixing width 48.5 / 39.6 / 6.9 at ℓ₀ = 800 |
| Clough–Tocher interpolation | present | removed | removed | exact synthesis; A's Q/U residual 3 %, transfer 0.978 at ℓ = 1000 (preliminary Phase 3 run) |
| global Q/U frame (ψ rotation, non-conformal) | present (1.4° RMS, 4.3° max off the projection frame; preliminary Phase 3 run) | removed | removed | CAR axes are local meridians |
| ℓ = |k| on the plane; dx/dy ≠ grid pitch | present | ℓ = |k| with mean CAR step | removed | EE/input ±11 % (A), ±3.5 % (B) |
| periodic FFT on a zero-filled patch | present | present | removed | C − B leakage excess 6–88 σ |
| flat beam exp(−k²σ²/2) | present (loss/OQE only) | — | removed | not exercised here (beam applied to a_ℓm) |
| cut-sky E/B mixing of the binary mask | present | present | present | leakage 26–29 % of RMS(E) within 1° of the edge in all three |
| finite band limit of the grid | ℓ_N ≈ 1125 | ℓ_N ≈ 1125 | reduced: exact to 1124; 6′ control exact to 1799 | 9.6′ vs 6′ identical to 0.1 % below ℓ ≈ 650 |
7. Discrepancies and unresolved issues
- E/B sign of CMBpipeline. A's E and B are −1 × the healpy/pixell convention (correlation −0.996). No effect on spectra, but maps must be sign-flipped to compare.
- dx/dy vs grid pitch. The FFT uses 9.553′ × 9.315′ while the grid is built at 9.6′. Surprisingly, A′ (true pitch) matches the input worse than A (EE/input 1.25 vs 1.11 at ℓ ≈ 240, 0.77 vs 0.90 at ℓ ≈ 700): the smaller dx/dy partly offsets the equidistant shift to lower ℓ. Whether this is intentional is unknown.
- Area. Counting the plane pixels as flat 9.6′ squares gives 4841 deg² instead of 4583 deg² (+5.6 %).
- Paper vs code. "Cubic spline" is Clough–Tocher
griddata; Eq. B.1 writes ℓ(ℓ+1) ↔ k² while the code uses ℓ = |k|; App. A validates the projection with temperature only on 55.8 deg². - CMBpipeline bug.
proj_2d.deprojectionfails on the rectangular 704 × 416 grid (it passesgrid.Twith axes (y, x); for square grids the two swaps cancel). - Lowest bin (ℓ = 4–24). B shows more leakage than A and C (23.8 vs 8.4 × theory BB). The flat pipelines have fundamental modes Δℓ ≈ 3–5 and recover only ~34 % of the input EE there (B: 75 %), so they cannot represent these scales; this is not evidence that the plane is better, but it is not resolved here.
- High ℓ (> 800). Beam-limited (B_ℓ² ~ 10⁻³) and dominated by power coupled from the sharp mask edge in every pipeline; these bins say little about the projection.
- References. For the flat pipelines the cut-sky reference contains the projection's mode mixing, so "EE / cut-sky reference" hides it; the mode-mixing test and "EE / input" show it. No MASTER deconvolution is done anywhere (out of scope), so absolute low-ℓ spectra are mask-biased in all pipelines.
- Not tested. Noise, apodization/purification (dropped at your request), the network, the loss function and the OQE.
- pixell on partial maps.
map2almon a cut-out needsmethod='2d': the default'cyl'gives 4×10⁻⁴ (equatorial box) and 2×10⁻³ (rotated patch) relative errors.
8. Follow-up: pixel sizes, controls, and a 2D image for the network
8.1 CAR pixel size
B's 2250 × 1125 map is the whole sphere. Each pixel is 9.6′ in Dec and 9.6′ of RA, i.e. 9.6′ × cos(Dec) of true arc in RA, because every ring has the
same 2250 pixels while its circumference is 2π cos Dec (checked with enmap.pixshapemap):
| Dec | height | width | area |
|---|---|---|---|
| 0° | 9.60′ | 9.60′ | 92.2 arcmin² |
| −25° (patch north edge) | 9.60′ | 8.70′ | 83.5 arcmin² |
| −47.5° (patch centre) | 9.60′ | 6.48′ | 62.3 arcmin² |
| −73° (patch south edge) | 9.60′ | 2.81′ | 26.9 arcmin² |
So along Dec B samples exactly like A (ℓ_N ≈ 1125) and along RA it is finer everywhere in the patch: never coarser than A. The unequal areas do not bias B,
because map2alm uses the exact ring quadrature weights. They would bias a flat FFT, which is why C rotates the patch to the equator first
(Dec −73…−25° → −38…+23°, cos Dec ratio 3.1 → 1.27).
8.2 Why the 6′ control
B at 9.6′ was chosen to match A, but at 9.6′ map2alm is exact only up to ℓ = 1124 while the input goes to 1535 (beamed variance above 1125:
~6×10⁻⁶), and the mask edge is a coarser staircase. The 6′ run (exact to 1799, finer edge) checks that these limits do not drive the A–B differences:
the two agree to 0.1 % below ℓ ≈ 650 and differ by 3–8 % above ℓ ≈ 800 (e.g. EE / cut-sky reference 0.80 vs 0.77 in the last bin), where A is still
worse (0.69). The pixel size is set by the beam and the band limit: 9.6′ is adequate below ℓ ≈ 650 and marginally limiting above ℓ ≈ 800.
8.3 Why C's mask looks like A's
C is also a map of the sphere onto a rectangle centred on the patch with north up (cylindrical, plate carrée after the rotation), and A is azimuthal equidistant. Both keep distances along the two central axes exactly, and within the patch they differ by at most ~5°:
| sky point, C's (RA′, Dec′) | same point on A's plane (x, y) |
|---|---|
| (0°, 30°) | (0.0°, 30.0°) |
| (50°, 0°) | (50.0°, 0.0°) |
| (30°, 20°) | (28.7°, 20.9°) |
| (50°, 30°) | (44.9°, 33.8°) |
| (−50°, −35°) | (−43.0°, −39.3°) |
That is why C inherits a similar flat-sky mode mixing (39.6 vs 48.5 at ℓ₀ = 800) while B, on the same kind of CAR pixels but never treated as a plane, does not (6.9). B is displayed in equatorial RA/Dec, where the patch (Dec −73° to −25°) looks different; for B the shape of the picture is only a display choice.
8.4 Pipeline B on the cut-out region: a smaller array, still curved sky
The full 2250 × 1125 map is ~89 % zeros. Notebook section 6b runs pipeline B on the region that contains the mask only: the rows and columns of the 9.6′ fejer1 grid around mask_B (1110 × 324 = 359,640 pixels, 14 % of the sphere, of which 286,159 observed). The steps are the same as in B, never treating the map as a plane:
- Q, U with
curvedsky.alm2map(spin=2)directly on the cut-out geometry; - multiply by the mask on the cut-out;
curvedsky.map2alm(spin=2, method='2d')→ a_E, a_B: the cut-out is a slice of the full-sky fejer1 grid, so pixell pads it with zeros back to the sphere and uses the exact ring quadrature;curvedsky.alm2map(spin=0)→ E, B maps on the same 1110 × 324 cut-out.
| comparison with the full-sky pipeline B | result |
|---|---|
| Q/U on the cut-out vs full-sky Q/U on the same pixels | 1.2×10⁻¹³ |
| a_E, a_B | 1.6×10⁻¹⁴ |
| E/B maps on the cut-out vs full-sky E/B on the same pixels | 1.7×10⁻¹³ |
| C_ℓ^EE, C_ℓ^BB, 2 ≤ ℓ ≤ 1124 | identical to 1×10⁻¹³ |
| RMS(E − E_true)/RMS(E_true) in the mask | 0.0860 (full sky: 0.0860) |
same, with the default method='cyl' | a_ℓm off by 4.0×10⁻⁴ (approximate ring weights) |
| time (alm2map + map2alm + alm2map) | 0.37 s |
So the curved-sky pipeline can run on an array of the size of the observed region, with results identical to the full sphere, as long as map2alm is called with method='2d'. Two remarks for using such an array as the 2D input of a network (not done in Task 1): the E/B fields of a masked sky extend slightly outside the mask and are truncated at the border of the cut-out (the a_ℓm and spectra are unaffected); and in equatorial CAR the pixels of this region are 9.6′ tall but 2.8′–8.7′ wide (§8.1), so the image is not isotropic. If that matters for the convolutions, the same procedure works on a patch rotated to the equator (pixels 7.6′–9.6′ wide; also exact with method='2d', 7×10⁻¹⁴), keeping every harmonic step on the sphere.