使用PyROOT读取TTree分支

时间:2018-05-15 02:31:23

标签: pyroot

我喜欢使用PyROOT阅读TTree中分支的内容。我在这里寻找可能的问题解决方案:Reading a TTree in root using PyRoot。但是,答案对我没有帮助,因为可能PyROOT并不知道分支的结构。请参阅底部输出代码段,并提出解决方案建议。

谢谢, 萨迪亚

>>> tree.xpath('//sequence/element/@name')
['Header', 'SpeedUnitOfMeasure', 'TileId', 'Route', 'Segment']

1 个答案:

答案 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 ++编写内容,我的宏需要花费两倍的时间。