healpy

Healpy map2alm function does not return expected number of alm values


healpy.map2alm computes an array of alm values for an input Healpix map.

The function is

healpy.sphtfunc.map2alm(maps, lmax=None, mmax=None, iter=3, pol=True, use_weights=False, regression=True, datapath=None)`

The parameter lmax determines the number of alm coefficients. One sets the input lmax and the code returns '(lmax+1)**2` number of alm coefficients.

l=0 returns a00.

l=1 returns a11, a10, a1-1 + a00, i.e. 4 coefficients.

l=2 returns a22, a21, a20, a2-1, a2-2, i.e. 5+3+1 = 9 coefficients. That is (lmax+1)**2 = 3**2 = 9 coefficients.

However, using healpy, this is NOT the output I get, irrespective on the map I chose.

import numpy as np
import healpy as hp
nside = 16                         # healpix nside parameter

filename = "cmb_fullsky_map.fits"  # generic name for sky map

readmap = hp.read_map(filename)    # read in the map

# We then use healpy.map2alm(readmap) to generate an array of alm values

ell0 = hp.map2alm(readmap, lmax = 0)    # lmax = 0 should output a00
ell0.shape                              # 1 value
print "l=0 has " + str(len(ell0))
print ell0

ell1 = hp.map2alm(readmap, lmax = 1)    # lmax = 1 should outputs
ell1.shape                              # a11, a10, a1-1 
print "l=1 has " + str(len(ell1))       # 3 values
print ell1

ell2 = hp.map2alm(readmap, lmax = 2)    # lmax = 2 should output
ell2.shape                              # a22, a21, a20, a2-1, a2-2
print "l=2 has " + str(len(ell2))       # 5 values
print ell2

ell3 = hp.map2alm(readmap, lmax = 3)    # lmax = 3 should output 
ell3.shape                              # a33, a32, a31, a30, a3-1, a3-2, a3-3
print "l=3 has " + str(len(ell3))       # 7 values
print ell3

ell4 = hp.map2alm(readmap, lmax = 4)    # lmax = 4 should output
ell4.shape                              # a44, a43, a42, a41, a40, a4-1, a4-2,
print "l=4 has " + str(len(ell4))       # a4-3 a4-4
print ell4                              # 9 values

ell32 = hp.map2alm(readmap, lmax = 32)  # lmax = 32 should output
ell32.shape                             # (lmax+1)**2 = 33**2 = 1089 coefficients
print "l=32 has " + str(len(ell32))     # 65 values

My output is not what I would expect by (lmax+1)**2.

l=0 has 1
[  2.39883065e-06+0.j]
l=1 has 3
[  2.39883065e-06 +0.00000000e+00j   4.49747594e-06 +0.00000000e+00j
  -5.39401197e-07 +1.07974023e-06j]
l=2 has 6
[  2.38695037e-06 +0.00000000e+00j   4.49747594e-06 +0.00000000e+00j
  -2.93559509e-05 +0.00000000e+00j  -5.39401197e-07 +1.07974023e-06j
  -1.75256654e-05 -1.57729954e-05j   1.65489261e-05 -1.41571515e-05j]
l=3 has 10
[  2.38695037e-06 +0.00000000e+00j   4.51148696e-06 +0.00000000e+00j
  -2.93559509e-05 +0.00000000e+00j   1.19817810e-05 +0.00000000e+00j
  -5.37909950e-07 +1.07783971e-06j  -1.75256654e-05 -1.57729954e-05j
  -7.17416081e-06 +9.14176685e-06j   1.65489261e-05 -1.41571515e-05j
  -2.64725172e-06 -3.09988314e-05j  -7.25462692e-06 -6.33251313e-07j]
l=4 has 15
[  2.38534350e-06 +0.00000000e+00j   4.51148696e-06 +0.00000000e+00j
  -2.93586471e-05 +0.00000000e+00j   1.19817810e-05 +0.00000000e+00j
  -1.72252485e-06 +0.00000000e+00j  -5.37909950e-07 +1.07783971e-06j
  -1.75253044e-05 -1.57728790e-05j  -7.17416081e-06 +9.14176685e-06j
  -1.30606717e-05 -4.21675061e-06j   1.65464103e-05 -1.41578955e-05j
  -2.64725172e-06 -3.09988314e-05j   1.09072312e-05 +3.22054569e-06j
  -7.25462692e-06 -6.33251313e-07j  -1.10079209e-06 +9.39495982e-07j
  -8.01588627e-06 -8.03762608e-06j]
l=32 has 561

Do you see the discrepancy?

For lmax=0, I expect a total of 1. healpy outputs 1

For lmax=1, I expect a total of 4. healpy outputs 3

For lmax=2, I expect a total of 9. healpy outputs 6

For lmax=3, I expect a total of 16. healpy outputs 10

For lmax=4, I expect a total of 25. healpy outputs 15

For lmax=32, I expect a total of 1089. healpy outputs 561

Question: Should I act together outputs in order to get the correct total number of arrays?

Please how map2alm executes this operation.


Solution

  • It is due to symmetry. m=-1 and m=1 have the same transform, so HEALPix considers only m>=0.

    So for example lmax=2 we have:

    6 coefficients total.

    The length of the alm array is expected to be: mmax * (2 * lmax + 1 - mmax) / 2 + lmax + 1).