Re: [ROOT] Warning file not closed or root crash when deleting file

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Jun 21 2004 - 08:22:49 MEST


There are 3 TTree::AddFriend functions. Up to you to select
the right one for your conditions:

  1-AddFriend(const char *treename, const char *filename="");
     -Open the file, if filename is specified.
     -Import the Tree from the file
     -Add the tree to the list of friends

  2-AddFriend(const char *treename, TFile *file);
     -Import the Tree from the file
     -Add the tree to the list of friends

  3-AddFriend(TTree *tree, const char* alias="", Bool_t warn = kFALSE);
     -Add the tree to the list of friends

You must be careful when using style 1 and you already have either 
the tree or/and the file connected in memory.

Rene Brun

cstrato wrote:
> 
> Dear Rene
> 
> Thank you for your fast reply.
> Calling fTree->AddFriend(atree) did solve my problem.
> 
> What I do not quite understand is that calling
>     fTree->AddFriend(atree->GetName(), fFile);
> and later calling
>     fTree->RemoveFriend(atree);
> seems to be working, too.
> 
> Is this an alterantive correct way or does it only work by chance?
> 
> Best regards
> Christian
> 
> Rene Brun wrote:
> 
> > Hi Christian,
> >
> > Before calling AddFriend, you must close atree and fFile.
> > Do:
> >
> >    TString tname = atree->GetName()
> >    TString fname = fFile->GetName()
> >    atree->Write();
> >    delete fFile;
> >    fTree->AddFriend(tname,fname);
> >
> > or  call the other TTree::AddFriend constructor
> >    atree->Write();
> >    fTree->AddFriend(atree);
> >
> > Rene Brun
> >
> > On Sun, 20 Jun
> > 2004, cstrato wrote:
> >
> >
> >>Dear Rooters
> >>
> >>I have the following situation:
> >>First I open an existing file "fDataFile" which contains some data
> >>trees. In a first step I add these trees as friends to a tree "fTree".
> >>Then I create a new file "fFile" where the result tree "atree" should be
> >>stored. Later, I create the result tree "atree" in a class method.
> >>After filling "atree" I want to add "atree" as friend to fTree, too.
> >>The relevant code fragment of the method looks like this:
> >>    TTree *atree = new TTree(treename, "");
> >>    // fill atree
> >>    fFile->cd();
> >>    atree->Write();
> >>    fTree->AddFriend(atree->GetName(), fFile->GetName());
> >>
> >>In this case AddTree() results in the following message:
> >>Warning in <TFile::Init>: file /Users/cs/ROOT/rootcode/tmp.root probably
> >>not closed, trying to recover
> >>Info in <TFile::Recover>: /Users/cs/ROOT/rootcode/tmp.root, recovered
> >>key TTree:Test at address 350
> >>Warning in <TFile::Init>: successfully recovered 1 keys
> >>
> >>Nevertheless, everything works fine including the call to the
> >>destructors, where I delete "fDataFile" with "SafeDelete(fDataFile)".
> >>
> >>In contrast, when I add "atree" as friend using:
> >>    fTree->AddFriend(atree->GetName(), fFile);
> >>everything works fine until I call the destructors.
> >>When I try to delete "fDataFile" with "SafeDelete(fDataFile)" then
> >>root crashes beyond recovery with "*** Break *** bus error"
> >>
> >>However, if I remove "atree" after usage by calling in a different method
> >>    fTree->RemoveFriend(atree);
> >>then everything works fine again and I can call "SafeDelete(fDataFile)"
> >>in the destructor.
> >>
> >>Does anybody have an idea what might be the reason for this behavior?
> >>(I am afraid ths code is too complex to extract a simple macro.)
> >>
> >>Thank you in advance
> >>Best regards
> >>Christian
> >>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> >>C.h.r.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 : Sun Jan 02 2005 - 05:50:08 MET