我喜欢使用PyROOT阅读TTree中分支的内容。我在这里寻找可能的问题解决方案:Reading a TTree in root using PyRoot。但是,答案对我没有帮助,因为可能PyROOT并不知道分支的结构。请参阅底部输出代码段,并提出解决方案建议。
谢谢, 萨迪亚
>>> tree.xpath('//sequence/element/@name')
['Header', 'SpeedUnitOfMeasure', 'TileId', 'Route', 'Segment']
答案 0 :(得分:1)
在同事的帮助下自我回答:我定义分支的结构,然后设置其地址。
结构数据文件是structDef.py
from ROOT import gROOT, AddressOf
gROOT.ProcessLine(
"struct Traj {\
Int_t validhit;\
Float_t missing;\
Float_t lx;\
Float_t ly;\
Float_t lz;\
Float_t glx;\
Float_t gly;\
Float_t glz;\
Int_t clust_near;\
Float_t hit_near;\
Float_t pass_effcuts;\
Float_t alpha;\
Float_t beta;\
Float_t norm_charge;\
Float_t d_tr;\
Float_t dx_tr;\
Float_t dy_tr;\
Float_t d_cl;\
Float_t dx_cl;\
Float_t dy_cl;\
Float_t dx_hit;\
Float_t dy_hit;\
Int_t onedge;\
Float_t lx_err;\
Float_t ly_err;\
};"
);
然后在我的主代码中,我设置了分支地址。
#!/usr/bin/env python
from ROOT import TFile, TTree
import structDef
from ROOT import Traj
traj = Traj()
f = TFile.Open('../Ntuples/v0406_default_1012p2_101X_dataRun2_Express_v7_Fill6573_Ntuple.root')
t1 = f.Get("trajTree")
t1.SetBranchAddress("traj", structDef.AddressOf(traj, 'validhit'))
for iev in xrange(t1.GetEntries()):
t1.GetEntry(iev)
print traj.norm_charge
如果任何人有更好的解决方案,那么我非常感谢你的帮助,因为我确实看到了警告,尽管它对我有用。
input_line_20:2:9: error: redefinition of 'Traj'
struct Traj { Int_t validhit; Float_t missing; Float_t lx; Float_t ly; Float_t lz; Float_t glx; Float_...
^
input_line_19:2:9: note: previous definition is here
struct Traj { Int_t validhit; Float_t missing; Float_t lx; Float_t ly; Float_t lz; Float_t glx; Float_...
^
17.0971317291
我喜欢python,但这个额外的层让我的宏变得复杂。此外,我喜欢提示如何在python中有效地循环遍历树中的所有条目,就像在C ++中一样。可能是ROOT与PyROOT的问题。目前,如果使用C ++编写内容,我的宏需要花费两倍的时间。