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

いやー、面白いな。