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 文件进行读取。
在 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==0且option=""则计算靠近x的两个点之间的线性插值。如果x超出图形范围,则计算线性外推法。如果
spline==0且option="S"使用此图创建TSpline3对象,并返回样条线的插值。内部创建的样条线在返回时被删除。如果指定了样条线,则它用于返回插值。
如果点在
x中排序,则使用二分搜索(明显更快),需要在调用TGraph::Eval之前设置位TGraph::SetBit(TGraph::kIsSortedX)以指示图在 X 中排序。
TH::Interpolate(x) or TH::Interpolate(x, y) or TH::Interpolate(x, y, z)
在直方图中进行线性插值来估计某个点的值,而不局限于直方图的bin中心的值。支持 1维、2维、3维。
gs->Approx函数对数据进行插值处理。
Approx函数 :用于对数据进行插值,生成新的数据点。当原始数据点不够密集或者需要更平滑的曲线时,可以通过插值来增加数据点,以更好地拟合数据的趋势。例如,对于一些离散的测量数据,使用Approx可以生成更多中间点,使绘制的曲线更平滑。Eval函数 :主要用于计算函数在某个特定点的值。如果已经有一个定义好的函数表达式,通过Eval可以快速得到该函数在给定自变量处的因变量值,常用于函数求值、函数图像绘制等场景。
积分
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、TRandomRanluxpp、TRandomMixMax、TRandom2 等等。综合来讲 TRandom3 是最佳的选择,此生成器提供具有 32 位随机比特的数字,这对于一些基于双精度或扩展精度的应用可能不足够。该生成器在 ROOT 中被用来实例化指向 ROOT 生成器的全局指针gRandom。
还可以根据 TF1、TF2 或 TF3 对象分布生成随机数:
或者使用 UNURAN 包,使用之前需要将 UNURAN 初始化:
运行时间统计
Start(const char *name)开始计时,
name是计时器的名称。
Stop(const char *name)结束计时,
name是计时器的名称。
Show(const char *name)显示指定计时器的时间信息。如果不指定
name,则显示所有计时器的信息。
Reset()重置所有计时器。
GetRealTime(const char *name)获取指定计时器的实时时间。
GetCpuTime(const char *name)获取指定计时器的CPU时间。
参考
最后更新于