オブジェクトを取得したい(TFile::Get<T>)
1TFile *source = TFile::Open("source.root");
2
3TTree *tree = source->Get<TTree>("events");
4TH1D *h = source->Get<TH1D>("h_energy");
5
6if (!tree) {
7 std::cerr << "Failed to retrieve tree from file!" << std::endl;
8 source->Close();
9 return;
10}
11
12if (!h) {
13 std::cerr << "Failed to retrieve histogram from file!" << std::endl;
14 source->Close();
15 return;
16}
TFile::Get<T>は、TFile内のオブジェクトを名前で取得するためのテンプレートメソッドです。
Tには、取得したいオブジェクトの型を指定します。
指定した名前のオブジェクトが存在しない場合や、型が異なる場合はnullptrを返します。
オブジェクトが正常に取得できたかどうかの確認に利用できます。
オブジェクトを取得したい(TFile::Get)
1// C++ style
2TTree *tree = dynamic_cast<TTree*>(source->Get("events"));
3
4// C style (not recommended)
5TTree *tree = (TTree*)source->Get("events");
TFile::Getは、ファイル内のオブジェクトを名前で取得するためのメソッドです(テンプレートメソッドではない)。
TObject*型のポインターが返ってくるため、適切な型にキャストする必要があります。
キャストの書き方には
C++スタイルのdynamic_castと、
Cスタイルのキャストがあります。
C++スタイルは実行時に型の安全性をチェックするため、誤った型にキャストしようとするとnullptrが返されます。
Cスタイルのキャストは型の安全性をチェックがありません。
誤った型にキャストしてもコンパイルは通りますが、実行時に予期しない動作を引き起こす可能性があります。
注釈
ROOT5まではCスタイルのキャストが広く使われていました。
ウェブ上で見つかるコードやドキュメントではCスタイルのキャストが使われていることがあります。
ROOT6以降ではC++スタイルのキャストもしくは
TFile::Get<T>テンプレートメソッドの使用をオオススメします。