読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

CFITSIO とその Perl 版をいじってみたメモ

単なるメモ.そのうちどこかでまとめる,かも.

試したこと
  • cfitsio のインストール
  • Astro::FITS::CFITSIO のインストール
  • ヘッダの読み出し
  • アレイ情報の読み出し
  • イメージの読み出し
  • イメージ・ヘッダの書き込み
# とりあえずインストール
sudo apt-get install libcfitsio3 libcfitsio3-doc
(libastro-fits-cfitsio-perl がある...そっちのが楽かも)

# tutorial for C
example01 -> ヘッダ情報を表示するプログラム
example02 -> アレイの情報を表示するプログラム
example03 -> 画像情報をアスキーに直すプログラム
example04 -> 画像情報を読んで test.fits に書き出すプログラム



# perl もいんすとーるしてみた
sudo apt-get install libastro-fits-cfitsio-perl

use Astro::FITS::CFITSIO;
でリンクできるみたい. C 言語で作ったやつを Perl でも作ってみたい.

名前のショートカットを有効にするためには
use Astro::FITS::CFITSIO qw( :shortnames );
use Astro::FITS::CFITSIO qw( :constants );
も加える必要がある.好みに応じて short->long に変えればよい.
 shortnames だったら ffopen みたいに短い名前で実行できるので楽.
(その分名前をたくさん覚えなきゃいけないけども...)

# open_file()
こいつだけは Astro::FITS::CFITSIO:: を頭につけなければならない?
そんなことなかった.ffopen(&fptr, file, TYPE, &status) でいけた.

# read_header()
read_hader() の使いかたが分かった.でもちょっと使いにくいかもしれない.

my $hash_ref;
$hash_ref = $fptr->read_header();
for (keys %$hash_ref) {
    printf "%-12s = %s\n", $_, $$hash_ref{$_};
}

最初 $hash_ref の意味が分からなくて焦った.

# ffghsp() fitsfile-get-header-space
# ffgrec() fitsfile-get-record
とりあえずヘッダーの容量を読んでループ回して読み出してみた.
これならコメントも読める.
ハッシュは魅力的だけどキーワードは順番も重要なのでとりあえずおあずけしておこう.


# ffgidm() fitsfile-get-image-dimension
# ffgisz() fitsfile-get-image-size
ヘッダからイメージサイズを読み出す. ffgisz の引数は cfitsio のそれとはちょっと異なるので注意.
 maxdim がいらないのと naxes はアレイじゃなくてスカラーを渡す.アレイのリファレンスが帰ってくる.

# ffgipr() fitsfile-get-image-paramter
上記の 2 つをいっぺんにやってくれる.ついでに bitpix も取得してくれる.
 naxes はアレイのリファレンスだよということさえ覚えていれば問題無し.

# ffgipxv() fitsfile-get-image-pixel-value
nulval はよく分からないので 0 を渡した. anynul は多分フラッグなので適当に変数を渡せばよい.
 fpixel は読み始める最初のピクセル?アレイで定義してアレイのリファレンスを渡した.
 nelments は合計のピクセル数なので naxes を掛け合わせた.
出力のアレイは cfitsio とは違って array[x][y] の形式(リファレンスだけど)できた.びっくり.
これ 3 次元のデータキューブだとどうなるんだろうか...この形式をうまく取り扱う方法を知らない.

# ffinit() fitsfile-initiation
ポインタとファイルを与えれば自動的に fits 形式のファイルを作ってくれる.
ただしファイルは上書きできないのですでに存在している時はエラーにするか削除してから作るか.

# ffcrim() fitsfile-create-image
作成した fits ファイル中にイメージアレイを作成する命令.
軸の数と軸の長さをそれぞれ与えなければならない.あとピクセルの保存形式も.

# ffppx() fitsfile-put-pixel
作成したイメージアレイにピクセルデータを埋め込む命令. ffpss() をつかえば部分的に書き変えも可能.
データはやっぱり @array で定義して \@array で渡した方がいいかも.その方がわかりやすい?
標準入力から array データをゲットできそうなので他のプログラムとの連携も問題なさそう.

# ffprec() fitsfile-put-record
一行ずつヘッダーを書き込んでいくコマンド.ヘッダーがを表す文字列がすでにできているときは有効.
これ以外にハイレベルな命令が十分にあるのでそちらを使った方がいいかもしれない.
ちなみにイメージを書き込む前( ffppx の前) にこの命令を使ったら書き込んだピクセルがすべて 0 に
変換されてしまった.書き込む順序があるのかもしれない.