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