Чтение ветки TTree с использованием PyROOT - PullRequest
0 голосов
/ 15 мая 2018

Мне нравится читать содержимое ветки в TTree, используя PyROOT. Я ищу возможное решение моей проблемы здесь: Чтение TTree в корне с использованием PyRoot . Однако ответ мне не помогает, потому что, вероятно, PyROOT не знает структуру ветви. Пожалуйста, посмотрите нижний фрагмент вывода и предложите решение.

Спасибо, Sadia

>>> 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'

1 Ответ

0 голосов
/ 15 мая 2018

Самоответ с помощью коллеги: я определяю структуру филиала и затем устанавливаю его адрес.

Файл данных структуры - 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 ++.

...