[ROOT] Cleanup of TGraphs

From: Ben Morgan (morgan@hep0.shef.ac.uk)
Date: Mon Mar 11 2002 - 19:21:27 MET


Hi ROOTers,
           I have a raw data class for my experiment, and have used 
MakeClass to generate the skeleton code to read the data from the tree. 
I'm now trying to add a method to the MakeClass skeleton (which I assume 
is o.k. to do) to graph some of the data from each event. The problem is 
that the number of graphs for each event is different (the data is voltage 
traces from a wire chamber). Also, as there may be as many as thirty 
traces to graph per event, and I want to look at many events, I need to 
make sure any preceeding graphs are deleted every time this method is 
called. In my code (included below), I set an array of pointers to TGraph 
objects, name the graphs and add these to the 
current directory (following the example in 
http://root.cern.ch/root/roottalk/roottalk01/0759.html). Without any 
delete statements, the code runs fine and generates the required number of 
TGraphs (using gObjectTable->Print()), and gDirectory->Get("name of 
Graph") returns a non null pointer (although there is of course a memory 
leak).
However, when I try to delete these graphs by using 
gDirectory->Delete("name of Graph"), the graphs are deleted (looking at 
gObjectTable), but after executing the method several times, it falls over 
with a segmentation violation:

 *** Break *** segmentation violation
Root > Function GraphEvent() busy flag cleared

I've also tried getting the graph pointers, casting them to a TGraph and 
then deleting, but this produces the same seg violation. I'm using ROOT 
v3.01/06 on a PC running RH6.2, any advice on what's causing the problem 
would be very gratefully received! Thanks,

Ben Morgan.

void RawDataClass::GraphEvent(Int_t entry)
{
  b_fNwire->GetEntry(entry);
  b_fNchan->GetEntry(entry);
  b_fWaveform->GetEntry(entry);
 
  if(fNwire>8)
    {
     cout<<"Event has more than eight active wires, try again"<<endl;
     return;
    }
  char name[20];
  char title[100];
  const Int_t a = fNwire;  

  for(Int_t i=0; i<8; i++)
    {
     sprintf(name,"Wire%d",i);
     gDirectory->Delete(name);
    }

  cout<<"Number of Active Wires = "<<fNwire<<endl;

  TGraph *G[a];
  
  for(Int_t i=0; i<fNwire; i++)
    {
      sprintf(name,"Wire%d",i);
      G[i] = new TGraph(fNchan);
      G[i]->SetName(name);
      gDirectory->GetList()->Add(G[i]);
    }   
     
}


-- 
-------------------------------------------------------------------------------
Mr. Ben Morgan
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:50:45 MET