はじめに
CIAO の combine_spectra は、名前の通り複数のスペクトルを合成するためのツールだと思っていました。そのため、入力スペクトルが 1 本しかない年については、「そもそも combine_spectra は使えないのでは」と思い込んでいました。
ところが実際に試してみると、スペクトルが 1 本でも combine_spectra は普通に動きます。
エラーも出ず、特別な指定も不要でした。
最初は少し意外でしたが、解析を進めるうちに、これはかなりよく考えられた仕様だと感じるようになりました。
「1本なら combine_spectra は不要」という思い込み
年ごとにデータをまとめる解析では、
- ある年は観測が 1 本
- 別の年は 2 本
- さらに別の年は 10 本以上
という状況が普通に起こります。
このとき直感的には、
- 複数本 →
combine_spectra - 1 本 →
cpで済ませる
と分岐を書きたくなります。私も最初はそう考えていました。
例外を作らなくていいことの強さ
combine_spectra は、入力が 1 本でも複数本でも、同じフローで処理できます。
combine_spectra infile.pha combined
このコマンドは、
- 入力が 1 本でも
- 入力が N 本でも
例外を出さずに最後まで走ります。
つまり、
- 「1 本の年」
- 「2 本の年」
- 「10 本の年」
を完全に同一のスクリプトで処理できるということになります。
これは年 bin 解析や自動化を考えると、想像以上に大きなメリットでした。
なぜ cp で代替できないのか
「1 本なら cp すればいいのでは?」という考えも一見もっともです。しかし、PHA は単なるファイルではありません。
PHA の header には、
RESPFILE = acisf_2009_spec.rmf
ANCRFILE = acisf_2009_spec.arf
BACKFILE = acisf_2009_spec_bkg.pha
のように、RMF や ARF への参照がファイル名として直接書き込まれています。
cp でファイル名だけ変えると、
- header 内の参照は元のまま
- RMF / ARF の名前や配置が変わっていると即破綻
という状態になります。
「じゃあ全部 rename すればいい」という選択肢もありますが、
year bin、region bin、gmin bin、ch bin などを回し始めると、管理が一気に危険になります。
combine_spectra が保証してくれるもの
combine_spectra を通すと、入力が 1 本であっても、
- PHA を正しく読み込み
- 対応する RMF / ARF を解釈し
- 出力用の PHA を新規に作成し
- 出力 PHA に正しい RESPFILE / ANCRFILE を書き込む
という処理を自動で行ってくれます。
結果として、出力された PHA・RMF・ARF の名前と中身が必ず整合した状態になります。
これは cp では保証できない部分です。
XSPEC でそのまま読み込んだ際に、RMF や ARF を手動で指定し直す必要がない、という点でも助かります。
「1本でも動く」という仕様の本当の価値
スペクトルが 1 本だけの年では、見た目上は「何もしていない」ように見えます。しかし実際には、
- 例外処理を書かなくてよい
- 年ごとの本数の違いを意識しなくてよい
- 後から観測が増えてもフローを変えなくてよい
- 出力をそのまま XSPEC に読み込める状態が常に保証される
という点で、解析全体の安全性を大きく高めています。
「1 本でも combine_spectra が動く」こと自体が、実務的には神仕様だと感じました。
おわりに
最初は意外に思った仕様でしたが、今では、
スペクトルが 1 本でも、迷わず combine_spectra を通す
というのが完全に習慣になっています。
派手な機能ではありませんが、
例外を作らせない設計は、実務では何より強いと感じています。
同じような場面に遭遇した方の役に立てれば幸いです。