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:stat [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:root:stat

統計情報(統計box)


統計情報の表示

  • 表示される情報は、SetOptStat で制御される
gStyle->SetOptStat(mode);
  • modeで指定するのは、尖度(k)、歪度(s)、ビン数(i)、オーバーフロー数(o)、アンダーフロー数(u)、RMS(r)、平均値(m)、データ数(e)、ヒストグラム名(n)
  • modeの指定には2通りの書き方がある。
  1. 0を非表示、1を表示、2をエラー付きで表示(k,s,r,mのみ)として、ksiourmen の順に gStyle->SetOptStat(000111111) のように指定する方法。
    • デフォルトは、gStyle->SetOptStat(000001111)
    • 頭の方の0は書かなければ省略したとみなされるので、gStyle->SetOptStat(1111) と gStyle-->SetOptStat(000001111) は同じ意味
    • gStyle->SetOptStat(1) は gStyle->SetOptStat(1111) と認識されてしまうらしい。ヒストグラム名だけを表示させたければ、 gStyle->SetOptStat(1000000001) のようにすればよい。(頭に1を足して10桁にする)
  2. 文字を用いて gStyle-->SetOptStat(“nemr”) のように““で囲んで指定する。
    • デフォルトは gStyle->SetOptStat(“nemr”)
    • 基本的には小文字だが、K,S,R,M は大文字もあり、これらはエラー付きを表す。
    • Iにも大文字があり、Integralの”幅”を表示してくれるらしい。(上のやり方にもiに対応するところに2を入れられるかも?未確認)

統計boxの移動・サイズ変更

//移動
gStyle->SetStatX(0.2);       //統計boxの右上角のX座標(左下を(0,0),右上を(1,1))
gStyle->SetStatY(0.9);       //統計boxの右上角のY座標(左下を(0,0),右上を(1,1))
//サイズ変更
gStyle->SetStatH(3);         //高さを変える
gStyle->SetStatW(0.15);      //幅を変える (Canvas?全体の長さを1とする)
gStyle->SetStatFontSize(0.04); //フォントのサイズを変える

統計BOXのIntegralなどの表示桁数を変更したい

gStyle->SetStatFormat("6.6g");

とするか、またはTPaveStats *stに対して

st->SetStatFormat("6.6g");

などのようにして、フォーマットを指定する。 デフォルトは“6.4g”。 これらの意味するところはフォーマット指定子を参照

個々のヒストグラムなどの統計boxに対する操作

  • 以下のようにして、Drawしたヒストグラムの統計boxをとってこれる
 h->Draw();
 gPad->Update();  //マクロに書いて実行するときにはこれがないと h->FindObject("stats") が NULL ポインタを返してしまう
                  //コマンドラインでやるときは多分必要ない
 TPaveStats *st = (TPaveStats*)h->FindObject("stats");
  • histogram hの統計boxを削除したいときは h->SetStats(0)

2つのヒストグラムの統計情報を並べて書く

  • 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい
  h0->SetLineColor(kBlack);
  h0->Draw();
  h1->SetLineColor(kRed);
  h1->Draw("sames");  // "same" だとh0の統計boxが消えてしまう
  gPad->Update();
 
  const Float_t st0_lower_left_x = 0.6;
  const Float_t st0_lower_left_y = 0.75;
  const Float_t st_Width = 0.39;
  const Float_t st_Height = 0.24;
  const Float_t st1_lower_left_x = st0_lower_left_x;
  const Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005; //-0.005 は2つのboxの隙間
 
//h0 の統計boxについて
  TPaveStats *st0 = (TPaveStats*)h0->FindObject("stats");
  st0->SetX1NDC(st0_lower_left_x);
  st0->SetY1NDC(st0_lower_left_y);
  st0->SetX2NDC(st0_lower_left_x + st_Width);
  st0->SetY2NDC(st0_lower_left_y + st_Height);
  st0->SetLineColor(kBlack);
//h1 の統計boxについて
  TPaveStats *st1 = (TPaveStats*)h1->FindObject("stats");
  st1->SetX1NDC(st1_lower_left_x);
  st1->SetY1NDC(st1_lower_left_y);
  st1->SetX2NDC(st1_lower_left_x + st_Width);
  st1->SetY2NDC(st1_lower_left_y + st_Height);
  st1->SetLineColor(kRed);
//反映させる
  c->Modified(); // ”変更した” というフラグを立ててやる
  c->Update();   // フラグが立っているものを変更、反映する
  • NDC : Normalized Descartes Coordinate のことだと思われる(0〜1まで)
  • 最後の反映に関わるところは、Canvasを分割している場合は次のように分割pad毎にModified , Update する必要がある。
  c->cd(1)->Modified();
  c->cd(1)->Update();

Statistics box内のtextの編集

公式のクラスリファレンスの” Statistics box editing”のところをみると良い。

参考コードを以下に。

void Stat()
{
  TCanvas *c1 = new TCanvas("c1","c1",800,600);
  c1->SetGrid(0,0);
  TH1D *hist = new TH1D("hist","",60,-3,3);
  hist->FillRandom("gaus",1000);
  hist->SetLineWidth(3);
  hist->SetLineColor(kBlue);
  hist->Draw();
 
  ///////////////
  ///// fit /////
  ///////////////
  TF1 *gaus1 = new TF1("gaus1","gausn",-3,3);///// [0]*exp(-0.5*( (x-[1])/[2])**2 )  / (sqrt(2*pi)*[2])
  gaus1->SetLineWidth(5);
  gaus1->SetLineColor(kRed);
  Double_t FitRangeMin = -2.5;
  Double_t FitRangeMax =  2.5;
  //hist->Fit("gaus1","","",FitRangeMin,FitRangeMax);
  hist->Fit("gaus1","0","",FitRangeMin,FitRangeMax);///// 0はfit関数を描かないようにするため
 
  gaus1->SetRange(FitRangeMin,FitRangeMax);///// fit rangeでだけ関数を表示するように
  gaus1->Draw("same");
 
  Double_t Gaus1Mean  = gaus1->GetParameter(1);
  Double_t Gaus1Sigma = gaus1->GetParameter(2);
  cout << "Gaus-1 : " << endl;
  cout << "    Mean  = " << Gaus1Mean << endl;
  cout << "    Sigma = " << Gaus1Sigma << endl;
  cout << "Chisq/NDF = " << gaus1->GetChisquare() <<"/"<< gaus1->GetNDF() << endl;
 
  ////////////////
  ///// stat /////
  ////////////////
  gPad->Modified();/////TPad::Modified()はいらないけどとりあえず呼んでおけばいいんでなかろうか。
  gPad->Update();///// TPad::Update() is needed <---こちらは必要
  TPaveStats *st1 = (TPaveStats*)hist->FindObject("stats");
  //TPaveStats *st1 = (TPaveStats*)gPad->GetPrimitive("stats");
  st1->SetName("mystats");///// <-- 名前を変更しておく必要あり(そうしないと、hist->SetStats(0)で消えてしまう)
  st1->SetOptFit(0);
  ///// TPad::Modified() and TPad::Update() are needed to reflect st1->SetOptFit(0)
  gPad->Modified();
  gPad->Update();
 
  ///// position and size of the stat. box
  st1->SetX1NDC(0.90-0.25);
  st1->SetY1NDC(0.90-0.25);
  st1->SetX2NDC(0.90);
  st1->SetY2NDC(0.90);
  //// frame of the stat. box
  st1->SetLineWidth(3);
  st1->SetLineStyle(2);
  st1->SetLineColor(kMagenta);
 
  ///// modify/remove lines
  TList *listOfLines = st1->GetListOfLines();
  st1->GetLineWith("Entries")->SetTextColor(kBlue);
  st1->GetLineWith("Mean")->SetTextColor(kBlue);
  TText *tconst = st1->GetLineWith("RMS");
  listOfLines->Remove(tconst);
 
  ///// Add new lines in the stat box.
  ///// Note that "=" is a control character
  TLatex *TextGaus1Mean  = new TLatex(0,0,Form("Gaus Mean  = %.2f",Gaus1Mean));
  TextGaus1Mean->SetTextColor(kRed);
  TextGaus1Mean->SetTextSize(0);///// 0にしておくことで、フォントサイズを自動で調整してくれる
  listOfLines->Add(TextGaus1Mean);
  TLatex *TextGaus1Sigma = new TLatex(0,0,Form("Gaus Sigma = %.2f",Gaus1Sigma));
  TextGaus1Sigma->SetTextColor(kRed);
  TextGaus1Sigma->SetTextSize(0);///// 0にしておくことで、フォントサイズを自動で調整してくれる
  listOfLines->Add(TextGaus1Sigma);
 
  ///// the following line is needed to avoid that the automatic redrawing of stats
  hist->SetStats(0);
 
  gPad->Modified();///// TPad::Modified() is needed
  gPad->Update();
 
}

ポイントは、

  • 統計ボックス内のtextにアクセスするには、TList* TPaveStats::GetListOfLines() でtextのリストを取ってきてやる
  • TAttText::SetTextSize(0)とすることで、フォントサイズを自動調整
  • TPad::Modified(), TPad::Update()を(こまめに?)呼んでやる
  • TPaveStats::SetName(“hoge”)で名前を変えてやる
  • 変更後、TH1::SetStats(0)を呼んでやる

あたりだろうか。


ja/root/stat.txt · 最終更新: 2019/04/18 16:23 by kota