在healpy中将旋转应用于HEALPix贴图

时间:2014-07-08 15:54:22

标签: python rotator healpy

我有一张HEALPix地图,我已经使用healpy读过,但是它在银河坐标中,我需要它在天体/赤道坐标。有人知道转换地图的简单方法吗?

我尝试使用healpy.Rotator将(l,b)转换为(phi,theta),然后使用healpy.ang2pix重新排列像素,但地图看起来仍然很奇怪。

如果有一个类似于Rotator的函数可以调用,那就太好了:map = AnotherRotator(map,coord=['G','C'])。有人知道任何这样的功能??

谢谢,

亚历

3 个答案:

答案 0 :(得分:3)

我意识到很久以前就问过这个问题,但本周我自己也遇到了同样的问题并找到了你的帖子。我找到了几个可能的解决方案,所以我会分享其他人遇到这个并发现它很有用。

解决方案1 ​​:这取决于您的数据的格式。我的网格来自(theta,phi)。

import numpy as np
import healpy as H
map = <your original map>
nside = <your map resolution, mine=256>
npix = H.nside2npix(nside)
pix = N.arange(npix)
t,p = H.pix2ang(nside,pix) #theta, phi

r = H.Rotator(deg=True, rot=[<THETA ROTATION>, <PHI ROTATION>])

map_rot = np.zeros(npix)

for i in pix:
    trot, prot = r(t[i],p[i])
    tpix = int(trot*180./np.pi) #my data came in a theta, phi grid -- this finds its location there
    ppix = int(prot*180./np.pi)
    map_rot[i] = map[ppix,tpix] #this being the rright way round may need double-checking

解决方案2 :还没有完成测试,但是在上面做了烦人的工作之后就碰到了它...

map_rot = H.mollview(map,deg=True,rot=[<THETA>,<PHI>], return_projected_map=True)

给出了一个2D numpy数组。我很想知道如何将它转换成healpix地图......

答案 1 :(得分:3)

我找了另一个潜在的解决方案,搜索了几个月后。我还没有测试过,所以请小心!

上面的Saul的解决方案2 是关键(很棒的建议!)

基本上,您将healpy.mollviewgnomviewcartvieworthview工作的功能)与reproject_to_healpix功能的功能结合起来reproject个包{(3}})。

生成的地图适合我的角度尺度,但我不能说转换与其他方法相比有多准确。

-----基本纲要----------

第1步:读入地图并通过cartview制作矩形阵列。正如Saul所说,这也是进行轮换的一种方式。如果您只是进行标准的旋转/坐标转换,那么您需要的只是coord关键字。从天体到银河坐标,设置coord = ['C','G']

map_Gal = hp.cartview(map_Cel, coord=['C','G'], return_projected_map=True, xsize=desired_xsize, norm='hist',nest=False)

第2步:编写模板全天空FITS标头(如下例所示)。我写了我的,以获得与我想要的HEALPix地图相同的平均像素比例。

第3步:使用reproject.transform_to_healpix

reproject包括用于将“普通”数组(或FITS文件)映射到HEALPix投影的函数。将其与返回由healpy.mollview / cartview / orthview / gnomview创建的数组的能力相结合,您可以将一个坐标系(Celestial)的HEALPix地图旋转到另一个坐标系(Galactic)。

map_Gal_HP, footprint_Gal_HP = rp.reproject_to_healpix((map_Gal, target_header), coord_system_out= 'GALACTIC', nside=nside, nested=False)

基本上,它归结为这两个命令。但是你必须制作一个模板标题,给出与你想制作的中间全天映射相对应的像素比例和大小。

-----完整工作示例(iPython笔记本格式+ FITS样本数据)------

http://reproject.readthedocs.org/en/stable/

那里的代码应该运行得非常快,但这是因为地图严重降级。我为我的NSIDE 1024和2048地图做了同样的事情 大约一个小时。

------图像之前和之后------

https://github.com/aaroncnb/healpix_coordtrans_example/tree/master

NSIDE 128, Celestial Coordinates: *Before*

答案 2 :(得分:0)

这个函数似乎可以解决问题(相当慢,但应该比for循环更好):

def rotate_map(hmap, rot_theta, rot_phi):
    """
    Take hmap (a healpix map array) and return another healpix map array 
    which is ordered such that it has been rotated in (theta, phi) by the 
    amounts given.
    """
    nside = hp.npix2nside(len(hmap))

    # Get theta, phi for non-rotated map
    t,p = hp.pix2ang(nside, np.arange(hp.nside2npix(nside))) #theta, phi

    # Define a rotator
    r = hp.Rotator(deg=False, rot=[rot_phi,rot_theta])

    # Get theta, phi under rotated co-ordinates
    trot, prot = r(t,p)

    # Interpolate map onto these co-ordinates
    rot_map = hp.get_interp_val(hmap, trot, prot)

    return rot_map

对来自PyGSM的数据使用此内容可得到以下结果:

hp.mollview(np.log(rotate_map(gsm.generated_map_data, 0,0)))

enter image description here

轮换phi

hp.mollview(np.log(rotate_map(gsm.generated_map_data, 0,np.pi)))

enter image description here

或转动theta

hp.mollview(np.log(rotate_map(gsm.generated_map_data, np.pi/4,0)))

enter image description here