如何使用 Python(而不是 ~10 度误差)将 TESScut 中的星星绘制到天空中的正确位置?

How to plot a star from TESScut to the right place on the sky using Python (and not with a ~10 degree error)?

我想绘制 Beta Dor 的 TESS 测量值,使用来自 TESScut. In the Gaia DR2 archive 的数据我查找 Beta Dor 的 RA 和 DEC 值,我得到:

RA: 83.40630967798376 DEC:  -62.48977125108528 

我去TESScut,将这两个值放入select扇区1,然后Download FFI Cutout。解压下载的文件,然后在 Python 我做:

import matplotlib.pyplot as plt
from lightkurve import TessTargetPixelFile
import numpy as np

sector1ffi_cutout='tess-s0001-4-4_83.40630967798376_-62.48977125108528_64x64_astrocut.fits'
tpf_s1 = TessTargetPixelFile(sector1ffi_cutout)

fig = plt.figure(figsize=(5,5))
fig.add_subplot(111, projection=tpf_s1.wcs)
plt.pcolormesh(np.log(tpf_s1.flux[0]))
plt.show()

给我:

其中,从坐标 (~ -53°, ~6h30min) 来看显然是错误的,根据盖亚(和其他来源),恒星不在这个位置。

我哪里做错了,我怎样才能把这颗星标到它应该在的地方?


为了完整起见,当我绘制星星时,我收到以下警告:

> /home/szabopal/.local/lib/python3.5/site-packages/ipykernel_launcher.py:10:
> RuntimeWarning: divide by zero encountered in log   # Remove the CWD
> from sys.path while we load stuff.
> /home/szabopal/.local/lib/python3.5/site-packages/ipykernel_launcher.py:10:
> RuntimeWarning: invalid value encountered in log   # Remove the CWD
> from sys.path while we load stuff.
> /home/szabopal/.local/lib/python3.5/site-packages/astropy/visualization/wcsaxes/grid_paths.py:73:
> RuntimeWarning: invalid value encountered in greater   discontinuous =
> step[1:] > DISCONT_FACTOR * step[:-1]
> /home/szabopal/.local/lib/python3.5/site-packages/astropy/visualization/wcsaxes/grid_paths.py:73:
> RuntimeWarning: invalid value encountered in greater   discontinuous =
> step[1:] > DISCONT_FACTOR * step[:-1]
> /home/szabopal/.local/lib/python3.5/site-packages/astropy/visualization/wcsaxes/grid_paths.py:73:
> RuntimeWarning: invalid value encountered in greater   discontinuous =
> step[1:] > DISCONT_FACTOR * step[:-1]
> /home/szabopal/.local/lib/python3.5/site-packages/astropy/visualization/wcsaxes/grid_paths.py:73:
> RuntimeWarning: invalid value encountered in greater   discontinuous =
> step[1:] > DISCONT_FACTOR * step[:-1]

进一步发展

我认为上述问题是 wcs 引用整个 FFI 而不是 cutout 引起的。

print(tpf_s1.wcs)

给出:

WCS Keywords

Number of WCS axes: 2
CTYPE : 'RA---TAN-SIP'  'DEC--TAN-SIP'  
CRVAL : 90.634460449219  -57.666290283203  
CRPIX : 250.0  -984.0  
PC1_1 PC1_2  : 1.0  1.0  
PC2_1 PC2_2  : 1.0  1.0  
CDELT : 0.00571299832697903  0.005705604460241471  
NAXIS : 81986  1282

这个问题源于 matplotlib 处理 WCS 投影的方式的微妙之处。

WCSAxes,它为 maplotlib 图创建 WCS 投影,没有考虑 WCS 中的 SIP 失真(因为它使用 wcs.wcs_world2pix 而不是 wcs.all_world2pix)。

通常这并不重要,但是在显示 TESScut 切口时,有两个因素可能会使其变得非常重要。首先是 TESScut 生成的 TPF 带有针对剪切位置调整的全帧图像的原始 WCS 信息。这意味着,与 TESS 管道 TPF 中的 WCS 信息不同,TESScut TPFS 中的 WCS 信息包括 SIP 失真的完整补充,而这些失真被 matplotlib 忽略。显示坐标准确度的第二个因素是源落在 TESS CCD 上的位置。由于 TESS 视场很大,在全帧图像的边缘,忽略 SIP 失真所产生的差异可能约为 15 个像素。

这个特定的来源非常接近 FFI 的边缘,因此 SIP 失真会产生很大的差异:

有两种方法可以解决这个问题:

  1. 不要直接使用 matplotlib 投影选项,而是将所有内容移动到像素 space,根据需要手动调用 wcs.all_world2pix 或 wcs.allpix2world。

  2. 为不包括 SIP 失真的切口创建一个新的 WCS(这很好,因为切口足够小,实际上不需要它们)。这是一个 Jupyter notebook,它描述了为切口制作这个新 WCS 的一种方法:https://github.com/ceb8/tessworkshop_wcs_hack/blob/master/tesscut_wcs_hack.ipynb