粒子物理與核物理實(shí)驗(yàn)中的數(shù)據(jù)分析課件_第1頁(yè)
粒子物理與核物理實(shí)驗(yàn)中的數(shù)據(jù)分析課件_第2頁(yè)
粒子物理與核物理實(shí)驗(yàn)中的數(shù)據(jù)分析課件_第3頁(yè)
粒子物理與核物理實(shí)驗(yàn)中的數(shù)據(jù)分析課件_第4頁(yè)
粒子物理與核物理實(shí)驗(yàn)中的數(shù)據(jù)分析課件_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本講要點(diǎn)什么是ROOT登錄ROOT環(huán)境和體驗(yàn)中心ROOT的語(yǔ)法簡(jiǎn)介ROOT的函數(shù),直方圖,隨機(jī)數(shù),文件,散點(diǎn)圖TTree的定義、填充、保存、讀取及查看直方圖加減乘除運(yùn)算、歸一及擬合第一頁(yè)1第二頁(yè),共57頁(yè)。什么是

ROOT?ROOT:ExecutiveSummary...providesasetofOOframeworkswithall

thefunctionalityneededtohandleandanalyselargeamountsofdatainavery

efficientway....(摘自)關(guān)鍵字:面向?qū)ο蟮目蚣堋⑺泄δ?、海量?shù)據(jù)、非常有效第二頁(yè)2第三頁(yè),共57頁(yè)。安裝ROOTubuntu14.04虛擬機(jī)已經(jīng)安裝并設(shè)置好了ROOT!如果沒有使用虛擬機(jī),且尚未安裝ROOT:首先查看ROOT網(wǎng)站上是否有相應(yīng)操作系統(tǒng)(或Linux發(fā)行版)及編譯器的預(yù)編譯好的程序包,有的話,直接下載解壓縮到你想要的安裝目錄下,比如/projects/soft/ext/root如果沒有適合你的操作系統(tǒng)的預(yù)編譯包,就需要到官網(wǎng)下載ROOT的源代碼,按照安裝指南編譯安裝設(shè)置ROOT的環(huán)境變量(bash)

exportROOTSYS=/projects/soft/ext/root

exportPATH=$ROOTSYS/bin:$PATH

exportLD_LIBRARY_PATH=$ROOTSYS/lib:$LD_LIBRARY_PATH可以把上面這3行放到~/.login或者~/.bashrc文件中,這樣每次登錄到Linux系統(tǒng),系統(tǒng)就自動(dòng)設(shè)置ROOT的環(huán)境變量

第三頁(yè)3第四頁(yè),共57頁(yè)。登錄ROOT環(huán)境運(yùn)行>root[-l]退出root[0].q鍵入help指令,如

root[0]?

root[1].ls

root[2].!lsROOT環(huán)境其它常用指令:.Lmacro.CLoad文件macro.C.xmacro.C執(zhí)行文件macro.C.ls顯示ROOT當(dāng)前環(huán)境的所有信息.!ls顯示Linux系統(tǒng)當(dāng)前目錄的所有信息注:ROOT環(huán)境中,ROOT指令都以“.”開頭系統(tǒng)指令都以“.!”開頭

第四頁(yè)4第五頁(yè),共57頁(yè)。ROOT體驗(yàn)中心(1)在$ROOTSYS/tutorials目錄下,有五花八門的例子。以后會(huì)經(jīng)常與這個(gè)目錄打交道。先嘗試一下吧。嘗試方法:

>cd/workdir/root

>cp-r$ROOTSYS/tutorials.(注意不要把這個(gè)"."漏掉了)>cdtutorials

然后找個(gè)感興趣的目錄/文件,執(zhí)行ROOT腳本,比如

>cdroofit>root-lrf607_fitresult.C小技巧提示:根據(jù)關(guān)鍵字"xxxx"從tuotorials的例子中尋找線索grep-sirn"xxxx"$ROOTSYS/tutorials比如找隨機(jī)數(shù)用法:grep-sirn"random"$ROOTSYS/tutorials第五頁(yè)5第六頁(yè),共57頁(yè)。ROOT體驗(yàn)中心(2)還可以在ROOT網(wǎng)站上看到一些ROOT圖片:當(dāng)然,ROOT的功能不只是做圖,它不是一個(gè)作圖工具。跟數(shù)據(jù)分析有關(guān)的東西,基本都是ROOT的擅長(zhǎng);跟物理有關(guān)的很多東西,ROOT基本都可以做得很好:事例產(chǎn)生、探測(cè)器模擬、事例重建、數(shù)據(jù)采集、數(shù)據(jù)分析第六頁(yè)6第七頁(yè),共57頁(yè)。ROOT參考資料ROOT官方網(wǎng)站ROOT手冊(cè)(UsersGuide)(ver5.34):ROOTPrimer(ver5.34):

ROOTReferenceguide(ver5.34):

$ROOTSYS/tutorials

搜索引擎第七頁(yè)7第八頁(yè),共57頁(yè)。下載本講例子到本地計(jì)算機(jī)cdworkdir/rootwget/~zhuxl/weihai/ppt/rootexamples.tgztarzxvfrootexamples.tgzcdexamplesexportEXAMPLEDIR=`pwd`本講所有例題及練習(xí)題相關(guān)文件都在$EXAMPLEDIR目錄下。第八頁(yè)8第九頁(yè),共57頁(yè)。ROOT語(yǔ)法(1)—基本信息ROOT使用C++語(yǔ)法一段C++程序可以直接在ROOT環(huán)境運(yùn)行數(shù)據(jù)類型重定義

intInt_t

float

Float_tdoubleDouble_t

......ROOT的類都以T開頭如TFile,TH1F,TTree,...詳細(xì)規(guī)定參閱ROOT手冊(cè)第二章關(guān)于Convention和GlobalVariables部分??梢灾苯釉赗OOT環(huán)境中運(yùn)行macro文件(自動(dòng)調(diào)用cint編譯器),也可以在makefile中設(shè)置好相關(guān)參數(shù)用g++編譯得到可執(zhí)行文件運(yùn)行。第九頁(yè)9第十頁(yè),共57頁(yè)。ROOT語(yǔ)法(2)—直方圖類ROOT中有眾多已經(jīng)定義好的類可供使用,比如直方圖家族第十頁(yè)10第十一頁(yè),共57頁(yè)。ROOT語(yǔ)法(2)—其它類其它常用類數(shù)學(xué)函數(shù):TF1,TF2,TF3...圖形:TGraph,TGraphErrors,TGraph2D,...文件:TFile畫布:TCanvas,TPad,...隨機(jī)數(shù):TRandom,TRandom1,TRandom2,TRandom3周期109101711026106000速度(ns/call)342423745

比如跟數(shù)據(jù)結(jié)構(gòu)和分析有關(guān)的:

TTree,TChain,...參見

還有很多全局變量,多數(shù)以g開頭,如:gRandom,gROOT,gStyle,gPad,gEnv,gFile...速度與CPU和編譯器有關(guān)第十一頁(yè)11第十二頁(yè),共57頁(yè)。ROOT語(yǔ)法(3)—隨機(jī)數(shù)gRandom是指向當(dāng)前隨機(jī)數(shù)產(chǎn)生子的指針,該產(chǎn)生子默認(rèn)為TRandom3對(duì)象。(為什么看TRandom?因?yàn)門Random1/2/3都繼承自TRandom)gRandom->Binomial(ntot,p):二項(xiàng)分布gRandom->BreiWigner(mean,gamma)Breit-Wigner分布gRandom->Exp(tau)指數(shù)分布gRandom->Gaus(mean,sigma)高斯分布gRandom->Integer(imax)(0,imax-1)隨機(jī)整數(shù)gRandom->Landau(mean,sigma)Landau分布gRandom->Poisson(mean)泊松分布(返回int)gRandom->PoissonD(mean)泊松分布(返回double)gRandom->Rndm()(0,1]均勻分布gRandom->Uniform(x1,x2)(x1,x2]均勻分布....使用前可根據(jù)需要改變隨機(jī)數(shù)種子和機(jī)制第十二頁(yè)12第十三頁(yè),共57頁(yè)。ROOT腳本文件示例(1):Macro文件

$EXAMPLEDIR/ex31.C用花括號(hào)括起來,后綴名一般用”.C”{cout<<"HelloROOT"<<endl;intNum=5;for(inti=0;i<Num;i++){cout<<"i="<<i<<endl;}}純粹C++語(yǔ)法,執(zhí)行的時(shí)候只需要在命令提示行:cd$EXAMPLEDIRroot-lex31.C第十三頁(yè)13第十四頁(yè),共57頁(yè)。ROOT中的數(shù)學(xué)函數(shù)root[0]TF1*f1=newTF1("f1","x*sin(x)",-5,5);制作一維函數(shù)曲線圖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);制作二維函數(shù)曲線圖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);制作三維函數(shù)曲線圖TF3*fun_name=newTF3("fun_name","expression",x_low,x_high,y_low,y_high,z_low,z_high);畫圖時(shí)采用

root[1]fun_name.Draw();第十四頁(yè)14第十五頁(yè),共57頁(yè)。數(shù)學(xué)函數(shù)的定義方式(1)利用c++數(shù)學(xué)表達(dá)式TF1*f1=newTF1("f1","sin(x)/x",0,10);利用TMath定義的函數(shù)TF1*f1=newTF1("f1","TMath::DiLog(x)",0,10);利用自定義c++數(shù)學(xué)函數(shù)Double_tmyFun(x){returnx+sqrt(x);}TF1*f1=newTF1("f1","myFun(x)",0,10);ROOT中定義數(shù)學(xué)函數(shù)的方式多種多樣以上函數(shù)都不含參數(shù),但在數(shù)據(jù)擬合時(shí),我們往往需要定義含未知參數(shù)的函數(shù)第十五頁(yè)15第十六頁(yè),共57頁(yè)。數(shù)學(xué)函數(shù)的定義方式(2)ROOT已經(jīng)預(yù)定義了幾種常用的含參函數(shù)gaus:3個(gè)參數(shù)

f(x)=p0*exp(-0.5*((x-p1)/p2)^2))expo:2個(gè)參數(shù)

f(x)=exp(p0+p1*x)polN:N+1個(gè)參數(shù)

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

其中N=0,1,2,...,使用時(shí)根據(jù)需要用pol0,pol1,pol2...landau:3個(gè)參數(shù)朗道分布,沒有解析表達(dá)式ROOT中定義含未知參數(shù)的數(shù)學(xué)函數(shù)這些預(yù)定義函數(shù)可直接使用,比如histogram->Fit("gaus");//對(duì)直方圖進(jìn)行高斯擬合TF1*f1=newTF1("f1","gaus",-5,5);第十六頁(yè)16第十七頁(yè),共57頁(yè)。數(shù)學(xué)函數(shù)的定義方式(3)ROOT中自定義含未知參數(shù)的數(shù)學(xué)函數(shù)利用c++數(shù)學(xué)表達(dá)式TF1*f1=newTF1("f1","[0]*sin([1]*x)/x",0,10);利用c++數(shù)學(xué)表達(dá)式以及ROOT預(yù)定義函數(shù)TF1*f1=newTF1("f1","gaus(0)+[3]*x",0,3);利用自定義的c++數(shù)學(xué)函數(shù)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);指定參數(shù)數(shù)目定義了含參的TF1對(duì)象f1之后,可以設(shè)定參數(shù)初值,比如f1->SetParameter(0,value);//為第0個(gè)參數(shù)設(shè)初值為value第十七頁(yè)17第十八頁(yè),共57頁(yè)。ROOT腳本文件示例(2):數(shù)學(xué)函數(shù)定義

$EXAMPLEDIR/ex32.C//asimpleROOTmacro,ex32.C//說明ROOT中數(shù)學(xué)函數(shù)的使用,如TF1voidex32(){//定義函數(shù)TF1*f1=newTF1("func1","sin(x)/x",0,10);f1->Draw();//畫出函數(shù)圖像

TF1*f2=newTF1("func1",“TMath::Gaus(x,0,1)",0,10);

f2->SetLineColor(2);//設(shè)置顏色為紅色f2->Draw(“same”);//用參數(shù)”same”,把f1,f2畫在同一個(gè)畫布上}函數(shù)名稱函數(shù)表達(dá)式函數(shù)區(qū)間提示:1)腳本中void函數(shù)的名字必須與文件名相同(如ex32)2)ROOT環(huán)境中定義類指針之后,如TF1*f1,之后輸入“f1->”,然后按一下Tab鍵,可以自動(dòng)列出該類對(duì)象的成員函數(shù)和成員變量運(yùn)行:在命令提示行下root-lex32.C或在ROOT環(huán)境下.xex32.C第十八頁(yè)18第十九頁(yè),共57頁(yè)。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);

//定義一個(gè)畫布,TCanvas

TCanvas*myC1=newTCanvas("myC1","ACanvas",10,10,800,600);

//將畫布分成兩部分myC1->Divide(2,1);myC1->cd(1);//進(jìn)入第一部分f1->Draw();myC1->cd(2);//進(jìn)入第二部分f2->Draw();myC1->SaveAs(“myex33.gif”);myC1->SaveAs(“myex33.eps”);}運(yùn)行:在命令提示行下>root-lex33.C或在ROOT環(huán)境下root[0].xex33.C名稱描述像素坐標(biāo)(10,10):左上角

(800,600):右下角第十九頁(yè)19第二十頁(yè),共57頁(yè)。ROOT中統(tǒng)計(jì)直方圖定制一維直方圖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);填充統(tǒng)計(jì)圖hist_name.Fill(x);hist_name.Fill(x,y);Hist_name.Fill(x,y,z);繪圖:root[0]hist_name.Draw();第二十頁(yè)20第二十一頁(yè),共57頁(yè)。ROOT腳本文件示例(4):直方圖,TFile,隨機(jī)數(shù)

$EXAMPLEDIR/ex34.C//說明ROOT直方圖、隨機(jī)數(shù)的使用,如TH1F,gRandomvoidex34(){constInt_tNEntry=10000;//創(chuàng)建一個(gè)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();//進(jìn)入文件fileh1->Write();//將h1寫入文件}執(zhí)行的時(shí)候只需要在命令提示行root-lex34.C或者進(jìn)入ROOT環(huán)境之后,運(yùn)行.xex34.C名稱調(diào)用均勻分布Uniform(),其它:Landau(mean,sigma);Binomial(ntot,prob);Poisson(mean);Exp(tau);BreitWigner

(mean,sigma);描述No.

ofBin區(qū)間第二十一頁(yè)21第二十二頁(yè),共57頁(yè)。X軸的名稱直方圖統(tǒng)計(jì)信息事例數(shù):Entries均值:Mean方差:RMS參見ROOT手冊(cè)第3章“StatisticsDisplay”直方圖的Title打開已有的root文件,如hist1.root:終端提示行下:root-lhist1.rootROOT環(huán)境下:T(“hist1.root”);.lsh1->Draw();直方圖、打開root文件第二十二頁(yè)22第二十三頁(yè),共57頁(yè)。//2維直方圖TH2F,散點(diǎn)圖,散點(diǎn)圖的協(xié)方差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維直方圖的散點(diǎn)圖hXY->GetXaxis()->SetTitle("X:Uniform");hXY->GetYaxis()->SetTitle("Y:Gaussian");Float_tcovar=hXY->GetCovariance();//協(xié)方差cout<<"Covariance="<<covar<<endl;}ROOT腳本文件示例(5):散點(diǎn)圖

$EXAMPLEDIR/ex35.C運(yùn)行:在命令提示行下root-lex35.C或在ROOT環(huán)境下.xex35.C二維直方圖的Draw()函數(shù)有很多選項(xiàng),請(qǐng)自行選擇第二十三頁(yè)23第二十四頁(yè),共57頁(yè)。hXY->Draw(“colz”);ROOT腳本文件示例(5):colz圖

$EXAMPLEDIR/ex35.C第二十四頁(yè)24第二十五頁(yè),共57頁(yè)。TTree要點(diǎn)ROOT中tree的概念(類TTree)

什么是tree,為什么tree存取數(shù)據(jù)如何定義、填充TTree并寫入文件如何讀取實(shí)驗(yàn)數(shù)據(jù)填充為TTree如何查看或讀取ROOT文件中的treeTChain第二十五頁(yè)25第二十六頁(yè),共57頁(yè)。root文件與它的tree概念一個(gè)root文件就像UNIX中的一個(gè)目錄,它可以包含目錄和沒有層次限制的目標(biāo)模塊。

即,在可以在root文件創(chuàng)建不同的目錄子目錄,目錄中存放不同的類對(duì)象或普通數(shù)據(jù)。如要求存儲(chǔ)大量的同類目標(biāo)模塊,需要引入概念:TTree:

減小磁盤空間和增加讀取速度方面被優(yōu)化TNtuple:只能存儲(chǔ)浮點(diǎn)數(shù)的TTree。盡量避免使用。

TTree采用了

branch

的體系,每個(gè)branch的讀取可以與別的branch無關(guān)。第二十六頁(yè)26第二十七頁(yè),共57頁(yè)。為什么使用TTree適用于大量的類型相同的對(duì)象可以存儲(chǔ)包括類對(duì)象、數(shù)組等各種類型數(shù)據(jù)一般情況下,tree的Branch,Leaf信息就是一個(gè)事例的完整信息有了tree之后,可以很方便對(duì)事例進(jìn)行循環(huán)處理。占用空間少,讀取速度快TTree是ROOT最強(qiáng)大的概念之一第二十七頁(yè)27第二十八頁(yè),共57頁(yè)。TTree的定義參見創(chuàng)建TTree,并設(shè)置Branch,比如:Int_tRunID;TTree*t1=newTTree("t1","testtree");TBranch*br=t1->Branch("RunID",&RunID,"RunID/I");構(gòu)造函數(shù):TTree(constchar*name,constchar*title,

Int_tsplitlevel=99);Branch成員函數(shù):virtualTBranch*Branch(constchar*name,void*address,constchar*leaflist,Int_tbufsize=32000);名稱描述Branch可以是單獨(dú)的變量,也可以是一串變量,也可以是定長(zhǎng)或不定長(zhǎng)數(shù)組,也可以是C結(jié)構(gòu)體,或者類對(duì)象(繼承自TObject,如TH1F對(duì)象)。第二十八頁(yè)28第二十九頁(yè),共57頁(yè)。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();}如何寫一個(gè)簡(jiǎn)單的TTree

$EXAMPLEDIR/ex41.C運(yùn)行:root-lex41.C或ROOT環(huán)境中:.xex41.C定義tree,參數(shù)分別為tree的名稱和描述設(shè)置Branch,參數(shù)分別為Branch的“名稱”、“地址”以及“l(fā)eaf列表和類型”。這里只有一個(gè)leaf,如果多個(gè)則用冒號(hào)分開。常用類型:C,I,F,D分別表示字符串、整型、浮點(diǎn)型和雙精度型,參見ROOT手冊(cè)第12章為每個(gè)leaf賦值,每個(gè)事例結(jié)束時(shí)填充一次。這里一共填充5000事例。好的做法是實(shí)驗(yàn)一個(gè)事例填充一次?。?!將tree寫入root文件中存盤第二十九頁(yè)29第三十頁(yè),共57頁(yè)。查看Tree的信息>root-ltree1.root

打開root文件root[1].ls

查看文件信息,發(fā)現(xiàn)TTreet1root[2]t1->Show(0);

顯示第0個(gè)event的信息root[3]t1->GetEntries()

總事例數(shù)root[4]t1->Scan();root[5]t1->Print();root[6]t1->Draw("px");第三十頁(yè)30第三十一頁(yè),共57頁(yè)。查看Tree的信息(續(xù))也可以>root-l

進(jìn)入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()第三十一頁(yè)31第三十二頁(yè),共57頁(yè)。查看Tree的信息(2)TBrowserbTBrowser打開一個(gè)瀏覽器,從中可以選擇root文件,并一層層進(jìn)入其中的tree,branch以及l(fā)eaf。類似于Windows下的Explorer。這是當(dāng)前目錄,雙擊進(jìn)入并選擇要打開的root文件,以及文件中的tree,最后可以看到tree的各個(gè)leaf雙擊leaf可以查看leaf的直方圖適合初步瀏覽,但不適合具體的數(shù)據(jù)分析處理。并不推薦使用。第三十二頁(yè)32第三十三頁(yè),共57頁(yè)。

...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");

...運(yùn)行:進(jìn)入ROOT環(huán)境后

.Lex42.Cex42w()ex42r()voidex42r(){//讀取數(shù)據(jù),適用于簡(jiǎn)單分析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");}如何讀寫含有不定長(zhǎng)數(shù)組的tree(1)

$EXAMPLEDIR/ex42.C1)估計(jì)不定長(zhǎng)數(shù)組的最大維數(shù),以該維數(shù)定義數(shù)組;如floatzv[kMaxTrack]2)定義某變量,用于存放數(shù)組的實(shí)際維數(shù)。如intntrack,表示一個(gè)事例中實(shí)際的徑跡數(shù)。3)定義tree,設(shè)置Branch。第三個(gè)參數(shù)給出數(shù)組的實(shí)際維數(shù)。如”zv[ntrack]/F”很多時(shí)候不定長(zhǎng)數(shù)組是必要的,比如正負(fù)電子對(duì)撞,記錄末態(tài)粒子的信息,末態(tài)粒子數(shù)目是不固定的。!!如何獲取root文件中的tree指針

直接畫出Branch/Leaf,可以加很多條件。第三十三頁(yè)33第三十四頁(yè),共57頁(yè)。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函數(shù)

//將tree的Branch與定義好的變量

//地址聯(lián)系起來。

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

t3->SetBranchAddress("py",py);t3->SetBranchAddress("zv",zv);t3->SetBranchAddress("pv",pv);運(yùn)行:進(jìn)入ROOT環(huán)境后

.Lex42.Cex42w()ex42r2()如何讀寫含有不定長(zhǎng)數(shù)組的tree(2)

$EXAMPLEDIR/ex42.C每獲取一個(gè)事例,這些Branch直接賦值給指定的變量。可以在循環(huán)中設(shè)定選取條件,選擇分析數(shù)據(jù)。進(jìn)行復(fù)雜細(xì)致的分析推薦使用這種方法。注:程序中//[ntrack]的意義參見ROOT手冊(cè)Streamer

//獲取事例總數(shù)Int_tnentries=t3->GetEntries();TH1I*hntrack=newTH1I("hntrack",“trkn",25,0,50);TH1F*hpt=newTH1F("hpt",“trkpt",100,0,10);

//步驟3:對(duì)所有事例循環(huán)for(inti=0;i<nentries;i++){

t3->GetEntry(i);//獲取第i個(gè)事例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();}問題:對(duì)ntrack和px的處理有什么差別?為什么?第三十四頁(yè)34第三十五頁(yè),共57頁(yè)。

...

TTree*t3=newTTree("t3","Reconstevents");//Evt_t是已經(jīng)定義好的類(詳見ex43.C)。這里的myevt一定要用new的方式定義,

//然后就可以直接將該對(duì)象設(shè)為tree的一個(gè)Branch。

//第1個(gè)參數(shù)為Branch的名字,第2個(gè)為類的名字(可省略),第3個(gè)為對(duì)象指針的地址(!!),

//第4個(gè)為緩存大小,第5個(gè)為分割級(jí)別(split-level)。

//參見手冊(cè)“AddingaBranchtoHoldanObject”

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

...//讀取tree時(shí),可以直接將對(duì)象指針的地址的賦給相應(yīng)的Branch

//需要提醒的是,第1個(gè)參數(shù)為Branch的名稱,必須與寫入時(shí)指定的名稱相同。

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

...

//GetEntry(i)獲得第i個(gè)entry后,通過myevt->ntrack(或其它成員變量)可以獲得

//相應(yīng)的數(shù)據(jù)。t3->GetEntry(i);hntrack->Fill(myevt->ntrack);如何將類對(duì)象設(shè)定為tree的Branch

$EXAMPLEDIR/ex43.C詳見ex43.C。運(yùn)行時(shí)必須通過外部編譯器如:root-lex43.C+或者在ROOT環(huán)境中.xex43.C+

這里的”+”是必須的。語(yǔ)法更嚴(yán)格,必須include需要的頭文件略過,但并非不重要第三十五頁(yè)35第三十六頁(yè),共57頁(yè)。

有時(shí)候記錄的實(shí)驗(yàn)數(shù)據(jù)是ASCII格式,或者二進(jìn)制格式。我們可以讀取這些數(shù)據(jù)轉(zhuǎn)換成ROOT中的tree,方便進(jìn)行數(shù)據(jù)分析。ex44.C讀取basic.dat(ASCII碼),轉(zhuǎn)成最簡(jiǎn)單的TTree。basic.dat中的數(shù)據(jù)分3列,分別為x,y,z坐標(biāo)。如何從ASCII文件中讀取數(shù)據(jù)轉(zhuǎn)為ROOT中的TTree/home/yangzw/examples/Lec4/ex44.C運(yùn)行:root-lex44.C

或者在root環(huán)境中:.xex44.Cvoidex44(){

ifstreamin;//定義文件流對(duì)象,i表示in,f表示file,即從某文件中讀取數(shù)據(jù)

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,只可以存放浮點(diǎn)型數(shù)據(jù)。

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個(gè)Branch分別為x,y,z每個(gè)事例填充一次第三十六頁(yè)36第三十七頁(yè),共57頁(yè)。改成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,只可以存放浮點(diǎn)型數(shù)據(jù)。

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();}略過,但并非不重要第三十七頁(yè)37第三十八頁(yè),共57頁(yè)。

讀取ASCII格式文件還有個(gè)更簡(jiǎn)便的方式,即用TTree的ReadFile函數(shù):

tree->Read);

參見ROOT手冊(cè)TTree那一章如何從ASCII文件中讀取數(shù)據(jù)轉(zhuǎn)為ROOT中的TTree$EXAMPLEDIR/ex44a.C運(yùn)行:root-lex44a.C

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

//第1個(gè)參數(shù)為要打開的文件名稱

//第2個(gè)參數(shù)是Branch的描述,即設(shè)定3個(gè)Branchx,y,zLong64_tnlines=T->ReadFile("basic.dat","x:y:z");printf("found%lldpoints\n",nlines);T->Write();}第三十八頁(yè)38第三十九頁(yè),共57頁(yè)。TChain對(duì)象是包含相同tree的ROOT文件的列表。參見User’sGuide中TChain相關(guān)章節(jié)以及TChain:分析多個(gè)root文件的利器(1)voidex45(){//定義TChain,t3為root文件中tree的名稱!!!!!!!

TChain*fChain=newTChain(“t3”);//添加所有文件至fChain,或根據(jù)需要添加部分root文件fChain->Add(“rootfiles/*.root”);//畫出t3的某個(gè)leaf,如ntrackfChain->Draw(“ntrack”);}注意:此時(shí),fChain等同于一個(gè)大root文件中的一個(gè)類"t3",該文件包含的事例數(shù)為所有文件中事例數(shù)之和(1012以內(nèi))

問題:root文件中多個(gè)tree怎么辦?第三十九頁(yè)39第四十頁(yè),共57頁(yè)。直方圖的操作直方圖的運(yùn)算加減乘除:Add,Divide,...歸一化:ScaleROOT中直方圖擬合h1->Fit();第四十頁(yè)40第四十一頁(yè),共57頁(yè)。直方圖歸一化(1)"歸一化"后,不僅BinContent變化了,BinError也變化了直方圖的歸一化voidTH1::Scale(Double_tc1,Option_t*option)默認(rèn)c1=1,把直方圖每個(gè)區(qū)間的值(BinContent)乘以c1假設(shè)sum=h1->Integral()h1->Scale(c1)之后,

h1->Integral()=c1*sum不加參數(shù)時(shí),h1->Scale()沒有變化(默認(rèn)c1=1)第四十一頁(yè)41第四十二頁(yè),共57頁(yè)。直方圖的歸一化(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個(gè)分布的差別。歸一化常用于比較兩種分布,找出區(qū)別。所以,將2個(gè)直方圖歸一化到積分相同進(jìn)行比較才直觀。注意Draw()函數(shù)的選項(xiàng)第四十二頁(yè)42第四十三頁(yè),共57頁(yè)。直方圖四則運(yùn)算(1)重要提示:對(duì)直方圖進(jìn)行四則運(yùn)算操作,一定要想明白運(yùn)算的意義

比如兩個(gè)直方圖的相加與兩個(gè)隨機(jī)變量的卷積有什么區(qū)別2.兩個(gè)直方圖的四則運(yùn)算,區(qū)間大小和區(qū)間數(shù)相同才有意義四則運(yùn)算"加減乘除"分別對(duì)應(yīng)

統(tǒng)計(jì)量(BinContent)的相加、相減、相乘、相除3.如果需要正確處理統(tǒng)計(jì)誤差,需要在對(duì)ROOT腳本中調(diào)用TH1的某個(gè)靜態(tài)成員函數(shù),即TH1::SetDefaultSumw2();voidSetDefaultSumw2(Bool_tsumw2=kTRUE)

//staticfunction.Whenthisstaticfunctioniscalledwithsumw2=kTRUE,allnewhistogramswillautomaticallyactivatethestorageofthesumofsquaresoferrors,ieTH1::Sumw2isautomaticallycalled.第四十三頁(yè)43第四十四頁(yè),共57頁(yè)。直方圖的四則運(yùn)算(2)......root[1]TH1::SetDefaultSumw2();root[1]TH1F

*h3=newTH1F(*h1);root[2]h3->Add(h1,h2,a,b);結(jié)果:h3的BinContent被a*h1+b*h2替換,一般a=b=1相加:常用于相同實(shí)驗(yàn)的數(shù)據(jù)疊加,增加統(tǒng)計(jì)量。......root[1]TH1F

*h3=newTH1F(*h1);root[2]h3->Sumw2();//也可在定義h3前TH1::SetDefaultSumw2();root[3]h3->Add(h1,h2,a,-b);結(jié)果:h3的BinContent被a*h1+b*h2替換,一般a=-b=1相減:常用于從實(shí)驗(yàn)測(cè)量的分布中扣除本底。第四十四頁(yè)44第四十五頁(yè),共57頁(yè)。直方圖的四則運(yùn)算(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);常用于效率的計(jì)算。相乘root>TH1F

*h3=newTH1F(*h1);root>h3->Sumw2();root>h3->Multiply(h1,h2,a,b);常用于對(duì)分布進(jìn)行諸如效率等的修正。思考:如果h1和h2不獨(dú)立,怎么辦?比如h1包含于h2root[4]h3->Divide(h1,h2,a,b,"B");第四十五頁(yè)45第四十六頁(yè),共57頁(yè)。直方圖四則運(yùn)算的誤差處理

雖然ROOT都提供了較完善的一維直方圖運(yùn)算功能,但對(duì)最終結(jié)果的誤差一定要仔細(xì)檢查。很多情況下,用戶需要從圖中讀出各頻數(shù)數(shù)值與誤差值,并確認(rèn)運(yùn)算無誤。包括歸一化和加減乘除在內(nèi),如果希望使用直方圖的誤差,都需要調(diào)用TH1::SetDefaultSumw2();或者,對(duì)每個(gè)直方圖(如hist)調(diào)用

hist->Sumw2();第四十六頁(yè)46第四十七頁(yè),共57頁(yè)。擬合直方圖(1)將鼠標(biāo)放到直方圖上,右鍵,出現(xiàn)直方圖操作選項(xiàng),選擇FitPanel,可以在FitPanel中選擇擬合的各個(gè)選項(xiàng),比如用什么函數(shù)擬合,擬合的區(qū)間,等等。第四十七頁(yè)47第四十八頁(yè),共57頁(yè)。用默認(rèn)的高斯擬合,并在Options菜單中選上FitParameters選項(xiàng),可以看到擬合的結(jié)果。擬合直方圖(2)并不推薦這種擬合方式:1)不適合自定義函數(shù)擬合2)不適合批處理擬合結(jié)果給出了高斯分布的3個(gè)參數(shù):常系數(shù)、均值、均方差,以及擬合的好壞chi2/ndf第四十八頁(yè)48第四十九頁(yè),共57頁(yè)。hpx->Fit("gaus");hpx->Fit("gaus","","",-3,3);擬合直方圖(3)

$EXAMPLEDIR/ex51.C自定義擬合函數(shù)TF1*fcn=newTF1("fcn","gaus",-3,3);hpx->Fit(fcn,”R”);gStyle->SetOptFit();//設(shè)置擬合選項(xiàng)擬合前往往需要給出合理的參數(shù)初值fcn->SetParameters(500,mean,sigma);擬合后取出擬合得到的參數(shù)Double_tmypar[3];fcn->GetParameters(&mypar[0]);運(yùn)行:root-lroot[0].Lex51.Croot[1]ex51r()root[2]ex51r2()用自定義的函數(shù)擬合直方圖第四十九頁(yè)49第五十頁(yè),共57頁(yè)。共振峰(Breit-Wigner分布)加上二次函數(shù)本底的擬合(一共6個(gè)參數(shù))先自定義本底函數(shù)(background)和共振峰函數(shù)(lorentianPeak),再定義這兩個(gè)函數(shù)的和為擬合函數(shù):fitFunction利用fitFunction定義TF1函數(shù)擬合直方圖(3)

$EXAMPLEDIR/ex52.C這里指定函數(shù)區(qū)間為0-3,6個(gè)參數(shù)運(yùn)行:root-lroot[0].Lex52.C注意TLegend的使用TF1*fitFcn=newTF1("fitFcn",fitFunction,0,3,6);fitFcn->SetParameter(4,0.2);為某個(gè)參數(shù)設(shè)初值(width)fitFcn->SetParLimits(5,0.6,1.4);

為某參數(shù)設(shè)置取值范圍第五十頁(yè)50第五十一頁(yè),共57頁(yè)。ROOT小結(jié)設(shè)定ROOT環(huán)境變量:ROOTSYS,PATH,LD_LIBRARY_PATH繪制各種直方圖,散點(diǎn)圖,數(shù)學(xué)函數(shù)

TH1F,TH2F,TF1,...隨機(jī)數(shù)產(chǎn)生子,各種分布

gRandom->Rndm,Uniform,Gaus,Exp,...創(chuàng)建、保存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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論