【ROOT from CERN】——到底什么是Tree

ROOT框架是由CERN开发的数据分析框架。其拥有自成体系的.root数据文件,该文件对于数据的存储结构被称作Tree(树)。.root文件也兼容CERN开发的其他配套研究软件,作为科研软件的输入和输出,如Geant4。这篇文章主要介绍如何直观地理解Tree结构。

一、官方用户手册中的解释

有一些代码基础的读者可能首先会想到数据结构里的树,比如大家广为熟知的二叉树(我记得堆排序似乎用到了二叉树)。ROOT的Tree有类似之意,在官方手册中也给出了类似的解释。需要注意的是,.root文件并不等于Tree结构,而是.root中的大量数据可以被存成一棵Tree。而其并非仅可以存储数据,同时可以存取histogram或graph,以便于使用者后续可以在GUI中对图片进行修饰和更改,类似Photoshop的.psd格式。

本文不包括Tree的写入,读取,查看。请各位自行查阅《UserGuide》的Chapter12-Trees进行简单的了解。在这里简单给出官方使用的专有名词:

Tree、Branch、Leaf、Entry

简单理解,Entry就是Event,每个Entry都具有很多个属性,或者叫做变量。每一个变量就是该Entry的一片Leaf。在Tree的存取过程中,若干个Entry的变量将被拆分为一片片Leaf分别存储,以便于压缩空间和快速读取。而如何拆分,拆不拆彻底,将由程序员决定

就像是我们理解的那样,Tree上长有Branch,Branch上长着Leaf。 下图是树的两种可能的形式。左边的树将一个Event的所有变量全部拆开,每片Leaf都占据一个Branch,这是对于Event的最大拆分。而右图则没有对Event的变量进行任何拆分,所有的Leaf作为一个整体Event共同占据一条Branch。我知道有读者会想——那不应该是所有的Leaf都长在同一个Branch上吗,或许可以这样理解,但图上并没有表现出来,这是对于Event的最小拆分。其余所有的树的形态都介于两者之间,例如你可以选择将Event的某个变量(Leaf)单独拿出来,使其独立在一条Branch上。

这让人听上去云里雾里,但没有关系。本文的重点并不是官方的解释,因为我觉得官方的用户手册非常不友好。实际上官方出具的解释相当的“专业”,或者说“抽象”,对于代码小白来说基本是灾难。虽然说可以通过大量的练习来达到一个熟练使用的效果,但是对于一个结构而言,如果理解不够深刻,总会遇到一些难以跨越的bug,这只是时间问题。

二、另一种理解

中文互联网上的ROOT教程不能说多,但至少也是有一定数量的。我并非全部看过,所以理解思路可能会重复。又或者因为我自己的局限性,导致我自己对于Tree的理解出现了偏差。还请各位读者指正。

让我们假设一棵树Particle,用以储存n个粒子的信息,例如坐标x,坐标y,以及能量Energy。我们将进行这样的拆分,建立Branch分支——Coordinate和Energy。将Leaf叶子x和y置于Coordinate上,将Leaf叶子Energy置于Energy上(允许叶子与分支重名,因为不是同一级)。那我们或许可以这样理解:

这是一张表格,有熟悉Tree的读者可能会看出,这就是TTree:Scan()打印在Shell里的形式。其实就是一样的,但是在用户手册中并没有以此为重点进行解读,我也是在整理本文的时候才发现。(啊毕竟我水平还不是很高。。。)

本文仅仅浅显地探讨了Tree的理解方法,更多的细节和使用方法可以参考《如何读取Tree》

【资料】

1、ROOT官网——ROOT: analyzing petabytes of data, scientifically. - ROOT 

2、ROOT官方指导书——《ROOTUsersGuide》

如有错误请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值