ROOT学习——ntuple中直方图的Highlight显示(hlHisto3.C)

本示例演示了如何在ntuple上使用高亮机制,hsimple.root中的ntuple是用三种不同选择绘制的,将鼠标移到两个1D表示上方,将在2D图上显示有助于突出显示的bin的事件。
Canvas1
Canvas2
下面介绍具体步骤:

  1. 定义全局变量:
TList *list1 = 0;
TList *list2 = 0;
  1. 设置InitGraphs函数:
void InitGraphs(TNtuple *nt, TH1F *histo)
{
   Long64_t nev = nt->GetSelectedRows();
   Double_t *px = nt->GetV1();
   Double_t *py = nt->GetV2();
   Double_t *pz = nt->GetV3();

   auto list = new TList();
   if      (histo->GetUniqueID() == 1) list1 = list;
   else if (histo->GetUniqueID() == 2) list2 = list;
   else  return;

   Int_t nbins = histo->GetNbinsX();
   Int_t bin;
   TGraph *g;
   for (bin = 0; bin < nbins; bin++) {
      g = new TGraph();
      g->SetName(TString::Format("g%sbin_%d", histo->GetName(), bin+1));
      g->SetBit(kCannotPick);
      g->SetMarkerStyle(25);
      g->SetMarkerColor(histo->GetLineColor());
      list->Add(g);
   }

   Double_t value = 0.0;
   for (Long64_t ie = 0; ie < nev; ie++) {
      if (histo->GetUniqueID() == 1) value = pz[ie];
      if (histo->GetUniqueID() == 2) value = px[ie]*py[ie]*pz[ie];
      bin = histo->FindBin(value) - 1;
      g = (TGraph *)list->At(bin);
      if (!g) continue; // under/overflow
      g->SetPoint(g->GetN(), py[ie], px[ie]); // reverse as px:py
   }
}
  1. 设置Highlight函数:
void Highlight3(TVirtualPad *pad, TObject *obj, Int_t xhb, Int_t yhb)
{
   auto histo = (TH1F *)obj;
   if(!histo) return;

   TCanvas *Canvas2 = (TCanvas *)gROOT->GetListOfCanvases()->FindObject("Canvas2");
   if (!Canvas2) return;
   TGraph *gcommon = (TGraph *)Canvas2->FindObject("Graph");
   if (!gcommon) return;

   TList *list = 0;
   if      (histo->GetUniqueID() == 1) list = list1; // case1
   else if (histo->GetUniqueID() == 2) list = list2; // case2
   if (!list) return;
   TGraph *g = (TGraph *)list->At(xhb);
   if (!g) return;

   TVirtualPad *savepad = gPad;
   Canvas2->cd();
   gcommon->Draw("AP");
   //gcommon->SetTitle(TString::Format("%d / %d", g->GetN(), gcommon->GetN()));
   if (histo->IsHighlight()) // don't draw g after highlight disabled
      if (g->GetN() > 0) g->Draw("P");
   Canvas2->Update();
   savepad->cd();
}
  1. 读取root文件:
auto dir = gROOT->GetTutorialDir();
dir.Append("/hsimple.C");
dir.ReplaceAll("/./","/");
if (!gInterpreter->IsLoaded(dir.Data())) gInterpreter->LoadMacro(dir.Data());
auto file = (TFile*)gROOT->ProcessLineFast("hsimple(1)");
if (!file) return;
  1. 获取ntuple:
TNtuple *ntuple;
file->GetObject("ntuple", ntuple);
if (!ntuple) return;
  1. 设置截断参数:
const char *cut = "pz > 3.0";
  1. 创建两块画布:
TCanvas *Canvas1 = new TCanvas("Canvas1", "Canvas1", 0, 0, 700, 500);
Canvas1->Divide(1, 2);
TCanvas *Canvas2 = new TCanvas("Canvas2", "Canvas2", 705, 0, 500, 500);
  1. 在第一块画布上方绘制histo1与pz的分布信息:
Canvas1->cd(1);
ntuple->Draw("pz>>histo1(100, 2.0, 12.0)", cut);
auto histo1 = (TH1F *)gPad->FindObject("histo1");
auto info1  = new TText(7.0, histo1->GetMaximum()*0.6,"please move the mouse over the frame");
info1->SetTextColor(histo1->GetLineColor());
info1->SetBit(kCannotPick);
info1->Draw();
  1. 在第一块画布下方绘制histo2与pxpypz的分布信息:
Canvas1->cd(2);
ntuple->Draw("(px*py*pz)>>histo2(100, -50.0, 50.0)", cut);
auto histo2 = (TH1F *)gPad->FindObject("histo2");
histo2->SetLineColor(kGreen+2);
auto info2 = new TText(10.0, histo2->GetMaximum()*0.6, info1->GetTitle());
info2->SetTextColor(histo2->GetLineColor());
info2->SetBit(kCannotPick);
info2->Draw();
Canvas1->Update();
  1. 设置Highlight:
histo1->SetHighlight();
histo2->SetHighlight();
Canvas1->HighlightConnect("Highlight3(TVirtualPad*,TObject*,Int_t,Int_t)");
  1. 在第二块画布上绘制graph信息:
Canvas2->cd();
ntuple->Draw("px:py", cut);
auto gcommon = (TGraph *)gPad->FindObject("Graph");
gcommon->SetBit(kCanDelete, kFALSE); // will be redraw
auto htemp = (TH2F *)gPad->FindObject("htemp");
gcommon->SetTitle(htemp->GetTitle());
gcommon->GetXaxis()->SetTitle(htemp->GetXaxis()->GetTitle());
gcommon->GetYaxis()->SetTitle(htemp->GetYaxis()->GetTitle());
gcommon->Draw("AP");
  1. 设置初始化graph(必须在最后一步):
ntuple->Draw("px:py:pz", cut, "goff");
histo1->SetUniqueID(1); // mark as case1
histo2->SetUniqueID(2); // mark as case2
InitGraphs(ntuple, histo1);
InitGraphs(ntuple, histo2);

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值