使用synalm生成的字段的Cls与输入Cls和使用synfast生成的字段的Cls不同

时间:2019-01-18 16:00:26

标签: healpy

我正在从输入角功率谱Cl生成随机healpix映射。如果我使用healpy.synalm,然后使用healpy.alm2map,最后通过在生成的图上运行healpy.anafast来测试图,则输出和输入功率谱不一致,尤其是在高l时,输出功率谱在输入之上(See plot produced by code below)。如果直接使用healpy.synfast,则会得到与输入一致的输出功率谱。如果我使用来自healpy.synfast的施舍,并使用healpy.alm2map从synfast施舍生成地图,则同样适用。当我查看synfast的源代码时,似乎只调用synalm和alm2map,所以我不明白为什么它们的结果不一致。我的测试代码如下:

import numpy as np
import matplotlib.pyplot as plt
import classy
import healpy as hp

NSIDE = 32


A_s=2.3e-9
n_s=0.9624
h=0.6711
omega_b=0.022068
omega_cdm=0.12029

params = {
'output': 'dCl, mPk',
'A_s': A_s,
'n_s': n_s,
'h': h,
'omega_b': omega_b,
'omega_cdm': omega_cdm,
'selection_mean': '0.55',
'selection_magnification_bias_analytic': 'yes',
'selection_bias_analytic': 'yes',
'selection_dNdz_evolution_analytic': 'yes'}

cosmo = classy.Class()
cosmo.set(params)
cosmo.compute()
theory_cl=cosmo.density_cl()['dd']

data_map,data_alm=hp.synfast(theory_cl[0],NSIDE,alm=True)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synfast")
data_map=hp.alm2map(data_alm,NSIDE)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synfast using alm")

data_alm=hp.synalm(theory_cl[0])
data_map=hp.alm2map(data_alm,NSIDE)
data_cl=hp.anafast(data_map)
plt.plot(np.arange(len(data_cl)),data_cl,label="synalm")

plt.plot(np.arange(min(len(data_cl),len(theory_cl[0]))),theory_cl[0][:len(data_cl)],label="Theory")
plt.xlabel(r'$\ell$')
plt.ylabel(r'$C_\ell$')
plt.legend()
plt.show()

对于较低的NSIDE,偏移会变大。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对不起,我错过了synfast知道NSIDE的知识,因此默认情况下lmax是基于NSIDE的,而synalm则不知道,因此它将输入光谱的最大值l作为lmax。在synalm中将lmax设置为3 * NSIDE -1可以解决差异。