NOTE: CINT, C++, Python向けの記述が混同していいるので注意


漢なら黙ってimport (pyROOT)

from ROOT import gROOT, gStyle
gROOT.SetBatch(1)
gROOT.SetStyle('Plain')
gStyle.SetOptStat(False)
gStyle.SetEndErrorSize(0)
gStyle.SetFrameFillColor(0)
gStyle.SetCanvasColor(0)
gStyle.SetPadBorderSize(0)

バッチモードで起動したい! (起動オプション)

-ldo not show the splash screen
-brun in batch mode, without graphics display
-nwithout the execution of logon and logoff scripts
-qprocess command line scropt files and exit
バッチモードでスクリプト実行後rootを終了する:
root -b -q myMacro.C > myMacro.log
root -b -q 'myMacro.C(3)' > myMacro.log
root -b -q 'myMacro.C("text")' > myMacro.log

マクロを実行するときに引数を指定する男の人って・・・

「*.C」

(色々とあるが、)マクロの名前とmain関数の名前は同じにする。

root hoge.C

引数がある場合は以下のようにする:

root 'hoge.C("hoge0","hoge1 hoge2")'

シェルから実行する場合:

buf="hoge.C(\"hoge0\",\"hoge1 hoge2\")"
root -b -q "$buf"

ROOTてライブラリとして使うものだよね?、、、インタプリタって何?食えるの?

ライブラリ、環境を自動で設定してくれるfileMakefile.archを使うと便利:

/root_path/share/doc/root/test/Makefile.arch

これを通常のMakefileの中で読み込む:

include ./Makefile.arch

「root-config」等が実行され、適当な変数が宣言される:

CXXFLAGS     += $(ROOTCFLAGS)
LDFLAGS      += $(ROOTLDFLAGS)
LIBS          = $(ROOTLIBS) $(SYSLIBS)
GLIBS         = $(ROOTGLIBS) $(SYSLIBS)

ライブラリを使う時は明示的に、

LDFLAGS += ${GLIBS}

として、リンクさせる。

Canvasがタイル状にになっているのがウザイ

gROOT->SetStyle("Plain") ;

Titleが表示されてウザイ

全ての図:

gStyle->SetOptTitle(kFALSE) ;

個別の図:

TGraph *g ;
...
g->SetTitle("") ;

TextのAlignって便利だけど、User's guideからはぱっと見、どれを選んでいいのか分からない

default: 11

align.png

Statisticsが表示されてウザイ

gStyle->SetOptStat(kFALSE) ;

Fit結果を表示したい

gStyle->SetOptFit(1111111)

Error barの端っこがウザイ

  • default
    SetEndErrorSize.png


  • gStyle->SetEndErrorSize(0) ;
    SetEndErrorSize0.png


  • gStyle->SetEndErrorSize(10) ;
    SetEndErrorSize10.png

Canvas周りの設定を標準のまま使っている男の人って、、、

before.png

after.png

import numpy as np
from ROOT import gROOT, gSystem, gStyle, gPad, TROOT, TColor, TCanvas, TLatex, TGraph, TGraphErrors, TLine, TArrow, TLegend


gROOT.SetBatch(1)
gROOT.SetStyle('Plain')
gStyle.SetOptStat(False)
gStyle.SetEndErrorSize(0)
gStyle.SetFrameFillColor(0)
gStyle.SetCanvasColor(0)
gStyle.SetPadBorderSize(0)
gStyle.SetPadGridX(1)
gStyle.SetPadGridY(1)
gStyle.SetPadTickX(1)
gStyle.SetPadTickY(1)
_title_offset_x = 1.3
_title_offset_y = 1.7
gStyle.SetTitleOffset(_title_offset_x, "X")
gStyle.SetTitleOffset(_title_offset_y, "Y")
gStyle.SetLegendBorderSize(0)


_NX = 640
_NY = 480
_CANVAS_OFFSET_WIDTH = 4
_CANVAS_OFFSET_HEIGHT = 28
_TOP_MARGIN = 0.08
_RIGHT_MARGIN = 0.03
_BOTTOM_MARGIN = 0.11
_LEFT_MARGIN = 0.135


def Canvas(name, title, width=_NX, height=_NY):
    can = TCanvas(name, title, width + _CANVAS_OFFSET_WIDTH, height + _CANVAS_OFFSET_HEIGHT)
    gPad.SetTopMargin(_TOP_MARGIN)
    gPad.SetRightMargin(_RIGHT_MARGIN)
    gPad.SetBottomMargin(_BOTTOM_MARGIN)
    gPad.SetLeftMargin(_LEFT_MARGIN)
    return can


def main():
    c = Canvas('name', 'title')
    c.cd(1)

    xmin, xmax = 0, 100
    nrows = 100
    g = TGraph(nrows, np.linspace(nrows, xmin, xmax), np.linspace(nrows, xmin, xmax))
    g.GetXaxis().SetLimits(xmin, xmax)
    g.SetMaximum(xmax)
    g.SetMinimum(xmin)
    g.GetXaxis().CenterTitle()
    g.GetXaxis().SetTitle('X title')
    g.GetYaxis().CenterTitle()
    g.GetYaxis().SetTitle('Y title')
    g.Draw('APL')

    c.Print('test.eps')
    c.Print('test.png')
    c.Close()


if __name__ == '__main__':
    main()

よくある引数の順番って"name", "title"?"title", "name"どっちだったっけ!?

Name, Title like:

TH1F(const char* name, const char* title, Int_t nbinsx, const Float_t* xbins)
TCanvas(const char* name, const char* title, Int_t ww, Int_t wh)

Canvasのサイズを大きくするとPS fileの線の太さが太くてウザイ

gSetLineScalePS(2.0) ; // default = 3

Canvasのサイズが画像出力後のサイズと一致しないって、一体全体どういった事なのでしょうか?

もし640 x 480の画像出力が欲しい場合は

TCanvas *c = new TCanvas("title", "name", 640+4, 480+28);

とoffsetをつけてやらないといけない。これは将来的に仕様で変更があるのだろうか?それはそれで困る。

Width offset: 4Height offset: 28

ROOTってhistogram書くソフトだよね、だから基本が大事。解析は違うコードで。えっ!

  • For all histogram types: nbins, xlow, xup
  • Bin# 0 contains the underflow.
  • Bin# 1 contains the first bin with low-edge (xlow INCLUDED).
  • The second to last bin (bin# nbins) contains the upper-edge (xup EXCLUDED).
  • The Last bin (bin# nbins+1) contains the overflow.
hist.png

ROOTってhistogram書くソフトだよね、だからpeak searchはお手の物!?histogramクラスで出来るよね。えっ!

Seach_Peak.png
#!/usr/bin/env python

import numpy as np
from ROOT import gROOT, gStyle, TH1D, TSpectrum, TLine, TColor, TCanvas

gROOT.SetBatch(True)
gROOT.SetStyle('Plain')
gStyle.SetOptStat(False)

_name = 'Seach_Peak'
_peaks = [1, 5, 9]
_nums = [3000, 4000, 3000]
_widths = [1, 1.5, 0.5]

def main():
    c = TCanvas(_name, _name, 640+4, 480+28)
    c.cd(1)

    h = TH1D(_name, _name, 50, -2, 11)
    for peak, num, width in zip(_peaks, _nums, _widths):
        for val in np.random.normal(loc=peak, scale=width, size=num):
            h.Fill(val)

    h.Draw('HIST')

    s = TSpectrum()
    s.Search(h)

    for i in range(s.GetNPeaks()):
        x = s.GetPositionX()[i]
        y = h.GetBinContent(h.FindBin(x))
        line = TLine()
        line.SetLineColor(TColor.kRed)
        line.DrawLine(x, 0, x, y)

    c.Print(_name + '.eps')

if __name__ == '__main__':
    main()

Log plotが賢くない

log plotは

gPad->SetLogx() ;

で設定する。この場合値が

10^1, 10^2, 10^3....

と冪を跨ぐ場合、うまくいくが、値が

30, 40, 50...

のような場合、ラベルが何も表示されない:

logBad.png

これを表示させるには、

g->GetXaxis()->SetMoreLogLabels() ;

を実行する:

logGood.png

X軸とY軸とで最大・最小を設定する方法が違うなんて、正直オブジェクト指向としてどうかと思う

for X-axis

graph.GetXaxis().SetLimits(xmin, ymin)

for Y-axis

graph.SetMinimum(ymin)
graph.SetMaximum(ymax)

Set Limits [#u8c898af]

Not_set_limits.png
Clip.png
Expand.png

Histogramの最大のbinの大きさを知りたい、って二通りに解釈出来ない?

hist_location_display.png
h.GetMaximum()
h.FindLastBinAbove()
(axisをdraw後) gPad.GetUymax()

Fillの設定で透過を設定する!

pad->SetFillStyle(0) ;

既存のHistogramを名前を使って取得したい!

TH1F *hist = new TH1F("myHist",....) ;

TH1F *h = (TH1F*)gDirectory->Get("myHist");

OR

TH1F *h = (TH1F*)gDirectory->GetList()->FindObject("myHist");

で取得。

Alphanumeric Bin Labelsが分かりにくいっす

index.php?plugin=attach&refer=Members%2Fchinone%2FDiary%2F2013%2F02&openfile=scale_factor.png
   h = TH1D(name, title, len(data), 0, len(data)-1)
   gStyle.SetNdivisions(-len(data))
   keys = ['wmap_7yr', 'wmap_9yr', 'bicep', 'quiet_w', 'quiet_q', 'quad']
   for i, k in enumerate(keys):
       h.GetXaxis().SetBinLabel(i+1, k)
       h.SetBinContent(i+1, data[k][0])
       h.SetBinError(i+1, data[k][1])
   h.Draw('HISTE*')

2D Alphanumeric Bin Labelsを使いこなしたい! 例えば相関を書くのに

2d_alphanumeric.png
import numpy as np
from ROOT import gROOT, gStyle, gPad, TColor, TCanvas, TH2D


gROOT.SetBatch(1)
gROOT.SetStyle('Plain')
gStyle.SetOptStat(False)
gStyle.SetEndErrorSize(0)
gStyle.SetFrameFillColor(0)
gStyle.SetCanvasColor(0)
gStyle.SetPadBorderSize(0)

__NRGBs = 5
__NCont = 255
__stops = np.array([ 0.00, 0.34, 0.61, 0.84, 1.00 ])
__red   = np.array([ 0.00, 0.00, 0.87, 1.00, 0.51 ])
__green = np.array([ 0.00, 0.81, 1.00, 0.20, 0.00 ])
__blue  = np.array([ 0.51, 1.00, 0.12, 0.00, 0.00 ])
TColor.CreateGradientColorTable(__NRGBs, __stops, __red, __green, __blue, __NCont)
gStyle.SetNumberContours(__NCont)

_CANVAS_OFFSET_WIDTH = 4
_CANVAS_OFFSET_HEIGHT = 28
_TOP_MARGIN_MAP = 0.105
_RIGHT_MARGIN_MAP = 0.148
_BOTTOM_MARGIN_MAP = 0.12
_LEFT_MARGIN_MAP = 0.13
_TOP_MARGIN = 0.07
_RIGHT_MARGIN = 0.02
_BOTTOM_MARGIN = 0.10
_LEFT_MARGIN = 0.13
_NX_MAP = 580
_NY_MAP = 540


def CanvasMap(name, title, width=_NX_MAP, height=_NY_MAP):
    can = TCanvas(name, title, width + _CANVAS_OFFSET_WIDTH, height + _CANVAS_OFFSET_HEIGHT)
    gPad.SetTopMargin(_TOP_MARGIN_MAP)
    gPad.SetRightMargin(_RIGHT_MARGIN_MAP)
    gPad.SetBottomMargin(_BOTTOM_MARGIN_MAP)
    gPad.SetLeftMargin(_LEFT_MARGIN_MAP)
    return can


def main():
    nrows = 7
    nums = nrows * nrows
    val = np.linspace(0, nums, nums).reshape((nrows, nrows))
    labels = ['label %05d' % x for x in range(nrows)]

    h = TH2D('example', '2D alphanumeric bin example', nrows, 0, nrows - 1, nrows, 0, nrows - 1)
    h.GetXaxis().SetNdivisions(-len(labels))
    h.GetYaxis().SetNdivisions(-len(labels))

    for j, keyj in enumerate(labels):
        for i, keyi in enumerate(labels):
            h.GetXaxis().SetBinLabel(i+1, keyi)
            h.GetYaxis().SetBinLabel(j+1, keyj)
            h.SetBinContent(i+1, j+1, val[j][i] + 1e-128)
            h.SetBinError(i+1, j+1, 0)

    c = CanvasMap('name', 'title')
    c.cd(1)
    h.Draw("COLZ")

    c.Print("2d_alphanumeric.eps")
    c.Print("2d_alphanumeric.png")



if __name__ == '__main__':
    main()

NTupleで作ったHistogramを取得したい!

TNtuple *t = new TNtuple("1d_hist","1d_hist","x") ;
for( uint i=0; i<x.size(); i++){
  t->Fill(x[i]) ;
}
t->Draw("x") ;
TH1F *tmp = (TH1F*)gPad->GetPrimitive("htemp") ;

Histogramはweightをかけてnormalizeするのが常識だよね

TH1D *h = new TH1D( buf, buf, nCol, Min, Max) ;
h->Sumw2() ;
for( uint i=0; i<nrows; i++){
  h->Fill( value[i], weight[i]) ;
}
h->Scale(1.0/h->GetSumOfWeights()) ;

TGraphの引数がvectorではなくてpointerなのはめんどいよね、いちいち変換しなければいけないから、、、、え?

TGraph(Int_t n, const Double_t* x, const Double_t* y)
vector<double> x, y ;
uint nrows ;
..................
TGraph *g = new TGraph( nrows, &x[0], &y[0]) ;

Histogramのerror barsの種類がわからん

hist_error.jpg
hist_error_bars.png

Divide(x, y)ってどっちが行でどっちが列!?

x = x軸をx分割 = x列, y = y軸をy分割 = y行

Divide(2, 4)

divide_2_4.png

Divide(4, 2)

divide_4_2.png

ROOTは軸をdatetime表記に簡単に出来てとっても便利!、、、、、え?

expected

How to Create an Axis with Time Units ?

{
  gStyle->SetTitleH(0.08);
 
  TDatime da(2003,02,28,12,00,00);
  gStyle->SetTimeOffset(da.Convert());
 
  ct = new TCanvas("ct","Time on axis",0,0,600,600);
  ct->Divide(1,3);
 
  ht1 = new TH1F("ht1","ht1",30000,0.,200000.);
  ht2 = new TH1F("ht2","ht2",30000,0.,200000.);
  ht3 = new TH1F("ht3","ht3",30000,0.,200000.);
  for (Int_t i=1;i<30000;i++) {
    Float_t noise = gRandom->Gaus(0,120);
    ht1->SetBinContent(i,noise);
    ht2->SetBinContent(i,noise*noise);
    ht3->SetBinContent(i,noise*noise*noise);
  }
 
  ct->cd(1);
  ht1->GetXaxis()->SetLabelSize(0.06);
  ht1->GetXaxis()->SetTimeDisplay(1);
  ht1->GetXaxis()->SetTimeFormat("%d\/%m\/%y%F2000-02-28 13:00:01");
  ht1->Draw();
 
  ct->cd(2);
  ht2->GetXaxis()->SetLabelSize(0.06);
  ht2->GetXaxis()->SetTimeDisplay(1);
  ht2->GetXaxis()->SetTimeFormat("%d\/%m\/%y");
  ht2->Draw();
 
  ct->cd(3);
  ht3->GetXaxis()->SetLabelSize(0.06);
  TDatime dh(2001,09,23,15,00,00);
  ht3->GetXaxis()->SetTimeDisplay(1);
  ht3->GetXaxis()->SetTimeOffset(dh.Convert());
  ht3->Draw();
}
datetime_ex.gif

result

ct.png

some studies

The above examples depend on the time zone which is defined by "TZ" variable. Of course, we should read source how it works, but the document should mention an issue on a time zone.

Epoch of ROOT time

The document says "This date should be greater than 01/01/95 and is given in seconds". This is not much clear (which time zone? hour? minute?), but I think the epoch is "1995-01-01 00:00:00":

TDatime(1995, 1, 1, 0, 0, 0).Convert()
(const unsigned int)788918400

TDatime problem on my environment

A function of "Convert()" in "TDatime" class has a problem when an environment variable of "TZ" is NOT correctly set:

TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 28800
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 57600
gSystem->Setenv("TZ", "")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "UTC")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "JST")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "JST-9")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 4294934896
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 4294902496

if "TZ" is set correctly (TZ="", TZ="UTC", and so on):

TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "UTC")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "JST")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 0
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 0
gSystem->Setenv("TZ", "JST-9")
TDatime(1995, 1, 1, 0, 0, 0).Convert()-788918400: 4294934896
TDatime(1995, 1, 1, 0, 0, 0).Convert(kTRUE)-788918400: 4294902496

Problem of axis on my environment

  • Default
    datime_nor.png
  • gSystem->Setenv("TZ", "")
    datime_empty.png
  • gSystem->Setenv("TZ", "UTC")
    datime_utc.png
  • gSystem->Setenv("TZ", "JST")
    datime_jst.png
  • gSystem->Setenv("TZ", "JST-9")
    datime_jst-9.png

  • Default w/ TZ="" root -l
    datime_nor_empty.png
  • Default w/ TZ="UTC" root -l
    datime_nor_utc.png
  • Default w/ TZ="JST" root -l
    datime_nor_jst.png
  • Default w/ TZ="JST-9" root -l
    datime_nor_jst-9.png

{
  gSystem->Setenv("TZ", "") ;
  int nrows = 24 * 3600 + 1;
  double *x = new double [nrows] ;
  double *y = new double [nrows] ;
  for (int i=0; i<nrows; i++){
    x[i] = i ;
    y[i] = TMath::Sin(2.*i/nrows*TMath::Pi()) ;
  }

  TGraph *g = new TGraph(nrows, x, y) ;
  g->GetXaxis()->SetLabelSize(0.30) ;
  g->GetXaxis()->SetLabelColor(kRed) ;
  g->GetXaxis()->SetLabelOffset(-0.65) ;
  g->GetXaxis()->SetNdivisions(-504) ;

  g->GetXaxis()->SetLimits(x[0], x[nrows-1]) ;
  g->GetXaxis()->SetTimeDisplay(1) ;
  g->GetXaxis()->SetTimeFormat("#splitline{%y\/%m\/%d}{%H:%M:%S}") ;
 
  gROOT->SetStyle("Plain") ;
  gStyle->SetOptTitle(kFALSE) ;
  TCanvas *c = new TCanvas("title", "name", 640, 100) ;
  c->cd(1) ;
  gPad->SetRightMargin(0.08) ;
  gPad->SetLeftMargin(0.08) ;
  gPad->SetTopMargin(0.02) ;
  gPad->SetBottomMargin(0.02) ;
  gPad->SetGridx(1) ;
  gPad->SetGridy(1) ;
  g->Draw("APL") ;

  c->Print("datime_empty.png") ;
}

Conclusion

We should use the unix time with TZ="". Not setting TZ variable is invalid.

COLZがあんまり綺麗じゃないよね

Making Pretty ROOT Color Palettes

default_palette_200.pngnew_palette_200.png
beforeafter
   const Int_t NRGBs = 5;
   const Int_t NCont = 255;

   Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
   Double_t red[NRGBs]   = { 0.00, 0.00, 0.87, 1.00, 0.51 };
   Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
   Double_t blue[NRGBs]  = { 0.51, 1.00, 0.12, 0.00, 0.00 };
   TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
   gStyle->SetNumberContours(NCont);

ROOTのmultiplot環境の駄目駄目さは異常

ROOTっていろいろ出来て便利だけど、「綺麗」な絵を書くには努力が必要だよね。設定すべきパラメータも多いし。

gROOT, gStyle

const uint xlabelfont = 42 ;
const double xlabelsize = 0.04 ;
const double xlabeloffset = 0.03 ;
const uint xtitlefont = 42 ;
const double xtitlesize = 0.05 ;
const double xtitleoffset = 1.5 ;

const uint ytitlefont = 42 ;
const double ylabelsize = 0.04 ;
const double ylabeloffset = 0.01 ;
const uint ylabelfont = 42 ;
const double ytitlesize = 0.05 ;
const double ytitleoffset = 1.1 ;

gROOT->SetStyle("Plain") ;
gStyle->SetOptTitle(kFALSE) ;

gStyle->SetLabelFont(xlabelfont,"X") ;
gStyle->SetLabelSize(xlabelsize,"X") ;
gStyle->SetLabelOffset(xlabeloffset,"X") ;
gStyle->SetTitleFont(xtitlefont,"X") ;
gStyle->SetTitleSize(xtitlesize,"X") ;
gStyle->SetTitleOffset(xtitleoffset,"X") ;

gStyle->SetLabelFont(ylabelfont,"Y") ;
gStyle->SetLabelSize(ylabelsize,"Y") ;
gStyle->SetLabelOffset(ylabeloffset,"Y") ;
gStyle->SetTitleFont(ytitlefont,"Y") ;
gStyle->SetTitleSize(ytitlesize,"Y") ;
gStyle->SetTitleOffset(ytitleoffset,"Y") ;

今はやっぱりpyROOTでしょ、常識的に考えて

You can find some pyROOT tips here

Axis & Grid (軸 & グリッド) 

  • gStyle->SetAxisColor(Color_t color = 1, Option_t* axis = "X")
    • 軸の色を設定する。設定する軸は第2引数で指定する。axis="X"("Y")とすればx(y)軸のみ、axis="XY"とすればx軸とy軸の色を設定できる。
  • gStyle->SetOptLogx(Int_t logx = 1)
    • x軸を対数表示にする。
      • logx = 1, 対数表示する
      • logx = 0, 対数表示をやめる
  • gStyle->SetOptLogy(Int_t logy = 1)
    • y軸を対数表示にする。
  • gStyle->SetOptLogz(Int_t logz = 1)
    • z軸を対数表示にする。
  • gStyle->SetLabelColor(Color_t color = 1, Option_t* axis = "X")
    • 軸ラベルの色を設定する。設定する軸は第2引数のaxisに指定する。
  • gStyle->SetLabelFont(Style_t font = 62, Option_t* axis = "X")
    • 軸ラベルののフォントを指定する。設定する軸は第2引数のaxisに指定する。
  • gStyle->SetLabelOffset(Float_t offset = 0.005, Option_t* axis = "X")
    • 軸ラベルのオフセット=各軸からの距離を設定する。単位は表示するキャンバス(TPad)の高さに対する割合。設定する軸は第2引数のaxisに指定する。
  • gStyle->SetLabelSize(Float_t size = 0.04, Option_t* axis = "X")
    • 軸ラベルのフォントサイズを指定する。単位は表示するキャンバス(TPad)の高さに対する割合。設定する軸は第2引数のaxisに指定する。
  • gStyle->SetStripDecimals(Bool_t strip = kTRUE)
    • 軸ラベルの小数点以下の表示桁数を揃えるかを設定する。falseを指定すれば、"0"を"0.0"などと表示して小数点以下の桁数を揃える。デフォルトではtrue。
  • gStyle->SetGridColor(Color_t color = 0)
    • グリッドの色を指定する。
  • gStyle->SetGridStyle(Style_t style = 3)
    • グリッドのスタイルを指定する。デフォルトスタイルは3。
  • gStyle->SetGridWidth(Width_t width = 1)
    • グリッドの線幅を指定する。単位はpx。デフォルトは1px。

Tick チック・チェック

  • gStyle->SetNdivisions(Int_t n = 510, Option_t* axis = "X")
    • メモリの区切りを設定する。メモリは最も大きい区切りの第1メモリから、第3メモリまで設定できる。第1メモリの区切り数をfirst、第2メモリをsecondary、第3メモリをtertiaryとすると、
      n = tertiary * 10000 + secondary * 100 + first
      と組み合わせて指定する。第1引数nの下2桁が第1メモリ、次の2桁が第2メモリ、上の2桁が第3メモリの区切り数を表す。
    • これはあくまで目安で、その時の範囲に合わせて適切なメモリに自動的に変更される。
    • 強制的に指定した区切りで表示させたい場合は、値をnegativeに設定する。
  • gStyle->SetTickLength(Float_t length = 0.03, Option_t* axis = "X")
    • メモリバーの長さを設定する。単位はフレームの高さに対する割合。負の値を指定すれば下向きに表示される。第2引数axisに設定する軸名を指定する。このメソッドで指定するのは第1メモリの長さで、第2メモリは第1メモリの半分、第3メモリは第2メモリのさらに半分の長さになる。

Marker (マーカー)

enum EMarker Style

enum EMarkerStyle { kDot=1, kPlus, kStar, kCircle=4, kMultiply=5,
                    kFullDotSmall=6, kFullDotMedium=7, kFullDotLarge=8,
                    kOpenTriangleDown = 16, kFullCross= 18,
                    kFullCircle=20, kFullSquare=21, kFullTriangleUp=22,
                    kFullTriangleDown=23, kOpenCircle=24, kOpenSquare=25,
                    kOpenTriangleUp=26, kOpenDiamond=27, kOpenCross=28,
                    kFullStar=29, kOpenStar=30};
emarkers.gif

Note, that the marker types 1, 6 and 7 (the dots) cannot be scaled.

plot

MarkerStyle2030.png
MarkerStyle0011.png

Color 色

color wheel

wheel.png
{
   TColorWheel *w = new TColorWheel();
   w->Draw();
   return w->GetCanvas();
}

使い方:

myObject.SetFillColor(kRed);
myObject.SetFillColor(kYellow-10);
myLine.SetLineColor(kMagenta+2);

enum EColor

enum EColor { kWhite, kBlack, kRed, kGreen, kBlue, kYellow, kMagenta, kCyan };
kColors.png
void kColor()
{
  TCanvas *c = new TCanvas( "kColors", "White, Black, Green, Blue, Yellow, Magenta, Cyan, Red",
			    640, 480) ;
  c->cd(1) ;


  TF1 *f1 = new TF1( "White", "sin(x)", -5,5) ;
  TF1 *f2 = new TF1( "Black", "sin(x-3.14/10.0*1.0)", -5,5) ;
  TF1 *f3 = new TF1( "Green", "sin(x-3.14/10.0*2.0)", -5,5) ;
  TF1 *f4 = new TF1( "Blue", "sin(x-3.14/10.0*3.0)", -5,5) ;
  TF1 *f5 = new TF1( "Yellow", "sin(x-3.14/10.0*4.0)", -5,5) ;
  TF1 *f6 = new TF1( "Magenta", "sin(x-3.14/10.0*5.0)", -5,5) ;
  TF1 *f7 = new TF1( "Cyan", "sin(x-3.14/10.0*6.0)", -5,5) ;
  TF1 *f8 = new TF1( "Red", "sin(x-3.14/10.0*7.0)", -5,5) ;

  f1->SetLineColor(kWhite) ;
  f1->Draw() ;

  f2->SetLineColor(kBlack) ;
  f2->Draw("same") ;

  f3->SetLineColor(kGreen) ;
  f3->Draw("same") ;

  f4->SetLineColor(kBlue) ;
  f4->Draw("same") ;

  f5->SetLineColor(kYellow) ;
  f5->Draw("same") ;

  f6->SetLineColor(kMagenta) ;
  f6->Draw("same") ;

  f7->SetLineColor(kCyan) ;
  f7->Draw("same") ;

  f8->SetLineColor(kRed) ;
  f8->Draw("same") ;

  c->Print("kColors.png") ;
}

Palette

ecolor.png

 

ecolors.gif
void ecolor(void)
{
  TCanvas *canvas = new TCanvas( "ecolor", "ecolor", 640, 480) ;
  canvas->cd(0) ;
  gPad->SetRightMargin(0.02) ;
  gPad->SetBottomMargin(0.02) ;
  gPad->SetLeftMargin(0.05) ;
  canvas->cd(1) ;


  for( Int_t i=1; i<=50; i++){

    char eq[256] ;
    sprintf( eq, "%d", i) ;

    TF1 *f = new TF1( eq, eq) ;
    f->SetLineColor(i) ;
    f->SetMaximum(51) ;
    f->SetMinimum(0) ;

    if( i==1 ){
      f->SetTitle("Color list") ;
      f->GetXaxis()->SetNdivisions(0) ;
      f->Draw() ;
    }
    else{
      f->Draw("same") ;
    }
  }
}

Line (線種)

enum ELine Style

enum ELineStyle { kSolid = 1, kDashed, kDotted, kDashDotted };
graph->SetLineStyle(1) ;
style : 1=solid, 2=dash, 3=dash-dot, 4=dot-dot

width

expressed in pixel units

graph->SetLineWidth(1) ;

plot

line.png
void line(void)
{
  gROOT->SetStyle("Plain") ;


  TCanvas *canvas = new TCanvas("Line", "Line", 640, 480) ;

  canvas->cd(0)->SetRightMargin(0.01) ;
  canvas->cd(0)->SetLeftMargin(0.05) ;
  canvas->cd(0)->SetBottomMargin(0.05) ;
  canvas->cd(1) ;

  char buf[256] ;
  char eq[256] ;

  for( Int_t i=1; i<=4; i++){

    for( Int_t j=1; j<10; j++){

      sprintf( buf, "%d%d", i, j) ;
      sprintf( eq, "10.0*%d+%d", i, j) ;
      TF1 *f = new TF1( buf, eq) ;


      f->SetLineStyle(i) ;
      f->SetLineWidth(j) ;

      f->SetMinimum(10) ;
      f->SetMaximum(50) ;

      if( i==1 && j==1 ){
	f->SetTitle("SetLineStyle(i) and SetLineWidth(j)") ;
	f->GetXaxis()->SetNdivisions(0) ;
	f->Draw() ;
      }
      else
	f->Draw("same") ;

    }
  }

Font (フォント)

Font Code

The parameter for the font is the font code, combining the font and precision:

font_code = 10 * font_id + precision,

where font_id is

root_font.png
root_font_ex.png

and the precision can be

  • Precision=0, fast hardware fronts
  • Precision=1, scalable and rotate-able hardware fonts
    • the Post Script text uses the old convention for some special characters to draw sub and superscripts or Geek text.
  • Precision=2, scalable and rotate-able hardware fonts
    • the "Post Script" special characters are drawn as such. To draw sub and superscripts it is highly recommended to use TLatex objects instead.

Statistics (統計)

chi Square

get pdf of chi-square dist:

ROOT::Math::chisquared_pdf( chi2, ndf, chi2=0) ;

Computation of the probability density for a certain Chi-squared (chi2) and number of degrees of freedom (ndf).

double chisquared_pdf(double x, double r, double x0 = 0)

chisquared_pdf.png

chi-square (+ndf) -> PTE:

TMath::Prob( chi2, ndf) ;

Computation of the probability for a certain Chi-squared (chi2) and number of degrees of freedom (ndf). Calculations are based on the incomplete gamma function P(a,x), where a=ndf/2 and x=chi2/2. P(a,x) represents the probability that the observed Chi-squared for a correct model should be less than the value chi2. The returned probability corresponds to 1-P(a,x), which denotes the probability that an observed Chi-squared exceeds the value chi2 by chance, even for a correct model(=PTE, Probability To Exceed).

Double_t Prob(Double_t chi2, Int_t ndf) ;


probability (+ndf) -> chi-square:

TMath::ChisquareQuantile( prob, ndf) ;

Evaluate the quantiles of the chi-squared probability distribution function.

Double_t ChisquareQuantile(Double_t p, Double_t ndf) ;


pValue.png

void chisq(void)
{
  gROOT->SetStyle("Plain") ;
  gStyle->SetOptStat(kFALSE) ;

  TCanvas *canvas = new TCanvas( "chisq", "test_chisq", 640, 960) ;
  canvas->cd(0) ;
  canvas->Divide(1,2) ;
  canvas->cd(0) ;
  for( Int_t i=0; i<2; i++){
    canvas->cd(i+1) ;
    gPad->SetRightMargin(0.03) ;
  }


  canvas->cd(1) ;
  plotPValueVSChisq() ;


  canvas->cd(2) ;
  plotReducedChisqVSDegreesOfFreedom() ;
}


void plotPValueVSChisq(void)
{
  Double_t chisq_min = 1.0 ;
  Double_t chisq_max = 100.0 ;
  Double_t delta = 0.1 ;
  Int_t num = (chisq_max-chisq_min)/delta ;
  TGraph *g[13] ;
  Int_t NDF[13]={ 1, 2, 3, 4, 6, 8, 10, 15, 20, 25, 30, 40, 50} ;

  EColor color = 0 ;
  for( Int_t i=0; i<13; i++){

    Double_t *chisq, *pValue ;
    chisq = new Double_t [num] ;
    pValue = new Double_t [num] ;
    for( Int_t j=0; j<num; j++){
      chisq[j] = chisq_min + delta*j ;
      pValue[j] = TMath::Prob( chisq[j], NDF[i]) ;
    }
    g[i] = new TGraph( num, chisq, pValue) ;
    delete chisq; delete pValue ;

    g[i]->SetLineColor(1+color%9) ;
    g[i]->SetLineStyle(1+color/9) ;
    color++ ;

    g[i]->SetMaximum(1.01) ;
    g[i]->SetMinimum(0.001) ;
    g[i]->GetXaxis()->SetRangeUser( chisq_min, chisq_max) ;

    if( i==0 ){
      g[i]->SetTitle("p-value vs. #chi^{2}") ;
      g[i]->GetXaxis()->CenterTitle() ;
      g[i]->GetYaxis()->CenterTitle() ;
      g[i]->GetXaxis()->SetTitle("          #chi^{2}") ;
      g[i]->GetYaxis()->SetTitle("p-value for test #alpha for confidence intervals") ;

      gPad->SetGridx() ;
      gPad->SetGridy() ;
      gPad->SetTicks(1,1) ;
      gPad->SetLogx() ;
      gPad->SetLogy() ;

      g[i]->Draw("AL") ;
    }
    else
      g[i]->Draw("same L") ;
  }


  char buf[256] ;
  TLegend *legend = new TLegend( 0.1, 0.1, 0.25, 0.65) ;
  for( Int_t i=0; i<13; i++){
    sprintf( buf, "  ndf=%2d", NDF[i]) ;
    legend->AddEntry( g[i], buf, "l") ;
  }
  legend->Draw() ;
}


void plotReducedChisqVSDegreesOfFreedom(void)
{
  Int_t ndf_min = 1 ;
  Int_t ndf_max = 50 ;
  Int_t ndf = ndf_max-ndf_min+1 ;
  TH1D *h[9] ;
  Double_t p[9] = { 0.01, 0.05, 0.10, 0.32, 0.50, 0.68, 0.90, 0.95, 0.99} ;

  char buf[256] ;

  EColor color = 1 ;
  for( Int_t j=0; j<9; j++){
    if( j==0 )
      sprintf( buf, "#chi^{2}/n vs. Degrees of freedom n" ) ;
    else
      sprintf( buf, "Hist%d", j) ;

    h[j] = new TH1D( buf, buf, ndf, ndf_min, ndf_max) ;
    for( Int_t i=ndf_min; i<=ndf_max; i++){
      h[j]->SetBinContent( i,
			   TMath::ChisquareQuantile( p[j], i)/i ) ;
    }

    h[j]->SetLineColor(color++) ;

    h[j]->SetMaximum(2.5) ;
    h[j]->SetMinimum(0.0) ;

    if( j==0 ){
      h[j]->GetXaxis()->CenterTitle() ;
      h[j]->GetYaxis()->CenterTitle() ;
      h[j]->GetXaxis()->SetTitle("Degrees of freedom n") ;
      h[j]->GetYaxis()->SetTitle("#chi^{2}/n") ;
      h[j]->Draw("HISTC") ;
    }
    else
      h[j]->Draw("same HISTC") ;

  }

  gPad->SetGridx() ;
  gPad->SetGridy() ;
  gPad->SetTicks(1,1) ;


  TLegend *legend = new TLegend( 0.77, 0.60, 0.97, 0.9) ;
  for( Int_t i=0; i<9; i++){
    sprintf( buf, "  p-value=%2.0lf%%", (1.0-p[i])*100.0) ;
    legend->AddEntry( h[i], buf, "l") ;
  }
  legend->Draw() ;

}

添付ファイル: filehist_error_bars.png 468件 [詳細] filedivide_4_2.png 705件 [詳細] filedivide_2_4.png 771件 [詳細] filerow_column.png 348件 [詳細] filehist_error.jpg 479件 [詳細] file2d_alphanumeric.png 748件 [詳細] filehist_location_display.png 573件 [詳細] fileSeach_Peak.png 736件 [詳細] filebefore.png 585件 [詳細] fileafter.png 757件 [詳細] fileNot_set_limits.png 605件 [詳細] fileExpand.png 605件 [詳細] fileClip.png 515件 [詳細] filehist.png 569件 [詳細] filealign.png 619件 [詳細] filedatime_empty.png 490件 [詳細] filedatime_utc.png 510件 [詳細] filedatime_jst-9.png 539件 [詳細] filedatime_jst.png 441件 [詳細] filedatime_nor.png 483件 [詳細] filedatime_nor_utc.png 478件 [詳細] filedatime_nor_jst.png 517件 [詳細] filedatime_nor_jst-9.png 489件 [詳細] filedatime_nor_empty.png 484件 [詳細] filect.png 523件 [詳細] filedatetime_ex.gif 511件 [詳細] filetick.png 585件 [詳細] fileroot_font_ex.png 411件 [詳細] fileroot_font.png 583件 [詳細] fileaxis_grid.png 581件 [詳細] filechisquared_pdf.png 737件 [詳細] fileline.png 627件 [詳細] fileMakefile.arch 563件 [詳細] filewheel.png 991件 [詳細] fileSetEndErrorSize10.png 727件 [詳細] fileSetEndErrorSize0.png 735件 [詳細] fileSetEndErrorSize.png 727件 [詳細] filelogGood.png 759件 [詳細] filelogBad.png 804件 [詳細] filepValue.png 833件 [詳細] fileecolor.png 761件 [詳細] fileLine.png 385件 [詳細] fileemarkers.gif 792件 [詳細] fileecolors.gif 839件 [詳細] fileMarkerStyle2030.png 954件 [詳細] fileMarkerStyle0011.png 879件 [詳細] fileMarkerStyle.png 451件 [詳細] filekColors.png 893件 [詳細]