犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

healpyのコンベンション(pixelfunc)

2012-10-06 11:31:28 | Weblog
healpyのレファレンスだけでは
はっきりしない動作を確認してみる。
まずはpixelfuncから。

● 極座標の取り方
ang2vec()の動作から。


inubuyo@~$ python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import healpy
>>> healpy.pixelfunc.ang2vec(0, 0)
array([ 0., 0., 1.])

この座標の北極方向。


>>> import math
>>> healpy.pixelfunc.ang2vec(math.pi, 0)
array([ 1.22464680e-16, 0.00000000e+00, -1.00000000e+00])

南極方向。


>>> healpy.pixelfunc.ang2vec(math.pi, math.pi)
array([ -1.22464680e-16, 1.49975978e-32, -1.00000000e+00])

極方向では、結果は第2引数に対し精度の範囲で変わる。

赤道方向。

>>> healpy.pixelfunc.ang2vec(math.pi/2, 0)
array([ 1.00000000e+00, 0.00000000e+00, 6.12323400e-17])
>>> healpy.pixelfunc.ang2vec(math.pi/2, math.pi/2)
array([ 6.12323400e-17, 1.00000000e+00, 6.12323400e-17])
>>> healpy.pixelfunc.ang2vec(math.pi/2, math.pi)
array([ -1.00000000e+00, 1.22464680e-16, 6.12323400e-17])


ang2vec()の戻り値、vec2ang()の引数はnumpyのarrayである。

>>> import numpy
>>> healpy.pixelfunc.vec2ang(numpy.array([1, 0, 0]))
(array([ 1.57079633]), array([ 0.]))
>>> healpy.pixelfunc.vec2ang(numpy.array([0, 1, 0]))
(array([ 1.57079633]), array([ 1.57079633]))
>>> healpy.pixelfunc.vec2ang(numpy.array([0, 0, 1]))
(array([ 0.]), array([ 0.]))
>>> healpy.pixelfunc.vec2ang(numpy.array([-1, 0, 0]))
(array([ 1.57079633]), array([ 3.14159265]))
>>> healpy.pixelfunc.vec2ang(numpy.array([0, -1, 0]))
(array([ 1.57079633]), array([ 4.71238898]))
>>> healpy.pixelfunc.vec2ang(numpy.array([0, 0, -1]))
(array([ 3.14159265]), array([ 0.]))


これらは逆関数になっている。

>>> healpy.pixelfunc.vec2ang(healpy.pixelfunc.ang2vec(math.pi/2, math.pi/2))
(array([ 1.57079633]), array([ 1.57079633]))
>>> healpy.pixelfunc.vec2ang(healpy.pixelfunc.ang2vec(math.pi/2, math.pi))
(array([ 1.57079633]), array([ 3.14159265]))
>>> healpy.pixelfunc.vec2ang(healpy.pixelfunc.ang2vec(math.pi/2, 0))
(array([ 1.57079633]), array([ 0.]))


逆の合成は、そのままだと型が合わない。

>>> healpy.pixelfunc.ang2vec(healpy.pixelfunc.vec2ang(numpy.array([1, 0, 0])))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ang2vec() takes exactly 2 arguments (1 given)


戻り値をばらす。

>>> x =healpy.pixelfunc.vec2ang(numpy.array([1, 0, 0]))
>>> healpy.pixelfunc.ang2vec(x[0], x[1])
array([[ 1.00000000e+00, 0.00000000e+00, 6.12323400e-17]])


ベクトルの絶対値は1でなくても正ならよい。

>>> healpy.pixelfunc.vec2ang(numpy.array([3, 0, 0]))
(array([ 1.57079633]), array([ 0.]))


以上で任意の方向を表すベクトルと極座標の変換ができる。

● ピクセル番号と方向の変換

ピクセル番号に対する方向はpix2ang()とpix2vec()で得られる。
基本となるNSIDE=1の場合の12個のピクセルの方向は、極座標で以下の通り。

>>> healpy.pixelfunc.pix2ang(1, 0)
(0.84106867056793033, 0.78539816339744828)
>>> healpy.pixelfunc.pix2ang(1, 1)
(0.84106867056793033, 2.3561944901923448)
>>> healpy.pixelfunc.pix2ang(1, 2)
(0.84106867056793033, 3.926990816987241)
>>> healpy.pixelfunc.pix2ang(1, 3)
(0.84106867056793033, 5.4977871437821371)
>>> healpy.pixelfunc.pix2ang(1, 4)
(1.5707963267948966, 0.0)
>>> healpy.pixelfunc.pix2ang(1, 5)
(1.5707963267948966, 1.5707963267948966)
>>> healpy.pixelfunc.pix2ang(1, 6)
(1.5707963267948966, 3.1415926535897931)
>>> healpy.pixelfunc.pix2ang(1, 7)
(1.5707963267948966, 4.7123889803846897)
>>> healpy.pixelfunc.pix2ang(1, 8)
(2.3005239830218631, 0.78539816339744828)
>>> healpy.pixelfunc.pix2ang(1, 9)
(2.3005239830218631, 2.3561944901923448)
>>> healpy.pixelfunc.pix2ang(1, 10)
(2.3005239830218631, 3.926990816987241)
>>> healpy.pixelfunc.pix2ang(1, 11)
(2.3005239830218631, 5.4977871437821371)


関数pix2vec()と、ang2vec()とpix2ang()の合成は値は同じであるが、型と精度が異なる。

>>> healpy.pixelfunc.pix2vec(1, 0)
(0.52704627669472992, 0.52704627669472981, 0.66666666666666663)
>>> x = healpy.pixelfunc.pix2ang(1, 0)
>>> healpy.pixelfunc.ang2vec(x[0], x[1])
array([ 0.52704628, 0.52704628, 0.66666667])


同様に、関数pix2ang()と、vec2ang()とpix2vec()の合成は値は同じであるが、型と精度が異なる。

>>> healpy.pixelfunc.pix2ang(1, 0)
(0.84106867056793033, 0.78539816339744828)
>>> healpy.pixelfunc.vec2ang(numpy.array(healpy.pixelfunc.pix2vec(1, 0)))
(array([ 0.84106867]), array([ 0.78539816]))


pix2ang()の第2引数は配列にできる。

>>> healpy.pixelfunc.pix2ang(1, [0, 4])
(array([ 0.84106867, 1.57079633]), array([ 0.78539816, 0. ]))


順序は自由、同じ値が入っても大丈夫。

>>> healpy.pixelfunc.pix2ang(1, [4, 0])
(array([ 1.57079633, 0.84106867]), array([ 0. , 0.78539816]))
>>> healpy.pixelfunc.pix2ang(1, [0, 0])
(array([ 0.84106867, 0.84106867]), array([ 0.78539816, 0.78539816]))


pix2ang()の第1引数も配列にできる。

>>> healpy.pixelfunc.pix2ang([1, 2], 0)
(array([ 0.84106867, 0.41113786]), array([ 0.78539816, 0.78539816]))


だが、両方の引数を配列にしてしまうと、第2引数は最初の要素のみが使われる。

>>> healpy.pixelfunc.pix2ang([1, 2], [0, 1])
(array([ 0.84106867, 0.41113786]), array([ 0.78539816, 2.35619449]))
>>> healpy.pixelfunc.pix2ang([1, 2], 0)
(array([ 0.84106867, 0.41113786]), array([ 0.78539816, 0.78539816]))


pix2ang()の逆がang2pix()である。

>>> healpy.pixelfunc.ang2pix(1, 0.84106867, 0.78539816)
0

もちろん、あるピクセルに対応するのは1点ではなく、広さを持った領域である。

>>> healpy.pixelfunc.ang2pix(1, 0.84, 0.78)
0

合成すればピクセルの中心への射影になる。

>>> healpy.pixelfunc.pix2ang(1, healpy.pixelfunc.ang2pix(1, 0.84106867, 0.78539816))
(0.84106867056793033, 0.78539816339744828)


今日はここまで。