ROOT(CERN) 霸屏,CMake 辅助,PyROOT 引领未来:完美数据分析环境配置攻略!

发布时间:2024年01月06日

前言

在数据分析领域,ROOT 库是一个强大的工具。本文将详细介绍在 Windows 和 Ubuntu 平台上安装和配置 ROOT 软件,并利用 pyroot 和 uproot 库进行 ROOT 文件的分析。

前面写过关于 ROOT 的安装教程,但是使用起来都不是特别的方便,因为我对 python 的使用相对熟悉,但是 C++比较陌生,所以前面一直使用的是在 ubuntu 平台的 pyroot,并且是通过 vscode 连接 wsl 的 ubuntu 子系统进行代码编辑(jupyter),但是 pyroot 的运行效率太慢,在处理大的 root 文件在循环处理太慢,后来发现了uproot这个分析 root 文件的纯 python 写的库,再加上numba(python 加速库)进行加速如有神助分析起来特别快,并且没有了平台限制。

安装 ROOT 软件

这里重新说一下我安装方法,之前的也可以,看个人需求了。

首先,从ROOT 官方网站下载预编译软件包。

其次但是很重要的是使用 windows 的powershell(这是一个终端,目前 win11/10 都支持),ubuntu 我使用的是zsh

ubuntu 配置

安装 ROOT 软件

  1. 在 Windows 上安装 WSL 并配置 Ubuntu 子系统(详细配置教程可自行搜索)。

  2. 打开 WSL 终端,创建并进入一个新的文件夹:

mkdir ROOT && cd ROOT
  1. 下载并解压 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
  1. 将 ROOT 的环境变量写入.bashrc
# 写入环境变量
echo "source /path/to/ROOT/root/bin/thisroot.sh" >> ~/.bashrc
# 重新加载~/.bashrc文件
source ~/.bashrc

搭建 pyroot 环境

  1. 查看 pyroot 支持的 Python 版本:

输出如下,可以看到刚刚好

#`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.
>>>
  1. 设置镜像源
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
pip3 config set global.trusted-host mirrors.aliyun.com
  1. 安装 Jupyter Lab 及相关库:
pip3 install jupyter jupyterlab notebook metakernel jupyterlab-language-pack-zh-CN jupyterlab-code-formatter black isort jupyter lab
  1. 使用 VSCode 连接 WSL 的 Jupyter Lab,以获得代码提示功能。
    这里就不过多赘述,自行搜索

windows 配置

安装 ROOT 软件

  1. 下载预编译文件
    下载预编译文件

  2. 解压文件

解压文件

  1. 把 bin 文件夹路径加入环境变量 path 中

我的 bin 路径是,D:\ROOT\root_v6.30.02.win64.vc17\bin

bin文件夹路径加入环境变量path

  1. 设置 ROOT 的软件包的环境变量和路径

多个脚本文件

可以看到有多个脚本文件,它们的作用都是一样的。以为我使用的是 powershell,这里就使用thisroot.ps1文件

  • 打开 powershell 输入notepad $PROFILE,然后会打开下面这样一个文件只需要加入. "path\to\thisroot.ps1"就可以,其它的不需要管,那是我的终端美化操作。

  • 在 powershell 终端输入. $PROFILE重新加载脚本

pyroot 配置

经过测试pyroot在 win 上的 jupyter 支持不够好,只能在 python 解释器中使用,所以建议使用上面的 wsl 方法。

  1. 查询适配 python 版本
# powershell 终端运行root-config --python-version命令
root-config --python-version
# 下面是终端输出,代表支持python3.8.10版本
 3.8.10
  1. 安装对应 python 版本

可以直接安装 python 版本或者使用 conda 安装对应版本

# conda 安装python=3.8命令
conda create -n pyroot python=3.8
  1. 测试

下面这样情况代表成功。

  1. 运行代码示例
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() # 这个代码不能少

下面是代码运行结果
运行结果

cmake 构建编译

终端运行代码

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();

运行结果:

运行结果

Clion 编写代码与运行

1. 配置编译器

  1. 配置工具链:
    设置 -> 构建、执行、部署 -> 工具链

配置工具链

  1. 配置 cmake:
    上面设置好工具链后,就可以设置 cmake 使用的工具链了。

(这里我 wsl 子系统与 win 都设置好了,所有有两个工具链)

cmake 设置

2. 便编写 CMakeLists.txt 内容

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 进行编辑,非常的方便。

END

好了,本期到此结束,我们下期再见!

可以关注俺的vx公主号: Spiders and AI

文章来源:https://blog.csdn.net/weixin_45886778/article/details/135427474
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。