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