ROOT/MathMore
MathMore を使ったときのメモ。ROOT で特殊関数などを使いたい場合、MathMore ライブラリをロードする必要がある。
インストール
以下では、すでに ROOT が インストールされているところに MathMore ライブラリを追加でインストールしたつもり。MathMore ライブラリだけをインストールすることはできるんだろうか?
GSL インストール
MathMore を使うには GSL - GNU Scientific Library が必要。ROOT のバージョンが v5.32.04 の場合、 GSL のバージョンは 1.8 以上が必要。Scientific Linux 6.4 (64 bit) では、以下のように yum で簡単にインストールできる。インストールされるバージョンは 1.13 なので 1.8 より 5 バージョン新しい。ROOT が要求する GSL のバージョンは ./configure --help で確認できる。
$ su パスワード : ルートのパスワードを打つ # yum install gsl gsl-devel ...
- gsl パッケージだけインストールしても、ROOT の configure スクリプトが GSL を見つけてくれないので、gsl-devel パッケージも同時にインストール。具体的には、gsl-config というコマンドがないとダメなのかも?
./configure の実行
- まず、ROOT のソースを展開したときにできたディレクトリ (configure スクリプトがある) に移動。ここで configure スクリプトを実行し直すが、以前指定したオプションに --enable-mathmore オプションを追加する。これで、make 実行時に mathmore ライブラリがコンパイルされる。コンパイル時(?)のオプションは configure スクリプトと同じディレクトリ内の config.status に書かれている。config.log にも configure スクリプトのログが残るが、 ./configure --help としただけで config.log は上書きされる。
$ cd <ROOT のソースを展開したときにできたディレクトリ> $ ./configure <以前のオプション> --enable-mathmore # 以前のオプションの指定は、 `cat config.status` としても良いはず
ROOT の make と インストール
$ ./configure の実行後、make して make install を実行する。いくつかのソースはコンパイルし直すようだが、ほとんどのソースは再コンパイルしないようだ?これで、MathMore ライブラリがインストールされる。
$ make $ make install
- make をし直す場合、並列コンパイルの -jN オプションを指定すると最後で止まるときがあるかも? v5.32.04 だと止まるようだ。
使い方
マクロ内で使う
例えば、マクロ内で球ベッセル関数 jl(x) と球ベッセル関数 nl(x)を使う場合、以下のように書く。マクロのファイル名は test.C とする。
#include "Math/SpecFunc.h" #include <iostream> void test() { std::cout << "j_1(2): " << ROOT::Math::sph_bessel(1, 2.) << std::endl; std::cout << "n_1(2): " << ROOT::Math::sph_neumann(1, 2.) << std::endl; }
ROOT を起動したら、マクロを実行する前に、まずライブラリをロードする(参考: Rin-memo - ROOT/特殊関数いろいろ)。そのあと .x コマンドでマクロを実行。具体的なコマンドは下記のようになる。
$ root -l root [0] gSystem->Load("libMathMore") (int)0 root [1] .x test.C j_1(2): 0.435398 n_1(2): -0.350612
.x test.C+ というように "+" 付きで .x コマンドを実行すれば、 ACLiC でコンパイルしてから実行される。ただし、コンパイルの前に gSystem->Load("libMathMore") を実行する必要がある。
その他の関数
MathMore Library の Special functions に特殊関数が載っている。詳しくは、MathMore Library を参照。
Examples
クレブシュ-ゴルダン係数
ROOT::Math::wigner_3j 関数を用いたクレブシュ-ゴルダン係数の計算はこちら。
球ベッセル関数と球ノイマン関数
球ベッセル関数 jl(x) と球ベッセル関数 nl(x)をプロットすると以下のようになる。
- この画像は以下のように作った。
$ root root [] gSystem->Load("libMathMore"); root [] .x plot_bes.C+ Info in <TUnixSystem::ACLiC>: creating shared library /home/koba/Dropbox/works/root/rk4/./plot_bes_C.so root [] eps ファイルで保存 --> png に変換 ... root [] .q $
libMathMore をロードし、plot_bes.C を ACLiC でコンパイルして実行。eps 形式で画像を保存して png 形式に変換。
- 参考
平面波の展開
球 Bessel 関数や Legendre 多項式を使ってみる。平面波をこれらの関数で展開し、ある l まで足し合わせると、下図の gif アニメのようになる。ただし平面波は x 軸方向に進み、cosθ = x/r, z = 振幅 としている。
- このファイルは以下のように作った。
libMathMore をロードし、plot.C を ACLiC でコンパイルして実行。
$ root root [] gSystem->Load("libMathMore") (int)0 root [] .x plot.C+ Info in <TUnixSystem::ACLiC>: creating shared library /home/koba/Dropbox/works/root/mathmore/./plot_C.so Info in <TCanvas::Print>: GIF file fig00.gif has been created Info in <TCanvas::Print>: GIF file fig01.gif has been created Info in <TCanvas::Print>: GIF file fig02.gif has been created ... root [] .q $
- さらに、以下のように convert コマンドで mov.gif という名の gif アニメーション画像を作る。loop オプションで 0 を指定するとループ回数の制限がなくなり、ずっとループする。delay オプションには、画像の切り換え時間 (10ms 単位?)を指定する。50 を指定すると、 500 ms で切り換わるようだ?
$ convert -loop 0 -delay 50 fig*.gif mov.gif
参考: ImageMagick
エラー
CINT のプロンプト上(?)で MathMore のライブラリを使うとき、ライブラリをロードするが(参考: Rin-memo - ROOT/特殊関数いろいろ)、MathMore library がインストールされていないと以下のエラーとなる。
root [] gSystem->Load("libMathMore"); Error in <TUnixSystem::DynamicPathName>: libMathMore[.so | .dll | .dylib | .sl | .dl | .a] does not exist in /home/koba/cern/root_v5.32.04/lib/root:/root:/root:/root:/home/koba/cern/anaroot/lib:/home/koba/cern/anaroot/lib:.:/home/koba/cern/root_v5.32.04/lib/root::/home/koba/cern/root_v5.32.04/lib/root/cint/cint/stl