サンプル集
- ヒストグラムを作る
ヒストグラムを作る
ヒストグラムを作成する例。
このサンプルは、ガウス型の確率分布で乱数を発生させ、
その結果をtreeに格納する。
ヒストグラムを作るときは、このtreeから値を読み取って改めてヒストグラム
に格納する。
Makefileは別の項で述べた通り。
monte.cxx
/*** ここから ***/
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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までの範囲でヒストグラムを作成
するという意味である。
書きかけ