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(Int_t ntrack)
74 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const char* tracktype,Int_t ntrack)
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';
89 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
93 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const char* tracktype)
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';
108 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
112 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
119 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
121 //next track in array
122 if(fNTracks<fSize) return fTrack[fNTracks++];
124 return fTrack[fNTracks++];
127 void AliHLTTPCTrackArray::DeleteArray()
130 for(Int_t i=0; i<fSize;i++)
137 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
140 if(newsize<=fSize) return kFALSE; //shrink comes later!!
143 fTrack = new AliHLTTPCTrack*[fSize];
144 fIsPresent = new Bool_t[fSize];
147 for(Int_t i=0;i<fSize;i++){
148 fTrack[i] = new AliHLTTPCTrack();
149 fIsPresent[i] = kTRUE;
153 for(Int_t i=0;i<fSize;i++){
154 fTrack[i] = new AliHLTTPCConfMapTrack();
155 fIsPresent[i] = kTRUE;
158 #ifdef INCLUDE_TPC_HOUGH
160 for(Int_t i=0;i<fSize;i++){
161 fTrack[i] = new AliHLTTPCHoughTrack();
162 fIsPresent[i] = kTRUE;
167 for(Int_t i=0;i<fSize;i++){
168 fTrack[i] = new AliHLTTPCModelTrack();
169 fIsPresent[i] = kTRUE;
177 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
178 Bool_t *pre = new Bool_t[fSize];
179 for(Int_t i=0; i<fSize;i++){
181 pre[i] = fIsPresent[i];
185 fTrack = new AliHLTTPCTrack*[newsize];
186 fIsPresent = new Bool_t[newsize];
187 for(Int_t i=0; i<fSize;i++){
189 fIsPresent[i] = pre[i];
195 for(Int_t i=fSize;i<newsize;i++){
196 fTrack[i] = new AliHLTTPCTrack();
197 fIsPresent[i] = kTRUE;
201 for(Int_t i=fSize;i<newsize;i++){
202 fTrack[i] = new AliHLTTPCConfMapTrack();
203 fIsPresent[i] = kTRUE;
206 #ifdef INCLUDE_TPC_HOUGH
208 for(Int_t i=fSize;i<newsize;i++){
209 fTrack[i] = new AliHLTTPCHoughTrack();
210 fIsPresent[i] = kTRUE;
215 for(Int_t i=fSize;i<newsize;i++){
216 fTrack[i] = new AliHLTTPCModelTrack();
217 fIsPresent[i] = kTRUE;
227 void AliHLTTPCTrackArray::Reset()
232 for(Int_t i=0; i<fSize;i++)
233 fIsPresent[i] = kTRUE;
236 void AliHLTTPCTrackArray::Remove(Int_t track)
239 if(fIsPresent[track]){
240 fIsPresent[track]=kFALSE;
245 int AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr, Int_t slice, Int_t bTransform)
247 //Read tracks from shared memory (or memory)
248 return FillTracksChecked(tr, ntracks, 0, slice, bTransform);
251 int AliHLTTPCTrackArray::FillTracksChecked(AliHLTTPCTrackSegmentData* tr, Int_t ntracks, unsigned int sizeInByte, Int_t slice, Int_t bTransform)
253 //Read tracks from shared memory (or memory)
255 AliHLTTPCTrackSegmentData *trs = tr;
256 for(Int_t i=0; i<ntracks; i++){
258 (((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentData)>((AliHLTUInt8_t*)tr)+sizeInByte ||
259 ((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t)>((AliHLTUInt8_t*)tr)+sizeInByte)) {
263 AliHLTTPCTrack *track = NextTrack();
264 track->SetPt(trs->fPt);
265 track->SetPterr(trs->fPterr);
268 if (slice>=0 && bTransform!=0) {
269 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
271 //cout << "psi " << psi[0] << endl;
272 track->SetPsi(psi[0]);
273 track->SetTgl(trs->fTgl);
274 track->SetPsierr(trs->fPsierr);
275 track->SetTglerr(trs->fTglerr);
276 track->SetY0err(trs->fY0err);
277 track->SetZ0err(trs->fZ0err);
278 track->SetNHits(trs->fNPoints);
279 track->SetCharge(trs->fCharge);
281 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
282 if (slice>=0 && bTransform!=0) {
283 AliHLTTPCTransform::Local2Global(first,slice);
285 //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
286 track->SetFirstPoint(first[0],first[1],first[2]);
288 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
289 if (slice>=0 && bTransform!=0) {
290 AliHLTTPCTransform::Local2Global(last,slice);
292 //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
293 track->SetLastPoint(last[0],last[1],last[2]);
294 track->SetHits( trs->fNPoints, trs->fPointIDs );
296 //if (slice>=0 && bTransform!=0) {
297 // Matthias Feb07: as everything is now in global coordinates, sector should
298 // be set to 0. But as the display does a check on the sector, we have to set
299 // it to the slice no. I suspect, that the transformation is done twice.
300 //track->SetSector(0);
301 track->SetSector(slice);
303 // the parameters are in local coordinates, set the sector no
304 //#ifndef INCLUDE_TPC_HOUGH
305 //if (slice<0) track->SetSector(0);
306 //else track->SetSector(slice);
308 // Matthias Feb 2007: this is some kind of legacy ...
309 // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
310 // and this line was below in the corresponding block. As the slice
311 // parameter is very useful but not available if the define is off
312 // we distinguish the two cases here. Should be cleaned up.
313 // Matthias April 2007: update, try to integrate Cvetans Hough tracker
314 // so we need the support for the AliHLTTPCHoughTrack. I dont have the
315 // full control of this code (should we use slice or trs->fSector?)
316 // But the FillTracks method is never called from the hough code, so we
318 if (GetTrackType()=='h') {
319 AliErrorClassStream() << "FillTracks was never used with AliHLTTPCHoughTrack:"
320 << " CHECK THIS CODE!!!" << endl;
322 //track->SetSector(trs->fSector);
323 //#endif // INCLUDE_TPC_HOUGH
326 // this is currently a quick hack for straight lines of the first version
327 // of the CA tracker.
328 // we have to think about a more general way of treating straight and curved
330 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
331 track->SetPhi0(atan2(first[1],first[0]));
332 track->SetKappa(1.0);
333 track->SetRadius(999999.0);
335 // Matthias Feb07: just tried to take this away, but this causes the tracks
336 // in the display not to be drawn. But we still have to tink about this.
337 track->CalculateHelix();
340 #ifdef INCLUDE_TPC_HOUGH
341 #ifdef ROWHOUGHPARAMS
342 if(GetTrackType()=='h') {
343 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
344 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
346 track->SetMCid(trs->fTrackID);
347 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
348 track->SetPID(trs->fPID);
350 #endif // INCLUDE_TPC_HOUGH
351 track->CheckConsistency();
353 UChar_t *tmpP = (UChar_t*)trs;
354 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
355 trs = (AliHLTTPCTrackSegmentData*)tmpP;
358 if (iResult==-EDOM) {
359 // try to recover the version 1 struct
361 if ((iResult=FillTracksVersion1((AliHLTTPCTrackSegmentDataV1*)tr, ntracks, sizeInByte, slice, bTransform))>=0) {
362 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCTrackArray::FillTracks","") << "version 1 track array recoverd (deprecated since r27415)" << ENDLOG;
365 if (iResult==-EDOM) {
367 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::FillTracks","") << "corrupted input data array" << ENDLOG;
373 int AliHLTTPCTrackArray::FillTracksVersion1(AliHLTTPCTrackSegmentDataV1* tr, Int_t ntracks, unsigned int sizeInByte, Int_t slice, Int_t bTransform)
375 //Read tracks from shared memory (or memory)
377 AliHLTTPCTrackSegmentDataV1 *trs = tr;
378 for(Int_t i=0; i<ntracks; i++){
380 (((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentDataV1)>((AliHLTUInt8_t*)tr)+sizeInByte ||
381 ((AliHLTUInt8_t*)trs)+sizeof(AliHLTTPCTrackSegmentDataV1)+trs->fNPoints*sizeof(UInt_t)>((AliHLTUInt8_t*)tr)+sizeInByte)) {
385 AliHLTTPCTrack *track = NextTrack();
386 track->SetPt(trs->fPt);
387 track->SetPterr(trs->fPterr);
390 if (slice>=0 && bTransform!=0) {
391 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
393 track->SetPsi(psi[0]);
394 track->SetTgl(trs->fTgl);
395 track->SetPsierr(trs->fPsierr);
396 track->SetTglerr(trs->fTglerr);
397 track->SetNHits(trs->fNPoints);
398 track->SetCharge(trs->fCharge);
400 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
401 if (slice>=0 && bTransform!=0) {
402 AliHLTTPCTransform::Local2Global(first,slice);
404 track->SetFirstPoint(first[0],first[1],first[2]);
406 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
407 if (slice>=0 && bTransform!=0) {
408 AliHLTTPCTransform::Local2Global(last,slice);
410 track->SetLastPoint(last[0],last[1],last[2]);
411 track->SetHits( trs->fNPoints, trs->fPointIDs );
413 track->SetSector(slice);
414 if ( trs->fPt == -9876.0 || trs->fPt == -1.0) {
415 track->SetPhi0(atan2(first[1],first[0]));
416 track->SetKappa(1.0);
417 track->SetRadius(999999.0);
419 track->CalculateHelix();
422 UChar_t *tmpP = (UChar_t*)trs;
423 tmpP += sizeof(AliHLTTPCTrackSegmentDataV1)+trs->fNPoints*sizeof(UInt_t);
424 trs = (AliHLTTPCTrackSegmentDataV1*)tmpP;
429 UInt_t AliHLTTPCTrackArray::GetOutSize()
432 UInt_t count = GetOutCount(); //use only present tracks
434 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
435 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
436 if(track) //use only present tracks
437 tHits += track->GetNHits();
440 //calculate size of track
441 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
444 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
447 ntracks = GetOutCount();
448 return WriteTracks(tr);
451 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
453 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
454 AliHLTTPCTrackSegmentData *tP = tr;
457 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
458 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
459 if(!track) continue; //use only present tracks
460 tP->fX = track->GetFirstPointX();
461 tP->fY = track->GetFirstPointY();
462 tP->fZ = track->GetFirstPointZ();
463 tP->fPt = track->GetPt();
464 tP->fPterr = track->GetPterr();
465 tP->fLastX = track->GetLastPointX();
466 tP->fLastY = track->GetLastPointY();
467 tP->fLastZ = track->GetLastPointZ();
468 tP->fPsi = track->GetPsi();
469 tP->fTgl = track->GetTgl();
470 tP->fPsierr = track->GetPsierr();
471 tP->fTglerr = track->GetTglerr();
472 tP->fY0err = track->GetY0err();
473 tP->fZ0err = track->GetZ0err();
474 tP->fCharge = track->GetCharge();
475 tP->fNPoints = track->GetNHits();
476 #ifdef INCLUDE_TPC_HOUGH
477 #ifdef ROWHOUGHPARAMS
478 if(GetTrackType()=='h') {
479 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
480 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
481 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
482 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
483 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
485 tP->fTrackID = track->GetMCid();
486 tP->fRowRange1 = track->GetFirstRow();
487 tP->fRowRange2 = track->GetLastRow();
488 tP->fSector = track->GetSector();
489 tP->fPID = track->GetPID();
491 #endif // INCLUDE_TPC_HOUGH
492 pP = (UInt_t*)track->GetHitNumbers();
493 for (UInt_t j=0;j<tP->fNPoints;j++){
494 tP->fPointIDs[j] = pP[j];
496 Byte_t *tmpP = (Byte_t *)tP;
497 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
498 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
499 tP = (AliHLTTPCTrackSegmentData*)tmpP;
501 // LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
502 // track->Rotate(0,kFALSE);
509 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
511 // use first and last point objects
512 AliHLTTPCTrackSegmentData *tP = tr;
515 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
516 AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
517 if(!track) continue; //use only present tracks
518 AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
519 AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
520 tP->fX = hit->GetX();
521 tP->fY = hit->GetY();
522 tP->fZ = hit->GetZ();
523 tP->fLastX = lastHit->GetX();
524 tP->fLastY = lastHit->GetY();
525 tP->fLastZ = lastHit->GetZ();
527 // tP->fX = track->GetFirstPointX();
528 // tP->fY = track->GetFirstPointY();
529 // tP->fZ = track->GetFirstPointZ();
530 tP->fPt = track->GetPt();
531 tP->fPterr = track->GetPterr();
532 // tP->fLastX = track->GetLastPointX();
533 // tP->fLastY = track->GetLastPointY();
534 // tP->fLastZ = track->GetLastPointZ();
535 tP->fPsi = track->GetPsi();
536 tP->fTgl = track->GetTgl();
537 tP->fPsierr = track->GetPsierr();
538 tP->fTglerr = track->GetTglerr();
539 tP->fY0err = track->GetY0err();
540 tP->fZ0err = track->GetZ0err();
541 tP->fCharge = track->GetCharge();
542 #ifdef INCLUDE_TPC_HOUGH
543 #ifdef ROWHOUGHPARAMS
544 tP->fTrackID = track->GetMCid();
545 tP->fRowRange1 = track->GetFirstRow();
546 tP->fRowRange2 = track->GetLastRow();
547 tP->fSector = track->GetSector();
548 tP->fPID = track->GetPID();
550 #endif // INCLUDE_TPC_HOUGH
551 tP->fNPoints = track->GetNHits();
552 pP = (UInt_t*)track->GetHitNumbers();
553 for (UInt_t j=0;j<tP->fNPoints;j++){
554 tP->fPointIDs[j] = pP[j];
556 Byte_t *tmpP = (Byte_t *)tP;
557 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
558 size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
559 tP = (AliHLTTPCTrackSegmentData*)tmpP;
564 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
566 //add track to last position
567 AliHLTTPCTrack *tpt = NextTrack();
572 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
575 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
577 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
578 <<"Bad idea to add tracks of different types"<<ENDLOG;
581 if(fSize < fNTracks+newtrack->GetNPresent())
582 SetSize(fSize+newtrack->GetSize());
583 for(Int_t i =0;i<newtrack->GetNTracks();i++){
584 AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
588 AliHLTTPCTrack *track = NextTrack();
591 track->Rotate(slice); //Rotate track to global coordinates
593 AliHLTTPCTrack *track;
594 #ifdef INCLUDE_TPC_HOUGH
595 if(GetTrackType()=='h')
596 track = (AliHLTTPCHoughTrack*)NextTrack();
605 void AliHLTTPCTrackArray::Compress()
608 if(GetNPresent()==GetNTracks()) return;
609 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
611 Int_t absent=GetNPresent();
612 for(Int_t i=0;i<GetNTracks();i++){
613 if(fIsPresent[i]) tmp[present++] = fTrack[i];
614 else tmp[absent++] = fTrack[i];
616 for(Int_t i=0;i<GetNTracks();i++)
620 for(Int_t i=0; i<GetNTracks();i++){
626 fNTracks = GetNPresent();
630 void AliHLTTPCTrackArray::QSort()
634 QSort(fTrack,0,fNTracks);
637 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
639 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
640 // Uses TrackCompare() to compare objects.
643 static AliHLTTPCTrack *tmp;
644 static int i; // "static" to save stack space
647 while (last - first > 1) {
651 while (++i < last && TrackCompare(a[i], a[first]) < 0)
653 while (--j > first && TrackCompare(a[j], a[first]) > 0)
669 if (j - first < last - (j + 1)) {
671 first = j + 1; // QSort(j + 1, last);
673 QSort(a, j + 1, last);
674 last = j; // QSort(first, j);
679 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
681 // Compare the two tracks.
683 return b->Compare(a);
686 #ifdef INCLUDE_TPC_HOUGH
689 AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
690 AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
691 if(tra->GetWeight() < trb->GetWeight()) return 1;
692 if(tra->GetWeight() > trb->GetWeight()) return -1;
697 if(a->GetNHits() < b->GetNHits()) return 1;
698 if(a->GetNHits() > b->GetNHits()) return -1;
705 AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
708 if (index<fNTracks) return fTrack[index];