在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字典中加载,则更好)
答案 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)