2 // Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan
4 /**************************************************************************
5 * This file is property of and copyright by the ALICE HLT Project *
6 * ALICE Experiment at CERN, All rights reserved. *
8 * Primary Authors: Uli Frankenfeld, maintained by *
9 * Matthias Richter <Matthias.Richter@ift.uib.no> *
10 * for The ALICE HLT Project. *
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 **************************************************************************/
21 /** @file AliHLTTPCTrackArray.cxx
22 @author Uli Frankenfeld, maintained by Matthias Richter
24 @brief Array of AliHLTTPCTracks */
28 #include "AliHLTTPCLogging.h"
29 #include "AliHLTTPCTrackArray.h"
30 // Matthias 17.10.2007 the hough code has been disabled for the moment
31 //#define INCLUDE_TPC_HOUGH
32 #ifdef INCLUDE_TPC_HOUGH
33 #include "AliHLTTPCHoughTrack.h"
35 #include "AliHLTTPCModelTrack.h"
36 #include "AliHLTTPCConfMapTrack.h"
37 #include "AliHLTTPCTrackSegmentData.h"
38 #include "AliHLTTPCTransform.h"
39 #include "AliHLTTPCConfMapPoint.h"
40 #include "AliHLTExternalTrackParam.h"
46 ClassImp(AliHLTTPCTrackArray)
48 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
62 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
75 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const char* tracktype,Int_t ntrack)
85 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
86 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
87 #ifdef INCLUDE_TPC_HOUGH
88 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
90 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
94 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const char* tracktype)
104 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
105 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
106 #ifdef INCLUDE_TPC_HOUGH
107 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
109 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
113 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
120 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
122 //next track in array
123 if(fNTracks<fSize) return fTrack[fNTracks++];
125 return fTrack[fNTracks++];
128 void AliHLTTPCTrackArray::DeleteArray()
131 for(Int_t i=0; i<fSize;i++)
138 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
141 if(newsize<=fSize) return kFALSE; //shrink comes later!!
144 fTrack = new AliHLTTPCTrack*[fSize];
145 fIsPresent = new Bool_t[fSize];
148 for(Int_t i=0;i<fSize;i++){
149 fTrack[i] = new AliHLTTPCTrack();
150 fIsPresent[i] = kTRUE;
154 for(Int_t i=0;i<fSize;i++){
155 fTrack[i] = new AliHLTTPCConfMapTrack();
156 fIsPresent[i] = kTRUE;
159 #ifdef INCLUDE_TPC_HOUGH
161 for(Int_t i=0;i<fSize;i++){
162 fTrack[i] = new AliHLTTPCHoughTrack();
163 fIsPresent[i] = kTRUE;
168 for(Int_t i=0;i<fSize;i++){
169 fTrack[i] = new AliHLTTPCModelTrack();
170 fIsPresent[i] = kTRUE;
178 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
179 Bool_t *pre = new Bool_t[fSize];
180 for(Int_t i=0; i<fSize;i++){
182 pre[i] = fIsPresent[i];
186 fTrack = new AliHLTTPCTrack*[newsize];
187 fIsPresent = new Bool_t[newsize];
188 for(Int_t i=0; i<fSize;i++){
190 fIsPresent[i] = pre[i];
196 for(Int_t i=fSize;i<newsize;i++){
197 fTrack[i] = new AliHLTTPCTrack();
198 fIsPresent[i] = kTRUE;
202 for(Int_t i=fSize;i<newsize;i++){
203 fTrack[i] = new AliHLTTPCConfMapTrack();
204 fIsPresent[i] = kTRUE;
207 #ifdef INCLUDE_TPC_HOUGH
209 for(Int_t i=fSize;i<newsize;i++){
210 fTrack[i] = new AliHLTTPCHoughTrack();
211 fIsPresent[i] = kTRUE;
216 for(Int_t i=fSize;i<newsize;i++){
217 fTrack[i] = new AliHLTTPCModelTrack();
218 fIsPresent[i] = kTRUE;
228 void AliHLTTPCTrackArray::Reset()
233 for(Int_t i=0; i<fSize;i++)
234 fIsPresent[i] = kTRUE;
237 void AliHLTTPCTrackArray::Remove(Int_t track)
240 if(fIsPresent[track]){
241 fIsPresent[track]=kFALSE;
246 int AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr, Int_t slice, Int_t bTransform)
248 //Read tracks from shared memory (or memory)
249 return FillTracksChecked(tr, ntracks, 0, slice, bTransform);
252 int AliHLTTPCTrackArray::FillTracksChecked(AliHLTExternalTrackParam* tr, Int_t ntracks, unsigned int sizeInByte, Int_t slice, Int_t bTransform)
255 AliHLTExternalTrackParam *trs = tr;
257 for(Int_t i=0; i<ntracks; i++){
259 (((AliHLTUInt8_t*)trs)+sizeof(AliHLTExternalTrackParam)>((AliHLTUInt8_t*)tr)+sizeInByte ||
260 ((AliHLTUInt8_t*)trs)+sizeof(AliHLTExternalTrackParam)+trs->fNPoints*sizeof(UInt_t)>((AliHLTUInt8_t*)tr)+sizeInByte)) {
264 AliHLTTPCTrack *track = NextTrack();
266 track->SetPt(trs->fq1Pt);
267 track->SetPterr(trs->fC[14]);
270 if (slice>=0 && bTransform!=0) {
271 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
273 //cout << "psi " << psi[0] << endl;
274 track->SetPsi(psi[0]);
275 track->SetTgl(trs->fTgl);
276 track->SetPsierr(trs->fC[5]);
277 track->SetTglerr(trs->fC[9]);
278 track->SetY0err(trs->fC[0]);
279 track->SetZ0err(trs->fC[2]);
280 track->SetNHits(trs->fNPoints);
281 //track->SetCharge(trs->fCharge);
283 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
284 if (slice>=0 && bTransform!=0) {
285 AliHLTTPCTransform::Local2Global(first,slice);
287 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
288 track->SetFirstPoint(first[0],first[1],first[2]);
290 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
291 if (slice>=0 && bTransform!=0) {
292 AliHLTTPCTransform::Local2Global(last,slice);
294 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
295 track->SetLastPoint(last[0],last[1],last[2]);
296 track->SetHits( trs->fNPoints, trs->fPointIDs );
298 //if (slice>=0 && bTransform!=0) {
299 // Matthias Feb07: as everything is now in global coordinates, sector should
300 // be set to 0. But as the display does a check on the sector, we have to set
301 // it to the slice no. I suspect, that the transformation is done twice.
302 //track->SetSector(0);
304 track->SetSector(slice);
307 // the parameters are in local coordinates, set the sector no
308 //#ifndef INCLUDE_TPC_HOUGH
309 //if (slice<0) track->SetSector(0);
310 //else track->SetSector(slice);
312 // Matthias Feb 2007: this is some kind of legacy ...
313 // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
314 // and this line was below in the corresponding block. As the slice
315 // parameter is very useful but not available if the define is off
316 // we distinguish the two cases here. Should be cleaned up.
317 // Matthias April 2007: update, try to integrate Cvetans Hough tracker
318 // so we need the support for the AliHLTTPCHoughTrack. I dont have the
319 // full control of this code (should we use slice or trs->fSector?)
320 // But the FillTracks method is never called from the hough code, so we
322 if (GetTrackType()=='h') {
323 AliErrorClassStream() << "FillTracks was never used with AliHLTTPCHoughTrack:"
324 << " CHECK THIS CODE!!!" << endl;
326 //track->SetSector(trs->fSector);
327 //#endif // INCLUDE_TPC_HOUGH
330 // this is currently a quick hack for straight lines of the first version
331 // of the CA tracker.
332 // we have to think about a more general way of treating straight and curved
334 if ( trs->fq1Pt == -9876.0 || trs->fq1Pt == -1.0) {
335 track->SetPhi0(atan2(first[1],first[0]));
336 track->SetKappa(1.0);
337 track->SetRadius(999999.0);
339 // Matthias Feb07: just tried to take this away, but this causes the tracks
340 // in the display not to be drawn. But we still have to tink about this.
341 track->CalculateHelix();
344 #ifdef INCLUDE_TPC_HOUGH
345 #ifdef ROWHOUGHPARAMS
346 if(GetTrackType()=='h') {
347 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
348 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
350 track->SetMCid(trs->fTrackID);
351 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
352 track->SetPID(trs->fPID);
354 #endif // INCLUDE_TPC_HOUGH
355 track->CheckConsistency();
357 UChar_t *tmpP = (UChar_t*)trs;
358 tmpP += sizeof(AliHLTExternalTrackParam)+trs->fNPoints*sizeof(UInt_t);
359 trs = (AliHLTExternalTrackParam*)tmpP;
364 int AliHLTTPCTrackArray::FillTracksChecked(AliHLTTPCTrackSegmentData* tr, Int_t ntracks, unsigned int sizeInByte, Int_t slice, Int_t bTransform)
366 //Read tracks from shared memory (or memory)
368 AliHLTTPCTrackSegmentData *trs = tr;
369 for(Int_t i=0; i<ntracks; i++){
371 (((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentData)>((AliHLTUInt8_t*)tr)+sizeInByte ||
372 ((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t)>((AliHLTUInt8_t*)tr)+sizeInByte)) {
376 AliHLTTPCTrack *track = NextTrack();
378 track->SetPt(trs->fPt);
379 track->SetPterr(trs->fPterr);
382 if (slice>=0 && bTransform!=0) {
383 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
385 //cout << "psi " << psi[0] << endl;
386 track->SetPsi(psi[0]);
387 track->SetTgl(trs->fTgl);
388 track->SetPsierr(trs->fPsierr);
389 track->SetTglerr(trs->fTglerr);
390 track->SetY0err(trs->fY0err);
391 track->SetZ0err(trs->fZ0err);
392 track->SetNHits(trs->fNPoints);
393 track->SetCharge(trs->fCharge);
395 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
396 if (slice>=0 && bTransform!=0) {
397 AliHLTTPCTransform::Local2Global(first,slice);
399 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
400 track->SetFirstPoint(first[0],first[1],first[2]);
402 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
403 if (slice>=0 && bTransform!=0) {
404 AliHLTTPCTransform::Local2Global(last,slice);
406 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
407 track->SetLastPoint(last[0],last[1],last[2]);
408 track->SetHits( trs->fNPoints, trs->fPointIDs );
410 //if (slice>=0 && bTransform!=0) {
411 // Matthias Feb07: as everything is now in global coordinates, sector should
412 // be set to 0. But as the display does a check on the sector, we have to set
413 // it to the slice no. I suspect, that the transformation is done twice.
414 //track->SetSector(0);
415 track->SetSector(slice);
417 // the parameters are in local coordinates, set the sector no
418 //#ifndef INCLUDE_TPC_HOUGH
419 //if (slice<0) track->SetSector(0);
420 //else track->SetSector(slice);
422 // Matthias Feb 2007: this is some kind of legacy ...
423 // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
424 // and this line was below in the corresponding block. As the slice
425 // parameter is very useful but not available if the define is off
426 // we distinguish the two cases here. Should be cleaned up.
427 // Matthias April 2007: update, try to integrate Cvetans Hough tracker
428 // so we need the support for the AliHLTTPCHoughTrack. I dont have the
429 // full control of this code (should we use slice or trs->fSector?)
430 // But the FillTracks method is never called from the hough code, so we
432 if (GetTrackType()=='h') {
433 AliErrorClassStream() << "FillTracks was never used with AliHLTTPCHoughTrack:"
434 << " CHECK THIS CODE!!!" << endl;
436 //track->SetSector(trs->fSector);
437 //#endif // INCLUDE_TPC_HOUGH
440 // this is currently a quick hack for straight lines of the first version
441 // of the CA tracker.
442 // we have to think about a more general way of treating straight and curved
444 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
445 track->SetPhi0(atan2(first[1],first[0]));
446 track->SetKappa(1.0);
447 track->SetRadius(999999.0);
449 // Matthias Feb07: just tried to take this away, but this causes the tracks
450 // in the display not to be drawn. But we still have to tink about this.
451 track->CalculateHelix();
454 #ifdef INCLUDE_TPC_HOUGH
455 #ifdef ROWHOUGHPARAMS
456 if(GetTrackType()=='h') {
457 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
458 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
460 track->SetMCid(trs->fTrackID);
461 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
462 track->SetPID(trs->fPID);
464 #endif // INCLUDE_TPC_HOUGH
465 track->CheckConsistency();
467 UChar_t *tmpP = (UChar_t*)trs;
468 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
469 trs = (AliHLTTPCTrackSegmentData*)tmpP;
472 if (iResult==-EDOM) {
473 // try to recover the version 1 struct
475 if ((iResult=FillTracksVersion1((AliHLTTPCTrackSegmentDataV1*)tr, ntracks, sizeInByte, slice, bTransform))>=0) {
476 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTrackArray::FillTracks","") << "version 1 track array recoverd (deprecated since r27415)" << ENDLOG;
479 if (iResult==-EDOM) {
481 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::FillTracks","") << "corrupted input data array" << ENDLOG;
487 int AliHLTTPCTrackArray::FillTracksVersion1(AliHLTTPCTrackSegmentDataV1* tr, Int_t ntracks, unsigned int sizeInByte, Int_t slice, Int_t bTransform)
489 //Read tracks from shared memory (or memory)
491 AliHLTTPCTrackSegmentDataV1 *trs = tr;
492 for(Int_t i=0; i<ntracks; i++){
494 (((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentDataV1)>((AliHLTUInt8_t*)tr)+sizeInByte ||
495 ((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentDataV1)+trs->fNPoints*sizeof(UInt_t)>((AliHLTUInt8_t*)tr)+sizeInByte)) {
499 AliHLTTPCTrack *track = NextTrack();
500 track->SetPt(trs->fPt);
501 track->SetPterr(trs->fPterr);
504 if (slice>=0 && bTransform!=0) {
505 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
507 track->SetPsi(psi[0]);
508 track->SetTgl(trs->fTgl);
509 track->SetPsierr(trs->fPsierr);
510 track->SetTglerr(trs->fTglerr);
511 track->SetNHits(trs->fNPoints);
512 track->SetCharge(trs->fCharge);
514 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
515 if (slice>=0 && bTransform!=0) {
516 AliHLTTPCTransform::Local2Global(first,slice);
518 track->SetFirstPoint(first[0],first[1],first[2]);
520 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
521 if (slice>=0 && bTransform!=0) {
522 AliHLTTPCTransform::Local2Global(last,slice);
524 track->SetLastPoint(last[0],last[1],last[2]);
525 track->SetHits( trs->fNPoints, trs->fPointIDs );
527 track->SetSector(slice);
528 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
529 track->SetPhi0(atan2(first[1],first[0]));
530 track->SetKappa(1.0);
531 track->SetRadius(999999.0);
533 track->CalculateHelix();
536 UChar_t *tmpP = (UChar_t*)trs;
537 tmpP += sizeof(AliHLTTPCTrackSegmentDataV1)+trs->fNPoints*sizeof(UInt_t);
538 trs = (AliHLTTPCTrackSegmentDataV1*)tmpP;
543 UInt_t AliHLTTPCTrackArray::GetOutSize()
546 UInt_t count = GetOutCount(); //use only present tracks
548 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
549 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
550 if(track) //use only present tracks
551 tHits += track->GetNHits();
554 //calculate size of track
555 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
558 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
561 ntracks = GetOutCount();
562 return WriteTracks(tr);
565 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
567 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
568 AliHLTTPCTrackSegmentData *tP = tr;
571 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
572 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
573 if(!track) continue; //use only present tracks
574 tP->fX = track->GetFirstPointX();
575 tP->fY = track->GetFirstPointY();
576 tP->fZ = track->GetFirstPointZ();
577 tP->fPt = track->GetPt();
578 tP->fPterr = track->GetPterr();
579 tP->fLastX = track->GetLastPointX();
580 tP->fLastY = track->GetLastPointY();
581 tP->fLastZ = track->GetLastPointZ();
582 tP->fPsi = track->GetPsi();
583 tP->fTgl = track->GetTgl();
584 tP->fPsierr = track->GetPsierr();
585 tP->fTglerr = track->GetTglerr();
586 tP->fY0err = track->GetY0err();
587 tP->fZ0err = track->GetZ0err();
588 tP->fCharge = track->GetCharge();
589 tP->fNPoints = track->GetNHits();
590 #ifdef INCLUDE_TPC_HOUGH
591 #ifdef ROWHOUGHPARAMS
592 if(GetTrackType()=='h') {
593 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
594 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
595 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
596 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
597 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
599 tP->fTrackID = track->GetMCid();
600 tP->fRowRange1 = track->GetFirstRow();
601 tP->fRowRange2 = track->GetLastRow();
602 tP->fSector = track->GetSector();
603 tP->fPID = track->GetPID();
605 #endif // INCLUDE_TPC_HOUGH
606 pP = (UInt_t*)track->GetHitNumbers();
607 for (UInt_t j=0;j<tP->fNPoints;j++){
608 tP->fPointIDs[j] = pP[j];
610 Byte_t *tmpP = (Byte_t *)tP;
611 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
612 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
613 tP = (AliHLTTPCTrackSegmentData*)tmpP;
615 // LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
616 // track->Rotate(0,kFALSE);
623 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
625 // use first and last point objects
626 AliHLTTPCTrackSegmentData *tP = tr;
629 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
630 AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
631 if(!track) continue; //use only present tracks
632 AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
633 AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
634 tP->fX = hit->GetX();
635 tP->fY = hit->GetY();
636 tP->fZ = hit->GetZ();
637 tP->fLastX = lastHit->GetX();
638 tP->fLastY = lastHit->GetY();
639 tP->fLastZ = lastHit->GetZ();
641 // tP->fX = track->GetFirstPointX();
642 // tP->fY = track->GetFirstPointY();
643 // tP->fZ = track->GetFirstPointZ();
644 tP->fPt = track->GetPt();
645 tP->fPterr = track->GetPterr();
646 // tP->fLastX = track->GetLastPointX();
647 // tP->fLastY = track->GetLastPointY();
648 // tP->fLastZ = track->GetLastPointZ();
649 tP->fPsi = track->GetPsi();
650 tP->fTgl = track->GetTgl();
651 tP->fPsierr = track->GetPsierr();
652 tP->fTglerr = track->GetTglerr();
653 tP->fY0err = track->GetY0err();
654 tP->fZ0err = track->GetZ0err();
655 tP->fCharge = track->GetCharge();
656 #ifdef INCLUDE_TPC_HOUGH
657 #ifdef ROWHOUGHPARAMS
658 tP->fTrackID = track->GetMCid();
659 tP->fRowRange1 = track->GetFirstRow();
660 tP->fRowRange2 = track->GetLastRow();
661 tP->fSector = track->GetSector();
662 tP->fPID = track->GetPID();
664 #endif // INCLUDE_TPC_HOUGH
665 tP->fNPoints = track->GetNHits();
666 pP = (UInt_t*)track->GetHitNumbers();
667 for (UInt_t j=0;j<tP->fNPoints;j++){
668 tP->fPointIDs[j] = pP[j];
670 Byte_t *tmpP = (Byte_t *)tP;
671 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
672 size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
673 tP = (AliHLTTPCTrackSegmentData*)tmpP;
678 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
680 //add track to last position
681 AliHLTTPCTrack *tpt = NextTrack();
686 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
689 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
691 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
692 <<"Bad idea to add tracks of different types"<<ENDLOG;
695 if(fSize < fNTracks+newtrack->GetNPresent())
696 SetSize(fSize+newtrack->GetSize());
697 for(Int_t i =0;i<newtrack->GetNTracks();i++){
698 AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
702 AliHLTTPCTrack *track = NextTrack();
705 track->Rotate(slice); //Rotate track to global coordinates
707 AliHLTTPCTrack *track;
708 #ifdef INCLUDE_TPC_HOUGH
709 if(GetTrackType()=='h')
710 track = (AliHLTTPCHoughTrack*)NextTrack();
719 void AliHLTTPCTrackArray::Compress()
722 if(GetNPresent()==GetNTracks()) return;
723 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
725 Int_t absent=GetNPresent();
726 for(Int_t i=0;i<GetNTracks();i++){
727 if(fIsPresent[i]) tmp[present++] = fTrack[i];
728 else tmp[absent++] = fTrack[i];
730 for(Int_t i=0;i<GetNTracks();i++)
734 for(Int_t i=0; i<GetNTracks();i++){
740 fNTracks = GetNPresent();
744 void AliHLTTPCTrackArray::QSort()
748 QSort(fTrack,0,fNTracks);
751 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
753 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
754 // Uses TrackCompare() to compare objects.
757 static AliHLTTPCTrack *tmp;
758 static int i; // "static" to save stack space
761 while (last - first > 1) {
765 while (++i < last && TrackCompare(a[i], a[first]) < 0)
767 while (--j > first && TrackCompare(a[j], a[first]) > 0)
783 if (j - first < last - (j + 1)) {
785 first = j + 1; // QSort(j + 1, last);
787 QSort(a, j + 1, last);
788 last = j; // QSort(first, j);
793 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
795 // Compare the two tracks.
797 return b->Compare(a);
800 #ifdef INCLUDE_TPC_HOUGH
803 AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
804 AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
805 if(tra->GetWeight() < trb->GetWeight()) return 1;
806 if(tra->GetWeight() > trb->GetWeight()) return -1;
811 if(a->GetNHits() < b->GetNHits()) return 1;
812 if(a->GetNHits() > b->GetNHits()) return -1;
819 AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
822 if (index<fNTracks) return fTrack[index];