Re: [ROOT] Writing objects in a file opened after creation of the objects

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Jul 24 2003 - 21:10:51 MEST


Hi John,

Look at the documentation of TROOT::FindObject to see which collections
(and which order) are searched by the function.
A simple example answering your question  is the following:
root > TH1F *h = new TH1F("h","h",100,0,1)
root > TFile *f = new TFile("savehisto.root","recreate")
root > gROOT->GetList()->FindObject("h")->Write();

The GetList function in TROOT or any TDirectory is the collection
holdind the objects associated to the corresponding directory.

Rene Brun


On 
Thu, 24 Jul 2003, Frankland John wrote:

> Dear ROOTtalk
> 
> Here is a simple beginner's question, to which everytime I think I have 
> found the
> answer something happens to prove me wrong yet again.
> In all simple examples, when one wants to create some objects (e.g. 
> histograms)
> and write them in a file, one first opens the file, then creates the 
> histograms,
> then writes them to the file.
> However, if one is forced to open the file after having created the objects,
> things get tricky (if one has not understood what one is doing, which is 
> one's case).
> The actual problem I have is that I want to create some TEventList 
> objects in an analysis
> class derived from TSelector. The TEventLists are created in Begin(), 
> filled in ProcessFill(),
> and should be written to a file which is opened, written and closed in 
> Terminate().
> 
> If I do
> 
> root [0] TH1F *h = new TH1F("h","h",100,0,1)
> root [1] gROOT->FindObject("h")
> (const class TObject*)0x8948790
> root [2] TFile *f = new TFile("savehisto.root","recreate")
> root [3] gROOT->FindObject("h")
> (const class TObject*)0x0
> 
> I see that opening the file makes the current directory become the file, 
> which is empty,
> and so I do not retrieve my histogram.
> However, if I now do
> 
> root [7] gROOT->cd()
> (Bool_t)1
> root [8] gROOT->FindObject("h")
> (const class TObject*)0x8948790
> 
> I'm back in business ! (Strange though: doesn't gROOT->cd() mean "set 
> the current
> directory to be the one pointed to by gROOT" - but gROOT already points 
> to the current
> directory, the file in this case ?!?!?)
> So now I do
> 
> root [9] gROOT->FindObject("h")->Write()
> Error in <TH1F::Write>: No file open
> (Int_t)0
> 
> and realise that I can't have my file and fill it, or have my histo and 
> write it.
> So I end up doing :
> 
> root [7] gROOT->cd()
> (Bool_t)1
> root [10] TH1F* h1=(TH1F*)gROOT->FindObject("h")
> root [11] f->cd()
> (Bool_t)1
> root [12] h1->Write()
> (Int_t)208
> 
> I'm sure that there is a simpler, clearer way to do this, but this is 
> what I managed with my limited knowledge.
> As I said, I didn't find an example because all the examples I have seen 
> are of the simple type
> "open file - create objects - write objects".
> Coming back to the case in hand, I could of course keep track of all the 
> pointers to my TEventLists
> (there are quite a lot of them), i.e. by putting
> them in a TList and then using TList::Write(), but this seems a little 
> pedestrian and I thought
> the better way of doing it, in the true ROOT spirit (whatever that is) 
> would be to use
> gROOT->FindObject(...).....
> 
> Can you please help ?
> Thanks a lot
> John
> 
> PS. I thought "SetDirectory(0)" might help, but not the way I use it:
> root [0] TH1F *h = new TH1F("h","h",100,0,1)
> root [1] h->SetDirectory(0)
> root [2] TFile *f = new TFile("savehisto.root","recreate")
> root [3] gROOT->FindObject("h")
> (const class TObject*)0x0
> root [4] gROOT->Get("h")
> (class TObject*)0x0
> root [5] gDirectory->Get("h")
> (class TObject*)0x0
> 
> 
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:13 MET