[ROOT] Using TTimer and gSystem->ProcessEvents()

From: Ben Morgan (B.Morgan@sheffield.ac.uk)
Date: Thu Aug 15 2002 - 18:06:18 MEST


Hi ROOTers,
           I've written a very simple object TNoisePlot which holds an 
array of thirty randomly filled histograms plus a dummy histogram to 
ensure all are plotted correctly (this object is eventually for use with 
data...). In a separate named script loopnoise(), I create a TNoisePlot 
object plus a TCanvas to display the histograms. As I want to eventually 
enter data that'll be used to generate the histograms, the script contains 
a while loop. At each pass through the loop, the PlotHistos method of 
TNoisePlot is called, and this regenerates and plots the histograms.

As I want the canvas to be editable between each pass through the while 
loop, I also put a TTimer object in the script to use the 
gSystem->ProcessEvents() command. However, after 3-4 passes through the 
while loop, ROOT locks up completely (and with no error message). Taking 
the TTimer related lines out stops this happening, and the loop runs fine, 
but the canvas is no longer editable! I guess I'm probably doing something
wrong with the TTimer. I'm using ROOT v3.02/07 on a PC running RH7.1, and 
have attached the code below. Any 
solutions will be most gratefully received! 
Thanks,

Ben Morgan.

#include <TROOT.h>
#include <TChain.h>
#include <TFile.h>
#include <TH1.h>
#include <iostream.h>


class TNoisePlot {

private:
  TH1S *hNoise[30];
  TH1S *hNoiseAxis;

public:
  TNoisePlot();
  ~TNoisePlot();
  void FillHistos();
  void PlotHistos(TCanvas *c1);
};

TNoisePlot::TNoisePlot()
{
  char hname[20];
  for(Int_t i=0; i<30; i++)
    {
      sprintf(hname,"noise%d",i);
      hNoise[i] = new TH1S(hname," ",100,0,100);
    }

  hNoiseAxis = new TH1S("hNoiseAxis"," ",100,0,100);
}

TNoisePlot::~TNoisePlot()
{
  delete hNoiseAxis;
  for(Int_t i=0; i<30; i++)
    {
      delete hNoise[i];
    }
}

void TNoisePlot::FillHistos()
{
 for(Int_t i=0; i<30; i++)
    {
      hNoise[i]->Reset();
    }
 hNoiseAxis->Reset();


  for(Int_t i=0; i<30; i++)
    {
      for(Int_t j=0; j<100; j++)
	{
	  hNoise[i]->Fill(j,gRandom->Gaus(i*20,10));
	}
    }

  Short_t max=0;
  Short_t min=0;
  for(Int_t k=0; k<30; k++)
    {
      if((hNoise[k]->GetMaximum())>max) max=hNoise[k]->GetMaximum();
      if((hNoise[k]->GetMinimum())<min) min=hNoise[k]->GetMinimum();
    }

  hNoiseAxis->SetMaximum(max);
  hNoiseAxis->SetMinimum(min);
}

void TNoisePlot::PlotHistos(TCanvas *c1)
{
  c1->cd();
  FillHistos();

  hNoiseAxis->Draw();

 for(Int_t i=0; i<30; i++)
    {
      hNoise[i]->Draw("same");
    }
 c1->Modified();
 c1->Update();
}


#include <iostream.h>
#include <stdio.h>

int loopnoise()
{
  int ptest=0;

  TCanvas *c1 = new TCanvas("c1","My Canvas",400,400);
  TNoisePlot *np = new TNoisePlot();
  TTimer *ti = new TTimer("gSystem->ProcessEvents();",100,kFALSE);

  while(ptest==0)
    {
      cout<<"Timer turned on"<<endl;
      ti->TurnOn();
      cout<<"Timer reset"<<endl;
      ti->Reset();

      //At present, enter 0 to keep loop going
      cout<<"Enter ptest: ";
      cin>>ptest;

      np->PlotHistos(c1);
      cout<<"Plotted histos"<<endl;
      ti->TurnOff();
      cout<<"Timer turned off"<<endl;
    }

  delete np;
  delete c1;
  delete ti;


  return 0;
}



-- 
-------------------------------------------------------------------------------
Mr. Ben Morgan                               Tel: 44 (0)114 22 23553 (Work)
Postgraduate Student
University of Sheffield
Department of Physics & Astronomy
Hicks Building
Hounsfield Road
Sheffield  S3 7RH
-------------------------------------------------------------------------------



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET