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

From: Frankland John (frankland@ganil.fr)
Date: Tue Jul 29 2003 - 02:36:00 MEST


Hi Rene et al

The proposed solution does not work in the exact case we are dealing with,
i.e. trying to find pointers to TEventList objects in the Terminate() 
method of
a script created with tree->MakeSelector("MyClass").
It seems that the fList member of TDirectory (returned by calling 
gROOT->GetList())
does not contain all memory-resident objects, at least in this situation ?
We have found a method which works and is far simpler than my first 
attempt :

TDirectory *my_dir = (TDirectory*)gDirectory;
TFile *file = new TFile("save_selections.root", "recreate");
TEventList *mylist = (TEventList*)my_dir->Get("selection_1");
my_list->Write();
etc. etc.

Best regards
John

Rene Brun wrote:

>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
>>
>>
>>
>>    
>>
>
>  
>


-- 

ganil logo <http://www.ganil.fr>
John D. Frankland <mailto:frankland@ganil.fr>
Beam Coordinator
GANIL
B.P. 55027
14076 CAEN Cedex 05

*tel:* +33 (0)231454628
*fax:* +33 (0)231454665



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