3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTTPCStandardIncludes.h"
8 #include "AliHLTTPCLogging.h"
9 #include "AliHLTTPCTrackArray.h"
10 #ifdef INCLUDE_TPC_HOUGH
11 #include "AliHLTTPCHoughTrack.h"
13 #include "AliHLTTPCModelTrack.h"
14 #include "AliHLTTPCConfMapTrack.h"
15 #include "AliHLTTPCTrackSegmentData.h"
16 #include "AliHLTTPCTransform.h"
17 #include "AliHLTTPCConfMapPoint.h"
19 /** \class AliHLTTPCTrackArray
21 //_____________________________________________________________
22 // AliHLTTPCTrackArray
33 ClassImp(AliHLTTPCTrackArray)
35 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
46 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
56 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
62 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
63 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
64 #ifdef INCLUDE_TPC_HOUGH
65 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
67 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
71 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
77 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
78 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
79 #ifdef INCLUDE_TPC_HOUGH
80 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
82 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
86 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
93 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
96 if(fNTracks<fSize) return fTrack[fNTracks++];
98 return fTrack[fNTracks++];
101 void AliHLTTPCTrackArray::DeleteArray()
104 for(Int_t i=0; i<fSize;i++)
110 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
113 if(newsize<=fSize) return kFALSE; //shrink comes later!!
116 fTrack = new AliHLTTPCTrack*[fSize];
117 fIsPresent = new Bool_t[fSize];
120 for(Int_t i=0;i<fSize;i++){
121 fTrack[i] = new AliHLTTPCTrack();
122 fIsPresent[i] = kTRUE;
126 for(Int_t i=0;i<fSize;i++){
127 fTrack[i] = new AliHLTTPCConfMapTrack();
128 fIsPresent[i] = kTRUE;
131 #ifdef INCLUDE_TPC_HOUGH
133 for(Int_t i=0;i<fSize;i++){
134 fTrack[i] = new AliHLTTPCHoughTrack();
135 fIsPresent[i] = kTRUE;
140 for(Int_t i=0;i<fSize;i++){
141 fTrack[i] = new AliHLTTPCModelTrack();
142 fIsPresent[i] = kTRUE;
150 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
151 Bool_t *pre = new Bool_t[fSize];
152 for(Int_t i=0; i<fSize;i++){
154 pre[i] = fIsPresent[i];
158 fTrack = new AliHLTTPCTrack*[newsize];
159 fIsPresent = new Bool_t[newsize];
160 for(Int_t i=0; i<fSize;i++){
162 fIsPresent[i] = pre[i];
168 for(Int_t i=fSize;i<newsize;i++){
169 fTrack[i] = new AliHLTTPCTrack();
170 fIsPresent[i] = kTRUE;
174 for(Int_t i=fSize;i<newsize;i++){
175 fTrack[i] = new AliHLTTPCConfMapTrack();
176 fIsPresent[i] = kTRUE;
179 #ifdef INCLUDE_TPC_HOUGH
181 for(Int_t i=fSize;i<newsize;i++){
182 fTrack[i] = new AliHLTTPCHoughTrack();
183 fIsPresent[i] = kTRUE;
188 for(Int_t i=fSize;i<newsize;i++){
189 fTrack[i] = new AliHLTTPCModelTrack();
190 fIsPresent[i] = kTRUE;
200 void AliHLTTPCTrackArray::Reset()
205 for(Int_t i=0; i<fSize;i++)
206 fIsPresent[i] = kTRUE;
209 void AliHLTTPCTrackArray::Remove(Int_t track)
212 if(fIsPresent[track]){
213 fIsPresent[track]=kFALSE;
218 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr){
219 //Read tracks from shared memory (or memory)
220 AliHLTTPCTrackSegmentData *trs = tr;
221 for(Int_t i=0; i<ntracks; i++){
222 AliHLTTPCTrack *track = NextTrack();
223 track->SetPt(trs->fPt);
224 track->SetPsi(trs->fPsi);
225 track->SetTgl(trs->fTgl);
226 track->SetPterr(trs->fPterr);
227 track->SetPsierr(trs->fPsierr);
228 track->SetTglerr(trs->fTglerr);
229 track->SetNHits(trs->fNPoints);
230 track->SetCharge(trs->fCharge);
231 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
232 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
233 track->SetHits( trs->fNPoints, trs->fPointIDs );
234 #ifdef INCLUDE_TPC_HOUGH
235 #ifdef ROWHOUGHPARAMS
236 if(GetTrackType()=='h') {
237 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
238 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
240 track->SetMCid(trs->fTrackID);
241 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
242 track->SetSector(trs->fSector);
243 track->SetPID(trs->fPID);
245 #endif // INCLUDE_TPC_HOUGH
246 UChar_t *tmpP = (UChar_t*)trs;
247 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
248 trs = (AliHLTTPCTrackSegmentData*)tmpP;
252 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice)
254 //Read tracks from shared memory (or memory)
255 AliHLTTPCTrackSegmentData *trs = tr;
256 for(Int_t i=0; i<ntracks; i++){
257 AliHLTTPCTrack *track = NextTrack();
258 track->SetPt(trs->fPt);
259 track->SetPterr(trs->fPterr);
262 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
263 track->SetPsi(psi[0]);
264 track->SetTgl(trs->fTgl);
265 track->SetPsierr(trs->fPsierr);
266 track->SetTglerr(trs->fTglerr);
267 track->SetNHits(trs->fNPoints);
268 track->SetCharge(trs->fCharge);
270 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
271 AliHLTTPCTransform::Local2Global(first,slice);
272 track->SetFirstPoint(first[0],first[1],first[2]);
274 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
275 AliHLTTPCTransform::Local2Global(last,slice);
276 track->SetLastPoint(last[0],last[1],last[2]);
277 track->SetHits( trs->fNPoints, trs->fPointIDs );
278 // BEGINN ############################################## MODIFIY JMT
279 track->SetSector(slice);
280 track->CalculateHelix();
281 // END ################################################# MODIFIY JMT
282 #ifdef INCLUDE_TPC_HOUGH
283 #ifdef ROWHOUGHPARAMS
284 if(GetTrackType()=='h') {
285 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
286 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
288 track->SetMCid(trs->fTrackID);
289 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
290 track->SetSector(slice);
291 track->SetPID(trs->fPID);
293 #endif // INCLUDE_TPC_HOUGH
294 UChar_t *tmpP = (UChar_t*)trs;
295 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
296 trs = (AliHLTTPCTrackSegmentData*)tmpP;
300 UInt_t AliHLTTPCTrackArray::GetOutSize()
303 UInt_t count = GetOutCount(); //use only present tracks
305 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
306 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
307 if(track) //use only present tracks
308 tHits += track->GetNHits();
311 //calculate size of track
312 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
315 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
318 ntracks = GetOutCount();
319 return WriteTracks(tr);
322 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
324 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
325 AliHLTTPCTrackSegmentData *tP = tr;
328 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
329 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
330 if(!track) continue; //use only present tracks
331 tP->fX = track->GetFirstPointX();
332 tP->fY = track->GetFirstPointY();
333 tP->fZ = track->GetFirstPointZ();
334 tP->fPt = track->GetPt();
335 tP->fPterr = track->GetPterr();
336 tP->fLastX = track->GetLastPointX();
337 tP->fLastY = track->GetLastPointY();
338 tP->fLastZ = track->GetLastPointZ();
339 tP->fPsi = track->GetPsi();
340 tP->fTgl = track->GetTgl();
341 tP->fPsierr = track->GetPsierr();
342 tP->fTglerr = track->GetTglerr();
343 tP->fCharge = track->GetCharge();
344 tP->fNPoints = track->GetNHits();
345 #ifdef INCLUDE_TPC_HOUGH
346 #ifdef ROWHOUGHPARAMS
347 if(GetTrackType()=='h') {
348 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
349 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
350 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
351 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
352 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
354 tP->fTrackID = track->GetMCid();
355 tP->fRowRange1 = track->GetFirstRow();
356 tP->fRowRange2 = track->GetLastRow();
357 tP->fSector = track->GetSector();
358 tP->fPID = track->GetPID();
360 #endif // INCLUDE_TPC_HOUGH
361 pP = (UInt_t*)track->GetHitNumbers();
362 for (UInt_t j=0;j<tP->fNPoints;j++){
363 tP->fPointIDs[j] = pP[j];
365 Byte_t *tmpP = (Byte_t *)tP;
366 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
367 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
368 tP = (AliHLTTPCTrackSegmentData*)tmpP;
370 // BEGINN ############################################## MODIFIY JMT
371 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
372 track->Rotate(0,kFALSE);
374 // END ################################################# MODIFIY JMT
380 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
382 // use first and last point objects
383 AliHLTTPCTrackSegmentData *tP = tr;
386 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
387 AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
388 if(!track) continue; //use only present tracks
389 AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
390 AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
391 tP->fX = hit->GetX();
392 tP->fY = hit->GetY();
393 tP->fZ = hit->GetZ();
394 tP->fLastX = lastHit->GetX();
395 tP->fLastY = lastHit->GetY();
396 tP->fLastZ = lastHit->GetZ();
398 // tP->fX = track->GetFirstPointX();
399 // tP->fY = track->GetFirstPointY();
400 // tP->fZ = track->GetFirstPointZ();
401 tP->fPt = track->GetPt();
402 tP->fPterr = track->GetPterr();
403 // tP->fLastX = track->GetLastPointX();
404 // tP->fLastY = track->GetLastPointY();
405 // tP->fLastZ = track->GetLastPointZ();
406 tP->fPsi = track->GetPsi();
407 tP->fTgl = track->GetTgl();
408 tP->fPsierr = track->GetPsierr();
409 tP->fTglerr = track->GetTglerr();
410 tP->fCharge = track->GetCharge();
411 #ifdef INCLUDE_TPC_HOUGH
412 #ifdef ROWHOUGHPARAMS
413 tP->fTrackID = track->GetMCid();
414 tP->fRowRange1 = track->GetFirstRow();
415 tP->fRowRange2 = track->GetLastRow();
416 tP->fSector = track->GetSector();
417 tP->fPID = track->GetPID();
419 #endif // INCLUDE_TPC_HOUGH
420 tP->fNPoints = track->GetNHits();
421 pP = (UInt_t*)track->GetHitNumbers();
422 for (UInt_t j=0;j<tP->fNPoints;j++){
423 tP->fPointIDs[j] = pP[j];
425 Byte_t *tmpP = (Byte_t *)tP;
426 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
427 size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
428 tP = (AliHLTTPCTrackSegmentData*)tmpP;
433 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
435 //add track to last position
436 AliHLTTPCTrack *tpt = NextTrack();
441 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
444 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
446 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
447 <<"Bad idea to add tracks of different types"<<ENDLOG;
450 if(fSize < fNTracks+newtrack->GetNPresent())
451 SetSize(fSize+newtrack->GetSize());
452 for(Int_t i =0;i<newtrack->GetNTracks();i++){
453 AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
457 AliHLTTPCTrack *track = NextTrack();
460 track->Rotate(slice); //Rotate track to global coordinates
462 AliHLTTPCTrack *track;
463 #ifdef INCLUDE_TPC_HOUGH
464 if(GetTrackType()=='h')
465 track = (AliHLTTPCHoughTrack*)NextTrack();
474 void AliHLTTPCTrackArray::Compress()
477 if(GetNPresent()==GetNTracks()) return;
478 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
480 Int_t absent=GetNPresent();
481 for(Int_t i=0;i<GetNTracks();i++){
482 if(fIsPresent[i]) tmp[present++] = fTrack[i];
483 else tmp[absent++] = fTrack[i];
485 for(Int_t i=0;i<GetNTracks();i++)
489 for(Int_t i=0; i<GetNTracks();i++){
495 fNTracks = GetNPresent();
499 void AliHLTTPCTrackArray::QSort()
503 QSort(fTrack,0,fNTracks);
506 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
508 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
509 // Uses TrackCompare() to compare objects.
512 static AliHLTTPCTrack *tmp;
513 static int i; // "static" to save stack space
516 while (last - first > 1) {
520 while (++i < last && TrackCompare(a[i], a[first]) < 0)
522 while (--j > first && TrackCompare(a[j], a[first]) > 0)
538 if (j - first < last - (j + 1)) {
540 first = j + 1; // QSort(j + 1, last);
542 QSort(a, j + 1, last);
543 last = j; // QSort(first, j);
548 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
550 // Compare the two tracks.
552 return b->Compare(a);
555 #ifdef INCLUDE_TPC_HOUGH
558 AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
559 AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
560 if(tra->GetWeight() < trb->GetWeight()) return 1;
561 if(tra->GetWeight() > trb->GetWeight()) return -1;
566 if(a->GetNHits() < b->GetNHits()) return 1;
567 if(a->GetNHits() > b->GetNHits()) return -1;