Hi Andy, Give me some time to investigate your requirement. I do not think it is a lot of work to implement it. I want to be very cautious when making changes in this part of the logic. There are so many cases to be taken into account. I will let you know. Rene Brun Andy Salnikov wrote: > > Hi Rene, > > I don't want to look bothering and annoying, but it seems I have to. > As usual, I got no answer to my question, and I gonna repeat it > literally: > > I can't really understand why is this difference in approaches, does > it really must be like that? Can't we make the behavior more uniform > across split and non-split branches? > > I mean that I really really would like to have GetEntry() to set the > pointer which was passed to the branch with SetAddress(), no matter it > is split or non-split branch. > > As for your receipt below - we really do not know the true type of the > object when we are reading it. ROOT does know, because all the > information is in the trees/branches. I understand that knowing the name > of the class I can create the instance, now how can I get the name of > the class which is in the branch? Do you have some mechanism in ROOT to > accomplish something like this : "knowing TTree and branch name I want > to obtain the class of the object in this branch"? Looking at the > documentation and the code I can't seem to find the relatively easy way > to do it, which will not depend on the details of implementation of your > stuff, or can I? > > Cheers, > Andy. > > ----- Original Message ----- > From: Rene Brun <Rene.Brun@cern.ch> > To: Andrei Salnikov <salnikov@SLAC.Stanford.EDU> > Cc: ROOTTALK <roottalk@hpsalo.cern.ch> > Sent: Wednesday, September 15, 1999 8:36 AM > Subject: Re: split/non-split difference in SetAddress() > > > Hi Andy, > > I appreciate the fact that you have been able to understand very > deeply > > the way the Tree/Branch mechanism works. Your analysis is perfectly > > correct. > > Now back to your question. > > You can have a perfectly symmetric mechanism between split and > non-plit > > mode > > if instead of: > > ClassBaseA* theObjectPointer_ = 0; > > (ie letting Root instantiate the object itself) > > you make yourself an instance of the object. > > I understand your argument about schema evolution and that you do not > > know > > a priori (I assume at compilation time) what your current class > derived > > from ClassBaseA will be. However, I assume that you must have a > > mechanism > > at run time to find out if you have a ClassA_001 or a ClassA_00N . > > With Root you can create an instance of an object by knowing only > > its class name, say "ClassA__003". Proceed as follows: > > - Get a pointer to the Root TClass object (RTTI) for this class > > TClass *cl = gROOT->GetClass("ClassA_003"); > > - Create an instance of the object with: > > ClassBaseA* theObjectPointer_ = (ClassBaseA*)cl->New(); > > - Now you can set the branch address > > theBranch_ -> SetAddress ( (void*)(&theObjectPointer_) ) ; > > > > When the object already exists, Root input in split mode will not > > destroy > > the already existing object, theObjectPointer will always have the > same > > value. > > In non-split mode, we have no choice but to delete the previous object > > at the branch address because the new object has not the same size > than > > the previous object in general. > > > > > > Rene Brun > >
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:39 MET