Re: Can not work a function AddExec on compiled mode?

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Mar 06 2000 - 21:57:56 MET


When the macro is interpreted, CINT knows about the symbols gr1 and 
gr2 because they refer to pad names (one of the CINT C++ extensions).
The commands specified in TPad::AddExec must be valid CINT commands.
In case, one wants to refer to a global variable (say your gr1 and gr2),
one can make use of a special list supported by gROOT,
called ListOfSpecials.
You simply add your objects, in the example below the 3 TGraph
objects, to this list. In the zoompad function, you then have
to get a pointer to these objects, searching by name.
 See the code below
   
   Rene Brun
   
  void zoom3()
  {
     gROOT->Reset();

     TCanvas *c1 = new TCanvas("c1","TCanvas",250,200,990,720);

     pad1 = new TPad("pad1","Window N1",0.02,0.66,0.98,0.96,18);
     pad2 = new TPad("pad2","Window N2",0.02,0.34,0.98,0.64,18);
     pad3 = new TPad("pad3","Window N3",0.02,0.02,0.98,0.32,18);

     pad1->SetGrid();
     pad1->SetBottomMargin(0.19);
   
     pad2->SetGrid();
     pad2->SetBottomMargin(0.19);
   
     pad3->SetGrid();
     pad3->SetBottomMargin(0.19);

     pad1->Draw();
     pad2->Draw();
     pad3->Draw();

     pad1->cd(); 

     Float_t x[100], y[100];
     Int_t n = 20;
     for (Int_t i=0;i<n;i++) {
       x[i] = i*0.1;
       y[i] = 10*sin(x[i]+0.2);
     }
     gr1 = new TGraph(n,x,y); 
     gr1->SetName("gr1"); 
     gROOT->GetListOfSpecials()->Add(gr1); 
     gr1->Draw("AC*");

     gPad->AddExec("ex","zoompad(\"gr1\",\"gr2\")");
     gPad->AddExec("ex","zoompad(\"gr1\",\"gr3\")");

     pad2->cd();

     Float_t x[100], y[100];
     Int_t n = 20;
     for (Int_t i=0;i<n;i++) {
       x[i] = i*0.1;
       y[i] = 10*cos(x[i]+0.2);
     }
     gr2 = new TGraph(n,x,y);
     gr2->SetName("gr2");
     gROOT->GetListOfSpecials()->Add(gr2); 

     gr2->Draw("AC*");

     pad3->cd();

     Float_t x[100], y[100];
     Int_t n = 20;
     for (Int_t i=0;i<n;i++) {
       x[i] = i*0.1;
       y[i] = x[i];
     }
     gr3 = new TGraph(n,x,y);
     gr3->SetName("gr3");
     gROOT->GetListOfSpecials()->Add(gr3); 
     gr3->Draw("AC*");

     c1->Update();
}


void zoompad(const char *ngr1, const char *ngr2) 
{
   int event = gPad->GetEvent();
   if (event != 11) return;
   TObject *select = gPad->GetSelected();
   if (!select) return;
   TGraph *tgr1 = (TGraph*)gROOT->GetListOfSpecials()->FindObject(ngr1);
   TGraph *tgr2 = (TGraph*)gROOT->GetListOfSpecials()->FindObject(ngr2);
   TAxis *axis1 = tgr1->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 = tgr2->GetXaxis();
   Int_t newmin = axis2->FindBin(xmin);
   Int_t newmax = axis2->FindBin(xmax);
   axis2->SetRange(newmin,newmax);

   if (gr2){
     pad2->Modified();
     pad2->Update();
   }
   if(gr3){
     pad3->Modified();
     pad3->Update();
   }
}


On Mon, 6 Mar 2000, Yongzhao Zhou wrote:

> Hi, Rooters,
> A macro names threezoom which make three TGraph pictures zooming in
> syn can work well on interpreted mode of root 2.23/12 of AIX4.3 as
> 
>   void threezoom()
>   {
>      gROOT->Reset();
> 
>      TCanvas *c1 = new TCanvas("c1","TCanvas",250,200,990,720);
> 
>      pad1 = new TPad("pad1","Window N1",0.02,0.66,0.98,0.96,18);
>      pad2 = new TPad("pad2","Window N2",0.02,0.34,0.98,0.64,18);
>      pad3 = new TPad("pad3","Window N3",0.02,0.02,0.98,0.32,18);
> 
>      pad1->SetGrid();
>      pad1->SetBottomMargin(0.19);
>    
>      pad2->SetGrid();
>      pad2->SetBottomMargin(0.19);
>    
>      pad3->SetGrid();
>      pad3->SetBottomMargin(0.19);
> 
>      pad1->Draw();
>      pad2->Draw();
>      pad3->Draw();
> 
>      pad1->cd(); 
> 
>      Float_t x[100], y[100];
>      Int_t n = 20;
>      for (Int_t i=0;i<n;i++) {
>        x[i] = i*0.1;
>        y[i] = 10*sin(x[i]+0.2);
>      }
>      gr1 = new TGraph(n,x,y);	
>      gr1->Draw("AC*");
> 
>      gPad->AddExec("ex","zoompad(gr1,gr2)");
>      gPad->AddExec("ex","zoompad(gr1,gr3)");
> 
>      pad2->cd();
> 
>      Float_t x[100], y[100];
>      Int_t n = 20;
>      for (Int_t i=0;i<n;i++) {
>        x[i] = i*0.1;
>        y[i] = 10*cos(x[i]+0.2);
>      }
>      gr2 = new TGraph(n,x,y);
> 
>      gr2->Draw("AC*");
> 
>      pad3->cd();
> 
>      Float_t x[100], y[100];
>      Int_t n = 20;
>      for (Int_t i=0;i<n;i++) {
>        x[i] = i*0.1;
>        y[i] = x[i];
>      }
>      gr3 = new TGraph(n,x,y);
>      gr3->Draw("AC*");
> 
>      c1->Update();
> }
> 
> 
> void zoompad(TGraph *tgr1, TGraph *tgr2) 
> {
>    int event = gPad->GetEvent();
>    if (event != 11) return;
>    TObject *select = gPad->GetSelected();
>    if (!select) return;
>    TAxis *axis1 = tgr1->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 = tgr2->GetXaxis();
>    Int_t newmin = axis2->FindBin(xmin);
>    Int_t newmax = axis2->FindBin(xmax);
>    axis2->SetRange(newmin,newmax);
> 
>    if (gr2){
>      pad2->Modified();
>      pad2->Update();
>    }
>    if(gr3){
>      pad3->Modified();
>      pad3->Update();
>    }
> }
> 
> But there aer always error messages if the same codes (sure, some statements
> sould be changed) works on compiled mode on same system:
> 
> *** Interpreter error recovered ***
> Error: No symbol gr1 in current scope  FILE:/tmp/oeaPlnizS_cint LINE:1
> Error: No symbol gr3 in current scope  FILE:/tmp/oeaPlnizS_cint LINE:1
> 
> Does it means that function AddExec just can work under interpreted mode
> and can not work under compiled mode?
> Thanks for any help.
> Best,
> ZYZ
>    
> ------
> Yongzhao Zhou, KLOE, LNF, INFN, Italy
> Tel:39-06-94032696 Fax:39-06-94032427
> 



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