在数据分析领域,ROOT 库是一个强大的工具。本文将详细介绍在 Windows 和 Ubuntu 平台上安装和配置 ROOT 软件,并利用 pyroot 和 uproot 库进行 ROOT 文件的分析。
前面写过关于 ROOT 的安装教程,但是使用起来都不是特别的方便,因为我对 python 的使用相对熟悉,但是 C++比较陌生,所以前面一直使用的是在 ubuntu 平台的 pyroot,并且是通过 vscode 连接 wsl 的 ubuntu 子系统进行代码编辑(jupyter),但是 pyroot 的运行效率太慢,在处理大的 root 文件在循环处理太慢,后来发现了uproot
这个分析 root 文件的纯 python 写的库,再加上numba
(python 加速库)进行加速如有神助分析起来特别快,并且没有了平台限制。
这里重新说一下我安装方法,之前的也可以,看个人需求了。
首先,从ROOT 官方网站下载预编译软件包。
其次但是很重要的是使用 windows 的powershell
(这是一个终端,目前 win11/10 都支持),ubuntu 我使用的是zsh
。
在 Windows 上安装 WSL 并配置 Ubuntu 子系统(详细配置教程可自行搜索)。
打开 WSL 终端,创建并进入一个新的文件夹:
mkdir ROOT && cd ROOT
复制最新的对应 linux 系统的 ROOT 链接(这里我的是 ubuntu)
# wget https://root.cern/download/root_v6.30.01.Linux-ubuntu22-x86_64-gcc11.4.tar.gz
wget 复制的链接
# 解压
tar -xzvf root_xxx.tar.gz
.bashrc
:# 写入环境变量
echo "source /path/to/ROOT/root/bin/thisroot.sh" >> ~/.bashrc
# 重新加载~/.bashrc文件
source ~/.bashrc
输出如下,可以看到刚刚好
#`root-config --python3-version`是查询支持的版本
# 3.10.12为输出
? ~ root-config --python3-version
3.10.12
# python3 是运行python3,下面是会显示现在python3版本
? ~ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
pip3 config set global.trusted-host mirrors.aliyun.com
pip3 install jupyter jupyterlab notebook metakernel jupyterlab-language-pack-zh-CN jupyterlab-code-formatter black isort jupyter lab
下载预编译文件
解压文件
我的 bin 路径是,D:\ROOT\root_v6.30.02.win64.vc17\bin
可以看到有多个脚本文件,它们的作用都是一样的。以为我使用的是 powershell,这里就使用thisroot.ps1
文件
notepad $PROFILE
,然后会打开下面这样一个文件只需要加入. "path\to\thisroot.ps1"
就可以,其它的不需要管,那是我的终端美化操作。. $PROFILE
重新加载脚本经过测试pyroot
在 win 上的 jupyter 支持不够好,只能在 python 解释器中使用,所以建议使用上面的 wsl 方法。
# powershell 终端运行root-config --python-version命令
root-config --python-version
# 下面是终端输出,代表支持python3.8.10版本
3.8.10
可以直接安装 python 版本或者使用 conda 安装对应版本
# conda 安装python=3.8命令
conda create -n pyroot python=3.8
下面这样情况代表成功。
from ROOT import (
TH1D,
TCanvas,
TApplication,
)
app = TApplication("myapp", 0, 0) # 这个代码不能少
# 创建一个叫c1的画布,标题为Histograms Exmple,画布宽600,高900
c1 = TCanvas("c1", "Histograms Exmple", 800, 600)
# 创建一个叫h1d1,标题为TH1D Exmple,把[-10,10]区间分为200个小区间的直方图
h1d1 = TH1D("h1d1", "TH1D Exmple", 200, -10, 10)
# FillRandom 用于高斯分布、泊松分布等填充。
h1d1.FillRandom("gaus", 10000) # 使用gaus,并填充10000个数据
h1d1.Draw()
c1.Draw()
app.Run() # 这个代码不能少
下面是代码运行结果
windows推荐powershell,linux可以使用zsh或者原生终端
首先运行下列代码:
// Create a ROOT canvas
TCanvas *c1 = new TCanvas("c1", "Canvas", 800, 600);
// Create a histogram
TH1D *h1 = new TH1D("h1", "Random Numbers Histogram", 10, -5, 5);
// Create a TRandom3 generator
TRandom3 rndgen;
// Fill the histogram with random numbers
h1->FillRandom("gaus", 10000);
// Draw the histogram
h1->Draw();
// Draw the canvas
c1->Draw();
运行结果:
设置 -> 构建、执行、部署 -> 工具链
(这里我 wsl 子系统与 win 都设置好了,所有有两个工具链)
cmake_minimum_required(VERSION 3.16...3.21)
project(analy-root-file)
# 设置可执行文件的名称
set(EXECUTABLE_NAME "main")
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# 设置引用的库路径已经通过 thisroot.ps1/sh 设置好了,如果没有设置,需要手动配置
## 在 Linux 下设置 ROOT 路径
#if(UNIX)
# set(ROOT_INCLUDE_DIRS "/root/ROOT/root/include")
# set(CMAKE_PREFIX_PATH "/root/ROOT/root")
#endif()
#
## 在 Windows 下设置 ROOT 路径
#if(WIN32)
# set(ROOT_INCLUDE_DIRS "D:/ROOT/root_v6.30.02.win64.vc17/include")
# set(CMAKE_PREFIX_PATH "D:/ROOT/root_v6.30.02.win64.vc17")
#endif()
# 查找 ROOT
find_package(ROOT REQUIRED COMPONENTS RIO Tree Hist)
#include_directories(${ROOT_INCLUDE_DIRS})
# 添加可执行文件
add_executable(${EXECUTABLE_NAME} main.cc)
# 链接 ROOT 库
target_link_libraries(${EXECUTABLE_NAME} PUBLIC
ROOT::RIO
ROOT::Tree
ROOT::Hist
ROOT::Core
ROOT::Gpad
ROOT::Graf3d
ROOT::Graf
ROOT::Hist
ROOT::Imt
ROOT::MathCore
ROOT::Matrix
ROOT::Net
ROOT::Physics
ROOT::Postscript
ROOT::RIO
ROOT::ROOTDataFrame
ROOT::ROOTVecOps
ROOT::Rint
ROOT::Thread
ROOT::TreePlayer
ROOT::Tree
)
# 并行处理,win不支持
if(UNIX)
target_link_libraries(main PUBLIC ROOT::MultiProc)
endif()
编写代码:
#include <TCanvas.h>
#include <TH1.h>
#include <TRandom3.h>
#include <TSystem.h>
#include <iostream>
#include <TApplication.h>
using namespace std;
int main() {
TApplication app("myapp", 0, 0);
// Create a ROOT canvas
TCanvas *c1 = new TCanvas("c1", "Canvas", 800, 600);
// Create a histogram
TH1D *h1 = new TH1D("h1", "Random Numbers Histogram", 10, -5, 5);
// Create a TRandom3 generator
TRandom3 rndgen;
// Fill the histogram with random numbers
h1->FillRandom("gaus", 10000);
// Draw the histogram
h1->Draw();
// Draw the canvas
c1->Draw();
app.Run();
// Clean up
delete c1;
delete h1;
cout << "Hello, World!" << endl;
return 0;
}
运行代码:
确保以下 3 行代码存在,以确保图形能够正确显示:
#include <TApplication.h>
TApplication app("myapp", 0, 0);
app.Run();
如果没有上面这 3 行代码,当使用 Clion 运行时会发现,仅仅会输出hello world!
,但是就是没有绘制的图形。
以上就是我目前使用的整个软件的搭建方法。
如果是想用 C++写代码,推荐使用 cmake 的方法,这样有代码提示,查看源码的优点。如果使用 pyroot,不建议使用 ROOT 的官方绑定库,推荐使用 uproot 库,结合 numba 库进行加速,使用 jupyter lar 进行编辑,非常的方便。
好了,本期到此结束,我们下期再见!
可以关注俺的vx公主号: Spiders and AI
。