]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCTrackArray.cxx
Helper classes to hold data from an altro channel.
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCTrackArray.cxx
CommitLineData
a6c02c85 1// @(#) $Id$
4aa41877 2// Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan
a6c02c85 3
4fdaad1e 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 */
a6c02c85 24
312160d3 25#include "AliLog.h"
26#include "TClass.h"
a6c02c85 27#include "AliHLTTPCLogging.h"
28#include "AliHLTTPCTrackArray.h"
312160d3 29#define INCLUDE_TPC_HOUGH
a6c02c85 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
a6c02c85 39#if __GNUC__ >= 3
40using namespace std;
41#endif
42
43ClassImp(AliHLTTPCTrackArray)
44
45AliHLTTPCTrackArray::AliHLTTPCTrackArray()
4fdaad1e 46 :
2a083ac4 47 fTrackType('t'),
4fdaad1e 48 fSize(0),
2a083ac4 49 fIsPresent(NULL),
4fdaad1e 50 fNAbsent(0),
2a083ac4 51 fTrack(NULL),
52 fNTracks(0)
a6c02c85 53{
54 //Default constructor
4fdaad1e 55 SetSize();
56}
57
58
59AliHLTTPCTrackArray::AliHLTTPCTrackArray(const AliHLTTPCTrackArray&)
60 :
2a083ac4 61 fTrackType('t'),
4fdaad1e 62 fSize(0),
2a083ac4 63 fIsPresent(NULL),
4fdaad1e 64 fNAbsent(0),
2a083ac4 65 fTrack(NULL),
66 fNTracks(0)
4fdaad1e 67{
68 //constructor
69 SetSize();
70}
71
72AliHLTTPCTrackArray& AliHLTTPCTrackArray::operator=(const AliHLTTPCTrackArray&)
73{
74 //assignment
75 fSize=0;
a6c02c85 76 fNTracks=0;
77 fNAbsent=0;
78 fTrackType='t';
79 SetSize();
4fdaad1e 80 return *this;
a6c02c85 81}
82
a6c02c85 83AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
4fdaad1e 84 :
2a083ac4 85 fTrackType('t'),
4fdaad1e 86 fSize(0),
2a083ac4 87 fIsPresent(NULL),
4fdaad1e 88 fNAbsent(0),
2a083ac4 89 fTrack(NULL),
90 fNTracks(0)
a6c02c85 91{
92 //Constructor.
a6c02c85 93 SetSize(ntrack);
94}
95
96AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
4fdaad1e 97 :
2a083ac4 98 fTrackType('t'),
4fdaad1e 99 fSize(0),
2a083ac4 100 fIsPresent(NULL),
101 fNAbsent(0),
102 fTrack(NULL),
103 fNTracks(0)
a6c02c85 104{
105 //Constructor.
a6c02c85 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
115AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
4fdaad1e 116 :
2a083ac4 117 fTrackType('t'),
4fdaad1e 118 fSize(0),
2a083ac4 119 fIsPresent(NULL),
120 fNAbsent(0),
121 fTrack(NULL),
122 fNTracks(0)
a6c02c85 123{
124 //Constructor.
a6c02c85 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
134AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
135{
136 //Destructor
137 DeleteArray();
138}
139
140
141AliHLTTPCTrack *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
149void 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
158Bool_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
248void 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
257void AliHLTTPCTrackArray::Remove(Int_t track)
258{
259 //remove track
260 if(fIsPresent[track]){
261 fIsPresent[track]=kFALSE;
262 fNAbsent++;
263 }
264}
265
4fdaad1e 266void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice, Int_t bTransform)
a6c02c85 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;
4fdaad1e 276 if (slice>=0 && bTransform!=0) {
277 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
278 }
279 //cout << "psi " << psi[0] << endl;
a6c02c85 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;
4fdaad1e 288 if (slice>=0 && bTransform!=0) {
289 AliHLTTPCTransform::Local2Global(first,slice);
290 }
291 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
a6c02c85 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;
4fdaad1e 295 if (slice>=0 && bTransform!=0) {
296 AliHLTTPCTransform::Local2Global(last,slice);
297 }
298 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
a6c02c85 299 track->SetLastPoint(last[0],last[1],last[2]);
300 track->SetHits( trs->fNPoints, trs->fPointIDs );
4fdaad1e 301
302 if (slice>=0 && bTransform!=0) {
4e57c862 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);
4fdaad1e 308 } else {
309 // the parameters are in local coordinates, set the sector no
312160d3 310 //#ifndef INCLUDE_TPC_HOUGH
4fdaad1e 311 if (slice<0) track->SetSector(0);
312 else track->SetSector(slice);
312160d3 313 //#else
4fdaad1e 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.
312160d3 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
4fdaad1e 330 }
21b6a334 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 {
4e57c862 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();
21b6a334 344 }
345
a6c02c85 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);
a6c02c85 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
363UInt_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
378UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
379{
380 //write tracks
381 ntracks = GetOutCount();
382 return WriteTracks(tr);
383}
384
385UInt_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;
738c049f 432
433// BEGINN ############################################## MODIFIY JMT
db16520a 434// LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
435// track->Rotate(0,kFALSE);
436// track->Print();
738c049f 437// END ################################################# MODIFIY JMT
438
a6c02c85 439 }
440 return size;
441}
442
443UInt_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
496void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
497{
498 //add track to last position
499 AliHLTTPCTrack *tpt = NextTrack();
3cde846d 500 tpt->Copy(track);
a6c02c85 501
502}
503
504void 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();
3cde846d 521 track->Copy(tpt);
a6c02c85 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();
3cde846d 532 track->Copy(tpt);
a6c02c85 533 */
534 }
535}
536
537void 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
562void AliHLTTPCTrackArray::QSort()
563{
564 // compress and sort
565 Compress();
566 QSort(fTrack,0,fNTracks);
567}
568
569void 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
611Int_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
3cde846d 637AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
638{
4fdaad1e 639 // access operator
3cde846d 640 if (index<fNTracks) return fTrack[index];
641 return NULL;
642}