2

PyROOT 内では、ツリーから値を読み込むこと、つまり leaf を出力することは簡単ですval:

file = TFile('file.root')
tree = file.Get('tree')
for entry in tree: 
    print entry.val

vector<float>stl ,から値を読み取るのも簡単ですvec:

for entry in tree: 
    print entry.vec[1]

しかし、ネストされたベクトル、つまりnestedタイプのベクトルはvector<vector<float> >どうですか? ランニング

for entry in tree: 
    print entry.nested[0][0]

をスローしTypeError: 'vector<vector<float> >' object is unindexableます。

これに対処する最善の方法は何ですか?(ROOT ディクショナリへのロードを必要としない場合に適しています)

4

1 に答える 1

3

これは、Pythonでインデックスを作成することで機能します。

    >>>from ROOT import *
    >>>vec1 = std.vector('double')()
    >>>vec2 = std.vector('double')()
    >>>vec_vec = std.vector(std.vector('double'))()

    >>>for i in range(3):
    >>>   vec1.push_back(i)
    >>>for i in range(5):
    >>>   vec2.push_back(i)
    >>>vec_vec.push_back(vec1)
    >>>vec_vec.push_back(vec2)

    >>>len(vec_vec)
    2
    >>>len(vec_vec[0])
    3
    >>>len(vec_vec[1])
    5
    >>>vec_vec[1][2]
    2.0

あなたの例では、エラーは次のように言っています:

    TypeError: 'vector<vector<float> >' object is unindexable

コンストラクター std.vector(type)() を呼び出した後、メモリ空間のアロケーターが機能していることを示すさまざまな型があります。

    >>>type(vec1)
    <class 'ROOT.vector<double,allocator<double> >'>
    >>>type(vec_vec)
    <class 'ROOT.vector<vector<double,allocator<double> >,allocator<vector<double,allocator<double> > > >'>

このようなベクターを TTree からインポートするには、次の例のように setBranchAddress を使用します。

    >>>tree = file.Get('tree')
    >>>tree.SetBranchAddress("nested",vec_vec)
    >>>N = tree.GetEntries()
    >>>for i in range(N):
    >>>    vec_vec.clear()
    >>>    tree.GetEntry(i)
    >>>    print vec_vec[0][0]

また、これは使用後に大幅に高速になる可能性があることに注意してください

   >>>tree.setBranchStatus('*',0)
   >>>tree.setBranchStatus('nested',1)
于 2012-05-12T12:39:23.837 に答える