使用HEALPy保存像素计数

时间:2017-07-26 14:13:14

标签: python maps astronomy healpy

我有一个星系列表可以绘制到healpix地图上(我使用healpy来做)每个星系都有一定的通量,我需要让它们以每个星系的通量绘制在地图上保存。

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import healpy as hp
pi = np.pi

nside = 8
xsize = 100

ra = np.array([pi/4,pi/3])
dec = np.array([pi/4,pi/3])
flux = np.array([10,20])

hpm = np.zeros(hp.nside2npix(nside)) #Blank healpix map
pixindex = hp.ang2pix(nside, dec, ra)

np.add.at(hpm,pixindex,flux) #Add flux onto correct pixels

img=hp.mollview(hpm,coord=['E'],xsize=xsize,return_projected_map=True)
print(np.sum(img[img>0]))

我得到的结果是140而不是30,这是通量的真实总和。

我得到了正在发生的事情并且相同的通量分布在多个像素上(第一个星系为6个,第二个为4个像素),我知道我可以做到:

newimg = img * (np.sum(flux)/np.sum(img[img>0]))

这将保存总光子数,但它不一定能保存每个星系的光子数,这正是我所需要的。即这种方法最终导致第一个星系的通量为12.86,第二个星系的通量为17.14。

有没有一种方法可以在每个坐标占用多少个像素之前进行计算,然后根据这个来改变转储的磁通量?

提前致谢!

1 个答案:

答案 0 :(得分:1)

函数xsize的{​​{1}}参数应仅用于绘图目的。如果您想操纵地图的分辨率,请使用hp.mollview

例如,如果您想从hp.pixelfunc.ud_grade转到nside=8

行后

nside=32

np.add.at(hpm, pixindex, flux) #Add flux onto correct pixels 函数与ud_grade一起使用,因此可以节省总流量:

power=-2

总和

hpm_nside_32 = hp.pixelfunc.ud_grade(hpm, power=-2, nside_out=32)

将在np.sum(hpm_nside_32) 保存。

如果您需要使用mollview来保持通量,我无法提供解决方案。我可以得到的最接近的是通过基于mollview图像中的像素数量与hpm中的像素数量的比率来缩小img值。第一项30是mollview中的像素数,第二项xsize * xsize / 2.是椭圆的面积与半长轴的半长轴长度的一半2. * np.pi / 8.的比率{{ 1}}到矩形区域pi * r * 2r

4r * 2r

len(hpm) / ((xsize * xsize / 2.) * (2. * np.pi / 8.)) * np.sum(img[img > 0]) 时,总和将变为xsize = 100;当27.380时,近似值要好得多,xsize = 1000;当29.981时,总流量变为xsize = 10000

另一种为您提供良好近似值的方法是计算29.988中非-inf像素数与地图中像素数之比(img for 768):

nside=8

float(len(hpm)) / float(np.sum(img>=0)) * np.sum(img[img>0]) ,通量将分别为xsize = 100, 1000, 10000