編集メニュー > 新規作成 編集 コピー 名前の変更 アップロード 添付ファイル一覧 バックアップ

#author("2019-09-04T14:46:25+09:00","default:kondo","kondo")
* TFile [#wd8d944e]
** TObjectをファイルに保存する [#x291f903]
 TFile *fout = new TFile("out.root","recreate");
 TNamed *header = new TNamed("header");
 fout->Add(header);
 
 ...
 
 fout->Write();
 fout->Close();

みたいな感じ。[[ここ:http://www-he.scphys.kyoto-u.ac.jp/member/n.kamo/wiki/doku.php?id=study:software:root:io]]が詳しくわかりやすい。

** 別のDirectoryで作ったTGraphを保存する場合 [#o88d2c82]
 TFile *file_in = new TFile("file1.root","readonly");
 TGraph *g1 = new TGraph(N1,x1,y1);
 TGraph *g2 = new TGraph(N2,x2,y2);
 g1->SetName("g1");
 g2->SetName("g2");
 
 TFile *file_out = new TFile("file2.root",recreate");
 file_out->Add(g1);
 file_out->Add(g2);
 file_out->Write();

とかする。TFile::Addをすればよい。TGraph::SetNameはこれをしておかないと、複数作った場合はすべて"Graph"という名前のバージョン(namecycle)違いができることになるので。

*** 補足 [#n1a4e047]
以上の方法だと、Drawしたときに
 Warning in <TFile::Append>: Replacing existing TH1: gedp0 (Potential memory leak).
とか言われる。[[ここ:http://www-utheal.phys.s.u-tokyo.ac.jp/~yuasa/wiki/index.php/TGraph%E3%82%92Add%E3%81%97%E3%81%A6Draw%E3%81%99%E3%82%8B%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8B]]
によると、以下の様な対処法で回避できる。

 TList* glist = new TList();
 glist->Add(g1);
 glist->Add(g2);
 file_out->Add(glist);

** オブジェクト一覧を取得する方法 [#d2f14981]

    TList *list = f1->GetListOfKeys();
    for (Int_t i=0;i<list->GetEntries();++i){
      TKey *key = (TKey*)list->At(i);
      TString name = key->GetName();
      TObject *o1 = f1->Get(name.Data());
      TString cname(o1->ClassName());
      if (!cname.Contains("TH1")) continue;
    }