Самоответ с помощью коллеги: я определяю структуру филиала и затем устанавливаю его адрес.
Файл данных структуры - 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 ++.