使用PyROOT访问TTree中的嵌套容器

时间:2012-04-07 18:19:04

标签: python root-framework

在PyROOT中,很容易从树中读取值,即打印叶子val

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

也很容易从stl vector<float>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字典中加载,则更好)

1 个答案:

答案 0 :(得分: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)