2 // Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan
4 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
5 //*-- Copyright © ALICE HLT Group
7 #include "AliHLTTPCLogging.h"
8 #include "AliHLTTPCTrackArray.h"
9 #ifdef INCLUDE_TPC_HOUGH
10 #include "AliHLTTPCHoughTrack.h"
12 #include "AliHLTTPCModelTrack.h"
13 #include "AliHLTTPCConfMapTrack.h"
14 #include "AliHLTTPCTrackSegmentData.h"
15 #include "AliHLTTPCTransform.h"
16 #include "AliHLTTPCConfMapPoint.h"
18 /** \class AliHLTTPCTrackArray
20 //_____________________________________________________________
21 // AliHLTTPCTrackArray
32 ClassImp(AliHLTTPCTrackArray)
34 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
45 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
55 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
61 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
62 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
63 #ifdef INCLUDE_TPC_HOUGH
64 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
66 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
70 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
76 if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
77 if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
78 #ifdef INCLUDE_TPC_HOUGH
79 if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
81 if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
85 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
92 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
95 if(fNTracks<fSize) return fTrack[fNTracks++];
97 return fTrack[fNTracks++];
100 void AliHLTTPCTrackArray::DeleteArray()
103 for(Int_t i=0; i<fSize;i++)
109 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
112 if(newsize<=fSize) return kFALSE; //shrink comes later!!
115 fTrack = new AliHLTTPCTrack*[fSize];
116 fIsPresent = new Bool_t[fSize];
119 for(Int_t i=0;i<fSize;i++){
120 fTrack[i] = new AliHLTTPCTrack();
121 fIsPresent[i] = kTRUE;
125 for(Int_t i=0;i<fSize;i++){
126 fTrack[i] = new AliHLTTPCConfMapTrack();
127 fIsPresent[i] = kTRUE;
130 #ifdef INCLUDE_TPC_HOUGH
132 for(Int_t i=0;i<fSize;i++){
133 fTrack[i] = new AliHLTTPCHoughTrack();
134 fIsPresent[i] = kTRUE;
139 for(Int_t i=0;i<fSize;i++){
140 fTrack[i] = new AliHLTTPCModelTrack();
141 fIsPresent[i] = kTRUE;
149 AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
150 Bool_t *pre = new Bool_t[fSize];
151 for(Int_t i=0; i<fSize;i++){
153 pre[i] = fIsPresent[i];
157 fTrack = new AliHLTTPCTrack*[newsize];
158 fIsPresent = new Bool_t[newsize];
159 for(Int_t i=0; i<fSize;i++){
161 fIsPresent[i] = pre[i];
167 for(Int_t i=fSize;i<newsize;i++){
168 fTrack[i] = new AliHLTTPCTrack();
169 fIsPresent[i] = kTRUE;
173 for(Int_t i=fSize;i<newsize;i++){
174 fTrack[i] = new AliHLTTPCConfMapTrack();
175 fIsPresent[i] = kTRUE;
178 #ifdef INCLUDE_TPC_HOUGH
180 for(Int_t i=fSize;i<newsize;i++){
181 fTrack[i] = new AliHLTTPCHoughTrack();
182 fIsPresent[i] = kTRUE;
187 for(Int_t i=fSize;i<newsize;i++){
188 fTrack[i] = new AliHLTTPCModelTrack();
189 fIsPresent[i] = kTRUE;
199 void AliHLTTPCTrackArray::Reset()
204 for(Int_t i=0; i<fSize;i++)
205 fIsPresent[i] = kTRUE;
208 void AliHLTTPCTrackArray::Remove(Int_t track)
211 if(fIsPresent[track]){
212 fIsPresent[track]=kFALSE;
217 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr){
218 //Read tracks from shared memory (or memory)
219 AliHLTTPCTrackSegmentData *trs = tr;
220 for(Int_t i=0; i<ntracks; i++){
221 AliHLTTPCTrack *track = NextTrack();
222 track->SetPt(trs->fPt);
223 track->SetPsi(trs->fPsi);
224 track->SetTgl(trs->fTgl);
225 track->SetPterr(trs->fPterr);
226 track->SetPsierr(trs->fPsierr);
227 track->SetTglerr(trs->fTglerr);
228 track->SetNHits(trs->fNPoints);
229 track->SetCharge(trs->fCharge);
230 track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
231 track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
232 track->SetHits( trs->fNPoints, trs->fPointIDs );
233 #ifdef INCLUDE_TPC_HOUGH
234 #ifdef ROWHOUGHPARAMS
235 if(GetTrackType()=='h') {
236 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
237 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
239 track->SetMCid(trs->fTrackID);
240 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
241 track->SetSector(trs->fSector);
242 track->SetPID(trs->fPID);
244 #endif // INCLUDE_TPC_HOUGH
245 UChar_t *tmpP = (UChar_t*)trs;
246 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
247 trs = (AliHLTTPCTrackSegmentData*)tmpP;
251 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice)
253 //Read tracks from shared memory (or memory)
254 AliHLTTPCTrackSegmentData *trs = tr;
255 for(Int_t i=0; i<ntracks; i++){
256 AliHLTTPCTrack *track = NextTrack();
257 track->SetPt(trs->fPt);
258 track->SetPterr(trs->fPterr);
261 AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
262 track->SetPsi(psi[0]);
263 track->SetTgl(trs->fTgl);
264 track->SetPsierr(trs->fPsierr);
265 track->SetTglerr(trs->fTglerr);
266 track->SetNHits(trs->fNPoints);
267 track->SetCharge(trs->fCharge);
269 first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
270 AliHLTTPCTransform::Local2Global(first,slice);
271 track->SetFirstPoint(first[0],first[1],first[2]);
273 last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
274 AliHLTTPCTransform::Local2Global(last,slice);
275 track->SetLastPoint(last[0],last[1],last[2]);
276 track->SetHits( trs->fNPoints, trs->fPointIDs );
277 // BEGINN ############################################## MODIFIY JMT
278 track->SetSector(slice);
279 track->CalculateHelix();
280 // END ################################################# MODIFIY JMT
281 #ifdef INCLUDE_TPC_HOUGH
282 #ifdef ROWHOUGHPARAMS
283 if(GetTrackType()=='h') {
284 ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
285 ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
287 track->SetMCid(trs->fTrackID);
288 track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
289 track->SetSector(slice);
290 track->SetPID(trs->fPID);
292 #endif // INCLUDE_TPC_HOUGH
293 UChar_t *tmpP = (UChar_t*)trs;
294 tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
295 trs = (AliHLTTPCTrackSegmentData*)tmpP;
299 UInt_t AliHLTTPCTrackArray::GetOutSize()
302 UInt_t count = GetOutCount(); //use only present tracks
304 for(Int_t i=0;i<fNTracks;i++){ //loop over all tracks
305 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
306 if(track) //use only present tracks
307 tHits += track->GetNHits();
310 //calculate size of track
311 return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
314 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
317 ntracks = GetOutCount();
318 return WriteTracks(tr);
321 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
323 //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
324 AliHLTTPCTrackSegmentData *tP = tr;
327 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
328 AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
329 if(!track) continue; //use only present tracks
330 tP->fX = track->GetFirstPointX();
331 tP->fY = track->GetFirstPointY();
332 tP->fZ = track->GetFirstPointZ();
333 tP->fPt = track->GetPt();
334 tP->fPterr = track->GetPterr();
335 tP->fLastX = track->GetLastPointX();
336 tP->fLastY = track->GetLastPointY();
337 tP->fLastZ = track->GetLastPointZ();
338 tP->fPsi = track->GetPsi();
339 tP->fTgl = track->GetTgl();
340 tP->fPsierr = track->GetPsierr();
341 tP->fTglerr = track->GetTglerr();
342 tP->fCharge = track->GetCharge();
343 tP->fNPoints = track->GetNHits();
344 #ifdef INCLUDE_TPC_HOUGH
345 #ifdef ROWHOUGHPARAMS
346 if(GetTrackType()=='h') {
347 tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
348 tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
349 tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
350 tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
351 tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
353 tP->fTrackID = track->GetMCid();
354 tP->fRowRange1 = track->GetFirstRow();
355 tP->fRowRange2 = track->GetLastRow();
356 tP->fSector = track->GetSector();
357 tP->fPID = track->GetPID();
359 #endif // INCLUDE_TPC_HOUGH
360 pP = (UInt_t*)track->GetHitNumbers();
361 for (UInt_t j=0;j<tP->fNPoints;j++){
362 tP->fPointIDs[j] = pP[j];
364 Byte_t *tmpP = (Byte_t *)tP;
365 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
366 size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
367 tP = (AliHLTTPCTrackSegmentData*)tmpP;
369 // BEGINN ############################################## MODIFIY JMT
370 // LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
371 // track->Rotate(0,kFALSE);
373 // END ################################################# MODIFIY JMT
379 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
381 // use first and last point objects
382 AliHLTTPCTrackSegmentData *tP = tr;
385 for(Int_t i=0; i<fNTracks; i++){ //loop over all tracks
386 AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
387 if(!track) continue; //use only present tracks
388 AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
389 AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
390 tP->fX = hit->GetX();
391 tP->fY = hit->GetY();
392 tP->fZ = hit->GetZ();
393 tP->fLastX = lastHit->GetX();
394 tP->fLastY = lastHit->GetY();
395 tP->fLastZ = lastHit->GetZ();
397 // tP->fX = track->GetFirstPointX();
398 // tP->fY = track->GetFirstPointY();
399 // tP->fZ = track->GetFirstPointZ();
400 tP->fPt = track->GetPt();
401 tP->fPterr = track->GetPterr();
402 // tP->fLastX = track->GetLastPointX();
403 // tP->fLastY = track->GetLastPointY();
404 // tP->fLastZ = track->GetLastPointZ();
405 tP->fPsi = track->GetPsi();
406 tP->fTgl = track->GetTgl();
407 tP->fPsierr = track->GetPsierr();
408 tP->fTglerr = track->GetTglerr();
409 tP->fCharge = track->GetCharge();
410 #ifdef INCLUDE_TPC_HOUGH
411 #ifdef ROWHOUGHPARAMS
412 tP->fTrackID = track->GetMCid();
413 tP->fRowRange1 = track->GetFirstRow();
414 tP->fRowRange2 = track->GetLastRow();
415 tP->fSector = track->GetSector();
416 tP->fPID = track->GetPID();
418 #endif // INCLUDE_TPC_HOUGH
419 tP->fNPoints = track->GetNHits();
420 pP = (UInt_t*)track->GetHitNumbers();
421 for (UInt_t j=0;j<tP->fNPoints;j++){
422 tP->fPointIDs[j] = pP[j];
424 Byte_t *tmpP = (Byte_t *)tP;
425 tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
426 size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
427 tP = (AliHLTTPCTrackSegmentData*)tmpP;
432 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
434 //add track to last position
435 AliHLTTPCTrack *tpt = NextTrack();
440 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
443 if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
445 LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
446 <<"Bad idea to add tracks of different types"<<ENDLOG;
449 if(fSize < fNTracks+newtrack->GetNPresent())
450 SetSize(fSize+newtrack->GetSize());
451 for(Int_t i =0;i<newtrack->GetNTracks();i++){
452 AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
456 AliHLTTPCTrack *track = NextTrack();
459 track->Rotate(slice); //Rotate track to global coordinates
461 AliHLTTPCTrack *track;
462 #ifdef INCLUDE_TPC_HOUGH
463 if(GetTrackType()=='h')
464 track = (AliHLTTPCHoughTrack*)NextTrack();
473 void AliHLTTPCTrackArray::Compress()
476 if(GetNPresent()==GetNTracks()) return;
477 AliHLTTPCTrack **tmp = new AliHLTTPCTrack *[fNTracks];
479 Int_t absent=GetNPresent();
480 for(Int_t i=0;i<GetNTracks();i++){
481 if(fIsPresent[i]) tmp[present++] = fTrack[i];
482 else tmp[absent++] = fTrack[i];
484 for(Int_t i=0;i<GetNTracks();i++)
488 for(Int_t i=0; i<GetNTracks();i++){
494 fNTracks = GetNPresent();
498 void AliHLTTPCTrackArray::QSort()
502 QSort(fTrack,0,fNTracks);
505 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
507 // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
508 // Uses TrackCompare() to compare objects.
511 static AliHLTTPCTrack *tmp;
512 static int i; // "static" to save stack space
515 while (last - first > 1) {
519 while (++i < last && TrackCompare(a[i], a[first]) < 0)
521 while (--j > first && TrackCompare(a[j], a[first]) > 0)
537 if (j - first < last - (j + 1)) {
539 first = j + 1; // QSort(j + 1, last);
541 QSort(a, j + 1, last);
542 last = j; // QSort(first, j);
547 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
549 // Compare the two tracks.
551 return b->Compare(a);
554 #ifdef INCLUDE_TPC_HOUGH
557 AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
558 AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
559 if(tra->GetWeight() < trb->GetWeight()) return 1;
560 if(tra->GetWeight() > trb->GetWeight()) return -1;
565 if(a->GetNHits() < b->GetNHits()) return 1;
566 if(a->GetNHits() > b->GetNHits()) return -1;