Hi Daniel,
On request from H1, I implemented about one year ago a special branch
constructor
TTree::Branch(TList*list, Int_t bufsize, Int_t splitlevel)
I could extend this function in the way shown below. Note that this will also
require a special new function to set the corresponding branch address
when reading a Tree created this way.
Let me know what you think of this proposal
Rene Brun
Int_t TTree::Branch(TCollection *list, Int_t bufsize, Int_t splitlevel)
{
// This function creates one branch for each element in the collection.
// Each entry in the collection becomes a top level branch if the
// corresponding class is not a collection. If it is a collection, the entry
// in the collection becomes in turn top level branches, etc.
// The splitlevel is decreased by 1 everytime a new collection is found.
// For example if list is a TObjArray*
// - if splitlevel = 0 only one top level branch is created
// - if splitlevel = 1, one top level branch is created for each element
// of the TObjArray.
// - if splitlevel = 2, one top level branch is created for each array
element.
// if, in turn, one of the array elements is a TCollection, one top level
// branch will be created for each element of this collection.
//
// In case a collection element is a TClonesArray, the special Tree
constructor
// for TClonesArray is called.
// The collection itself cannot be a TClonesArray.
//
// The function returns the total number of branches created.
if (list == 0) return 0;
TObject *obj;
Int_t nbranches = GetListOfBranches()->GetEntries();
if (list->InheritsFrom(TClonesArray::Class())) {
Error("Branch", "Cannot call this constructor for a TClonesArray");
return 0;
}
TIter next(list);
while ((obj = next())) {
if (obj->InheritsFrom(TClonesArray::Class())) {
TClonesArray *clones = (TClonesArray*)obj;
Branch(clones->GetName(),clones->ClassName(),
clones->GetObjectRef(obj),bufsize,splitlevel-1);
} else if (obj->InheritsFrom(TCollection::Class())) {
TCollection *col = (TCollection*)obj;
Branch(col,bufsize,splitlevel-1);
} else {
Branch(obj->GetName(),obj->ClassName(),
list->GetObjectRef(obj),bufsize,splitlevel-1);
}
}
return GetListOfBranches()->GetEntries() - nbranches;
}
Magestro Daniel wrote:
>
> > Hi Thomas,
> >
> > Except for a TClonesArray, it does not make sense to use the
> > split mode for a TCollection. Replace the line :
> >
> > t->Branch("TList", "TList", &list, 32000, 9);
> > by
> > t->Branch("TList", "TList", &list, 32000, 0);
> >
> > Rene Brun
>
> Hi - a long response to Rene's answer... there may be situations where a
> non-zero split mode would be useful for TList's or TObjArray's.
>
> In our analysis (HADES) the event structure is defined by a single TObjArray
> which contains several other TObjArray's (one for each detector component),
> each of which contains objects with TClonesArray's of the different data
> containers for that detector. Schematically:
>
> TObjArray TObjArray's
> --------- -----------
> event data CONTAINS objArray1 (drift chambers (DC))
> structure objArray2 (ring cherenkov)
> objArray3 (tof wall)
> .....
>
> Categories
> --------------
> Then, e.g., objArray1 CONTAINS category1 (TClonesArray of DC raw data)
> 'category' objects which each category2 (TClonesArray of DC cal data)
> contain a TClonesArray category3 (TClonesArray of DC hit data)
> .....
>
> The TObjArray's are necessary because there are different types of
> 'category' objects for optimization reasons.
>
> Currently, we split the two TObjArray 'levels' by hand, creating new
> branches for each object. We implemented this 3 years ago. However, our
> manual splitting essentially overrides much of Root's powerful automatic
> splitting implemented in Root v3.xx.
>
> If TObjArray's were automatically split by Root, then a new branch
> containing its objects as sub-branches (which may be split further) would be
> created. This would be very useful for us, and I can think of other uses,
> too. Is this technically difficult?
>
> Otherwise, to fully implement Root's automatic splitting scheme in an
> elegant way, we may have to eliminate our different types of data
> 'categories' and replace all of our TObjArray's by TClonesArrays. This is
> not a big deal, but it involves changing our concept somewhat...
>
> Best regards,
> Dan
> --------------------------------------------
> | Dr. Daniel Magestro +49-6159-71-2147 |
> | magestro@gsi.de GSI/Kernphysik I |
> | www.gsi.de/~magestro Planckstr. 1 |
> | (last updated Nov.8) 64291 Darmstadt (DE) |
> --------------------------------------------
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:08 MET