この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
ja:root:wantto2 [2015/01/29 11:33] 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)して、さらにエラーバーをつけたい ===== | ||
| + | |||
| + | 本題だが、上の二つをそのまま組み合わせただけでは、 | ||
| + | 規格化されたヒストグラムのエラーがスケール後に再計算されてしまう。\\ | ||
| + | 例えば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> | ||
| ライン 41: | ライン 75: | ||
| <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|}} | ||
| + | |||