簡體   English   中英

嘗試打開包含在 Pyroot 中的根樹中的二維數組的問題

[英]Issues trying to open a bi-dimensional array leave contained in a ROOT Tree in Pyroot

我在使用 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 方法,如hadd file.root 'ls /path/.root' 。* 我嘗試了幾種方法,我將很快展示。 任何時候我發現不同的問題:一旦 numpy 數組應該包含每個事件的 48x48 值根本沒有創建,其他人只是沒有寫任何東西或奇怪的值(負數也是不可能的)。 我的代碼如下:

# 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 class 方法,數組 pdm_counts 僅填充 photon_count_data 中包含的第一個元素
  2. 使用 Draw 方法,我得到了分段違規或奇怪的 kernel 問題
  3. 使用根緩沖區方法,我立即得到一個包含所有 2304 (48x48) 值的列表,但它們與 photon_count_data、id est、負值或數量級毫無意義的值完全不同

你能告訴我我哪里錯了,或者是否有更優雅和快速的方法來做到這一點。 提前致謝

實際上我找到了解決方案,如果有人需要它,我想分享它! 實際上解釋了第三種方法

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

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM