ROOT学习——多种不同函数填充直方图(fillhistosauto.C)

使用不同函数填充直方图在很多情况下会使用到,例如要模拟放射源辐射场时,当模拟多源情况时,就需要使用多函数叠加!
fillhistoauto2p.C效果
下面给出具体代码步骤:

  1. 首先建立四个一维直方图对象:
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.);
  1. 创建一个一维直方图对象href,名称为myhref,标题为current,bin设置为50,xlow为0,xup为-1;并且设置直方图最大Entry为bsize:
auto href = new TH1D("myhref", "current", 50, 0., -1.);
href->SetBuffer(bsize);
  1. 创建第二个一维直方图对象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用户指定轮廓等级
kLogXX轴坐标使用指数刻度
klsZoomed在Y轴上缩放时设置位
kNoTitle不显示直方图标题
klsAveragebin的内容为平均值(在使用Add时)
klsNotW即使直方图填充的权重不等于1,也不对直方图进行加权
kAutoBinPTwo使用基于Power(2)的算法进行自动合并
klsHighlight设置高亮显示
  1. 创建一个双向链表:
TList *hlist = new TList;
  1. 创建几个统计变量:
TStatistic x("min"), y("max"), d("dif"), a("mean"), r("rms");
  1. 填充随机数:
 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()返回链表中的第一个对象,若该链表为空,则返回0TList::Remove(h0)表示删除列表中的h0

  1. 绘制直方图:
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();
  1. 释放内存:
delete hlist;
delete href;
delete href2;
delete h0;

代码地址:https://github.com/root-project/root/blob/master/tutorials/hist/fillhistosauto2p.C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值