]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/TPCLib/AliHLTTPCTrackArray.cxx
transformation of AliHLTTPCTrack into ESD format added, ESD writer component
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCTrackArray.cxx
1 // @(#) $Id$
2 // Original: AliHLTTrackArray.cxx,v 1.21 2005/06/14 10:55:21 cvetan 
3
4 /**************************************************************************
5  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
6  *                                                                        *
7  * Authors: Uli Frankenfeld                                               *
8  *          Matthias Richter <Matthias.Richter@ift.uib.no>                *
9  *          for The ALICE Off-line Project.                               *
10  *                                                                        *
11  * Permission to use, copy, modify and distribute this software and its   *
12  * documentation strictly for non-commercial purposes is hereby granted   *
13  * without fee, provided that the above copyright notice appears in all   *
14  * copies and that both the copyright notice and this permission notice   *
15  * appear in the supporting documentation. The authors make no claims     *
16  * about the suitability of this software for any purpose. It is          *
17  * provided "as is" without express or implied warranty.                  *
18  **************************************************************************/
19
20 /** @file   AliHLTTPCTrackArray.cxx
21     @author Uli Frankenfeld, maintained by Matthias Richter
22     @date   
23     @brief  Array of AliHLTTPCTracks */
24
25 #include "AliHLTTPCLogging.h"
26 #include "AliHLTTPCTrackArray.h"
27 #ifdef INCLUDE_TPC_HOUGH
28 #include "AliHLTTPCHoughTrack.h"
29 #endif
30 #include "AliHLTTPCModelTrack.h"
31 #include "AliHLTTPCConfMapTrack.h"
32 #include "AliHLTTPCTrackSegmentData.h"
33 #include "AliHLTTPCTransform.h"
34 #include "AliHLTTPCConfMapPoint.h"
35
36 #if __GNUC__ >= 3
37 using namespace std;
38 #endif
39
40 ClassImp(AliHLTTPCTrackArray)
41
42 AliHLTTPCTrackArray::AliHLTTPCTrackArray()
43   :
44   fSize(0),
45   fNTracks(0),
46   fNAbsent(0),
47   fTrackType('t')
48 {
49   //Default constructor
50   SetSize();
51 }
52
53
54 AliHLTTPCTrackArray::AliHLTTPCTrackArray(const AliHLTTPCTrackArray&)
55   :
56   fSize(0),
57   fNTracks(0),
58   fNAbsent(0),
59   fTrackType('t')
60 {
61   //constructor
62   SetSize();
63 }
64
65 AliHLTTPCTrackArray& AliHLTTPCTrackArray::operator=(const AliHLTTPCTrackArray&)
66 {
67   //assignment
68   fSize=0;
69   fNTracks=0;
70   fNAbsent=0;
71   fTrackType='t';
72   SetSize();
73   return *this;
74 }
75
76 AliHLTTPCTrackArray::AliHLTTPCTrackArray(Int_t ntrack)
77   :
78   fSize(0),
79   fNTracks(0),
80   fNAbsent(0),
81   fTrackType('t')
82 {
83   //Constructor.
84   SetSize(ntrack);
85 }
86
87 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype,Int_t ntrack)
88   :
89   fSize(0),
90   fNTracks(0),
91   fNAbsent(0)
92 {
93   //Constructor.
94   if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
95   if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
96 #ifdef INCLUDE_TPC_HOUGH
97   if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
98 #endif
99   if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
100   SetSize(ntrack);
101 }
102
103 AliHLTTPCTrackArray::AliHLTTPCTrackArray(char* tracktype)
104   :
105   fSize(0),
106   fNTracks(0),
107   fNAbsent(0)
108 {
109   //Constructor.
110   if(strcmp(tracktype,"AliHLTTPCTrack")==0) fTrackType='t';
111   if(strcmp(tracktype,"AliHLTTPCConfMapTrack")==0) fTrackType='c';
112 #ifdef INCLUDE_TPC_HOUGH
113   if(strcmp(tracktype,"AliHLTTPCHoughTrack")==0) fTrackType='h';
114 #endif
115   if(strcmp(tracktype,"AliHLTTPCModelTrack")==0) fTrackType='m';
116   SetSize();
117 }
118
119 AliHLTTPCTrackArray::~AliHLTTPCTrackArray()
120 {
121   //Destructor
122   DeleteArray();
123 }
124
125
126 AliHLTTPCTrack *AliHLTTPCTrackArray::NextTrack()
127 {
128   //next track in array
129   if(fNTracks<fSize) return fTrack[fNTracks++];
130   SetSize(fSize+100);
131    return fTrack[fNTracks++]; 
132 }
133
134 void AliHLTTPCTrackArray::DeleteArray()
135 {
136   //delete array
137   for(Int_t i=0; i<fSize;i++)
138     delete fTrack[i];
139   delete[] fIsPresent;
140   delete[] fTrack;
141 }
142
143 Bool_t AliHLTTPCTrackArray::SetSize(Int_t newsize)
144 {
145   //set size
146   if(newsize<=fSize) return kFALSE; //shrink comes later!! 
147   if(!fSize){
148     fSize = newsize;
149     fTrack = new AliHLTTPCTrack*[fSize];
150     fIsPresent = new Bool_t[fSize];
151     switch(fTrackType){
152       case 't':
153         for(Int_t i=0;i<fSize;i++){
154           fTrack[i]   = new AliHLTTPCTrack();
155           fIsPresent[i] = kTRUE;
156         }
157         break;
158       case 'c':  
159         for(Int_t i=0;i<fSize;i++){
160           fTrack[i]   = new AliHLTTPCConfMapTrack();
161           fIsPresent[i] = kTRUE;
162         }
163         break;
164 #ifdef INCLUDE_TPC_HOUGH
165       case 'h':
166         for(Int_t i=0;i<fSize;i++){
167           fTrack[i]   = new AliHLTTPCHoughTrack();
168           fIsPresent[i] = kTRUE;
169         }
170         break;
171 #endif
172        case 'm':
173         for(Int_t i=0;i<fSize;i++){
174           fTrack[i]   = new AliHLTTPCModelTrack();
175           fIsPresent[i] = kTRUE;
176         }
177         break;
178       default: 
179         return kFALSE;
180     }
181     return kTRUE;
182   }
183   AliHLTTPCTrack **tmp = new AliHLTTPCTrack*[fSize];
184   Bool_t *pre = new Bool_t[fSize];
185   for(Int_t i=0; i<fSize;i++){
186     tmp[i] = fTrack[i];
187     pre[i] = fIsPresent[i];
188   }
189   delete[]  fTrack;
190   delete[] fIsPresent;
191   fTrack =  new AliHLTTPCTrack*[newsize];
192   fIsPresent = new Bool_t[newsize];
193   for(Int_t i=0; i<fSize;i++){
194     fTrack[i]   = tmp[i];
195     fIsPresent[i] = pre[i];
196   }
197   delete[] tmp;
198   delete[] pre;
199   switch(fTrackType){
200     case 't':
201       for(Int_t i=fSize;i<newsize;i++){
202         fTrack[i]   = new AliHLTTPCTrack();
203         fIsPresent[i] = kTRUE;
204       }
205       break;
206     case 'c':  
207       for(Int_t i=fSize;i<newsize;i++){
208         fTrack[i]   = new AliHLTTPCConfMapTrack();
209         fIsPresent[i] = kTRUE;
210       }
211       break;
212 #ifdef INCLUDE_TPC_HOUGH
213     case 'h':
214       for(Int_t i=fSize;i<newsize;i++){
215         fTrack[i]   = new AliHLTTPCHoughTrack();
216         fIsPresent[i] = kTRUE;
217       }
218       break;
219 #endif
220     case 'm':
221       for(Int_t i=fSize;i<newsize;i++){
222         fTrack[i]   = new AliHLTTPCModelTrack();
223         fIsPresent[i] = kTRUE;
224       }
225       break;
226     default: 
227       return kFALSE;
228   }
229   fSize = newsize;
230   return kTRUE;
231 }
232
233 void AliHLTTPCTrackArray::Reset()
234 {
235   //reset
236   fNTracks=0;
237   fNAbsent=0;
238   for(Int_t i=0; i<fSize;i++)
239     fIsPresent[i] = kTRUE; 
240 }
241
242 void AliHLTTPCTrackArray::Remove(Int_t track)
243 {
244   //remove track
245   if(fIsPresent[track]){
246     fIsPresent[track]=kFALSE;
247     fNAbsent++;
248   }
249 }
250
251 void AliHLTTPCTrackArray::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr,Int_t slice, Int_t bTransform)
252 {
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);
259     Float_t psi[1];
260     psi[0]=trs->fPsi;
261     if (slice>=0 && bTransform!=0)  {
262       AliHLTTPCTransform::Local2GlobalAngle(psi,slice);
263     }
264     //cout << "psi " << psi[0] << endl;
265     track->SetPsi(psi[0]);
266     track->SetTgl(trs->fTgl);
267     track->SetPsierr(trs->fPsierr);
268     track->SetTglerr(trs->fTglerr);
269     track->SetNHits(trs->fNPoints);
270     track->SetCharge(trs->fCharge);
271     Float_t first[3];
272     first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
273     if (slice>=0 && bTransform!=0)  {
274       AliHLTTPCTransform::Local2Global(first,slice);
275     }
276     //cout << "first point: " << first[0] << " " << first[1] << " " << first[3] << endl;
277     track->SetFirstPoint(first[0],first[1],first[2]);
278     Float_t last[3];
279     last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
280     if (slice>=0 && bTransform!=0)  {
281       AliHLTTPCTransform::Local2Global(last,slice);
282     }
283     //cout << "last point: " << last[0] << " " << last[1] << " " << last[3] << endl;
284     track->SetLastPoint(last[0],last[1],last[2]);
285     track->SetHits( trs->fNPoints, trs->fPointIDs );
286
287     if (slice>=0 && bTransform!=0)  {
288       // as everything is now in global coordinates we set the sector to 0
289       track->SetSector(0);
290     } else {
291       // the parameters are in local coordinates, set the sector no
292 #ifndef INCLUDE_TPC_HOUGH
293       if (slice<0) track->SetSector(0);
294       else track->SetSector(slice);
295 #else 
296       // Matthias Feb 2007: this is some kind of legacy ...
297       // the INCLUDE_TPC_HOUGH has never been switched on in the new TPCLib
298       // and this line was below in the corresponding block. As the slice
299       // parameter is very useful but not available if the define is off
300       // we distinguish the two cases here. Should be cleaned up.
301       track->SetSector(trs->fSector);
302 #endif // INCLUDE_TPC_HOUGH
303     }
304 // BEGINN ############################################## MODIFIY JMT
305 // this we have to check
306 //  track->CalculateHelix();
307 // END ################################################# MODIFIY JMT
308 #ifdef INCLUDE_TPC_HOUGH
309 #ifdef ROWHOUGHPARAMS
310     if(GetTrackType()=='h') {
311       ((AliHLTTPCHoughTrack *)track)->SetWeight(trs->fWeight);
312       ((AliHLTTPCHoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
313     }
314     track->SetMCid(trs->fTrackID);
315     track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
316     track->SetPID(trs->fPID);
317 #endif
318 #endif // INCLUDE_TPC_HOUGH
319     UChar_t *tmpP = (UChar_t*)trs;
320     tmpP += sizeof(AliHLTTPCTrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
321     trs = (AliHLTTPCTrackSegmentData*)tmpP;
322   }
323 }
324
325 UInt_t AliHLTTPCTrackArray::GetOutSize()
326 {
327   //get size for IO
328   UInt_t count = GetOutCount();   //use only present tracks
329   UInt_t tHits = 0;
330   for(Int_t i=0;i<fNTracks;i++){  //loop over all tracks
331     AliHLTTPCTrack *track = GetCheckedTrack(i);  //use only present tracks
332     if(track)                                       //use only present tracks
333       tHits += track->GetNHits();
334   }
335
336   //calculate size of track
337   return count*sizeof(AliHLTTPCTrackSegmentData)+sizeof(UInt_t)*tHits;
338 }
339
340 UInt_t AliHLTTPCTrackArray::WriteTracks(UInt_t & ntracks,AliHLTTPCTrackSegmentData* tr)
341 {
342   //write tracks
343   ntracks = GetOutCount();
344   return WriteTracks(tr);
345 }
346
347 UInt_t AliHLTTPCTrackArray::WriteTracks(AliHLTTPCTrackSegmentData* tr)
348 {
349   //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
350   AliHLTTPCTrackSegmentData *tP = tr;
351   UInt_t *pP;
352   UInt_t size = 0;
353   for(Int_t i=0; i<fNTracks; i++){  //loop over all tracks
354     AliHLTTPCTrack *track = GetCheckedTrack(i); //use only present tracks
355     if(!track) continue;                           //use only present tracks
356     tP->fX = track->GetFirstPointX();
357     tP->fY = track->GetFirstPointY();
358     tP->fZ = track->GetFirstPointZ();
359     tP->fPt = track->GetPt();
360     tP->fPterr = track->GetPterr();
361     tP->fLastX = track->GetLastPointX();
362     tP->fLastY = track->GetLastPointY();
363     tP->fLastZ = track->GetLastPointZ();
364     tP->fPsi = track->GetPsi();
365     tP->fTgl = track->GetTgl();
366     tP->fPsierr = track->GetPsierr();
367     tP->fTglerr = track->GetTglerr();
368     tP->fCharge = track->GetCharge();
369     tP->fNPoints = track->GetNHits();
370 #ifdef INCLUDE_TPC_HOUGH
371 #ifdef ROWHOUGHPARAMS
372     if(GetTrackType()=='h') {
373       tP->fWeight = ((AliHLTTPCHoughTrack *)track)->GetWeight();
374       tP->fBinX = ((AliHLTTPCHoughTrack *)track)->GetBinX();
375       tP->fBinY = ((AliHLTTPCHoughTrack *)track)->GetBinY();
376       tP->fBinXSize = ((AliHLTTPCHoughTrack *)track)->GetSizeX();
377       tP->fBinYSize = ((AliHLTTPCHoughTrack *)track)->GetSizeY();
378     }
379     tP->fTrackID = track->GetMCid();
380     tP->fRowRange1 = track->GetFirstRow();
381     tP->fRowRange2 = track->GetLastRow();
382     tP->fSector = track->GetSector();
383     tP->fPID = track->GetPID();
384 #endif
385 #endif // INCLUDE_TPC_HOUGH
386     pP = (UInt_t*)track->GetHitNumbers();
387     for (UInt_t j=0;j<tP->fNPoints;j++){
388       tP->fPointIDs[j] = pP[j];
389     }
390     Byte_t *tmpP = (Byte_t *)tP;
391     tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
392     size += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
393     tP = (AliHLTTPCTrackSegmentData*)tmpP;
394
395 // BEGINN ############################################## MODIFIY JMT
396 //    LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::WriteTracks","TRACKPARAMETER") <<ENDLOG;
397 //    track->Rotate(0,kFALSE);
398 //    track->Print();
399 // END ################################################# MODIFIY JMT
400
401   }
402   return size;
403 }
404
405 UInt_t AliHLTTPCTrackArray::WriteConfMapTracks(AliHLTTPCTrackSegmentData* tr)
406 {
407   // use first and last point objects
408   AliHLTTPCTrackSegmentData *tP = tr;
409   UInt_t *pP;
410   UInt_t size = 0;
411   for(Int_t i=0; i<fNTracks; i++){  //loop over all tracks
412     AliHLTTPCConfMapTrack *track =(AliHLTTPCConfMapTrack *) GetCheckedTrack(i); //use only present tracks
413     if(!track) continue;                           //use only present tracks
414     AliHLTTPCConfMapPoint *hit = (AliHLTTPCConfMapPoint*)track->GetLastHit();
415     AliHLTTPCConfMapPoint *lastHit = (AliHLTTPCConfMapPoint*)track->GetFirstHit();
416     tP->fX = hit->GetX();
417     tP->fY = hit->GetY();
418     tP->fZ = hit->GetZ();
419     tP->fLastX = lastHit->GetX();
420     tP->fLastY = lastHit->GetY();
421     tP->fLastZ = lastHit->GetZ();
422    
423 //    tP->fX = track->GetFirstPointX();
424 //    tP->fY = track->GetFirstPointY();
425 //    tP->fZ = track->GetFirstPointZ();
426     tP->fPt = track->GetPt();
427     tP->fPterr = track->GetPterr();
428 //    tP->fLastX = track->GetLastPointX();
429 //    tP->fLastY = track->GetLastPointY();
430 //    tP->fLastZ = track->GetLastPointZ();
431     tP->fPsi = track->GetPsi();
432     tP->fTgl = track->GetTgl();
433     tP->fPsierr = track->GetPsierr();
434     tP->fTglerr = track->GetTglerr();
435     tP->fCharge = track->GetCharge();
436 #ifdef INCLUDE_TPC_HOUGH
437 #ifdef ROWHOUGHPARAMS
438     tP->fTrackID = track->GetMCid();
439     tP->fRowRange1 = track->GetFirstRow();
440     tP->fRowRange2 = track->GetLastRow();
441     tP->fSector = track->GetSector();
442     tP->fPID = track->GetPID();
443 #endif
444 #endif // INCLUDE_TPC_HOUGH
445     tP->fNPoints = track->GetNHits();
446     pP = (UInt_t*)track->GetHitNumbers();
447     for (UInt_t j=0;j<tP->fNPoints;j++){
448       tP->fPointIDs[j] = pP[j];
449     }
450     Byte_t *tmpP = (Byte_t *)tP;
451     tmpP += sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
452     size +=sizeof(AliHLTTPCTrackSegmentData)+tP->fNPoints*sizeof(UInt_t);
453     tP = (AliHLTTPCTrackSegmentData*)tmpP;
454   }
455   return size;
456 }
457
458 void AliHLTTPCTrackArray::AddLast(AliHLTTPCTrack *track)
459 {
460   //add track to last position
461   AliHLTTPCTrack *tpt = NextTrack();
462   tpt->Copy(track);
463   
464 }
465
466 void AliHLTTPCTrackArray::AddTracks(AliHLTTPCTrackArray *newtrack,Bool_t remove_old,Int_t slice)
467 {
468   //add tracks
469   if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
470     {
471       LOG(AliHLTTPCLog::kError,"AliHLTTPCTrackArray::AddTracks","Track types")
472         <<"Bad idea to add tracks of different types"<<ENDLOG;
473       return;
474     }
475   if(fSize < fNTracks+newtrack->GetNPresent())
476     SetSize(fSize+newtrack->GetSize());
477   for(Int_t i =0;i<newtrack->GetNTracks();i++){
478     AliHLTTPCTrack *tpt = newtrack->GetCheckedTrack(i);
479     if(!tpt) continue;
480     if(remove_old)
481       newtrack->Remove(i);
482     AliHLTTPCTrack *track = NextTrack();
483     track->Copy(tpt);
484     if(slice>=0)
485       track->Rotate(slice); //Rotate track to global coordinates
486     /*
487       AliHLTTPCTrack *track;
488 #ifdef INCLUDE_TPC_HOUGH
489       if(GetTrackType()=='h')
490       track = (AliHLTTPCHoughTrack*)NextTrack();
491       else
492 #endif
493       track = NextTrack();
494       track->Copy(tpt);
495     */
496   }
497 }
498
499 void AliHLTTPCTrackArray::Compress()
500 {
501   //compress array
502   if(GetNPresent()==GetNTracks()) return;
503   AliHLTTPCTrack **tmp =  new AliHLTTPCTrack *[fNTracks];
504   Int_t present=0;
505   Int_t absent=GetNPresent();
506   for(Int_t i=0;i<GetNTracks();i++){
507     if(fIsPresent[i]) tmp[present++] = fTrack[i];
508     else tmp[absent++] = fTrack[i];
509   }
510   for(Int_t i=0;i<GetNTracks();i++)
511     fIsPresent[i]=kTRUE;
512
513   //Copy pointers back
514   for(Int_t i=0; i<GetNTracks();i++){
515     fTrack[i]=tmp[i];
516   }
517
518   delete[] tmp;
519
520   fNTracks = GetNPresent();
521   fNAbsent = 0;
522 }
523
524 void AliHLTTPCTrackArray::QSort()
525 {
526   // compress and sort
527   Compress();
528   QSort(fTrack,0,fNTracks);
529 }
530
531 void AliHLTTPCTrackArray::QSort( AliHLTTPCTrack **a, Int_t first, Int_t last)
532 {
533    // Sort array of AliHLTTPCTrack pointers using a quicksort algorithm.
534    // Uses TrackCompare() to compare objects.
535    // Thanks to Root! 
536
537    static AliHLTTPCTrack *tmp;
538    static int i;           // "static" to save stack space
539    int j;
540
541    while (last - first > 1) {
542       i = first;
543       j = last;
544       for (;;) {
545         while (++i < last && TrackCompare(a[i], a[first]) < 0)
546           ;
547         while (--j > first && TrackCompare(a[j], a[first]) > 0)
548           ;
549          if (i >= j)
550             break;
551
552          tmp  = a[i];
553          a[i] = a[j];
554          a[j] = tmp;
555       }
556       if (j == first) {
557          ++first;
558          continue;
559       }
560       tmp = a[first];
561       a[first] = a[j];
562       a[j] = tmp;
563       if (j - first < last - (j + 1)) {
564          QSort(a, first, j);
565          first = j + 1;   // QSort(j + 1, last);
566       } else {
567          QSort(a, j + 1, last);
568          last = j;        // QSort(first, j);
569       }
570    }
571 }
572
573 Int_t AliHLTTPCTrackArray::TrackCompare(AliHLTTPCTrack *a, AliHLTTPCTrack *b) const
574 {
575    // Compare the two tracks.
576   
577   return b->Compare(a);
578   
579   /*
580 #ifdef INCLUDE_TPC_HOUGH
581     if(fTrackType=='h')
582     {
583     AliHLTTPCHoughTrack *tra = (AliHLTTPCHoughTrack*)a;
584     AliHLTTPCHoughTrack *trb = (AliHLTTPCHoughTrack*)b;
585     if(tra->GetWeight() < trb->GetWeight()) return 1;
586     if(tra->GetWeight() > trb->GetWeight()) return -1;
587     }
588     else
589 #endif
590     {
591     if(a->GetNHits() < b->GetNHits()) return 1;
592     if(a->GetNHits() > b->GetNHits()) return -1;
593     }
594     
595     return 0;
596   */
597 }
598
599 AliHLTTPCTrack* AliHLTTPCTrackArray::operator[](int index)
600 {
601   // access operator
602   if (index<fNTracks) return fTrack[index];
603   return NULL;
604 }