]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/TPCLib/AliHLTTPCTrackArray.cxx
Helper classes to hold data from an altro channel.
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCTrackArray.cxx
1 // @(#) $Id$
2 // Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan 
3
4 /**************************************************************************
5  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6  *                                                                        *
7  * Authors: Uli Frankenfeld                                               *
8  *          Matthias Richter <Matthias.Richter@ift.uib.no>                *
9  *          for The ALICE Off-line Project.                               *
10  *                                                                        *
11  * Permission to use, copy, modify and distribute this software and its   *
12  * documentation strictly for non-commercial purposes is hereby granted   *
13  * without fee, provided that the above copyright notice appears in all   *
14  * copies and that both the copyright notice and this permission notice   *
15  * appear in the supporting documentation. The authors make no claims     *
16  * about the suitability of this software for any purpose. It is          *
17  * provided "as is" without express or implied warranty.                  *
18  **************************************************************************/
19
20 /** @file   AliHLTTPCTrackArray.cxx
21     @author Uli Frankenfeld, maintained by Matthias Richter
22     @date   
23     @brief  Array of AliHLTTPCTracks */
24
25 #include "AliLog.h"
26 #include "TClass.h"
27 #include "AliHLTTPCLogging.h"
28 #include "AliHLTTPCTrackArray.h"
29 #define INCLUDE_TPC_HOUGH
30 #ifdef INCLUDE_TPC_HOUGH
31 #include "AliHLTTPCHoughTrack.h"
32 #endif
33 #include "AliHLTTPCModelTrack.h"
34 #include "AliHLTTPCConfMapTrack.h"
35 #include "AliHLTTPCTrackSegmentData.h"
36 #include "AliHLTTPCTransform.h"
37 #include "AliHLTTPCConfMapPoint.h"
38
39 #if __GNUC__ >= 3
40 using namespace std;
41 #endif
42
43 ClassImp(AliHLTTPCTrackArray)
44
45 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
46   :
47   fTrackType('t'),
48   fSize(0),
49   fIsPresent(NULL),
50   fNAbsent(0),
51   fTrack(NULL),
52   fNTracks(0)
53 {
54   //Default constructor
55   SetSize();
56 }
57
58
59 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const AliHLTTPCTrackArray&)
60   :
61   fTrackType('t'),
62   fSize(0),
63   fIsPresent(NULL),
64   fNAbsent(0),
65   fTrack(NULL),
66   fNTracks(0)
67 {
68   //constructor
69   SetSize();
70 }
71
72 AliHLTTPCTrackArray& AliHLTTPCTrackArray::operator=(const AliHLTTPCTrackArray&)
73 {
74   //assignment
75   fSize=0;
76   fNTracks=0;
77   fNAbsent=0;
78   fTrackType='t';
79   SetSize();
80   return *this;
81 }
82
83 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
84   :
85   fTrackType('t'),
86   fSize(0),
87   fIsPresent(NULL),
88   fNAbsent(0),
89   fTrack(NULL),
90   fNTracks(0)
91 {
92   //Constructor.
93   SetSize(ntrack);
94 }
95
96 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
97   :
98   fTrackType('t'),
99   fSize(0),
100   fIsPresent(NULL),
101   fNAbsent(0),
102   fTrack(NULL),
103   fNTracks(0)
104 {
105   //Constructor.
106   if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
107   if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
108 #ifdef INCLUDE_TPC_HOUGH
109   if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
110 #endif
111   if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
112   SetSize(ntrack);
113 }
114
115 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
116   :
117   fTrackType('t'),
118   fSize(0),
119   fIsPresent(NULL),
120   fNAbsent(0),
121   fTrack(NULL),
122   fNTracks(0)
123 {
124   //Constructor.
125   if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
126   if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
127 #ifdef INCLUDE_TPC_HOUGH
128   if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
129 #endif
130   if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
131   SetSize();
132 }
133
134 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
135 {
136   //Destructor
137   DeleteArray();
138 }
139
140
141 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
142 {
143   //next track in array
144   if(fNTracks<fSize) return fTrack[fNTracks++];
145   SetSize(fSize+100);
146    return fTrack[fNTracks++]; 
147 }
148
149 void AliHLTTPCTrackArray::DeleteArray()
150 {
151   //delete array
152   for(Int_t i=0; i<fSize;i++)
153     delete fTrack[i];
154   delete[] fIsPresent;
155   delete[] fTrack;
156 }
157
158 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
159 {
160   //set size
161   if(newsize<=fSize) return kFALSE; //shrink comes later!! 
162   if(!fSize){
163     fSize = newsize;
164     fTrack = new AliHLTTPCTrack*[fSize];
165     fIsPresent = new Bool_t[fSize];
166     switch(fTrackType){
167       case 't':
168         for(Int_t i=0;i<fSize;i++){
169           fTrack[i]   = new AliHLTTPCTrack();
170           fIsPresent[i] = kTRUE;
171         }
172         break;
173       case 'c':  
174         for(Int_t i=0;i<fSize;i++){
175           fTrack[i]   = new AliHLTTPCConfMapTrack();
176           fIsPresent[i] = kTRUE;
177         }
178         break;
179 #ifdef INCLUDE_TPC_HOUGH
180       case 'h':
181         for(Int_t i=0;i<fSize;i++){
182           fTrack[i]   = new AliHLTTPCHoughTrack();
183           fIsPresent[i] = kTRUE;
184         }
185         break;
186 #endif
187        case 'm':
188         for(Int_t i=0;i<fSize;i++){
189           fTrack[i]   = new AliHLTTPCModelTrack();
190           fIsPresent[i] = kTRUE;
191         }
192         break;
193       default: 
194         return kFALSE;
195     }
196     return kTRUE;
197   }
198   AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
199   Bool_t *pre = new Bool_t[fSize];
200   for(Int_t i=0; i<fSize;i++){
201     tmp[i] = fTrack[i];
202     pre[i] = fIsPresent[i];
203   }
204   delete[]  fTrack;
205   delete[] fIsPresent;
206   fTrack =  new AliHLTTPCTrack*[newsize];
207   fIsPresent = new Bool_t[newsize];
208   for(Int_t i=0; i<fSize;i++){
209     fTrack[i]   = tmp[i];
210     fIsPresent[i] = pre[i];
211   }
212   delete[] tmp;
213   delete[] pre;
214   switch(fTrackType){
215     case 't':
216       for(Int_t i=fSize;i<newsize;i++){
217         fTrack[i]   = new AliHLTTPCTrack();
218         fIsPresent[i] = kTRUE;
219       }
220       break;
221     case 'c':  
222       for(Int_t i=fSize;i<newsize;i++){
223         fTrack[i]   = new AliHLTTPCConfMapTrack();
224         fIsPresent[i] = kTRUE;
225       }
226       break;
227 #ifdef INCLUDE_TPC_HOUGH
228     case 'h':
229       for(Int_t i=fSize;i<newsize;i++){
230         fTrack[i]   = new AliHLTTPCHoughTrack();
231         fIsPresent[i] = kTRUE;
232       }
233       break;
234 #endif
235     case 'm':
236       for(Int_t i=fSize;i<newsize;i++){
237         fTrack[i]   = new AliHLTTPCModelTrack();
238         fIsPresent[i] = kTRUE;
239       }
240       break;
241     default: 
242       return kFALSE;
243   }
244   fSize = newsize;
245   return kTRUE;
246 }
247
248 void AliHLTTPCTrackArray::Reset()
249 {
250   //reset
251   fNTracks=0;
252   fNAbsent=0;
253   for(Int_t i=0; i<fSize;i++)
254     fIsPresent[i] = kTRUE; 
255 }
256
257 void AliHLTTPCTrackArray::Remove(Int_t track)
258 {
259   //remove track
260   if(fIsPresent[track]){
261     fIsPresent[track]=kFALSE;
262     fNAbsent++;
263   }
264 }
265
266 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice, Int_t bTransform)
267 {
268   //Read tracks from shared memory (or memory)
269   AliHLTTPCTrackSegmentData *trs = tr;
270   for(Int_t i=0; i<ntracks; i++){
271     AliHLTTPCTrack *track = NextTrack(); 
272     track->SetPt(trs->fPt);
273     track->SetPterr(trs->fPterr);
274     Float_t psi[1];
275     psi[0]=trs->fPsi;
276     if (slice>=0 && bTransform!=0)  {
277       AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
278     }
279     //cout << "psi " << psi[0] << endl;
280     track->SetPsi(psi[0]);
281     track->SetTgl(trs->fTgl);
282     track->SetPsierr(trs->fPsierr);
283     track->SetTglerr(trs->fTglerr);
284     track->SetNHits(trs->fNPoints);
285     track->SetCharge(trs->fCharge);
286     Float_t first[3];
287     first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
288     if (slice>=0 && bTransform!=0)  {
289       AliHLTTPCTransform::Local2Global(first,slice);
290     }
291     //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
292     track->SetFirstPoint(first[0],first[1],first[2]);
293     Float_t last[3];
294     last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
295     if (slice>=0 && bTransform!=0)  {
296       AliHLTTPCTransform::Local2Global(last,slice);
297     }
298     //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
299     track->SetLastPoint(last[0],last[1],last[2]);
300     track->SetHits( trs->fNPoints, trs->fPointIDs );
301
302     if (slice>=0 && bTransform!=0)  {
303       // Matthias Feb07: as everything is now in global coordinates, sector should
304       // be set to 0. But as the display does a check on the sector, we have to set
305       // it to the slice no. I suspect, that the transformation is done twice.
306       //track->SetSector(0);
307       track->SetSector(slice);
308     } else {
309       // the parameters are in local coordinates, set the sector no
310       //#ifndef INCLUDE_TPC_HOUGH
311       if (slice<0) track->SetSector(0);
312       else track->SetSector(slice);
313       //#else 
314       // Matthias Feb 2007: this is some kind of legacy ...
315       // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
316       // and this line was below in the corresponding block. As the slice
317       // parameter is very useful but not available if the define is off
318       // we distinguish the two cases here. Should be cleaned up.
319       // Matthias April 2007: update, try to integrate Cvetans Hough tracker
320       // so we need the support for the AliHLTTPCHoughTrack. I dont have the
321       // full control of this code (should we use slice or trs->fSector?)
322       // But the FillTracks method is never called from the hough code, so we
323       // take 'slice'
324       if (GetTrackType()=='h') {
325         AliErrorClassStream() << "FillTracks was never used with AliHLTTPCHoughTrack:" 
326                            << " CHECK THIS CODE!!!" << endl;
327       }
328       //track->SetSector(trs->fSector);
329       //#endif // INCLUDE_TPC_HOUGH
330     }
331
332     // this is currently a quick hack for straight lines of the first version 
333     // of the CA tracker.
334     // we have to think about a more general way of treating straight and curved
335     // tracks
336     if ( trs->fPt == -9876.0 ||  trs->fPt == -1.0) {
337       track->SetPhi0(atan2(first[1],first[0]));
338       track->SetKappa(1.0);
339       track->SetRadius(999999.0);
340     } else {
341       // Matthias Feb07: just tried to take this away, but this causes the tracks
342       // in the display not to be drawn. But we still have to tink about this.
343       track->CalculateHelix();
344     }
345
346 #ifdef INCLUDE_TPC_HOUGH
347 #ifdef ROWHOUGHPARAMS
348     if(GetTrackType()=='h') {
349       ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
350       ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
351     }
352     track->SetMCid(trs->fTrackID);
353     track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
354     track->SetPID(trs->fPID);
355 #endif
356 #endif // INCLUDE_TPC_HOUGH
357     UChar_t *tmpP = (UChar_t*)trs;
358     tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
359     trs = (AliHLTTPCTrackSegmentData*)tmpP;
360   }
361 }
362
363 UInt_t AliHLTTPCTrackArray::GetOutSize()
364 {
365   //get size for IO
366   UInt_t count = GetOutCount();   //use only present tracks
367   UInt_t tHits = 0;
368   for(Int_t i=0;i<fNTracks;i++){  //loop over all tracks
369     AliHLTTPCTrack *track = GetCheckedTrack(i);  //use only present tracks
370     if(track)                                       //use only present tracks
371       tHits += track->GetNHits();
372   }
373
374   //calculate size of track
375   return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
376 }
377
378 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
379 {
380   //write tracks
381   ntracks = GetOutCount();
382   return WriteTracks(tr);
383 }
384
385 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
386 {
387   //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
388   AliHLTTPCTrackSegmentData *tP = tr;
389   UInt_t *pP;
390   UInt_t size = 0;
391   for(Int_t i=0; i<fNTracks; i++){  //loop over all tracks
392     AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
393     if(!track) continue;                           //use only present tracks
394     tP->fX = track->GetFirstPointX();
395     tP->fY = track->GetFirstPointY();
396     tP->fZ = track->GetFirstPointZ();
397     tP->fPt = track->GetPt();
398     tP->fPterr = track->GetPterr();
399     tP->fLastX = track->GetLastPointX();
400     tP->fLastY = track->GetLastPointY();
401     tP->fLastZ = track->GetLastPointZ();
402     tP->fPsi = track->GetPsi();
403     tP->fTgl = track->GetTgl();
404     tP->fPsierr = track->GetPsierr();
405     tP->fTglerr = track->GetTglerr();
406     tP->fCharge = track->GetCharge();
407     tP->fNPoints = track->GetNHits();
408 #ifdef INCLUDE_TPC_HOUGH
409 #ifdef ROWHOUGHPARAMS
410     if(GetTrackType()=='h') {
411       tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
412       tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
413       tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
414       tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
415       tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
416     }
417     tP->fTrackID = track->GetMCid();
418     tP->fRowRange1 = track->GetFirstRow();
419     tP->fRowRange2 = track->GetLastRow();
420     tP->fSector = track->GetSector();
421     tP->fPID = track->GetPID();
422 #endif
423 #endif // INCLUDE_TPC_HOUGH
424     pP = (UInt_t*)track->GetHitNumbers();
425     for (UInt_t j=0;j<tP->fNPoints;j++){
426       tP->fPointIDs[j] = pP[j];
427     }
428     Byte_t *tmpP = (Byte_t *)tP;
429     tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
430     size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
431     tP = (AliHLTTPCTrackSegmentData*)tmpP;
432
433 // BEGINN ############################################## MODIFIY JMT
434 //    LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
435 //    track->Rotate(0,kFALSE);
436 //    track->Print();
437 // END ################################################# MODIFIY JMT
438
439   }
440   return size;
441 }
442
443 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
444 {
445   // use first and last point objects
446   AliHLTTPCTrackSegmentData *tP = tr;
447   UInt_t *pP;
448   UInt_t size = 0;
449   for(Int_t i=0; i<fNTracks; i++){  //loop over all tracks
450     AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
451     if(!track) continue;                           //use only present tracks
452     AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
453     AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
454     tP->fX = hit->GetX();
455     tP->fY = hit->GetY();
456     tP->fZ = hit->GetZ();
457     tP->fLastX = lastHit->GetX();
458     tP->fLastY = lastHit->GetY();
459     tP->fLastZ = lastHit->GetZ();
460    
461 //    tP->fX = track->GetFirstPointX();
462 //    tP->fY = track->GetFirstPointY();
463 //    tP->fZ = track->GetFirstPointZ();
464     tP->fPt = track->GetPt();
465     tP->fPterr = track->GetPterr();
466 //    tP->fLastX = track->GetLastPointX();
467 //    tP->fLastY = track->GetLastPointY();
468 //    tP->fLastZ = track->GetLastPointZ();
469     tP->fPsi = track->GetPsi();
470     tP->fTgl = track->GetTgl();
471     tP->fPsierr = track->GetPsierr();
472     tP->fTglerr = track->GetTglerr();
473     tP->fCharge = track->GetCharge();
474 #ifdef INCLUDE_TPC_HOUGH
475 #ifdef ROWHOUGHPARAMS
476     tP->fTrackID = track->GetMCid();
477     tP->fRowRange1 = track->GetFirstRow();
478     tP->fRowRange2 = track->GetLastRow();
479     tP->fSector = track->GetSector();
480     tP->fPID = track->GetPID();
481 #endif
482 #endif // INCLUDE_TPC_HOUGH
483     tP->fNPoints = track->GetNHits();
484     pP = (UInt_t*)track->GetHitNumbers();
485     for (UInt_t j=0;j<tP->fNPoints;j++){
486       tP->fPointIDs[j] = pP[j];
487     }
488     Byte_t *tmpP = (Byte_t *)tP;
489     tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
490     size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
491     tP = (AliHLTTPCTrackSegmentData*)tmpP;
492   }
493   return size;
494 }
495
496 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
497 {
498   //add track to last position
499   AliHLTTPCTrack *tpt = NextTrack();
500   tpt->Copy(track);
501   
502 }
503
504 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
505 {
506   //add tracks
507   if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
508     {
509       LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
510         <<"Bad idea to add tracks of different types"<<ENDLOG;
511       return;
512     }
513   if(fSize < fNTracks+newtrack->GetNPresent())
514     SetSize(fSize+newtrack->GetSize());
515   for(Int_t i =0;i<newtrack->GetNTracks();i++){
516     AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
517     if(!tpt) continue;
518     if(remove_old)
519       newtrack->Remove(i);
520     AliHLTTPCTrack *track = NextTrack();
521     track->Copy(tpt);
522     if(slice>=0)
523       track->Rotate(slice); //Rotate track to global coordinates
524     /*
525       AliHLTTPCTrack *track;
526 #ifdef INCLUDE_TPC_HOUGH
527       if(GetTrackType()=='h')
528       track = (AliHLTTPCHoughTrack*)NextTrack();
529       else
530 #endif
531       track = NextTrack();
532       track->Copy(tpt);
533     */
534   }
535 }
536
537 void AliHLTTPCTrackArray::Compress()
538 {
539   //compress array
540   if(GetNPresent()==GetNTracks()) return;
541   AliHLTTPCTrack **tmp =  new AliHLTTPCTrack *[fNTracks];
542   Int_t present=0;
543   Int_t absent=GetNPresent();
544   for(Int_t i=0;i<GetNTracks();i++){
545     if(fIsPresent[i]) tmp[present++] = fTrack[i];
546     else tmp[absent++] = fTrack[i];
547   }
548   for(Int_t i=0;i<GetNTracks();i++)
549     fIsPresent[i]=kTRUE;
550
551   //Copy pointers back
552   for(Int_t i=0; i<GetNTracks();i++){
553     fTrack[i]=tmp[i];
554   }
555
556   delete[] tmp;
557
558   fNTracks = GetNPresent();
559   fNAbsent = 0;
560 }
561
562 void AliHLTTPCTrackArray::QSort()
563 {
564   // compress and sort
565   Compress();
566   QSort(fTrack,0,fNTracks);
567 }
568
569 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
570 {
571    // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
572    // Uses TrackCompare() to compare objects.
573    // Thanks to Root! 
574
575    static AliHLTTPCTrack *tmp;
576    static int i;           // "static" to save stack space
577    int j;
578
579    while (last - first > 1) {
580       i = first;
581       j = last;
582       for (;;) {
583         while (++i < last && TrackCompare(a[i], a[first]) < 0)
584           ;
585         while (--j > first && TrackCompare(a[j], a[first]) > 0)
586           ;
587          if (i >= j)
588             break;
589
590          tmp  = a[i];
591          a[i] = a[j];
592          a[j] = tmp;
593       }
594       if (j == first) {
595          ++first;
596          continue;
597       }
598       tmp = a[first];
599       a[first] = a[j];
600       a[j] = tmp;
601       if (j - first < last - (j + 1)) {
602          QSort(a, first, j);
603          first = j + 1;   // QSort(j + 1, last);
604       } else {
605          QSort(a, j + 1, last);
606          last = j;        // QSort(first, j);
607       }
608    }
609 }
610
611 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
612 {
613    // Compare the two tracks.
614   
615   return b->Compare(a);
616   
617   /*
618 #ifdef INCLUDE_TPC_HOUGH
619     if(fTrackType=='h')
620     {
621     AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
622     AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
623     if(tra->GetWeight() < trb->GetWeight()) return 1;
624     if(tra->GetWeight() > trb->GetWeight()) return -1;
625     }
626     else
627 #endif
628     {
629     if(a->GetNHits() < b->GetNHits()) return 1;
630     if(a->GetNHits() > b->GetNHits()) return -1;
631     }
632     
633     return 0;
634   */
635 }
636
637 AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
638 {
639   // access operator
640   if (index<fNTracks) return fTrack[index];
641   return NULL;
642 }