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")

元々の図とおんなじ図が描画できたら正しく取得できています。

あとはよしなに。