Re: [ROOT] Using the ReadAll method

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Jun 07 2002 - 22:20:46 MEST


Hi Michael,

An example:

void readall() {
  gDirectory->cd("Rint:/"); // make sure we are in default directory
  TDirectory *dir = gDirectory; //save pointer to Rint dir
  TFile *f = new TFile("hsimple.root");
  f->ReadAll(); //read all objects in current directory in memory
  TIter next(f->GetList());
  TObject *0bj;
  TH1 *h;
  while (( obj = next())) {
     if (obj->InheritsFrom("TH1")) { //keep only histograms
        TH1 *h = (TH1*)obj;
        h->SetDirectory(dir);
     }
  }
  delete f;
  dir->ls();
}  

Rene Brun


On Fri, 7 Jun 2002, Michael Gold wrote:

> Dear Rooters:
> 
> I am trying to read histograms from a file into local memory.
> The first routine below tries the ReadAll method, which fails.
> The second method is a modification of the ReadAll method
> which works as long as the file stays open.  I guess I am
> happy with this.  However, am I doing something wrong with
> the ReadAll method?  Do I need to keep the file open?
> I guess I am thinking of what I used to do in Paw with HRIN.
> 
> -Michael Gold
> 
> /****************************************
> A routine to get histograms from a file 
>     in a sub directory
> *****************************************/
> void getSub(Option_t* fileName, Option_t* subDir="muTuple" )
> {
>   gDirectory->cd("Rint:/"); // make sure we are in default directory
>   TDirectory *dir = gDirectory; //save pointer to Rint dir
>   TFile *f = new TFile(fileName); // open in read mode
>   // check that file is opened
>   if(f->IsZombie()) {
>     cout <<" Sorry, file " << fileName << " not opened !! " << endl;
>     return;
>   }
>   
>   f->cd(subDir);
>   gDirectory->pwd();
>   gDirectory->ls();
>   gDirectory->ReadAll();
>   dir->ls(); // this lists nothing
>   delete f;
> }
> 
> /****************************************
> A routine to get histograms from a file 
> *****************************************/
> void getHist(Option_t* fileName )
> {
>   gDirectory->cd("Rint:/"); // make sure we are in default directory
>   TDirectory *dir = gDirectory; //save pointer to Rint dir
>   TFile *f = new TFile(fileName); // open in read mode
>   if(f->IsZombie()) { // check that file is opened
>     cout <<" Sorry, file " << fileName << " not opened !! " << endl;
>     return;
>   }
> 
>   // loop over keys
>   TKey *key;
>   TIter next(f->GetListOfKeys());
>   while ((key = (TKey *) next())) {
>     //   cout << key->GetClassName() << ": "<< key->GetName() << endl; // this 
> works
>     TNamed *thing = (TNamed*)gDirectory->GetList()->FindObject(key->GetName());
>     if (thing) delete thing; 
>     TObject *obj=key->ReadObj();
>     dir->Add(obj);
>     //    dir->Copy(key->ReadObj());
>   }
>   dir->pwd();
>   dir->ls();  // this works as long as file stays open
>   //  delete f; << but only if the file stays open
> }
> 
> 



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