Re: [ROOT] root file and custom classes

From: Rene Brun (Rene.Brun@cern.ch)
Date: Wed Jul 05 2000 - 10:43:12 MEST


Hi Christian,

You can use TSystem::AccessPathName to test if a file exists and do, eg:

   if (gSystem->AccessPathName(fileName)) f = new TFile(fileName,"update")
   else                                   f = new TFile(fileName,"create")

The Tree branch creator needs the type information about your classes
in most cases, in particular if your class derives from a compiled class
or if your class has a TClonesArray. You have to compile your classes
for the time being.

Rene Brun

 cstrato@EUnet.at wrote:
> 
> Dear Rooters
> 
> I apologize for sending the following questions again but it seems that
> my message did not arrive at roottalk
> 
> Best regards
> Christian Stratowa
> 
> Subject:
>           root file and custom classes
>     Date:
>           Sun, 02 Jul 2000 20:00:07 +0100
>    From:
>           cstrato@EUnet.at
>       To:
>           roottalk <roottalk@pcroot.cern.ch>
> 
> Dear Rooters:
> 
> Maybe you could answer the following questions regarding root files:
> 
> 1, I have a function ?save_data(file.root, data.txt)?, which creates
> a rootfile and stores the data in a tree. When file.root does already
> exist, the function should update the file and write new data into
> a new tree of the same file. The skeleton of the function looks like
> this:
> 
> void save_data(fileName, data)
> {
>    TFile *f = new TFile(fileName, ?CREATE?);
>    if (!f->Open()) {
>       f->Open(fileName, ?UPDATE?;
> //alternatively:
> //      delete f;
> //      f = new TFile(fileName, ?UPDATE);
>    }
> 
> // call: MyClassA->SaveData(fileName, data)
> 
>    f->Write();
>    f->Close();
> }
> 
> When fileName does not exist, everything is fine, however, when
> I call the function again with different data I get:
> ?Error in <TFile::TFile>: file fileName already exists?
> However the execution continues and f->Open(..) results in:
> ?Warning in <TFile::Write>: file not opened in write mode?
> Interestingly, the data are stored in a new tree as supposed to.
> Why do I get then this warning?
> 
> I can avoid the warning by deleting the file first and creating
> a new file f = new TFile(fileName, ?UPDATE) as shown above.
> However, this is not very elegant, so my question is:
> What is the best way to solve this problem?
> 
> 2, As seen above, the tree is not created in the function but in
> a new class MyClassA. Furthermore, the data are described in a
> class MyClassB: branchB = tree->Branch(name,?MyClassB?, &myClassB)
> The tree is called from MyClassA and should also store MyClassA:
>    branchA = tree->Branch(name,?MyClassA?, &this)
> Running root results in the errors that MyClassA and MyClassB are not
> found.
> When I include ClassDef() and ClassImp() then I get the following
> errors:
> Error: MyClass() header declared but not defined FILE:...
> (class MyClass*) 0x...
> !!!Dictionary position not recovered because G__unloadfile() in macro!!!
> 
> Does this mean that I have to compile the classes first to create a
> dictionary?
> 
> If I consider the root test example ?MainEvent.cxx?:
> Is there no way to run this example using only the cint interpreter,
> i.e.
> without first compiling Event.h into a shared library to create a
> dictionary?
> 
> This would mean that I could not test my own classes interactively, but
> have to compile them everytime I find a bug or want to change/add a
> method.
> Is there a way to avoid this?
> 
> Thank you very much in advance for your help.
> 
> Best regards
> Christian Stratowa, Vienna, Austria



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET