ROOT:从入门到入门 Yusui LI 从一头雾水到雾里看花 ROOT是什么? • CERN制作的一款软件 • 形式:ROOT终端 • 如何使唤ROOT:命令行 • 如何向ROOT布置工作:脚本 • 向ROOT布置工作的语言:C++ 从C++的角度看ROOT • 提供解释C++语言的解释器 • 提供一个“标准ROOT库” • 只要是在ROOT终端下解释/编译,就可以享受ROOT的这些好处 ROOT终端基本命令 • 以 . 开头的ROOT命令,如: .ls 显示ROOT中的信息 .x macro.C 执行文件macro.C .q 退出ROOT .? 帮助 • 以 .! 开头的系统命令 .!ls 显示操作系统当前目录中的信息 脚本 • 解释式:自动调用ROOT自带解释器cint;建议写在一个与文件同 名的函数里 • 运行代码:root –l xxx.C • 运行代码:root –l ‘xxx.C(x)’ 含有参数的函数 • 编译式:需包含头文件与命名空间;(命令是否需要指明链接?) • 运行代码:root –l xxx.C+ • 本质上就是cpp文件 ROOT环境下的C++新约定 • 类型名称 int -> float -> double -> • 类名以T开头 TFile TH1F TRandom • 全局变量名以g开头 gRandom gROOT gStyle Int_t Float_t Double_t TTree gFile … … Reference Guide • https://root.cern.ch/root/html526/ClassIndex.html 从雾里看花到依葫芦画瓢 “数学”函数:定义 • 1个变量的函数类:TF1 TF1 *f1 = new TF1(“f1”,char* function’s_expression_with_x,float lower_bound,float upper_bound) • 2个变量的函数类:TF2 TF2 *f2 = new TF1(“f2”,char* function’s_expression_with_x_y,float lower_bound_x,float upper_bound_x, float lower_bound_y,float upper_bound_y) • 3个变量的函数类:TF3 TF3 *f3 = new TF3(“f3”,char* function’s_expression_with_x_y_z,float lower_bound_x,float upper_bound_x, float lower_bound_y,float upper_bound_y , float lower_bound_z,float upper_bound_z) “数学”函数 • 绘制:function_name->Draw(); • char* function_expression形式:1)C++自带的数学函数;2) ROOT提供的TMath中的函数;3)使用自己定义的函数(声明与 定义的位置?猜测:解释型时定义应位于TF1之前) “数学”函数:含参函数 Double_t myFun(Double_t *x, Double_t *par) { Double_t xx=x[0]; Double_t f=par[0]*exp(-xx/par[1]); return f; } TF1* f1 = new TF1(“f1”, “myFun”, 0., 10., 2); • 参数初始化: f1->SetParameter(0,value); 直方图:定义 • 1个变量的直方图:TH1F TH1F *hist_name = new TH1F(“hist_name”,”hist_title”, num_bins, x_low, x_high); • 2个变量的直方图:TH2F TH2F *hist_name = new TH2F(“hist_name”,”hist_title”, num_bins_x, x_low, x_high, num_bins_y, y_low, y_high); • 3个变量的直方图:TH3F TH3F *hist_name = new TH3F(“hist_name”,”hist_title”, num_bins_x, x_low, x_high, num_bins_y, y_low, y_high, num_bins_z, z_low, z_high); 直方图:操作 • 填充 hist_name->Fill(x); hist_name->Fill(x,y); hist_name->Fill(x,y,z); • 绘制 hist_name->Draw(); 直方图:操作 • 积分: hist_name->Integral(); • 归一化 hist_name->Scale(); • 四则运算 h3->Sumw2();//或TH1::SetDefaultSumw2(); h3->Add(h1,h2,a,b); h3->Divide(h1,h2,a,b); h3->Multiply(h1,h2,a,b); • 更多精细操作,我也还没看懂 画布: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->Print(“myex33.gif”); myC1->SaveAs(“myex33.pdf”); 从依葫芦画瓢到似有所悟 ROOT文件:TFile • 结构、操作手法与Unix目录类似。 • 文件的定义 TFile *file = new TFile(“file.root”, “RECREATE”);//其他可用参数: NEW,CREATE,UPDATE,READ,NET,WEB • 将数据及其处理方式以一种合适的方式存储 TFile:操作 • 全局变量gDirecroty进行文件目 录的操作 • 创建文件即进入该文件 • 打开文件:TFile *_file0 = TFile::Open(“file40.root”) • 写入特定对象:h1->Write() • 切换特定文件:file1->cd() ROOT提供的一种数据结构:TTree Int_t RunID; TTree *t1 = new TTree("t1","test tree"); TBranch *br = t1->Branch("RunID",&RunID,"RunID/I"); • 将不同内容的数据存储在各自的Branch中, TTree:写入 TTree:查看 • t1->GetEntries() • t1->Show(0) • t1->Scan(); • t1->Print(); TTree:快速绘图 叶子:结构体 • 在设置Branch时,Leaflist中各 项用 : 分隔 叶子:类 TChain:串接多组数据 • TChain::Add() 添加.root文件 • TChain::SetBranchStatus() 激活 或反激活某些Branch • 继承了TTree的所有函数 TTree::MakeClass • 将我们写好的TTree自动打包成一个类,并生成相应的头文件与源 文件