サンプル集
  1. ヒストグラムを作る

ヒストグラムを作る

ヒストグラムを作成する例。 このサンプルは、ガウス型の確率分布で乱数を発生させ、 その結果をtreeに格納する。 ヒストグラムを作るときは、このtreeから値を読み取って改めてヒストグラム に格納する。 Makefileは別の項で述べた通り。

monte.cxx

/*** ここから ***/
#include <fstream.h> #include <TROOT.h> #include <TFile.h> #include <TTree.h> #include <TBranch.h> #include <TRandom.h> int main(int argc,char **argv) { TFile *f = new TFile("test.root","recreate"); TTree *tree = new TTree("tree","tree"); double a; tree->Branch("test",&a,"a/D"); for(int i = 0;i < 100000;i++) { a = gRandom->Gaus(0,1); tree->Fill(); } tree->Write(); delete f; delete tree; return 0; }
/*** ここまで ***/
ROOTはC++の関数をサポートし、またC++によって動作する。 ヒストグラムを作成するときも当然、C++で記述しなければならない。 すなわち、ROOTを使いこなすためにはC++の知識が必要である。 逆に言えば、ROOTを使いこなすことができればC++に対する知識や技能も習得でき ることを意味する。 実際、ROOTはC++の良い教材であり、ROOTの開発コンセプトの一つでもある。
まず、サンプル第一弾としてヒストグラムの作成について述べる。

#include <fstream.h> #include <TROOT.h> #include <TFile.h> #include <TTree.h> #include <TBranch.h> #include <TRandom.h>
c言語では、外部のファイルを#includeによってその場所に挿入する。
ここではまずfstream.hを挿入している。 拡張子hはヘッダファイルを示し、このヘッダファイルにはファイル入出力関係 の関数が記述されている。 (正確にはそのプロトタイプ。) ファイルを取り扱う場合は必須である。
TROOT.hはROOTの関数を使う場合に必要である。 必ずROOT関連のヘッダを読み込む前にインクルードしなければならない。
TFile.hはROOTファイルを取り扱う。 ROOTではヒストグラム等のデータをROOTファイルに記述する。 拡張子はrootである。
TTree.hとTBranch.hはツリーに関連した関数が定義されている。 ツリーを用いると、 ゲートをかけてデータをヒストグラムに格納したり、 データを演算したりできる。 もちろん、二次元や三次元のヒストグラムを作成することも可能である。
TRandom.hは乱数を取り扱う。 ROOTではデフォルトでガウス型ランダウ型の乱数も用意されており、 手軽に乱数を発生させることができる。

int main(int argc,char **argv) return 0;
C++のメイン関数。 argcは引数の数、argvは実際にその引数が格納される。 関数の値を返すにはreturnを用いる。

TFile *f = new TFile("test.root","recreate");
ROOTファイルを取り扱うクラスがTFileである。 第一引数にはROOTファイルを指定。 第二引数にはオプションを指定。 ここではrecreateを指定し、ファイルを新規に作り直すようにしてある。 new演算子によってオブジェクトを動的に生成し、 オブジェクトのポインタfという変数に格納している。
分けて書くと、 TFile *f; f = new TFile("test.root","recreate"); となる。 まず、TFile型の変数fをポインタで宣言する。(ポインタでなくても無問題。) 次に、TFileクラスのオブジェクトを生成。
また、new演算子で動的に生成したオブジェクトはdelete演算子によって メモリーを開放しなければならない。
delete f;
のように書く。

TTree *tree = new TTree("tree","tree");
ツリーのオブジェクトを生成。 第一引数がオブジェクトの名前、第二引数がタイトル。 特に問題なければ、変数名と同じで良い。
tree->Branch("test",&a,"a/D");
ツリーの枝を作る。 書式は色々あるが、この場合第一引数を枝の名前、 第二引数を格納するデータのアドレス、 第三引数を葉のリスト(これについては良く分からない)。 第三引数の書式は変数名/(スラッシュ)データ型で、
データ型は例えば
double -> D
int -> I
となっている。
a = gRandom->Gaus(0,1);
ガウス型の乱数を発生させ、結果をaに代入している。 gRabdomは詳しく知らないが、このように書くことで特にオブジェクトを生成 しなくてもそのメソッドを使うことができる。 Gausメソッドの第一引数は乱数の中心値、第二引数はその幅(標準偏差)である。
tree->Fill();
ツリーに実際に値を格納している部分。 たいていループ中におき、イベントごとに値を格納する。
tree->Write();
最後に、ツリーをROOTファイルに書き出す。

以上により、ガウス型の乱数をデータとして格納したツリーを含むROOTファイル を生成することができる。 ツリーからヒストグラムを作るのは別のプログラムによって行う。

temp.C

/*** ここから ***/
{ TFile *file = new TFile("test.root"); tree->Draw("a>>h1(1000,-5,5)"); }
/*** ここまで ***/
ツリーからヒストグラムを生成し、表示させるマクロ。 ROOTは高性能のC++インタープリタCINTを内蔵しており、 C++のソースコードをそのままROOTのマクロとして使用できる。 この例では、先ほど作成したtest.rootを読み込み、 treeという名前のツリーからaという枝の情報を取得し、 h1という名前のヒストグラムを作成している。 h1(1000,-5,5)はビンの数が1000で、-5から5までの範囲でヒストグラムを作成 するという意味である。

書きかけ