使用不同函数填充直方图在很多情况下会使用到,例如要模拟放射源辐射场时,当模拟多源情况时,就需要使用多函数叠加!
下面给出具体代码步骤:
- 首先建立四个一维直方图对象:
TF1 *gam = new TF1("gam", "1/(1+0.1*x*0.1*x)", -100., 100.);
TF1 *gam1 = new TF1("gam", "1/(1+0.1*x*0.1*x)", -1., .25);
TF1 *iga = new TF1("inv gam", "1.-1/(1+0.1*x*0.1*x)", -100., 100.);
TF1 *iga1 = new TF1("inv gam", "1.-1/(1+0.1*x*0.1*x)", -.5, 1.);
- 创建一个一维直方图对象href,名称为myhref,标题为current,bin设置为50,xlow为0,xup为-1;并且设置直方图最大Entry为bsize:
auto href = new TH1D("myhref", "current", 50, 0., -1.);
href->SetBuffer(bsize);
- 创建第二个一维直方图对象href2,名称为myhref,标题为Auto P2, sequential,bin设置为50,xlow为0,xup为-1;并且设置直方图最大Entry为bsize:
auto href2 = new TH1D("myhref", "Auto P2, sequential", 50, 0., -1.);
href2->SetBit(TH1::kAutoBinPTwo);
href2->SetBuffer(bsize);
其中SetBit(f)
是设置或取消f中的状态,f可包含的状态有:
f | 含义 |
---|---|
kNoStats | 不绘制统计框 |
kUserContour | 用户指定轮廓等级 |
kLogX | X轴坐标使用指数刻度 |
klsZoomed | 在Y轴上缩放时设置位 |
kNoTitle | 不显示直方图标题 |
klsAverage | bin的内容为平均值(在使用Add时) |
klsNotW | 即使直方图填充的权重不等于1,也不对直方图进行加权 |
kAutoBinPTwo | 使用基于Power(2)的算法进行自动合并 |
klsHighlight | 设置高亮显示 |
- 创建一个双向链表:
TList *hlist = new TList;
- 创建几个统计变量:
TStatistic x("min"), y("max"), d("dif"), a("mean"), r("rms");
- 填充随机数:
for (UInt_t i = 0; i < n; ++i) {
Double_t xx;
switch (opt) {
case 1: xx = rndm.Gaus(3, 1); break;
case 2: xx = rndm.Rndm() * 100. - 50.; break;
case 3: xx = gam->GetRandom(); break;
case 4: xx = gam1->GetRandom(); break;
case 5: xx = iga->GetRandom(); break;
case 6: xx = iga1->GetRandom(); break;
default: xx = rndm.Gaus(0, 1);
}
if (buffering) {
if (xx > xma)
xma = xx;
if (xx < xmi)
xmi = xx;
xw.Fill(xx);
}
hw->Fill(xx);
href->Fill(xx);
href2->Fill(xx);
if (!hw->GetBuffer()) {
// Not buffering anymore
buffering = kFALSE;
}
}
创建一个一维直方图合并链表中的数据:
TH1D *h0 = (TH1D *)hlist->First();
hlist->Remove(h0);
if (!h0->Merge(hlist))
return;
其中,TList::First()
返回链表中的第一个对象,若该链表为空,则返回0
;TList::Remove(h0)
表示删除列表中的h0
;
- 绘制直方图:
if (gROOT->GetListOfCanvases()->FindObject("c3"))
delete gROOT->GetListOfCanvases()->FindObject("c3");
TCanvas *c3 = new TCanvas("c3", "c3", 800, 800);
c3->Divide(1, 3);
c3->cd(1);
h0->StatOverflows();
h0->DrawClone("HIST");
c3->cd(2);
href2->StatOverflows();
href2->DrawClone();
c3->cd(3);
href->StatOverflows();
href->DrawClone();
c3->Update();
- 释放内存:
delete hlist;
delete href;
delete href2;
delete h0;
代码地址:https://github.com/root-project/root/blob/master/tutorials/hist/fillhistosauto2p.C