ラベル ROOT の投稿を表示しています。 すべての投稿を表示
ラベル ROOT の投稿を表示しています。 すべての投稿を表示

2014/07/06

Cygwin64 Terminal

新しいPCをセットアップしようとして、今更ながら、Cygwinに64ビット版が出ていたことに気づいた。
OSは64bitのWin8.1なので、それでは、ということでインストール。
Cygwinをフルパッケージで入れると20GB以上になってしまうので、十分な空き容量の確認は必須。

インストールが完了するとデスクトップにCygwin64 Terminalというアイコンが出来る。
早速立ち上げてCygwin64 Terminalから、別途インストールしたWindows用のROOTを呼んでみると、うまくいかない。
ROOTは起動して、タイトルロゴは出るのだが、そこから進まない。

これはCygwin64 TerminalがMinttyを起動しているせい。
デスクトップのショートカットのコマンドを見ると、C:\cygwin64\bin\mintty.exe -i /Cygwin-Terminal.ico -となっている。
MinttyとCygwinターミナルの違いはよく理解できていないのだが、MinttyからROOTを呼ぶと32ビット版のCygwinでも同じようになる。

rootと打つとROOTが立ち上がるようにするには、32ビット版と同じ設定に変更すればいい。
32ビット版は\cygwin以下のCygwin.batを叩くようになっていて、Cygwin.batは64ビット版でも\cygwin64以下にある。
なので上記のショートカットを、C:\cygwin64\Cygwin.batと書き換えればいい。

これでbashのターミナルが呼べるようになって、ROOTも起動できるようになる。
このCygwin.batは単に、コマンドプロンプト上でbashを使えるようにするためのもので、仮にこの先、Cygwin.batが無くなっても、bash.exeがあればこれを叩くようなバッチを書けば、同じように出来る。

2010/02/28

ROOTでFFTWを使う

導入したScientific Linuxには、デフォルトだとgccもEmacsも入っていない。
まずはこれらを入れる。
それ以外にもROOTのインストールには、libXft、libXpm、libXextが必要。

$ su
# yum install gcc*
# yum install emacs*
# yum install libXft*
# yum install libXpm*
# yum install libXext*

これでROOTに必要なコンパイラとライブラリが揃う。
次にFFTWをここから、ROOTをここからダウンロードする。
これらは適当に解凍しておく。
以下のようにしてFFTWをROOTより先にインストールする。

$ cd fftw-3.2.2
$ ./configure
$ su
# make
# make install

これでFFTWがインストールされる。
デフォルトの設定で、/usr/local/lib以下にlibfftw3.aとlibfftw3.laが入る。
.bashrcには以下の1行を追加する。

export FFTW3=/home/chonan/fftw-3.2.2

指定している場所は実際には環境によって異なる。
次にROOTのほうのコンパイルを行う。

$ cd root
$ ./configure --enable-fftw3 --with-fftw3-incdir=/usr/local/include --with-fftw3-libdir=/usr/local/lib
$ su
# make
# make -j 2

最後はCPUのCore数を指定している。
.bashrcに追加するのは、以下の3行。

export ROOTSYS=/home/chonan/root
export PATH=$PATH:$ROOTSYS/bin
export LD_LIBRARY_PATH=/home/chonan/root/lib:$LD_LIBRARY_PATH

最後に.bashrcを読み込む。
これでOKのはずだと思っていたら、以下のようなエラーが出て、FFT.Cがうまく動いてくれない。

dlopen error: /home/chonan/root/lib/libFFTW.so: cannot restore segment prot after reloc: Permission denied
Load Error: Failed to load Dynamic link library /home/chonan/root/lib/libFFTW.so
Error in <TVirtualFFT::FFT>: handler not found
(class TH1*)0x0
*** Interpreter error recovered ***

ここを参考に、以下のように打つ。

$ su
# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /home/chonan/root/lib/libFFTW.so

これでcontextが変更できる。
contextについてはこちら

context of /home/chonan/root/lib/libFFTW.so changed to system_u:object_r:textrel_shlib_t

これでFFT.Cが走るようになる。

2009/11/15

ROOTの時間

ROOTで時間を扱うためには、UNIX timeに変換する必要がある。
例えば2009年11月15日00時00分00秒なら、

TDatime T0(2009, 11, 15, 00, 00, 00);

と書いてやると、T0という構造体に時間を入れることが出来る。
ただしこれをROOTの時間に直そうとすると、2009年11月15日にはならない。
これはなぜかというと、UNIX時間が1970年1月1日00時00分00秒からの経過秒数であるのに対し、ROOT時間は1995年1月1日00時00分00秒からの経過秒数になっているためだ。
従ってROOTで時間を使うときは、この点に注意する必要がある。

ROOTのUsers Guideの9章Graphics and Graphical User InterfaceのAxis with Time Unitsにtime offsetの3つの解決策が示されている。
1つ目は構造体にSetTimeOffsetを使うという方法。
gStyleのSetTimeOffsetを使って時間の構造体を変換すれば、このオフセット込みで計算してくれる。
2つ目はSetTimeOffsetを軸に適用すればいいというもの。
3つ目はSetTimeFormatを軸に適用するというもの。

もっと簡単にやるには、UNIX timeに変換した後で、788918400秒を引いてやればいい。
これは1995年1月1日00時00分00秒のUNIX timeで、実際には同じ結果になる。
上の例だと、

Int_t x0 = T0.Convert() - 788918400;

と書くと、x0にROOT時間の秒が入る。
グラフに使うための軸は、

TH1F *frame = new TH1F("frame", "", 9, x0, x1);
frame->GetXaxis()->SetTimeDisplay(1);
frame->GetXaxis()->SetTimeFormat("%y\/%m\/%d");

としてやればいい。

2009/11/01

ROOTでグラフに円を書く

ROOTで円を表示させるいいやり方を、かなり昔から探していた。
TF1を使うなら、1変数関数でなくてはならない。
円は式が2つになるうえに、ルートの中がゼロに近づいて行くので、TF1で無理やり表示させようとしても、ルートの中がゼロに近くなる領域では表示してくれない。

ROOTには他に楕円を表示させる、TEllipseというのがある。
しかしこれはグラフ用ではなく、なぜか中が塗りつぶされてしまう。
中の色は指定できるが、塗りつぶしなしのオプションが見つからない。
TEllipseで指定するのは中心のxとy、x方向の半径とy方向の半径。

TEllipse *e = new TEllipse(100, 100, 20, 20);
e->Draw();
e->SetFillColor(2);

もう1つ似たやつで、TArcというのも居る。
これも同様に中が白くなり、透明に出来ない。
TArcは中心のx、yと半径、開始の角度と終了の角度を指定する。

TArc *a = new TArc(50., 50., 10., 45., 315.);
a->Draw();

このように探しているものと似たようなものはあるのだが、パラメータ表示になるような関数をどうグラフに書けばよいのか、そのものずばりの答えになるようなものは見つからなかった。
自分が達した最終的な結論は、円はTGraphを使って書くほかない、というもの。
以下のように、まず角度の変数を十分細かく用意し、それを使って各点のx座標とy座標を計算させて結ぶ。
360度に対して1000個も点を打ってやれば、十分に線になる。
このようにすることで、パラメータ表示させるような関数、たとえばサイクロイドやアステロイドなどもグラフに書かせることが出来る。
ちなみに以下ではマニュアルに沿って配列を使っているが、配列が大きくなると計算時にメモリに大量にバッファするようになるので、SetPointを使うほうがいいだろう。

Double_t min = 0;
Double_t max = TMath::Pi()*2;
Double_t theta[1000], x[1000], y[1000];
for (Int_t i=0; i<1000; i++) {
theta[i] = max/1000.*i;
x[i] = 160 + 15*cos(theta[i]);
y[i] = 120 + 15*sin(theta[i]);
}
TGraph *g = new TGraph(1000, x, y);
g->Draw();

2009/09/22

ROOTの2次元ヒストグラムのカラー指定

ROOTで2次元のヒストグラムをカラーで表示させたいときがある。
デフォルトだと色が連続しておらず、また美しくもない色使いなので、今までは、

gStyle->SetPalette(1);

として、さらにDrawのときに"surf1"オプションを指定していた。
だがSetPaletteで指定できるカラーは許容範囲とはいえ、まだ物足りない。

このカラーを自分で指定するには、CreateGradientColorTableを使う。
たとえば次のようにすればいい。

TF2 *f2 = new TF2("f2", "0.1+(1-(x-2)*(x-2))*(1-(y-2)*(y-2))", 1, 3, 1, 3);
const Int_t Number = 6;
Double_t Red[Number] = {0.00, 0.00, 0.75, 1.00, 1.00, 1.00};
Double_t Green[Number] = {0.00, 0.00, 0.00, 0.00, 1.00, 1.00};
Double_t Blue[Number] = {0.00, 0.75, 0.75, 0.00, 0.00, 1.00};
Double_t Stops[Number] = {0.00, 0.20, 0.40, 0.60, 0.80, 1.00};
Int_t nb = 50;
TColor::CreateGradientColorTable(Number, Stops, Red, Green, Blue, nb);
f2->SetContour(nb);
f2->Draw("surf1z");

CreateGradientColorTableでは、何段階のGradientを指定するか、段階の位置をどの位の割合で取るか、そのRGBのカラーの割合はどうするか、Gradientのカラー表示は何段階で表示するかを決めている。
これで好きなようにカラーの表示を決めることが出来る。

2009/07/31

ROOTのtutorial

Windows版のROOTのtutorialがあることを最近知った。
ROOTをインストールした直下のディレクトリに\tutorialsというところがある。
ここでROOTを立ち上げると、通常の起動のメッセージの下に、

"Welcome to the ROOT tutorials"

と出て、demo.Cを動かしてみるように促すメッセージが出る。
「Dis45ユーザーのためのROOT入門」の最初に出てくる、benchmark.Cもここにある。
起動してみると、ベンチマークが動き出し、ウニウニと各種のグラフやらヒストグラムやらの作成、フィットなどが行われる。
見ていて楽しいが、最後に出力されるベンチマークの結果はいまいちよく分からない。

ちなみに\tutorials以下の\graphicsにearth.Cというのがある。
earth.datを読み込んで世界地図を描画してくれるのだが、Windows版の5.20では上手く動かず。
これは5.22では正常に動くことを確認できた。

Ntuple

ROOTで計算させた結果を描画するとき、これまではいちいちヒストグラムを用意していた。
しかしinteractiveにカットや条件を変更し、その結果が見たいときとかには、いちいちそんなことはしていられない。
そこでNtupleを使う。

TNtuple *n1 = new TNtuple("n1", "", "x:y:z:w");

とかすると、n1というNtupleが4つの変数で作られる。
さらにこれらの変数に、For文とかWhile分とかで、

n1->Fill(x, y, z, w);

とかで値を詰めるだけでOK。
あとは、

n1->Draw("x:y", "w>0");

とかすると、wがゼロより大の値をとるときのxとyの分布図を出せる。
これで作ったヒストグラムも、当然通常のヒストグラムとして扱える。

また.ls();とか打つと、n1というNtupleが出来ているのがわかる。
たとえばマクロを書いて、n1というNtupleを作ったとして、マクロを実行した後もn1は消えないでいる。
そこで上の条件を変えて描画させたりも出来る。
出来ているNtupleについての情報は、

n1->Print();

とか打つと見ることが出来る。

2009/01/19

ROOTファイルの扱い方

ROOTでは.root形式を扱うことが出来る。
この形式はバイナリで、ヒストグラム等を格納できる。
容量を稼ぐので、よく使われる。
このファイルを読む方法は2つある。

1つ目はGUIを立ち上げればいい。

root [n] TBrowser b;

とすると、ROOT Object Browserが立ち上がる。
これでrootファイルを選択する。

2つ目はコマンドラインから読み込む。

root [n] TFile f("hoge.root");

これでfという名前で読み込める。
hoge.rootの中身は

root [n] f.ls();

とすると見ることが出来る。
格納されているものはKEYとして表示される。
閉じるときは、

root [n] f.close();

とすればいい。

2009/01/10

ROOTのコンパイル

ROOTはバイナリとソースの2つで配布されている。
コンパイルされたバイナリを持ってくるだけで動くので、今までコンパイルしたことが無かった。
今回初めてコンパイルしてみたら、予想外のトラブルに悩まされた。

まず/home/chonan以下にソースを展開すると、root/というディレクトリが出来てくる。
そこに移動して、

$ ./configure --prefix=/home/chonan/root
$ make
$ make install

としてみたら、コンパイル自体ではエラーは発生しなかった。
そこで環境変数ROOTSYSを決めて、ROOTを起動しようとすると、エラーを吐いた。

rootx xpm error: XpmOpenFailed

というエラーが1行目に出て、

Error:cannot open file "iostream" (tmpfile):2:
*** Interpreter error recovered ***
Error:cannot open file "_string" (tmpfile):2:
*** Interpreter error recovered ***
Error:cannot open file "RtypesCint.h" (tmpfile):2:
*** Interpreter error recovered ***

というエラーが表示された。
一応、rootは起動しているのだが、正しく動いておらず、マクロ等も動かない。

これはconfigureのprefixの指定に問題があるからだ。
インストールする場所は、ソースを展開したroot以下であってはならないと決められているようだ。
違う場所を指定したら、きちんとインストールされた。
それとこのようにコンパイルしてインストールしたROOTの場合、LD_LIBRARY_PATHには$ROOTSYS/libではなく、$ROOTSYS/lib/rootを追加する。
この2つに注意すれば、問題なくインストールできる。

2008/12/05

グラフや関数の座標軸にタイトルをつける

ROOTで座標軸にタイトルをつけたい場合、ヒストグラムだと非常に簡単だ。
SetXTitle、SetYTitleがあるので、簡単に指定できる。
しかしこの関数は、TGraphとかTF1といった、グラフや関数を描画する際には使えない。
TGraphやTF1にはSetXTitleやSetYTitleが用意されていないためだ。

グラフや関数の軸にタイトルをつけたいときは、GetXaxisとGetYaxis、SetTitleを組み合わせて使う。
SetTitleは左上に出る、グラフや関数そのもののタイトルを与えるが、軸にタイトルをつけるのにも使用できる。
一度描画してからGetXaxisやGetYaxisで、軸を取ってくればいい。

TGraph* g1 = new TGraph(n, x, y);
g1->Draw();
g1->GetXaxis()->SetTitle("X-Title");
g1->GetYaxis()->SetTitle("Y-Title");

タイトルを中心に持ってきたり、タイトルのオフセットを変えたりする場合も、いちいち軸を取ってくる必要がある。

2008/11/30

ROOTあれこれ

グラフやヒストグラムを何かの関数でフィットするとき、パラメータを固定したいことがある。
そのときにはFixParameterを用いる。

TF1* f1 = new TF1("f1", "[0]*sin(x)+[1]*cos(x)", -0.1, 0.1);

としたとして、[1]のパラメータを0にしたいときは、

f1->FixParameter(1, 0)

とする。

それと上限値をつけるときグラフに矢印を描いたり、エラーバーが上下左右対称でない場合など、エラーバーをいじりたいときは、TGraphAsymmErrorsを用いる。
ただしこれを使ったグラフは、うまくフィットが出来ない。
フィット作業は行うが、変な結果を返してくる。
なおTGraphErrorsはきちんとフィットできる。

2008/10/01

ROOTでのフィット結果の見方

ROOTでフィットしたとき、そのカイ2乗の値や自由度を求めたいとする。
たとえば、g1というグラフを用意し、g1をf1という関数でフィットしたとする。
このときカイ2乗と自由度を求めるには、次のようにすればいい。

double chi = f1->GetChisquare();
double ndf = f1->GetNDF();

これでchiにカイ2乗が、ndfに自由度が入る。

カイ2乗に関しては、マニュアルのFitting HistogramsのAccess to the Fit Parameters and Resultsに載っているのだが、自由度についてはマニュアルには記載がない。

2008/09/20

ROOTでのフィット

ROOTでは任意の関数で、任意のグラフやヒストグラムをフィットできる。
例として2次元ガウス関数で、読み込んだファイルをフィットしたいとすると、次のようになる。

double par[6];
f1 = new TF2("f1", "[0]+[1]*exp(-(x-[2])*(x-[2])/2/([4]*[4])-(y-[3])*(y-[3])/2/([5]*[5]))", 100., 200., 100., 200.);
f1->SetParameters(100., 500., 150., 150., 30., 30.);
g1 = new TGraph2D("hoge.dat");
g1->Fit("f1");
f1->GetParameters(par);

parはフィットした結果を格納するための配列。
まず、f1で2次元ガウス関数を用意している。
このときフィットで求める値は[n]の形で書く。
上の例だと、[0]がオフセット、[1]はピーク高さ、[2]と[3]が中心のxy座標、[4]と[5]がxyのσになっている。
その後の数字は、式を定義する範囲であり、何も書かないと、デフォルトでは0から1になる。
SetParametersでは初期値を決め、g1はhoge.datという、(x y 値)という形式のファイルを読み込んだグラフである。
最後のGetParametersでフィットの結果をparに格納している。

ROOTの軸あれこれ

ROOTでグラフを書くとき、軸を追加したり改変したりしたいときがある。
たとえばy軸は普段、上が大きく下が小さいが、これを逆にしたかったりする。
こういうときはTGaxisを使う。
たとえばy軸の上下を反転させる場合だと、次のようになる。

frame = new TH1F("frame", "", 10, -50, 1000);
frame->SetMinimum(0.0);
frame->SetMaximum(20.0);
frame->Draw("AB");
TF1 *f1 = new TF1("f1", "-x", 20, 0);
TGaxis *a1 = new TGaxis(-50, 0, -50, 20, "f1", 510, "-");
a1->Draw();

まず始めにframeという枠を指定している。
x座標は-50から1000までで、yは0から20である。
このときDrawのオプション"AB"は軸を描画しないことを意味する。
軸の表記が重ねがきになるのを防ぐためである。

次にf1という関数を作る。
-xで軸の値の分布の関数を作っていて、20と0はその範囲を示している。
TGaxisの始めの4つの数字は、元の図の中での軸の始点と終点の座標を入れる。
ここでは軸は(-50, 0)から(-50, 20)までを指定している。
510は軸の目盛りの分割数を意味していて、510がデフォルトだが、510個に分割するわけではない。
数値の詳細は不明だが、これを大きくすると分割数が上昇した。
最後の"-"は軸に書かれる数値やタイトルが軸のどちら側に来るかを指定する。
ちなみに軸のタイトルとかは
a1->SetTitle("");
とかやればいい。

これだけだとx軸には何も出ないので、新たに軸を書いてやる必要がある。

2008/07/03

ROOTのgStyle

ROOTでヒストグラムを書いたり、グラフを書いたりすると、右肩に名前とか、平均値とかの情報が表示される。
デフォルトでそうなっている。
だが、この表示が鬱陶しくなるときがある。
TH1だとSetStats(kFlase);とか書けば消すことができるのだが、他の場合ではどうするのか知らなかった。

この設定をいじくるにはgStyleという構造体の中の、SetOptStatという変数を指定してやればいい。
ここによれば、セットできるパラメータは9つ。
9桁の数字は、尖度(k)、歪度(s)、ビン数(i)、オーバーフロー数(o)、アンダーフロー数(u)、RMS(r)、平均値(m)、データ数(e)、ヒスト名(n)の9つに対応している。
kとsとrとmは0-2の値、その他は0-1の値を取る。
0は表記せず、1は値の表記あり、2は値とそのエラーの表記ありという風になっている。
ちなみにデフォルトだと000001111になっているので、RMS、平均値、データ数、ヒスト名が記入される。
また000001111のうち、0以外の最大の桁の数字より左側の0は省略可能。
つまり000001111と1111は同じになる。
全てがゼロの場合、統計情報のボックスは消える。

例1)gStyle->SetOptStat(0); //統計情報ボックス無し
例2)gStyle->SetOptStat(11); //ヒスト名とデータ数

またコンターマップの色を指定するときも、gStyleの変数SetPalleteを指定する。
デフォルトは色使いのセンスがイマイチなので、

gStyle->SetPallete(1);

とかしてやればいい。

2008/04/19

TGraph2DとTH2

x座標、y座標、値の3つが並んだファイルがあったとする。
このときこれを2次元的なコンターマップにしたいとする。

これにはTGraph2DとTH2のどちらかを使えばいい。
ただし両者の振る舞いはかなり異なる。
TGraph2Dは各座標の値の中間値を計算しているらしく、やたらと時間がかかるし、x座標が全て共通だった場合、つまり線のような入力だとエラーを吐く。
2次元のマップにならないと駄目なようだ。
一方TH2はヒストグラムなので、入力が実質線であろうと関係ないし、時間も短い。
状況に応じて使い分ければいいのだろう。

ROOTのマクロでファイルを引数に取る

ROOTのマクロに限った話ではないが、引数にファイルを取りたいとする。
ついでに存在しないファイルを引数に取ったときは、エラーを吐くようにしたい。
これを実現するには、以下のようにすればいい。

void hoge(const char* fname)
{
ifstream fin;
fin.open(fname);
if(!fin.good()){
cerr << "Can not open " << fname << "!\n";
return NULL;
}
}

fnameはファイル名、finがファイルのポインタ。

2008/03/12

ROOTでウィンドウを出さない方法

ROOTで解析をするとき、Cygwinとかでssh経由でXを飛ばそうとしてうまくいかず、Linux側のマクロが動かないようなときがある。
これを回避するには、ウィンドウを出さないようにすればいい。
ROOTの起動時のオプションで指定できる。

$ root -b

と打てばいいだけだ。

2007/05/11

ROOT for Windows

Windows用のROOTを入れた。
バイナリをROOTのページからDLしてくればいい。
tarで固めたファイルとインストーラ付きのファイルが用意されている。
なおcygwin用もあるが、gccのバージョンがまだ3.2.2だそうで、推奨されないとある。

tarのほうは設定が面倒そうなので回避することにして、インストーラ付きファイルを落としてきた。
これで右クリックからInstallを選択し、後は指示に従うだけだ。
インストールはCompleteを選択した。

インストールが終了すると、cygwinからもrootが使えるようになった。
調べたところ、環境変数をインストーラがちゃんと書き加えてくれていた。
アイコンがいまいちだが、どうせcygwinから使うので取ってしまった。

2007/01/25

ROOTのインストール

前に一度試みて失敗していたROOTのインストールを試みた。
前はソースからコンパイルしようとして失敗したので、今度はバイナリを直接もってくることにした。
ROOTのページ のDownload Binariesというリンクからたどればいい。
Linuxのところに、FC5のgcc4.1でコンパイルしたバージョン5.12があったので、それを落としてくる。
このファイルを展開し、適当な場所に置いた。
さらに.bashrcに

export ROOTSYS=/(置いた場所)/root
export PATH=$PATH:$ROOTSYS/bin
export MANPATH=$MANPATH:$ROOTSYS/man

という3行を追加し、

# source .bashrc

として読み込めば終わりだ。
この辺のことはREADMEに書かれているとおりにやればいい。
これで問題なくROOTが使えるようになった。