前言

ROOT 是由 CERN 开发的用于实验大数据处理的框架,主要应用于核物理和高能物理领域。ROOT 主要由 C++ 编写,但较新版本中也提供了 Python 的借口,通过引入pyroot实现。

一般而言,通常在命令行输入root后,通过TBrowser浏览文件;或者使用 C++ 编写数据处理的函数,在 ROOT 中进行调用。而使用 Jupyter 来编写 ROOT 程序在学习和开发阶段较为便利。由于预编译版本的 ROOT 已经绑定了特定 Python 版本,有可能与本机的 Python 版本不匹配,所以通过源代码编译安装的方式能够避免绝大部分的兼容性问题。

安装

本机环境
Ubuntu 20.04.6
Python 3.10.11

目前 ROOT 的最新版本为 6.28,但为了兼容本机上的 Garfield Plus Plus,因此选择 6.26 版本。在 ROOT Releases 页面下载对应版本的安装包。

依赖

ROOT Install Dependencies 查看对应系统版本要求的依赖,对于 Ubuntu 使用一行命令解决必备依赖:

1
2
sudo apt-get install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev \
libxft-dev libxext-dev python libssl-dev

其余推荐依赖按照需求进行安装,我只需要 ROOT 的基础功能,因此没有安装其他依赖,在后续编译过程中可以设置部分编译选项加快速度。此外推荐安装 ccmake 方便后续编译。

编译

解压下载好的安装包,新建与安装包同级的目录 build,进入目录后进行编译安装:

1
2
3
4
tar -zxvf root_v6.26.10.source.tar.gz
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX -DCMAKE_CXX_STANDARD=17 -DCXX_STANDARD_STRING=17 -Ddavix=OFF -Dfftw3=OFF -Dgdml=OFF -Dgfal=OFF -Dmysql=OFF -Doracle=OFF -Dpgsql=OFF -Dpythia6=OFF -Dpythia8=OFF -Dxml=OFF -Dbuiltin_zstd=ON -Dbuiltin_glew=ON -Dbuiltin_gl2ps=ON -Dbuiltin_xrootd=ON -Dbuiltin_ftgl=ON ../root-6.26.10
ccmake .

$INSTALL_PREFIX是需要安装到的目录,CMAKE_CXX_STANDARD根据自己的 gcc 版本和需要来选择,可以通过以下命令查看:

1
2
> gcc -E -dM - </dev/null | grep "STDC_VERSION"
#define __STDC_VERSION__ 201710L

2017 代表支持 c17 标准。ccmake 可以生成一个在命令行的简略界面方便我们对编译选项进行调整。调整完成后根据下方的提示操作,多次按c进行确认直至出现Press [g] ... 的提示,此时可以按g生成相关文件,随后进行编译安装:

1
2
make -j 12
make install -j 12

-j参数后面是使用的线程数,我的计算机有8核16线程,16GB内存。不推荐使用全部线程,因为编译会占用很大内存,可能会导致编译失败,可以根据线程数和内存大小酌情调整。最后修改自己的 shell 配置文件(例如.bashrc.zshrc),在适当位置添加:

1
source $INSTALL_PREFIX/bin/thisroot.sh

添加内核

使用下列命令安装 Python 所需的包:

1
pip install jupyter metakernel

安装后有两种方式可以在 Jupyter 中使用 ROOT:

  1. ROOT-flavored 的 notebook
1
root --notebook
  1. 全功能的 Jupyter Lab(推荐
1
2
cp -r $INSTALL_PREFIX/etc/notebook/kernels/root ~/.local/share/jupyter/kernels
jupyter lab

关于 Jupyter Lab 的相关配置,可以查看 服务与插件

试用

一个在 Jupyter ROOT Block 中绘制直方图的示例:

1
2
3
4
5
TCanvas c;
TH1F h("h","ROOT Histo;X;Y",64,-4,4);
h.FillRandom("gaus");
h.Draw();
c.Draw();
效果图
效果图

问题

  1. WSL 中使用 new TBrowser 将会开启 HTTP 服务而不是窗口[3]
    在家目录(例如 /home/fox)下创建 .rootrc 文件并写入:
1
Browser.Name: TRootBrowser
  1. ROOT 6.28 版本以下使用 Python 3.11 及以上版本编译安装时报错[4,5,6]
1
2
3
[.....]/CPPOverload.cxx:5:10: fatal error: 'code.h' file not found
#include "code.h" // from Python
^~~~~~~~

修改 CPPOverload.cxx 文件,将原本的内容:

1
2
3
4
5
#if PY_VERSION_HEX >= 0x02050000
#include "code.h" // from Python
#else
#include "compile.h" // from Python
#endif

修改为:

1
2
3
4
5
#if PY_VERSION_HEX < 0x02050000
#include "compile.h" // from Python
#elif PY_VERSION_HEX < 0x030b0000
#include "code.h" // from Python
#endif

这是因为 Python 3.11 及以上版本将其移动到了 Include/cpython 中,已经被 Python.h 包含。

参考资料

  1. Building ROOT from source
  2. JupyROOT
  3. TBrowser WSL starts in the web browser
  4. Include “code.h” and Python 3.11
  5. [v6-24][PyROOT] code.h must not be included directly in 3.11
  6. What’s New In Python 3.11
  7. How to use ROOT in a Jupyter notebook