Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
ja:root:wantto2 [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:root:wantto2

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
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|}}
 +
ja/root/wantto2.1422531253.txt.gz · 最終更新: 2015/01/29 11:34 by kota