ROOT(a Data analysis Framework)-Note4: iSTEP day1

Note4: TF1 & TH1

最近参加了一个叫做iSTEP的暑期学校,这里教授一些基本的ROOT使用方法。曾经用root的过程忘的差不多了,也没有记录。现在正好记录一下。

TF1类

TF1类是一个数学函数的类,基本的用法就是画一些函数的图像。

root [0] TF1* f = new TF1("f","sin(x)",-10,10)
(TF1 *) 0x55ad7a22f1f0

像这样就建立了一个TF1的对象,其中“f”是它的名称[1],“sin(x)”是它的内容,后面两项是自变量的取值范围。第二行显示,已经成功地创建了一个TF1类的指针。之后可以使用这个指针完成很多操作。最简单的功能就是画出图像:

root[1] f->Draw()

输出的结果

C++的内容:f是一个类的指针,这个类的成员方法,如Draw(),要用->调用。

还可以为一个函数设置参数:

root [2] TF1* f1 = new TF1("f1","[0]+sin(x)",-10,10)
(TF1 *) 0x55ad7a976f80
root [3] f1->SetParameters(10,1)
root [6] f1->Draw()

输出了新的图片
其中[0]就代表一个参数,类似于函数 f 1 = a + s i n ( x ) f1 = a+sin(x) ,只不过a写成了[0]的形式。这样,一个带参数的函数就完成了,在Draw之前,需要设定a的值,就是root[3]的那行命令,语法是SetParameters(参数1的值, 参数2的值, 参数3的值, ... , 参数的总数),再Draw之后可以看到参数已经生效。一个具有参数的函数可以用来做自定义拟合,这个我只是看到,还没有实践。

TH1类

TH1类是一个直方图的类,可以将很多数据填充到其中,然后形成一个直方图,根据填充数据的精度分为TH1F、TH1D等。

root [1] TH1D* h = new TH1D("h","h",100,-10,10)
(TH1D *) 0x5633693cfc50

构造函数TF1()中的参数分别是,内存名、名字、bin的数量、bin的起始和结束位置。

root [2] h->FillRandom("gaus",1000)
root [3] h->Draw()

输出的又一个图

FillRandom()方法向h中添加了1000个高斯分布的随机数。画出图来就是这样,如果增加填充数据量,可以降低直方图的误差,误差可以体现在error bar上:

TF1 f = TF1("f","1/(x+12)",-10,10);
TH1D* h = new TH1D("h","h",100,-10,10);
h->FillRandom("gaus",1000);
TCanvas* c = new TCanvas();
c->Divide(1,3);
c->cd(1);
h->DrawClone("e1");
c->cd(2);
h->FillRandom("gaus",9000);
h->DrawClone("e1");
c->cd(3);
for(int i=0; i<100000;i++){ h->Fill(f.GetRandom()); }
h->DrawClone("e1");
c->Draw()

输出的新的图
这几行代码里面加入了其他的方法,并且可以看到TF1类的另一个用法,即获取特定分布的随机数,当然,这要求函数在特定区间中是可积的,否则不能作为一个概率分布使用。


PS:关于TF1和TH1参数有个小问题

官方的解释是:TF1中第一个参数是字符串,代表Name,TH1中前两个参数是字符串,分别代表Name和Title。但我的理解上,这两个Name是有些细微区别的,可以在定义一个TF1时使用其他TF1对象的Name,重名并不会更改对象,但会覆盖这个Name对应的函数:

TF1 * f1 = new TF1("f1name", "sin(x)", -10,10);
TF1 * f2 = new TF1("f1name", "x*f1name",-10,10);
TF1 * f3 = new TF1("f3name", "f1name",-10,10);
TCanvas * c = new TCanvas();
c->Divide(3,1);
c->cd(1);
f1->Draw();
c->cd(2);
f2->Draw();
c->cd(3);
f3->Draw();
c->Draw();

这样就看出来了

而对于TH1来讲,是不能重名的,一旦重名,就会有内存溢出的风险,而ROOT进行解释运行时,只会报出Warning讲存在潜在的内存泄漏:

Warning in TROOT::Append: Replacing existing TH1: h1name (Potential memory leak).

通常,Name总是和对象名相同,以免出现问题。

发布了29 篇原创文章 · 获赞 3 · 访问量 6698

猜你喜欢

转载自blog.csdn.net/weixin_43316938/article/details/96011840