CIAO環境でHEASoftのXSPECが起動しないバグの解決ログ

## はじめに

本記事では、Chandra衛星のデータ解析で使うCIAOをAnaconda仮想環境でアクティブにした際に、XSPECが起動しないエラーの解決策を紹介します。

```bash:エラーの内容
(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公式ページでも報告されているため、こちらも参考にしてください。

https://cxc.cfa.harvard.edu/ciao/bugs/conda.html

忙しい方は、[原因](#原因)から読み進めていただいても問題ありません。

## 筆者のバグが発生した環境

- Ubuntu 22.04.3 LTS (Jammy)
- CIAO version 4.16
- HEASoft version 6.32.1

## 発生するバグ

以下は、実際に筆者が遭遇したエラーの再現ログです。

### 1. HEASoft環境の初期化

まず、HEASoftのツールを正しく動作させるために、`HEADAS`環境変数を設定し、`headas-init.sh`スクリプトを実行します。

```bash
$ export HEADAS=/path/to/heasoft/headas/x86_64-pc-linux
$ source $HEADAS/headas-init.sh
```

`HEADAS`環境変数には、HEASoftがインストールされているルートディレクトリのパスを指定します。

この手順により、HEASoft（特にXSPEC）の動作に必要な環境設定が行われます。

ここで、`xspec`と入力すると、次のように正常に動作することが確認できるはずです。

```bash
$ xspec

		XSPEC version: XX.XX.X
	Build Date/Time: Tue Aug 20 19:37:28 2024

XSPEC12>
```

（もしこのような画面が表示されない場合、HEASoftのビルド（make）が正しく行われていない可能性があります。その場合は、本記事の内容ではなく、HEASoftのインストール手順やビルドプロセスに問題があるかもしれません。HEASoftのインストール手順は、[Ubuntuの場合](https://qiita.com/yamadasuzaku/items/8c6ddc4cf37fbb8ac8ed)、[Macの場合](https://qiita.com/yusuke_s_yusuke/items/b6154c79900e718214b3)が参考になります。）

### 2. CIAO環境のアクティベート

`xspec`を終了した後、`conda`を使用してCIAO環境をアクティブにします。

```bash
$ conda activate ciao-env
```

これにより、CIAOが提供するツールセットが利用可能になります。

しかし、この環境で再び`xspec`を実行すると、次のようなエラーが発生します。

```bash
(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環境をアクティブにすると値が変わってしまうことがわかります。

```bash
# HEASoftの環境を設定した直後
$ echo $HEADAS
/soft/lheasoft/headas/x86_64-pc-linux

# CIAO環境をアクティブにした直後
(ciao-env) $ echo $HEADAS
/home/anaconda3/envs/ciao-env/spectral
```

このように、`HEADAS`変数がCIAOの設定によって上書きされてしまうため、XSPECが正常に動作しなくなります。

:::note warn
なお、一度CIAO環境をアクティブにしてからディアクティブすると、`HEADAS`には何も設定されなくなる点にも注意が必要です。この状態では、XSPECも正常に動作しません。

```bash
# 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公式](https://cxc.cfa.harvard.edu/ciao/bugs/conda.html)によると、CIAO環境をアクティブにした後で、再度`HEADAS`変数をHEASoftの設定に戻すことで、この問題を解決できます。手順は以下の通りです。

```bash
$ 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`を併用する場合、環境変数の設定順序やスクリプトの実行タイミングに気をつけることで、ツールの競合を回避できます。本記事で紹介した手順や注意点が、問題の解決に役立つことを願っています。


## 参考資料
https://cxc.cfa.harvard.edu/ciao/bugs/conda.html