26 const size_t tsize =
sizeof(T);
27 unsigned int lastBin = 0;
29 while ( lastBin+1 < num ) {
30 unsigned int l = lastBin + 1;
31 l = lastBin + l + 1 > num ? num - lastBin - 1 : l;
32 memcpy( dest + lastBin + 1, dest, l*tsize );
49 fN(0), fNy(0), fNz(0), fYMinOverStep(0.), fZMinOverStep(0.),
50 fStepYInv(0.), fStepZInv(0.), fFirstHitInBin(NULL){}
52 ~L1Grid(){
if ( fFirstHitInBin )
delete[] fFirstHitInBin; }
54 void Create(
float yMin,
float yMax,
float zMin,
float zMax,
float sy,
float sz );
57 int GetBin(
float Y,
float Z )
const;
59 unsigned int GetBinBounded(
const float &Y,
const float &Z )
const;
60 void GetBinBounded(
const float &Y,
const float &Z,
unsigned short *bY,
unsigned short *bZ )
const;
61 void GetBinBounds(
unsigned int iBin,
float &Ymin,
float &Ymax,
float &Zmin,
float &Zmax)
const;
63 unsigned int N()
const {
return fN; }
64 unsigned short Ny()
const {
return fNy; }
65 unsigned short Nz()
const {
return fNz; }
79 THitI* fFirstHitInBin;
89 unsigned short yBin, zBin;
91 return (
unsigned int)zBin * (
unsigned int)fNy + (
unsigned int)yBin;
94inline void L1Grid::GetBinBounded(
const float &Y,
const float &Z,
unsigned short *bY,
unsigned short *bZ )
const
96 const float &yBin = ( Y * fStepYInv - fYMinOverStep );
97 const float &zBin = ( Z * fStepZInv - fZMinOverStep );
99 *bY =
max( 0.f,
min(
float( fNy - 1 ), yBin ) );
100 *bZ =
max( 0.f,
min(
float( fNz - 1 ), zBin ) );
103inline void L1Grid::Create(
float yMin,
float yMax,
float zMin,
float zMax,
float sy,
float sz )
106 fStepYInv = 1.f / sy;
107 fStepZInv = 1.f / sz;
109 fYMinOverStep = yMin * fStepYInv;
110 fZMinOverStep = zMin * fStepZInv;
112 fNy =
static_cast<unsigned short>( yMax * fStepYInv - fYMinOverStep + 1.f );
113 fNz =
static_cast<unsigned short>( zMax * fStepZInv - fZMinOverStep + 1.f );
115 unsigned int Nold = fN;
118 if (Nold < fN || Nold == 0) {
119 delete[] fFirstHitInBin;
120 fFirstHitInBin =
new THitI[fN+1];
126 unsigned int lastBin = 0;
127 fFirstHitInBin[lastBin] = 0;
129 const unsigned int currBin =
GetBinBounded(points[
i].Xs(), points[
i].Ys());
131 memset( fFirstHitInBin + lastBin + 1,
i, currBin - lastBin );
134 memset( fFirstHitInBin + lastBin + 1, n, fN - lastBin );
142 const int yBin =
static_cast<int>( Y * fStepYInv - fYMinOverStep );
143 const int zBin =
static_cast<int>( Z * fStepZInv - fZMinOverStep );
146 assert( yBin <
static_cast<int>( fNy ) );
147 assert( zBin <
static_cast<int>( fNz ) );
148 const int bin = zBin * fNy + yBin;
154 int zBin = iBin / fNy;
155 int yBin = iBin % fNy;
156 Ymin = (fYMinOverStep + yBin)/fStepYInv;
157 Zmin = (fZMinOverStep + zBin)/fStepZInv;
158 Ymax = Ymin + 1. / fStepYInv;
159 Zmax = Zmin + 1. / fStepZInv;
void memset(T *dest, T i, size_t num)
uses binary expansion of copied volume for speed up
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
void Create(float yMin, float yMax, float zMin, float zMax, float sy, float sz)
THitI FirstHitInBin(int i) const
unsigned short Nz() const
unsigned int GetBinBounded(const float &Y, const float &Z) const
int GetBin(float Y, float Z) const
void GetBinBounds(unsigned int iBin, float &Ymin, float &Ymax, float &Zmin, float &Zmax) const
void Fill(const L1HitPoint *points, THitI n)
unsigned short Ny() const
contain strips positions and coordinates of hit