/// \file /// \ingroup tutorial_hist /// /// This tutorial demonstrates how the highlight mechanism can be used on an histogram. /// A 1D histogram is created. /// Then an highlight method is connected to the histogram. Moving the mouse /// on the histogram will open a new canvas showing in real time a zoom around /// the highlighted bin. /// /// \macro_code /// /// \date March 2018 /// \author Jan Musinsky void HighlightZoom(TVirtualPad *pad, TObject *obj, Int_t xhb, Int_t yhb); TText *info; void hlHisto4() { auto Canvas1 = new TCanvas("Canvas1", "", 0, 0, 600, 400); auto f1 = new TF1("f1", "x*gaus(0) + [3]*abs(sin(x)/x)", -50.0, 50.0); f1->SetParameters(20.0, 4.0, 1.0, 20.0); auto h1 = new TH1F("h1", "Test random numbers", 200, -50.0, 50.0); h1->FillRandom("f1", 100000); h1->Draw(); h1->Fit(f1, "Q"); gStyle->SetGridColor(kGray); Canvas1->SetGrid(); info = new TText(0.0, h1->GetMaximum()*0.7, "please move the mouse over the frame"); info->SetTextSize(0.04); info->SetTextAlign(22); info->SetTextColor(kRed-1); info->SetBit(kCannotPick); info->Draw(); Canvas1->Update(); h1->SetHighlight(); Canvas1->HighlightConnect("HighlightZoom(TVirtualPad*,TObject*,Int_t,Int_t)"); } void HighlightZoom(TVirtualPad *pad, TObject *obj, Int_t xhb, Int_t yhb) { auto h = (TH1F *)obj; if(!h) return; auto Canvas2 = (TCanvas *)gROOT->GetListOfCanvases()->FindObject("Canvas2"); static TH1 *hz = 0; if (!h->IsHighlight()) { // after highlight disabled if (Canvas2) delete Canvas2; if (hz) { delete hz; hz = 0; } return; } info->SetTitle(""); if (!Canvas2) { Canvas2 = new TCanvas("Canvas2", "Canvas2", 605, 0, 400, 400); Canvas2->SetGrid(); if (hz) hz->Draw(); // after reopen this canvas } if (!hz) { hz = (TH1 *)h->Clone("hz"); hz->SetTitle(TString::Format("%s (zoomed)", hz->GetTitle())); hz->SetStats(kFALSE); hz->Draw(); Canvas2->Update(); hz->SetHighlight(kFALSE); } Int_t zf = hz->GetNbinsX()*0.05; // zoom factor hz->GetXaxis()->SetRange(xhb-zf, xhb+zf); Canvas2->Modified(); Canvas2->Update(); }