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