2017-07-26 32 views
0

我有一個星系列表可以繪製到healpix地圖上(我使用healpy來做)每個星系都有一個通量集,我需要讓它們以這樣一種方式繪圖:通量對於每個星系在地圖上是守恆的。用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

函數hp.mollview的參數xsize應僅用於繪圖目的。如果你想操縱地圖的分辨率,使用hp.pixelfunc.ud_grade

例如,如果你想要去的nside=8nside=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) 

將被保存在30

如果您需要mollview來保持通量,我無法提供解決方案。我能得到的最接近的是通過根據mollview圖像中的像素數量與hpm中的像素數量的比例縮小img值。第一項xsize * xsize/2.是mollview中的像素數,第二項2. * np.pi/8.是半長軸的長度爲半長軸的橢圓的面積與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

的另一種方式給你一個很好的近似是計算在你的地圖(這是768nside=8)非-inf像素數的img像素的數量之比:

float(len(hpm))/float(np.sum(img>=0)) * np.sum(img[img>0]) 

xsize = 100, 1000, 10000,通量將分別在28.295, 30.075, 29.998