last-modified: 2019-09-04 (水) 14:46:25 (1689d)[変更箇所]
TFile *fout = new TFile("out.root","recreate"); TNamed *header = new TNamed("header"); fout->Add(header); ... fout->Write(); fout->Close();
みたいな感じ。ここが詳しくわかりやすい。
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)違いができることになるので。
以上の方法だと、Drawしたときに
Warning in <TFile::Append>: Replacing existing TH1: gedp0 (Potential memory leak).
とか言われる。ここ によると、以下の様な対処法で回避できる。
TList* glist = new TList(); glist->Add(g1); glist->Add(g2); file_out->Add(glist);
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; }