了解.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》

如有错误请指正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐