]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCAGrid.cxx
Completely reworked version of TPC CA tracker (Sergey)
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCAGrid.cxx
index 571c85dbc5c6ed02be282ed39761944c202e9ca0..aeb886ef33f361dbc5477d0e8da4515ad4efa06f 100644 (file)
 //***************************************************************************
 
 #include "AliHLTTPCCAGrid.h"
-#include "TMath.h"
+#include "AliHLTTPCCAMath.h"
 
-AliHLTTPCCAGrid::AliHLTTPCCAGrid(const AliHLTTPCCAGrid&)
-  :fGrid(0),fNy(0),fNz(0),fN(0),
-   fYMin(0),fYMax(0),fZMin(0),fZMax(0),fStepYInv(0),fStepZInv(0)
+GPUd() void AliHLTTPCCAGrid::Create( Float_t yMin, Float_t yMax, Float_t zMin, Float_t zMax, UInt_t n )
 {
-  //* dummy
+  //* Create the grid
+  
+  fYMin = CAMath::Min(yMin,yMax);
+  fYMax = CAMath::Max(yMin,yMax);
+  fZMin = CAMath::Min(zMin,zMax);
+  fZMax = CAMath::Max(zMin,zMax);
+  fNy = (UInt_t) CAMath::Sqrt( CAMath::Abs( (Float_t) n ) );
+  fNy = CAMath::Max(fNy,1);
+  fNz = fNy;
+  fN = fNy*fNz;
+  fStepYInv = (fYMax - fYMin);
+  fStepZInv = (fZMax - fZMin);
+  Int_t ky = (fNy>1) ?fNy-1 :1;
+  Int_t kz = (fNz>1) ?fNz-1 :1;
+  fStepYInv =  ( fStepYInv>1.e-4 ) ?ky/fStepYInv :1;
+  fStepZInv =  ( fStepZInv>1.e-4 ) ?kz/fStepZInv :1;
 }
 
-AliHLTTPCCAGrid& AliHLTTPCCAGrid::operator=(const AliHLTTPCCAGrid&)
+GPUd() void AliHLTTPCCAGrid::Create( Float_t yMin, Float_t yMax, Float_t zMin, Float_t zMax, float_t sy, Float_t sz )
 {
-  //* dummy
-  return *this;
+  //* Create the grid
+  
+  fYMin = CAMath::Min(yMin,yMax);
+  fYMax = CAMath::Max(yMin,yMax);
+  fZMin = CAMath::Min(zMin,zMax);
+  fZMax = CAMath::Max(zMin,zMax);
+  fStepYInv = 1./sy;
+  fStepZInv = 1./sz;
+
+  fNy = (UInt_t) ( (fYMax - fYMin)*fStepYInv + 1 );
+  fNz = (UInt_t) ( (fZMax - fZMin)*fStepZInv + 1 );
+  fYMax = fYMin + fNy*sy; 
+  fZMax = fZMin + fNz*sz; 
+  fN = fNy*fNz;
 }
 
-void AliHLTTPCCAGrid::Create( Float_t yMin, Float_t yMax, Float_t zMin, Float_t zMax, Int_t n )
+GPUd() UInt_t AliHLTTPCCAGrid::GetBin( Float_t Y, Float_t Z ) const
 {
-  //* Create the grid
+  //* get the bin pointer
   
-  fYMin = TMath::Min(yMin,yMax);
-  fYMax = TMath::Max(yMin,yMax);
-  fZMin = TMath::Min(zMin,zMax);
-  fZMax = TMath::Max(zMin,zMax);
-  fNy = fNz = (Int_t) TMath::Sqrt( (Float_t) n );
-  fNy = TMath::Max(fNy,1);
-  fNz = TMath::Max(fNz,1);
-  fN = fNy*fNz;
-  if( fGrid ) delete[] fGrid;
-  fGrid = new void*[fN];
-  for( Int_t i=0; i<fN; i++ ) fGrid[i] = 0;
-  fStepYInv = (fYMax - fYMin);
-  fStepZInv = (fZMax - fZMin);
-  fStepYInv =  ( fStepYInv>1.e-4 ) ?(fNy-1)/fStepYInv :0;
-  fStepZInv =  ( fStepZInv>1.e-4 ) ?(fNz-1)/fStepZInv :0;
+  Int_t yBin = (Int_t) CAMath::fmul_rz( Y-fYMin, fStepYInv );
+  Int_t zBin = (Int_t) CAMath::fmul_rz( Z-fZMin, fStepZInv );
+  Int_t bin = CAMath::mul24(zBin,fNy) + yBin;    
+  if( bin<0 ) return 0;
+  if( bin>=(Int_t) fN ) return fN - 1;  
+  return (UInt_t) bin;
 }
 
-void **AliHLTTPCCAGrid::Get( Float_t Y, Float_t Z ) const
+GPUd() void AliHLTTPCCAGrid::GetBin( Float_t Y, Float_t Z, UInt_t &bY, UInt_t &bZ ) const
 {
   //* get the bin pointer
 
-  Int_t yBin = (Int_t) ( (Y-fYMin)*fStepYInv );
-  Int_t zBin = (Int_t) ( (Z-fZMin)*fStepZInv );
-  if( yBin<0 ) yBin = 0;
-  else if( yBin>=fNy ) yBin = fNy - 1;
-  if( zBin<0 ) zBin = 0;
-  else if( zBin>=fNz ) zBin = fNz - 1;
-  return fGrid + zBin*fNy + yBin;
+  Int_t bbY = (Int_t) ( (Y-fYMin)*fStepYInv );
+  Int_t bbZ = (Int_t) ( (Z-fZMin)*fStepZInv );  
+  
+  if( bbY<0 ) bbY = 0;
+  else if( bbY>=(Int_t)fNy ) bbY = fNy - 1;  
+  if( bbZ<0 ) bbZ = 0;
+  else if( bbZ>=(Int_t)fNz ) bbZ = fNz - 1;
+  bY = (UInt_t) bbY;
+  bZ = (UInt_t) bbZ;
 }