Re: TBranch documentation

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Mar 05 1999 - 12:07:55 MET


Tioukov Valeri wrote:
> 
> Hi rooters,
> 
> It seems that there is some inconsistency in the of the TBranch
> explanations on the root site.
> 
> The most complete information I found on
> http://root.cern.ch/root/html/TTree.html
> 
> here we see:
> 
> ----------------------------------------------------------
> ....
> 
>      Various kinds of branches can be added to a tree:
>        A - simple structures or list of variables. (may be for C or Fortran structures)
>        B - any object (inheriting from TObject). (we expect this option be the most frequent)
>        C - a ClonesArray. (a specialized object for collections of same class objects)
> 
> .....
> 
>   ==> Case B
>       ======
>      TBranch *branch = tree->Branch(branchname,object, bufsize, splitlevel)
>           object is the address of a pointer to an existing object (derived from TObject).
>         if splitlevel=1 (default), this branch will automatically be split
>           into subbranches, with one subbranch for each data member or object
>           of the object itself. In case the object member is a TClonesArray,
>           the mechanism described in case C is applied to this array.
>         if splitlevel=0, the object is serialized in the branch buffer.
> 
> VT> It seems that the above lines are partially incorrect because
> 
> ....
> 
>    tree->Branch("hpx","TH1F",&hpx,128000,0);
> 
> VT> 5 parameters instead of 4 in the explanation of Case B
> VT> In fact later we have:
> 
> ...
> 
> TBranch* Branch(const Text_t *name, const Text_t *classname, void *addobj, Int_t bufsize, Int_t splitlevel)
> 
> *-*-*-*-*-*-*-*-*-*-*Create a new TTree BranchObject*-*-*-*-*-*-*-*-*-*-*-*
> *-*                  ===============================
> 
>     Build a TBranchObject for an object of class classname.
>     addobj is the address of a pointer to an object of class classname.
>     IMPORTANT: classname must derive from TObject.
> 
>     This option requires access to the library where the corresponding class
>     is defined. Accessing one single data member in the object implies
>     reading the full object.
> 
> VT> It confirmes the version that it should be 5 parameters in Case B
> VT> But now appeared the question about split=1
> 
> --------------------------------------------------------------------------------------
> 
> But the worsest thing that it's never specified that the first parameter
> "const Text_t *name"   should be the name of the 3-d parameter
> "void *addobj"         as in all examples like:
> 
>    tree->Branch("hpx","TH1F",&hpx,128000,0);
> 
> Why by the way? It seems that the information given by the second and
> third parameters should be enough for correct filling.
> 
> I spend a lot of time before understand the fact that branch name must be
> the same as the name of my pointer onto the object.
> On the other case the tree filled by zeros without any warnings.
> 
> Is it correct or I missed something?
> 

Hi Valeri,
Thanks for reporting the wrong information in the comments of TTree
for case B. It should be:
//     TBranch *branch = tree->Branch(branchname,className,object,
bufsize, splitlevel)

but, you are wrong about the second point;
 The FIRST parameter IS NOT THE NAME OF THE POINTER. You can choose what
you want for the branch name. It is obviously a good practice to have
the same name for the branch name and the name of the pointer.

Rene brun



This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:30 MET