エントリー数の違うヒストグラムの形を比べる時などに活躍。
TH1::Scale を使って
h->Scale(ScaleFactor);
のようにする。
形の比較(h1,h2)の時などは
h2->Scale(h1->GetEntries() / h2->GetEntries());
のようにする。
ヒストグラムにエラーバーをつけるには、TH1::Draw の“E”オプションを使えば良い。
各Binのエントリー数の平方根がエラーとしてつくようだ。
h→GetBinContent(BinNO), h→GetBinError(BinNO)で各Binの情報を取り出して、比べてみると良い。
“E”にもいくつかあって、
とある。“E1”とかを使っておけばOK。小文字でも良い。
ただ、“E”オプションを使うと元のヒストグラムの線が表示されないのが難点(一度やってみるとわかる)。
なので面倒だが
h->Draw(); h->Draw("same e1");
のようにする。
(ヒストグラムをコピーして片方をエラー用にして、分けた状態で重ね描いても良い)
追記:と思っていたが、実はDrawのオプションで“hist” というのがあって、
h->Draw("hist e1");
とすれば綺麗に解決!
本題だが、上の二つをそのまま組み合わせただけでは、
規格化されたヒストグラムのエラーがスケール後に再計算されてしまう。
例えば10倍にスケールした時、エラーバーも10倍になっていてほしいが、10倍の統計があると思って小さく(√10倍)描かれてしまう。
これを避けるために
h->Sumw2(); h->Scale(ScaleFactor);
のようにスケールする前にh->Sumw2()をはさまなくてはならない。
“sum of squares of weights”のこと。
ヒストグラムにWeight付きでFillするとき、Fillの前にh→Sumw2()しておくことで、各Binの
√(Σw_i^2)が保存される。(これは、各Binのエラーになる。Weightが全て1なら√N)
また、Sumw2()をcallすることでエラーが保存されるため、 ヒストグラムを書いた後にそのヒストグラムに対して演算(四則演算、scaleなども含む)をする場合などは演算前にSumw2()をcallしておかねばならない。 (そうしないと後からエラーを計算させた時に、演算後のヒストグラムの各Binに対して単純に各Binのエントリーの平方根を返すことになってしまう。)
// マクロ test.C void test() { gStyle->SetOptStat(0); TH1D *h1 = new TH1D("h1","h1",50,-5,5); TH1D *h2 = new TH1D("h2","h2",50,-5,5); TCanvas *c = new TCanvas("c","c",800,600); h1->FillRandom("gaus",10000); h2->FillRandom("gaus",1000); h2->Sumw2(); h2->Scale(10); h1->SetLineColor(2); h2->SetLineColor(4); h1->Draw("hist e1"); h2->Draw("same hist e1"); }