在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]但是对于嵌套的向量,比如vector<vector<float> >类型的nested,该怎么办呢?正在运行
for entry in tree:
print entry.nested[0][0]将抛出一个TypeError: 'vector<vector<float> >' object is unindexable。
处理这个问题的最好方法是什么?(如果它不需要在根字典中加载,效果会更好)
发布于 2012-05-12 20:39:24
这对我在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)https://stackoverflow.com/questions/10057076
复制相似问题