[ROOT] Please, could someone take a look...

From: Primrose Mbanefo (didi_mbanefo@laposte.net)
Date: Fri Aug 31 2001 - 11:34:12 MEST


Hello everyone, 
	I'm still observing some strange behaviour after executing  two or three 
times in quick succession the program which uses my classes. I've checked on 
the net and noone seems to have reported this type of behaviour before. 
Infact after a certain number of executions the computer shuts down when an 
object of one of the classes tries to recreate it's member root file. 
It's not very wise to attach files to mails so I'm going to copy the files of 
my programs and classes into this mail. I hope it's not too long and that 
someome will find some time to take a look at them. There is one source file 
for the program and there are two classes(TRun and TObjNA50). I will only 
send information on the class which is giving trouble(TRun) in order to 
reduce the size of the email. Parts of these files have been left out to make 
them clearer.
Thank you very much,
Primrose.

//-------------------------------------The files-----------------------------
//-----------------------------The program------------------------------
#include "TRun.h"
#include "TF1.h"
#include "TSystem.h"
#include "TClassTable.h"
#include "TRint.h"

int main(int argc,char ** argv)
{
  TRint theApp("App",&argc,argv);

  cout<<"Treating run123"<<endl;
TRun *  run = new TRun(123,808,1332); //after succesive executions program 
stops here when trying to recreate the member file

cout <<"initialising chambers"<<endl;
run->Addobj(224,'c','1');
run->Addobj(256,'c','2');
run->Addobj(288,'c','3');
run->Addobj(320,'c','4');
run->Addobj(512,'c','5');
run->Addobj(544,'c','6');
run->Addobj(576,'c','7');
run->Addobj(608,'c','8');

cout<<"initialising hodos"<<endl;
run->Addobj(32,'h','1');
run->Addobj(32,'h','2');
run->Addobj(32,'h','3');
run->Addobj(32,'h','4');
run->Addobj(32,'h','5');

cout<<"initialising hodos p"<<endl;
run->Addobj(48,'p','1');
run->AddtoMemory(); 

Int_t num_run = run->Getfrun_numb();
Char_t name[20];
Int_t i,j;
TF1 f1("fonction1","x*(x-500)+62500",0,500);
int nbfils;
char nomhisto[80];
sprintf (name,"run%d",num_run);

 for (j=0; j<13;j++)
   {
     nbfils = (run->Getobj(j))->Getnb_fils_lattes();   
     for (i=0;i<6;i++)
       {  //naming histos
	 sprintf(nomhisto,"dp%d",i+1);	               
	 strcat(nomhisto,name);
	 strcat(nomhisto,(run->Getobj(j))->GetnomObjNA50());	 
	//filling histos
	 (run->Getobj(j))->Addhist(nomhisto,nomhisto,nbfils,0,nbfils);       
	 ((run->Getobj(j))->Gethist(i))->FillRandom("fonction1",1000);
	 run->Writehisto((run->Getobj(j))->Gethist(i));
       }
   }
 run->UpdateMemory();
 run->CloseFile();
 run->CloseSharedMemory();
return (0);
}


//----------------------------------------The Classes------------------------
//------------------------------------The class TRun-----------------------
//---------------------------File: TRun.h-------------------------------------
#ifndef _TRun_
#define _TRun_

#include "TObjNA50.h" //the second class
#include "TFile.h"
#include "TMapFile.h"

class TRun : public TObject
{
 public:
    // constants
    enum {maxobj = 14};  //size maximal of the ftab_obj array
    enum {maxhisto = 6}; //size maximal of the ftab_histo array

   //the constructeur
   TRun(Int_t run_numb = -1,Int_t date = 0, Int_t time = 0);

    //the destructor
    ~TRun();

    //the other methods
    Int_t     Getfrun_numb() const;
    Int_t     Getfdate() const;
    Int_t     Getftime() const;
    const Char_t  * Getfbeam() const;
    const Char_t  * Getftrigger() const;

    TObjNA50* Getobj(Int_t i) ;
    TH1F    * Gethisto(Int_t i) ;
    
    void      Addobj(Int_t nbfils,Char_t opt,Char_t num_obj);
    void      Addhisto(const Char_t* nom, const Char_t* titre, Int_t nbbins, 
Int_t low, Int_t high);
    void      Writehisto(TH1F *h) const;
    void      CloseFile();

    TMapFile *GetSharedMemory();  
    void      CloseSharedMemory();
    void      AddtoMemory(TH1F * h);
    void      AddtoMemory();
    void      UpdateMemory();

static Int_t GetnbObjRun(); //get number of objects which belong to class TRun
    
 private:
    TObjArray  ftab_obj;             //will contain the 8 chambers and the 4 
hodoscopes
    TObjArray ftab_histo;            //will contain 6 other histogrammes
    TFile    *ffile;                        //root file for saving histograms
    Int_t     findexobj;                //current index in the ftab_obj array
    Int_t     findexhisto;             //current index in the ftab_histo array
    Int_t     frun_numb;            //run number
    Int_t     fdate;                    //date of run
    Int_t     ftime;                    //time of run
    Char_t    fbeam[10];          //beam used
    Char_t    ftrigger[10];          //trigger used
    TMapFile *fsharedmemory;         //! memeory shared between the creator 
of histograms and their display

    static Int_t fgnbObjRun ;        //number of objects in the class<=> 
number of runs effected

 ClassDef(TRun,1)
 };
#endif


//----------------------------------------File: TRun.cxx---------------------
#include "TRun.h"
 ClassImp(TRun)
  
//initialisation of the number of objects in the class
Int_t TRun::fgnbObjRun = 0;

  //constructor
TRun::TRun(Int_t run_numb = -1,Int_t date = 0, Int_t time = 0):
  ftab_obj(maxobj),
  ftab_histo(maxhisto),
  findexobj(0),
  findexhisto(0),
  frun_numb(run_numb),
  fdate(date),
  ftime(time)
{
  if (run_numb == -1)
    {
      ffile=NULL;
      fsharedmemory = NULL;
    }
  else
    {
  fsharedmemory = 
TMapFile::Create("runcour.map","RECREATE",500000,"temp_mem");
  fsharedmemory->RemoveAll();
  Char_t name[20];
  sprintf(name,"run%d.root",frun_numb);
  ffile = new TFile(name,"RECREATE");  //program stops at this point.
    }
  for (int i=0;i<maxobj;i++)
    {
      ftab_obj[i]=NULL;
    }
  for (int i=0;i<maxhisto;i++)
    {
      ftab_histo[i]=NULL;
    }
      //beam and trigger have no exact structure for now
  strcpy(fbeam,"beam");
  strcpy(ftrigger,"trigger");
  fgnbObjRun++;
}

//destructor
TRun::~TRun()
  {
    this->CloseFile();
    this->CloseSharedMemory();
    for (int i=0;i<maxobj;i++)
      {
	if(ftab_obj[i] != NULL)
	  {
	    delete ftab_obj[i];
	  }
      }
    for (int i=0;i<maxhisto;i++)
      {
	if(ftab_histo[i] != NULL)
	  {
	    delete ftab_histo[i];
	  }
      }
    fgnbObjRun--;
  }
//the other methods
/*-----------------------------------------------------
 *- adds an objNA50 to the array of objects NA50
 *-----------------------------------------------------*/
void TRun::Addobj(Int_t nbfils,Char_t opt,Char_t num_obj)
{
  if (findexobj<maxobj)
    {
      ftab_obj.AddAt(new TObjNA50(nbfils,opt,num_obj),findexobj++);
    }
  else
    {
      cout<<"there is no more space for new NA50 objects"<<endl;
    }
}
/*-------------------------------------------------------------
 *-Adds new histograms to the array for histograms
 *-------------------------------------------------------------*/
void TRun::Addhisto(const Char_t * nom,const Char_t * titre,Int_t 
nbbins,Int_t low,Int_t high)
{
  if (findexhisto<maxhisto)
    {
      ftab_histo.AddAt(new TH1F(nom,titre,nbbins,low,high),findexhisto++);
    }
  else
    {
      cout<<"there is no more space for new histograms"<<endl;
    }
}
/*---------------------------------------------------------
 *-saves a histogram to the file: ffile
 *---------------------------------------------------------*/
void TRun::Writehisto(TH1F * h) const
{
  if (ffile==NULL)
    {
      cout<<"no file to write to"<<endl;
    }
  else
    {
      h->Write();
    }
}

/*----------------------------------------------------------
 *-Closes the file:ffile
 *----------------------------------------------------------*/
void TRun::CloseFile()
{
  if (ffile == NULL) return;
  ffile->Close();
  delete ffile;
  ffile = NULL;
}
/*-----------------------------------------------------------
 *-Adds a histogram to shared memory
 *-----------------------------------------------------------*/
void TRun::AddtoMemory(TH1F * h)
{
  if (fsharedmemory == NULL)
     {
      cout<<"no shared memory created"<<endl;
    }
  else
    {
      fsharedmemory->Add(h);
    }
}
/*-----------------------------------------------------------
 *-Adds the present run to shared memory
 *-----------------------------------------------------------*/
void TRun::AddtoMemory()
{
  if (fsharedmemory == NULL)
     {
      cout<<"no shared memory created"<<endl;
    }
  else
    {
      fsharedmemory->Add(this,"runcour");
    }
}/*------------------------------------------------------------
 *-updates everything in shared memory
 *-----------------------------------------------------------*/
void TRun::UpdateMemory()
{
  if (fsharedmemory == NULL)
    {
      cout<<"no shared memory created"<<endl;
    }
  else
    {
      fsharedmemory->Update();

    }

}
/*--------------------------------------------------------------
 *-Closes the shared memory
 *--------------------------------------------------------------*/
void TRun::CloseSharedMemory()
{
  if (fsharedmemory == NULL) return;
  fsharedmemory->Close();
  fsharedmemory=NULL;
}

/*--------------------------------------------------------------
 *-the following methodes give access to the members of the class
 *--------------------------------------------------------------*/

//run number
Int_t TRun::Getfrun_numb() const
{
  return frun_numb;
}

//date of run
Int_t TRun::Getfdate() const
{
  return fdate;
}

//time
Int_t TRun::Getftime() const
{
  return ftime;
}

//beam
const Char_t * TRun::Getfbeam() const
{
  return fbeam;
}

//trigger
const Char_t * TRun::Getftrigger() const
{
  return ftrigger;
}

//to the object at ftab_obj[i]
TObjNA50* TRun::Getobj(Int_t i)
{
  return ((TObjNA50 *)ftab_obj[i]);
}

//to the object at ftab_histo[i]
TH1F* TRun::Gethisto(Int_t i)
{
  return ((TH1F *)ftab_histo[i]);
}
//to shared memory
TMapFile * TRun::GetSharedMemory()
{
  return fsharedmemory;
}

//the number of existing objects
  Int_t TRun::GetnbObjRun()
{
  return fgnbObjRun;
}



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET