ROOT (ヒストグラム解析編)†
この頁の目次†
基本操作†
$ root file1.root # file1.rootを開く
root [] .ls // file1.rootに含まれるヒストグラムなどの一覧を表示する
KEY: TH1F hist1;1 hist1
KEY: TH1F hist2;1 hist2 // 一覧の例。「KEY: 型 名前;1 タイトル」 の順に現れる
:
root [] hist1->Draw(); // "hist1" という名前のヒストグラムを画面に表示する
root [] .q // rootを終了する
扱えるヒストグラムの型†
- TH1F, TH1D
- 横軸に変数x,縦軸にその内容値v(x)の最も基本的な1次元のヒストグラム。TH1F, TH1Dの違いは保存する内容値の型がFloat (32bit)かDouble (64bit)かの違い。
- TH2F, TH2D
- 変数x,yに対して内容値v(x,y)を与える2次元のヒストグラム。
- TH3F, TH3D
- 変数x,y,zに対して内容値v(x,y,z)を与える3次元のヒストグラム。
新しい1次元ヒストグラムを作成する†
TH1F* hist = new TH1F("name","title", binnum, min, max);
ピークサーチ†
- 通常の使い方
TSpectrum *s = new TSpectrum(3); // "3"は探すピークの数。必要に応じて変える
s->Search(h1, 1, "nobackground");
Double_t *xpeaks = s->GetPositionX();
printf("%f\n",xpeaks[0]);
- 範囲を指定してピークサーチする
- 参考
- ROOTの公式頁では、TSpectrumはレガシーコードだからもう使うな、代わりにRooFitとTUnfoldを使うべし、的なことが書いてあるが、
RooFitとTUnfoldのドキュメントをいくら探してもピークサーチする方法は見つからない。
ヒストグラムを関数でフィットする†
- Gaus関数でフィットする
h->Fit("gaus");
- Gaus + 直線BGでfit
TF1 *f1 = new TF1("f1","[0]*exp(-0.5*((x-[1])/[2])*((x-[1])/[2]))+[3]*x+[4]",2050,2200); // 関数の定義
f1->SetParameter(0,1400); // 初期パラメーターの設定
f1->SetParameter(1,2100);
f1->SetParameter(2,5);
f1->SetParameter(3,1);
f1->SetParameter(4,100);
hist->Fit("f1"); // fit
- 狭い範囲でフィッティングする場合、仕様なのか、フィッティングする範囲を拡大(SetRangeUserなどで表示範囲を調整)していないとうまくフィットしないことがある。
ビンの取り扱い†
- ビン番号から変数値(ビンの中心値)を得る
double x = h1->GetBinCenter(bin); // TH1の場合
Int_t binx, biny, binz; // TH2の場合は少し面倒で、
h2->GetBinXYZ(i, binx, biny, binz); // まず、グローバルビン番号からx,y軸別ビン番号を取得し、
double x = h2->GetXaxis()->GetBinCenter(binx); // x軸、y軸それぞれに
double y = h2->GetYaxis()->GetBinCenter(biny); // ビン中心値を取得する必要がある。