Re: using `my classes'

Rene Brun (Rene.Brun@cern.ch)
Tue, 10 Jun 1997 15:11:18 +0200


Wouter Hulsbergen wrote:
>
> Hello there,
>
> I am not that much of a C++ programmer yet, so this might be a silly
> question, but:
>
> I am using some CLHEP classes and have tried to store them in a TTree.
> Although the following code is compiling (g++) and running
>
> Hep3Vector *p = new Hep3Vector(mtrIt->px,mtrIt->py,mtrIt->pz) ;
> if (branch) branch->SetAddress(p) ;
> else branch = tree->Branch("momentum", "Hep3Vector",0,64000,1) ;
> tree->Fill() ;
>
> (where mtrIt is an iterator over an (Hera-B) Arte table and Hep3Vector
> is a CLHEP class name), I don't have a clue if it is legal. In root, I can
> open the TFile and TTree.GetEntries() returns the right number of events,
> but I haven't managed to read the "Hep3Vector".
>
> According to the TTree class description, storing objects in a tree only
> works for objects inherited from TObject. Then, why does my code run
> and how should I build the CLHEP classes, such that they are
> inherited from TObject, in a proper (OO) way?

The ROOT class TTree has 3 member functions to create branches:
a, Branch(const Text_t *name, TClonesArray *list, Int_t bufsize=32000, Int_t splitlevel=1);
b, Branch(const Text_t *name, const Text_t *classname, void *addobj, Int_t bufsize=32000, Int_t splitlevel=1);
c, Branch(const Text_t *name, void *address, const Text_t *leaflist, Int_t bufsize=32000);

type a can be used to create a branch corresponding to one or few variables.
type b can be used to create a branch corresponding to an object derived from TObject
type c can be used to create a branch corresponding to a special list type TClonesArray.

In your case, you call a type b function. This is not legal because your object
is not derived from TObject. You should proceed as follows:
- Create a class with a data member being a pointer to the Hep3Vector object
- Run rootcint on the corresponding header file
- Edit the generated function Streamer to include the relevant code
to serialize the Hep3Vector object. This code can use the TBuffer::WriteFastArray
functions. see for example TGraph::Streamer.

It is clear that progressively we should instrument the few widely utility classes
of CLHEP in the ROOT framework to provide an automatic I/O and an interactive
interface as well.

Rene Brun