您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 理学 > ROOT在数据分析中的应用(2)
粒子物理与核物理实验中的数据分析杨振伟清华大学第四讲:ROOT在数据分析中的应用(2)2上讲回顾ROOT基本概念(C++,实验数据处理)安装与登录ROOT以及体验设置ROOT的3个环境变量$ROOTSYS,$PATH,$LD_LIBRARY_PATHROOT的语法简介完全兼容c++语法,Int_t,Float_t,Double_t,...数学函数,直方图,随机数,文件,散点图舍选法等TF1,TF2,TF3,TFile,TH1I,TH1F,TH1D,TH2F,gRandom,...补充提示1:TH1F*h1=newTH1F(h1,,100,0.,1.);h1-GetBinContent(i);//i=0,1,...,101.可以得到102个值:i=0对应underflowi=101对应overflowi=1,2,...,100为相应bin的值。补充提示2:gRandom-SetSeed(seed);需要明显给定seed。如gRandom-SetSeed(0);3本讲要点ROOT中tree的概念(类TTree)什么是tree,为什么tree存取数据如何定义、填充TTree并写入文件如何读取实验数据填充为TTree如何查看或读取ROOT文件中的treeTChain:同时处理多个相同root文件(root文件中含有相同的tree,总事例不超过1012个)chain-Add(/data/sns/090324_01.root);chain-Add(/data/sns/090325*.root);4root文件与它的tree概念一个root文件就像UNIX中的一个目录,它可以包含目录和没有层次限制的目标模块。即,在可以在root文件创建不同的目录子目录,目录中存放不同的类对象或普通数据。如要求存储大量的同类目标模块,需要引入概念:TTree:减小磁盘空间和增加读取速度方面被优化TNtuple:只能存储浮点数的TTree。尽量避免使用。TTree减少了每个目标模块的header,但仍保留类的名字,而每个同类的目标模块名字可以被压缩。TTree采用了branch的体系,每个branch的读取可以与别的branch无关。可以把tree看成root文件中的子目录,branch看成子目录中的文件或者子目录。5为什么使用TTree适用于大量的类型相同的对象可以存储包括类对象、数组等各种类型数据一般情况下,tree的Branch,Leaf信息就是一个事例的完整信息有了tree之后,可以很方便对事例进行循环处理。占用空间少,读取速度快TTree是ROOT最强大的概念之一6下载本讲例子到本地计算机cd你的工作目录wgethep.tsinghua.edu.cn/~yangzw/CourseDataAna/examples/Lec4.tgztar-zxvfLec4.tgzcdLec4或者cd你的工作目录scp-r$USER@166.111.32.64:/home/yangzw/examples/Lec4.tgz.(注意最后有个”.”,表示复制到当前目录,需要输入密码)tar-zxvfLec4.tgzcdLec4(本讲所有例题都在该目录下)7TTree的定义参见创建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对象)。8voidex41(){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;i5000;i++){gRandom-Rannor(px,py);pz=px*px+py*py;random=gRandom-Rndm();t1-Fill();//Filltree}t1-Write();}如何写一个简单的TTree/home/yangzw/examples/Lec4/ex41.C运行:root-lex41.C或ROOT环境中:.xex41.C定义tree,参数分别为tree的名称和描述设置Branch,参数分别为Branch的“名称”、“地址”以及“leaf列表和类型”。这里只有一个leaf,如果多个则用冒号分开。常用类型:C,I,F,D分别表示字符串、整型、浮点型和双精度型,参见ROOT手册195-196为每个leaf赋值,每个事例结束时填充一次。这里一共填充5000事例。好的做法是实验一个事例填充一次!!!将tree写入root文件中存盘9查看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);10查看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(pxh1);root[4]t1-Draw(py,px0,sames);root[5]t1-Draw(py,,sames);11...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=newTFile(rootfile);TTree*t3=(TTree*)f-Get(t3);t3-Draw(sqrt(px*px+py*py));htemp-SetLineColor(2);t3-Draw(sqrt(px*px+py*py),zv100,sames);}如何读写含有不定长数组的tree(1)/home/yangzw/examples/Lec4/ex42.C1)估计不定长数组的最大维数,以该维数定义数组;如floatzv[kMaxTrack]2)定义某变量,用于存放数组的实际维数。如intntrack,表示一个事例中实际的径迹数。3)定义tree,设置Branch。第三个参数给出数组的实际维数。如”zv[ntrack]/F”很多时候不定长数组是必要的,比如正负电子对撞,记录末态粒子的信息,末态粒子数目是不固定的。!!如何获取root文件中的tree指针直接画出Branch/Leaf,可以加很多条件。12voidex42r2(){TFile*f=newTFile(rootfile);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)/home/yangzw/examples/Lec4/ex42.C每获取一个事例,这些Branch直接赋值给指定的变量。可以在循环中设定选取条件,选择分析数据。进行复杂细致的分析推荐使用这种方法。注:程序中//[ntrack]的意义参见手册171-174Streamer//获取事例总数Int_tnentries=t3-GetEntries();TH1I*hntrack=newTH1I(hntrack,“trkn,25,0,50);TH1F*hpt=newTH1F(hpt,“trkpt,100,0,10);//步骤3:对所有事例循环for(inti=0;inentries;i++){t3-GetEntry(i);//获取第i个事例hntrack-Fill(ntrack);for(intj=0;jntrack;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的处理有什么差别?为什么?13...TTree*t3=newTTree(t3,Reconstevents);//Evt_t是已经定义好的类(详见ex43.C)。这里的myevt一定要用new的方式定义,//然后就可以直接将该对象设为tree的一个Branch。//第1个参数为Branch的名字,第2个为类的名字(可省略),第3个为对象指针的地址(!!),//第4个为缓存大小,第5个为分割级别(split-level)。//参见手册196-197“AddingaBranchtoHoldanObject”Evt_t*myevt=newEvt_t();t3-Bran
本文标题:ROOT在数据分析中的应用(2)
链接地址:https://www.777doc.com/doc-4782685 .html