TTree是ROOT的一个存储数据的类,大概可以理解成一个二维数据表格。每一个Branch代表一种属性(或者一列),Entry代表一个事例(或者一行)。用户可以通过读取每一Entry中的特定Branch,来统计一个样本的某个属性的分布。
读取TTree数据的方法有很多,这里总结几个比较常用的,他们有的比较复杂但比较灵活,有的简单快捷,但是面对更复杂的数据结构或者操作就无能为力。不同的场景适用不同的方法,但个人觉得RDataFrame在各种情况都相对好用一些,写这篇博客也是起因于此。
其实可以直接去看文档
https://root.cern/manual/trees/#showing-an-entry-of-a-tree
https://root.cern/doc/master/tree2_8C.html
https://root.cern/doc/master/classTTree.html#a73450649dc6e54b5b94516c468523e45
https://root.cern/doc/master/classROOT_1_1RDataFrame.html
利用TTree本身的成员方法
以下内容大部分来自于官方文档的这几个部分:
https://root.cern/manual/trees/#showing-an-entry-of-a-tree
https://root.cern/doc/master/tree2_8C.html
https://root.cern/doc/master/classTTree.html#a73450649dc6e54b5b94516c468523e45
从一个.root
文件中读取TTree的方法:
TFile *f = new TFile("tree2.root");
TTree *t2 = (TTree*)f->Get("t2");
其中TFile的构造函数打开了一个.root
文件,Get方法从文件中找到名字对应的TObject,转换成TTree之后即可拿到一个TTree的指针。
TTree::Draw
TTree内置的Draw方法可以快捷的统计某个Branch或者某几个Branch的分布,还可以设置筛选条件,以及画图选项。
例如我们有一个Tree,其中包含这些Branch:
root [3] pion->Print()
******************************************************************************
*Tree :pion : pion *
*Entries : 14228 : Total = 860959 bytes File Size = 553940 *
* : : Tree compression factor = 1.55 *
******************************************************************************
*Br 0 :RunNum : RunNum/I *
*Entries : 14228 : Total Size= 57547 bytes File Size = 547 *
*Baskets : 2 : Basket Size= 32000 bytes Compression= 104.31 *
*............................................................................*
*Br 1 :PiNumInEvent : PiNum