2.1 数据分析

数据读取与写入

创建 ROOT 文件

使用TFile中的Open()函数来创建或打开 ROOT 文件。

std::unique_ptr<TFile> myFile( TFile::Open("file.root", "RECREATE") );
  • "RECREATE":创建一个 ROOT 文件,如果已经存在,替换。

  • "CREATE""NEW"创建一个 ROOT 文件。

  • "UPDATE":更新 ROOT 文件。

  • "READ":打开现有的 ROOT 文件进行读取。

e.g. 向一个 ROOT 文件中写入数据
void skymapMCroot() {
	
	double xx,yy;
	TFile *file = new TFile("data.root", "RECREATE");
	TTree *tree = new TTree("tree", "Random Data Tree");
	tree->Branch("xx", &xx, "x/D");
	tree->Branch("yy", &yy, "y/D");

	for (int i=0; i<5.20587e+5; i++) {
		xx = gRandom->Uniform(0,360);
		yy = gRandom->Uniform(0, 60);
		tree->Fill();
	}

	file->Write();
	file->Close();
	delete file; // 释放内存
}
e.g. 从ROOT 文件中读取数据到文本
#include <fstream>
#include <string>

int ana(){

    string dir = "/home/users/z/zhangzh/guide/root/example_cernstaff/";
    string name = "cernstaff.root";
    string filename = dir + name;

    int AGE,N;
    TFile *f = new TFile(filename.c_str());    // 以c格式读取
    TTree *my_tree = (TTree*)f->Get("T");
    TBranch *my_age = my_tree->GetBranch("Age");
    my_age->SetAddress(&AGE);

    N =(int)my_tree->GetEntries();
    for(int i=0;i<N;i++){
        my_age->GetEntry(i);
        cout<<AGE<<endl;
    }
    return 0;
}
e.g. 从文本中读取数据后绘制
#include <fstream>

int h1(){
    ifstream read("age.txt");
    ofstream write("age_graph.txt");

    int N=3354;
    int age=1;
    TH1I *h1 = new TH1I("h1","the age distribution in CERN 1988",100,0,100);
    for(int i=0;i<N;i++){
        read >> age;
        h1->Fill(age);
    }

    h1->Draw();
    for(int i=20;i<70;i++){        
    cout<<"the age number of people in the age of "<<i<<" is "<<h1->GetBinContent(i)<<endl;
    write << i << "\t"<<h1->GetBinContent(i) << "\n";
    }
    read.close();
    write.close();
    return 0;
}
e.g. 通过指定地址,获取事例数,逐个读取和填充
e.g. 通过输入输出流,快速绘制图案

动态数组c

e.g. 动态数组c

在 ROOT 文件中存储对象

您可以将任何对象(例如画布或直方图)保存到 ROOT 文件中。你甚至可以存储你自己的类型。

TFile源自TDirectory;使用TDirectory::WriteObject()将对象写入 ROOT 文件。e.g.

对象myObject的副本被写入myFile文件。在文件中,它可以在"MyObject"的名称下找到。

ROOT 命令行工具

使用 ROOT 命令行工具,您可以快速检查和修改 ROOT 文件的内容。最常用的是:

  • rootls:列出 ROOT 文件的内容。

  • rootcp:将存储在 ROOT 文件中的对象复制到另一个 ROOT 文件。

  • rootrm:删除 ROOT 文件中包含的对象。

  • rootmv:将存储在 ROOT 文件中的对象移动到另一个 ROOT 文件。

  • rootmkdir:在 ROOT 文件中创建一个“目录”。

  • rootbrowse:直接打开带有 ROOT 文件内容的TBrowser

  • rooteventselector:提取 ROOT 文件中包含的树的一系列事件,并将其作为新树放在另一个 ROOT 文件中。

  • rootprint:在图像 ROOT 文件中绘制对象。

  • rootslimtree:从源 ROOT 文件中复制带有分支子集的树。

使用-h选项获取有关特定 ROOT 命令行工具可用选项的更多信息。

在系统提示符上,您可以使用 ROOT 命令行工具rootls来列出 ROOT 文件的内容。e.g.

文件串联与合并

  • TChain函数:用于在宏中将若干格式一致的 ROOT 文件串联读取。e.g.

  • hadd命令:用于在 shell 中将文件合并。e.g.

数值处理

基本运算

当需要一个基础的计算器时,可以使用 ROOT,当然也可以使用 exper命令,参见expr命令 命令行计数器。e.g.

插值计算

拟合参数
含义

kLINEAR

线性插值

kPOLYNOMIAL

多项式插值,用于少量点,因为会引入较大的振荡

kCSPLINE

具有自然边界条件的三次样条

kCSPLINE_PERIODIC

具有周期边界条件的三次样条

kAKIMA

具有自然边界条件的 Akima 样条(至少需要 5 个点)

kAKIMA_PERIODIC

具有周期边界的 Akima 样条(至少需要 5 个点)

Eval(,,)函数 可以很方便的帮我们计算出给定数列的差值结果。其中第一个参数是差值的位置,第二个参数有0,1,2三种,分别表示线性插值方法、样条插值方法多项式插值方法。第三个参数R:使用线性插值方法进行插值计算,并且对结果进行平滑处理。Q:使用快速线性插值方法进行插值计算。这种方法通常速度更快,但可能不够精确。C:使用使用三次样条插值方法进行插值计算。S表示插值计算时不进行平滑处理

TGraph::Eval

使用TSpline在此图中在 x 处插入点。

  • 如果spline==0option=""则计算靠近x的两个点之间的线性插值。如果x超出图形范围,则计算线性外推法。

  • 如果spline==0option="S"使用此图创建TSpline3对象,并返回样条线的插值。内部创建的样条线在返回时被删除。

  • 如果指定了样条线,则它用于返回插值。

    如果点在x中排序,则使用二分搜索(明显更快),需要在调用TGraph::Eval之前设置位 TGraph::SetBit(TGraph::kIsSortedX)以指示图在 X 中排序。

e.g. Eval 插值计算

TH::Interpolate(x) or TH::Interpolate(x, y) or TH::Interpolate(x, y, z)

在直方图中进行线性插值来估计某个点的值,而不局限于直方图的bin中心的值。支持 1维、2维、3维。

gs->Approx函数对数据进行插值处理。

  • Approx 函数 :用于对数据进行插值,生成新的数据点。当原始数据点不够密集或者需要更平滑的曲线时,可以通过插值来增加数据点,以更好地拟合数据的趋势。例如,对于一些离散的测量数据,使用 Approx 可以生成更多中间点,使绘制的曲线更平滑。

  • Eval 函数 :主要用于计算函数在某个特定点的值。如果已经有一个定义好的函数表达式,通过 Eval 可以快速得到该函数在给定自变量处的因变量值,常用于函数求值、函数图像绘制等场景。

e.g. 实例

积分

  • TGraph::Integral(first, last)

请注意,此函数计算TGraph的点所包围的多边形的面积。由TGraph的点定义的多边形段不需要形成闭合多边形,因为闭合多边形的最后一个多边形段被视为连接最后一个TGraph点与第一个点的线。很明显,点的顺序对于定义多边形至关重要。另请注意,线段不应相交。

如果last=-1(默认)last设置为最后一个点。

如果(first < 0),则采用第一个点(0)

  • TH1::Integral(binx1, binx2, option="")

默认情况下,积分计算为范围内 bin 内容的总和。如果指定了选项"width",则积分是 bin 内容乘以x中的 bin 宽度之和。

条件判选

数据处理过程往往需要为数据添加一些限制条件,使结果达到希望呈现的样子,在脚本中,按照C语言规范正常添加即可,在命令行模式中添加限制条件,写法如下:

e.g.

多个限制条件之间使用&&符号相连,或||,也可以使用TCut类合并。

拟合

参见2.2.4 误差与拟合

洛伦兹不变量 TLorentzVector

参考:

蒙特卡洛与随机样本

蒙特卡洛思想的介绍参考章节蒙特卡罗思想

在 ROOT 中产生随机样本的方法是使用随机数生成器

ROOT 生成随机函数的基类有很多,例如 TRandom3、TRandomRanluxppTRandomMixMaxTRandom2 等等。综合来讲 TRandom3 是最佳的选择,此生成器提供具有 32 位随机比特的数字,这对于一些基于双精度或扩展精度的应用可能不足够。该生成器在 ROOT 中被用来实例化指向 ROOT 生成器的全局指针gRandom

还可以根据 TF1、TF2 或 TF3 对象分布生成随机数:

或者使用 UNURAN 包,使用之前需要将 UNURAN 初始化:

E.g. 使用基类和全局指针 gRandom 生成随机分布

运行时间统计

  1. Start(const char *name)

    • 开始计时,name 是计时器的名称。

  2. Stop(const char *name)

    • 结束计时,name 是计时器的名称。

  3. Show(const char *name)

    • 显示指定计时器的时间信息。如果不指定 name,则显示所有计时器的信息。

  4. Reset()

    • 重置所有计时器。

  5. GetRealTime(const char *name)

    • 获取指定计时器的实时时间。

  6. GetCpuTime(const char *name)

    • 获取指定计时器的CPU时间。


参考

https://root.cern/doc/master/classTRandom.html

最后更新于