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

以前のリビジョンの文書です



Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/parser/handler.php on line 1458

Warning: Declaration of syntax_plugin_note::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/lib/plugins/note/syntax.php on line 79

Warning: Declaration of syntax_plugin_note::render($mode, &$renderer, $indata) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/lib/plugins/note/syntax.php on line 101

Warning: preg_match(): Compilation failed: invalid range in character class at offset 3120 in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/parser/lexer.php on line 118
A PCRE internal error occured. This might be caused by a faulty plugin

====== 統計情報(統計box) ====== ---- ===== 統計情報の表示 ===== * 表示される情報は、SetOptStat で制御される <code c_mac> gStyle->SetOptStat(mode); </code> *modeで指定するのは、尖度(k)、歪度(s)、ビン数(i)、オーバーフロー数(o)、アンダーフロー数(u)、RMS(%%r%%)、平均値(m)、データ数(e)、ヒストグラム名(n) * modeの指定には2通りの書き方がある。 - 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桁にする) - 文字を用いて gStyle-%%->%%SetOptStat("nemr") のように""で囲んで指定する。 *デフォルトは gStyle%%->%%SetOptStat("nemr") *基本的には小文字だが、K,S,R,M は大文字もあり、これらはエラー付きを表す。 *Iにも大文字があり、Integralの"幅"を表示してくれるらしい。(上のやり方にもiに対応するところに2を入れられるかも?未確認) ---- ===== 統計boxの移動・サイズ変更 ===== <code c_mac> //移動 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); //フォントのサイズを変える </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に対する操作 ===== * 以下のようにして、Drawしたヒストグラムの統計boxをとってこれる <code c_mac> h->Draw(); gPad->Update(); //マクロに書いて実行するときにはこれがないと h->FindObject("stats") が NULL ポインタを返してしまう //コマンドラインでやるときは多分必要ない TPaveStats *st = (TPaveStats*)h->FindObject("stats"); </code> * histogram hの統計boxを削除したいときは h%%->%%SetStats(0) ==== 2つのヒストグラムの統計情報を並べて書く ==== * 2つのヒストグラムの統計情報を縦に並べるには、例えば以下のようにすればよい <code c_mac> 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(); // フラグが立っているものを変更、反映する </code> * NDC : Normalized Descartes Coordinate のことだと思われる(0〜1まで) * 最後の反映に関わるところは、Canvasを分割している場合は次のように分割pad毎にModified , Update する必要がある。 <code c_mac> c->cd(1)->Modified(); c->cd(1)->Update(); </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","N","",FitRangeMin,FitRangeMax);///// N はfit関数を描かないようにするため hist->Fit("gaus1","0","",FitRangeMin,FitRangeMax);///// 0でもNと同じようになった 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); listOfLines->Add(TextGaus1Mean); TLatex *TextGaus1Sigma = new TLatex(0,0,Form("Gaus Sigma = %.2f",Gaus1Sigma)); TextGaus1Sigma->SetTextColor(kRed); TextGaus1Sigma->SetTextSize(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のリストを取ってきてやる * TPad::Modified(), TPad::Update()を(こまめに?)呼んでやる * TPaveStats::SetName("hoge")で名前を変えてやる * 変更後、TH1::SetStats(0)を呼んでやる あたりだろうか。

ja/root/stat.1555473188.txt.gz · 最終更新: 2019/04/17 03:53 by kota