def mkfullsky(corr, nside, alms=False): """Construct a set of correlated Healpix maps. Make a set of full sky gaussian random fields, given the correlation structure. Useful for constructing a set of different redshift slices. Parameters ---------- corr : np.ndarray (lmax+1, numz, numz) The correlation matrix :math:`C_l(z, z')`. nside : integer The resolution of the Healpix maps. alms : boolean, optional If True return the alms instead of the sky maps. Returns ------- hpmaps : np.ndarray (numz, npix) The Healpix maps. hpmaps[i] is the i'th map. """ numz = corr.shape[1] maxl = corr.shape[0]-1 if corr.shape[2] != numz: raise Exception("Correlation matrix is incorrect shape.") trans = np.zeros_like(corr) for i in range(maxl+1): trans[i] = nputil.matrix_root_manynull(corr[i], truncate=False) la, ma = healpy.Alm.getlm(maxl) matshape = la.shape + (numz,) # Construct complex gaussian random variables of unit variance gaussvars = (np.random.standard_normal(matshape) + 1.0J * np.random.standard_normal(matshape)) / 2.0**0.5 # Transform variables to have correct correlation structure for i, l in enumerate(la): gaussvars[i] = np.dot(trans[l], gaussvars[i]) if alms: alm_freq = np.zeros((numz, maxl+1, maxl+1), dtype=np.complex128) for i in range(numz): alm_freq[i] = hputil.unpack_alm(gaussvars[:, i], maxl) return alm_freq hpmaps = np.empty((numz, healpy.nside2npix(nside))) # Perform the spherical harmonic transform for each z for i in range(numz): hpmaps[i] = healpy.alm2map(gaussvars[:,i].copy(), nside) return hpmaps
def test_pack_unpack_half(): pck1 = np.arange(10.0, dtype=np.complex128) pck2 = hputil.pack_alm(hputil.unpack_alm(pck1, 3)) assert np.allclose(pck1, pck2).all()