【ROOT from CERN】——如何读取Tree
读取Tree信息的代码总结。
了解.root的存储信息,从.root的Tree中读取数据进行分析,涉及到十分庞杂的代码,本文进行相关的总结。
一、用Cling查看Tree
1、打开.root文件查看基础内容
打开.root文件所在文件夹,并于此处打开shell输入,
root filename.root
即可打开相应地root文件。或者你可以选择只输入,
root
进入root的cling,再运用指针TFile打开对应的文件,
TFile* f = new TFile("filename.root")//默认无参数即可打开root文件进行读取
TFile* f = new TFile("filename.root","NEW")//新建文件
TFile* f = new TFile("filename.root","RECREATE")//如果文件存在则覆盖,如果不存在则新建
TFile* f = new TFile("filename.root","UPDATE")//如果文件存在则继续写入,如果不存在则新建
以$ROOTSYS/tutorials/tree/basic.root为例,可将文件内的内容打印到shell中,在cling内输入,
.ls
显示该root文件存在TH1F的h1和TNtuple的ntuple。
2、打开Tree并查看数据内容
我们打开文件中tree,此处为ntuple,输入,
TTree* tree = (TTree*)f->Get("treename")
获取Tree的全部数据内容,则输入,
tree->Scan()
获取Tree中的某一个Entry(Event),则输入,
tree->Show(n)
本文所有图片都上下关联,可以注意到的是,在Scan()结束后,该方法返回一个longlong型的值25,该值为该Tree中当前tree指针所指向的事例,其编号为24。同时可以注意到,使用Show(),如果不加参数,则其显示指针当前所指向的事例,若输入参数n则指向第n+1个事例。图内的EVENT0就是第一个事例。
获取Tree的直观结构和Branch的存储信息,则输入,
tree->Print()
该Tree(Tntuple是只能存浮点数的特殊Tree),共有三个Branch,分别为x,y,z。事例数为1000,类型均为Float_t,后边标示了其所占用的存储空间大小。
二、用TTreeViewer查看树的内容
用命令唤出GUI也可以查看Tree,以下两句均可唤出TBrowser
new TBrowser
TBrowser b
打开后选中目标文件打开,右键Tree选择StartViewer进入树查看器,如图:
图中的树查看器,可以看到三个Branch,但是因为这三个Branch上都只有各自一片Leaf,所以显示为Leaf的图标。查看器中有三个显示为empty的x,y,z图标。可以把它理解为统计直方图的三个轴。可以将不同的叶子分别拖入三个轴,点击左下角绿色循环箭头update the tree viewer即可快速作图。
三、用脚本进行数据读取的流程
简单总结如何读取.root中Tree的数据:
1、使用TFile打开目标文件
2、将指针指向目标Tree
3、使用TTree的GetEntries()获取事例总数n
4、使用SetBranchAddress将Branch地址与自设变量相连
5、使用循环令GetEntry()或GetEvent()从0到n-1进行遍历获取数据
以上的三四步可以颠倒,代码模板如下:
{
Int_t variable;//just a example
TFile* f = new TFile(“filename.root”);
TTree* tree = (TTree*)f->Get("treename");
Long64_t entries = tree->GetEntries();
tree->SetBranchAddress("branchname",&variable);
for(Int_t i=0;i<entries;++i)
{
tree->GetEntry(i);
//handle
}
f->Close();
}
【资料】
1、ROOT官网——ROOT: analyzing petabytes of data, scientifically. - ROOT
2、ROOT官方指导书——《ROOTUsersGuide》
如有错误请指正。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)