はじめに
本記事では、Chandra衛星のデータ解析で使うCIAOをAnaconda仮想環境でアクティブにした際に、XSPECが起動しないエラーの解決策を紹介します。
(ciao-env) $ xspec
XSPEC Fatal Error: Fatal: Cannot initialize tcl command interface
*** XSPEC Fatal Error Fatal: Cannot initialize tcl command interface
terminate called after throwing an instance of 'TclInitErr'
Aborted (core dumped)
このエラーが発生する原因と、その解決策を解説します。同様の問題はCIAO公式ページでも報告されているため、こちらも参考にしてください。
忙しい方は、原因から読み進めていただいても問題ありません。
筆者のバグが発生した環境
- Ubuntu 22.04.3 LTS (Jammy)
- CIAO version 4.16
- HEASoft version 6.32.1
発生するバグ
以下は、実際に筆者が遭遇したエラーの再現ログです。
1. HEASoft環境の初期化
まず、HEASoftのツールを正しく動作させるために、HEADAS
環境変数を設定し、headas-init.sh
スクリプトを実行します。
$ export HEADAS=/path/to/heasoft/headas/x86_64-pc-linux
$ source $HEADAS/headas-init.sh
HEADAS
環境変数には、HEASoftがインストールされているルートディレクトリのパスを指定します。
この手順により、HEASoft(特にXSPEC)の動作に必要な環境設定が行われます。
ここで、xspec
と入力すると、次のように正常に動作することが確認できるはずです。
$ xspec
XSPEC version: XX.XX.X
Build Date/Time: Tue Aug 20 19:37:28 2024
XSPEC12>
(もしこのような画面が表示されない場合、HEASoftのビルド(make)が正しく行われていない可能性があります。その場合は、本記事の内容ではなく、HEASoftのインストール手順やビルドプロセスに問題があるかもしれません。HEASoftのインストール手順は、Ubuntuの場合、Macの場合が参考になります。)
2. CIAO環境のアクティベート
xspec
を終了した後、conda
を使用してCIAO環境をアクティブにします。
$ conda activate ciao-env
これにより、CIAOが提供するツールセットが利用可能になります。
しかし、この環境で再びxspec
を実行すると、次のようなエラーが発生します。
(ciao-env) $ xspec
XSPEC Fatal Error: Fatal: Cannot initialize tcl command interface
*** XSPEC Fatal Error Fatal: Cannot initialize tcl command interface
terminate called after throwing an instance of 'TclInitErr'
Aborted (core dumped)
原因
このエラーは、HEADAS
環境変数がCIAO環境のアクティベートによって上書きされ、XSPECが期待する設定が無効になることで発生します。
例えば、以下のようにHEADAS
環境変数の値を確認すると、CIAO環境をアクティブにすると値が変わってしまうことがわかります。
# HEASoftの環境を設定した直後
$ echo $HEADAS
/soft/lheasoft/headas/x86_64-pc-linux
# CIAO環境をアクティブにした直後
(ciao-env) $ echo $HEADAS
/home/anaconda3/envs/ciao-env/spectral
このように、HEADAS
変数がCIAOの設定によって上書きされてしまうため、XSPECが正常に動作しなくなります。
なお、一度CIAO環境をアクティブにしてからディアクティブすると、HEADAS
には何も設定されなくなる点にも注意が必要です。この状態では、XSPECも正常に動作しません。
# CIAO環境をアクティブにした後、ディアクティブする場合
(ciao-env) $ echo $HEADAS
/home/anaconda3/envs/ciao-env/spectral
(ciao-env) $ conda deactivate
$ echo $HEADAS
$ xspec
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted (core dumped)
まとめると、xspec
が起動しない原因は、HEADAS
変数が正しく設定されていないことにある場合が多いです。この変数がCIAOによって上書きされていないか確認することが重要です。
解決策
CIAO公式によると、CIAO環境をアクティブにした後で、再度HEADAS
変数をHEASoftの設定に戻すことで、この問題を解決できます。手順は以下の通りです。
$ export HEADAS=/soft/lheasoft/headas/x86_64-pc-linux
$ source $HEADAS/headas-init.sh
$ conda activate ciao-env
(ciao-env) $ export HEADAS=/soft/lheasoft/headas/x86_64-pc-linux
この後、再びxspec
を実行すれば、正常に動作するはずです。
注意点: CIAOとHEASoftのツールの競合
環境の競合について
CIAOとHEASoftは、それぞれ独自の環境設定を持っていますが、これらを同時に使用すると競合が発生することがあります。特に、HEADAS
環境変数による競合に加えて、両方のツールセットが使用するパラメータ設定ツール(pset
、pget
、plist
など)は互換性がなく、それが原因で問題が生じることがあります。
XSPECモデルとsherpaの使用時の注意
CIAOのsherpa
でXSPECモデルを使用する際には特に注意が必要です。headas-init.sh
スクリプトをCIAO環境で再実行すると、sherpa
内でXSPECモデルを使用する際に問題が発生する可能性があります。このため、以下の点に注意してください。
-
CIAO環境で
headas-init.sh
を再実行しない:
headas-init.sh
を再実行すると、CIAOのツールが期待する設定が上書きされてしまうため、sherpa
などのツールで問題が発生する可能性があります。特に、sherpa
とXSPEC
を併用する際は、環境変数の設定順序やスクリプトの実行タイミングに注意することで、ツールの競合を避けることができます。
まとめ
CIAOとHEASoftを同時に使用する際には、環境設定の競合に注意が必要です。特に、sherpa
とXSPEC
を併用する場合、環境変数の設定順序やスクリプトの実行タイミングに気をつけることで、ツールの競合を回避できます。本記事で紹介した手順や注意点が、問題の解決に役立つことを願っています。
参考資料