1、粒子物理与核物理实验中的数据粒子物理与核物理实验中的数据分析分析xx清华大学第三讲:ROOT在数据分析中的应用(1)1谢谢观赏2019-6-292上讲摘要上讲摘要nC+基本概念 类的定义与实现.nLinux下用g+编译C+程序 g+ -o hello.exe -I ./src/*.cc 当前目录下输出 指定include目录 源文件 可执行文件hello.exe 如-I./include n用makefile进行C+编译 gmake 进行编译 gmake clean 清除编译结果n使用ROOT脚本 root -l hello.C谢谢观赏2019-6-293本讲要点本讲要点n什么是ROOT?n登
2、录ROOT环境和体验中心nROOT的语法简介nROOT的函数,直方图,随机数,文件,散点图 TF1,TH1I,TH1F,TH1D,TRandom(gRandom) TF2,TF3,TH2F,. TFile谢谢观赏2019-6-294什么是 ROOT ?ROOT: Executive Summary. provides a set of OO frameworks with all the functionality needed to handle and analyse large amounts of data in a very efficient way. (摘自)关键字:面向对象的框
3、架、所有功能、海量数据、非常有效结论:很不谦虚!谢谢观赏2019-6-295安装ROOT(1)到ROOT主页下载需要的版本到指定目录。比如要在SLC3系统的/projects/yangzw目录下安装5.16.00版本(注:最新版本的ROOT已经不为SLC3提供预编译版本了,而为SLC4和SLC5提供)cd /projects/$USER (注:对用户yangzw, $USER=yangzw)wgettar zxvf root_v5.16.00.Linux.slc3.gcc3.2.3.tar.gz设置ROOT的环境变量export ROOTSYS=/projects/$USER/rootexpo
4、rt PATH=$ROOTSYS/bin:$PATH export LD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH可以把上面这3行放到$HOME/.login或者.bashrc或者.tcshrc文件中,这样每次登录到Linux系统,系统就自动设置ROOT的环境变量这样,进入linux系统之后,在终端提示行输入: root 或 root -l即可进入ROOT环境。谢谢观赏2019-6-296安装ROOT(2)如果是其它发行版的Linux,首先查看是否ROOT网站上是否有预编译好的程序包,一般情况下,官方提供SLC4和SLC5在各种不同CPU以及不同gc
5、c版本下的二进制包,ROOT官网也提供包括Solaris以及Mac OS X以及Windows下的预编译包。如果没有适合你的操作系统的预编译包,就需要到官网 下载ROOT的源代码,按照安装指南用gmake编译安装。Window用户在官网下载相应的.msi文件直接安装即可。Ubuntu8.10用户可以到下面网页下载5.22.00版本的二进制代码,根据Readme.txt说明安装使用。谢谢观赏2019-6-297安装ROOT(3)实际上,Linux下安装程序的基本套路很简单:1. 如果需要用源码编译 a) 下载源码压缩包 b)解压缩 c)编译 d)设置环境变量(如果需要)2. 如果已有预编译的包
6、a)下载 b)解压缩 c)设置环境变量(如果需要)3. yum/apt-get直接用网络源安装(预编译的包)4. .谢谢观赏2019-6-298登录ROOT环境n运行 rootn退出 root0.qn键入 help 指令,如 root0? root1.ls root2.!lsROOT环境其它常用指令:.L macro.C Load文件macro.C.x macro.C 执行文件macro.C.ls 显示ROOT当前环境的所有信息.! ls 显示Linux系统当前目录的所有信息注:ROOT环境中,ROOT指令都以“.”开头 系统指令都以“.!”开头 谢谢观赏2019-6-299ROOT体验中心(
7、1)在$ROOTSYS/tutorials目录下,有五花八门的例子。以后会经常与这个目录打交道。先尝试一下吧。尝试方法: cd /projects/$USER cp -r $ROOTSYS/tutorials . (注意不要把这个.漏掉了) cd tutorials 然后找个感兴趣的目录/文件, 执行ROOT脚本,比如 cd roofit root -l RoofitDemo.C小技巧提示:根据关键字xxxx从tuotorials的例子中寻找线索 grep -sirn xxxx $ROOTSYS/tutorials比如找随机数用法:grep -sirn random $ROOTSYS/tuto
8、rialsRoofit示例谢谢观赏2019-6-2910ROOT体验中心(2)还可以在ROOT网站上看到一些ROOT图片:当然,ROOT的功能不只是做图,它不是一个作图工具。跟数据分析有关的东西,基本都是ROOT的擅长;跟物理有关的很多东西,ROOT基本都可以做得很好: 事例产生、探测器模拟、事例重建、数据采集、数据分析谢谢观赏2019-6-2911ROOT体验中心(3-1)日本超级神冈中微子实验事例显示(by zhanghb) 超大的水池,内外装满了光电倍增管,1万多个谢谢观赏2019-6-2912ROOT体验中心(3-2)仅显示被击中的光电倍增管谢谢观赏2019-6-2913ROOT体验中
9、心(3-3)平面展开显示谢谢观赏2019-6-2914ROOT体验中心(3-4)平面展开,鼠标缩放,显示鼠标位置光电倍增管信息谢谢观赏2019-6-2915ROOT语法(1)基本信息nROOT使用C+语法 一段C+程序可以直接在ROOT环境运行n数据类型重定义 int Int_t float Float_t double Double_t .nROOT的类都以T开头 如TFile, TH1F, TTree, .n详细规定参阅ROOT手册(5.21版)第18-20页,关于Convention和Global Variables部分。n可以直接在ROOT环境中运行macro文件(自动调用cint编译
10、器),也可以在makefile中设置好相关参数用g+编译得到可执行文件运行。谢谢观赏2019-6-2916ROOT语法(2)直方图类ROOT中有众多已经定义好的类可供使用,比如直方图家族谢谢观赏2019-6-2917ROOT语法(2)其它类其它常用类数学函数:TF1, TF2, TF3.图 形:TGraph, TGraphErrors, TGraph2D,.文 件:TFile画 布:TCanvas, TPad, .随 机 数:TRandom,TRandom1,TRandom2,TRandom3 周期 109 10171 1026 106000速度(ns/call) 34 242 37 45 比
11、如跟数据结构和分析有关的: TTree, TChain, .参见 (谨代表*邀请各位光临敝舍。 注:*=yangzw)还有很多全局函数,多数以g开头,如:gRandom, gROOT, gStyle, gPad, gEnv, gFile.速度与速度与CPU和编译器有关和编译器有关谢谢观赏2019-6-2918ROOT语法(3)随机数gRandom是指向当前随机数产生子的指针,该产生子默认为TRandom3对象。(为什么看TRandom?因为TRandom1/2/3都继承自TRandom)gRandom-Binomial(ntot, p): 二项分布gRandom-BreiWigner(mean
12、, gamma) Breit-Wigner分布gRandom-Exp(tau) 指数分布gRandom-Gaus(mean,sigma) 高斯分布gRandom-Integer(imax) (0,imax-1)随机整数gRandom-Landau(mean,sigma) Landau分布gRandom-Poisson(mean) 泊松分布(返回int)gRandom-PoissonD(mean) 泊松分布(返回double)gRandom-Rndm() (0,1均匀分布gRandom-Uniform(x1,x2) (x1,x2均匀分布.思考:什么情况下需要PoissonD(mean)?谢谢观赏
13、2019-6-2919ROOT脚本文件示例(1):Macro文件/home/yangzw/examples/Lec3/ex31.C用花括号括起来,后缀名一般用”.C” cout Hello ROOT endl; int Num=5; for (int i=0;iNum;i+) cout i= i Fit(gaus); /对直方图进行高斯拟合对直方图进行高斯拟合TF1 *f1=new TF1(f1,gaus,-5,5);谢谢观赏2019-6-2923数学函数的定义方式(3)ROOT中自定义含未知参数的数学函数q利用c+数学表达式TF1* f1 = new TF1(f1,0*sin(1*x)/x,
14、0,10);q利用c+数学表达式以及ROOT预定义函数TF1* f1 = new TF1(f1,gaus(0)+3*x,0,3);q利用自定义的c+数学函数Double_t myFun(Double_t *x, Double_t *par) Double_t xx=x0; Double_t f=par0*exp(-xx/par1); return f;TF1* f1 = new TF1(f1,myFun,0,10,2);指定参数数目指定参数数目定义了含参的定义了含参的TF1对象对象f1之后,可以设定参数初值,比如之后,可以设定参数初值,比如f1-SetParameter(0,value); /
15、为第为第0个参数设初值为个参数设初值为value谢谢观赏2019-6-2924ROOT中统计直方图q定制一维直方图TH1F *hist_name = new TH1F(“hist_name”,”hist_title”,num_bins,x_low,x_high);q定制二维图TH2F *hist_name = new TH2F(“hist_name”,”hist_title”,num_bins_x,x_low,x_high,num_bins_y,y_low,y_high);q定制三维图TH3F *hist_name = new TH3F(“hist_name”,”hist_title”,num
16、_bins_x,x_low,x_high,num_bins_y,y_low,y_high,num_bins_z,z_low,z_high);q填充统计图hist_name.Fill(x); hist_name.Fill(x,y);Hist_name.Fill(x,y,z);绘图:绘图:root0hist_name.Draw();谢谢观赏2019-6-2925ROOT脚本文件示例(2):数学函数定义/home/yangzw/examples/Lec3/ex32.C/a simple ROOT macro, ex32.C/说明ROOT中数学函数的使用,如TF1void ex32() /定义函数 T
17、F1 *f1 = new TF1(func1,sin(x)/x,0,10); f1-Draw();/画出函数图像 TF1 *f2 = new TF1(func1,“TMath:Gaus(x,0,1),0,10); f2-SetLineColor(2);/设置颜色为红色 f2-Draw(“same”);/用参数”same”,把f1,f2画在同一个画布上函数名称函数表达式函数区间提示:提示:1)脚本中脚本中void函数的名字必须与文件名相同函数的名字必须与文件名相同(如如ex32) 2)ROOT环境中定义类指针之后,如环境中定义类指针之后,如TF1 *f1,之后,之后 输入输入“f1-”,然后按一
18、下,然后按一下Tab键,可以自动列出键,可以自动列出 该类对象的成员函数和成员变量该类对象的成员函数和成员变量运行:在命令提示行下 root -l ex32.C 或在ROOT环境下 .x ex32.C谢谢观赏2019-6-2926ROOT脚本文件示例(3): 画布,保存图片/home/yangzw/examples/Lec3/ex33.C/说明ROOT画布的使用,TCanvas,保存图形void ex33() /define a function sin(x)/x TF1 *f1 = new TF1(func1,sin(x)/x,0,10); /define a Gaussian functi
19、on, mean=0, sigma=1 TF1 *f2 = new TF1(func2,Gaus(x,0,1),-3,3); /定义一个画布定义一个画布, TCanvas TCanvas *myC1 = new TCanvas(myC1,A Canvas,10,10,800,600); /将画布分成两部分将画布分成两部分 myC1-Divide(2,1); myC1-cd(1); /进入第一部分进入第一部分 f1-Draw(); myC1-cd(2); /进入第二部分进入第二部分 f2-Draw(); myC1-SaveAs(“myex33.gif”); myC1-SaveAs(“myex33
20、.eps”); 运行:在命令提示行下 root -l ex33.C 或在ROOT环境下 root0 .x ex33.C名称描述像素坐标 (10,10):左上角 (800,600):右下角谢谢观赏2019-6-2927ROOT脚本文件示例(4a):直方图,随机数/home/yangzw/examples/Lec3/ex34a.C/说明ROOT直方图、随机数的使用,如TH1F, gRandomvoid ex34a() const Int_t NEntry = 10000 ; /创建一个root文件 TFile *file = new TFile(“hist1.root”,”RECREATE”);
21、TH1F *h1 = new TH1F(h1,A simple histo,100,0,1); /填充直方图10000次,用(0,1)均匀分布 for (int i=0;iFill( gRandom-Uniform() ); h1-Draw(); h1-GetYaxis()-SetRangeUser(0,150); h1-GetXaxis()-SetTitle(x); h1-GetXaxis()-CenterTitle(); file-cd(); /进入文件file h1-Write();/将h1写入文件执行的时候只需要在命令提示行 root -l ex34a.C或者进入ROOT环境之后,运行
22、 .x ex34a.C名称调用均匀分布Uniform(),其它:Landau(mean,sigma); Binomial(ntot,prob); Poisson(mean); Exp(tau); BreitWigner (mean,sigma);描述No. of Bin区间谢谢观赏2019-6-2928ROOT脚本文件示例(4b):随机数-舍选法/home/yangzw/examples/Lec3/ex34b.C执行的时候只需要在命令提示行 root -l ex34b.C或者进入ROOT环境之后,运行 .x ex34b.Cfloat mypdf( float xMin, float xMax
23、) float fmax = 2.; /寻找分布函数最大值寻找分布函数最大值 while (1) float r = gRandom-Uniform(xMin,xMax); /1st随机数随机数(xMin,xMax) float z = 2.*r/xMax/xMax; /期待的分布函数期待的分布函数 float u = gRandom-Uniform(0.,fmax); /2nd随机数随机数(0,fmax) if(uDelete(*;*); Float_t xMin = 0.0 ; Float_t xMax = 1.0 ; TH1F *hX = new TH1F(hX,sawtooth p.d
24、.f.,100,xMin,xMax); gRandom-SetSeed(); for (int i=0;iFill(x); hX-Draw(e);谢谢观赏2019-6-2929ROOT脚本文件示例(4c):随机数/home/yangzw/examples/Lec3/ex34c.C也可以利用类TF1、TF2或TF3自定义函数,通过调用GetRandom()函数获得服从自定义函数分布的随机数:TF1 *f1 = new TF1(f1,abs(sin(x)/x)*sqrt(x),0,10); double r = f1-GetRandom(); void ex34c() /定义直方图定义直方图 TH
25、1F *h1 = new TH1F(h1,histogram from TF1,100,0,10); /定义定义TF1函数函数 TF1 *f1 = new TF1(f1,abs(sin(x)/x)*sqrt(x),0,10); for (int i=0;iGetRandom(); /按照按照f1分布产生随机数分布产生随机数 h1-Fill(r); h1-Draw();执行时只需要在命令提示行 root -l ex34c.C或进入ROOT环境后,运行 .x ex34c.C感兴趣者可以看看TF1的GetRandom()函数是如何实现的。实际上,是把SDA(3.5)-(3.6)进行数值积分得到x(r
26、).当函数f1有陡峰时,要小心!这时可能需要改变一些参数。谢谢观赏2019-6-2930X轴的名称轴的名称直方图统计信息事例数:Entries均 值:Mean方 差:RMS参见ROOT手册37页“Statistics Display”直方图的描述打开已有的root文件,如hist1.root:终端提示行下: root l hist1.rootROOT环境下: TFile f1(“hist1.root”); .ls h1-Draw();直方图、打开root文件谢谢观赏2019-6-2931/2维直方图TH2F,散点图,散点图的协方差void ex35() const Int_t NEntry =
27、 10000 ; TH2F *hXY = new TH2F(hXY,2d histo,100,0,1,100,-3,3); for (int i=0;iRndm() ; float y = gRandom-Gaus(0,1) ; hXY-Fill(x,y) ; /填充2维直方图 hXY-Draw(); /2维直方图的散点图 hXY-GetXaxis()-SetTitle(X: Uniform ); hXY-GetYaxis()-SetTitle(Y: Gaussian); Float_t covar = hXY-GetCovariance(); /协方差 cout Covariance = c
28、ovar Gaus(mean,sigma)产生。产生。 使用使用Draw()函数的函数的same参数可以在一个画板上画多个图。参数可以在一个画板上画多个图。2. 写一个写一个ROOT脚本,脚本,ex3_pdf.C,作,作4个直方图,分别产生个直方图,分别产生10000事例的事例的Gauss,Poisson,Binomial,Landau分布。创建画布,分成分布。创建画布,分成2*2块,将块,将4个直方图画在画布的个直方图画在画布的1-4部分。部分。注意不同分布的参数选择合理性,比如注意不同分布的参数选择合理性,比如Binomial(ntot,p), ntot0, 0pRndm()产生均匀分布。
29、产生均匀分布。3. 将练习将练习2中产生的直方图储存到中产生的直方图储存到mypdf.root文件中。文件中。 将所画直方图的将所画直方图的x/y轴添加上名称,不同分布用不同颜色。轴添加上名称,不同分布用不同颜色。 将画布存成将画布存成eps文件和文件和gif文件文件4. 将例题将例题ex35.C中的事例数改为中的事例数改为1000,屏幕打印出关联系数。,屏幕打印出关联系数。5. cp r $ROOTSYS/tutorials /projects/$USER 运行以下几个文件,查看运行以下几个文件,查看ROOT直方图的常用功能如何实现直方图的常用功能如何实现 twoscales.C, transpad.C, multicolor.C, logscales.C, hstack.C6. 阅读阅读ROOT手册第二章以及第三章手册第二章以及第三章(直方图直方图) 熟悉熟悉ROOT语法惯例,直方图制作的各种参数,随机数的使用语法惯例,直方图制作的各种参数,随机数的使用谢谢观赏2019-6-2934参考资料nROOT手册第2章,第3章n$ROOTSYS/tutorials中的各个例子 谢谢观赏2019-6-2935谢谢观赏2019-6-29