[ROOT] Sorting TClonesArray

From: Bernhard KETZER (Bernhard.Ketzer@cern.ch)
Date: Sun Dec 02 2001 - 22:48:36 MET


Hi Rooters!

When trying to sort a TClonesArray by one of its elements, e.g. the
Tracks TClonesArray in the Event class, the entries seem to be screwed
up after the sorting. I added the following two methods to the Event
class to illustrate the problem:

void Event::SortTracks()
{
  // Sort TClonesArray
  fTracks->Sort();
}

Int_t Track::Compare(const TObject *obj) const
{
 if (fNpoint == ((Track *)obj)->GetNpoint()) return 0;
 else if (fNpoint < ((Track *)obj)->GetNpoint()) return -1;
 else return 1;
}

Then, looping through the tracks, sorting them, and looping again, I
find that
the sorted values differ slightly from the original ones. Clearing the
TClonesArray and re-reading the event from the tree before sorting cures
the problem:
 
            nb += tree->GetEntry(ev);        //read complete event in
memory
	    for (int j =0; j<event->GetNtrack(); j++) {
              ...
            }

            // Uncommenting the following 2 lines cures the problem
	    //	    event->Clear();
	    //	    nb += tree->GetEntry(ev);  	

            event->SortTracks();
	    for (int j =0; j<event->GetNtrack(); j++) {
              ...
            }


Any hint as to what is going wrong when the array is not cleared before
the sorting?

Thanks for  your help!

	Bernhard

P.S. I am using ROOT v3.02/04. The modified versions of  Event.cxx,
Event.h, MainEvent.cxx  are on /afs/cern.ch/user/k/ketzer/public/root/




This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:51:10 MET