我在使用Pyroot时遇到了一个问题。我无法读取一个二维浮点数数组的叶子。你可以在下面的代码中看到相关的树:
root [1] TTree tr=(TTree)g->Get(“tevent_2nd_integral”)
root [2] tr.Print()
*Tree :tevent_2nd_integral: Event packet tree 2nd GTUs integral *
*Entries : 57344 : Total = 548967602 bytes File Size = 412690067 *
: : Tree compression factor = 1.33 *
*Br 7 :photon_count_data : photon_count_data[1][1][48][48]/F *
*Entries : 57344 : Total Size= 530758073 bytes File Size = 411860735 *
*Baskets : 19121 : Basket Size= 32000 bytes Compression= 1.29 *
…
数组(粗体)是photon_count_data[1][1][48][48]。实际上我有几个根文件,我尝试了两种方法,如 hadd file.root 'ls /path/. root'。* 我尝试了几种方法,我很快会展示。任何时候我发现不同的问题:一旦numpy数组(应该包含每个事件的48 x48个值)根本没有创建,其他人就不会写入任何东西或奇怪的值(负数也是不可能的)。
# calling the root file after using hadd to merge all files
rootFile = path+"merge.root"
f = XROOT.TFile(rootFile,'read')
tree = f.Get('tevent_2nd_integral')
# making a chain
PDMchain=TChain("tevent_2nd_integral")
for filename in sorted(os.listdir(path)):
if filename.endswith('.root') and("CPU_RUN_MAIN" in filename) :
PDMchain.Add(filename)
pdm_counts = []
#First method using python pyl class
leaves = tree.GetListOfLeaves()
# define dynamically a python class containing root Leaves objects
class PyListOfLeaves(dict) :
pass
# create an istance
pyl = PyListOfLeaves()
for i in range(0,leaves.GetEntries() ) :
leaf = leaves.At(i)
name = leaf.GetName()
# add dynamically attribute to my class
pyl.__setattr__(name,leaf)
for iev in range(0,nEntries_pixel) :
tree.GetEntry(iev)
pdm_counts.append(pyl.photon_count_data.GetValue())
# the Draw method
count = tree.Draw("photon_count_data","","")
pdm_counts.append(np.array(np.frombuffer(tree.GetV1(), dtype=np.float64, count=count)))
#ROOT buffer method
for event in PDMchain:
pdm_data_for_this_event = event.photon_count_data
pdm_data_for_this_event.SetSize(2304) #ROOT buffer
pdm_couts.append(np.array(pdm_data_for_this_event,copy=True))
1.使用python类方法时,数组pdm_counts仅填充photon_count_data中包含的第一个元素
1.使用Draw方法时,我遇到了分割冲突或奇怪的内核问题
1.使用根缓冲区方法,我会立即返回包含所有2304(48 x48)个值的列表,但它们与photon_count_data、id est中的值完全不同,负值或数量级毫无意义
你能告诉我哪里错了吗?或者有没有更优雅、更快捷的方法?先谢了
1条答案
按热度按时间hyrbngr71#
事实上我找到了解决办法,我想分享它,如果任何时候有人会需要它!实际上第三种方法解释
工作,但不幸的是,我使用Spyder可视化数据,由于某种原因,它返回奇怪的值是不正确的!所以...不要使用Spyder!!!此外,另一种方法工作正常:
干杯!