saveで保存したrootファイルからヒストグラムのオブジェクトを取得する
artemisにてsave
コマンドを実行すると"unixtime".png、“unixtime”.pdf、“unixtime”.rootファイルが保存されます。
学会発表などで、数年前にsave
した図を使いたいが、判例や罫線が邪魔、ラベルなどの名前を変えたいということがあると思います。
どのrootファイルから作成したのかわかっていればDrawしなおせば済むのですが、探すのが面倒だったり、覚えていないなどということがよくあります。
そこでこの記事ではsaveで保存したrootファイルからヒストグラムのオブジェクトを抜き出す方法を書いておきます。
とはいえ、TCanvasをrootファイルで保存しているだけなので結構簡単です。
まずがrootファイルを開きます。
→ a figs/"date"/"unixtime".root
Attaching file figs/"date"/"unixtime".root as _file0...
(TFile *) 0x5bb5ea0
artemis [1] .ls
TFile** figs/"date"/"unixtime".root
TFile* figs/"date"/"unixtime".root
KEY: TCanvas artcanvas;1 canvas
次にTSeqCollection
からTFile
のリスト、TFile、
TCanvas`を順に取得します。
TSeqCollection* filelist = gROOT->GetListOfFiles();
TFile* tfi = (TFile*)filelist->At(0);
TCanvas* acan = (TCanvas *) tfi->Get("artcanvas;1");
このようにして取得したTCanvasの中身は以下の通りです。
artemis [5] acan->ls()
Canvas Name=artcanvas Title=canvas Option=
TCanvas fXlowNDC=0 fYlowNDC=0 fWNDC=1 fHNDC=1 Name= artcanvas Title= canvas Option=
OBJ: TList TList Doubly linked list : 0
OBJ: TPaveLabel TPave X1= 0.500000 Y1=0.920000 X2=0.950000 Y2=0.950000
OBJ: TPaveLabel TPave X1= 0.050000 Y1=0.960000 X2=0.950000 Y2=0.990000
OBJ: TPaveLabel TPave X1= 0.080000 Y1=0.920000 X2=0.500000 Y2=0.950000
TPad fXlowNDC=0.05 fYlowNDC=0.01 fWNDC=0.9 fHNDC=0.9 Name= graphs Title= graphs Option=
OBJ: TList TList Doubly linked list : 0
TFrame X1= 0.000000 Y1=-250000.000000 X2=350.000000 Y2=10000.000000
OBJ: TH2F histogram Y vs X : 1 at: 0x932a070
OBJ: TPaveText title X1= 21.874998 Y1=21330.330116 X2=328.125002 Y2=40875.003947
OBJ: TH1D th2favx Fitted value of par[1]=Mean : 1 at: 0x45b3b40
Text X=0.100000 Y=0.900000 Text=slope : 1049.271840, offset : -357459.224941
上記のOBJ: TH2F histogram Y vs X : 1 at: 0x932a070
がヒストグラムです。
あとはFindObject
でオブジェクトを取得して、適切なクラスにキャストするだけです。
TH2F *th2f = (TH2F*)acan->FindObject("histogram");
ヒント
FindObject
は上記のOBJ
であれば取得することができます。ここではOBJ: TH1D th2favx
という一次元のヒストグラムもあるのでそちらを取得することも可能です。
最後に正しく取得できたことを確認するのためもういちど描画してみます。
zone
th2f->Draw("colz")
元々の図とおんなじ図が描画できたら正しく取得できています。
あとはよしなに。