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

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
ja:root:stat [2014/04/17 12:45]
kota [2つのヒストグラムの統計情報を並べて書く]
ja:root:stat [2019/04/18 16:23] (現在)
kota [Statistics box内のtextの編集]
ライン 27: ライン 27:
 <code c_mac> <code c_mac>
 //移動 //移動
-gStyle->​SetStatX(0.2); ​      // +gStyle->​SetStatX(0.2); ​      //統計boxの右上角のX座標(左下を(0,​0),​右上を(1,​1)) 
-gStyle->​SetStatY(0.9); ​      //+gStyle->​SetStatY(0.9); ​      //統計boxの右上角のY座標(左下を(0,​0),​右上を(1,​1))
 //​サイズ変更 //​サイズ変更
 gStyle->​SetStatH(3); ​        //​高さを変える gStyle->​SetStatH(3); ​        //​高さを変える
-gStyle->​SetStatW(0.15); ​     //​幅を変える +gStyle->​SetStatW(0.15); ​     //​幅を変える ​(Canvas?​全体の長さを1とする) 
-gStyle->​SetStatFontSize(30); //​フォントのサイズを変える+gStyle->​SetStatFontSize(0.04); //​フォントのサイズを変える
 </​code>​ </​code>​
  
  
 ---- ----
 +===== 統計BOXのIntegralなどの表示桁数を変更したい =====
  
 +<code c_mac>
 +gStyle->​SetStatFormat("​6.6g"​);​
 +</​code>​
 +とするか、またはTPaveStats *stに対して
 +<code c_mac>
 +st->​SetStatFormat("​6.6g"​);​
 +</​code>​
 +などのようにして、フォーマットを指定する。
 +デフォルトは"​6.4g"​。
 +これらの意味するところはフォーマット指定子を[[ja:​cpp:​iostream|参照]]。
 ===== 個々のヒストグラムなどの統計boxに対する操作 ===== ===== 個々のヒストグラムなどの統計boxに対する操作 =====
  
ライン 56: ライン 67:
   * 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい   * 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい
 <code c_mac> <code c_mac>
 +  h0->​SetLineColor(kBlack);​
   h0->​Draw();​   h0->​Draw();​
 +  h1->​SetLineColor(kRed);​
   h1->​Draw("​sames"​); ​ // "​same"​ だとh0の統計boxが消えてしまう   h1->​Draw("​sames"​); ​ // "​same"​ だとh0の統計boxが消えてしまう
- 
   gPad->​Update();​   gPad->​Update();​
   ​   ​
-  Float_t st0_lower_left_x = 0.6; +  ​const Float_t st0_lower_left_x = 0.6; 
-  Float_t st0_lower_left_y = 0.75; +  ​const Float_t st0_lower_left_y = 0.75; 
-  Float_t st_Width = 0.39; +  ​const Float_t st_Width = 0.39; 
-  Float_t st_Height = 0.24; +  ​const Float_t st_Height = 0.24; 
-  Float_t st1_lower_left_x = st0_lower_left_x;​ +  ​const Float_t st1_lower_left_x = st0_lower_left_x;​ 
-  Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005;​ //​-0.005 は2つのboxの隙間+  ​const Float_t st1_lower_left_y = st0_lower_left_y - st_Height - 0.005;​ //​-0.005 は2つのboxの隙間
  
 //h0 の統計boxについて //h0 の統計boxについて
-  TPaveStats *st10 = (TPaveStats*)h0->​FindObject("​stats"​);​ +  TPaveStats *st0 = (TPaveStats*)h0->​FindObject("​stats"​);​ 
-  ​st10->​SetX1NDC(st0_lower_left_x);​ +  ​st0->​SetX1NDC(st0_lower_left_x);​ 
-  ​st10->​SetY1NDC(st0_lower_left_y);​ +  ​st0->​SetY1NDC(st0_lower_left_y);​ 
-  ​st10->​SetX2NDC(st0_lower_left_x + st_Width);​ +  ​st0->​SetX2NDC(st0_lower_left_x + st_Width);​ 
-  ​st10->​SetY2NDC(st0_lower_left_y + st_Height);+  ​st0->​SetY2NDC(st0_lower_left_y + st_Height); 
 +  st0->​SetLineColor(kBlack);
 //h1 の統計boxについて //h1 の統計boxについて
-  TPaveStats *st11 = (TPaveStats*)h1->​FindObject("​stats"​);​ +  TPaveStats *st1 = (TPaveStats*)h1->​FindObject("​stats"​);​ 
-  ​st11->​SetX1NDC(st1_lower_left_x);​ +  ​st1->​SetX1NDC(st1_lower_left_x);​ 
-  ​st11->​SetY1NDC(st1_lower_left_y);​ +  ​st1->​SetY1NDC(st1_lower_left_y);​ 
-  ​st11->​SetX2NDC(st1_lower_left_x + st_Width);​ +  ​st1->​SetX2NDC(st1_lower_left_x + st_Width);​ 
-  ​st11->​SetY2NDC(st1_lower_left_y + st_Height);+  ​st1->​SetY2NDC(st1_lower_left_y + st_Height); 
 +  st1->​SetLineColor(kRed);
 //​反映させる //​反映させる
   c->​Modified();​ //​ ”変更した” というフラグを立ててやる   c->​Modified();​ //​ ”変更した” というフラグを立ててやる
ライン 93: ライン 107:
   c->​cd(1)->​Update();​   c->​cd(1)->​Update();​
 </​code>​ </​code>​
 +
 +
 +----
 +==== Statistics box内のtextの編集 ====
 +
 +[[https://​root.cern.ch/​doc/​v608/​classTPaveStats.html|公式のクラスリファレンス]]の” Statistics box editing”のところをみると良い。
 +
 +参考コードを以下に。
 +<code cpp>
 +                                                                                   
 +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();​
 +
 +}
 +
 +
 +</​code>​
 +----
 +ポイントは、
 +  * 統計ボックス内のtextにアクセスするには、TList* TPaveStats::​GetListOfLines() でtextのリストを取ってきてやる
 +  * TAttText::​SetTextSize(0)とすることで、フォントサイズを自動調整
 +  * TPad::​Modified(),​ TPad::​Update()を(こまめに?)呼んでやる
 +  * TPaveStats::​SetName("​hoge"​)で名前を変えてやる
 +  * 変更後、TH1::​SetStats(0)を呼んでやる
 +あたりだろうか。
 +{{ :​ja:​root:​stat_edit.png?​400 |}}
 +----
ja/root/stat.1397738730.txt.gz · 最終更新: 2014/04/17 12:45 by kota