Python Scripting on IRAF
(PyRAF を用いたデータ処理入門）
高田 唯史(国立天文台・天文データセンター）

今日の講習内容Pythonについて(すごく簡単に）
PyRAFを知る（インタラクティブに使ってみる）
Pythonを使ったスクリプトを作ってPyRAFを用いた画像処理を行ってみるPythonについて
 オブジェクト指向スクリプト言語
 1990年にオランダ人Guido van Rossum氏によって開発されたプログラミング言語
 その可読性の高さ、利用のしやすさ、拡張性の高さなどから世界的に利用者が広がり、将来性も豊かであるとされている
 フリーソフトであり、関連する様々なライブラリも大変多く出回っている Python Software Foundationがライセンスを持つ
http://www.python.org/

PyRAFについて
 STScIの中で開発が進んでいるstsci_pythonソフト
ウェア群の中核をなすもの
http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python

 clの短所を乗り越えるため、幅広く利用されているス
クリプト言語でIRAF環境を利用できるように考えられたもの（特にエラー処理など）
 「IDLのようなコマンドラインによるデータアクセスと小細工をできる環境の提供」を目的とする
 2003年ぐらいにはかなりしっかりとした形になってきていた。

PyRAFとIRAF

clPython
IRAF Wrapper(PyRAF)

IRAF本体（実行プログラムとかclスクリプト）

PyRAFを使うメリット
Pythonの文法を知っていれば簡単にスクリプトが組めるPythonの参考書・WEBサイトは非常に多い
外部ソフトウェアとの連携が簡単(豊富なライブラリ： 今日の例はプロッティング・ソフト）clでは出来ないことがいくつか出来る既に枯れていると思われるIRAFのタスクを一般的なスクリプト言語からIRAFと連携良く呼べる

PyRAFとIRAF（ｃｌ）で出来ることの違い
 PyRAFにはｂｙｅはない(タスクunloadができない）
 PyRAFではGOTO文が使えない
 PyRAFではbackground処理は出来ない
 Error traceback はCL line numberを出力しない
 上矢印キーでヒストリー参照でき、左右矢印で編集可能
 Ctrl-Rキーでhistoryのパターンマッチができる等
 Tabキーでコマンド補完 セッション情報をファイルに書ける。またそれをrestoreできる。
 グラフ・ウィンドウを複数開ける
 パラメータエディット(epar)がGUIでできる(helpもそこで参照可能）(詳細はPyRAF Tutorialなどを参照のこと）

PyRAFを使うための準備
IRAFを利用できる環境に自分たちの環境を設定する
作業用のディレクトリにおいて、% xgterm （xgtermを起動）% mkiraf （IRAFの環境を整備）(terminal-typeはxgtermを指定すること）% ds9 & (SAOimage DS9が起動できることを確認)

PyRAFをインタラクティブで使ってみるeparの実行・確認(helpとの連動）
複数のウィンドウを起動する
Historyやコマンド補完機能の確認
displayタスクの実行 --> display dev$pix 1 fill+imexamineタスクの実行--> imexamine 1（’ｒ’や’e’といった基本的なコマンド確認）

Python-likeなタスクの実行方法--> iraf.display（”dev$pix”,1,fill=yes） 等Pyrafを用いたPythonスクリプトを書く準備スクリプトの基本（”Hello Python”と書こう！！）標準入出力とループの回し方
関数の定義の仕方と使い方
リストの使い方（配列に相当）条件分岐の方法

実習１-1：Hello Pythonと出力しようPythonプログラムの走らせ方を学ぶ
他の文字を出力したり、色々試してみよう
参考プログラム/data/takata/Python/hello.py

実習１-２：入出力とループの回し方
標準入力からのファイル名獲得とループ
ファイル： /data/takata/Python/list_file.py

ファイルリスト(ファイル）からの情報取り込み
ファイル： /data/takata/Python/list_file2.py

引数の2番目からあと全部TABでインデント(forループなどのブロックを意味する）

実習１-3：関数の定義と使い方

あるリスト(配列）の値に“ paper”という文字を付け加えて返す関数
サンプルプログラム/data/takata/Python/def_check.py

リスト“colors”の定義
関数“append_chars”の定義

Range(4) => cnt を0～3で1ずつ増やす

(実習２）imstatを使って複数のFITSファイルの統計量を測定する
ファイルは以下のものを使用する/data/takata/Image/Fimage_R??.fits

サンプルプログラムは以下のものを使用する/data/takata/PyRAF/imstat_all.py

サンプルプログラムを改良して、各画像ファイルの[100:500,100:500]の領域の平均値とメジアン値、モード値を求めなさい

PyRAFのインポート“iraf”としてインポートしたクラスのメソッドimstatを呼ぶ

実習３：複数の画像をDS9に並べて表示するプログラムを書いてみる
IRAFのdisplayコマンドを用いる
最後にタイル状に並べてみる(DS9の機能）
ds9のメニューから、“frame->tile”
使用するデータ：/data/takata/Image/Image_R0?.fits

サンプルプログラム: /data/takata/PyRAF/display_all.py
注意：uparm/tvdisply.par の中で以下のような定義になっていることが必要。
image,f,a," ",,,"image to be displayed"frame,i,a,1,1,16,"frame to be written into“
bpmask,f,h,"BPM",,,"bad pixel mask".......

フレームバッファを画像毎に切り替えている実習４：画像のヘッダーの情報を取得する
画像ファイルがどの日時（UT）に取得されたかをヘッダー情報から得る
imgetsタスクを用いること
使用データ：/data/takata/Image/Image_R0?.fits

サンプルプログラム:/data/takata/PyRAF/read_header.py(課題）/data/takata/Imageの中からRバンドで取得されたデータのファイル名を得て全て並べなさい。
(ヒント：FILTER01キーワードの値が“W-C-RC”のものがそれ。）

“imgets”でヘッダーの値を取得し、そのvalueがヘッダー値として獲得できる書式制御の方法

実習５：複数画像のシフトアンドアッドを行う
プログラムを書いてみる displayで表示した画像をimexamineで調べ、全てのフレームに写っている共通の天体の（ｘ、ｙ）座標を測る。
（Stdplot=1オプションを利用する）
 測定した（ｘ、ｙ）座標をoffset情報を格納するファイルに書き込む
 imcombineを用いてoffset情報を使いながら足し合わせる
サンプルプログラム： /data/takata/PyRAF/shift_add.py
データ： /data/takata/Image/Image_R0?.fits
ターゲットの星の上で “a” ボタン
終了するためには ”q” ボタン（imexamineのカーソルキーの使用方法と同じ）

 応用課題：画像ファイルもリストファイルにする実習６：imstatで得た情報をグラフにしてみる。
Imstatで画像の平均値を取得
取得した情報をPythonのリストに格納Matplotlibを用いてグラフを作成
（結果のグラフをEPSファイル出力する）
サンプルプログラム：/data/takata/PyRAF/plot_imstats.py
データ： /data/takata/Image/Image_R0?.fits

応用課題：横軸をデータ取得時間にしてプロットしてみよう。
※ Matplotlibについては http://matplotlib.sourceforge.net/index.html を参照

実習７（時間があれば）マルチCPUコアを意識した並列処理をしてみるPython2.6より利用可能になった
multiprocessingクラスを用いて、imstatやimarithの並列処理を行ってみる
2並列にしたからといって必ず処理効率が2倍になるわけではない
データ: /data/takata/SUPA????????.fits
プログラム：/data/takata/Python/test-mp.py/data/takata/PyRAF/test-mp_pyraf.py
比較用のシーケンシャル処理用のスクリプト/data/takata/Python/test-seq.py/data/takata/PyRAF/test-seq_pyraf.py

プロセス４つ立ち上げる“map”:関数fに対して、引数としてあるリストを渡せる関数

マルチ・プロセス

シングル・プロセス終わりに これはあくまでもPyRAFへの入り口に過ぎない これ以外にもいくつもの便利な機能と合体して、使いやすいプログラムを比較的簡単にできる(ハズ）、、、 （ネットワーク経由型など)
 Pythonの外部ライブラリとうまく共用すれば、画像処理結果の分かり易い記述や、GUIを用いた画像処理＋表示ソフトを組める
 PyRAFへのタスクの登録、エラー処理、イベント処理などは本講習の範疇に含めなかったが、PyRAFのTutorialを読むと結構色々わかります。
より良い使い方を知った方は、是非とも本講習会で披露して欲しい。

参考資料(Python)

みんなのPython

はじめてのPython3

初めてのPythonPyRAFの参考資料
PyRAFホームページ
http://www.stsci.edu/resources/software_hardware/pyraf

PyRAFドキュメント群
http://stsdas.stsci.edu/stsci_python_epydoc/
PyRAF Tutorial (May 2002)
PyRAF Programmer's Guide (Version 1.0, May 2004)
Interactive Data Analysis with Python Tutorial (May 2007)
The PyRAF Tutorial
http://stsdas.stsci.edu/pyraf/doc.old/pyraf_tutorial/pyraf_tutorial.html

A Quick Tour of Python
http://stsdas.stsci.edu/pyraf/doc.old/python_quick_tour/