ROOTをとりあえず使う。
グラフプロットソフト,ROOTを使ってみた。
参考URLはコチラ
まずコンパイルする為のMakefile。
MakeFileにはインクルードフラグとライブラリフラグを追加しておく。
つまり、
# インクルードフラグ ROOTCFLAGS = $(shell root-config --cflags) # ライブラリリンク ROOTLIBS = $(shell root-config --libs) # (RootでGUIを作る場合のライブラリリンク) ROOTGLIBS = $(shell root-config --glibs)
をMakeFileに記述しておく。これを踏まえMakeFileは、
1: TARGETS=Hoge 2: 3: ROOTFLAGS = $(shell root-config --cflags) 4: ROOTLIBS = $(shell root-config --libs) 5: 6: CXXFLAGS = -Wall -O2 $(ROOTFLAGS) 7: CXXLIBS = $(ROOTLIBS) 8: 9: all: $(TARGETS) 10: 11: Hoget: Hoge.o 12: g++ -o $@ Hoge.o $(CXXLIBS) 13: 14: .cc.o: 15: g++ -c $(CXXFLAGS) $<
.CCのファイルは以下。
ガウス関数に従って乱数を発生させ、その分布をヒストグラムにする、というMonte-Carloシミュレーションを行っている。
1 #include "TApplication.h" 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <TROOT.h> 6 #include <TStyle.h> 7 #include <TH1.h> 8 #include <TFile.h> 9 10 11 int main(int argc, char **argv){ 12 13 // TApplication theApp("App", &argc, argv); 14 15 gROOT->SetStyle("Plain"); 16 gStyle->SetOptStat("neiuoMR"); 17 gStyle->SetPalette(1); 18 19 double N; /* factor */ 20 double mu; /* mean */ 21 double sigma; /* standard deviation */ 22 23 double x; 24 double x_max, x_min; 25 double y_ref; /* reference value */ 26 double y_try; /* trial value */ 27 28 mu= 1.0; 29 sigma= 0.5; 30 N= 1./ sqrt(2.*M_PI) / sigma; 31 // 32 x_max=+3.0; 33 x_min=-1.0; 34 // 35 TH1D *h1; 36 h1= new TH1D("h1","h1 sample", 100, x_min, x_max); 37 // 38 for(int i=0; i<1e5; i++){ 39 x=(double)rand()/RAND_MAX * (x_max - x_min) + x_min; 40 y_ref= N * exp(-(x-mu)*(x-mu)/(2.*sigma*sigma)); 41 y_try= (double)rand()/RAND_MAX * N; 42 43 if(y_try<y_ref){ 44 h1->Fill(x); 45 } 46 } 47 48 h1->SetXTitle("X-axis"); 49 h1->SetYTitle("Y-axis"); 50 51 // h1->Draw(); 52 53 // theApp.Run(); 54 TFile *f=new TFile("Hoge.root","RECREATE","Hoge_output_file"); 55 h1->Write(); 56 f->Close(); 57 58 return 0; 59 } 60
いくつかコメントしておく。
13:includeしたTApprication.hを使ってtheAppオブジェクト作成。マクロを実行してrootfileを作成しない、即座にプロットマンガを表示する場合はこの記述と53行目のtheApp.Run();が必要になる。
15:16:17:デフォルトの形をいろいろ整える
35:一次元ヒストグラムのオブジェクトh1を定義
36:"title","graph title","bin","min","max"で指定する
48:49x軸,y軸の名前を定義
54:出力rootfileの定義"出力先ファイル名","作成オプション","メモ"
55:h1をfオブジェクトに書き込む
56:ファイルを閉じる
てな感じ。
コマンドラインで実際動かしてみる。
$ make -f Makefile g++ -c -Wall -O2 -pthread -m32 -I/usr/local/root/include Hoge.cc g++ -o Hoge Hoge.o -L/usr/local/root/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -pthread -lm -ldl -rdynamic $ ./Hoge $ ll -rwxrwxr-x 1 gauge gauge 10919 4月 25 09:11 Hoge -rw-rw-r-- 1 gauge gauge 1218 4月 25 09:11 Hoge.cc -rw-rw-r-- 1 gauge gauge 7244 4月 25 09:11 Hoge.o -rw-r--r-- 1 gauge gauge 4036 4月 25 09:11 Hoge.root
rootfileが出来てるみたい。
$ root -l Hoge.root
root h1->SetLineColor(2);
root h1->Draw();
root[] .q
いやー、面白いな。