Re: [ROOT] Content of TList stored externally in TFile

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Aug 19 2002 - 08:48:08 MEST


Hi Christian,

My guess is that in the default constructor for your BaseClass
(I hope your class is not called TBaseClass!) you set fContent
to a non null value.
The default constructor is called by ROOT I/O to create a dummy
instance of your class to build the class dictionary or stream in
an object from the file.

I suggest you add print statements in your BaseClass
constructor/destructor to see what is happening.
In your default constructor, you can test the return value
of Bool_t TClass::IsCallingNew() to find out if your constructor
is called by you or by ROOT I/O.

Rene Brun


On Sun, 18 Aug 2002, cstrato wrote:

> Dear Rooters
> 
> I have a strange problem in a pretty complex program, where
> I store TTrees in a TFile in one root session, but am also
> able to add, delete or update trees in the next session.
> The important classes compiled as library are:
> class TContent: public TList {}
> 
> class TBaseClass: public TNamed {
>     void AddTree();
>     void UpdateTree();
>     void DeleteTree();
> }
> 
> class DerivedClass: public TBaseClass {}
> 
> class MyClass: public TNamed {
>     TFile    *fFile;
>     TContent *fContent;
> 
>     void AddData()    {derivedClass->AddTree();}
>     void UpdateData() {derivedClass->UpdateTree();}
>     void DeleteData() {derivedClass->DeleteTree();}
> }
> 
> First root session:
> In a macro I call myClass->AddData(tree1). A tree is created in
> fFile, and derivedClass1 is stored in fContent.
> Assume that I have created three trees in this way, tree1, tree2
> and tree3. When I call TBrowser, everything is perfectly ok.
> 
> Second root session:
> In a macro I call:
> myClass->AddData(tree4)
> myClass->DeleteData(tree1)
> myClass->DeleteData(tree2)
> myClass->AddData(tree5)
> When I open fFile with TBrowser, tree4 and tree5 are added, and
> their corresponding derivedClass4 and derivedClass5 is added to
> fContent, while tree1 and tree2 are deleted and their corresponding
> derivedClass1 and derivedClass2 are deleted from fContent, as
> expected. So far everything is ok.
> But now fFile contains suddenly the three derivedClass1,2,3 from
> the first root session as single objects in fFile. Apparently,
> the old content of fContent is read and stored in fFile.
> I do not understand, why these objects are suddenly stored in
> fFile, since I never call fFile->Write() but only obj->Write().
> 
> The destructor of BaseClass looks as follows:
> BaseClass::~BaseClass
> {
>     if (fFile) {
>     // Write content to file only if new file or file is updated
>        fFile->cd();
>        if (fContent && (strcmp(fFile->GetOption(), "READ") != 0)) {
>           // kSingleKey since fContent is a TCollection!!
>           fContent->Write("", TObject::kSingleKey | TObject::kOverwrite);
>        }//if
> 
>        fContent->Delete();
>        SafeDelete(fContent);
>        SafeDelete(fFile);
>     }//if
> 
> //   fTrash->Delete();
>     SafeDelete(fTrash);
> }
> 
> My questions are:
> Can anybody give me a hint why the objects are written to fFile?
> How can I prevent that the old list content is written to fFile?
> 
> Thank you in advance for your help.
> 
> Best regards
> Christian
> _._._._._._._._._._._._._._._._
> C.h.i.s.t.i.a.n S.t.r.a.t.o.w.a
> V.i.e.n.n.a       A.u.s.t.r.i.a
> _._._._._._._._._._._._._._._._
> 
> 
> 
> 
> 
> 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:51:04 MET