Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
hist045_Graphics_highlight_ntuple.C File Reference

Detailed Description

This tutorial demonstrates how the highlight mechanism can be used on a ntuple.

The ntuple in hsimple.root is drawn with three different selections. Moving the mouse over the two 1D representation display the on 2D plot the events contributing to the highlighted bin.

TList *list1 = nullptr, *list2 = nullptr;
TList *InitGraphs(TNtuple *nt, TH1F *histo, Bool_t is_top)
{
Double_t *px = nt->GetV1();
Double_t *py = nt->GetV2();
Double_t *pz = nt->GetV3();
auto list = new TList();
Int_t nbins = histo->GetNbinsX();
for (Int_t bin = 0; bin < nbins; bin++) {
auto 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);
}
for (Long64_t ie = 0; ie < nev; ie++) {
Double_t value = is_top ? pz[ie] : px[ie] * py[ie] * pz[ie];
Int_t bin = histo->FindBin(value) - 1;
auto g = dynamic_cast<TGraph *>(list->At(bin));
if (g)
g->SetPoint(g->GetN(), py[ie], px[ie]);
}
return list;
}
void Highlight3(TVirtualPad *pad, TObject *obj, Int_t xhb, Int_t yhb)
{
auto histo = dynamic_cast<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 = nullptr;
if (!strcmp(histo->GetName(), "histo1"))
list = list1;
else if (!strcmp(histo->GetName(), "histo2"))
list = list2;
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();
if (savepad)
savepad->cd();
}
void hist045_Graphics_highlight_ntuple()
{
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;
TNtuple *ntuple;
file->GetObject("ntuple", ntuple);
if (!ntuple)
return;
const char *cut = "pz > 3.0";
TCanvas *Canvas1 = new TCanvas("Canvas1", "Canvas1", 0, 0, 700, 500);
Canvas1->HighlightConnect("Highlight3(TVirtualPad*,TObject*,Int_t,Int_t)");
Canvas1->Divide(1, 2);
TCanvas *Canvas2 = new TCanvas("Canvas2", "Canvas2", 705, 0, 500, 500);
// Case1, histo1, pz distribution
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();
// Case2, histo2, px*py*pz distribution
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();
// set highlight after first drawing completed
histo1->SetHighlight();
histo2->SetHighlight();
// Common graph (all entries, all histo bins)
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");
// Must be last
ntuple->Draw("px:py:pz", cut, "goff");
list1 = InitGraphs(ntuple, histo1, true);
list2 = InitGraphs(ntuple, histo2, false);
}
#define g(i)
Definition RSha256.hxx:105
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
long long Long64_t
Portable signed long integer 8 bytes.
Definition RtypesCore.h:83
@ kGreen
Definition Rtypes.h:67
#define gInterpreter
@ kCanDelete
Definition TObject.h:375
@ kCannotPick
Definition TObject.h:380
#define gROOT
Definition TROOT.h:417
#define gPad
virtual Color_t GetLineColor() const
Return the line color.
Definition TAttLine.h:36
The Canvas class.
Definition TCanvas.h:23
virtual void HighlightConnect(const char *slot)
This is "simplification" for function TCanvas::Connect with Highlighted signal for specific slot.
Definition TCanvas.cxx:1624
TVirtualPad * cd(Int_t subpadnumber=0) override
Set current canvas & pad.
Definition TCanvas.cxx:716
void Update() override
Update canvas pad buffers.
Definition TCanvas.cxx:2486
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
Definition TFile.h:130
void Draw(Option_t *chopt="") override
Default Draw method for all objects.
TAxis * GetXaxis() const
TAxis * GetYaxis() const
void SetTitle(const char *title="") override
Set the title of the TNamed.
1-D histogram with a float per channel (see TH1 documentation)
Definition TH1.h:878
virtual Int_t GetNbinsX() const
Definition TH1.h:541
virtual Bool_t IsHighlight() const
Definition TH1.h:585
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
Definition TH1.cxx:3727
2-D histogram with a float per channel (see TH1 documentation)
Definition TH2.h:345
A doubly linked list.
Definition TList.h:38
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:173
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
A simple TTree restricted to a list of float variables only.
Definition TNtuple.h:28
Mother of all ROOT objects.
Definition TObject.h:42
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:888
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
Automatic pad generation by division.
Definition TPad.cxx:1295
TObject * FindObject(const char *name) const override
Search if object named name is inside this pad or in pads inside this pad.
Definition TPad.cxx:2693
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2385
Definition TText.h:22
virtual Long64_t GetSelectedRows()
Definition TTree.h:600
virtual Double_t * GetV3()
Definition TTree.h:627
virtual Double_t * GetV1()
Definition TTree.h:623
virtual Double_t * GetV2()
Definition TTree.h:625
TVirtualPad is an abstract base class for the Pad and Canvas classes.
Definition TVirtualPad.h:51
virtual TVirtualPad * cd(Int_t subpadnumber=0)=0
Date
March 2018
Author
Jan Musinsky

Definition in file hist045_Graphics_highlight_ntuple.C.