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}