Re: Zooming two histograms in sync

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Feb 28 2000 - 08:40:24 MET


Anton,
Yesterday, I mailed to you an example based to TPad::AddExec.
Below is a simpler example using directly the class TExec (also used
by TPad::AddExec). When you add a TExec object to the histogram list of
functions, this object is executed everytime TH1::Paint is executed.
In the function (or macro) referenced by the TExec, you can call other
Paint functions if you want. (see documentation of class TExec.

Rene Brun

TH1F *h1, *h2;
TPad *pad1, *pad2;
void zoom1() {
   h1 = new TH1F("h1","h1",100, -4,4);
   h2 = new TH1F("h2","h2",1000,-4,4);
   for (Int_t i=0;i<10000;i++) {
      h1->Fill(gRandom->Gaus(0,1));
      h2->Fill(gRandom->Gaus(0,1));
   }
   TCanvas *c1 = new TCanvas("c1","test zoom2",700,900);
   c1->Divide(1,2);
   c1->cd(1);
   pad1 = gPad;
   h1->Draw();
   TExec *ex = new TExec("ex","zoompad2()");
   h1->GetListOfFunctions()->Add(ex);
   c1->cd(2);
   pad2 = gPad;
   h2->Draw();   
}
void zoompad2() {
   TAxis *axis1 = h1->GetXaxis();
   Int_t binmin = axis1->GetFirst();
   Int_t binmax = axis1->GetLast();
   Float_t xmin = axis1->GetBinLowEdge(binmin);
   Float_t xmax = axis1->GetBinLowEdge(binmax);
   TAxis *axis2 = h2->GetXaxis();
   Int_t newmin = axis2->FindBin(xmin);
   Int_t newmax = axis2->FindBin(xmax);
   axis2->SetRange(newmin,newmax);
   pad2->Modified();
}


Anton Fokin wrote:
> 
> Sorry for being not precise. Of course it is possible to distinguish between
> different types of events in a pad. I meant that there is no way to catch
> "zoom" event (there is no zoom event). Also, it would be nice to have
> "unzoom" event, otherwise my second pad stays zoommed after I unzoom the
> first one. (it gets unzoommed after I produce a mouse click in the first pad
> though). Anyway it looks nice :)
> 
> /Anton
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch
> [mailto:owner-roottalk@pcroot.cern.ch]On Behalf Of Anton Fokin
> Sent: Sunday, February 27, 2000 8:01 PM
> To: Rene Brun
> Cc: roottalk@pcroot.cern.ch
> Subject: RE: Zooming two histograms in sync
> 
> Fantastic!!! :))
> 
> The only side effect is that it executes zoompad2() on any event in pad1. Is
> there a mechanism to distinguish between events?
> 
> /Anton
> 
> -----Original Message-----
> From: Rene Brun [mailto:brun@pcbrun.cern.ch]
> Sent: Sunday, February 27, 2000 7:42 PM
> To: Anton Fokin
> Cc: roottalk@pcroot.cern.ch
> Subject: RE: Zooming two histograms in sync
> 
> Anton,
> I hope you will get some inspiration from the macro below.
> To use it, do
>  Root > .L zoom.C
>  Root > zoom()
> 
> You can use the normal zoom on the x axis of the histogram
> in the top pad. The histogram in the second pad will be automatically
> redrawn in the second pad when you release the mouse.
> You can implement a different logic to react to other values of event.
> You can also look at $ROOTSYS/tutorials/exec2.C
> 
> Rene Brun
> 
> //--------------file zoom.C
> TH1F *h1, *h2;
> TPad *pad1, *pad2;
> void zoom() {
>    h1 = new TH1F("h1","h1",100, -4,4);
>    h2 = new TH1F("h2","h2",1000,-4,4);
>    for (Int_t i=0;i<10000;i++) {
>       h1->Fill(gRandom->Gaus(0,1));
>       h2->Fill(gRandom->Gaus(0,1));
>    }
>    TCanvas *c1 = new TCanvas("c1","test zoom2",700,900);
>    c1->Divide(1,2);
>    c1->cd(1);
>    pad1 = gPad;
>    h1->Draw();
>    gPad->AddExec("ex","zoompad2()");
>    c1->cd(2);
>    pad2 = gPad;
>    h2->Draw();
> }
> void zoompad2() {
>    int event = gPad->GetEvent();
>    if (event != 11) return;
>    TObject *select = gPad->GetSelected();
>    if (!select) return;
>    TAxis *axis1 = h1->GetXaxis();
>    Int_t binmin = axis1->GetFirst();
>    Int_t binmax = axis1->GetLast();
>    Float_t xmin = axis1->GetBinLowEdge(binmin);
>    Float_t xmax = axis1->GetBinLowEdge(binmax);
>    TAxis *axis2 = h2->GetXaxis();
>    Int_t newmin = axis2->FindBin(xmin);
>    Int_t newmax = axis2->FindBin(xmax);
>    axis2->SetRange(newmin,newmax);
>    pad2->Modified();
>    pad2->Update();
> }
> 
> On Sun, 27 Feb
> 2000, Anton Fokin
> wrote:
> 
> > Rene,
> >
> > I meant two pads and mouse zoom. Of course it is trivial to do in the
> solid
> > code :) The problem is that I have checked zooming in root and do not see
> a
> > straightforward way to catch a mouse zoom event and use it to zoom the
> > second histogram.
> >
> > -----Original Message-----
> > From: Rene Brun [mailto:brun@pcbrun.cern.ch]
> > Sent: Sunday, February 27, 2000 9:38 AM
> > To: Anton Fokin
> > Cc: Rene Brun; roottalk@pcroot.cern.ch
> > Subject: Re: Zooming two histograms in sync
> >
> >
> > Anton,
> >
> > Assume TH1 *h1 in TPad *pad1 and h2 in pad2, do
> >    h1->GetXaxis()->SetRange(firstbin,lastbin); pad1->Modified();
> >    h2->GetXaxis()->SetRange(firstbin,lastbin); pad2->Modified();
> >    canvas->Update();
> >
> > Rene Brun
> >
> >
> > On Sat, 26 Feb 2000, Anton Fokin wrote:
> >
> > > Hi rooters,
> > >
> > > I have two histograms in two pads in a canvas and I zoom histograms in
> > sync,
> > > i.e. if I zoom the upper one, the lower one should also zoom to the same
> > > range. (Imagine how it is important for time series applications). What
> is
> > > the best way to implement it?
> > >
> > > Best regards,
> > > Anton
> > >
> > >
> >
> >



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:20 MET