CERN-ROOT入门--创建一个直方图

其实很奇怪,我应该从安装root讲起,但是因为不同的操作系统安装真的很不一样,我觉得我讲不清楚(特别是Mac,因为没有),对于新人想学习CERN ROOT,最好的方式就是直接搞WSL,然后使用VSCode用wsl的插件,这样最方便,因为root是要使用C++编译的,终端少不了,既然都搞C++了,Linux环境是必须要用的,不管是在服务器里面跑,还是在本地测试,都需要一个Linux环境,对于我来说,使用Visual Studio配环境,然后在Windows里面安装ROOT,然后再搞一个整体的环境跑代码,有点复杂喵。

详细解释就是,首先,你得先搞一个WSL2,这个东西可以看作远程启动了一个Linux的机器,只不过想要存储和运行都是要自己本地的资源,对于Linux入门非常友好,安装WSL也是有微软的官方教程,[https://learn.microsoft.com/zh-cn/windows/wsl/install](如何使用 WSL 在 Windows 上安装 Linux),当然各个机器都有各个机器的情况,并非你按照这个教程就可以搞出来wsl,万一你的电脑没开虚拟化,没开什么设置(悲),那你就得自己问问GPT或者找找CSDN的教程了,当然这些也不是问题。

关于wsl的分发版的安装,我没有做太多尝试,仅仅局限于Ubuntu-22.04,直接在微软商店下载的,比较方便,之后如果没什么意外的话,就可以顺利安装,之后就可以在cmd里面输入与wsl,你就来到了一个奇怪的文件夹下面,之后的事情就是Linux的内容了,但我们不管这些,直接cd回到home文件夹,然后狠狠的在这里创建你的工作文件夹,然后做一些项目,这里就要开始使用VSCode的远程连接插件了,直接在插件商店里面下载就可以。

然后你会发现你的VSCode变成这样子,左边多了一个选项,点进去之后就是你的wsl安装的分发版,再点击那个箭头,VSCode就会自动连接到wsl的工作区,现在你可以在这里创建文件

像这样,我创建了一个名字叫做firsr_root.C的文件,我可以在VSCode里面编辑这个文件,比如现在,我可以展示我的C++功底,打印神秘的hello world!!!

至少对于当时第一次接触这个插件的我来说,这个还是满炫酷的,至少比vim的界面要好操作,好编辑,而且还有高亮,现在发现vim还是要学就是了(悲),至少对于初学者来说,我们可以很好的编辑我们的文件,写写代码。

那么怎么运行这个文件呢?安装g++什么的就不多讲了,想要安装ROOT的话必须要的依赖就是C++,现在我们要运行它,我们可以利用VSCode的工作区,直接打开WSL的终端

当然如果你的终端不是很熟练,然后只是想要运行代码,可能你的代码文件并不在home文件夹下,那么你需要cd到自己的文件所在的文件夹,可以考虑右键目标文件或者文件夹

好的,这样你就看到一个终端出现在下面的位置

OK,现在只需要g++一下我们的文件,就大功告成了。

哈哈哈哈,VSCode还是很方便的,现在我们来讲讲如何使用上面提到的东西来运行root代码,前文已经说过,安装root我默认读者已经安装好了(其实再Linux里面安装还是非常简单的),root代码可以是一个C++的项目,也可以仅仅是一个模块(Macro 宏),宏的定义我也不是很清楚,对我来说更像是一个模块的名字,我们只需要知道怎么运行宏就可以了。
直方图是ROOT里面的最基本的对象,如果不知道直方图是什么的话,没关系,后面我们会看到一些和直方图性质有关的操作。

定义一个直方图变量,可以有两种操作

TH1D *h1 = new TH1D("h1","My First Histogram",20,-4,4);

或者

TH1D h1("h1","My First Histogram",20,-4,4));

()之中,是分别定义了(machine name,display name,nbins,xmin,xmax),一目了然喵,关于这个bin的数目,其实就是把横轴均匀的分开,分成长度相同的20个bin,还有就是machine name以及display name的讨论,machine name就是给machine识别的名字,如果你希望在别的地方引用到这个直方图,那么你得用machine name告诉电脑,display name就是画图的时候用于展示的名字,这样还是非常方便的,因为display name有时候过于复杂,影响代码美观。

这两种定义方式也带来了使用的不相同,比如第一种方式其实是定义了一个指针,因此要到处☞,所以操作一般是->,第二个则本身就是一个对象,所有的操作都是它本身的操作罢了,所以是.
举个粒子,我们希望把这两个直方图画出来,则是

TH1D *h1 = new TH1D("h1","My First Histogram",20,-4,4);
h1->Draw();

以及

TH1D h1("h1","My First Histogram",20,-4,4);
h1.Draw();

咋一看似乎只有使用上不同而已,似乎没有什么本质的区别?目前来说,可以这么理解,我们目前就这样记住。
好的,我们已经创建了一个直方图变量(我将使用第一个方式进行演示),现在我们可以直接画出来。

我们的代码已经敲到VSCode里面了,非常的顺利,在这里我们定义了一个与文件同名的函数,这个就是宏,因为它与文件一个名字,我们可以在终端里面用非常简单的方法运行这个宏

运行结果:

是不是非常简洁?比起g++ -o然后./要方便很多,都是因为我们定义了一个与文件同名的函数,只要root加这个文件名,我们就可以运行它,至于宏到底是什么?管他呢,我们现在掌握了一个运行root代码的方法,那就是编写一个函数,与文件同名,写好之后直接root它,很方便,同时我们也不需要main函数,因为在运行root的命令时,root程序会自己把很多内容补上。

关于宏的讨论就到此,我们来看看结果吧,我们生成了一个什么都没有的一个窗口,只有统计表和框架,但是我们可以发现,我们的display name就在框架中"My First Histogram",而且检查一下横轴,也与我们的定义一致,我们也可以自己再做一些修改来更加理解这个定义中的这些参数的作用。

本文仅仅讲如何创建一个直方图,至于如何在里面填充数据,下文再说(因为讲了太多的VSCode使用)

posted @ 2025-04-11 01:53  Lcszjie  阅读(160)  评论(0)    收藏  举报