Re: TCanvas via shared memory

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sat Nov 06 1999 - 18:34:28 MET


Hi Frank,
In your compiled main program, you have a statement
  c->Print();
before 
  c->Draw();

Because there has been no graphics at this point, Root thinks it is in
batch mode.
If you move the Print statement after c->Draw(), you will see
the canvas with the histograms.

I will look how to modify the logic to avoid this side effect.

Rene Brun

On Fri, 5 Nov 1999, Frank Hartmann wrote:

> Hi all,
> 
> 
> We like to transfer a TCanvas from shared memory TMapFile into 
>  a server and then via TSocket to the client. This works well for 
> objects like TH1 and TList and some other.
> It works for TCanvas by using some ROOT macros, but we have problems 
> with the compiled version (KAI C++ 3.3E compiler). I have the impression 
> that the TCanvas is not completly extracted out of the shared memory.
> I'm not absolutetly sure about initialization of root in compiled version, 
> but more about it later. 
> I provide the code of the macros and the compiled verions.
> 
> 
> here are the code of the macros which are working fine:
> *****************************
> 1.) Producer of shared memory
> 
> #ifndef __CINT__
> #include <iostream.h>
> #include "TROOT.h"
> #include "TH1.h"
> #include "TH2.h"
> #include "TRandom.h"
> #include "TMapFile.h"
> #include "TSystem.h"
> #include "TDirectory.h"
> int main ()
> {
>    TROOT producer("producer","Simple histogram producer to shared memory
> ");
> #endif
> #ifdef __CINT__
>    {
>    gROOT->Reset();
> #endif
> 
>       //Now create the memory map file
> 
>    //TMapFile *mfile;
>    //  mfile = TMapFile::Create("hsimple.map","RECREATE", 50000,
>    //                       "Demo memory mapped file with histograms");
> 
>    // Create  1d and  2d  histograms. These objects will
>    // be automatically added to the current directory, i.e. mfile.
>       TCanvas *c1;
>       TPad *pad1, *pad2, *pad3;  
>       c1 = new TCanvas("c1","Shared Memory Consumer
> Example",200,10,700,780); 
>       pad1 = new TPad("pad1","This is pad1",0.02,0.52,0.98,0.98,21);
>       pad2 = new TPad("pad2","This is pad2",0.02,0.02,0.48,0.48,21);
>       pad3 = new TPad("pad3","This is pad3",0.52,0.02,0.98,0.48,21);
>       pad1->Draw();
>       pad2->Draw();
>       pad3->Draw();
> 
>       TH1F *histo1; 
>       TH1F *histo2;
>       TH2F *histo3;
> 
>         pad1->cd();  
>         histo1 = new TH1F("histo1","Muon Energy",50,0,30);
>         histo1->SetXTitle("muon energy");
>         histo1->SetYTitle("event count");
>         histo1->SetFillColor(48);
>         histo1->Draw();
> 
>         pad2->cd();       
>         histo2 = new TH1F("histo2","Muon Pt",50,0,30);
>         histo2->SetXTitle("muon pt");
>         histo2->SetYTitle("event count");
>         histo2->SetFillColor(48);
>         histo2->Draw();
> 
>         pad3->cd();      
>         histo3 = new TH2F("histo3","Muon py vs px",50,0,30,50,0,30);
>         histo3->SetXTitle("muon px");
>         histo3->SetYTitle("muon py");
>         histo3->Draw();
>         Float_t muon_Energy,muon_Pt,muon_Px,muon_Py;
>         for (Int_t i = 0; i < 2500; i++) {
>         //get random number for muon px and py:   
>        gRandom->Rannor(muon_Px,muon_Py);
>        muon_Px     = muon_Px + 10.;
>        muon_Py     = muon_Py + 10.;
>        muon_Pt     = sqrt(muon_Px*muon_Px+muon_Py*muon_Py);
>        muon_Energy = sqrt(0.105*0.105+muon_Pt*muon_Pt);
>        histo1->Fill(muon_Energy,1.0);
>        histo2->Fill(muon_Pt,1.0);
>        histo3->Fill(muon_Px,muon_Py,1.0);
>  }
>       c1->Draw();
>       //Now create the memory map file
> 
>             TMapFile *mfile;
>       mfile = TMapFile::Create("hsimple.map","RECREATE", 50000,
>                                "Demo memory mapped file with histograms");
>       mfile->Add(c1);
> 
> 
>       mfile->Update();
>       mfile->Print();
>       mfile->ls();
> 
>   
> }
> 
> ******************
> 2.) reding from shared memory and sending client over TSocket
>  
> {
> // Open the memory mapped file "hsimple.map" in "READ" (default) mode.
> mfile = TMapFile::Create("hsimple.map");
> // Print status of mapped file and list its contents
> mfile->Print();
> mfile->ls();
> //gROOT->cd();   
> TSocket *sock = new TSocket("localhost", 9090);
> TMessage mess(kMESS_OBJECT);
> TCanvas *c  = (TCanvas *) mfile->Get("c1");
> c->ls();
> c->Draw();
> mess.Reset();    
> printf("hallo1");
> mess.WriteObject(c);     // write object in message buffer
> printf("hallo2"); 
> sock->Send(mess);  
> }
> ***************
> 3.) receiving and displaying in a client macro is no issue.
> 
> ************************
> 
> ********here are the codes for the compiled versions
> producer is more or less the same:
> problems start in the reading of the TCanvas from shared memory, we are
> able to 
> read it ls() and Print() the TMapFile and ls() the TCanvas or
> (c1->ListOfPrimitives)->ls() but we are not able to Draw() or Print() the
> TCanvas.
> 
> code:
> 
> #include "TROOT.h"
> #include "TApplication.h"
> #include "TCanvas.h"
> #include "TLine.h"
> #include "TPaveLabel.h"
> #include <iostream.h>
> #include "TH1.h"
> #include "TH2.h"
> #include "TRandom.h"
> #include "TMapFile.h"
> #include "TSystem.h"
> #include "TDirectory.h"
> #include "TPad.h"
> #include "TSocket.h"
> #include "TMessage.h"
> #include "TPad.h"
> extern void InitGui();
> VoidFuncPtr_t initfuncs[] = { InitGui, 0 };
> 
> TROOT root("hello","Hello World", initfuncs);
> 
> int main(int argc, char **argv)
> {
>   TApplication theApp("App", &argc, argv);
> 
>   
>   TMapFile *mfile;
>   mfile = TMapFile::Create("hsimple.map"); 
>   mfile->Print();
>   mfile->ls();
>   //     gROOT->cd();   
>   TSocket *sock = new TSocket("localhost", 9090);
>   TMessage mess(kMESS_OBJECT);
>   TCanvas *c  = (TCanvas *) mfile->Get("c1");
>   printf("hallo1 \n");
>   c->ls();
>   printf("hallo1 \n");
>   (c->GetListOfPrimitives())->ls();
>   printf("hallo2 \n");
> 	// it works up to here
>   c->Print();
>   printf("hallo3 \n");
>   c->Draw();
>   mess.Reset();    
>   printf("hallo4 \n");
> 
>   mess.WriteObject(c);     // write object in message buffer
>   printf("hallo5 \n"); 
>   sock->Send(mess);  
>   
>   // Here we don't return from the eventloop. "Exit ROOT" will quit the
> app.
>   theApp.Run();
>   
>   return 0;
> }
> 
> 
> 
> By defining another Canvas and drawing it before taking the 
> Canvas from shared memeory, the situation changes, Print(0 is now possible
> and 
> Draw() too (not really only the canvas without histogramms is displayed)
> 
> I think the problem is based in some members of TCanvas which are pointers 
> and I think are pointing to a certain window scope. 
> 
> Is there a method to transfer grafic objects via the shared memory
> without having to bother about these things or will it be implemented?
> 
> Any help will be appreciated.
> 
> cheers
> Frank
> 
> 
> ************* (-; ****LIVE LONG AND PROSPER**** ;-) ****************
> Frank Hartmann
> Institut fuer Experimentelle Kernphysik   
> *Universitaet Karlsruhe      |  Forschungszentrum Karlsruhe/Bau 401 
>  Engesserstr. 7              |  Hermann-von-Helmholtz-Platz 
>  76128 Karlsruhe             |  76344 Eggenstein-Leopoldshafen          
>  Phone: +49-721-608-3418     |  Phone: +49-7247-82-4803
>  Fax: +49-721-607-262        |  Fax: +49-7247-82-3414 
> Email: hartmann@fnal.gov     |  WWW:  http://iekp-kcdf3.fzk.de 
> ------------------------------
> Fermilab MS 318       
> P.O.Box 500         Phone ++1 630 840 8240  
> Batavia 60510,Il    Fax:  ++1 630 840 2968 	
> 
>                                         
>                                             
> 



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:42 MET