Re: Connot read objects from subdirectories in ROOT files

From: Rene Brun (Rene.Brun@cern.ch)
Date: Sun Mar 05 2000 - 15:59:33 MET


Hi Reiner,
Read carefully the following example.
void reiner() {
   TFile *file = new TFile("reiner.root","recreate");
   TNamed *name = new TNamed("myName","my title");
   TDirectory *dir = file->mkdir("sub");
   dir->cd();
   name->Write();
   file->cd();
   file->Write(); //<===important statement
   delete file;
   file = new TFile("reiner.root");
   file->ls();
   file->cd("sub");
   TNamed *name2 = (TNamed*)gDirectory->Get("myName");
   name2->Dump();
   file->ls();
}

Rene Brun

On Sun, 5 Mar 2000, ROHLFS Reiner wrote:

> Hi ROOT - team
> 
> I have problems to find my object in a ROOT file that I have written into a
> subdirectory. It disappears after I close and reopen the ROOT file:
> 
> Warning in <TGClient::GetColorByName>: couldn't retrieve color LightYellow
>   *******************************************
>   *                                         *
>   *        W E L C O M E  to  R O O T       *
>   *                                         *
>   *   Version   2.23/12  21 February 2000   *
>   *                                         *
>   *  You are welcome to visit our Web site  *
>   *          http://root.cern.ch            *
>   *                                         *
>   *******************************************
> 
> FreeType Engine v1.1 used to render TrueType fonts.
> 
> CINT/ROOT C/C++ Interpreter version 5.14.25, Nov 25 1999
> Type ? for help. Commands must be C++ statements.
> Enclose multiple statements between { }.
> root [0] TFile * file = new TFile("subdir.root", "NEW")  
> root [1] file->IsOpen()
> (Bool_t)1
> root [2] TNamed *name = new TNamed("my Name", "my title")
> root [3] TDirectory * dir = file->mkdir("sub")
> root [4] dir->cd()
> (Bool_t)1
> root [5] name->Write("my Name")
> root [6] file->ls()
> TFile**         subdir.root
>  TFile*         subdir.root
>   TDirectory*           sub     sub
>    KEY: TNamed  my Name;1       my title
>   KEY: TDirectory       sub;1   sub
> 						// up to here everything looks
> 						// OK for me
> 
> root [7] delete file
> root [8] TFile * file = new TFile("subdir.root", "READ") 
> root [9] file->IsOpen()                                  
> (Bool_t)1
> root [10] file->ls()                                     
> TFile**         subdir.root
>  TFile*         subdir.root
>   KEY: TDirectory       sub;1   sub
> 						// here "TNamed  my Name" is
> 						// missing ??
> 
> root [11] gDirectory->cd("sub")
> (Bool_t)1
> root [12] gDirectory->ls()
> TDirectory*             sub     sub
> root [13] gDirectory->pwd()
> subdir.root:/sub
> root [14] name->Read("my Name")
> Error in <TNamed::Read>: Key not found
> 						// I cannot read the object
> 
> root [15] file->Map()
> 20000305/103617  At:64        N=88        TFile         
> 20000305/103650  At:152       N=75        TDirectory    
> 20000305/103725  At:227       N=79        TNamed        
> 20000305/103738  At:306       N=94        TFile         
> 20000305/103738  At:400       N=55        TFile         
> 
> 						// But somehow TNamed is 
> 						// available in the file
> 
> 
> 
> What is wrong with these statements?
> I run these on a SUN SPARC station.
> 
> Thanks Reiner.
> 
> 



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:21 MET