0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CONDAでROOTを利用する方法と原因(apple silicon MAC向け)

Posted at

動機

この記事を書こうとしたきっかけとして、anacondaで

bash
conda install conda-forge::root 

とインストールしたROOTを動かした際に、clangとcilingでエラーが起きたため、その回避方法を探してもどこにもなかったからです。私の目的として、検出機解析用にROOTと天体解析ようにHEASOFTをダウンロードする必要があり、その際にAnaconda環境が必要でした。(このような特殊な状況でもない限り、避けた方がいいです)

環境

以下の環境をpyenvで一括管理しています。(やり方は追記に書きました)

アプリケーション versions
Python 3.13.0
ROOT 6.32.08
Anaconda Anaconda3-2024.10-1

ROOTはhomebrewでインストールしました。Pythonはanaconda環境のもので、ROOTに対応させるため、3.13.0を選択しました。
※Clangをanacondaに入れますが、Clang++を入れてはいけません。

AnacondaでROOTを利用する方法

1. homebrewでROOTを用意します

bash
brew install ROOT

以下でPATHを繋げます

bash
export ROOTSYS=$(root-config --prefix)
source $(root-config --prefix)/bin/thisroot.sh

1. 以下の設定で環境を設置

bash
conda create -n <env name> python=3.13 clang llvm -c conda-forge
conda activate <env name>

2. condaの環境で用いているclangをデフォルトにする

以下をシェルに書くことで設定する

bash
export CC=/path/.../pyenv/versions/anaconda3-2024.10-1/envs/heasoft/bin/clang

3. import ROOTしてみる

以下のようにactivateした後の環境でROOTのパスを再び繋げ直す

bash
export ROOTSYS=$(root-config --prefix)
source $(root-config --prefix)/bin/thisroot.sh

その後、pythonを開いてimport ROOTをするとうまくいきます

原因

なぜconda-forgeでインストールしてもうまくいかないのでしょうか。一言で言うと、conda-forgeでは入るROOTはx86-64用のものしか提供されていないため、この方法でダウンロードしてもうまくいきません。しかし、実際にダウンロードした方はわかると思いますが、ROOT単体では実行できます。これはなぜでしょう?

conda-forgeは内部でx86-64アーキテクチャで統一されており、そのパッケージはx86-64プラットフォーム専用にビルドされているため、ARMやM1/M2チップなど他のアーキテクチャでは正常に動作しない場合があります。このため、異なるアーキテクチャ向けにはパッケージの互換性がなく、conda-forge経由でインストールしてもうまくいかないことがあります。

ROOT単体とPyROOTの違い

ROOTはC++で作成された高性能のデータ解析ライブラリで、グラフィカルインターフェースやコマンドラインで動作します。これに対して、PyROOTはPythonからROOTのC++コードにアクセスできるインターフェースを提供するライブラリですが、PyROOTがうまく動作しない場合もあります。

1. ROOT単体は動作するがPyROOTが動作しない理由

  • 依存関係の違い: ROOT単体はC++ベースで動作しており、コンパイル時にアーキテクチャに合わせたバイナリが生成されます。これに対して、PyROOTはROOTのC++ライブラリをPythonから操作するため、Pythonの依存関係やPythonバージョンによって動作に不整合が生じることがあります。特に、PythonとC++のライブラリのリンクの問題や、必要なパッケージが不足している場合にエラーが発生します。

  • アーキテクチャの不一致: conda-forgeでインストールしたPyROOTは、x86-64アーキテクチャ専用のバージョンが提供されており、ARMやM1チップなど、異なるアーキテクチャではPyROOTが正しく動作しないことがあります。これは、PyROOTが依存しているC++ライブラリがアーキテクチャに依存しているためです。

2. ROOT単体が動作する理由

ROOT単体はC++のネイティブコードで動作しており、依存関係も直接的にC++ライブラリにリンクされます。このため、必要なライブラリや依存関係が正しく満たされている限り、ROOT自体はその環境で問題なく動作します。特に、x86-64アーキテクチャ用にビルドされたROOTのバイナリは、コンパイルされたアーキテクチャに最適化されているため、問題なく動作することが多いです。

3. まとめ

conda-forgeでROOTやPyROOTをインストールする際の問題は、主に提供されるパッケージがx86-64アーキテクチャ向けに特化しているため、異なるアーキテクチャに対するサポートが不足していることが原因です。また、PyROOTが動作しない理由は、Pythonのバージョンや依存関係の不整合、アーキテクチャの違いによる問題が考えられます。

追記

Anacondaを入れたPythonの環境作成

とりあえず、pyenvをhomebrewでインストールします

bash
brew install pyenv

次にpyenvでAnacondaをインストールします。

bash
pyenv install anaconda3-2024.10-1

globalに設定した後、condaをデフォルトにするようにシェルに書きます。

bash
pyenv global anaconda3-2024.10-1
pyenv init [shellの名前(zshとかbashとか)]

シェルを再起動し、上記の方法で進めてください

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?