TFile編
ROOTファイルを読み込み/書き込みするためのクラス
読み込み/書き込みの指定が fopen などとは異なるので注意
ファイルを読み込みたい
1TFile *fin = new TFile("input_filename", "read");
ファイルを閉じたい
1fin->Close()
ファイルに書き込みたい
1TFile *fout = new TFile("out.root", "recreate");
2tree->Write(); // TTreeを書き込む
3hist->Write(); // ヒストグラムを書き込む
4canvas->Write(); // プロットを書き込む
5fout->Write(); // とりあえず一切合切書き込む
fout->Write(“tree”)ではない
複数のファイルを開いていた場合、どれに保存されるのだろう(※試したことない)
(たしか)TFileオブジェクトを作成してから、TTreeを作成しないと怒られる
ファイルを指定して書き込みたい
1TFile fout1 = new TFile("out1.root", "recreate");
2TFile fout2 = new TFile("out2.root", "recreate");
3
4// TTree作ったり色々とする
5// このままWriteすると、fout2に書き込まれる(はず)
6// それを、fout1にするには、
7fout1->cd();
8tree->Write();
9fout1->Close();
cd()をすることで、fout1のディレクトリ(?)に移動する
あんまよく分かっていないけれど、ROOTの中は、gROOTをルートとするディレクトリの構造のようになっていると思えば良い
その中に、TFileやら、TTreeやらといったオブジェクトがサブディレクトリのような、ファイルのような形で繋がっている
なので、cdをするとそのオブジェクトのディレクトリに移動できる、みたいな感じ
開いたファイルからヒストグラムを取ってきたい
1TFile *fin = new TFile("filename", "read");
2TH1D *h1 = (TH1D*)fin->Get("h1");
ポイントは
Getメソッドを使って、オブジェクトの名前を指定する
その際、型をキャストする
ファイルの有無を確認したい
1TString ifn = "inputfilename.root";
2FileStat_t info;
3
4if (gSystem->GetPathInfo(ifn.Data(), info)!=0) {
5 printf("File '%s' does not exist.\n", ifn.Data());
6} else {
7 TFile *fin = new TFile(ifn.Data(), "read");
8}
FileStat_tという構造体の変数を使う(ファイルのサイズとかの情報を持つらしい)
もちろん、読み込みファイルはROOTファイル以外の普通のファイルでもOK
inputfilename.rootに関して
相対パス、絶対パスでOK
ただし、“~/Documents/…/ifn.root"の様に、”~"でホームディレクトリを指定するのはうまくいかなかった
(Macなので) "/Users/username/Documents/…/ifn.root"と、絶対パスで指定したらできた
FileStat_tの持つ変数
説明のないのはよく分かってない変数
1FileStat_t info;
2info.fDev; // デバイスID
3info.fGid; // グループID
4info.fIno; // ???
5info.fIsLink; // シンボリックリンクかどうか?(kTRUE or kFALSE)
6info.fMode; // ???
7info.fMtime; // 変更された時間
8info.fSize; // ファイルサイズ
9info.fUid; // ユーザID
10info.fUrl; // URL名(URLでなければ0が返ってくるみたい)
ファイルがあった場合、それを上書きするかどうか聞くようにしたい
上からの派生
1if (gSystem->GetPathInfo(ofn, info)==0) {
2 fprintf(stderr, "Error:\tFile '%s' already exist.\n", ofn);
3 fprintf(stderr, "Error:\tDo you want to ovewrite? [y/n] > ");
4 int answer, readch;
5 readch = getchar();
6 answer = readch;
7 while (readch != '\n' && readch != EOF) readch = getchar();
8 if (answer == 'y' || answer == 'Y') fprintf(stderr, "\tOverwriting '%s'.\n", ofn);
9 else {
10 fprintf(stderr, "\tQuit.\n");
11 return 0;
12 }
13}