]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/src/AliL3TrackArray.cxx
Major update of the HLT Hough transform and ITS tracking code. Hough transform tracks...
[u/mrichter/AliRoot.git] / HLT / src / AliL3TrackArray.cxx
index 332fa59f6afb5a633e4f9acc7e731bfb1a992778..b31ab1418b7c59f903ff1e4a2d98da460d665c79 100644 (file)
@@ -1,24 +1,33 @@
-//Author:        Uli Frankenfeld
-//Last Modified: 06.12.2000
+// @(#) $Id$
+
+// Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
+//*-- Copyright &copy ALICE HLT Group
+
+#include "AliL3StandardIncludes.h"
 
-#include <math.h>
-#include <string.h>
-#include <iostream.h>
 #include "AliL3Logging.h"
 #include "AliL3TrackArray.h"
 #include "AliL3HoughTrack.h"
+#include "AliL3ModelTrack.h"
 #include "AliL3ConfMapTrack.h"
 #include "AliL3TrackSegmentData.h"
 #include "AliL3Transform.h"
 #include "AliL3ConfMapPoint.h"
+
+/** \class AliL3TrackArray
+<pre>
 //_____________________________________________________________
+// AliL3TrackArray
 //
-// The L3 TrackArray 
+// Track array class 
 //
+</pre>
+*/
 
 ClassImp(AliL3TrackArray)
 
-AliL3TrackArray::AliL3TrackArray(){
+AliL3TrackArray::AliL3TrackArray()
+{
   //Default constructor
   fSize = 0;
   fNTracks=0;
@@ -28,7 +37,8 @@ AliL3TrackArray::AliL3TrackArray(){
 }
 
 
-AliL3TrackArray::AliL3TrackArray(Int_t ntrack){
+AliL3TrackArray::AliL3TrackArray(Int_t ntrack)
+{
   //Constructor.
   fSize = 0;
   fNTracks=0;
@@ -37,7 +47,8 @@ AliL3TrackArray::AliL3TrackArray(Int_t ntrack){
   SetSize(ntrack);
 }
 
-AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack){
+AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack)
+{
   //Constructor.
   fSize = 0;
   fNTracks=0;
@@ -45,10 +56,12 @@ AliL3TrackArray::AliL3TrackArray(char* tracktype,Int_t ntrack){
   if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
   if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
   if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
+  if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
   SetSize(ntrack);
 }
 
-AliL3TrackArray::AliL3TrackArray(char* tracktype){
+AliL3TrackArray::AliL3TrackArray(char* tracktype)
+{
   //Constructor.
   fSize = 0;
   fNTracks=0;
@@ -56,30 +69,37 @@ AliL3TrackArray::AliL3TrackArray(char* tracktype){
   if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
   if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
   if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
+  if(strcmp(tracktype,"AliL3ModelTrack")==0) fTrackType='m';
   SetSize();
 }
 
-
-AliL3TrackArray::~AliL3TrackArray(){
+AliL3TrackArray::~AliL3TrackArray()
+{
   //Destructor
   DeleteArray();
 }
 
 
-AliL3Track *AliL3TrackArray::NextTrack(){
+AliL3Track *AliL3TrackArray::NextTrack()
+{
+  //next track in array
   if(fNTracks<fSize) return fTrack[fNTracks++];
   SetSize(fSize+100);
    return fTrack[fNTracks++]; 
 }
 
-void AliL3TrackArray::DeleteArray(){
+void AliL3TrackArray::DeleteArray()
+{
+  //delete array
   for(Int_t i=0; i<fSize;i++)
     delete fTrack[i];
   delete[] fIsPresent;
   delete[] fTrack;
 }
 
-Bool_t AliL3TrackArray::SetSize(Int_t newsize){
+Bool_t AliL3TrackArray::SetSize(Int_t newsize)
+{
+  //set size
   if(newsize<=fSize) return kFALSE; //shrink comes later!! 
   if(!fSize){
     fSize = newsize;
@@ -104,6 +124,12 @@ Bool_t AliL3TrackArray::SetSize(Int_t newsize){
           fIsPresent[i] = kTRUE;
         }
         break;
+       case 'm':
+        for(Int_t i=0;i<fSize;i++){
+          fTrack[i]   = new AliL3ModelTrack();
+          fIsPresent[i] = kTRUE;
+        }
+        break;
       default: 
         return kFALSE;
     }
@@ -144,6 +170,12 @@ Bool_t AliL3TrackArray::SetSize(Int_t newsize){
         fIsPresent[i] = kTRUE;
       }
       break;
+    case 'm':
+      for(Int_t i=fSize;i<newsize;i++){
+        fTrack[i]   = new AliL3ModelTrack();
+        fIsPresent[i] = kTRUE;
+      }
+      break;
     default: 
       return kFALSE;
   }
@@ -151,14 +183,18 @@ Bool_t AliL3TrackArray::SetSize(Int_t newsize){
   return kTRUE;
 }
 
-void AliL3TrackArray::Reset(){
+void AliL3TrackArray::Reset()
+{
+  //reset
   fNTracks=0;
   fNAbsent=0;
   for(Int_t i=0; i<fSize;i++)
     fIsPresent[i] = kTRUE; 
 }
 
-void AliL3TrackArray::Remove(Int_t track){
+void AliL3TrackArray::Remove(Int_t track)
+{
+  //remove track
   if(fIsPresent[track]){
     fIsPresent[track]=kFALSE;
     fNAbsent++;
@@ -168,51 +204,80 @@ void AliL3TrackArray::Remove(Int_t track){
 void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr){
   //Read tracks from shared memory (or memory)
   AliL3TrackSegmentData *trs = tr;
-  for(Int_t i=0; i<ntracks; i++){
+   for(Int_t i=0; i<ntracks; i++){
     AliL3Track *track = NextTrack(); 
     track->SetPt(trs->fPt);
     track->SetPsi(trs->fPsi);
     track->SetTgl(trs->fTgl);
+    track->SetPterr(trs->fPterr);
+    track->SetPsierr(trs->fPsierr);
+    track->SetTglerr(trs->fTglerr);
     track->SetNHits(trs->fNPoints);
     track->SetCharge(trs->fCharge);
     track->SetFirstPoint(trs->fX,trs->fY,trs->fZ);
     track->SetLastPoint(trs->fLastX,trs->fLastY,trs->fLastZ);
     track->SetHits( trs->fNPoints, trs->fPointIDs );
+#ifdef ROWHOUGHPARAMS
+    if(GetTrackType()=='h') {
+      ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
+      ((AliL3HoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
+    }
+    track->SetMCid(trs->fTrackID);
+    track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
+    track->SetSector(trs->fSector);
+    track->SetPID(trs->fPID);
+#endif
     UChar_t *tmpP = (UChar_t*)trs;
     tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
     trs = (AliL3TrackSegmentData*)tmpP;
   }
 }
 
-void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr,Int_t slice, AliL3Transform* trans){
+void AliL3TrackArray::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr,Int_t slice)
+{
   //Read tracks from shared memory (or memory)
   AliL3TrackSegmentData *trs = tr;
   for(Int_t i=0; i<ntracks; i++){
     AliL3Track *track = NextTrack(); 
     track->SetPt(trs->fPt);
+    track->SetPterr(trs->fPterr);
     Float_t psi[1];
     psi[0]=trs->fPsi;
-    trans->Local2GlobalAngle(psi,slice);
+    AliL3Transform::Local2GlobalAngle(psi,slice);
     track->SetPsi(psi[0]);
     track->SetTgl(trs->fTgl);
+    track->SetPsierr(trs->fPsierr);
+    track->SetTglerr(trs->fTglerr);
     track->SetNHits(trs->fNPoints);
     track->SetCharge(trs->fCharge);
     Float_t first[3];
     first[0]=trs->fX;first[1]=trs->fY;first[2]=trs->fZ;
-    trans->Local2Global(first,slice);
+    AliL3Transform::Local2Global(first,slice);
     track->SetFirstPoint(first[0],first[1],first[2]);
     Float_t last[3];
     last[0]=trs->fLastX;last[1]=trs->fLastY;last[2]=trs->fLastZ;
-    trans->Local2Global(last,slice);
+    AliL3Transform::Local2Global(last,slice);
     track->SetLastPoint(last[0],last[1],last[2]);
     track->SetHits( trs->fNPoints, trs->fPointIDs );
+#ifdef ROWHOUGHPARAMS
+    if(GetTrackType()=='h') {
+      ((AliL3HoughTrack *)track)->SetWeight(trs->fWeight);
+      ((AliL3HoughTrack *)track)->SetBinXY(trs->fBinX,trs->fBinY,trs->fBinXSize,trs->fBinYSize);
+    }
+    track->SetMCid(trs->fTrackID);
+    track->SetRowRange(trs->fRowRange1,trs->fRowRange2);
+    track->SetSector(slice);
+    track->SetPID(trs->fPID);
+#endif
     UChar_t *tmpP = (UChar_t*)trs;
     tmpP += sizeof(AliL3TrackSegmentData)+trs->fNPoints*sizeof(UInt_t);
     trs = (AliL3TrackSegmentData*)tmpP;
   }
 }
 
-UInt_t AliL3TrackArray::GetOutSize(){
+UInt_t AliL3TrackArray::GetOutSize()
+{
+  //get size for IO
   UInt_t count = GetOutCount();   //use only present tracks
   UInt_t tHits = 0;
   for(Int_t i=0;i<fNTracks;i++){  //loop over all tracks
@@ -225,13 +290,16 @@ UInt_t AliL3TrackArray::GetOutSize(){
   return count*sizeof(AliL3TrackSegmentData)+sizeof(UInt_t)*tHits;
 }
 
-UInt_t AliL3TrackArray::WriteTracks(UInt_t & ntracks,AliL3TrackSegmentData* tr){
+UInt_t AliL3TrackArray::WriteTracks(UInt_t & ntracks,AliL3TrackSegmentData* tr)
+{
+  //write tracks
   ntracks = GetOutCount();
   return WriteTracks(tr);
 }
 
-UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr){
-  if(GetTrackType()=='c') return WriteConfMapTracks(tr);
+UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr)
+{
+  //if(GetTrackType()=='c') return WriteConfMapTracks(tr);
   AliL3TrackSegmentData *tP = tr;
   UInt_t *pP;
   UInt_t size = 0;
@@ -242,13 +310,30 @@ UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr){
     tP->fY = track->GetFirstPointY();
     tP->fZ = track->GetFirstPointZ();
     tP->fPt = track->GetPt();
+    tP->fPterr = track->GetPterr();
     tP->fLastX = track->GetLastPointX();
     tP->fLastY = track->GetLastPointY();
     tP->fLastZ = track->GetLastPointZ();
     tP->fPsi = track->GetPsi();
     tP->fTgl = track->GetTgl();
+    tP->fPsierr = track->GetPsierr();
+    tP->fTglerr = track->GetTglerr();
     tP->fCharge = track->GetCharge();
     tP->fNPoints = track->GetNHits();
+#ifdef ROWHOUGHPARAMS
+    if(GetTrackType()=='h') {
+      tP->fWeight = ((AliL3HoughTrack *)track)->GetWeight();
+      tP->fBinX = ((AliL3HoughTrack *)track)->GetBinX();
+      tP->fBinY = ((AliL3HoughTrack *)track)->GetBinY();
+      tP->fBinXSize = ((AliL3HoughTrack *)track)->GetSizeX();
+      tP->fBinYSize = ((AliL3HoughTrack *)track)->GetSizeY();
+    }
+    tP->fTrackID = track->GetMCid();
+    tP->fRowRange1 = track->GetFirstRow();
+    tP->fRowRange2 = track->GetLastRow();
+    tP->fSector = track->GetSector();
+    tP->fPID = track->GetPID();
+#endif
     pP = (UInt_t*)track->GetHitNumbers();
     for (UInt_t j=0;j<tP->fNPoints;j++){
       tP->fPointIDs[j] = pP[j];
@@ -261,7 +346,8 @@ UInt_t AliL3TrackArray::WriteTracks(AliL3TrackSegmentData* tr){
   return size;
 }
 
-UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
+UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr)
+{
   // use first and last point objects
   AliL3TrackSegmentData *tP = tr;
   UInt_t *pP;
@@ -269,8 +355,8 @@ UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
   for(Int_t i=0; i<fNTracks; i++){  //loop over all tracks
     AliL3ConfMapTrack *track =(AliL3ConfMapTrack *) GetCheckedTrack(i); //use only present tracks
     if(!track) continue;                           //use only present tracks
-    AliL3ConfMapPoint *hit = (AliL3ConfMapPoint*)track->lastHit;
-    AliL3ConfMapPoint *lastHit = (AliL3ConfMapPoint*)track->firstHit;
+    AliL3ConfMapPoint *hit = (AliL3ConfMapPoint*)track->GetLastHit();
+    AliL3ConfMapPoint *lastHit = (AliL3ConfMapPoint*)track->GetFirstHit();
     tP->fX = hit->GetX();
     tP->fY = hit->GetY();
     tP->fZ = hit->GetZ();
@@ -282,12 +368,22 @@ UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
 //    tP->fY = track->GetFirstPointY();
 //    tP->fZ = track->GetFirstPointZ();
     tP->fPt = track->GetPt();
+    tP->fPterr = track->GetPterr();
 //    tP->fLastX = track->GetLastPointX();
 //    tP->fLastY = track->GetLastPointY();
 //    tP->fLastZ = track->GetLastPointZ();
     tP->fPsi = track->GetPsi();
     tP->fTgl = track->GetTgl();
+    tP->fPsierr = track->GetPsierr();
+    tP->fTglerr = track->GetTglerr();
     tP->fCharge = track->GetCharge();
+#ifdef ROWHOUGHPARAMS
+    tP->fTrackID = track->GetMCid();
+    tP->fRowRange1 = track->GetFirstRow();
+    tP->fRowRange2 = track->GetLastRow();
+    tP->fSector = track->GetSector();
+    tP->fPID = track->GetPID();
+#endif
     tP->fNPoints = track->GetNHits();
     pP = (UInt_t*)track->GetHitNumbers();
     for (UInt_t j=0;j<tP->fNPoints;j++){
@@ -303,13 +399,15 @@ UInt_t AliL3TrackArray::WriteConfMapTracks(AliL3TrackSegmentData* tr){
 
 void AliL3TrackArray::AddLast(AliL3Track *track)
 {
+  //add track to last position
   AliL3Track *tpt = NextTrack();
   tpt->Set(track);
   
 }
 
-
-void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old){
+void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old,Int_t slice)
+{
+  //add tracks
   if(GetTrackType() != newtrack->GetTrackType() && GetTrackType()!='t')
     {
       LOG(AliL3Log::kError,"AliL3TrackArray::AddTracks","Track types")
@@ -325,6 +423,8 @@ void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old){
       newtrack->Remove(i);
     AliL3Track *track = NextTrack();
     track->Set(tpt);
+    if(slice>=0)
+      track->Rotate(slice); //Rotate track to global coordinates
     /*
       AliL3Track *track;
       if(GetTrackType()=='h')
@@ -336,8 +436,9 @@ void AliL3TrackArray::AddTracks(AliL3TrackArray *newtrack,Bool_t remove_old){
   }
 }
 
-
-void AliL3TrackArray::Compress(){
+void AliL3TrackArray::Compress()
+{
+  //compress array
   if(GetNPresent()==GetNTracks()) return;
   AliL3Track **tmp =  new AliL3Track *[fNTracks];
   Int_t present=0;
@@ -360,14 +461,15 @@ void AliL3TrackArray::Compress(){
   fNAbsent = 0;
 }
 
-void AliL3TrackArray::QSort(){
-  // compress an sort
+void AliL3TrackArray::QSort()
+{
+  // compress and sort
   Compress();
   QSort(fTrack,0,fNTracks);
 }
 
-void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last){
-
+void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last)
+{
    // Sort array of AliL3Track pointers using a quicksort algorithm.
    // Uses TrackCompare() to compare objects.
    // Thanks to Root! 
@@ -408,7 +510,8 @@ void AliL3TrackArray::QSort( AliL3Track **a, Int_t first, Int_t last){
    }
 }
 
-Int_t AliL3TrackArray::TrackCompare(AliL3Track *a, AliL3Track *b){
+Int_t AliL3TrackArray::TrackCompare(AliL3Track *a, AliL3Track *b) const
+{
    // Compare the two tracks.
   
   return b->Compare(a);