粒子物理与核物理实验中的数据分析课件_第1页
粒子物理与核物理实验中的数据分析课件_第2页
粒子物理与核物理实验中的数据分析课件_第3页
粒子物理与核物理实验中的数据分析课件_第4页
粒子物理与核物理实验中的数据分析课件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本讲要点什么是ROOT登录ROOT环境和体验中心ROOT的语法简介ROOT的函数,直方图,随机数,文件,散点图TTree的定义、填充、保存、读取及查看直方图加减乘除运算、归一及拟合第一页1第二页,共57页。什么是

ROOT?ROOT:ExecutiveSummary...providesasetofOOframeworkswithall

thefunctionalityneededtohandleandanalyselargeamountsofdatainavery

efficientway....(摘自)关键字:面向对象的框架、所有功能、海量数据、非常有效第二页2第三页,共57页。安装ROOTubuntu14.04虚拟机已经安装并设置好了ROOT!如果没有使用虚拟机,且尚未安装ROOT:首先查看ROOT网站上是否有相应操作系统(或Linux发行版)及编译器的预编译好的程序包,有的话,直接下载解压缩到你想要的安装目录下,比如/projects/soft/ext/root如果没有适合你的操作系统的预编译包,就需要到官网下载ROOT的源代码,按照安装指南编译安装设置ROOT的环境变量(bash)

exportROOTSYS=/projects/soft/ext/root

exportPATH=$ROOTSYS/bin:$PATH

exportLD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH可以把上面这3行放到~/.login或者~/.bashrc文件中,这样每次登录到Linux系统,系统就自动设置ROOT的环境变量

第三页3第四页,共57页。登录ROOT环境运行>root[-l]退出root[0].q键入help指令,如

root[0]?

root[1].ls

root[2].!lsROOT环境其它常用指令:.Lmacro.CLoad文件macro.C.xmacro.C执行文件macro.C.ls显示ROOT当前环境的所有信息.!ls显示Linux系统当前目录的所有信息注:ROOT环境中,ROOT指令都以“.”开头系统指令都以“.!”开头

第四页4第五页,共57页。ROOT体验中心(1)在$ROOTSYS/tutorials目录下,有五花八门的例子。以后会经常与这个目录打交道。先尝试一下吧。尝试方法:

>cd/workdir/root

>cp-r$ROOTSYS/tutorials.(注意不要把这个"."漏掉了)>cdtutorials

然后找个感兴趣的目录/文件,执行ROOT脚本,比如

>cdroofit>root-lrf607_fitresult.C小技巧提示:根据关键字"xxxx"从tuotorials的例子中寻找线索grep-sirn"xxxx"$ROOTSYS/tutorials比如找随机数用法:grep-sirn"random"$ROOTSYS/tutorials第五页5第六页,共57页。ROOT体验中心(2)还可以在ROOT网站上看到一些ROOT图片:当然,ROOT的功能不只是做图,它不是一个作图工具。跟数据分析有关的东西,基本都是ROOT的擅长;跟物理有关的很多东西,ROOT基本都可以做得很好:事例产生、探测器模拟、事例重建、数据采集、数据分析第六页6第七页,共57页。ROOT参考资料ROOT官方网站ROOT手册(UsersGuide)(ver5.34):ROOTPrimer(ver5.34):

ROOTReferenceguide(ver5.34):

$ROOTSYS/tutorials

搜索引擎第七页7第八页,共57页。下载本讲例子到本地计算机cdworkdir/rootwget/~zhuxl/weihai/ppt/rootexamples.tgztarzxvfrootexamples.tgzcdexamplesexportEXAMPLEDIR=`pwd`本讲所有例题及练习题相关文件都在$EXAMPLEDIR目录下。第八页8第九页,共57页。ROOT语法(1)—基本信息ROOT使用C++语法一段C++程序可以直接在ROOT环境运行数据类型重定义

intInt_t

float

Float_tdoubleDouble_t

......ROOT的类都以T开头如TFile,TH1F,TTree,...详细规定参阅ROOT手册第二章关于Convention和GlobalVariables部分。可以直接在ROOT环境中运行macro文件(自动调用cint编译器),也可以在makefile中设置好相关参数用g++编译得到可执行文件运行。第九页9第十页,共57页。ROOT语法(2)—直方图类ROOT中有众多已经定义好的类可供使用,比如直方图家族第十页10第十一页,共57页。ROOT语法(2)—其它类其它常用类数学函数:TF1,TF2,TF3...图形:TGraph,TGraphErrors,TGraph2D,...文件:TFile画布:TCanvas,TPad,...随机数:TRandom,TRandom1,TRandom2,TRandom3周期109101711026106000速度(ns/call)342423745

比如跟数据结构和分析有关的:

TTree,TChain,...参见

还有很多全局变量,多数以g开头,如:gRandom,gROOT,gStyle,gPad,gEnv,gFile...速度与CPU和编译器有关第十一页11第十二页,共57页。ROOT语法(3)—随机数gRandom是指向当前随机数产生子的指针,该产生子默认为TRandom3对象。(为什么看TRandom?因为TRandom1/2/3都继承自TRandom)gRandom->Binomial(ntot,p):二项分布gRandom->BreiWigner(mean,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]均匀分布....使用前可根据需要改变随机数种子和机制第十二页12第十三页,共57页。ROOT脚本文件示例(1):Macro文件

$EXAMPLEDIR/ex31.C用花括号括起来,后缀名一般用”.C”{cout<<"HelloROOT"<<endl;intNum=5;for(inti=0;i<Num;i++){cout<<"i="<<i<<endl;}}纯粹C++语法,执行的时候只需要在命令提示行:cd$EXAMPLEDIRroot-lex31.C第十三页13第十四页,共57页。ROOT中的数学函数root[0]TF1*f1=newTF1("f1","x*sin(x)",-5,5);制作一维函数曲线图TF1*fun_name=newTF1("fun_name","expression",x_low,x_high);root[0]TF2*f2=newTF2("f2","x*sin(x)+y*cos(y)",-5,5,-10,10);制作二维函数曲线图TF2*fun_name=newTF2("fun_name","expression",x_low,x_high,y_low,y_high);root[0]TF3*f3=newTF2("f3","x*sin(x)+y*cos(y)+z*exp(z)",-5,5,-10,10,-20,20);制作三维函数曲线图TF3*fun_name=newTF3("fun_name","expression",x_low,x_high,y_low,y_high,z_low,z_high);画图时采用

root[1]fun_name.Draw();第十四页14第十五页,共57页。数学函数的定义方式(1)利用c++数学表达式TF1*f1=newTF1("f1","sin(x)/x",0,10);利用TMath定义的函数TF1*f1=newTF1("f1","TMath::DiLog(x)",0,10);利用自定义c++数学函数Double_tmyFun(x){returnx+sqrt(x);}TF1*f1=newTF1("f1","myFun(x)",0,10);ROOT中定义数学函数的方式多种多样以上函数都不含参数,但在数据拟合时,我们往往需要定义含未知参数的函数第十五页15第十六页,共57页。数学函数的定义方式(2)ROOT已经预定义了几种常用的含参函数gaus:3个参数

f(x)=p0*exp(-0.5*((x-p1)/p2)^2))expo:2个参数

f(x)=exp(p0+p1*x)polN:N+1个参数

f(x)=p0+p1*x+p2*x^2+...

其中N=0,1,2,...,使用时根据需要用pol0,pol1,pol2...landau:3个参数朗道分布,没有解析表达式ROOT中定义含未知参数的数学函数这些预定义函数可直接使用,比如histogram->Fit("gaus");//对直方图进行高斯拟合TF1*f1=newTF1("f1","gaus",-5,5);第十六页16第十七页,共57页。数学函数的定义方式(3)ROOT中自定义含未知参数的数学函数利用c++数学表达式TF1*f1=newTF1("f1","[0]*sin([1]*x)/x",0,10);利用c++数学表达式以及ROOT预定义函数TF1*f1=newTF1("f1","gaus(0)+[3]*x",0,3);利用自定义的c++数学函数Double_tmyFun(Double_t*x,Double_t*par){Double_txx=x[0];Double_tf=par[0]*exp(-xx/par[1]);returnf;}TF1*f1=newTF1("f1","myFun",0,10,2);指定参数数目定义了含参的TF1对象f1之后,可以设定参数初值,比如f1->SetParameter(0,value);//为第0个参数设初值为value第十七页17第十八页,共57页。ROOT脚本文件示例(2):数学函数定义

$EXAMPLEDIR/ex32.C//asimpleROOTmacro,ex32.C//说明ROOT中数学函数的使用,如TF1voidex32(){//定义函数TF1*f1=newTF1("func1","sin(x)/x",0,10);f1->Draw();//画出函数图像

TF1*f2=newTF1("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->”,然后按一下Tab键,可以自动列出该类对象的成员函数和成员变量运行:在命令提示行下root-lex32.C或在ROOT环境下.xex32.C第十八页18第十九页,共57页。ROOT脚本文件示例(3):画布,保存图片

$EXAMPLEDIR/ex33.C//说明ROOT画布的使用,TCanvas,保存图形voidex33(){//defineafunctionsin(x)/xTF1*f1=newTF1("func1","sin(x)/x",0,10);

//defineaGaussianfunction,mean=0,sigma=1TF1*f2=newTF1("func2","Gaus(x,0,1)",-3,3);

//定义一个画布,TCanvas

TCanvas*myC1=newTCanvas("myC1","ACanvas",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.eps”);}运行:在命令提示行下>root-lex33.C或在ROOT环境下root[0].xex33.C名称描述像素坐标(10,10):左上角

(800,600):右下角第十九页19第二十页,共57页。ROOT中统计直方图定制一维直方图TH1F*hist_name=newTH1F(“hist_name”,”hist_title”,num_bins,x_low,x_high);定制二维图TH2F*hist_name=newTH2F(“hist_name”,”hist_title”,num_bins_x,x_low,x_high,num_bins_y,y_low,y_high);定制三维图TH3F*hist_name=newTH3F(“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);绘图:root[0]hist_name.Draw();第二十页20第二十一页,共57页。ROOT脚本文件示例(4):直方图,TFile,随机数

$EXAMPLEDIR/ex34.C//说明ROOT直方图、随机数的使用,如TH1F,gRandomvoidex34(){constInt_tNEntry=10000;//创建一个root文件TFile*file=newTFile(“hist1.root”,”RECREATE”);

TH1F*h1=newTH1F("h1","Asimplehisto",100,0,1);

//填充直方图10000次,用(0,1)均匀分布for(inti=0;i<NEntry;i++)h1->Fill(gRandom->Uniform());h1->Draw();h1->GetYaxis()->SetRangeUser(0,150);h1->GetXaxis()->SetTitle("x");h1->GetXaxis()->CenterTitle();file->cd();//进入文件fileh1->Write();//将h1写入文件}执行的时候只需要在命令提示行root-lex34.C或者进入ROOT环境之后,运行.xex34.C名称调用均匀分布Uniform(),其它:Landau(mean,sigma);Binomial(ntot,prob);Poisson(mean);Exp(tau);BreitWigner

(mean,sigma);描述No.

ofBin区间第二十一页21第二十二页,共57页。X轴的名称直方图统计信息事例数:Entries均值:Mean方差:RMS参见ROOT手册第3章“StatisticsDisplay”直方图的Title打开已有的root文件,如hist1.root:终端提示行下:root-lhist1.rootROOT环境下:T(“hist1.root”);.lsh1->Draw();直方图、打开root文件第二十二页22第二十三页,共57页。//2维直方图TH2F,散点图,散点图的协方差voidex35(){constInt_tNEntry=10000;

TH2F*hXY=newTH2F("hXY","2dhisto",100,0,1,100,-3,3);for(inti=0;i<NEntry;i++){floatx=gRandom->Rndm();floaty=gRandom->Gaus(0,1);hXY->Fill(x,y);//填充2维直方图}hXY->Draw();//2维直方图的散点图hXY->GetXaxis()->SetTitle("X:Uniform");hXY->GetYaxis()->SetTitle("Y:Gaussian");Float_tcovar=hXY->GetCovariance();//协方差cout<<"Covariance="<<covar<<endl;}ROOT脚本文件示例(5):散点图

$EXAMPLEDIR/ex35.C运行:在命令提示行下root-lex35.C或在ROOT环境下.xex35.C二维直方图的Draw()函数有很多选项,请自行选择第二十三页23第二十四页,共57页。hXY->Draw(“colz”);ROOT脚本文件示例(5):colz图

$EXAMPLEDIR/ex35.C第二十四页24第二十五页,共57页。TTree要点ROOT中tree的概念(类TTree)

什么是tree,为什么tree存取数据如何定义、填充TTree并写入文件如何读取实验数据填充为TTree如何查看或读取ROOT文件中的treeTChain第二十五页25第二十六页,共57页。root文件与它的tree概念一个root文件就像UNIX中的一个目录,它可以包含目录和没有层次限制的目标模块。

即,在可以在root文件创建不同的目录子目录,目录中存放不同的类对象或普通数据。如要求存储大量的同类目标模块,需要引入概念:TTree:

减小磁盘空间和增加读取速度方面被优化TNtuple:只能存储浮点数的TTree。尽量避免使用。

TTree采用了

branch

的体系,每个branch的读取可以与别的branch无关。第二十六页26第二十七页,共57页。为什么使用TTree适用于大量的类型相同的对象可以存储包括类对象、数组等各种类型数据一般情况下,tree的Branch,Leaf信息就是一个事例的完整信息有了tree之后,可以很方便对事例进行循环处理。占用空间少,读取速度快TTree是ROOT最强大的概念之一第二十七页27第二十八页,共57页。TTree的定义参见创建TTree,并设置Branch,比如:Int_tRunID;TTree*t1=newTTree("t1","testtree");TBranch*br=t1->Branch("RunID",&RunID,"RunID/I");构造函数:TTree(constchar*name,constchar*title,

Int_tsplitlevel=99);Branch成员函数:virtualTBranch*Branch(constchar*name,void*address,constchar*leaflist,Int_tbufsize=32000);名称描述Branch可以是单独的变量,也可以是一串变量,也可以是定长或不定长数组,也可以是C结构体,或者类对象(继承自TObject,如TH1F对象)。第二十八页28第二十九页,共57页。voidex41(){TFile*f=newTFile("tree1.root","recreate");

TTree*t1=newTTree("t1","testtree");gRandom->SetSeed(0);Float_tpx,py,pz;Double_trandom;Int_ti;//SettheBranchesoftreet1->Branch("px",&px,"px/F");t1->Branch("py",&py,"py/F");t1->Branch("pz",&pz,"pz/F");t1->Branch("random",&random,"random/D");t1->Branch("i",&i,"i/I");for(i=0;i<5000;i++){gRandom->Rannor(px,py);pz=px*px+py*py;random=gRandom->Rndm();t1->Fill();//Filltree}t1->Write();}如何写一个简单的TTree

$EXAMPLEDIR/ex41.C运行:root-lex41.C或ROOT环境中:.xex41.C定义tree,参数分别为tree的名称和描述设置Branch,参数分别为Branch的“名称”、“地址”以及“leaf列表和类型”。这里只有一个leaf,如果多个则用冒号分开。常用类型:C,I,F,D分别表示字符串、整型、浮点型和双精度型,参见ROOT手册第12章为每个leaf赋值,每个事例结束时填充一次。这里一共填充5000事例。好的做法是实验一个事例填充一次!!!将tree写入root文件中存盘第二十九页29第三十页,共57页。查看Tree的信息>root-ltree1.root

打开root文件root[1].ls

查看文件信息,发现TTreet1root[2]t1->Show(0);

显示第0个event的信息root[3]t1->GetEntries()

总事例数root[4]t1->Scan();root[5]t1->Print();root[6]t1->Draw("px");第三十页30第三十一页,共57页。查看Tree的信息(续)也可以>root-l

进入rootroot[0]TFile*f1=newTFile("tree1.root");root[1]t1->Draw("sqrt(px*px+py*py)");

root[2]TH1F*h1;root[3]t1->Draw("px>>h1");root[4]t1->Draw("py","px>0","sames");root[5]t1->Draw("py","","sames");root[5]t1->StartViewer()第三十一页31第三十二页,共57页。查看Tree的信息(2)TBrowserbTBrowser打开一个浏览器,从中可以选择root文件,并一层层进入其中的tree,branch以及leaf。类似于Windows下的Explorer。这是当前目录,双击进入并选择要打开的root文件,以及文件中的tree,最后可以看到tree的各个leaf双击leaf可以查看leaf的直方图适合初步浏览,但不适合具体的数据分析处理。并不推荐使用。第三十二页32第三十三页,共57页。

...constInt_tkMaxTrack=50;Int_tntrack;Float_tpx[kMaxTrack];Float_tpy[kMaxTrack];

Float_tzv[kMaxTrack];Double_tpv[3];TFilef(rootfile,"recreate");TTree*t3=newTTree("t3","Reconstevents");t3->Branch("ntrack",&ntrack,"ntrack/I");t3->Branch("px",px,"px[ntrack]/F");t3->Branch("py",py,"py[ntrack]/F");t3->Branch("zv",zv,"zv[ntrack]/F");t3->Branch("pv",pv,"pv[3]/D");

...运行:进入ROOT环境后

.Lex42.Cex42w()ex42r()voidex42r(){//读取数据,适用于简单分析TFile*f=newT);

TTree*t3=(TTree*)f->Get("t3");t3->Draw("sqrt(px*px+py*py)");htemp->SetLineColor(2);t3->Draw("sqrt(px*px+py*py)","zv>100","sames");}如何读写含有不定长数组的tree(1)

$EXAMPLEDIR/ex42.C1)估计不定长数组的最大维数,以该维数定义数组;如floatzv[kMaxTrack]2)定义某变量,用于存放数组的实际维数。如intntrack,表示一个事例中实际的径迹数。3)定义tree,设置Branch。第三个参数给出数组的实际维数。如”zv[ntrack]/F”很多时候不定长数组是必要的,比如正负电子对撞,记录末态粒子的信息,末态粒子数目是不固定的。!!如何获取root文件中的tree指针

直接画出Branch/Leaf,可以加很多条件。第三十三页33第三十四页,共57页。voidex42r2(){TFile*f=newT);TTree*t3=(TTree*)f->Get("t3");

//步骤1:定义好必要的变量constInt_tkMaxTrack=100;Int_tntrack;Float_tpx[kMaxTrack];//[ntrack]

Float_tpy[kMaxTrack];//[ntrack]Float_tzv[kMaxTrack];//[ntrack]Double_tpv[3];//步骤2:用SetBranchAddress函数

//将tree的Branch与定义好的变量

//地址联系起来。

t3->SetBranchAddress("ntrack",&ntrack);t3->SetBranchAddress("px",px);

t3->SetBranchAddress("py",py);t3->SetBranchAddress("zv",zv);t3->SetBranchAddress("pv",pv);运行:进入ROOT环境后

.Lex42.Cex42w()ex42r2()如何读写含有不定长数组的tree(2)

$EXAMPLEDIR/ex42.C每获取一个事例,这些Branch直接赋值给指定的变量。可以在循环中设定选取条件,选择分析数据。进行复杂细致的分析推荐使用这种方法。注:程序中//[ntrack]的意义参见ROOT手册Streamer

//获取事例总数Int_tnentries=t3->GetEntries();TH1I*hntrack=newTH1I("hntrack",“trkn",25,0,50);TH1F*hpt=newTH1F("hpt",“trkpt",100,0,10);

//步骤3:对所有事例循环for(inti=0;i<nentries;i++){

t3->GetEntry(i);//获取第i个事例hntrack->Fill(ntrack);for(intj=0;j<ntrack;j++){Float_tpt=sqrt(px[j]*px[j]+py[j]*py[j]);hpt->Fill(pt);}}TCanvas*myC=newTCanvas("myC","",10,10,600,400);hntrack->Draw("e");hntrack->GetYAxis()->SetRangeUser(0,60);TCanvas*myC1=newTCanvas("myC1","",10,10,600,400);hpt->Draw();}问题:对ntrack和px的处理有什么差别?为什么?第三十四页34第三十五页,共57页。

...

TTree*t3=newTTree("t3","Reconstevents");//Evt_t是已经定义好的类(详见ex43.C)。这里的myevt一定要用new的方式定义,

//然后就可以直接将该对象设为tree的一个Branch。

//第1个参数为Branch的名字,第2个为类的名字(可省略),第3个为对象指针的地址(!!),

//第4个为缓存大小,第5个为分割级别(split-level)。

//参见手册“AddingaBranchtoHoldanObject”

Evt_t*myevt=newEvt_t();t3->Branch(“evt”,“Evt_t”,&myevt,32000,1);

...//读取tree时,可以直接将对象指针的地址的赋给相应的Branch

//需要提醒的是,第1个参数为Branch的名称,必须与写入时指定的名称相同。

Evt_t*myevt=0;t3->SetBranchAddress("evt",&myevt);

...

//GetEntry(i)获得第i个entry后,通过myevt->ntrack(或其它成员变量)可以获得

//相应的数据。t3->GetEntry(i);hntrack->Fill(myevt->ntrack);如何将类对象设定为tree的Branch

$EXAMPLEDIR/ex43.C详见ex43.C。运行时必须通过外部编译器如:root-lex43.C+或者在ROOT环境中.xex43.C+

这里的”+”是必须的。语法更严格,必须include需要的头文件略过,但并非不重要第三十五页35第三十六页,共57页。

有时候记录的实验数据是ASCII格式,或者二进制格式。我们可以读取这些数据转换成ROOT中的tree,方便进行数据分析。ex44.C读取basic.dat(ASCII码),转成最简单的TTree。basic.dat中的数据分3列,分别为x,y,z坐标。如何从ASCII文件中读取数据转为ROOT中的TTree/home/yangzw/examples/Lec4/ex44.C运行:root-lex44.C

或者在root环境中:.xex44.Cvoidex44(){

ifstreamin;//定义文件流对象,i表示in,f表示file,即从某文件中读取数据

in.open(“basic.dat”);//打开该文件Float_tx,y,z;Int_tnlines=0;TFile*f=newTFile("ex44.root","RECREATE");TH1F*h1=newTH1F("h1","xdistribution",100,-4,4);//TNtuple可以看成特殊的的TTree,只可以存放浮点型数据。

TNtuple*ntuple=newTNtuple("ntuple","dataausascii","x:y:z");while(1){

in>>x>>y>>z;//从文件中读取一行,分别赋值给x,y,z。if(!in.good())break;if(nlines<5)printf("x=%8f,y=%8f,z=%8f\n",x,y,z);h1->Fill(x);

ntuple->Fill(x,y,z);//填充TNtuplenlines++;}printf("found%dpoints\n",nlines);in.close();f->Write();}注:3个Branch分别为x,y,z每个事例填充一次第三十六页36第三十七页,共57页。改成TTree方式:voidex44(){Float_tx,y,z;Int_tnlines=0;TFile*f=newTFile("ex44.root","RECREATE");TH1F*h1=newTH1F("h1","xdistribution",100,-4,4);//TNtuple可以看成特殊的的TTree,只可以存放浮点型数据。

TTree*mytree=newTTree(“mytree”,”aaaaaaaaaaaa”);mytree->Branch(“x”,&x,”x/F”);mytree->Branch(“y”,&y,”y/F”);mytree->Branch(“z”,&z,”z/F”);mytree->Branch(“w”,&w,”w/C”);while(1){

in>>x>>y>>z;//从文件中读取一行,分别赋值给x,y,z。if(!in.good())break;if(nlines<5)printf("x=%8f,y=%8f,z=%8f\n",x,y,z);h1->Fill(x);mytree->Fill();//填充TNtuplenlines++;}printf("found%dpoints\n",nlines);in.close();f->Write();}略过,但并非不重要第三十七页37第三十八页,共57页。

读取ASCII格式文件还有个更简便的方式,即用TTree的ReadFile函数:

tree->Read);

参见ROOT手册TTree那一章如何从ASCII文件中读取数据转为ROOT中的TTree$EXAMPLEDIR/ex44a.C运行:root-lex44a.C

或者在root环境中:.xex44a.Cvoidex44a(){TFile*f=newTFile("ex44.root","RECREATE");TTree*T=newTTree("ntuple","datafromasciifile");

//第1个参数为要打开的文件名称

//第2个参数是Branch的描述,即设定3个Branchx,y,zLong64_tnlines=T->ReadFile("basic.dat","x:y:z");printf("found%lldpoints\n",nlines);T->Write();}第三十八页38第三十九页,共57页。TChain对象是包含相同tree的ROOT文件的列表。参见User’sGuide中TChain相关章节以及TChain:分析多个root文件的利器(1)voidex45(){//定义TChain,t3为root文件中tree的名称!!!!!!!

TChain*fChain=newTChain(“t3”);//添加所有文件至fChain,或根据需要添加部分root文件fChain->Add(“rootfiles/*.root”);//画出t3的某个leaf,如ntrackfChain->Draw(“ntrack”);}注意:此时,fChain等同于一个大root文件中的一个类"t3",该文件包含的事例数为所有文件中事例数之和(1012以内)

问题:root文件中多个tree怎么办?第三十九页39第四十页,共57页。直方图的操作直方图的运算加减乘除:Add,Divide,...归一化:ScaleROOT中直方图拟合h1->Fit();第四十页40第四十一页,共57页。直方图归一化(1)"归一化"后,不仅BinContent变化了,BinError也变化了直方图的归一化voidTH1::Scale(Double_tc1,Option_t*option)默认c1=1,把直方图每个区间的值(BinContent)乘以c1假设sum=h1->Integral()h1->Scale(c1)之后,

h1->Integral()=c1*sum不加参数时,h1->Scale()没有变化(默认c1=1)第四十一页41第四十二页,共57页。直方图的归一化(2)root[0]TH1F*h1=newTH1F("h1","",100,-5,5);root[1]TH1F*h2=newTH1F("h2","",100,-5,5);root[2]h1->FillRandom("gaus",5000);root[3]h2->FillRandom("gaus",10000);root[4]floatnorm=1000;root[5]h1->Scale(norm/h1->Integral());root[6]h2->Scale(norm/h2->Integral());root[7]h1->Draw("e");

root[8]h2->Draw(“esames”);"归一化"之后,h1或h2->Integral()=norm在同一张图上可以看出比较2个分布的差别。归一化常用于比较两种分布,找出区别。所以,将2个直方图归一化到积分相同进行比较才直观。注意Draw()函数的选项第四十二页42第四十三页,共57页。直方图四则运算(1)重要提示:对直方图进行四则运算操作,一定要想明白运算的意义

比如两个直方图的相加与两个随机变量的卷积有什么区别2.两个直方图的四则运算,区间大小和区间数相同才有意义四则运算"加减乘除"分别对应

统计量(BinContent)的相加、相减、相乘、相除3.如果需要正确处理统计误差,需要在对ROOT脚本中调用TH1的某个静态成员函数,即TH1::SetDefaultSumw2();voidSetDefaultSumw2(Bool_tsumw2=kTRUE)

//staticfunction.Whenthisstaticfunctioniscalledwithsumw2=kTRUE,allnewhistogramswillautomaticallyactivatethestorageofthesumofsquaresoferrors,ieTH1::Sumw2isautomaticallycalled.第四十三页43第四十四页,共57页。直方图的四则运算(2)......root[1]TH1::SetDefaultSumw2();root[1]TH1F

*h3=newTH1F(*h1);root[2]h3->Add(h1,h2,a,b);结果:h3的BinContent被a*h1+b*h2替换,一般a=b=1相加:常用于相同实验的数据叠加,增加统计量。......root[1]TH1F

*h3=newTH1F(*h1);root[2]h3->Sumw2();//也可在定义h3前TH1::SetDefaultSumw2();root[3]h3->Add(h1,h2,a,-b);结果:h3的BinContent被a*h1+b*h2替换,一般a=-b=1相减:常用于从实验测量的分布中扣除本底。第四十四页44第四十五页,共57页。直方图的四则运算(3)相除root[1]TH1F

*h3=newTH1F(*h1);root[2]h3->Sumw2();root[3]h3->Divide(h1,h2,a,b);root[4]h3->Divide(h1,h2,a,b);常用于效率的计算。相乘root>TH1F

*h3=newTH1F(*h1);root>h3->Sumw2();root>h3->Multiply(h1,h2,a,b);常用于对分布进行诸如效率等的修正。思考:如果h1和h2不独立,怎么办?比如h1包含于h2root[4]h3->Divide(h1,h2,a,b,"B");第四十五页45第四十六页,共57页。直方图四则运算的误差处理

虽然ROOT都提供了较完善的一维直方图运算功能,但对最终结果的误差一定要仔细检查。很多情况下,用户需要从图中读出各频数数值与误差值,并确认运算无误。包括归一化和加减乘除在内,如果希望使用直方图的误差,都需要调用TH1::SetDefaultSumw2();或者,对每个直方图(如hist)调用

hist->Sumw2();第四十六页46第四十七页,共57页。拟合直方图(1)将鼠标放到直方图上,右键,出现直方图操作选项,选择FitPanel,可以在FitPanel中选择拟合的各个选项,比如用什么函数拟合,拟合的区间,等等。第四十七页47第四十八页,共57页。用默认的高斯拟合,并在Options菜单中选上FitParameters选项,可以看到拟合的结果。拟合直方图(2)并不推荐这种拟合方式:1)不适合自定义函数拟合2)不适合批处理拟合结果给出了高斯分布的3个参数:常系数、均值、均方差,以及拟合的好坏chi2/ndf第四十八页48第四十九页,共57页。hpx->Fit("gaus");hpx->Fit("gaus","","",-3,3);拟合直方图(3)

$EXAMPLEDIR/ex51.C自定义拟合函数TF1*fcn=newTF1("fcn","gaus",-3,3);hpx->Fit(fcn,”R”);gStyle->SetOptFit();//设置拟合选项拟合前往往需要给出合理的参数初值fcn->SetParameters(500,mean,sigma);拟合后取出拟合得到的参数Double_tmypar[3];fcn->GetParameters(&mypar[0]);运行:root-lroot[0].Lex51.Croot[1]ex51r()root[2]ex51r2()用自定义的函数拟合直方图第四十九页49第五十页,共57页。共振峰(Breit-Wigner分布)加上二次函数本底的拟合(一共6个参数)先自定义本底函数(background)和共振峰函数(lorentianPeak),再定义这两个函数的和为拟合函数:fitFunction利用fitFunction定义TF1函数拟合直方图(3)

$EXAMPLEDIR/ex52.C这里指定函数区间为0-3,6个参数运行:root-lroot[0].Lex52.C注意TLegend的使用TF1*fitFcn=newTF1("fitFcn",fitFunction,0,3,6);fitFcn->SetParameter(4,0.2);为某个参数设初值(width)fitFcn->SetParLimits(5,0.6,1.4);

为某参数设置取值范围第五十页50第五十一页,共57页。ROOT小结设定ROOT环境变量:ROOTSYS,PATH,LD_LIBRARY_PATH绘制各种直方图,散点图,数学函数

TH1F,TH2F,TF1,...随机数产生子,各种分布

gRandom->Rndm,Uniform,Gaus,Exp,...创建、保存root文件

TFile*f=newTFile("my”,”recreate");

f->Write();TTree,TChain的使用

TTree*mytree=newTTree("mytree”,”mytree");mytree->Branch(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论