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