ヒストグラムに蓄えられた情報をもとに何か 計算したいというのはしばしば起こる欲求である。 そんな時のための技を紹介する。 その際、まず覚えておかなくてはならないことは ビン番号の数え方の習慣である。
TH1D *h1 = new TH1D("name","title",nbins,xmin,xmax);として作ったヒストグラムの場合、
0 : underflow bin 1 - nbins : ordinary bins nbins+1 : overflow binとなる。
既に存在しているヒストグラムの ビンの数や、上下限を知るには、
nxbins = h1->GetXaxis()->GetNbins(); xmin = h1->GetXaxis()->GetXmin(); xmax = h1->GetXaxis()->GetXmax();また、ビンの中心値や、ビンのエントリーの数を知るには
xc = h1->GetXaxis()->GetBinCenter(i); // center of i-th bin z = h1->GetBinContent(i) // content of i-th binが役に立つ。
2次元プロットの場合、 Y 軸のビンの数や、上下限を知るには、 容易に想像できるように、
nybins = h2->GetYaxis()->GetNbins(); ymin = h2->GetYaxis()->GetXmin(); ymax = h2->GetYaxis()->GetXmax();とすれば良い。 Y 軸であっても や である点に注意。 X 軸については1次元の場合と同じ。
また、ビンの中心値や、ビンのエントリーの数を知るには
xc = h2->GetXaxis()->GetBinCenter(i); // x center of bin (i,j) yc = h2->GetYaxis()->GetBinCenter(j); // y center of bin (i,j) z = h2->GetBinContent(h2->GetBin(i,j)); // content of bin (i,j)などとする。 で2次元のビンを1次元に翻訳してくれる。 逆に から を知るには、 でやったように、
Int_t i = h2->GetXaxis()->FindBin(x); Int_t j = h2->GetYaxis()->FindBin(y);を使う。
ビンの積分は
sum = h1->Integral(i1,i2); sum = h2->Integral(i1,i2,j1,j2);てな感じ。
さて、練習として、あるヒストグラムの平方根をとる ことを考えてみよう。
void Sqrt(TH1 *h) { Double_t x, y, dy; for (int i=0; i<h->GetNbinsX()+1; i++) { y = h->GetBinContent(i); dy = h->GetBinError(i); if (y > 0.) { y = TMath::Sqrt(y); dy = 0.5*dy/y; } else { y = dy = 0.; } h->SetBinContent(i,y); h->SetBinError(i,dy); } }のようなマクロを とかいう名前で用意しておけば
.L sqrt.C Sqrt(h1);とすることにより、 の中身の平方根がとられる。 このマクロではもとのヒストグラムを破壊してしまう。 それがいやなら、もとのヒストグラムをコピーしてから するか、新しいヒストグラムのポインターを返すように マクロを改良すれば良い。