Re: slow macro processing

Rene Brun (Rene.Brun@cern.ch)
Sat, 13 Feb 1999 10:02:18 +0000


Hi Sean,
Your problem is not related at all to Paul Eugenio's problem.
I am proposing below the recommended way of looping on any container.
the same code will work if the container is a Tlist, ThashList,
TObjArray
or TClonesArray. It uses a TIter object.

Proposed modification to your code
==================================
TIter nextTop(event->topPtr());
Top *top;
while ((top=(Top*)nextTop())) {
chiSqRed->Fill(top->GetRedChiSq());
}

I made a timing test on my Linux box to test the performance of this
iterator using the Root test/Event example. I am always using the same
event to ignore I/O and concentrate only on the access time to the
TClonesArray and histogram filling.
This macro executes in 3.01 seconds. If I do not fill the histogram,
the macro executes in 2.1 seconds. This is obtained with the
interpreter.
Compiled version will probably be 3 times faster. There are 603000
entries
in the histogram. each histogram fill takes about 1.3 microseconds.
I think this performance is remarquable.
You do not mention how long it takes to execute your function. I would
suggest
you remove the chiSqRed->Fill statement to see how long it takes.
Let me know.

Rene Brun

my simple test with test/Event
==============================
{
gSystem->Load("test/libEvent");
TFile f("test/Event.root");
TTree *T = (TTree*)f.Get("T");
TH1F *hPx = new TH1F("hPx","Px distribution",100,-5,5);
Event *event = 0;
T->SetBranchAddress("event",&event);
T->GetEvent(500);
Track *track;
for (Int_t i=0;i<1000;i++) {
TIter next(event->GetTracks());
while ((track=(Track*)next())) {
hx->Fill(track->GetPx());
}
}
hPx->Draw();
}

Sean Kelly wrote:
>
> Hi Rene,
>
> I have a problem similar to Paul's. I have an event class similar to the
> example provided with the Root distribution. With each event I have a
> three TClonesArrays containing a number of objects of type Trk, Top, Phy.
> I loop over these arrays filling histograms as shown in the frag below.
> This takes ages for 10k events, ultimately I will have to do it for many
> more than that. I don't understand your suggestion for speeding this
> process up.. can you explain in more detail.
>
> much thanks
>
> Sean Kelly
>
> fill(){
>
> Int_t nTrk=0;
> Float_t *topPar=0;
> topCount->Fill(event->GetNTop());
>
> for (Int_t iTop = 0; iTop < event->GetNTop(); iTop++){
> top = (Top*) (*(event->topPtr))[iTop];
> chiSqRed->Fill(top->GetRedChiSq());
> }
> return 1;
>
> }