この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
ja:root:wantto2 [2015/01/29 11:34] kota [ヒストグラムにエラーバーをつける] |
ja:root:wantto2 [2018/09/05 17:42] (現在) kota [サンプルコード] |
||
---|---|---|---|
ライン 18: | ライン 18: | ||
===== ヒストグラムにエラーバーをつける ===== | ===== ヒストグラムにエラーバーをつける ===== | ||
ヒストグラムにエラーバーをつけるには、TH1::Draw の"E"オプションを使えば良い。\\ | ヒストグラムにエラーバーをつけるには、TH1::Draw の"E"オプションを使えば良い。\\ | ||
+ | 各Binのエントリー数の平方根がエラーとしてつくようだ。\\ | ||
+ | h->GetBinContent(BinNO), h->GetBinError(BinNO)で各Binの情報を取り出して、比べてみると良い。\\ | ||
"E"にもいくつかあって、 | "E"にもいくつかあって、 | ||
* "E": 誤差棒( error bars)を描画する。 | * "E": 誤差棒( error bars)を描画する。 | ||
ライン 34: | ライン 36: | ||
のようにする。 | のようにする。 | ||
(ヒストグラムをコピーして片方をエラー用にして、分けた状態で重ね描いても良い)\\ | (ヒストグラムをコピーして片方をエラー用にして、分けた状態で重ね描いても良い)\\ | ||
+ | |||
+ | 追記:と思っていたが、実はDrawのオプションで"hist" というのがあって、 | ||
+ | <code c> | ||
+ | h->Draw("hist e1"); | ||
+ | </code> | ||
+ | とすれば綺麗に解決! | ||
===== ヒストグラムを規格化(Scale)して、さらにエラーバーをつけたい ===== | ===== ヒストグラムを規格化(Scale)して、さらにエラーバーをつけたい ===== | ||
+ | |||
+ | 本題だが、上の二つをそのまま組み合わせただけでは、 | ||
+ | 規格化されたヒストグラムのエラーがスケール後に再計算されてしまう。\\ | ||
+ | 例えば10倍にスケールした時、エラーバーも10倍になっていてほしいが、10倍の統計があると思って小さく(√10倍)描かれてしまう。\\ | ||
+ | |||
+ | これを避けるために | ||
+ | <code c> | ||
+ | h->Sumw2(); | ||
+ | h->Scale(ScaleFactor); | ||
+ | </code> | ||
+ | のようにスケールする前にh%%->%%Sumw2()をはさまなくてはならない。 | ||
+ | |||
+ | |||
+ | <note tip> | ||
+ | TH1::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のエントリーの平方根を返すことになってしまう。) | ||
+ | </note> | ||
+ | |||
+ | |||
+ | |||
===== サンプルコード ===== | ===== サンプルコード ===== | ||
<code c_mac> | <code c_mac> | ||
- | // マクロ test.C のサンプルコード | + | // マクロ test.C |
void test() | void test() | ||
{ | { | ||
- | TH1D *h1 = new TH1D("h1","h1",100,-10,10); | + | gStyle->SetOptStat(0); |
- | TH1D *h2 = new TH1D("h2","h2",100,-10,10); | + | 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); | |
- | TCanvas *c = new TCanvas("c","c",700,600); | + | |
h1->FillRandom("gaus",10000); | h1->FillRandom("gaus",10000); | ||
h2->FillRandom("gaus",1000); | h2->FillRandom("gaus",1000); | ||
- | TH1D *h1e = (TH1D*)h1->Clone("h1e"); | + | h2->Sumw2(); |
- | TH1D *h2e = (TH1D*)h2->Clone("h2e"); | + | |
- | h2e->Sumw2(); | + | |
h2->Scale(10); | h2->Scale(10); | ||
- | h2e->Scale(10); | ||
h1->SetLineColor(2); | h1->SetLineColor(2); | ||
h2->SetLineColor(4); | h2->SetLineColor(4); | ||
- | h1e->SetLineColor(2); | ||
- | h2e->SetLineColor(4); | ||
- | |||
- | h1->Draw(); | ||
- | h1e->Draw("same e1"); | ||
- | h2->Draw("same"); | ||
- | h2e->Draw("same e1"); | ||
- | |||
- | gPad->Modified(); //いらんと思うけど一応入れた | ||
- | gPad->Update(); | ||
+ | h1->Draw("hist e1"); | ||
+ | h2->Draw("same hist e1"); | ||
} | } | ||
- | |||
</code> | </code> | ||
+ | 以下のようなものが表示される。 | ||
+ | {{:ja:root:scaleerror.png|}} | ||
+ |