【问题标题】:Reading a TTree branch using PyROOT使用 PyROOT 读取 TTree 分支
【发布时间】:2018-05-15 02:31:22
【问题描述】:

我喜欢使用 PyROOT 读取 TTree 中分支的内容。我在这里寻找可能的解决方案:Reading a TTree in root using PyRoot。但是,答案对我没有帮助,因为 PyROOT 可能不知道分支的结构。请查看底部输出 sn-p,并提出解决方案。

谢谢, 萨迪亚

>>> import ROOT
>>> f = ROOT.TFile("../Ntuple/v0406_default_1012p2_101X_dataRun2_Express_v7_Fill6573_Ntuple.root")
>>> f.ls()
    TFile**        ../Ntuples/v0406_default_1012p2_101X_dataRun2_Express_v7_Fill6573_Ntuple.root
    TFile*        ../Ntuples/v0406_default_1012p2_101X_dataRun2_Express_v7_Fill6573_Ntuple.root
    KEY: TTree    trajTree;1    Trajectory measurements in the Pixel detector.
    KEY: TTree    eventTree;1    The event.
    KEY: TTree    clustTree;1    Pixel clusters.
    KEY: TTree    trajROCEfficiencyTree;1    ROC and module efficiencies.
    >>> t = f.Get("trajTree")
    >>> t.Print()
    ******************************************************************************
    *Tree    :trajTree  : Trajectory measurements in the Pixel detector.         *
    *Entries : 42180482 : Total =     31858466801 bytes  File  Size = 8076610485 *
    *        :          : Tree compression factor =   3.94                              *
    ******************************************************************************
    *............................................................................*
    *Br    5 :clust_pix : pix[size][2]/F                                         *
    *Entries : 42180482 : Total  Size= 1597865089 bytes  File Size  =  569202378 *
    *Baskets :    12058 : Basket Size=    2175488 bytes  Compression=   2.81     *
    *............................................................................*
    *Br    7 :traj      : validhit/I:missing:lx/F:ly:lz:glx:gly:glz:clust_near/I:*
    *         | hit_near:pass_effcuts:alpha/F:beta:norm_charge:d_tr:dx_tr:dy_tr: *
    *         | d_cl:dx_cl:dy_cl:dx_hit:dy_hit:onedge/I:lx_err/F:ly_err/F        *
    *Entries :42180482 : Total  Size= 4220749516 bytes  File Size  = 2508894561 *
    *Baskets :    28411 : Basket Size=    2275840 bytes  Compression=   1.68     *
    *............................................................................*

>>> t.clust_pix
<read-write buffer ptr 0x7fba04428200, size 514 at 0x115e5ecf0>

>>> t.traj
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'TTree' object has no attribute 'traj'

>>> t.traj.beta
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'TTree' object has no attribute 'traj'

【问题讨论】:

    标签: pyroot


    【解决方案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++ 编写的,我的宏需要双倍的时间。

    【讨论】:

    • 感谢您的问题和解决方案。我正在尝试做同样的事情,您能否详细介绍一下树的结构?如果我理解正确,trajTree 是一棵树,而 traj 是一个分支。 Validhit、missing 等是叶子。是对的吗? traj 是树的唯一分支吗?如果一个分支有更多的子分支,你能否也给我一些指示如何做到这一点?
    • 亲爱的阿南达,请在根论坛查看以下主题:root-forum.cern.ch/t/reading-a-ttree-branch-using-pyroot/29019。如果您有更多问题,请告诉我。谢谢,
    猜你喜欢
    • 2016-12-13
    • 2017-12-15
    • 1970-01-01
    • 2011-10-24
    • 2014-06-28
    • 1970-01-01
    • 2020-06-08
    • 2018-02-21
    • 2017-12-23
    相关资源
    最近更新 更多