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"
45 ClassImp(AliHLTTPCTrackArray)
47 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
61 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const AliHLTTPCTrackArray&)
74 AliHLTTPCTrackArray& AliHLTTPCTrackArray::operator=(const AliHLTTPCTrackArray&)
85 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
98 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
108 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
109 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
110 #ifdef INCLUDE_TPC_HOUGH
111 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
113 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
117 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
127 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
128 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
129 #ifdef INCLUDE_TPC_HOUGH
130 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
132 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
136 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
143 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
145 //next track in array
146 if(fNTracks<fSize) return fTrack[fNTracks++];
148 return fTrack[fNTracks++];
151 void AliHLTTPCTrackArray::DeleteArray()
154 for(Int_t i=0; i<fSize;i++)
160 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
163 if(newsize<=fSize) return kFALSE; //shrink comes later!!
166 fTrack = new AliHLTTPCTrack*[fSize];
167 fIsPresent = new Bool_t[fSize];
170 for(Int_t i=0;i<fSize;i++){
171 fTrack[i] = new AliHLTTPCTrack();
172 fIsPresent[i] = kTRUE;
176 for(Int_t i=0;i<fSize;i++){
177 fTrack[i] = new AliHLTTPCConfMapTrack();
178 fIsPresent[i] = kTRUE;
181 #ifdef INCLUDE_TPC_HOUGH
183 for(Int_t i=0;i<fSize;i++){
184 fTrack[i] = new AliHLTTPCHoughTrack();
185 fIsPresent[i] = kTRUE;
190 for(Int_t i=0;i<fSize;i++){
191 fTrack[i] = new AliHLTTPCModelTrack();
192 fIsPresent[i] = kTRUE;
200 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
201 Bool_t *pre = new Bool_t[fSize];
202 for(Int_t i=0; i<fSize;i++){
204 pre[i] = fIsPresent[i];
208 fTrack = new AliHLTTPCTrack*[newsize];
209 fIsPresent = new Bool_t[newsize];
210 for(Int_t i=0; i<fSize;i++){
212 fIsPresent[i] = pre[i];
218 for(Int_t i=fSize;i<newsize;i++){
219 fTrack[i] = new AliHLTTPCTrack();
220 fIsPresent[i] = kTRUE;
224 for(Int_t i=fSize;i<newsize;i++){
225 fTrack[i] = new AliHLTTPCConfMapTrack();
226 fIsPresent[i] = kTRUE;
229 #ifdef INCLUDE_TPC_HOUGH
231 for(Int_t i=fSize;i<newsize;i++){
232 fTrack[i] = new AliHLTTPCHoughTrack();
233 fIsPresent[i] = kTRUE;
238 for(Int_t i=fSize;i<newsize;i++){
239 fTrack[i] = new AliHLTTPCModelTrack();
240 fIsPresent[i] = kTRUE;
250 void AliHLTTPCTrackArray::Reset()
255 for(Int_t i=0; i<fSize;i++)
256 fIsPresent[i] = kTRUE;
259 void AliHLTTPCTrackArray::Remove(Int_t track)
262 if(fIsPresent[track]){
263 fIsPresent[track]=kFALSE;
268 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice, Int_t bTransform)
270 //Read tracks from shared memory (or memory)
271 AliHLTTPCTrackSegmentData *trs = tr;
272 for(Int_t i=0; i<ntracks; i++){
273 AliHLTTPCTrack *track = NextTrack();
274 track->SetPt(trs->fPt);
275 track->SetPterr(trs->fPterr);
278 if (slice>=0 && bTransform!=0) {
279 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
281 //cout << "psi " << psi[0] << endl;
282 track->SetPsi(psi[0]);
283 track->SetTgl(trs->fTgl);
284 track->SetPsierr(trs->fPsierr);
285 track->SetTglerr(trs->fTglerr);
286 track->SetNHits(trs->fNPoints);
287 track->SetCharge(trs->fCharge);
289 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
290 if (slice>=0 && bTransform!=0) {
291 AliHLTTPCTransform::Local2Global(first,slice);
293 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
294 track->SetFirstPoint(first[0],first[1],first[2]);
296 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
297 if (slice>=0 && bTransform!=0) {
298 AliHLTTPCTransform::Local2Global(last,slice);
300 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
301 track->SetLastPoint(last[0],last[1],last[2]);
302 track->SetHits( trs->fNPoints, trs->fPointIDs );
304 //if (slice>=0 && bTransform!=0) {
305 // Matthias Feb07: as everything is now in global coordinates, sector should
306 // be set to 0. But as the display does a check on the sector, we have to set
307 // it to the slice no. I suspect, that the transformation is done twice.
308 //track->SetSector(0);
309 track->SetSector(slice);
311 // the parameters are in local coordinates, set the sector no
312 //#ifndef INCLUDE_TPC_HOUGH
313 //if (slice<0) track->SetSector(0);
314 //else track->SetSector(slice);
316 // Matthias Feb 2007: this is some kind of legacy ...
317 // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
318 // and this line was below in the corresponding block. As the slice
319 // parameter is very useful but not available if the define is off
320 // we distinguish the two cases here. Should be cleaned up.
321 // Matthias April 2007: update, try to integrate Cvetans Hough tracker
322 // so we need the support for the AliHLTTPCHoughTrack. I dont have the
323 // full control of this code (should we use slice or trs->fSector?)
324 // But the FillTracks method is never called from the hough code, so we
326 if (GetTrackType()=='h') {
327 AliErrorClassStream() << "FillTracks was never used with AliHLTTPCHoughTrack:"
328 << " CHECK THIS CODE!!!" << endl;
330 //track->SetSector(trs->fSector);
331 //#endif // INCLUDE_TPC_HOUGH
334 // this is currently a quick hack for straight lines of the first version
335 // of the CA tracker.
336 // we have to think about a more general way of treating straight and curved
338 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
339 track->SetPhi0(atan2(first[1],first[0]));
340 track->SetKappa(1.0);
341 track->SetRadius(999999.0);
343 // Matthias Feb07: just tried to take this away, but this causes the tracks
344 // in the display not to be drawn. But we still have to tink about this.
345 track->CalculateHelix();
348 #ifdef INCLUDE_TPC_HOUGH
349 #ifdef ROWHOUGHPARAMS
350 if(GetTrackType()=='h') {
351 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
352 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
354 track->SetMCid(trs->fTrackID);
355 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
356 track->SetPID(trs->fPID);
358 #endif // INCLUDE_TPC_HOUGH
359 UChar_t *tmpP = (UChar_t*)trs;
360 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
361 trs = (AliHLTTPCTrackSegmentData*)tmpP;
365 UInt_t AliHLTTPCTrackArray::GetOutSize()
368 UInt_t count = GetOutCount(); //use only present tracks
370 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
371 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
372 if(track) //use only present tracks
373 tHits += track->GetNHits();
376 //calculate size of track
377 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
380 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
383 ntracks = GetOutCount();
384 return WriteTracks(tr);
387 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
389 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
390 AliHLTTPCTrackSegmentData *tP = tr;
393 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
394 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
395 if(!track) continue; //use only present tracks
396 tP->fX = track->GetFirstPointX();
397 tP->fY = track->GetFirstPointY();
398 tP->fZ = track->GetFirstPointZ();
399 tP->fPt = track->GetPt();
400 tP->fPterr = track->GetPterr();
401 tP->fLastX = track->GetLastPointX();
402 tP->fLastY = track->GetLastPointY();
403 tP->fLastZ = track->GetLastPointZ();
404 tP->fPsi = track->GetPsi();
405 tP->fTgl = track->GetTgl();
406 tP->fPsierr = track->GetPsierr();
407 tP->fTglerr = track->GetTglerr();
408 tP->fCharge = track->GetCharge();
409 tP->fNPoints = track->GetNHits();
410 #ifdef INCLUDE_TPC_HOUGH
411 #ifdef ROWHOUGHPARAMS
412 if(GetTrackType()=='h') {
413 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
414 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
415 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
416 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
417 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
419 tP->fTrackID = track->GetMCid();
420 tP->fRowRange1 = track->GetFirstRow();
421 tP->fRowRange2 = track->GetLastRow();
422 tP->fSector = track->GetSector();
423 tP->fPID = track->GetPID();
425 #endif // INCLUDE_TPC_HOUGH
426 pP = (UInt_t*)track->GetHitNumbers();
427 for (UInt_t j=0;j<tP->fNPoints;j++){
428 tP->fPointIDs[j] = pP[j];
430 Byte_t *tmpP = (Byte_t *)tP;
431 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
432 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
433 tP = (AliHLTTPCTrackSegmentData*)tmpP;
435 // LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
436 // track->Rotate(0,kFALSE);
443 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
445 // use first and last point objects
446 AliHLTTPCTrackSegmentData *tP = tr;
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();
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();
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];
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;
496 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
498 //add track to last position
499 AliHLTTPCTrack *tpt = NextTrack();
504 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
507 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
509 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
510 <<"Bad idea to add tracks of different types"<<ENDLOG;
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);
520 AliHLTTPCTrack *track = NextTrack();
523 track->Rotate(slice); //Rotate track to global coordinates
525 AliHLTTPCTrack *track;
526 #ifdef INCLUDE_TPC_HOUGH
527 if(GetTrackType()=='h')
528 track = (AliHLTTPCHoughTrack*)NextTrack();
537 void AliHLTTPCTrackArray::Compress()
540 if(GetNPresent()==GetNTracks()) return;
541 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
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];
548 for(Int_t i=0;i<GetNTracks();i++)
552 for(Int_t i=0; i<GetNTracks();i++){
558 fNTracks = GetNPresent();
562 void AliHLTTPCTrackArray::QSort()
566 QSort(fTrack,0,fNTracks);
569 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
571 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
572 // Uses TrackCompare() to compare objects.
575 static AliHLTTPCTrack *tmp;
576 static int i; // "static" to save stack space
579 while (last - first > 1) {
583 while (++i < last && TrackCompare(a[i], a[first]) < 0)
585 while (--j > first && TrackCompare(a[j], a[first]) > 0)
601 if (j - first < last - (j + 1)) {
603 first = j + 1; // QSort(j + 1, last);
605 QSort(a, j + 1, last);
606 last = j; // QSort(first, j);
611 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
613 // Compare the two tracks.
615 return b->Compare(a);
618 #ifdef INCLUDE_TPC_HOUGH
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;
629 if(a->GetNHits() < b->GetNHits()) return 1;
630 if(a->GetNHits() > b->GetNHits()) return -1;
637 AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
640 if (index<fNTracks) return fTrack[index];