Hi Michael,
Only objects like TH1, TTrees, TEventlist are automatically added
to gDirectory->GetList().
You can prevent TH1 objects to be automatically added by calling
TH1::AddDirectory(kFALSE);
before creating or reading these objects.
For Trees, you should not change the default behaviour unless you
understand all the consequences. A TTree has a header in memory and
the baskets on the file.
Note that you can remove an object from the default list by:
gDirectory->GetList()->Remove(myObject);
In the same way, objects like TEventList and TCutG are automatically added
to gROOT->GetListOfSpecials();
You can remove an object from this list with:
gROOT->GetListOfSpecials()->Remove(myObject);
You do not have to Clone an object to add it to another list.
Rene Brun
Michael Kordosky wrote:
>
> Hi,
>
> I am attempting to implement a function which opens a file, reads in all
> TObjects in the file (without casting or otherwise discriminating on
> them), and places copies of them into a vector. Later code will then come
> along and select the objects that it wants, using ROOT's RTTI system. A
> trimmed down sample of my best attempt is shown below. My biggest problem
> is that the opened TFile "owns" its objects in memory and will remove them
> when it closes. How do I take objects in memory away from a TFile, so
> that those objects persist after the closure of the TFile? I figured that
> perhaps I had to move or copy the objects into a persistent TDirectory,
> ie:
>
> gROOT->cd();
> /* copying */
> file.cd();
>
> After some experimentation, the only method that I can find for
> moving/copying TObject derived classes is TObject::Clone(). This function
> seems to bind correctly to the derived class except that it doesn't get
> the name and title? So, must I insert a test to figure out if a particular
> object inherits from TNamed, then do some casting to allow me to reset the
> names (and titles) to the correct values? Is there a better way to do what
> I am trying to do? Alternatively, am I doing something "immoral" in the
> ROOT sense?
>
> Thanks!
>
> Mike Kordosky
> (sample code follows)
> --
> Graduate Research Assistant // High Energy Physics Lab
> kordosky@hep.utexas.edu // University of Texas at Austin
> ph: (512) 471-8426 (RLM Lab, Office)
> (512) 475-8673 (ENS Lab)
>
> int RunRecord::GetObjects(vector<TObject*>& objvec) const
> {
> TFile f(fRfile.c_str(), "READ");
>
> TList* list = f.GetListOfKeys();
>
> TIter next(list);
> TKey* key;
> TObject* obj;
>
> while (key = (TKey*)next()){
> obj = key -> ReadObj(); // reads objects in from disk
>
> // Don't want to deal with sub-directories right now
> if(obj->IsA() == TDirectory::Class()){
> delete obj;
> obj = NULL;
> continue;
> }
>
> // Will take everything else
>
> gROOT->cd();
> TObject* newobj = obj->Clone();
> objvec.push_back(newobj);
> cout<<"objvec.size() = "<<objvec.size()<<endl;
> f.cd();
> }
> delete key;
> f.Close();
> return objvec.size();
> }
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:39 MET