numpy 尝试打开包含在Pyroot的根树中的二维数组时出现问题

hmmo2u0o  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(101)

我在使用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中的值完全不同,负值或数量级毫无意义
你能告诉我哪里错了吗?或者有没有更优雅、更快捷的方法?先谢了

hyrbngr7

hyrbngr71#

事实上我找到了解决办法,我想分享它,如果任何时候有人会需要它!实际上第三种方法解释

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

工作,但不幸的是,我使用Spyder可视化数据,由于某种原因,它返回奇怪的值是不正确的!所以...不要使用Spyder!!!此外,另一种方法工作正常:

from root_pandas import read_root
data = read_root('merge.root', 'tevent_2nd_integral', columns=['cpu_packet_time', 'photon_count_data'])

干杯!

相关问题