すばる中秋の名月の学校 宿題までのウォーミングアップichikawa/unix_awk... ·...
TRANSCRIPT
すばる中秋の名月の学校宿題までのウォーミングアップ
市川幸平
2015年 8月
1 はじめに本書の目的は、「すばる中秋の名月の学校 (以下、名月の学校)」の参加者が、模擬研究を行うにあたって必要になるであろう必要最低限の Unix知識を前もって取得しておくことにある。天文学の研究では大量のデータから必要な情報を持ってきたり、大量の計算を行ったりすることは日常茶飯事である。このような時に 1 つずつ人間がファイルを弄ったり計算をしていては終わりが来ない*1し、人間は残念ながらよくミスをする。特定のことを大量にやる、という作業は人間は苦手なのだ。逆に、コンピュータはそういうのが得意で、そのコンピュータに指令を送るのに便利なのがUnixのコマンドである。最終的にコマンドの塊をスクリプトやプログラムとしてまとめておけば、その部分にミスがないかどうかを確認すればよく、ミスが起きていないかの確認作業も場所が絞られてグッと楽になる。このように、Unixコマンドは研究の効率を大幅にあげてくれる要素がふんだんに盛り込まれていて、研究の大きな友となってくれるわけだ。その友に出会える第一歩が本書の目指すところである。すでに Unixのコマンド操作や Perl, Python*2などに慣れ親しんでいる人であれば、ほとんどのページをすっ飛ばして、最後の宿題の部分だけ取り組んでもらっても構わない。ただ、はじめてUnixを触る人であれば、ここで紹介しているコマンドを一緒に動かしてみよう。このページを最後まで読んで、一緒にコマンドを実行した人であれば、最終ページにある宿題はそこまで難しくはならないように設定してある。
2 用意するものこの文書を読み進めるにあたって、まず準備してほしいものを羅列してみた。
• PC
• ターミナル• gnuplot
*1 100 万天体に対して同じ計算をすることにして、人間であれば一回の計算に 10 秒かかるとしよう。それだけで106 × 10 = 107 秒かかる。1日のうち人間は 1/3くらいしか働けないし疲れてくるので、3 × 107 ∼ 107.5 秒くらいはかかるだろう。1日は 24× 3600 = (30− 6)(30 + 6)× 100 = 86400秒しかないし、1年は 107.5 秒くらいしかない。
*2 Perl, Pythonともにプログラミング言語の名前。両言語とも、天文学で良く使われるプログラミング言語。最近はPythonの方が人気な印象。
1
• すばる春の学校「Unixのど基礎」を読む*3
今回、名月の学校に参加する皆さんであれば、自分の PCは所有しているだろうという仮定しても問題ないはず。なので、一つ目はすでにクリアである。また、これから行う作業は、2つ目に挙げているターミナル上で行うものがほとんどなので、ターミナルは準備が必須である。とは言うものの、Linux, Macの場合は、すでにターミナルはインストールされているので、ターミナルを開いておこう*4。Windows の場合は、少し準備が必要。よく行われているのは、Cygwin をインストールして対処する方法。これによって、ターミナルと同等の作業を容易に行うことができるようになる。「Cygwin インストール」 などで検索してみれば、方法はいくつでも見つかるはず。その場合は、後述する gnuplotも Cygwinと同時にインストールしておくと楽である。もしどうしてもインストールがうまくいかない場合は “unix emulator online” などと検索すると、ターミナルっぽいものをウェブ上で使用することができるサイトがいくつか見つかるはず。
gnuplotは今回使用するプロッタ*5である。matplotlib*6が好きだったり、SuperMongo*7 が好きな人は、もちろんそれらを使用しても構わない。が、特に今までこだわりが無かった人は、まずは gnuplotから始めてみよう。満足がいかない点が出てきたあたりで、他のプロッタも使用してみて比較する。そうやって自分の好きなプロッタに今後出会っていけばよい。ちなみに、gnuplotのインストールもそんなに難しくない。各自の OSに合わせてインストールを行うこと*8。最後の「Unixのど基礎」で解説されたことは、今後はすでに既知のものとする。特に Unixを初めて使う人は、「Unixのど基礎」を読んでいなければ、「3章からいきなり難易度が上がったな!」と感じることだろう。必ず一度は目を通し、自分で手を動かしておくこと。ターミナルがあなたの目の前で今開かれているなら、時間はそんなにかからないだろう。「Unixの基礎」で書かれているディレクトリの概念は特に大事だし、ファイルを開いたりするエディタとして emacsも紹介されている*9。これらの言葉や使い方を知っているだけで、今後の解説の理解度がグッと変わってくるはずだ。
3 ターミナルを開いて遊んでみる3.1 ファイルのダウンロード
では、まずはターミナルを開いて少し遊んでみる。ターミナルを開いたら、おそらくは自分のホームディレクトリにいるはず。自分が今どのディレクトリにいるのかの確認は、pwd コマン
*3 http://www.naoj.org/Observing/DataReduction/mtk/spring12/references/unix_class.pdf
Unixのど基礎に何度か出てくる別冊はhttp://www.naoj.org/Observing/DataReduction/mtk/spring12/references/linuxbasic10s.pdf に ある。
*4 もしターミナルがどこにあるかわからない場合はウェブ等で検索してみよう*5 図を描画するソフト/ライブラリのこと。*6 天文業界で良く使われるプロッタその 1。Pythonパッケージの一つであり、Pythonユーザであれば違和感なく習得が可能である。
*7 天文業界で良く使われるプロッタその 2。*8 これも、わからないければ自分で調べてみたり、近くにいる詳しそうな友人や先輩に質問してみよう。*9 世の中には数多くのエディタが存在するが、少なくとも一つは使えるようにしておこう。そこで不満が出始めたら別のエディタと比較検討して乗り換えていこう。emacs, vi, geditなどは周りにもユーザーがいることだろう。大事なのは、彼らが言うことを鵜呑みにするのではなく、自分にマッチしているかどうかを自分で判断するという姿勢である。そうでないと、気がつかないうちに不毛なエディタ戦争に巻き込まれてしまっているかもしれない。
2
ド*10で可能だ。僕の場合、
$ pwd
/home/ichikawa
/home/ichikawaにいる。このディレクトリ名は各自異なるはずだが、自分の好きなディレクトリ下で作業をしてほしい。僕はこの/home/ichikawa ディレクトリで作業をすることにする。さて、自分のいるディレクトリ*11が確認できたところで、
$ wget http://www.kusastro.kyoto-u.ac.jp/~ichikawa/Autumn2015.tar.gz
と打ってみよう。データのダウンロードが始まるはず。ダウンロードが済んだのを、ls コマンド*12で確認しよう。
$ ls
Autumn2015.tar.gz
lsコマンドは特定のファイルやディレクトリを探すのにも便利である。
$ ls Autumn2015.tar.gz
Autumn2015.tar.gz
とファイル名が返ってくれば、カレントディレクトリに “Autumn2015.tar.gz” があるという意味になる。ところで、さきほどのコマンドのファイル名、まさか全部手でタイプはしていないだろうか。
$ ls A
まで打った時点で、一度タブキーを押してみよう。すると、
$ ls Autumn2015.tar.gz
と勝手にファイル名を補完してくれる。Unixコマンドは、タブキーを押すと、ユニーク性が保たれる部分までは勝手にファイル名などの補完を行ってくれる。人間がタイプする手間を省いてくれる優しさあふれる設計をしてくれているのだ。これは、ディレクトリの移動をする際や、長いファイル名などを打ちたいときなどに大活躍する。さて、話を元に戻そう。ダウンロードしたファイルは “.tar.gz”という拡張子を持っていて、このままではファイルの中身を見ることができない。解凍をするには tarコマンドを使う。
$ tar zxvf Autumn2015.tar.gz
とすれば、解凍がはじまる*13。lsしてみると、新しいディレクトリが表示されるはず。
$ ls
Autumn2015/ Autumn2015.tar.gz
*10 print working directoryの略。*11 自分が今いるディレクトリをカレントディレクトリという。*12 listの略。*13 きちんと tar zxvf Aまでタイプところでタブキーを押しただろうか。もしそうでないなら、君は少なくとも数秒は人生を無駄にしてしまった。
3
もし wgetを打ってもエラーが返ってくるようだったら、その場合は wgetがインストールされていないかもしれない。そのチェックには whichコマンドを使ってみよう。
$ which wget
/usr/bin/wget
などとパス*14が返ってくれば、wget はきちんとインストールされている。wget コマンドはきちんと動くはずだ。もう一度 URLなどが間違っていないかチェックしよう。一方で、whichコマンドを打って
$ which wget
$
などと何も返事が返って来ない場合は、wget コマンドはインストールされていない*15。wget コマンドを自分でインストールするか、直接 URLを打ち込んでダウンロードを行い、カレントディレクトリまでファイルを移動しよう。そのためには mvコマンドが便利だ。あなたが指定しているダウンロードディレクトリが”YourDownloadDirectory” という名前だとすると、そのディレクトリからカレントディレクトリ “.”まで mvしたいので、
$ mv YourDownloadDirectory/Autumn2015.tar.gz .
$ tar zxvf Autumn2015.tar.gz
最期に “.” が書かれているのを見逃さないようにしよう。tar で解凍して現れるディレクトリ“Autumn2015”内に、今回のウォーミングアップで使用するデータをすべて入れておいた。もし以下で説明するダウンロードがうまくいかなかった場合は、このファイルの中に入っているものを適宜 cpして使用しよう。
3.2 今回扱うデータのダウンロード
さて、今回のウォーミングアップでは、実際の観測サーベイのカタログデータを利用してみる。使用するカタログは、Swift/BAT 70ヶ月カタログ (以後、BATカタログと言う) で、これは硬 X
線*16(E = 14 − 195 keV) で全天を 70ヶ月間サーベイして受かった*17天体をまとめている。まずは、BAT カタログのウェブサイト*18 に行き、カタログを見てみよう。図 1 のようなカタログを紹介するウェブサイトにたどり着くはずだ。今回はテキストデータを扱うので、“BAT
70-month Survey Products” と書かれているところの “Catalog: ASCII (∼300 KB)” の部分をクリックしてみよう。すると、よくわからないテキスト文字列の羅列が表示されるだろう。よく見てみると、これは、区切り文字*19 が | (バー) で、左から順に天体の番号、天体名 (SWIFT
*14 /usr/bin/wget は wget がどこに存在するかを表しているファイルの住所のようなもの。このようなものをパスと言う。詳細を知りたければ検索してみよう。
*15 あるいは、wgetコマンドが存在する場所にパスが通っていない。*16 硬 X 線は “hard X-ray” の日本語訳。天文業界では、X 線のうち、高エネルギー側を “hard (硬)” X 線、低エネルギー側を “soft (軟)” X線と呼ぶ。soft/hardの境界となるエネルギーは必ずしも決まっていないが、感覚的にはE = 2 keVを境に softから hardと言う人が増える。
*17 “detect”の和訳として、「受かる」という言葉を天文学者はよく使う。たとえば、「NGC 1068で Hα輝線が受かった」などのように使う。天文学者以外ではあまり使わないかもしれない。
*18 http://swift.gsfc.nasa.gov/results/bs70mon/
*19 セパレータと言ったりもする。
4
図 1 Swift/BAT 70 ヶ月カタログに載っている天体の種類と位置。わからない単語は自分で調べてみよう。http://swift.gsfc.nasa.gov/results/bs70mon/より取得。
JXXXX.X-XXXXで表示されているもの)、赤経 (RA)、赤緯 (DEC)、· · · と並んでいるのがわかる。つまり、一列ごとに各天体ごとの情報がずらりと並んでいるカタログであることがわかってくる。これが今回、我々がウォーミングアップに使用するカタログデータである。では、次にこれを自分の PCにダウンロードしてみよう。ダウンロードするには、Macであれば “Cmd+s”であったり、コピペする方法でもよいのだけれども*20、今回はターミナルでコマンドを使ってダウンロードを試してみる。すでに試した wgetコマンドを使えば*21、ターミナル上で
$wget http://swift.gsfc.nasa.gov/results/bs70mon/inc/data/BAT_70m_catalog_20nov2012.txt
とすると、今自分がいるディレクトリに “BAT 70m catalog 20nov2012.txt”というファイルが存在しているはず。ファイル確認の方法は lsコマンドだった。
$ls
Autumn2015/ Autumn2015.tar.gz BAT_70m_catalog_20nov2012.dat
どうせなので、BATカタログデータを新しいディレクトリを作って、その下におくことにしよう。新しいディレクトリの作成は mkdirコマンド*22を使う。
$ mkdir BAT70mon
$ ls
Autumn2015/ Autumn2015.tar.gz BAT70mon/ BAT_70m_catalog_20nov2012.dat
*20 あまりおすすめしないけれども。*21 もし wgetがうまくいかなかった場合は、Autumn2015/ の下に同様のファイルを置いてあるので、自分で cpしてくること。
*22 Make directoryの略だったような。
5
ファイルを移動しよう。ファイルの移動は mvコマンド*23が使える。ファイル名が長いので、タブキーを使って、補完機能を使っていこう。
$ mv BAT_70m_catalog_20nov2012.dat BAT70mon/
$ ls
Autumn2015/ Autumn2015.tar.gz BAT70mon/
ls してみると、BAT カタログデータが表示されていない。これで、BAT カタログデータは、“BAT70mon” ディレクトリの下に移動したことが確認できた。さて、我々も BAT70monディレクトリの下に行きたい。ディレクトリの移動は “cd”コマンド*24で可能だ。
$ cd BAT70mon/
$ pwd
/home/ichikawa/BAT70mon
$ ls
BAT_70m_catalog_20nov2012.dat
BAT70monの下にきちんと BATカタログデータが入っていることがわかる。
3.3 カタログを少し見てみる
さて、BATカタログの中身を見てみよう。データの中身を見る場合は “less”コマンドが使える。
$ less BAT_70m_catalog_20nov2012.dat
| BAT_NAME| RA| DEC| SNR| COUNTERPART_NAME| OTHER_NAME| CTPT_RA|CTPT_DEC| FLUX| FLUX_LO| FLUX_HI|CONTA|GAMM|GAMM|GAMM| CHI_SQ_R|REDSHIF| LUM|ASSOC_STREN| CL2| TYPE
| | deg| deg| | | | deg| deg|10^-12er|10^-12er|10^-12er| | | | | | |log[e| | |
1|SWIFT J0001.0-0708 | 0.261| -7.123| 6.10|2MASX J00004876-0709117 | | 0.2032| -7.1532| 13.03| 9.05| 17.56| 0.00|2.17|1.75|2.69| 0.60| 0.0000| NULL| 0| 2|Galaxy
2|SWIFT J0001.6-7701 | 0.326|-77.001| 5.41|Fairall 1203 | | 0.4419|-76.9540| 10.10| 6.61| 14.08| 0.00|2.02|1.54|2.60| 0.70| 0.0584|43.92| 0| 4|Sy1
3|SWIFT J0002.5+0323 | 0.664| 3.332| 5.10|NGC 7811 | | 0.6103| 3.3519| 11.69| 7.36| 16.64| 0.00|1.82|1.31|2.39| 0.50| 0.0255|43.24| 0| 4|Sy1.5
4|SWIFT J0003.3+2737 | 0.862| 27.676| 5.03|2MASX J00032742+2739173 ...
...
どうやら、一行目には各列にどのようなデータが入っているかの説明が書かれているようだ。二行目は、degなどと書かれているのをみると、どうやら各列の単位が書かれている。あと、6列目には天体名が入っている。でもこいつら、列が多すぎていかんせん見づらい。たとえば、6列目だけを抜き出したいときにはどうしたらいいんだろうか。その場合には awkというプログラミング言語が非常に便利だ。
$ which awk
/usr/bin/awk
などときちんとパスが返ってくれば、君の PCでも awkは使える。さっそく、awkを使って 6列目だけを抜き出そう。
*23 moveの略*24 change directoryの略。
6
$ awk -F"|" ’{print $6}’ BAT_70m_catalog_20nov2012.txt
...
2MASX J23470479+5142179
PKS 2349-01
IGR J23524+5842
2MASX J23525143-1704370
H 2356-309
PKS 2356-61
$
このコマンドには少し解説が必要だろう。今、右端にファイル名が書かれている。このファイルの中にあるデータの 6列目を抜き出したい。それが awk ’{print $6}’の部分だ。ただ、これだけでは今回はうまくいかない。awkは基本の区切り文字は空白 “ ” を採用しているので、区切り文字は |であることを伝える必要がある。それがオプション部分の-F”|”だ。まとめると、上のコマンドは「BAT 70m catalog 20nov2012.txt というファイルの 6列目を、区切り文字 |で (一行ずつ)表示せよ。」となる。次に、今回のカタログの座標を切り出してみよう。このカタログには座標は 3列目 (R.A.*25)、4
列目 (Dec*26) と 8列目 (ctpt RA)、9列目 (ctpt DEC) に入っている。元論文*27を読む限り、8
列目、9列目の座標を使った方が良さそうだ。なので、今後はカタログから 8列目と 9列目を抜き出そう。またもや awkを使って、
$ awk -F"|" ’{print $8,$9}’ BAT_70m_catalog_20nov2012.txt
...
358.1120 58.7000
358.2143 -17.0770
359.7830 -30.6280
359.7682 -60.9165
とすればよい。さきほどの$6の部分が、$8, $9となっているのがわかる。これで、「8列目と 9列目を表示する」という意味になるのだ。非常に直感的でわかりやすい。さて、どうせなので、後でいくらでも確認できるように、この座標を新たなファイルに保存してしまおう。これは簡単で、> という記号を使う。ファイル名は “ra vs dec.txt”としよう。
$ awk -F"|" ’{print $8,$9}’ BAT_70m_catalog_20nov2012.txt > ra_vs_dec.txt
$ ls
BAT_70m_catalog_20nov2012.dat ra_vs_dec.txt
$ less ra_vs_dec.txt
CTPT_RA CTPT_DEC
*25 R.A. は Right Ascension の略。日本語では赤経という。後に出てくる赤緯と共に用いることで、天球上の二次元面の座標を表現することができる。天文学でよく用いられる座標系の一つである。詳細はhttp://www.kusastro.kyoto-u.ac.jp/~iwamuro/LECTURE/OBS/coord.html などを参考にしてみよう。
*26 Declinationの略。赤緯という。*27 http://adsabs.harvard.edu/abs/2013ApJS..207...19B
7
deg deg
0.2032 -7.1532
0.4419 -76.9540
0.6103 3.3519
0.8643 27.6548
1.0082 70.3217
1.5813 20.2029
...
と新たに “ra vs dec.txt”というファイルが作られているのがわかる。このように >を用いて (標準) 出力先をファイルに書き換えることを「リダイレクト」と言う。この機能は非常によく使うので、必ず覚えておこう。さて、さきほどのファイル (ra vs dec.txt) を見てみると最初の三行ほどは座標以外のものが入ってしまっている。これらを除きたいときは、たとえば以下のようにすればよい。
$ awk ’NR>3{print}’ ra_vs_dec.txt > ra_vs_dec_nohead.txt
NR というのは行数を表す。awk は一行ごとに処理をするため、一行目の処理のときには NR
は 1、二行目の処理のときには NR は 2,m 行目の処理のときには NR は整数 m が入っている。’NR>3{print}’ の部分は、「NRが 3より大きいときにのみ、printを行う。」という意味になる。awkの場合、printの後に何もかかなければ、すべての列を表示する、という意味になる。まとめると、このコマンドは「ra vs dec.txtの 4列目以降をすべて表示せよ」という意味であることがわかる*28。さて、本当に余分な部分は切り取られただろうか。その確認方法は、lessコマンドで可能であった。実は、別の方法もある。要は最初の数行が切り取られているかを確認すればいいわけだから、headコマンドも使うことができる。headコマンドは、ファイルの先頭から 10行を表示するコマンドだ。
$ head ra_vs_dec_nohead.txt
0.2032 -7.1532
0.4419 -76.9540
0.6103 3.3519
0.8643 27.6548
1.0082 70.3217
1.5813 20.2029
2.2982 -0.6152
2.6292 10.9749
4.2853 81.5856
5.2814 -19.1682
見事、最初の 3行分は切り取られているのがわかる。ファイルの上から n行を取り出したい時は、オプション −nをつければよく、
*28 実はこのコマンドは、{print}部分を省いても、同様の操作が行える。
8
$ head -n ra_vs_dec_nohead.txt
などとすればよい。
3.4 プロットしてみる
さて、座標を手に入れたのだから、それをプロットしてみたくなるものだろう。ここでとうとうgnuplotの登場だ。gnuplotと打ってみよう。
$ gnuplot
G N U P L O T
Version 4.6 patchlevel 1 last modified 2012-09-26
Build System: Darwin x86_64
Copyright (C) 1986-1993, 1998, 2004, 2007-2012
Thomas Williams, Colin Kelley and many others
gnuplot home: http://www.gnuplot.info
faq, bugs, etc: type "help FAQ"
immediate help: type "help" (plot window: hit ’h’)
Terminal type set to ’x11’
gnuplot>
みたいなものが出てくれば、gnuplotにログイン完了だ。さて、まずは簡単なものを試してみよう。
gnuplot> plot sin(x)
と打てば、図 2が表示されるだろう。
-1
-0.8
-0.6
-0.4
-0.2
0
0.2
0.4
0.6
0.8
1
-10 -5 0 5 10
sin(x)
図 2 gnuplotで作成した y = sin(x)の図。
9
このように、gnuplotは最初に用意されている関数をもとにプロットをすることができる。gnuplot は我々が用意したファイルをプロットすることもできる。次は以下のように打ってみよう。
gnuplot> plot "ra_vs_dec_nohead.txt" u 1:2
すると、図 3のような図が現れる。このコマンドは、 ”ra vs dec nohead.txt”の 1列目を横軸、2列目を縦軸にして、データをプロットせよ、という意味をもつ。実は u 1:2の “u”は “using”の略で、ユニーク性が保たれていれば、gnuplotはコマンドの省略が可能である。gnuplot では様々な条件を “set ∼”と書くが、“se ∼”でも同様の挙動をしてくれる。gnuplotは文字を打つ手間を省いてくれる優しさも持ち合わせているのだ。
-100
-80
-60
-40
-20
0
20
40
60
80
100
0 50 100 150 200 250 300 350 400
"ra_vs_dec_nohead.txt"
図 3 天球上の BATカタログ天体の分布。横軸は R.A.、縦軸は Dec
あらためて図 3をみてみよう。基本的にはまんべんなく天体は分布しているのがわかるが、座標(180,−60)くらいから (300, 40)くらいまでにかけて、一筋の天体の塊が見えている。これはなんだろうか。答えは後でわかるはず。図の見栄えをもう少しマシにしよう。まず、右上の “ra vs dec.txt”の部分は図が見えづらくなるので省きたい。横軸、縦軸の範囲も座標が分布する 0 ≤ x ≤ 360と −90 ≤ y ≤ 90 にしてみたい。その場合は、続いて以下を打ってみよう。
gnuplot> se xrange[0:360]
gnuplot> se yrange[-90:90]
gnuplot> plot "ra_vs_dec_nohead.txt" u 1:2 notitle
図 4のようになるはずだ。この他にも、色を変更したり、プロット点の種類を変更したり、大きさを変更したりも可能である。また、軸の文字が見づらい場合も好きなように変更できる。興味がある人は自分で調べてみよう。さて、最後に図を保存してみよう。自分の見やすい形式 (.png とか) にしてくれてもよい。この文書の執筆時では、天文学の業界では保存形式は.eps あるいは.pdf が主流である。なので今回は.eps形式の保存方法を紹介しよう。他の形式も保存方法はほとんど変わらないので、ぜひ試してもらいたい。
gnuplot> se term eps
10
-80
-60
-40
-20
0
20
40
60
80
0 50 100 150 200 250 300 350
図 4 天球上の BATカタログ天体の分布改訂版。横軸は R.A.、縦軸は Dec
Terminal type set to ’epscairo’
Options are ’ transparent fontscale 0.5 size 5.00in, 3.00in ’
gnuplot> se output "radec.eps"
gnuplot> replot
gnuplot> exit
最初に保存したい eps 形式を指定 (se term eps) して、その次に保存するファイル名を指定 (se
output ”radec.eps”) している。その後、もう一度プロットしてやる (replot)。最後に、gnuplot
をログアウト (exit)。これで、図 4と同じものが”radec.eps”として保存されているはずだ。
$ ls
BAT_70m_catalog_20nov2012.dat ra_vs_dec.txt ra_vs_dec_nohead.txt radec.eps
ちなみに、eps ファイルは Mac ユーザーや一部の Linux ディストリビューションであれば、openコマンドで見ることが可能である。
$ open radec.eps
open コマンドに相当するコマンドはディストリビューションごとにいくつかあるようなので、Linuxユーザーは各自チェックされたし。
3.5 どれくらい遠い天体がいるのだろう
BATカタログには天体の距離情報として、18列目に赤方偏移 z*29の情報が入っている。また、19列目には X線光度*30を logスケールで表した量が入っている。この 2つの量を取得してプロットをすれば、このカタログには、どの距離にどれくらいの明るさのものが存在するかが見て取れる
*29 赤方偏移, 英語で redshift は慣例的に z を用いる。定義は、本来の静止波長 λini に対して、観測波長が λobs
のとき、λobs = (1 + z)λini で定義される。つまり、波長の伸び具合を z で表している。z の値が大きいほど我々から遠い場所にあることを示していて、z = 0.1 でだいたい 10 億光年ほど離れている。世の中にはz を入れるとどれくらい離れているかを計算してくれるウェブサイトはたくさんあり、たとえば cosmo calc
http://www.astro.ucla.edu/~wright/CosmoCalc.html などはよく見かけるウェブサイトである。*30 光度: 天文学で良く用いる量で、単位は erg/s。つまり、単位時間あたりに天体から放射されるエネルギーを表す。
11
だろう。もう皆さん慣れてきたと思うけれども、こういう時は awkが便利だ。
$ awk -F"|" ’{print $18,$19}’ BAT_70m_catalog_20nov2012.dat
...
0.1640 44.95
-1.0000 NULL
0.1651 45.16
0.0963 44.52
となる。どうやら、いくつかの天体には z の情報に −1.0000が入っているようだ。その時には 2
列目は”NULL”が入っている。このような天体は、信頼できる z 情報が得られないほど近傍の天体の場合が多い。今回は、そういう天体は何天体いるのかを一応調べておこう。そのような条件の天体数をカウントするだけのシンプルな作業だ。もちろん手で数えてはいけない。人間は必ずミスをする。なので、Unixコマンドに頼ろう。そういう時は、wcコマンドが活躍してくれる。
$ wc -l BAT_70m_catalog_20nov2012.dat
1213 BAT_70m_catalog_20nov2012.dat
のように、ファイルの行数を数えてくれる。これを使うと、
$ awk -F"|" ’$19~/NULL/{print $18,$19}’ BAT_70m_catalog_20nov2012.dat | wc -l
432
と書ける。少々難しいかもしれないが、これは、|の左半分で「19列目に NULLという単語が入っている行のみ、18、19 列目を表示する」ということを行い、その表示をそのまま | の右側に引き継ぎ*31、wc -lコマンドで表示された行数を数えている。そして、返された数が 432である。つまり、1213天体*32中、432天体には信頼できる z 情報が入っていない。さて、当初の目的は「このカタログにはどの程度の zにどの程度の光度の天体が存在しているのか?」であった。上記の 432天体は超近傍にいることはわかっているので、今回はこれを省いてファイルに出力して、プロットをしてやろう。
$ awk -F"|" ’NR>3 && $19!~/NULL/{print $18,$19}’ BAT_70m_catalog_20nov2012.dat > z_vs_lx.txt
awkの条件にいろいろ書かれているが、これは「4列目以降 (NR> 3) かつ、19列目に NULLという単語が入っていない行 ($19!∼/NULL/) のみ、18、19列目を表示する。」というものである。これで、一列目に z、二列目に X線光度 log LX が入っている “z vs lx.txt”を作ることができた。さて、どうせなので、最遠方天体の zを調べてみよう。こういうときは、sortコマンドが便利だ。
$ sort z_vs_lx.txt
...
3.1040 48.36
3.2000 47.98
3.2680 48.42
3.3660 48.01
*31 このように出力を次のコマンドに引き継ぐ役割を持つ |を、「パイプ」という。*32 正確には、最初の 3行には天体情報が入っていないので、1210天体
12
3.6680 48.14
と、1列目に入っている z を小さい方から順に並べてくれている。どうやら最大は z = 3.668のようだ。同じように、X 線光度の最小値、最大値も調べてみよう。X 線光度は 2 列目のデータなので、sortコマンドに 2列目で sortするよう-kオプションを加えてやれば良い。
$ sort -k2 z_vs_lx.txt
...
3.2680 48.42
2.4000 48.45
2.3450 48.55
2.9793 48.57
2.5000 48.63
X線光度の最大値は log LX/erg s−1 = 48.63のようだ。太陽光度はおよそ 4 × 1033 erg s−1 なので、この天体は太陽よりおよそ 1015 倍は明るいことになる。次に、X線光度の最小値を探そう。sortと headを合わせて
$ sort -k2 z_vs_lx.txt | head -5
0.0007 39.81
0.0011 40.79
0.0029 41.02
0.0015 41.03
0.0033 41.47
としてもよいし、sortのオプション-r (逆順表示) を用いて、
$ sort -k2 -r z_vs_lx.txt
...
0.0033 41.47
0.0015 41.03
0.0029 41.02
0.0011 40.79
0.0007 39.81
としてもよい。どうやら X線光度の最小値は log LX/erg s−1 = 39.81だ。それでも太陽光度のだいたい 106 倍である。さて、最後に “z vs lx.txt”に入っているデータを gnuplotでプロットしてみよう。
$ gnuplot
gnuplot> plot "z_vs_lx.txt" u 1:2
図 5を見てみると、ほとんどの天体は z < 0.5に分布していて、まばらに z = 4.0近くまで天体が分布しているのがわかる。桁を超える幅広いパラメータ範囲を表示するには log表示が便利なので、x軸を log表示してみよう。gnuplotにはそのような機能も備わっている。
13
39
40
41
42
43
44
45
46
47
48
49
0 0.5 1 1.5 2 2.5 3 3.5 4
"z_vs_lx.txt"
図 5 BATカタログ天体の z (x軸)と X線光度 (y 軸) の関係
gnuplot> se logscale x
gnuplot> plot "z_vs_lx.txt" u 1:2
としてやると、図 6のようなプロットが見られるはずだ。
39
40
41
42
43
44
45
46
47
48
49
0.0001 0.001 0.01 0.1 1 10
"z_vs_lx.txt"
図 6 BATカタログ天体の z (x軸)と X線光度 (y 軸) の関係
図 6を見てあげると、z = 0.01 − 0.3にかけて多くの天体が分布しているのがわかる。また、皆さんも気づいたかもしれないが、図の右下には天体がまったく存在していない。これは遠方宇宙(z ∼ 1) には、近傍宇宙 (たとえば z ∼ 0.01) で見られるような光度 (log LX = 42 − 44) の天体はまったくいないという意味なのだろうか。必ずしもそれは真とは限らない。BATサーベイも含めて、その装置ごとに限界等級や限界 fluxが決まっているため、より遠方のものほど、もともと明るいものしか受かって来ないのだ。なので、右下の領域 (z 大かつ log LX 小) に存在するような天体は BATサーベイではそもそも受からず、議論をすることはできない。一方、左上の領域 (z 小かつ log LX 大) も天体はほとんどいないが、これは純粋にそのような天体はレアであることがわかる。ここに書いてある説明はやや難しいかもしれないが、興味がある人は、横軸を z, 縦軸を X線fluxとしてプロットをしてみるとよい。fluxと光度 (luminosity) の違いや、限界 fluxの理解の助けになるはずだ。
14
3.6 筋模様の天体を暴くさて、図 3や図 4などに見られた筋模様はどのような天体が分布して作っているのだろう。ありがたいことに、BATカタログは天体を種族ごとにわけて idしており、その情報はカタログの 21列目に入っている。種族ごとに R.A., Dec情報を取得して、同様に plotしてみよう。たとえば、いわゆる活動銀河核 (Active Galactic Nuclei; AGN) と呼ばれる種族は、カタログでは id =4–8に分類されている。これを取得してみよう。
$ awk -F"|" ’$21>=4 && $21<=8 {print $8,$9}’ BAT_70m_catalog_20nov2012.dat > ra_vs_dec_AGN.txt
として、gnuplotで plotしてみる (自分でやってみよう)。すると、図 7のようになるはずだ。
-100
-80
-60
-40
-20
0
20
40
60
80
100
0 50 100 150 200 250 300 350 400
"ra_vs_dec_AGN.txt"
図 7 BATカタログ内の AGNの分布。横軸は R.A.、縦軸は Dec。
図 7を見てやる限り、AGNは一様に分布しているように見えるが、どうやら筋模様に該当する部分にはあまり存在していない。AGNは筋模様の起源ではなさそうだ。AGNは銀河系の外に存在する天体なので、筋模様は銀河系内の天体が作り出しているのかもしれない。同様にして、いくつかの種族の座標を取り出してファイルに保存し、gnuplotで表示してみるとよい。よい awkの訓練になるはずだ。銀河系内の天体としては X線連星 (X-ray binary) やパルサー、激変星 (cataclysmic variable;
CV) などが考えられる。これら系内天体候補をすべて含むためには、id = 1と 9 ≤ id ≤ 15の種族の座標を取り出せば良い。取り出す方法は今の読者ならうまくできるはずだ。わからない場合は自分で調べてみよう。調べる力も大事だ*33。座標を表示してみると、図 8のようになる。図 8 を見てやれば、見事、系内天体が筋模様を作っていたことがわかる。実は筋模様に独立して、図の左下あたりに 2つほど点の分布 ((80,−70)と (20,−75)あたり) があることがわかるが、この分布はどこ由来なのかを調べてみるのも勉強になるだろう。
3.7 まとめ
以上、一つのカタログを元に、天体の様々な分布を見てやることができた。Unix コマンドやawkの大事さが伝わっただろうか。ここからはさらに Unixや awkの知識をどんどんつけていく
*33 awkの条件式で or (または) に対応するものがわかれば、後は簡単なはず。
15
-100
-80
-60
-40
-20
0
20
40
60
80
0 50 100 150 200 250 300 350 400
図 8 BATカタログ内の系内天体の分布。横軸は R.A.、縦軸は Dec。
のもよいし、少し背伸びをしたければ、Pythonというプログラミング言語を使えば、皆さんがやりたいことの幅をさらに広げてくれるだろう。実際の研究では今回よりもさらに条件を絞ったり、より定量的な議論を行ったり、他のカタログとマッチングを取ったりしていろいろなことを行うわけだが、そのあたりは実際に模擬研究で体験できるはずだ。
16
4 宿題1. 今回紹介した Unixのコマンド、および Unixの大事な概念であるリダイレクト、パイプを自分で復習せよ。
2. BAT カタログデータ “BAT 70m catalog 20nov2012.dat” には最初三行だけ天体情報が入っていない。Unix コマンド wc を用いてファイルの行数を数え、tail コマンドを用いて*34、最初の三行を削った新たなファイル “BAT 70m catalog nohead.dat” を作成せよ。作成後に、wcコマンドを用いて、ファイルの行数が三行少なくなっていることを確認せよ。
3. 世の中にはコメントアウトという概念があり、コメントアウトしたところは飛ばしてデータを読み込むオプションが様々なプログラミング言語で用意されている。カタログデータの最初 3行のみ、行の先頭に#を追加し、ファイル名 “BAT 70m catalog cmthead.dat”として保存せよ。
4. BATカタログデータから z > 1を満たす天体のみを抜き出し、“BAT 70m catalog zgt1.dat”
として保存せよ。また、天体数も数えて答えよ。5. “BAT 70m catalog zgt1.dat”にはどのような種族が入っているだろうか。2種類に絞られるはずだが、その種族の名前 (BATカタログウェブサイトでいうところの source type) を答えよ。また、それぞれの種族の天体数を数えよ。
6. “BAT 70m catalog zgt1.dat”に入っている 2種族を分類し*35、それぞれ “BAT 70m catalog zgt1 ty7.dat”
、“BAT 70m catalog zgt1 ty8.dat” として保存せよ。7. “BAT 70m catalog zgt1 ty7.dat”および “BAT 70m catalog zgt1 ty8.dat”に入っている天体の種族の座標分布 (横軸を R. A., 縦軸を Dec) をそれぞれの種族の分布がわかるように一つの図に表示し、保存せよ。余裕があれば、各自 gnuplotのオプションを調べ、横軸や縦軸のタイトルを加えたりフォントサイズを大きくしたりなどして、図を見やすくする工夫をしてみよ。
*34 tail: ファイルの末尾を表示するコマンド。*35 ヒント: たとえば、awkで条件を付けて表示してやればよい。
17
•参考文献・ウェブサイト世の中には Unixや awkの解説書はたくさんあるが、まずは googleで検索して、解答にたどり着く力を得られるようにしよう。あなたがMacユーザーで、Unixに初めて触れて、ターミナルでさらにどんなことができるのかを知りたいのであれば、入門 Unix for Mac OS X*36という本がある。また、awkをもっと詳しく学びたいという人もいるかもしれない。その場合にはプログラミング言語 AWK*37 という素晴らしい本がある。この本の後半はこのご時世、もはや awkでやる必要があるのか、という気もするが、前半は便利なワンライナー*38がたくさん載っている。また、本書で紹介した BAT カタログ内の天体を細かく調べてみたい人がいるかもしれない。世の中には天体の検索方法はたくさんある。まずは、NASA Extragalactic Database
(NED)*39で調べてみるとよいだろう。天体の座標や z だけでなく、天体がどのような種族 (銀河なのか Blazarなのか等) なのか、過去にどの波長でその天体が観測されていて、その値はいくらで · · · という情報まで載っている。また、SIMBAD Astronomical Database*40も同様に有用だ。Simbadでは天体検索をすると、検索結果の右側の画面*41で、各波長の画像が非常に簡単に見ることができる。しかし肝に命じてもらいたいのは、「NED や Simbad に情報がない」からと言って、それを根拠に結論を出すのは危険である。NEDや Simbadはあくまで過去の論文やサーベイの結果を集約して表示しているのであって、過去の観測のすべてを網羅しているのではないことをきちんと理解しておこう。(ここから書くことは読み飛ばしてもらってかまわないが) 論文で AGN の可否を NED などに頼っている場合が見られるが、「AGN という情報がない」からと言って「この天体は AGNではない」という結論に必ずしもなるわけではない。気をつけよう。
•著者紹介市川 幸平 (Ichikawa, Kohei) https://motigomeman.wordpress.com/
国立天文台ハワイ観測所プロジェクト研究員。京都大学大学院 宇宙物理学教室で博士号 (理学) を取得。超巨大ブラックホールの成長現場として活動銀河核に興味を持ち、活動銀河核 (AGN) がどのようにして誕生してはブラックホールに物を落とし、最期を迎えるのかを研究している。
*36 http://www.oreilly.co.jp/books/9784873116440/
*37 https://www.usp-lab.com/book.awk.html
*38 意味がわからなければ調べるのである。*39 http://ned.ipac.caltech.edu/
*40 http://simbad.u-strasbg.fr/simbad/
*41 AladinLiteという
18
5 解答1. 略2. $ wc BAT_70m_catalog_20nov2012.dat
1213 20988 301789 BAT_70m_catalog_20nov2012.dat
$ tail -1210 BAT_70m_catalog_20nov2012.dat > BAT_70m_catalog_nohead.txt
$ wc BAT_70m_catalog_nohead.txt
1210 20956 301290 BAT_70m_catalog_nohead.txt
3. $ awk ’NR<=3{print "#"$0}NR>3’ BAT_70m_catalog_20nov2012.dat > BAT_70m_catalog_cmthead.txt
4. $ awk -F"|" ’$18>1.0’ BAT_70m_catalog_nohead.txt > BAT_70m_catalog_zgt1.txt
$ wc -l BAT_70m_catalog_zgt1.txt
30 BAT_70m_catalog_zgt1.txt
より、は 30天体存在する。5. $ awk -F"|" ’{print $21}’ BAT_70m_catalog_zgt1.txt | sort | uniq
7
8
より、source typeは 7: Blazar/BL Lacと 8: QSOである。また、それぞれの天体数は
$ awk -F"|" ’$21==7{print $21}’ BAT_70m_catalog_zgt1.txt | wc -l
11
$ awk -F"|" ’$21==8{print $21}’ BAT_70m_catalog_zgt1.txt | wc -l
19
より、種族 7は 11天体、種族 8は 19天体である。6. $ awk -F"|" ’$21==7 {print}’ BAT_70m_catalog_zgt1.txt > BAT_70m_catalog_zgt1_ty7.txt
$ awk -F"|" ’$21==8 {print}’ BAT_70m_catalog_zgt1.txt > BAT_70m_catalog_zgt1_ty8.txt
7. $ gnuplot
gnuplot> se datafile sepa "|"
gnuplot> plot "BAT_70m_catalog_zgt1_ty7.txt" u 8:9, "BAT_70m_catalog_zgt1_ty8.txt" u 8:9
gnuplot> se term eps
Terminal type set to ’epscairo’
Options are ’ transparent fontscale 0.5 size 5.00in, 3.00in ’
gnuplot> se output "radec_zgt1.eps"
gnuplot> replot
gnuplot> exit
できあがる図はこんな感じ。
19
-60
-40
-20
0
20
40
60
80
100
0 50 100 150 200 250 300 350 400
"BAT_70m_catalog_zgt1_ty7.txt" u 8:9"BAT_70m_catalog_zgt1_ty8.txt" u 8:9
図 9 BATカタログ内の系内天体の分布。横軸は R.A.、縦軸は Dec。
20