ROOT:便利なコマンド表と使い方の例

2024.3.30 by Taka Kondo (KEK)


link to: http://root.cern.ch | ROOT user's guide | ROOT入門jlc | AJ-ROOTトレーニングコース KamonoWiki |
Taka Kondoの私的備忘用メモです。:   Linux   ROOT   C++   html   Perl   Python   TeX   TWiki   SVN   shell   vi   emacs | CMake | git |
HistGraph | 入出力 | Tree/TFile | | 演算・複素数 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 年月日時間 | 乱数発生
ROOTmasterpageIndex
ROOTマニュアルROOT Manual - Basics:First steps with ROOT, ROOT architecture and components, ROOT macros and shared libraries ROOT files, Creating a user application with ROOT ,Integrating ROOT into CMake projects, ROOT collections, Object ownership, Multi-threading
ROOT Manual - Functional parts Histograms,Graphs,Graphics,Fitting,Data frames,Trees,RooFit,TMVA,Python interface: PyROOT,Mathematical libraries,Physics vectors,Geometry,ROOT I/O,Signal/Slot communication,JSROOT,How to embed ROOT in a GUI, Further information,Tutorials,Primer,All Reference Guides, Topical Manuals, Forum & HelpHow-tos,Cling
ROOTプログラム例集ls $ROOTSYS/tutorials/; graphics集graph集を参考にする。
ROOTの起動・終了・実行root -l(logoなし),root -b(displayなしbatch modeで走る), root -b -q myMacro.C > myMacro.log(script走らせて出力をだし-qなので終わる)。終了は.q(.qqqのほうが強力で、.qqqqqのほうがさらに強力)。ROOTのセットアップ法(2016.2現在)。マクロファイルxxx.Cを直ちに実行するにはroot -b xxx.Cで。終了後自動的にROOTから抜けるにはroot -b -q xxx.C(とすればshell scriptから起動して終われる)。
ATLAS Root stylehome pageでcp dot.rootrc .rootrc based on README。 see Setup_ROOT6.pdf(as of 2016.2), アトラススタイルガイドの最後の「ROOT Style for official ATLAS plots 」にセットアップ法がある。atlasstyle-00-03-05.tar.gz: ATLAS ROOT Style (stable).を解凍して$HOME/RootUtils/に置く(dot.roorcはdotを外して$HOME/におく)と自動的にATLAS Styleがroot起動時にセットされる。ただしROOT 6などではエラーが出るのでrootlogon.Cをこのように修正する(2016.1現在)。「gROOT->LoadMacro("AtlasStyle.C"); SetAtlasStyle();」をATLASの指定を変更したいときはgROOT->LoadMacro("AtlasUtils.C");ATLAS->SetPadTickX(1);ATLAS->SetPadTickY(0);ATLAS->SetPadRightMargin(0.12);とする。ATLAS Style in short(古い)
ROOTのversion指定現在のものはroot -b -qで見る。色々なROOT versionをリストするには > lsetup root -hとすればいい。他のversionに移るには > lsetup "root 6.08.06-x86_64-slc6-gcc62-opt"とする。root -bで確認する。
マクロマクロファイルの実行.x Nmuo.C。例 randGaus.C結果, マクロで使う変数には Int_t, Long64_t, Double_t などの処理系非依存型を使うようにする(理由)。
シェルスクリプトから引数渡しroot -b -q -l plot.C とすれば終了したらシェルスクリプトに戻る。ROOTプログラムplot.Cに引数を渡したいときは 'plot.C(132.5)' (ここで '    ' とプライムで囲むことが必要)とし受ける側にvoid plot(double x){............}などとする。root -b -l -q 'arguments.C('$integ','$double',"'$line'") 'のように数字引数と文字引数でプライム(')、Wプライム(")での挟み方が違うようだ。シェル変数を渡したいときはこの例で試してみる。rootからシェルには値を渡せないなあ。。。
異なる引数関数の同居共存できる。two_functions.sh
ファイルのコンパイルCINTがc++の文法に厳格ではないので、ファイルをコンパイルしてから実行する方がよい。.L file.cxx+でコンパイルしてから.x file.cxx+とする。ROOT 6ではコンパイラーがClingに言語が変わりより文法に厳格になり実行スピードも速くなった。
C++でROOTを使うネイティブC++プログラムとして開発する方法; 手動でコンパイル: g++ `root-config --cflags --libs` sample_gaus.cxx -o sample_gaus alias r++='g++ `root-config --cflags --lib`'とセットしておけば r++ sample.cc class.cc -o sampleでいい。
method探索法コマンド=method(= member function)は図を描いて対象の場所を右クリックすればリストが表示されるのでmethod探しに便利。例(pdf
.ls or f->ls() or f.ls();中身リスト。rootの中でのdirectoryをリスト。
TBrowser tw; twなどの名前はなんでもいい。
f->cd ("AAA")change directry
TH1F,TH2F,TGraph :HistGraph | 入出力 | Tree/TFile | | 演算 | |Marker | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生: →topへ
1次元ヒストグラムTH1F *h1 = new TH1F("name","title;AAAAA;YYYYY",100,-25.,25.); "AAAAA"はx軸title, "YYYYY"はy軸titleになるようだ。同じnameの別のヒストグラムを新たにnewで作ると”Warning in : Replacing existing TH1: 3 (Potential memory leak).”が出てしまう。loop内ではnameをhprof[j] = new TH1F(Form("h%d",j),"",Bins[j],Xmin[j],Xmax[j]);などで変えると便利。
TH1F DrawDraw(); Draw("HIST"); Draw("HIST E");Draw("HIST L"); Draw("HIST C"); TH1F.C->
autoauto h1= new TH1F("name","title;AAAAA;YYYYY",100,-25.,25.)。C++11 から変数宣言時に具体的な型名のかわりに autoキーワードを指定する事によって、変数の型を初期化できるようになった。 例:hist_auto.C
delete h1"name"が同じだと警報が出る。delete h1で消去すればいい。etName, SetTitle, SetNameTitle, GetName,GetTitle
TProfile(p.42), 各XビンのYの平均とその誤差(またはRMS:option "s"を最後に着けた場合, p.43参照)を表示する。hp = new TProfile("hp","Profile", 50,-4,4,ymin,ymax);ここでyはymin-ymaxの間のみfillされる。hp->Fill(px,pz,1);TProfile.C->出力例, ビン内容はGetBinEntries(i),GetBinContent(i),GetBinError(i),hi->GetXaxis()->GetBinCenter(i), iは1から。Draw("HIST")でhistogram的にできるProfile.C->出力例
TProfile2DEntry数はint bin=h3->GetBin(ix,iy);h1->GetBinEntries(bin)でとれる。和はh3->Add(h1,h2); See Profile2D.txt
2次元プロットh = new TH2F("h","2D",34,0.,80.,57,0.,285.);->結果図 ...,h2->Draw("COLZ");COL:はセルの内容を色表示する。COLZはカラーパレットを右につける。例:plot_2D.Cその図。Palette項参照。具体例:plot_2D_B3.Cその図。カラーパレットの範囲指定は hEx2->GetZaxis()->SetRangeUser(-20.,20.)でできる(->)Draw("text")で数字表示図がでる。 h1->GetZaxis()->SetLabelSize(TextSize);h1->GetZaxis()->SetLabelFont(TextFont);makeSCurve_2D.C2D.png, 内容アクセスは h1->GetXaxis()->GetBinCenter(ix); h1->GetYaxis()->GetBinCenter(iy);h1->GetBinContent(ix,iy)
3次元プロット例:plot_3D.C結果図
それのコピーTH1F *hnew = (TH1F*)h->Clone(); hnew->SetName("hnew"); // 新しいnameを付けないと同じ名のヒストグラムが2つ出来てしまう。SetName,SetTitle,SetNameTitle,GetName,GetTitleなどがある。
多くのhistTH1F *h1[6] "name"を変えること。-->plot_manyHist.C出力例
X,Y軸共通のN個のプロット plot_NY.C,,, およびplot_NX.C 、xgapを変えたい時はplot_NXalpha.C->、 ,plot_NXNY.C(左右非対称はplot_NXNY_left_right.C): (ここでx,y軸の最小値や最大値表示が削られないためにはSetFillColorAlphaを使っている)。Legendを使うときは絶対座標入力なので例にあるGetNDCX(x)などが必要となる(marginがそれぞれ違うので、ただしGetNDCXなどはh->Draw(ALP)したあとに使うのが間違いない)。最新例その図。(2018.10.16)plot/graphの内側全体が真っ白でなくほんの少しだけ灰色ぽくなる()ので、Draw()の直後にTBox,Draw("SAME"),gPad->RedrawAxis(), (text例)を追加して真っ白(出力例)にした。pad[0]->cd()で全体シートに書いたときはc1->Print()の直後にpad[0]->Clear();と消さないと次に重複してしまう(2018.11.15)。
{{{---以下は過去のもの{ sample_setupCanvas.C説明と結果図(1X2, 2X23X4)。しかしこの方法ではpngは書けるけどpdfはダメのよう(理由不明)。ROOT.6.10以後はsample_setupCanvas.Cが使えなくなった。TPadでpad2->SetFillColorAlpha(10,0.0);で台紙を透明化してY軸の最小値が隠れないようにしたー>ratioPlot.Cにより結果(gapなし)結果(gapあり)が出来る。等しい高さのNY個の時はplot_NY_old.C結果図。}}}}
連結したグラフequal_12plots.C結果図
グラフの作成z.C(auto,vectorを使う)->z.png, plot_simple.C(auto,vectorを使う), graph.C結果図、Int_t n = 409; Double_t x[n]; b[n]; h1 = new TGraph(n,x,b); g1->Draw("ALP")(ここでAはXY軸を描く指定。但し重ねるときは次からDraw("SAME LP")とAを落とす。Pはmarker。Lはsimple poly-lineを書く。例:graph_Xlog.C。gr = new TGraphErrors(n,x,y,ex,ey)(例gerrors.C): 非対称エラー gr = new TGraphAsymmErrors(n,x,y,exl,exh,eyl,eyh); エラーバーのendをなくしたい場合はDraw("APZ")などZを加える。
vector->グラフstd::vector<double> HV, Eff; HV.push_back(VB); auto h = new TGraph(HV.size(),HV.data(),Eff[i].data()); TGraph_vector.C, vector_errorArea.C
グラフの内容TGraph gの内容を得たいときは g->GetPointX(i),g->GetPointY(i),g->GetErrorY(i) i=0から始まる。
1σエラー領域の色表示例:error_band.C(2012.3.8にわかった!)軸目盛が隠されたら「軸の追加書き込み」の項目参照。band部分を関数にするとerror_band_func.C, vector_errorArea.C
加算・割算・乗算h1.Scale(8.0)で8.0倍(h1->Scale(8.0);、TH1F h3=8*h1;(or TH1F h3=8*(*h1);), TH1F h3=h1*h2;(TH1F h3=(*h1)*(*h2);)
h->Draw(); Histogram"h"をDrawする。("SAME")重ねる("E")エラーバー("L")折れ線("P")マーカー("SAME P")で複数指定。2次元Drawでカラー描画はDraw("COLZ")Zはcolor palettを脇につくる。(p.134) pretty color(青ー>赤)はgStyle->SetPalette(1);とする。例plot_2D.C, Lego plot例:plot_2D_lego.Clego,lego1,lego2 : Surf plot例:plot_2D_surf.Csurf,surf1,surf2,,surf3,surf4,surf5 :
内容消去h1->Reset();
bin内容アクセスyyy=h1->GetBinContent(i),h1->GetBinError(i),h1->GetBinEntries(i)(TProfileには効く),h1->GetBinCenter(i),h1->GetBinLowEdge(i),h1->GetBinWidth(i);h1->GetMaximum()*1.1を使えばoverflowを防げる; GetEntries()で総数が得られる。注意:ビンは1から始まる。例:getBinInformation.Cー>出力。TGraphの内容は g->GetPointX(ieta),g->GetPointY(ieta),g->GetErrorY(ieta) i=0から始まる。
bin内容を入れるhisto->SetBinContent(i+1,data[i]);histo->SetBinError(i+1,TMath::Sqrt(data[i])); bin番号は1から始まる。
binのx軸センター値Double_t xcenter=h1->GetXaxis()->GetBinCenter(i);
y軸最高値を得るgPad->GetUymax() その直前にc1->Update()が必要だ;
入出力 :HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
txtデータの入出力
ios::app
fin.fail()
ifstream fin("1hist.dat") (またはifstream fin[5];fin[2].open("vv.txt"); ) while (fin >>X>>N>>)このとき12-5とspaceなくても分けてくれる。; fin.close();ーー> ifstream_ofstream.C 出力はofstreamで対応するファイルがなければ新しく作ってくれる。最初の行をスキップするときは char line[255]; fin.getline(line,sizeof(line)); で。出力:fout<<a<<" "<<b<<endl;が必要。appendするときは ofstream fapp("out.dat", std::ios::app);とおく。ファイルが存在するかはif(findmean.fail()) で判断し存在しなければ最初の行にtop lineを書き、それ以外の場合はappendするのみの場合はー>check_file.C参照。\n for CRLF. 参照
getlinestring line;ifstream ifs("XXX")とgetline(ifs, line); while (getline(ifs, line)) { }で1行ずつlineに読み込む。read_csv.C
stringで読み込むifstream_string.C, read_using_vectorString.C
csv(,切れ)読みread_csv.C,
Tree :HistGraph | 入出力 | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
TTree編日本語解説編, 日本語解説編Kamono
Text<->TTreeText_to_TTree and TTree_to_Text
ReadTreeReadTree.C(vectorも読める)
TTree samplesgroup__tutorial__tree.html
TTree->メンバー関数tree->Show(表示したいEntry);, tree->GetEntries() , tree->GetEntries("jet_pt > 50*1000") (Long64_t)8931 , tree->Scan("el_n:el_pt:el_eta:el_phi"); tree->SetScanField(30); //一度に表示する数。0にすると一度に全て表示する tree->Scan("var1:var2","(条件式)","(オプション)",表示する最後のEntry,表示する最初のEntry); tree->Scan("var1","var2>var3"); //var2>var3が満たされているrowのみ表示 tree->Scan("var1*var2"); //変数の演算も可能 tree->Scan("var1:var2","","lenmax=5 colsize=10",6,2); //lenmaxは表示する最大のinstanceの数、colsizeはcolumnの文字数。デフォは9 オプションについてはよくわからないので、詳しくは下を参照。 http://root.cern.ch/root/html/TTreePlayer.html#TTreePlayer:Scan
TFile
directory構造
ファイルの読み込みを行う。TFile *f = new TFile("demo.root")(or . root demo.root)とするとcurrent directoryがdemo.rootになる(.pwdか gDirectory->pwd()でチェックする )。.ls(gDirectory->ls())で現directoryの内容をリストする。KEY: TDirectoryFile sub;1と出て下部構造があるならばgDirectory->cd("sub");でsubdirectoryに入れる。gDirectory->cd("..");で一つ上にgDirectory->cd("../sub1");で隣のsub1に、f->cd()でtop directoryに戻れる。KEYはまだdisk上にあるのでf->Get("HIST名"); memory上に持ってくる、OBJ:が見える実例:RootFile.txt。HIST名->Draw()でもdisk上からOBJに持ってこれる。c1->Print("x.png");で描ける。cout<GetBinEntries(16)<GetBinContent(1,1)<Get("h0");が要る)。TFile数は1000くらいが限度なので使い終わったらdelete fで消すこと。
.rootファイル
TFile
TTree
TTreeは変数データやオブジェクトをひとまとめにして管理するクラスで何らかの物理データをROOTで使いやすい形に保存しておくために使う。ROOTではデータや解析結果をまとめて.rootファイル形式で保存する。。root -b histos.rootで開ける。 TFile *f=new TFile("NOChipData_now.root"); .dir *.root; で取りいれたことを確認。f->ls();でobjにTTreeがあることがわかる。 TTreeViewer v("FullTree"); TTree * t=f.Get("FullTree;1"); t->Show(0), t->Show(1).....で内容が出る。t.Draw("NOChip12>>h12");でhistogram h12に内容が移される。後は普通のhistogram。イベントを扱った場合tree->Scan()で最初の25 eventsの内容が表示される:interactiveに見る方法programから見る方法がある。TH1F *h0 = (TH1F*)f->Get("h0")が要る; vectorを含むときの扱いは hvector.Cの例を参考にする。
vectorのTTreehvector.Cを使った例(Tree作成-->hvector.root-->Tree read)TTree_vector_interactive.txt
xxx.root出力TFile f("demo.root","recreate");h->Write();f.Close();でいい 例pt_sampling.C-->save+read&plot。多くのhistogram扱うにはTObjArray Hlist(0)を定義しHlist.Add(h);と追加してからHlist->Write(); see p.159 , 例->make_root_file.C
xxx.root入力rootを読んだ例はfitExample.CのようにTFile *f = new TFile("demo5.root");auto h0 = (TH1F*)f->Get("h0");または auto h0 = static_cast(f->Get("Potential_300V));auto h = f->Get("Potential_300V")でもいい!。TCanvasもc1->Write()で書き込める(write_read.C)
root file copyTFile_copy.CでTH1F, TProfile2Dなどの完全コピーできる。TTreeはまだ。 hのclass指定しなくてもauto h = f->Get(line)でよさそう。subdirectoryも作れる。
rootの結合・合成TObjArray Hlist(0); Hlist.Add(Potential_FEM);を使う。例addRootFiles.C。Hlist.Add(Ey_FEM60_70_150);Hlist.Add(Ex_FEM60_70_150);TFile fg("test4.root","recreate"); Hlist.Write();でできた。.lsで調べる。例:combine_rootFiles_0.C,combine_rootFiles.C。subdirectoryも作れる TFile_copy.C
:HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
テンプレート法 auto htemplate = new TH2F("htemplate1",";x;y,1,xmin,xmax,1,ymin,ymax);htemplate->Draw();で軸をあらかじめ書いておき、Draw("SAME")で書き入れればいいのだった。Template.C->
余白MargingPad->SetTopMargin(0.10) Divid(2,2)などの時はc1->cd(2)の後に入れる。
X,Y軸の最少値最高値h->GetXaxix()->GetXmin();h->GetXaxis()->GetXmax();y=gPad->GetUymax(); GetUymin() scaleの違う2つのグラフ重ねるときに有効ー>右軸の追加参照
軸タイトルと軸ラベルh1->GetXaxis()->SetLabelSize(0.05),SetLabelColor(2),SetLabelOffset(0.2),SetTitleSize(0.05)など。TGraphではh->GetXaxis()->SetTitle("tt")が必要(axisのa小文字)), d->GetXaxis()->SetTitleOffset(0.8); (x軸からのオフセット調節),TH1Fなどは直接d->SetXTitle("P_{x} (GeV)")もできる。例はaxisSet.C->;({ }はLaTeX形式)、SetYTitle("Events/4 (GeV^{-1})");ギリシャ文字は#etaなど#をつける。上付き^{2},下付き_{a}など。 h->SetTitle("write graph title at the top")
縦軸調整h->SetMaximum(1.2);スケールの上限をset。下限はh->SetMinimum(0.0);
横軸の範囲調整g1->GetXaxis()->SetRangeUser(0.,12.)<-これはzoom時のみ有効みたい。TGraphで範囲決めたいときのごまかし方ー>SetRange_TGraph.C; g1->GetXaxis()->SetLimits(0.,12.)とすればTGraphでも有効だ(2011.2.7) ところがTProfile, histに使ったらplotは変わらず横軸だけスケールした(2011.4.9, ,)。
x,y軸範囲の拡大プロットしx,y軸の下限数字近くで手模様が出たら右クリックし上限まで引く。
グリッドc1(or gPad)->SetGrid(); SetGrid(0)はY軸のみ, SetGrid(1)はX,Y軸とも。pad->SetGridx()はX(垂直)Grid, pad->SetGridy()はY(水平)Grid,
年月日や時間軸(p125)(指定)h->GetXaxis()->SetTimeDisplay(1); (形式)h->GetXaxis()->SetTimeFormat("%d\/%m\/%Y");%yなら世紀なし,%H(24hour clock),%M,%S (Time Offset)TDatime da(2003,02,28,12,00,00);gStyle->SetTimeOffset(da.Convert());(合成して)h->GetXaxis()->SetTimeFormat("%d\/%m\/%y%F2000-02-28 13:00:01"); (2段で表示する) ;gr0->GetXaxis()->SetTimeFormat("#splitline{ %Y}{%b %d}");axis->SetTimeFormat("#splitline{%Y}{%d\/%m}"); #splitline{%b %d}{%H %M}");実例ー> see time_test.Cplot図。注意:gStyle->SetTimeOffset(da.Convert())でxはoffsetがかかっているから0.が左端になる。TDatime d2(2010,12,28,12,00,00);int t2=d2.Convert()で秒単位に統一した数字になる。 see time.C,24:00:00もOK(time_2.C)。 注意2:hour表示(H)がなぜか8時間ずれるtime_hour_test.C結果図。逆は逆はd1->Set(t1+30*60), d1->GetYear(),d1->GetMonth(),d1->GetDay(),d1->GetHour(),d1->GetMinute(),d1->GetSecond();, time_reverse.txtのようにd1->GetYear()など。 SetTimeDisplay(1)とするとちゃんと年月の区切りtick lineを自動的に入れてくれる。
TGaxishistogram/graphと独立に軸を描く。axis = new TGaxis(x1,y1,x2,y2,v1,v2,510,"+L");tick markに対してL=left,R=right,C=center, +,-,+-はside指定。" ","-","-R"はtick右,label左 (標準)で"+L"はtick左,label右(右辺にいい)だった。;例 axis = new TGaxis(gPad->GetUxmax(),gPad->GetUymin(),gPad->GetUxmax(),gPad->GetUymax(),0,rightmax,510,"+L");
軸の表示桁指定h1->GetYaxis()->SetDecimals(2); その例
指数はずし(p.123-124) h->GetYaxis()->SetNoExponent();。TGaxis::SetMaxDigits(6)(defaultは5)で高くできるがTGaxisにしか使えないのでXaxis=new TGaxis(0,1,100,0,0,100,0,"+L");とダミーで作っておきXaxis->SetMaxDigits(6);とやればそれ以降画面は6ケタになる。Draw()いらない。その図
軸の生成(page. 123) TGaxis(Double_t xmin,Double_t ymin,Double_t xmax,Double_t ymax,Double_t wmin, Double_t wmax,Int_t ndiv = 510,Option_t* chopt,Double_t gridlength = 0)
軸目盛の設定(p.122)gr0->GetXaxis()->SetNdivisions(505);ndiv = N1 + 100*N2 + 10000*N3, N1=最細分割数. N2=次の分割数、default=510。optimizationがある。負にするとexactに分割。目盛(tick)の長さはh->GetXaxis()->SetTickLength(0.03)など。(右のY軸を目盛らない)c1->SetTicky(0);(上のX軸を目盛らない) c1->SetTickx(0);参考図
右軸などの追加TGaxis *axis = new TGaxis(t2,ymin,t2,ymax*0.8,ymin,ymax*0.8,510,"+L"); axis->SetLabelSize(0);axis->Draw(); 例rightAxis.C,axis.Cその図, twoScales.Cその図, 目盛が重複しないためにはc1->SetTicky(0); c1->SetTickx();でいい?? ATLAS->SetPadTickY(0);ならいいが。右軸に2種類の目盛を並べた具体例ー>plot_2RightAxis_sample.C結果図
軸の追加書き込みFillなどで目盛が隠されてしまった場合に使う。TGaxis *axis = new (左Y軸)TGaxis(xmin,ymin,xmin,ymax,ymin,ymax,510,"-");(下X軸)TGaxis(xmin,ymin,xman,ymin,xmin,xmax,510,"-");"-"は目盛りの方向を示す。"+-"もいい。 axis->SetLabelSize(0);axis->Draw(); gPad->RedrawAxis()でいいかも(see p.38)
log,対数表示(p.113)gPad->SetLogy():y軸をlogにする。SetLogx()もあり。gPad->SetLogy(0);でリニアーに変更。あるいはキャンバスc1の左端あたりを右クリックするとSetLogyが出るので選ぶ。
対数目盛ヒストグラムはlinearで取る()Full(log10(x))で取るが軸は対数目盛にしたい場合はh->GetXaxis()->SetTickLength(0.0);で目盛りをなくしておいてからaxis = new TGaxis(xmin,ymin,xmax,ymin,pow(10.,xmin),pow(10.,xmax),510,"+G"); axis->Draw();で追加して書く。10**5なども表示される。fontが合わないかも?
RedrawAxis()Fillで目盛が隠されてしまった場合に使うgPad->RedrawAxis().使えなかった(2012.3.22), h1->Draw("sameaxis");もダメだった??
パレットpaletteh2->Draw("COLZ");c1.Update();pal = (TPaletteAxis*)h2->GetListOfFunctions()->FindObject("palette"); pal->GetAxis()->SetTitle("your own title"); pal->SetLabelSize(0.03); 例 plot_2D.C
画面余白調整c1 = new TCanvas("c1","A Simple Graph ",300,0,750,560); c1->SetLeftMargin(0.12);, c1->SetBottomMargin(0.10);
演算 :HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
Scale変更Float_t rightmax = 1.1*hint1->GetMaximum(); Float_t scale = gPad->GetUymax()/rightmax; hint1->Scale(scale);
正規化(1.0にする)h->DrawNormalized("",1.0);またはDouble_t scale=1./Photo_r_phi->Integral(); Photo_r_phi->Scale(scale);とする。 面積を1にしたい場合は田中純メモ
hist演算root>TH1F *d = new TH1F((*H1)/(*H2)); スケール倍はTH1F *s = new TH1F(2.5*(h)); / 田中純メモ参照
ERRORの扱いh->DrawNormalized("E")で出るが、正規化したりしてスケールずらす時は事前にbin毎にh->SetBinError(i+1,h->GetBinError(i+1));でエラーを強制的に書き込んでおくことー>
平均とrmsxbar=SUM(w*x)/SUM(w), sigma=sqrt{SUM(w*(x-xbar)**2)/SUM(w)}=SQRT{SUM(w*x*x-w*2*x*xbar+w*xbar*xbar)/(SUM(w)} = SQRT{[SUM(w*x*x)-2*SUM(w*x)*xbar+SUM(w)*xbar*xbar)]/SUM(w)} = SQRT{[SUM(w*x*x)-SUM(w)*xbar*xbar]/SUM(w)}=SQRT{(SUMw2-SUMw0*xbar*xbar)/SUMw0}
複素数Complex.C
文字 :HistGraph | 入出力 | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
stringstring becname[3] = {"EndcapC","Barrel","EndcapA"};などと出来る。文字列への変換はaa.c_str()。文字列からの変換はs=Form("%s",line)。特定文字の消去はstring_erase.C。特定文字列の置換はstring_replace.C。入力はifstream_string.C
Text attributesクラスTAttText Class Referenceが文字(text)関係のクラスである。Alignment, Angle, Color, Size, Font and Precisionが載っている。
FontText font code = 10*fontnumber(1から15まで) + precision(0,1,2,3=pixels) 例はFontLooksにある。Pixel指定すると2つの異なる大きさのグラフの文字の大きさを同じにできるので便利だ(TextFont=43 and 63 (bold))。
フォント指定(p.131)Fontリスト, t->SetTextFont(font); font = 10 * fontID(1-14) + precision,( 0,1,2), ->font.C, defaultは62, 132がTimesNew Roman --> see SetTextFont.txt結果図
ギリシャ・数文字・特殊記号TLatex *t=new TLatex(x,y,"#alpha #eta");-->page 118にリストあり。 Greek, Symbol, Accent, SQRTは#sqrt{x+1}。%は%%としないと出ないみたい。ℓは\ellか。
Delimitersと[#circC]は変なspaceが入ってしまう。p.117にあるように#[]{#circC},#left[....#right]とする。big square bracketsになってしまうが。
文字記入TText *t=new TText(x,y,"MC event"); t->SetTextSize(0.04); t->SetTextColor(2); t->Draw(); 前のものは消してくれる。角度変更t->SetTextAngle(45);絶対座標系(NDC)を使うときはt->SetNDC()とする。
ATLAS LabelATLAS SCT Preliminary, ATLASLabel(0.65,0.93,"SCT Preliminary"); gaus_ATLASLabel.C->
数字(文字)を文字列に
sprint()
Form()
cid = new char[9];とはじめのあたりに宣言しておくと便利。何回も使える。sprintf(cid,"V%d.txt",HV);\0はNULL文字(文字列の終端を示す)でcid[8]=0でもいいが\0を最後につけておくのが簡単。sprintfは自動的に付けるようだし、間違いと宣言される。int HV=150ならV150.txtとなる。(int)x でfloat->intの変換ができる。\nは改行;leg->AddEntry(h3[i],cid,"l"); ->sprintfの例, 小数点の桁指定は%6.2fとする(例:sprintf.C->)。%3dは3文字幅を指定。%02dで08などと頭にゼロをつけてくれる(時刻用)。文字は%sで受けlongは%ldで。例:sprintf.cxx。cid介さずに直接 Form("Barrel=%d",Layer) を文字代わりに入れてもいい!
文字列の分解strtok()を使う。strtok(), sscanf()の方が簡単かな。%f(float) %lf(double) %ld(long) %d(int)
文字列を数値に変換atoi、atof, stod, atoi64、atol を使う。double d=stod(string), atoi(),sscanf()の方が簡単かな。%f(float) %lf(double) %ld(long) %d(int)
凡例Legend(p.137) leg = new TLegend(x1 ,y1 ,x2, y2);絶対座標系(Normalized Coordinate System (NDC))を使っていることに注意。leg->AddEntry(h1,"One Theory","l");leg->AddEntry(h2,"Another Theory","f"); SetFillColor(kWhite);leg->SetFillColor(10)(背景色=白), leg->SetBorderSize(0)(0=枠なし、1=枠あり、2=枠とその影), leg->SetTextSize(0.03);leg->Draw(); ->SetBorderSize(2);leg->SetTextFont(132);"f"=box, "l"="L"=line, "p"=markerを表す。 Legendとは伝説・凡例・説明文のこと->Legend.txt、SetTextSize(0.04)を使うと枠から飛び出ても文字を書いてくれて自動調節がなくなるからいい(がマーカーが中心に来なくなる)。また同時にy1=y2とすればLegend領域の色が示されないので背景の色などが消されないー>。X軸共通の複数プロットを1ページに描くと上中下でPadの大きさが異なる場合がある。NDC座標を使うTLegendの位置が同じくならない。その時は関数GetNDCY(y)を作ってuser座標yからNDCを計算すればいい。軸がlog scaleなら lymax=log10(ymax); lymin=log10(ymin); yleg1 = GetNDCY( (lymax-lymin)*0.78 + lymin) ;とする。
マーカーd->SetMarkerStyle(n) (n=1)dot(2)+(3)*(4)○(5)×(6)+(7)■(8)●(9)dot(20)---(30)はROOT_markerを見よ。 h->Draw(P);で描く。カラー指定:d->SetMarkerColor(n), サイズ設定:d->SetMarkerSize(3)(これはダメみたい->マーカー; gr3->SetMarkerStyle(21); TMarker *m=new TMarker(x,y,4); m->Draw(); 例はMarker.C, ROOT_markerを見よ。h1->SetMarkerStyle(kFullCircle)(kFullSquare)(kFullTriangleUp);(kFullTriangleDown);(kOpenCircle);
直線を描くz1=new TLine(30000,0, 30000,0.16); z1->SetLineColor(n); z1->Draw();同じものは上書きになる。newを付ければ同じz1を使える。
線の幅・styled->SetLineWidth(5);線スタイル:d->SetLineStyle(2)[1=line,2=broken,3=dotted,4=broken-dot,5=long-broken-dot]
矢印TArrow *ar = new TArrow(4,0.2,4,4.5,0.02,"|>");ar->SetLineWidth(3); ar->SetArrowSize(0.02);ar->Draw(); arrow.C->
長方形を描くb = new TBox(0.2,0.2,0.8,0.3); b->SetFillColor(5); b->SetFillStyle(3001); b->Draw();
長方形TPavep = new TPave(0.2,225,7.2,345); これはTLegendと違ってuser座標のようだ。p->SetFillColor(10); p->SetBorderSize(2);2以上だと影が出来る、p->SetLineColor(1);p->Draw();
:HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
色・模様をFILLする(p.133) h->SetFillColor(2),h->SetFillStyle(3002);例:TBox.C ==>FillStyles。SetFillStyle(3002)などを使うと後ろの座標目盛が隠れない→。誤差Fillが重なるときは3004と3005を使えば両方見える。カラー指定:d->SetMarkerColor(n)(n=0と10は透明のようだ。kWhiteを使えば白を指定できる。)
(p.134)色RootColorIndexを参照。(n=1)黒(2)赤 (3)bright緑(4)bright青(5)黄 (6)桃色(7)空色 (8)黄緑(9)青(10)白(透明?)。color index+100で暗く、+150で明るくできる。
背景を透明にするphotoshop elementで(1)選択する色を(スポイトでなく)領域(点線□)でえらぶ。shiftキーで複数色を選べるー>(2)付近の色で選択する。(3)新しいキャンパス(透明)にコピーし(4)pngでsaveすればよい。jpegでは背景が白くなる。
多彩な色表現色番号の代わりにSetFillColor(kRed)のようにkBlack,kGray,kWhite,kRed,kOrange,kYellow,kSpring,kGreen,kTeal,KCyan,lAzure,kBlue,kViolet,kMagentaがある。kRed+9-10まである。kRed-4だとか。Root Color Wheel参照。詳しい説明はここにある。ROOT TColorクラスの説明参照。
Color PaletteROOTを使う。Draw("PLC PMC")とするとカラーパレットの中から自動的に色を順に選んでくれるようだ。ColorPalette.C結果図, plot_HVcurrent.C結果図, ここにgStyle->SetPalette(1);gStyle->SetPalette(kCherry),kCMYKgStyle->SetPalette(kSunset);TColor::InvertPalette();など(makeSCurve_2D.C2D.png
色でFILLするg->SetFillColor(45); Draw(ALF)のFが必要。例1図1,例2図2。Fillした濃すぎるば場合は透明化をg->SetFillColorAlpha(45,0.50)と調節できる。
位置指定グラフのx,y座標を基準にする。m->SetX(0.3);m->SetY(0.8)など
左上タイトルd80->SetTitle("New Title"); d80->SetTitle();なら表示しない。
右上タイトルd80->SetName("New Name") 消すにはgStyle->SetOptStat(0);
統計表示defaultはgStyle->SetOptStat()(全情報)gStyle->SetOptStat(1111111);(非表示)gStyle->SetOptStat(0);かgStyle->SetOptStat(0001111); fit(1111)の例
TCanvasc1 = new TCanvas("c1","A Simple Graph",0,0,700,500);0,0,750,500はスクリーの位置のよう。c1->SetFillStyle(4100); TCanvas *c1 = new TCanvas("sakamoto","c1 title");sakamotoはリソース名、c1はプログラム上の変数名、c1 titlはタイトル。Draw()でやるとc1がdefaultで出来るらしい。
画面分割c1->Divide(2,2);c1->cd(1);h->Draw();から始まる。c1->cd(0)でDivie(1,1)に戻る(->結果図)。c1->Divide(1,2,0,0)で2つのグラフをつなげられそう( plot_2G.CtwoGraph.gifgif,pngでは右端おかしいがepsならいい。参照
画面分割NX*NY画面:plot_NXNY.C
c1->Clear(); 画面クリアーする。Divie(1,1)に戻るようだ。
c1.Print("file.ps")ROOTのc1画面を出力する。file.eps,file.gifも可能。()ならc1.ps。
乱数発生 :HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
乱数発生:gRandomgRandom->Rndm() or Uniform(min,max), Gaus(mean,sigma), Exp(tau), BreitWigner(mean,sigma), Landau(mean,sigma), Poisson(mean), Binomial(ntot,prob) 例;randGauss.C->結果, Seedのランダム発生はgRandom->SetSeed();   pt_sampling.C結果, random.cxx
GetRandomh1->GetRandom()でh1のhistgramの分布に従って乱数を発生する。例getRandom.C結果.png,getRandomPt.C結果.png, ,getRandomDedx.C(dedx_clone経由)と結果.png,
GetRandom2h2D->GetRandom2(x,y)でh2Dのhistgramの分布に従って乱数を発生する。例dedx.Cでroot fileを作成しておいてからgetRandom2D.C-->結果.png
Landau分布gRandom->Landau(mpv, sigma) -> 例Landau.Cその結果11.4.9. ランダウ分布を生成する "参照
GUI利用c1画面のメニューにSavea s canvas.psでc1.psができる。
h2root zz.ntup zz.root root-fileに変換する。いろいろ出てくる。
. ! はshellに戻る。.!ls, .!vi XX
関数とfit :HistGraph | 入出力 | Tree/TFile | | 演算 | | 文字 | 関数とfit | 凡例(Legend) | 引数 | 日時 | 乱数発生:→topへ
.L test.cxxsub-program text.cxxをあらかじめコンパイルロードしておく。userが作る関数にいい。同じdirectoryか/root/macrosにおくと良いようだ。例:f2.cxx, induced.cxx,
外付け関数サブ関数はmainの前でも後ろでもよかった!(2015.9.22) 例:f3.Cと例:f3_reverse.C
関数を描くTF1 f1("func1","sin(x)/x",0,10); f1.Draw();
ROOTにある関数namespace TMath表に存在する関数のリストが載っている。Erfc(x) は complementary error function erfc(x) = (2/sqrt(pi)) Integral(exp(-t^2))dt between x and infinityがあるし逆関数のErfcInverse(x)もある。ただしガウス分布に使う時はprobability(>x)=0.5*erfc(x/sqrt(2))とすること。
組込み関数フィット(p.65) gaus、expo、polN (N>0)、landauがある。例:fit_gaus.C結果結果txt出力。h->Fit("expo");領域限定はh->Fit("gaus","","",-80.,80.)フィット結果を図に重ねて書かないときはh->Fit("gaus","0","",-80.,80.);-->;ここで第2引数はL (Likelihood method、デフォルトは chisq-method)、 E (Better errors estimation by MINOS)等があります。第3引数はDrawオプションでE (エラーバー付き) 。 TF1 *gaus = h->GetFunction("gaus")で付随する関数をとって gaus->SetLineColor(4); gaus->SetLineWidth(2);などが出来る。
フィット結果表示TF1 *fit = h->GetFunction("func");で定義してから chi2 = fit->GetChisquare(); p1 = fit->GetParameter(0); e1 = fit->GetParError(0);h->Fit("expo","Q")でFit出力を隠す。例:fit_gaus.Cその結果図。[1]の初期値は f->SetParameter(1,1.21)とおく;
SetNpxTF1 *fit = g->GetFunction("f"); fit->SetNpx(10000);でfit曲線表示がスムーズになる。without_SetNpx.jpg->with_SetNpx.jpg
簡単な関数でフィットTF1 *f = new TF1("f", "[2]*x*x + [1]*x + [0]");TF1 *f= new TF1("f", "[0]*exp([1]*x*x)+[2]")など ;
初期値設定f->SetParameters(2.,0.,9.) (<---[0],[1],[2]の初期値設定)、f->SetParameter(0,100.);は[0]の初期値を100に設定。
fit optionvoid Fit("gaus", "QO","LP", xxmin, xxmax); 第2引数は"Q" Quiet mode (minimum printing), "0" Do not plot the result of the fit."R" Use the range specified in the function range "N" Do not store the graphics function, do not draw, 第3引数はDrawOption
自分の関数でフィット例:fit_test.C . Fit使えるのはTH1,TH1Fだけかな?No, TGraphErrorsに外部関数でfit.Cした
Minuitを使ったfitIfit_xyonly.C結果
fit表示gStyle->SetOptFit();(非表示)gStyle->SetOptFit(0);(全情報)gStyle->SetOptFit(1111);fit(1111)の例
DateTimetm構造体?まだよく理解できず。datetime.C++.tx, sscanf()を使う %f(float) %lf(double) %ld(long) %d(int)

Send your comments/questions on this page to T. Kondo