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