世界座標系用共有Pythonインタフェース

背景

♪the WCS クラスはFITSファイルの中で世界座標系を表すと考えられる最も一般的な“標準”を実現しているが,任意の複雑な変換を表すことはできず,FITSファイル以外の標準をどのように用いるかでは合意されていない.そのため、例えば他の世界座標系変換方法も存在する。 gwcs ジェームズ·ウェーバー宇宙望遠鏡のためのソフトウェアパッケージ(このパッケージは他のデータにも適用可能)を開発している。

Astropyプロジェクトの目標の1つは、パケット間の相互運用性を向上させることであるため、Pythonで世界座標系オブジェクトを使用するための標準化されたアプリケーションプログラミングインターフェース(API)を連携して定義した。このAPIは、Astropy Proposal for Enhancements(APE)14: A shared Python interface for World Coordinate Systems それがそうです。

コアAsterpyパッケージは、APE 14に記載された低レベルおよび高度なAPIを定義する基本クラスを提供する。 astropy.wcs.wcsapi モジュールはこれらに列挙されています 確認と許可 次の節です。

概要

APE 14ではAPIのすべての詳細と動機が詳細に紹介されているが、本稿では、Asterpyコアパッケージで直接実現される要素をまとめた。高度なインタフェースは,一般ユーザが最も興味を持っている可能性がある.特に最も重要な方法は pixel_to_world() そして world_to_pixel() 方法:研究方法。これらは、WCSの基本要素:世界座標へのマッピングと世界座標からのマッピングを提供する。残りの部分は通常関係を提供します kind 世界座標やWCS構造に関する類似情報.

より詳細には,ここで実現されるキークラスは,プライマリユーザインタフェースを提供する高度なクラスである. (BaseHighLevelWCS サブクラス),および下位レベルのインタフェース (BaseLowLevelWCS 和子類)。これらの対象は異なる対象であってもよい or 同じ人です。FITS-WCSでは WCS FITS-WCS用オブジェクトは,この2つのインタフェースに従い,FITS-WCSを含むファイルに対してただちにこのAPIを使用することを許可する.以下により具体的な例を概説する.

基本的用法

まずWCSの共有Pythonインタフェースを見てみましょう2つの天軸(右揚角と赤緯度)を持つ簡単な画像を使用しています

>>> from astropy.wcs import WCS
>>> from astropy.utils.data import get_pkg_data_filename
>>> from astropy.io import fits
>>> filename = get_pkg_data_filename('galactic_center/gc_2mass_k.fits')  
>>> hdu = fits.open(filename)[0]  
>>> wcs = WCS(hdu.header)  
>>> wcs  
WCS Keywords
Number of WCS axes: 2
CTYPE : 'RA---TAN'  'DEC--TAN'
CRVAL : 266.4  -28.93333
CRPIX : 361.0  360.5
NAXIS : 721  720

変換にいくつの画素軸と世界軸があるか,WCSが適用するデータの形状を調べることができる:

>>> wcs.pixel_n_dim  
2
>>> wcs.world_n_dim  
2
>>> wcs.array_shape  
(720, 721)

なお、配列形状は、データの形状と一致すべきである:

>>> hdu.data.shape  
(720, 721)

中で述べたとおり ピクセル約定と定義 一般に、画像と考えられる“y軸”は(視覚的に)第1の次元であり、画像の“x軸”は第2の次元である。だから、 array_shape 戻ります。 逆の FITSヘッダ中のNAXISキーワードをソートする(FITS-WCSの場合).逆の順序のデータ形状に興味があれば(FITS-WCSの場合、これはNAXIS順序と一致します)、ご利用いただけます pixel_shape **

>>> wcs.pixel_shape  
(721, 720)

各軸の物理的なタイプを調べてみましょう

>>> wcs.world_axis_physical_types  
['pos.eq.ra', 'pos.eq.dec']

これは確かに2つの天軸を持つ画像です

新しいインタフェースの主要部は座標を変換する標準的な方法を定義している.一番便利な方法は高度な方法を使うことです pixel_to_world() そして world_to_pixel() 星オブジェクトに直接変換することができます:

>>> coord = wcs.pixel_to_world([1, 2], [4, 3])  
>>> coord  
<SkyCoord (FK5: equinox=2000.0): (ra, dec) in deg
    [(266.97242993, -29.42584415), (266.97084321, -29.42723968)]>

同様に天体に変換することができます銀河座標を作成することでこれをテストすることができますこれらの座標は自動的に変換されます

>>> from astropy.coordinates import SkyCoord
>>> coord = SkyCoord('00h00m00s +00d00m00s', frame='galactic')
>>> pixels = wcs.world_to_pixel(coord)  
>>> pixels  
(array(356.85179997), array(357.45340331))

これらの画素座標を用いてオリジナルデータにインデックスを作成する場合は、変更することを確認してください world_to_array_index() これは、インデックスNumpy配列で座標を正しい順序で返し、最も近い整数値として四捨五入する。

>>> index = wcs.world_to_array_index(coord)  
>>> index  
(357, 357)
>>> hdu.data[index]  
563.7532

高度な用法

スペクトル立方体(2つの天軸と1つのスペクトル軸)のWCSを見てみましょう

>>> filename = get_pkg_data_filename('l1448/l1448_13co.fits')  
>>> hdu = fits.open(filename)[0]  
>>> wcs = WCS(hdu.header)  
>>> wcs  
WCS Keywords
Number of WCS axes: 3
CTYPE : 'RA---SFL'  'DEC--SFL'  'VOPT'
CRVAL : 57.6599999999  0.0  -9959.44378305
CRPIX : -799.0  -4741.913  -187.0
PC1_1 PC1_2 PC1_3  : 1.0  0.0  0.0
PC2_1 PC2_2 PC2_3  : 0.0  1.0  0.0
PC3_1 PC3_2 PC3_3  : 0.0  0.0  1.0
CDELT : -0.006388889  0.006388889  66.42361
NAXIS : 105  105  53

前述したように、変換にいくつの画素軸および世界軸があるか、およびWCSが適用されるデータの形状、および各軸の物理的タイプを検査することができる。

>>> wcs.pixel_n_dim  
3
>>> wcs.world_n_dim  
3
>>> wcs.array_shape  
(53, 105, 105)
>>> wcs.world_axis_physical_types  
['pos.eq.ra', 'pos.eq.dec', 'spect.dopplerVeloc.opt']

これは確かにRA/DECと速度軸があるスペクトル立方体です

前と同様に、画素と上位Astropyオブジェクトとの間で変換することができます:

>>> celestial, spectral = wcs.pixel_to_world([1, 2], [4, 3], [2, 3])  
>>> celestial  
<SkyCoord (ICRS): (ra, dec) in deg
    [(51.73115731, 30.32750025), (51.72414268, 30.32111136)]>
>>> spectral  
<SpectralCoord
   (target: <ICRS Coordinate: (ra, dec, distance) in (deg, deg, kpc)
                (57.66, 0., 1000.)
             (pm_ra_cosdec, pm_dec, radial_velocity) in (mas / yr, mas / yr, km / s)
                (0., 0., 0.)>)
  [2661.04211695, 2727.46572695] m / s>

裏::

>>> from astropy import units as u
>>> coord = SkyCoord('03h26m36.4901s +30d45m22.2012s')
>>> pixels = wcs.world_to_pixel(coord, 3000 * u.m / u.s)  
>>> pixels  
(array(8.11341207), array(71.0956641), array(7.10297292))

前と同様に,配列値をインデックス付けして用いることができる

>>> index = wcs.world_to_array_index(coord, 3000 * u.m / u.s)  
>>> index  
(7, 71, 8)
>>> hdu.data[index]  
0.22262384

高度な天体オブジェクトを使用せずに世界値を簡単なPythonスカラーまたはNumpy配列に変換したい場合、以下の方法を使用することができます。 pixel_to_world_values() そのためには-見てください 確認と許可 部分的にもっと詳しい情報を知っています。

拡張FITS-WCSにおける物理タイプ

以上のように, world_axis_physical_types 属性は、各軸の物理タイプリストを返します。FITS-WCSについては,これはヘッダ中のCTYPE値によって決定される.物理的なタイプが未知の場合には None 返されました。しかし、書き換えて使用することができます custom_ctype_to_ucd_mapping コンテキストマネージャ。以下のctypeを持つWCSを考える:

>>> from astropy.wcs import WCS
>>> wcs = WCS(naxis=1)
>>> wcs.wcs.ctype = ['SPAM']
>>> wcs.world_axis_physical_types
[None]

このctypeに対して物理的なタイプを指定することができます 'food.spam' **

>>> from astropy.wcs.wcsapi.fitswcs import custom_ctype_to_ucd_mapping
>>> with custom_ctype_to_ucd_mapping({'SPAM': 'food.spam'}):
...     wcs.world_axis_physical_types
['food.spam']

WCSオブジェクトのスライス

WCS情報が付加されたデータを処理する際には、一般的な動作は、WCSをスライスすることである−これは、データの部分領域を抽出するWCSであってもよく、全体の次元を保持している(例えば、画像から切り出す)、またはデータおよび関連するWCSの次元を低減することができる(例えば、スペクトル立方体からスライスを抽出する)。

♪the SlicedLowLevelWCS クラスはすべての適合をスライスするために使用することができる BaseLowLevelWCS 原料の薬。これを示すためにまずスペクトル立方体ファイルを読み取りましょう

>>> filename = get_pkg_data_filename('l1448/l1448_13co.fits')  
>>> wcs = WCS(fits.getheader(filename, ext=0))  

♪the wcs 相手は? WCS それは一致している BaseLowLevelWCS 原料の薬。そして私たちは SlicedLowLevelWCS 多次元データセットをスライスするためのクラス:

>>> from astropy.wcs.wcsapi import SlicedLowLevelWCS
>>> slices = [10, slice(30, 100), slice(30, 100)]  
>>> subwcs = SlicedLowLevelWCS(wcs, slices=slices)  

♪the slices パラメータはスライス,整数値,省略番号の任意の組合せを受け取り,これは通常Numpy配列をスライスする.上記の例では、スペクトルスライスを抽出しており、このスライスでは空の部分領域を抽出している。

自分のWCSクラスを実現している場合は、実現を選択することができます __getitem__ 内部で使われています SlicedLowLevelWCS それがそうです。実際には WCS クラスはこれを行うことができる−上記の例は、以下のようにより簡潔に書くことができる。

>>> wcs[10, 30:100, 30:100]  
<...>
SlicedFITSWCS Transformation

This transformation has 2 pixel and 2 world dimensions

Array shape (Numpy order): (70, 70)

Pixel Dim  Axis Name  Data size  Bounds
        0  None              70  None
        1  None              70  None

World Dim  Axis Name  Physical Type  Units
        0  None       pos.eq.ra      deg
        1  None       pos.eq.dec     deg

Correlation between pixel and world axes:

           Pixel Dim
World Dim    0    1
        0  yes  yes
        1  yes  yes

このスライスインフラストラクチャは、相関軸を有するWCSオブジェクトのスライスを処理することができ、この場合、最終的には、異なる数の画素および世界座標を有するWCSを得ることができる。例えば、スペクトルスライスの画像平面内の行に対応する1 Dデータセットを抽出するためにスペクトル立方体をスライスした場合、最終的なWCSは、1画素次元と2つの世界次元とを有する(RA/DECは抽出された1 Dスライス上で異なるので)。

>>> wcs[10, 40, :]  
<...>
SlicedFITSWCS Transformation

This transformation has 1 pixel and 2 world dimensions

Array shape (Numpy order): (105,)

Pixel Dim  Axis Name  Data size  Bounds
        0  None             105  None

World Dim  Axis Name  Physical Type  Units
        0  None       pos.eq.ra      deg
        1  None       pos.eq.dec     deg

Correlation between pixel and world axes:

           Pixel Dim
World Dim    0
        0  yes
        1  yes