NAOJ/ADC IDL 講習会資料 (2014 Dec)

IDL 初〜中級者のための天文データ解析用

IDL講座
大山陽一
ASIAA （台湾）

重要なお断り• IDLは、RSI(->ITT->Exelis Visual Information
Solutions)（とその販売代理店）の商品です。大山は彼らとはいっさい関係なく、金銭その他の利便の提供も受けていません。
• IDLに義理は無いので、IDLの宣伝はしません。
– 大山は１ユーザーとしてIDLの良さを認識して、皆さんにお勧めしますが、買ってくれなくても結構です。

• IDL のライセンス料が高いという苦情は、私は受け付けませんし、どうにもできません。
– 最初は ADC のユーザーとして IDL を使用したら良いでしょう。

• 今後の IDL 使用環境については、ADC のスタッフと相談してください。
– 大山は ADC の経営企画に関与していません。

なにはなくとも参考書• Practical IDL programming– By L. E. Gumley (MORGAN Kaufmann 発行）– 超おすすめ。１教室に１冊常備。 ¥8103 at Amazon– ユーティリティーも気が利いていて、使える。

• IDLHELP (online 版) ‘Idlhelp’ on unix shell• IDL をインストールすれば、自動的についてくる。

– 検索機能が強力。使える。
– 最初に見るのは、Getting started with IDL• でも、これを見て絶望する人がいるかも。

– 常用するのは、Reference guide• Coyote’s Guide to IDL programming– By David Fanning– http://www.dfanning.com/index.html• Web 上の tips 集も面白い。
• 中級以上？

• IDLプログラミング入門―基本概念から3次元グラフィックス作成
まで― (KS理工学専門書) (伊藤 ただし)
– まさかこんな本が日本語で発売されるとは。。。すばらしい。

講習内容の大枠– 初級者コースの講習 -> 最近無くなってしまいました。

• 今回の講習会：より実践的な講習• 天文 FITS ２次元画像解析アプリへの応用を念頭に。。。

– IDL 基礎・特徴のおさらい– IDL の特徴を活かしたプログラミング– デバッグの基礎– サブルーチン化– 実習

IDL 言語の特徴• IDL の基礎の基礎の復習です。
• IDL の特徴が活かせるアプリケーションとは？
• キーワード– 「超」高級言語– Interactive Data Language– Data Visualization Tools

IDL 言語の特徴１• インタプリタ– 柔軟なプログラム開発環境。
– ただし速度は遅い。

• アレイ言語– IDL に読み込んでしまえば、• FITS 画像も jpeg もアレイ。
• FITS table も ascii table もアレイ。

– アレイを使うと、• プログラムが分かりやすい、見やすい。
• やりたい処理をそのまま書ける。

– アレイのサブスクリプト（インデックス）を処理する、という概念を理解すべし。

• 強力なデータ処理言語＋データ表示– C -> file output on disk -> gnuplot では非効率。

IDL 言語の特徴２• Procedure/Function は ascii file で配布。
– コンパイル済みプログラム or 実行形式 (.exe) は、基本的に存在しない。
– 他人のプログラムも、全て中身が読める。
• コード内容は、全公開。ブラックボックス処理は、ない。
• 他人のプログラムを改良・応用して活かす。

– 欲しいプログラムは、まずネットで探す。

• すべてはオン・メモリ処理。
– メモリは可能な限り増設しましょう。
• C.f. File I/O or disk space for IRAF

IDL vs. IRAF
• IDL はプログラム言語• IRAF は解析環境＋貧弱なシェル• IDL はメモリベース• IRAF はファイルベース– 結果は一旦ファイルに書き込む。
– 次のルーチンは、ファイルを読む所から始まる。

• IRAF は良くも悪くもブラックボックス• IDL は低レベルのルーチンまでハッキング可能– 新しい装置の新しい解析手法も作れる。

• IRAF は無償 (NOAO: 天文台)
• IDL は有料 (RSI->ITT->Exelis…: 営利企業)– ただし無償のツール・コードが出回っている。

IDL vs. C (科学技術計算の場合)• コードの読みやすさ：IDL = 100 X C– C はそもそもシステム開発言語。
– C の”ポインタ”、”*”、“&” などは、忘れましょう。
• 忘れました。
• Printf で悩んだ時代が懐かしい。

• デバック速度：IDL = 100 X C– インタープリタなので、デバッグはとても楽。
– 試行錯誤によるコードのアップデート作業も、楽。

• 計算速度：IDL = 1/10 X C– IDL に速度を求めてはいけません。
– 最終手段：高速化するルーチンだけ C で書いて、それを IDL から呼び出す、という技はある。
• 自分で使った事は無いが、見たことがある。

これだけ知っていれば読める！
IDL 文法の特徴• 初心者講習会に出た方は、スキップしてください。
• でも、少しは発見があるかも。

大文字と小文字• 全く関係無し。
– もちろん String 以外。
– 個人の見やすい書き方で。
• 私は小文字派。

0 から数えよ• 画像の左下のコーナーは、– IDL では [0,0]– IRAF では [1,1]– DS9 や SKYCAT は [1,1]• For loop を使うときは、– 0 から n_elements(x)-1 まで。

,と$と&と;と:• ‘,’: すべての argument の区切り。
• 一番よく使う。

– または、array index の区切り。

• ‘$’: 複数の行を１行コマンドとして使う時のおまじない。
– 基本は、１行１コマンド• ‘&’: 一行に複数のコマンドを書く時のおまじない。
– 基本は、１行１コマンド• ‘;’: コメント行。
– 一般に、行の頭につける。
– しかし、行の最後につけても良い。

• ‘:’: array の index の範囲指定– Image[1:10,10:20] --- 大きな image array のうちの
x=1~10, y=10~20 のサブ・アレイ

[]と()• [ ]: array の座標（インデックス）– x[0]: x array の最初の内容– y[0,10]: y array の x=0, y=10 の座標の内容– image[*,*,1]: ２次元画像のスタック・キューブ（３次元）から、１番目の画像を抜きだす。
– などなど。

• ( ): 関数 (function, procedure) の argument 部。
• または、数学の計算順序を示すカッコ。

– Y＝f（x）など。

• 非常に古いバージョンの IDL では、( ) を array のindex として使っていたため、古いコードでは x(0,10)などと書いてある場合がある。
– これでも動くが、お勧めできない。
• 混乱の元。

&& と AND, || と OR, ~ と NOT• 集合の論理積などを表すのが、&&, ||, ~• 「ベン図」を思い出そう。

– IF 文で多用。
• もし A かつ B であれば、これを実行、などなど• ビット単位の理論積など表すのが、AND, OR, NOT– ２ビットの計算例• 000 AND 111 = 000• 000 OR 111 = 111– Where 文で多用。
• A かつ B の条件を満たすインデックスを求める、などなど• 経験的に、where 文で誤って && など使ってしまい、気づかずにデバッグで悩むことが多い。
– 取り違えても偶然正しい挙動を示す場合もあり、気づきにくい。
– where は特別、と割り切って覚えても、多分問題は無い。

EQ と =, GT と <• EQ, GT などは、比較演算子。
– IF 文などで多用。
• IF A GT B then…

• = は代入文。
– A=B など。(A に B の内容をコピーする）• <, > は特殊な演算子。
– A = (B < 5) などと使う。
• もし B が 3 なら A=B=3• もし B が 10 なら A=5– Index の範囲指定などで使うと便利。
• A_cut=A[b > 0:c < (x_max-1)] など。
– 仮に b や c が A array の index の範囲外を指定したとしても、エラーを回避できる。

““と‘‘
• どちらも “string” の範囲指定をするもの。
– ただし、”” は特殊な用途があるので、’’ がおすすめ。
• 例えば、string が数字で始まる場合、問題が発生する。
– IDL> print,'0a'0a– IDL> print,"0a"print,"0a"^% Syntax error.
– IDL> print,'aa'aa– IDL> print,"aa"aa• 昔これで悩んだことがある。

variable の振るまい１• あらかじめ定義する必要はない。
– C の様に、最初に define する必要はない。
– インタプリタだから。

• 代入される段階で、初めて定義される。
– Variable のタイプは、代入相手によって決まる。
– A=1 -> A は integer– A=1.0 -> A は float– A=fltarr(10) -> A は float の array (size=10)– A=‘1.0’ -> A は string• Variable のタイプは、再設定できる。
– A=1.0 の後に A=‘1.0’値と違うタイプに再設定できる。
• 結果は A は string に変わる。

variable の振るまい２• A が「定義されているかどうか」をプログラ
ム上で調べることができる。
– Undefined を使った IF 条件分岐、など。
– Procedure/function のオプションの有無の判定など。
• IDL のパラメーター割当はルーズなので、便利な反面、混乱の元。
– 統一的な命名法や、サブルーチンを使った variableの整理、などがおすすめ。

数字（アレイ）の計算• 基本は、まったく普通の感覚で。
– +-*/^– alog10(), sqrt(), sin(radian)– A^2.,10^-3– 3*(1+2)=9• 数字 -> 「数字のアレイ」として使っても、同じに動く– 上記で、A はスカラーでも良いし、ベクターでも良いし、イメー
ジ（２次元アレイ）でも良い。
– ただし、アレイのディメンションは合せておく事。
• 良くあるエラーの元。

特殊な計算• 何でもできる。
– でも気をつけて。
– IDL は落ちずにプログラムは続いて行く。。。
• Print,1/0• 1• % Program caused arithmetic error: Integer divide by 0
• Print,1*!values.f_nan,1*!values.f_infinity• NAN INF
• % Program caused arithmetic error: Floating illegal
operand– 文句は言われるが、これらはエラーストップではない。
• Warning の扱い。
• うまく活用しましょう。

– 逆に、arithmetic error は頻出するので、あまり気にしすぎる必要はない。

よく使う、数学関数• Total• Median,mean,stddev,variance– Moment 関数で一発。

• Sin/cos• Max,Min• Finite– Argument が有効な数字かを調べる関数。
• 無効な数字：無限大、無限小、Not A Number (NAN)– 知っていると意外と便利• Mask 処理に応用できる。
– 1 or 0 mask ではなく、1 or NaN mask とする。

たまに使う、文字列関数• Strcmp, strtrim, strlen– IDL の科学計算ではあまり必要ないですが、たまに file I/O などで必要な場合があります。
– あまり強力ではないですが、一通りのことは出来ます。

Array を使いこなそう• １次元：A=[1,2,3] --- 3 要素ベクトル• ２次元：A=[[1,2,3],[1,2,3]] --- 3X2 array• 範囲指定：A[1:2], b[1:3,2:5], c[*,2:5], d[2:*]• アレイインデックスがアレイ– A=[1,2,3,4,5] & b=[0,1,2] & print,A[b]– 1A の 0 番目、１番目、２番目の内容が表示される。

• Help で結果を確かめよう。
– Help,a,a[1:3] など。

• (A+B)[0:2] という技もあり。
– C=A+B かつ C[0:2] という意味。

Where を使いこなそう• 「Index 使い」になろう– For loop で array 内容をスキャンしながら IF 文を掛けるのは、古いです。
For x=0,99 do begin
For y=0,99 do begin
If image[x,y] LT -100 then image[x,y]=!values.f_nan
Endfor
Endforbad_index=where(image LT -100)
Image[bad_index]=!values.f_nan– 「ベン図」をイメージしながら、where の中に条件を書き込むだけ。
– Where の良さが分かると、止められません。

最低限知っておきたい
IDL コマンド、関数• アレーを作る– Fltarr, intarr, …
– Findgen, indgen, …

• アレーを調べる– Where– Size, n_elements– help• 結果を表示する– print– Plot (oplot)– atv• Procedure/function のキーワードを調べる– Keyword_set• デバッグ– Message– .reset最低限知っておきたい
IDL 言語の制御構造• 条件分岐– IF 文– Case 文• ループ– For 文– Break, continue• ジャンプ– Goto 文• どれも簡単なので、参考書を見てください。

FORループ, IF条件分岐について、もう少し。
For x=0,xmax-1 do begin
xxx()
Endfor• or
For x=0,xmax-1 do xxx()
If A GT B then begin
yyy()
Endif
• or
If A GT B then yyy()••

一行ですむ場合は、if/for と同じ行に続けて書きます。
実行内容が複数行にまたがる場合は、begin… end(for/if) でまとめます。

•

If then begin … endif else begin … endelse もよく使います。

知っておきたい外部function/procedure• ネットの向こうにいる開発者に、感謝。
• IDLASTRO (http://idlastro.gsfc.nasa.gov)– 天文向け IDL 外部ルーチン総本家。検索やリンクもある。
– 各種そろっているが、以下はマスト。
• FITS read/write; ASCII table read/write• Others– Atv： 2次元画像ビュワー or ds9 for IDL.
• http://www.physics.uci.edu/~barth/atv/ by Aaron Barth• ちょっと機能が足りないが、ないと大変困る。-> 最近バージョンアップ。
• 各方面で改造されて、応用されている。

– Loadcolors：プロット時の色を定義する。
• 最初に出てきた参考書に集録– Saveimage, pson (psoff)• PS/PNG/JPEG dump of plot window• 最初に出てきた参考書に集録

IDL プログラミングを始める前に知ってほしい事柄• これから本格的に IDL をいじりたい方が、その環境を準備するときに役に立つと思われる、ちょっとした情報。
• 自分の研究室に戻って設定するときに、役立ててください。

• Idlde

開発環境– IDL 開発会社が作った開発環境 (developing environment)– 良くできていて、愛用者もいるが、大山は好きでない。
• 私の学生さんは使っています。
• 開発者支援機能がいろいろついていて便利、らしい。

• コマンドライン on ターミナル + 汎用エディタ– 簡単・簡便・必要十分– エディタは Emacs + IDLWAVE 環境がおすすめ。
• IDLWAVE: http://www.idlwave.org/– IDLWAVE is an add-on mode for GNU Emacs and XEmacs whichenables feature-rich development and interaction with IDL…

• 構文の色付け、１行ヘルプ、などなど機能多数。

– お好きな組み合わせで、どうぞ。

IDL 起動前の設定• IDL のインストール: プロに任せる。
• .cshrc; IDL_PATH の設定– 自分の IDL ライブラリ path を追加せよ。
– Source .cshrc を忘れずに。

• ‘Idl’ or ‘idlde’ で起動。
• “Window” して、graphic 画面が出れば OK.
– エラーが出たら、X11 の設定に問題がある。
• プロに相談せよ。

• IDL を起動中は IDL_PATH を追加できない。
– 一旦 exit して、.cshrc 編集、source .cshrc の後、再起動せよ。
• 本当は IDL 起動のままで書き替える方法もある。

マニュアルはこれだけ
オンライン・ヘルプを使うべし• Unix shell から ‘idlhelp’• Reference guide -> command reference （IDL文法辞典）だけでよい。
• まずは index か search で探す。
• Example が便利。
• See also… を、たどってみよう。
• 外部 procedure/function については、そのソースコード自身にヘルプが書いてあるのが慣例。
– コードの先頭部（だけ）を読め。

IDL本体（基礎）に集中すべし。
おまけは当面忘れる。
• No GUI• No iTOOL• No Object programming• Etc…
• GUI だけやむなく使ったことがあるが、他は全く使用経験ゼロ。
– たまに外部 GUI ライブラリを使うことはある。

IDL の始め方• IDL または idlde で起動。

– 例：idl の場合は、コマンドラインで idl と実行すると、IDL プロンプトが出る。
• castor:/asiaa/home/ohyama% idl• IDL Version 8.3 (linux x86_64 m64).
• …
• IDL>– これで、unix 環境から IDL 環境に入った。

•

プロンプトにコマンドをタイプする or コピー＆ペースとで「メモファイル」からコピーする。
– IDL は１行１コマンドが原則。
– インタプリタなので、1行実行ごとに結果がメモリに残る。それを利用して、さらに処理を進める。

••「メモファイル」がたまってきたら、何行分もまとめてコピー＆ペーストする。
もっとたまってきたら、メモファイルをそのまま読み込むと便利な場合もある。
– IDL> @mymemo.txt; @ を使って、Mymemo.txt の内容を一行づつ読み込んで、実行する。

•

IDL プログラム形式に改良する。
– Mymemo.txt そのままで、既にプログラムの形式にほとんどなっている。
• ただし、おまじないとして、最後の行に end を加える。プログラムは、この行まで自動的に実行される。

– .run mymemo.pro (IDL っぽく、拡張子を .pro に変えてみた。本質的ではない。)• .run は、IDL インタープリタに対する特殊な命令（言語ではない）で、プログラム実行 run させるもの。

つづき• プログラムと「メモファイル」の違い
1. プログラムは、エラーが出たらそこで止まる。メモファイルは、エラーが出ても次にいってしまう。
–

あなたがコピペをするのと同じことを自動的にやっているだけだから。

2. プログラムでは、言語の制御構造が使いやすい。
–

If, for などが典型例。
••–

もちろんメモファイルでも if, for は使える。
•
•
•
•
•
•
•
•

•

これらがあると、一行1命令の原則が崩れるから。
無理にこれらが存在する「メモファイル」をそのまま読み込むと、syntax error で止まってしまう。
IDL > .run
[プロンプトが変わることに注意。]- for i=0,10 begin- print,I- endfor- end[ここで初めて IDL がここまでの4行を認識して実行し、結果が出力される。]
IDL > [いつものプロンプトに戻る。]–
結局、ミニプログラムをつくって実行しているだけ。
どちらの場合も、結果がメモリに残った状態で終了する。
–

引き続きお楽しみください。

デバッグの達人への道• IDL ならデバッグは簡単。その特徴を活かす際の基礎知識集です。
– 一度 IDL デバッグの醍醐味を覚えると、他の言語で開発できなくなります。。。

IDL プログラム実行時の、コンパイルとエラーの種類• コンパイルエラー– インタプリタでも、コンパイルする。
• コンパイル：最低限の構文チェックなどを指す。

– サブルーチンは、呼び出されると自動コンパイルされる。
• したがって、メインプログラムの途中でコンパイルエラーが起き得る。
• 前もってコンパイルしておくこともできる。

• 実行時エラー– コンパイルが通っても、実行時エラーは発生する。
• 例：Array の割り当て等は、実行時に決まるので。

– 実行時エラーが起きると、そのままのメモリ状態で IDL シェ
ルに落ちる。
• インタラクティブモードになる。

エラーメッセージを読むべし• 知るべき事– エラーの種類– エラーが発生したサブルーチン• 今自分はどこ（どのルーチン）にいるのかを知る。
• 大きなプログラムでは、自分の位置を見失いがち。

– エラーが発生したプログラムファイル• １つの xxx.pro に複数の procedure/function がある場合もあるので、注意。

– エラーが発生したプログラム行• IDL のエラー行表示は、信頼できる。

– エラーが発生した具体的な箇所• ‘^’ で問題の行のどこで止まったかが表示される。
• ただし、あまり参考にならないこともある。

Error の例 1
•
•
•
•
•
•
•
•

% Syntax error.
At: /home/ohyama/xxx.pro, Line 10% Compiled module: xxx.
% Attempt to call undefined procedure/function: ’xxx'.
% Execution halted at: yyy 61 /home/ohyama/yyy.pro%$MAIN$
IDL> help,/trace% At yyy 61 /home/ohyama/yyy.pro

Error の例 2
•
•
•
•
•
•
•
•
•
•

% String expression required in this context: STRNG.
% Execution halted at: xxx
185 /home/ohyama/xxx.pro%
yyy
18 /home/ohyama/yyy.pro%
zzz 61 /home/ohyama/zzz.pro%$MAIN$
IDL> help,/trace% At xxx
185 /home/ohyama/xxx.pro% yyy
18 /home/ohyama/yyy.pro% zzz
61 /home/ohyama/zzz.pro% $MAIN$

エラー停止時の IDL の状態• インタラクティブ状態になっている。
• メモリの内容はそのまま保存されている。
• ただし、今いるサブルーチン内の情報に限る。

– メモリの内容を• 確認できる。
• 修正できる。
• 修正後、その場から再スタートできる。

• 意図的にエラーを発生させることができる。
– デバッグ時に有効。

• エラー停止後、再度最初からやり直し実行する
時は、メモリを一旦クリアすること！
– さもないと、途中のサブルーチンの情報を元に、メインプログラムがイニシャルされる恐れ有り。

これだけは知っておきたい
デバッグ用コマンド• Print– デバッグメッセージの埋め込み• Message– 強制エラー発行による、実行停止。デバッグモードへ移行。

• Help– Variable の内容確認– Help,/trace で、今いるサ
ブルーチンの確認• .comp– コンパイル（し直し）• .cont– 継続実行– エラーからの復帰• Return or return,0– 強制的親ルーチンへの復帰• .reset– メモリ内容をすべてクリアして、 IDL 起動時の最初の状態に戻す。
• ただし、IDL 環境変数はリセとされない、などの例外はある。

– はじめからやり直す場合は、
まず .reset すること。

エラーストップする９０％の理由１• IDL 設定に関するエラー。
– プロット用 Window がでない。
• よくある X11 の設定の問題。管理者に問い合わせ。

– Color が出ない？画面が再描画されない？おかしい？
• おまじないコマンド：device, decomposed=0,retain=2• Procedure/Function undefined• % Attempt to call undefined procedure/function: ’xxx'.

– 存在しないサブルーチンにアクセスしようとしている。
• IDL path に該当プログラムファイルが存在しない。
– Print,!path をしてみよ。きっと path が通っていない。

• 該当プログラムが、エラーでコンパイルできない。
– .comp xxx.pro をしてみよ。きっとエラーがある。

• 多くの場合、単なる typo

• Variable undefined• Variable is undefined: xxx.

– 定義していない array にアクセスしようとしている。
• Array を定義が、遅すぎる or 忘れている or typo。
– 該当 variable を help してみよ。

エラーストップする
９０％の理由２• Subscript out of range– あり得ない array の座標にアクセスしている。
– % Attempt to subscript xxx with <LONG (-1)> is out of range.
– % Subscript range values of the form low:high must be >= 0, < size, withlow <= high:• あり得ない for loop カウンタ
• Where 関数がマッチしていない。該当無しを表す -1 が帰ってきている。
– Subscript を help してみよ。
– Where 関数の Match count 返り値を使って、事前にチェックするのが鉄則。

• Function/procedure へのパラメーター渡しがおかしい。
– % xxx: Incorrect number of arguments.
– たいがいが typo.

エラーはでないが、処理内容が挙動不審な場合の９０％の理由１• スカラーのハズが、size=1 の array になっている。
– Id がスカラーなら、Array[id] はスカラー– Id が array なら、array[id] はアレイ
– アレイA＊スカラーBは、アレイC• アレイCのサイズはアレイAのサイズ– アレイA＊アレイBは、アレイC• アレイCのサイズはアレイA, B の小さい方のサイズ！

– 悩む前に、help で内容を確認せよ。

• IF,whereなどの条件分岐が、期待どうりでない。
– AND と &&, OR と || は大丈夫？
– 悩む前に、IF 条件内容を help せよ。
• String に意図しないスペースが入っている。
– ‘a’ と ‘_a’ と ‘a_‘ が混乱している。(‘_’ は空白）
• Print だと気づかない。Help せよ。

エラーはでないが、処理内容が挙動不審な場合の９０％の理由２• Integer/long integer の違い。bit が回ってマイナスになる！
– IDL> help,32767S– <Expression> INT= 32767– IDL> help,32767S+1S– <Expression> INT= -32768• 処理結果が意図せず integer になった！
– *2 の場合も *2.0 と明記しましょう。

• Function/procedure へのパラメーター渡しがおかしい。
– Argument 数が少なくても動く！足りない部分は undefined 扱い。
• 多すぎる場合は、エラーとなる。

– Argument をすべて help してみよ。

• まったく同名の、異なる procedure/function がある！
• そんな馬鹿な、と思っても、たまに起きる。そして、大いに悩む。

– たとえば、バックコンパチでない複数バージョンのプログラムの全てにパスが通っている、など。
– IDL_PATH の設定を確認せよ。
– findpro 関数 (IDLASTRO) も便利。

IDL プログラム高速化• 早いコンピューターを買う。

– いたずらにプログラム上で速度を追求しない。読みやすさ優先。
• IDL では、コードの高速化改良余地は少ないが。

– メモリスワップしているようなら、メモリの増設が有効。

• FOR ループ、IF 文などは、なるべく使わない。
– 細切れにせず、 IDL built-in のルーチンをつかう。
• そもそも早い。うまくいけばマルチスレッドが働く– Array 処理や Where を活用せよ。

• 多次元 Array アクセスの順番。
– For loop をどちらを先に回すか？ -> コラムメイジャー– A[0,0] のお隣は A[1,0]; A[0,1] は遠い。。。

• メモリ管理（スワップ回避）– メモリを消費する大型 array は、• 多数の大フォーマット array はなるべく同時に使わない。サブルーチンを活用。
• 不要になったら、消す。
– A=0 を代入（こそくな手段）– 後でデバッグできなくなって泣く事も。

データの QL
• IDL は Interactive に Data をいじくる言語です。
データの Quick Look の技を身につけましょう。
• Help• Print• Print,moment• Plot (oplot)• ATV

QL の達人となるべし１• 解析処理のデバッグのため、データを様々な形で眺める技を身につける。
– エラーは出ないが、処理結果がおかしいときのデバッ
グこそ、IDL の強いところ。

• HELP: まずは help で中身を確かめる。
– Variable の dimension, 内容の種別（文字か数字か
undefined か）を知る。

• Print: とりあえずプリントして中身を見る。
– 場合により、[…] を使って array の一部だけを見る。

• Print,moment(): 対象が大きい場合は、だいたいの統計量をつかむ。
– 平均値、分散など。

QL の達人となるべし２• Plot,Oplot: トレンドを２次元グラフ上でつかむ。
– １次元 plot も可：Plot,yarray– Plot,xarray,yarray,xrange=[x1,x2],yrange=[y1,y2],/xlog,/yog,psym=3,color=1– Oplot,xarray,yarray2,psym=4,color=2– ２次元以上のデータは、[…] を使って次元を落とす。
• Plot,image[*,0] ->画像の x 軸に沿ったプロファイルの表示。

• ATV: ２次元画像を見る。
– Atv,image2d,/block• あとは GUI で好きにいじる。
• /block はおまじない。要らない場合もあるが、つけた方がよいことが多い。理由は理解してません。

– ３次元以上のデータは、[…] を使って次元を落とす。
• image[*,*,0] -> z=0 でカットした面の画像。

サブルーチン• 慣れてしまえば、サブルーチン化はとても簡単・便利。積極的に使いましょう。
• ２つの方法– Function• Output=function(argument,/keyword)– Procedure• Procedure,input_arg,output_arg,/keyword• まったく同じ機能（コード）は、どちらの方法でも実現可能。
– 呼び方が違うだけ。
– お好きな方法で、どうぞ。

サブルーチン分割のススメ• プログラム実行内容の整理• Variable の整理– テンポラリの variable は、サブルーチンから脱出するときに、消える。
– 逆に、過去の情報を参照したいときは、外部の変数に記憶させる。

• プログラムの汎用化– 何度も呼び出せる。
– 微妙に挙動の異なる繰り返し部は、keyword などで対応。
–例• Stacked_image=mystack(image,/median)• Stacked_image=mystack(image,/clip_sigma,sigma=3.)• Mystack.pro の中に IF 文を書き、keyword 毎に処理を分岐させる。

Argument と keyword• Argument, keyword は、入出力の両方に使える。
– Input の argument に変更を加えて、同じ変数で受け取る事が可能。
• input のつもりでサブルーチンに与えたデータがサブルーチン内部で変化すると、その結果が親ルーチンに反映してしまう。
• たまにここで混乱する。

• Keyword は 1 or 0 のスイッチ– /keyword と keyword=1 は等価• Keyword がセットされたかどうかを、知る。
– Keyword_set 関数• キーワードの属性が undefined なら、その keyword は設定されていない。
• Size 関数も使える。

サブルーチンの様式• 最初に、pro または function で、I/O argument を定義する。
– C の様に、type を指定する必要はない。なので、なんでもあり。

• Pro または function で始まり、end で終わる。
– 全ての処理は、この二つの間に。

• Function の場合は、返り値を return で指定する。
Pro myprocedure,input,output
Output=myfunction(input)
End
Function myfunction,input
Output=somefunction(input)
Return,output
End• 通常、サブルーチンは別ファイル (*.pro) に格納。
– １ファイル、１サブルーチン。
– サブルーチン名とファイル名は、同じにすること。（ただし、ファイル名
は .pro をかならずつける。

サブルーチンを使う。
• Path を通す。（既出）– 通常、IDL を起動したディレクトリにファイルをおいておけば、自動的に path は通っている。

• .compile でコンパイルしてみる。
– .compile しなくても、呼ばれれば自動でコンパイルされますが。。。（既出）• 呼び出すときは、他の IDL intrinsic 関数と同じ。

サブルーチン構造と、メモリアクセス• データはすべて local 扱い– ただし、例外的に global を作ることができる。

• IDL プロンプトからアクセスできるのは、– 各サブルーチン内では、そのサブルーチンのメモリ内
容だけ。
– 別のサブルーチンに移動すると、親ルーチンの内容
はアクセスできなくなる。
• IDL が、その状態でアクティブなメモリ内容を自動で切り替えている。

• 同じ変数名を親ルーチンとサブルーチンの両者で使用していても、サブルーチン毎に変数の内容は入れ替わる。
– Local なので、当然。

サブルーチン化とデバッグ手法1
サブルーチン内でエラーで止まったらどうするか？
Variable の内容の問題の場合
例：subscript の計算ミスで、array subscript out-of-range が起きた。
• 今どこにいるかを知る。
– Error message を読む or help,/trace• バグの修正法を考える。
– QL 手法を駆使して、variable の中身を確認。
– 問題のある変数を探し出し、修正を考える。

• 変数を外から書き替える。
– インタラクティブモードなので、自由にコマンドラインから変数をいじれる。

• .cont を実行する。(continue)– 運が良ければ、あたかもエラーがなかったかのように、処理が続く。
• もちろん姑息な手段がうまくいかない場合も多いので、その場合は次ページ。

• うまく切り抜けたら、サブルーチンそのものを修正する。
• 最初から実行し直す。

サブルーチン化とデバッグ手法2
致命的なバグで、実行継続が不可能な場合
例：巨大な for loop の中で subject out-of-range が起きた。

• 今どこにいるかを知る。

– Error message を読む or help,/trace• バグの修正法を考える。
– QL 手法を駆使して、variable の中身を確認。

• プログラムを修正する。Edit and save.
• 一つ上のルーチンに戻る。
– Return (procedure の場合) or return,0 (function の場合)

• 修正プログラムを再コンパイルする。
– .compile ‘program’• 修正サブルーチンを試す。
– コマンドラインから、単体で（そのサブルーチンだけ）実行する。

• うまくいったら、最初から実行し直す。
• エラーストップしても、無駄にしないで復活させるベシ。

2次元画像処理以外のよくある
IDL の使い道• IDL はプログラム言語ですので、何でもできます。
• 2次元 FITS 画像解析以外で、天文関連で
IDL が便利で活躍する場面を、少しだけ紹介します。

なんとか統計、なんとかフィット• 例：観測データの単純な平均・分散を求めたり、リニアフィットを行うのではなく、明らかな「外れ・問題データ」を取り除いたり、やや特殊な「なんとか統計」を行う。
• 例 (idlastro より)
•
•
•
•
•
•

Meanclip.pro
Biweight_mean.pro
Resistant_mean.pro
Robust_sigma.pro
Robust_poly_fit.pro…

• すべて、IDL 言語で実装されたプログラム（procedure/function) です。
– 中身を読むと、何シグマでデータを仕分けする、なんていうことが、そのまま丁寧にプログラムされています。
– IDL だからいろいろなマニアックな統計ができるのではなくて、世界中の人がよい procedure/function を作って公開してくれているだけ。
– IDLASTRO や google で検索して、適切な物を探してください。

複雑なフィット関数を用いたデータのフィット•

例：– 楕円銀河の ¼ 乗則、または銀河の表面輝度マップをバルジ＋ディスク構造でモデルフィットする。
– 複数の輝線をもつスペクトルを、天文学的に正しい条件でフィットする。例えば、
Hα と [NII] ダブレットがあり、[NII] ダブレットの強度比はつねに 1:3 だが、[NII]/Hα は可変。すべての輝線はおなじ後退速度にある。この場合の輝線強度と後退速度は？ただし輝線プロファルはガウス形で近似できる。

•

一般的な（任意関数に対する）最小二乗フィット・ライブラリーが公開されています。
– IDL built-in 版もありますが、MPFIT library が有名です。
• http://www.physics.wisc.edu/~craigm/idl/fitting.html• これも、IDL で地道にコードされたプログラムです。

– 最小二乗の数値的な求め方は、専門書を調べてください。初期値から始まって、ベストフィット解を逐次的に求めます。

•

状況に従った「モデル関数」を IDL の function (例えば、y=ax+b) を作って、観測データ (x_obs[*], y_obs[*]) と適当な初期値 (a0, b0) を MPFIT
library に渡せば、ベストフィットパラメーター（例えば a, b, delta_a,delta_b）が得られます。
– 詳しくは、MPFIT のウエブを見てください。簡単です。

天体のカタログ操作••

大規模な天体カタログは、FITS テーブルで与えられることが多いです。
FITS カタログは、FITS 画像と同じ読み込みルーチン（後述）で読めます。
– どちらもおなじ FITS 規約に従っているから。

•

IDL で読み込んでしまえば、画像もカタログもどちらも「アレイ」です。
– 例えば、天体数が100のカタログを読めば、要素数100のアレイができます。
– これまでの知識を活用して、自由に処理してください。
• 例： r, b バンド等級から、r-b カラーを求める（単純なアレー同士の引き算）•
r-b カラーから、「赤い銀河」だけを選ぶ（if 文、where 関数など）•

一般に、一つの天体に対して多くの情報があり、テーブルになっています。
• 例：それぞれの天体には name, RA, DEC, b_mag, r_mag の情報があります。

– この場合、「構造体」と呼ばれる特殊な IDL 変数が使われることが多いです。
• 例：mycat[0].name=‘NGC0000’ & mycat[0].ra=123.456 … mycat[n-1].r_mag=0.0• ここで、mycat が構造体で、N の要素を持つアレーです。

– それぞれの要素 n に対して、name, RA, DEC などの具体的な数値、文字列が付随しています。個別の情報の変数が、「.」（ピリオド）の後に付きます。
• 例えば、b_r_color=mycat.b_mag – mycat.r_mag & print,b_r_color[0] などとします。

•

構造体は初心者にはハードルがやや高いですが、なれれば簡単ですし、カタロ
グ操作（というより、管理）を劇的に楽にしてくれるので、便利です。

（講義編の）最後に• ざっくばらんなコメントです。

• もっと勉強したい方へ。
– 他人のプログラムを読もう。
• そして改造。。。

– 最初に紹介した参考書の斜め読みが良いと思います。
– IDL の友達を作りましょう。（いま周りにいます）• もっと複雑な処理がしたい方へ。
– 複雑な処理も、結局は単純な処理の組み合わせ・繰り返しなので、少しづつくみ上げてください。
– サブルーチン化とデバッグのコツが分かれば、いくらでも複雑・大きなプログラムができます。
– シンプルかつ美しいプログラムを書くことを、お勧めします。
• 高速化は２の次。
• Array 名に意味を持たせたり、要所要所にコメントを残す、など。

つづき• IDL は万能ではありません。
– 私は今でも定期的に IRAF を使っています。Splot とか。
– うまく組み合わせてください。
• 基本は、低レベルのルーチンは IDL が得意です。

• IDL は、他の天文研究でも使えます。たとえば– 複雑かつ奇麗な plot
– データの interpolation/fitting などの、数学処理。
– 特別な統計処理。”なんとか統計・なんとかフィット”とか。
– 大きな天文 Catalog 処理• where 関数が威力を発揮！

• もっとよい講習を受けたい方へ。
– ADC のアンケートに答えてください。
– この講習資料への具体的なフィードバック（文句）も大歓迎。
– その他なんでも、ADC スタッフか私まで意見をください。

やってみよう
演習編• Lulin 望遠鏡可視撮像編 (ブロードバンド、
ナローバンド)• MOIRCS 分光編 (zJ500)

演習１：Lulin 撮像データ解析• 台湾中央大学 Lulin 1m 望遠鏡で観測された銀河
NGC 1xxx 画像の解析処理– http://www.lulin.ncu.edu.tw/lot/– PI1300 カメラ, CCD 1340X1300– 2 or 3 shots per filter, with dithering• ポイント– 小型地上望遠鏡を用いた、基本的な撮像観測– bad pix や cosmic ray を避けるため、dithering を実施。ただし、2~3 枚のみ。
– ダークを考慮する必要あり。

• データ– 大山観測データ、系外銀河の星生成領域の調査– 観測天体：NGC1xxx

解析の流れ• 処理式– Obs[i,n] = flat[i] X (object[i,n] + sky[i]) + dark
– De-trending• Object[i,n]=(obs[i,n]-dark)/flat[i]-sky[i]– i: filter id (0,1,2,3), n: dithering id (0,1,2)• Sky[i]=median{(obs[i,n]-dark)/flat[i]}; DC offset を差し引く。

– De-dithering• Object’[i,n]=shift(object[i,n],-dithering_vector[i,n])– Stacking• <Object[i]>=sum(object’[i,0],object’[i,1],object’[i,2])/3.

• 基礎データ– 当夜のダーク画像 (as dark)– 当夜の dome flat (filter 毎） (as flat[i])注：上記は IDL 文法で書いたものではなく、解析の流れを示す概念式です。
“’” は IDL では文法エラーなので使えません。

配布ファイル一覧• LULIN_[B,R].fits: 観測生データ– _B.fits: B band, _R.fits: R band
– 2次元 FITS

• FLAT_[B,R].bs.fits:ドームフラット– スタック、BIAS 処理済み

• DARK_[100s,200s].fits: 100/200s ダーク– スタック処理済み• LULIN_[B,R].lst: FITS 画像名を記したアスキー「リスト」ファイル

課題： R 画像の解析をせよ。
• R 観測画像３枚を、IDL に読み込め。
– Atv を使って、その画像を表示せよ。
– FITS ヘッダーを読み、exposure time を確認せよ。

• Flat 画像を、IDL に読み込め。
– Flat の値の統計量（平均、分散）を求めよ。

• Dark 画像を、IDL に読み込め。
– R とおなじ露出時間のダークを使うこと。
– 同様に、統計値を求めよ。

• Dark 差し引き処理をせよ。
• Flat 割り算処理をせよ。
• Sky の典型値を求めよ。
• Sky を差し引け。

つづき• 基準星を一つ選び、その座標 ([x,y])を ATV で求めよ。
– それぞれの３枚の画像について、同じ星を使うこと。

• 画像をシフトせよ。
– シフト後の画像を ATV で見て、同じ星が同じピクセルに来ている事を確認せよ。

• 画像を足しあわせよ。
• ATV でできた画像を検証せよ。

作業のコツ？1• まずは手でベタにコマンドを打って、結果を確かめる。
• うまく動いたコマンドを、ジョブ・リストとしてファイルにまとめてゆく。
– カット＆ペーストで、処理が再現できるように。

• 少しづつ変数を使ったりして、汎用化する。たとえば、– ファイル名をそのまま書かずに、変数にする。
• 次に別のファイルに対して同じ処理が使えるように。

– サブルーチンの結果を変数で受けて、次のサブルーチンのインプットとして活かす。
• Print,moment(array) -> stat_result=moment(array) と進化させる。

• まとまった処理を、サブルーチンとして書き直す。
– ジョブ・リストの一部を切り取って、procedure としての最低限の入出力部を追加する。
• Flat 処理を、独立の flat subroutine とする、など。

作業のコツ？2• 似た画像を多く読むときは、３次元アレイを活用する。
• 天文観測画像は、こういう場合がほとんど。

– ２次元画像の xsize, ysize を調べる。
• Help,image または print,size(image)– Fltarr で３次元画像を作る。
• Image3d=fltarr(xsize,ysize,n_frame)– MRDFITS で一旦２次元のファイルを読んで、３次元アレイに格納する。例えば、• Frame_id=0• Image2d_tmp=mrdfits(filename[frame_id])• Image3d[*,*,frame_id]=image2d_tmp• こうやっておくと、– 画像の de-dithering や stack がやりやすい。
– Frame 数が変わったときにも、対応しやすい。
– 見た目がシンプルで、意味が分かりやすい。

アドバンストコース課題• DARK の量を BIAS と比較評価せよ。
• 星の位置を、Gaussian fit で求めよ。
• 画像の平均を、average 処理と median 処理の両方で行い、違いを比べよ。
• 他のフィルター (B, Ha-ON, Ha-OFF) もトライ。
– 最初のフィルターでの処理方法を、変数などを使って別フィルターの処理に使い回す事。
– Ha-ON, Ha-OFF は、露出時間に注意。

代表的な使用 IDL コマンド
(コマンド名、出所、コメント）• Mrdfits (idlastro)– FITS file を指定し、画像を読み込む。
• FITS header も同時に取り出せる。
• ２次元以上の FITS、マルチイクステンション FITS, FITS binary
table も対応する。

– 書き出す場合は、mwrfits• SXPAR (idlastro)– キーワードを指定し、FITS header から内容を取り出す。

• Atv (atv library)– ２次元 array を画面に表示する。
– Ds9 のように、見え味をインタラクティブに変更可能。
– ‘/block’ option をつけないと、うまく動かないことがある。
• おかしくなったら、atv_shutdown コマンドを打つこと。

• Moment (IDL intrinsic)

つづき– 指定アレイに対し、平均、variance 等の統計値を計算する。
– 統計関数は他にいろいろあるので、idlastro を眺めてみると面白い。

• Median (IDL intrinsic)– 指定したアレイに対し、median 値を計算する。
– ２次元以上の場合は、median を計算する axis (dimension)を指定する事が可能。

• Total (IDL intrinsic)– アレイの内容を足しあわせる。
– ２次元以上の場合は、足しあわせる axis (dimension) を指定する事が可能。

• Shift (IDL intrinsic)– アレイを指定した量だけシフトさせる。
• シフト量は pixel 数単位（整数に限る）– Sub-pixel shift は他のソフトで。

• シフトして消えてしまう画像は、反対側に wrap される。

つづき• Size (intrinsic)– array の様々な情報を取り出す。
• Xsize, ysize などの、dimension 情報• Float, string などの、type の情報。
– Type 情報として Undefined がある。

– Interactive には、help も使える。

• Fltarr (intrinsic)– 他にも類似関数 (dblarr など）あり。
– float の array を作る。
• Image=fltarr(xsize,ysize,n_frame) など。

つづき• N_elements (intrinsic)– １次元Array の長さを調べる。
• ２次元画像の場合は、要素数の総数が帰ってくるので、注意。

• GAUSS2DFIT (intrinsic)– ２次元画像をガウスフィットする。
– Fit 画像と、fit parameter が帰ってくる。
• Gauss 画像フィットプログラムは、多くの外部関数があるので、そちらも探してみて。

– Gaussfit は１次元プロットのフィット用

課題２：MOIRCS 分光解析
http://www.subarutelescope.org/Observing/Instruments/MOIRCS/index.html• MOIRCS 分光モードによる、標準星解析– zJ500 grism (0.9-1.6um) (H band の一部を含む)– Hawaii-２RG (HgCdTe) 2KX2K x 2 chips– Tycho 星（暗くて数があって spectral type が known)• ポイント– MOS mask 使用– Sky = OH lines (平らでない、形のあるスペクトル）– Nod observation (dithering along slit)• Apos and Bpos
• Skysub by Apos - Bpos

– Dome-flats• Flat は自分で作る。
• Lamp-on & Lamp-off– ダーク画像無し（on-off 作業により、自動で差し引き）

解析の流れ(A-B pos method)• 処理式– Obs[L,n]=flat[L]X(obj[L,n]+sky[L])+dark• L: lambda; n: dithering position id– Skysub (A-Bpos or N - (N+1) pos)
• Obs[L,n]-Obs[L,n+1]=flat[L]X(obj[L,n]-obj[L,n+1])=AsubB[L,n]• Obs[L,n+1]-Obs[L,n]=flat[L]X(obj[L,n+1]-obj[L,n])=AsubB[L,n+1]– Flat Fielding• AsubB[L,n]/flat[L]=obj[L,n]-obj[L,n+1]=AsubB’[L,n]• AsubB[L,n+1]/flat[L]=obj[L,n+1]-obj[L,n]=AsubB’[L,n+1]– Extracting (or shifting)• Extract{AsubB’[L,n]}=obj[L,n] --- (n+1) の部分を除く• Extract{AsubB’[L,n+1]}=obj[L,n+1] --- (n) の部分を除く– Stacking• <Obj[L]>=<obj[L,0]+obj[L,1]>=(extract{AsubB’[L,0]}+extract{AsubB’[L,1]})/2

配布ファイル一覧• 使用データ– とある観測時の標準星。
– Chip 2 のみ使用。

• 天体スペクトル: OBJ1.fits,OBJ2.fits– Apos: OBJ1, Bpos: OBJ2• ドームフラット– Flat (lamp on) X 10: FON1 ~ FON10.fits– Flat (lamp off) X 10: FOFF1 ~ FOFF10.fits課題２：MOIRCS分光標準星の１次
元スペクトルを作る• Object 画像（２枚）を読み込め。
– ATV で表示して、標準星のスリットを見つけること。

• Flat (ON) を 10 枚 IDL に読み込め。
• Flat (ON) を合成して１枚の高い S/N flat を作れ。
– Median 処理で。

• Flat (OFF) も同様に合成せよ。
• Flat (ON-OFF) を作れ。
• A-Bpos 画像を作り、sky を差し引け。
• Flat field を行え。
– FLAT (ON-OFF) を利用せよ。
– ATV で、OH 夜光がどの程度差し引けたか確認せよ。

つづき• A-Bpos 画像で、星のスペクトルが Y 座標を ATV で調べ、dithering 距離 (pix unit) を求めよ。
• De-dithering せよ。
– Dithering 距離の分だけ、A-Bpos 画像をシフトせよ。

• 画像をスタックせよ。
– ２枚しかないので、単純足し合わせでよい。

• 星スペクトルのスリット領域のみを切り出せ。
• 切り出し画像を空間方向に足しあわせて、スペクトルを１次元化せよ。
– １次元スペクトルをプロットせよ。
• ただし、横軸は X ピクセルのみで良い。

代表的な使用 IDL コマンド
(コマンド名、出所、コメント）• Plot (intrinsic)– Plot,xarray, yarray• Xarray, yarray とも１次元 array– 実は２次元以上の画像でも plot は働くが、plot 結果は意味がよく分からないので、お勧めできない。

– Oplot,xarray2,yarray2• Plot の上に別のグラフを書き足す。

– あらかじめ loadcolors を実行しておくと、color=1 (2,3, 4,… も試してみて）で色が赤青緑。。。と変わっていくので便利。
– Psym=1 （2,3,4,5,… も試してみて）で、 plot symbol（四角、丸、点、など）が変わる。
– その他、軸タイトルや、プロットレンジなどの多数のオプションがあるので、マニュアルを参照のこと。

つづき• Readcol (IDLASTRO)– ASCII テキストファイルの名前を指定して、その内容を読み込む。
– String でも float でも読める• フォーマットを外から指定する– 書き出す場合は forprint (IDLASTRO)

アドバンストコース課題• Flat の足し合わせを median と clip-average を用いて作り、違いを統計値で確認せよ。
• A-Bpos で引き残った sky と、星のスペクトルを同時にプロットし、sky 差し引き精度を調べよ。
– 天体と同様に、sky の１次元スペクトルも作る。

• Sky の差し引き残差を、さらに処理して差し引け。
– ２次元の AsubB 画像から、１次元の sky を差し引く。
– For loop の活用が必要。

• 星の位置 (Y 座標）を gauss フィットで求めよ。
• FLAT の合成処理を簡易化せよ。
– サブルーチン化。
– リスト・ファイルを読んで、それに基づく処理。

THE END

最後の最後に自分の研究室に帰ったら。。。
• IDLASTRO library 一式は、tar で web から取ってこられます。
• Atv は ATV の site からダウンロードできます。
• Practical IDL programming の web にも、library 一
式 (PIP_Library) が tar で置いてあります。
• それぞれダウンロードして、展開して、IDL_PATH を通してください。
– .cshrc の編集と、source .cshrc を実施。

• データのお持ち帰り方法でヘルプが必要な方は、大山または ADC スタッフにお声がけ下さい。