ROOT是由欧洲核子研究组织 (CERN) 所开发以C++面向对象为基础的数据分析套件。该套件原先主要设计于粒子物理实验数据大数据分析所用,后来亦渐渐加入各种图表制作功能,因此也吸引了其他科学研究领域做为数据分析使用。ROOT套件提供的功能包含有Histogram、curve fitting、data analysis等数据分析及图表制作功能(请参考下图),另外也提供函数绘图功能,并且支持输出为LaTeX、3D图表,及动态修改图表内容等功能,相当适合于各式数据的处理应用。本文将介绍ROOT安装及其基本功能,希望可以提供读者入门参考。

一、ROOT安装
ROOT可安装于Linux、Mac或Windows等操作系统,因此用户可依自己的使用环境来下载安装ROOT。由于Windows目前只提供测试版,因此本文先以Linux系列的Ubuntu为例介绍其安装步骤,其他操作系统安装步骤可参考ROOT install 网页。Ubuntu安装步骤如下:
- 安装所需套件:
- make:for /usr/bin/make
- cmake3:for /usr/bin/cmake3
- gcc-c++:for for /usr/bin/g++ (ROOT 6 requires g++ 4.8 or clang 3.4; for SLC5/SLC6)
- gcc:for /usr/bin/gcc
- binutils:for /usr/bin/ld
- libX11-devel:for usr/include/X11/Xlib.h and for /usr/lib/libX11.so
- libXpm-devel:for /usr/include/X11/xpm.h and for /usr/lib/libXpm.so
- libXft-devel:for /usr/include/X11/Xft/Xft.h and for /usr/lib/libXft.so
- libXext-devel:for /usr/include/X11/extensions/shape.h and for /usr/lib/libXext.so
- python: (ROOT6 requires version >= 2.7)
- openssl-devel:for /usr/include/openssl/pem.h and /usr/lib/libssl.so and /usr/lib/libcrypto.so
可参考下列指令安装:

2.下载ROOT安装程式,解压缩,并以source指令运行thisroot.sh。
可参考下列指令操作:

上述步骤完成后,在操作系统命令行输入root,即可进入ROOT命令模式,开始使用ROOT。

如要离开ROOT,指令为 .q。

二、ROOT基本功能介绍
接下来我们参考ROOT网站所提供的使用手册来跟大家介绍ROOT的一些基本功能。
(一) 运行C++代码
由于ROOT源自C++,所以使用相同的C++语法即可于ROOT进行运算。当我们进入ROOT命令模式后,你可以输入任何的C++代码,并运行程式。如下面范例,我们输入”cout << ”Hello ROOT!\n””指令,按Enter后,画面即打印输出”Hello ROOT!”。

注意,ROOT不需要使用include指令,ROOT会自动#include几乎所有的标准函数库(包括vector, algorithm, tuple 等等)并自动加入using namespace std。
(二) 运行C++巨集
ROOT亦可运行C++巨集,方便我们运行指令较长的功能。运行巨集的步骤为,
首先我们先利用文字编辑器制作C++巨集并命名存成.c档。注意文件名称需与所命名的函数名称相同,如本例我们需将其取名为MacroName.c。

然后我们可以在ROOT命令模式通过 .x指令来运行 .c巨集文件。

或者我们也可以直接在操作系统命令提示字符下输入下列命令来运行巨集。

(三) 绘制函数图形
接下来我们来看如何使用ROOT绘制函数图形。步骤为:先利用TF1类别先产生函数物件,再利用该物件的Draw函数即可绘制函数图形。请参考如下程式范例。在本例中我们先建立名称为f1的TF1类别物件,参数带入所欲绘制的函数(本例为 sin(x)/x)及其变量x的范围(0,10)。接下来我们就可以使用f1.Draw() 指令来绘制我们的函数图形。

运行后,系统会自动开启另一窗口绘制函数图形,请见下图。

点击窗口左上角的File->Save 即可将图案储存,可存成不同格式,包含.jpg, .pdf或.c等。该文件会存到当前工作目录下。

(四) 绘制实验数据图
ROOT也可以绘制实验数据的关系图。请参考下列程式范例,我们利用TGraphErrors类别建构物件gr,参数代入我们的实验数据文件ExampleData.txt(本例数据格式为四栏数据,分别代表x,y,dx,dy,后两者分别为x,y的误差)。最后再用物件的Draw() 函数即可绘图。

下图为运行结果。

(五) Histograms
接下来我们来介绍制作Histogram图,即数据分布统计图,请参考下面程式范例。在本范例中,我们使用TH1F类别,其中类别名称TH1F中的H即代表Histogram,F代表数据类型为浮点数(float)。接下来我们来看下面代码。在第1-3行我们先利用前面介绍的TF1类别来产生名称为efunc的指数函数,做为后续取乱数的分布机率,在第4行我们宣告TH1F物件h,并设置数据范围在0到5之间,100代表期间包含100 个等分。在第5行,我们利用回圈及efunc.GetRandom() 产出1000个乱数数据当作我们的数据数据,并利用h.Fill() 将该些数据数据代入物件h。最后调用h.Draw()来绘制这些数据的分布统计图。

下图为运行结果。由于本例我们是利用乱数产生数据,所以每次运行的结果会有所不同。

在上例中,图中的数据是由乱数产生的。如果我们想输入真正的实验数据来绘制分布统计图亦可。请参考下面的程式范例。我们假设实验数据是放在文件expo.dat。在本范例中,我们在程式第2-4行利用C++ 的IO指令将数据导入变量x,再利用h.Fill() 将数据输入至TH1F物件h,最后再调用h.Draw() 即可绘制实验数据的分布统计图。

三、结语
ROOT还有提供其他丰富的数据处理与图表绘制功能,其最大的特点在于其特殊的数据结构设计可供处理大量数据,也因此成为高能物理领域在分析粒子碰撞数据时不可或缺的数据处理工具。本文仅就其绘图的基本功能做入门的介绍,读者如果有兴趣,可参考ROOT网站所提供的教程文件,相信一定可以有更大的收获。
参考文献
by 物理系图书室