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