3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTStandardIncludes.h"
8 #include "AliHLTLogging.h"
9 #include "AliHLTTrackArray.h"
10 #include "AliHLTHoughTrack.h"
11 #include "AliHLTModelTrack.h"
12 #include "AliHLTConfMapTrack.h"
13 #include "AliHLTTrackSegmentData.h"
14 #include "AliHLTTransform.h"
15 #include "AliHLTConfMapPoint.h"
17 /** \class AliHLTTrackArray
19 //_____________________________________________________________
31 ClassImp(AliHLTTrackArray)
33 AliHLTTrackArray::AliHLTTrackArray()
44 AliHLTTrackArray::AliHLTTrackArray(Int_t ntrack)
54 AliHLTTrackArray::AliHLTTrackArray(char* tracktype,Int_t ntrack)
60 if(strcmp(tracktype,"AliHLTTrack")==0) fTrackType='t';
61 if(strcmp(tracktype,"AliHLTConfMapTrack")==0) fTrackType='c';
62 if(strcmp(tracktype,"AliHLTHoughTrack")==0) fTrackType='h';
63 if(strcmp(tracktype,"AliHLTModelTrack")==0) fTrackType='m';
67 AliHLTTrackArray::AliHLTTrackArray(char* tracktype)
73 if(strcmp(tracktype,"AliHLTTrack")==0) fTrackType='t';
74 if(strcmp(tracktype,"AliHLTConfMapTrack")==0) fTrackType='c';
75 if(strcmp(tracktype,"AliHLTHoughTrack")==0) fTrackType='h';
76 if(strcmp(tracktype,"AliHLTModelTrack")==0) fTrackType='m';
80 AliHLTTrackArray::~AliHLTTrackArray()
87 AliHLTTrack *AliHLTTrackArray::NextTrack()
90 if(fNTracks<fSize) return fTrack[fNTracks++];
92 return fTrack[fNTracks++];
95 void AliHLTTrackArray::DeleteArray()
98 for(Int_t i=0; i<fSize;i++)
104 Bool_t AliHLTTrackArray::SetSize(Int_t newsize)
107 if(newsize<=fSize) return kFALSE; //shrink comes later!!
110 fTrack = new AliHLTTrack*[fSize];
111 fIsPresent = new Bool_t[fSize];
114 for(Int_t i=0;i<fSize;i++){
115 fTrack[i] = new AliHLTTrack();
116 fIsPresent[i] = kTRUE;
120 for(Int_t i=0;i<fSize;i++){
121 fTrack[i] = new AliHLTConfMapTrack();
122 fIsPresent[i] = kTRUE;
126 for(Int_t i=0;i<fSize;i++){
127 fTrack[i] = new AliHLTHoughTrack();
128 fIsPresent[i] = kTRUE;
132 for(Int_t i=0;i<fSize;i++){
133 fTrack[i] = new AliHLTModelTrack();
134 fIsPresent[i] = kTRUE;
142 AliHLTTrack **tmp = new AliHLTTrack*[fSize];
143 Bool_t *pre = new Bool_t[fSize];
144 for(Int_t i=0; i<fSize;i++){
146 pre[i] = fIsPresent[i];
150 fTrack = new AliHLTTrack*[newsize];
151 fIsPresent = new Bool_t[newsize];
152 for(Int_t i=0; i<fSize;i++){
154 fIsPresent[i] = pre[i];
160 for(Int_t i=fSize;i<newsize;i++){
161 fTrack[i] = new AliHLTTrack();
162 fIsPresent[i] = kTRUE;
166 for(Int_t i=fSize;i<newsize;i++){
167 fTrack[i] = new AliHLTConfMapTrack();
168 fIsPresent[i] = kTRUE;
172 for(Int_t i=fSize;i<newsize;i++){
173 fTrack[i] = new AliHLTHoughTrack();
174 fIsPresent[i] = kTRUE;
178 for(Int_t i=fSize;i<newsize;i++){
179 fTrack[i] = new AliHLTModelTrack();
180 fIsPresent[i] = kTRUE;
190 void AliHLTTrackArray::Reset()
195 for(Int_t i=0; i<fSize;i++)
196 fIsPresent[i] = kTRUE;
199 void AliHLTTrackArray::Remove(Int_t track)
202 if(fIsPresent[track]){
203 fIsPresent[track]=kFALSE;
208 void AliHLTTrackArray::FillTracks(Int_t ntracks, AliHLTTrackSegmentData* tr){
209 //Read tracks from shared memory (or memory)
210 AliHLTTrackSegmentData *trs = tr;
211 for(Int_t i=0; i<ntracks; i++){
212 AliHLTTrack *track = NextTrack();
213 track->SetPt(trs->fPt);
214 track->SetPsi(trs->fPsi);
215 track->SetTgl(trs->fTgl);
216 track->SetPterr(trs->fPterr);
217 track->SetPsierr(trs->fPsierr);
218 track->SetTglerr(trs->fTglerr);
219 track->SetNHits(trs->fNPoints);
220 track->SetCharge(trs->fCharge);
221 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
222 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
223 track->SetHits( trs->fNPoints, trs->fPointIDs );
224 #ifdef ROWHOUGHPARAMS
225 if(GetTrackType()=='h') {
226 ((AliHLTHoughTrack *)track)->SetWeight(trs->fWeight);
227 ((AliHLTHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
229 track->SetMCid(trs->fTrackID);
230 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
231 track->SetSector(trs->fSector);
232 track->SetPID(trs->fPID);
234 UChar_t *tmpP = (UChar_t*)trs;
235 tmpP += sizeof(AliHLTTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
236 trs = (AliHLTTrackSegmentData*)tmpP;
240 void AliHLTTrackArray::FillTracks(Int_t ntracks, AliHLTTrackSegmentData* tr,Int_t slice)
242 //Read tracks from shared memory (or memory)
243 AliHLTTrackSegmentData *trs = tr;
244 for(Int_t i=0; i<ntracks; i++){
245 AliHLTTrack *track = NextTrack();
246 track->SetPt(trs->fPt);
247 track->SetPterr(trs->fPterr);
250 AliHLTTransform::Local2GlobalAngle(psi,slice);
251 track->SetPsi(psi[0]);
252 track->SetTgl(trs->fTgl);
253 track->SetPsierr(trs->fPsierr);
254 track->SetTglerr(trs->fTglerr);
255 track->SetNHits(trs->fNPoints);
256 track->SetCharge(trs->fCharge);
258 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
259 AliHLTTransform::Local2Global(first,slice);
260 track->SetFirstPoint(first[0],first[1],first[2]);
262 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
263 AliHLTTransform::Local2Global(last,slice);
264 track->SetLastPoint(last[0],last[1],last[2]);
265 track->SetHits( trs->fNPoints, trs->fPointIDs );
266 #ifdef ROWHOUGHPARAMS
267 if(GetTrackType()=='h') {
268 ((AliHLTHoughTrack *)track)->SetWeight(trs->fWeight);
269 ((AliHLTHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
271 track->SetMCid(trs->fTrackID);
272 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
273 track->SetSector(slice);
274 track->SetPID(trs->fPID);
276 UChar_t *tmpP = (UChar_t*)trs;
277 tmpP += sizeof(AliHLTTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
278 trs = (AliHLTTrackSegmentData*)tmpP;
282 UInt_t AliHLTTrackArray::GetOutSize()
285 UInt_t count = GetOutCount(); //use only present tracks
287 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
288 AliHLTTrack *track = GetCheckedTrack(i); //use only present tracks
289 if(track) //use only present tracks
290 tHits += track->GetNHits();
293 //calculate size of track
294 return count*sizeof(AliHLTTrackSegmentData)+sizeof(UInt_t)*tHits;
297 UInt_t AliHLTTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTrackSegmentData* tr)
300 ntracks = GetOutCount();
301 return WriteTracks(tr);
304 UInt_t AliHLTTrackArray::WriteTracks(AliHLTTrackSegmentData* tr)
306 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
307 AliHLTTrackSegmentData *tP = tr;
310 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
311 AliHLTTrack *track = GetCheckedTrack(i); //use only present tracks
312 if(!track) continue; //use only present tracks
313 tP->fX = track->GetFirstPointX();
314 tP->fY = track->GetFirstPointY();
315 tP->fZ = track->GetFirstPointZ();
316 tP->fPt = track->GetPt();
317 tP->fPterr = track->GetPterr();
318 tP->fLastX = track->GetLastPointX();
319 tP->fLastY = track->GetLastPointY();
320 tP->fLastZ = track->GetLastPointZ();
321 tP->fPsi = track->GetPsi();
322 tP->fTgl = track->GetTgl();
323 tP->fPsierr = track->GetPsierr();
324 tP->fTglerr = track->GetTglerr();
325 tP->fCharge = track->GetCharge();
326 tP->fNPoints = track->GetNHits();
327 #ifdef ROWHOUGHPARAMS
328 if(GetTrackType()=='h') {
329 tP->fWeight = ((AliHLTHoughTrack *)track)->GetWeight();
330 tP->fBinX = ((AliHLTHoughTrack *)track)->GetBinX();
331 tP->fBinY = ((AliHLTHoughTrack *)track)->GetBinY();
332 tP->fBinXSize = ((AliHLTHoughTrack *)track)->GetSizeX();
333 tP->fBinYSize = ((AliHLTHoughTrack *)track)->GetSizeY();
335 tP->fTrackID = track->GetMCid();
336 tP->fRowRange1 = track->GetFirstRow();
337 tP->fRowRange2 = track->GetLastRow();
338 tP->fSector = track->GetSector();
339 tP->fPID = track->GetPID();
341 pP = (UInt_t*)track->GetHitNumbers();
342 for (UInt_t j=0;j<tP->fNPoints;j++){
343 tP->fPointIDs[j] = pP[j];
345 Byte_t *tmpP = (Byte_t *)tP;
346 tmpP += sizeof(AliHLTTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
347 size += sizeof(AliHLTTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
348 tP = (AliHLTTrackSegmentData*)tmpP;
353 UInt_t AliHLTTrackArray::WriteConfMapTracks(AliHLTTrackSegmentData* tr)
355 // use first and last point objects
356 AliHLTTrackSegmentData *tP = tr;
359 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
360 AliHLTConfMapTrack *track =(AliHLTConfMapTrack *) GetCheckedTrack(i); //use only present tracks
361 if(!track) continue; //use only present tracks
362 AliHLTConfMapPoint *hit = (AliHLTConfMapPoint*)track->GetLastHit();
363 AliHLTConfMapPoint *lastHit = (AliHLTConfMapPoint*)track->GetFirstHit();
364 tP->fX = hit->GetX();
365 tP->fY = hit->GetY();
366 tP->fZ = hit->GetZ();
367 tP->fLastX = lastHit->GetX();
368 tP->fLastY = lastHit->GetY();
369 tP->fLastZ = lastHit->GetZ();
371 // tP->fX = track->GetFirstPointX();
372 // tP->fY = track->GetFirstPointY();
373 // tP->fZ = track->GetFirstPointZ();
374 tP->fPt = track->GetPt();
375 tP->fPterr = track->GetPterr();
376 // tP->fLastX = track->GetLastPointX();
377 // tP->fLastY = track->GetLastPointY();
378 // tP->fLastZ = track->GetLastPointZ();
379 tP->fPsi = track->GetPsi();
380 tP->fTgl = track->GetTgl();
381 tP->fPsierr = track->GetPsierr();
382 tP->fTglerr = track->GetTglerr();
383 tP->fCharge = track->GetCharge();
384 #ifdef ROWHOUGHPARAMS
385 tP->fTrackID = track->GetMCid();
386 tP->fRowRange1 = track->GetFirstRow();
387 tP->fRowRange2 = track->GetLastRow();
388 tP->fSector = track->GetSector();
389 tP->fPID = track->GetPID();
391 tP->fNPoints = track->GetNHits();
392 pP = (UInt_t*)track->GetHitNumbers();
393 for (UInt_t j=0;j<tP->fNPoints;j++){
394 tP->fPointIDs[j] = pP[j];
396 Byte_t *tmpP = (Byte_t *)tP;
397 tmpP += sizeof(AliHLTTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
398 size +=sizeof(AliHLTTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
399 tP = (AliHLTTrackSegmentData*)tmpP;
404 void AliHLTTrackArray::AddLast(AliHLTTrack *track)
406 //add track to last position
407 AliHLTTrack *tpt = NextTrack();
412 void AliHLTTrackArray::AddTracks(AliHLTTrackArray *newtrack,Bool_t remove_old,Int_t slice)
415 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
417 LOG(AliHLTLog::kError,"AliHLTTrackArray::AddTracks","Track types")
418 <<"Bad idea to add tracks of different types"<<ENDLOG;
421 if(fSize < fNTracks+newtrack->GetNPresent())
422 SetSize(fSize+newtrack->GetSize());
423 for(Int_t i =0;i<newtrack->GetNTracks();i++){
424 AliHLTTrack *tpt = newtrack->GetCheckedTrack(i);
428 AliHLTTrack *track = NextTrack();
431 track->Rotate(slice); //Rotate track to global coordinates
434 if(GetTrackType()=='h')
435 track = (AliHLTHoughTrack*)NextTrack();
443 void AliHLTTrackArray::Compress()
446 if(GetNPresent()==GetNTracks()) return;
447 AliHLTTrack **tmp = new AliHLTTrack *[fNTracks];
449 Int_t absent=GetNPresent();
450 for(Int_t i=0;i<GetNTracks();i++){
451 if(fIsPresent[i]) tmp[present++] = fTrack[i];
452 else tmp[absent++] = fTrack[i];
454 for(Int_t i=0;i<GetNTracks();i++)
458 for(Int_t i=0; i<GetNTracks();i++){
464 fNTracks = GetNPresent();
468 void AliHLTTrackArray::QSort()
472 QSort(fTrack,0,fNTracks);
475 void AliHLTTrackArray::QSort( AliHLTTrack **a, Int_t first, Int_t last)
477 // Sort array of AliHLTTrack pointers using a quicksort algorithm.
478 // Uses TrackCompare() to compare objects.
481 static AliHLTTrack *tmp;
482 static int i; // "static" to save stack space
485 while (last - first > 1) {
489 while (++i < last && TrackCompare(a[i], a[first]) < 0)
491 while (--j > first && TrackCompare(a[j], a[first]) > 0)
507 if (j - first < last - (j + 1)) {
509 first = j + 1; // QSort(j + 1, last);
511 QSort(a, j + 1, last);
512 last = j; // QSort(first, j);
517 Int_t AliHLTTrackArray::TrackCompare(AliHLTTrack *a, AliHLTTrack *b) const
519 // Compare the two tracks.
521 return b->Compare(a);
526 AliHLTHoughTrack *tra = (AliHLTHoughTrack*)a;
527 AliHLTHoughTrack *trb = (AliHLTHoughTrack*)b;
528 if(tra->GetWeight() < trb->GetWeight()) return 1;
529 if(tra->GetWeight() > trb->GetWeight()) return -1;
533 if(a->GetNHits() < b->GetNHits()) return 1;
534 if(a->GetNHits() > b->GetNHits()) return -1;