Hi Christian,
If the number of hits is small, you spend a huge amount of time
in creating/deleting the iterator inside the loop. To speed up
the process, you have two solutions
1- Create the iterator outside the loop and Reset it inside
TIter next(fHits)
for (i=0;i<nb_events;i++) {
next.Reset();
2- Use the following form:
for (i=0;i<nb_events;i++) {
Int_t nhits = fHits->GetEntriesfast();
for (j=0;j<nhits;j++) {
hit = (Hit*)fHits->At(j);
Let me know the results
Rene Brun
Christian Hilbes wrote:
>
> Hi,
>
> I am using a TIterator to loop over a TClonesArray I read from a tree
> (structure similar to ATLFast code). I do something like the following
>
> hit is an Object of type Hit* and
> fHits is a TClonesArray of Hit's
>
> for (i = 0; i < nb_events; i++) {
>
> tree->GetEvent(i);
>
> TIter next(fHits)
>
> while ((hit = (Hit*)next())) {
>
> // do stuff
>
> }
>
> // do a clear of the Arrays here
>
> }
>
> The problem is, that if the TClonesArray is empty (which happens quite
> often for one of my branches), a loop over the tree is really slow :350
> events per second. If I add the following however
>
> for (i = 0; i < nb_events; i++) {
>
> tree->GetEvent(i);
>
> TIter next(fHits)
>
> if (fHits->GetEntriesFast()) {
> while ((hit = (Hit*)next())) {
>
> // do stuff
> }
> }
>
> // do a clear of the arrays here
>
> }
>
> the loop is speeded up by quite a big factor : 2900 events per second.
>
> In case of a brach without empty arrays, the performace is about 2500
> evts. per second.
>
> The while loop is in fact not entered for empty arrays in the first case
> -> why does the call to next() take so much time if the TClonesArray is
> empty?
>
> Cheers,
>
> Christian Hilbes
>
> IPP - ETH Zuerich
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:43:44 MET