 
 
 
 
 
 
 
  
ヒストグラムに蓄えられた情報をもとに何か 計算したいというのはしばしば起こる欲求である。 そんな時のための技を紹介する。 その際、まず覚えておかなくてはならないことは ビン番号の数え方の習慣である。
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次元の場合と同じ。
 である点に注意。
X 軸については1次元の場合と同じ。
また、ビンの中心値や、ビンのエントリーの数を知るには
xc = h2->GetXaxis()->GetBinCenter(GetBin(i,j)); // x center of bin (i,j) yc = h2->GetYaxis()->GetBinCenter(GetBin(i,j)); // y center of bin (i,j) z = h2->GetBinContent(GetBin(i,j)); // content of bin (i,j)などとする。
 で2次元のビンを1次元に翻訳してくれる。
逆に
 で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);とすることにより、
 の中身の平方根がとられる。
このマクロではもとのヒストグラムを破壊してしまう。
それがいやなら、もとのヒストグラムをコピーしてから
するか、新しいヒストグラムのポインターを返すように
マクロを改良すれば良い。
 の中身の平方根がとられる。
このマクロではもとのヒストグラムを破壊してしまう。
それがいやなら、もとのヒストグラムをコピーしてから
するか、新しいヒストグラムのポインターを返すように
マクロを改良すれば良い。
 
 
 
 
 
 
