BmnRoot
Loading...
Searching...
No Matches
L1Grid.h
Go to the documentation of this file.
1//-*- Mode: C++ -*-
2// $Id: AliHLTTPCCAGrid.h,v 1.1.1.1 2010/07/26 20:55:38 ikulakov Exp $
3// ************************************************************************
4// This file is property of and copyright by the ALICE HLT Project *
5// ALICE Experiment at CERN, All rights reserved. *
6// See cxx source for full Copyright notice *
7// *
8//*************************************************************************
9
10#ifndef L1GRID_H
11#define L1GRID_H
12
13#include "CbmL1Def.h"
14#include <algorithm>
15#include <string.h>
16
17#include <assert.h>
18#include <cstdio>
19
20using namespace std;
21
24template< typename T>
25void memset( T *dest, T i, size_t num ) {
26 const size_t tsize = sizeof(T);
27 unsigned int lastBin = 0;
28 dest[0] = i;
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 );
33 lastBin += l;
34 }
35}
36
37
46class L1Grid {
47 public:
49 fN(0), fNy(0), fNz(0), fYMinOverStep(0.), fZMinOverStep(0.),
50 fStepYInv(0.), fStepZInv(0.), fFirstHitInBin(NULL){}
51
52 ~L1Grid(){ if ( fFirstHitInBin ) delete[] fFirstHitInBin; }
53
54 void Create( float yMin, float yMax, float zMin, float zMax, float sy, float sz );
55 void Fill( const L1HitPoint* points, THitI n ); // call after sort
56
57 int GetBin( float Y, float Z ) const;
58
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;
62
63 unsigned int N() const { return fN; }
64 unsigned short Ny() const { return fNy; }
65 unsigned short Nz() const { return fNz; }
66
67 THitI FirstHitInBin(int i) const { return fFirstHitInBin[i]; }
68
69 private:
70
71 unsigned int fN; //* total N bins
72 unsigned short fNy; //* N bins in Y
73 unsigned short fNz; //* N bins in Z
74 float fYMinOverStep; //* minimal Y value * fStepYInv
75 float fZMinOverStep; //* minimal Z value * fStepZInv
76 float fStepYInv; //* inverse bin size in Y
77 float fStepZInv; //* inverse bin size in Z
78
79 THitI* fFirstHitInBin;
80
81 L1Grid(const L1Grid&);
82 L1Grid& operator=(const L1Grid&);
83};
84
85inline unsigned int L1Grid::GetBinBounded( const float &Y, const float &Z ) const
86{
87 //* get the bin pointer
88
89 unsigned short yBin, zBin;
90 GetBinBounded( Y, Z, &yBin, &zBin );
91 return (unsigned int)zBin * (unsigned int)fNy + (unsigned int)yBin;
92}
93
94inline void L1Grid::GetBinBounded( const float &Y, const float &Z, unsigned short *bY, unsigned short *bZ ) const
95{
96 const float &yBin = ( Y * fStepYInv - fYMinOverStep );
97 const float &zBin = ( Z * fStepZInv - fZMinOverStep );
98
99 *bY = max( 0.f, min( float( fNy - 1 ), yBin ) );
100 *bZ = max( 0.f, min( float( fNz - 1 ), zBin ) );
101}
102
103inline void L1Grid::Create( float yMin, float yMax, float zMin, float zMax, float sy, float sz )
104{
105 //* Create the grid
106 fStepYInv = 1.f / sy;
107 fStepZInv = 1.f / sz;
108
109 fYMinOverStep = yMin * fStepYInv;
110 fZMinOverStep = zMin * fStepZInv;
111
112 fNy = static_cast<unsigned short>( yMax * fStepYInv - fYMinOverStep + 1.f );
113 fNz = static_cast<unsigned short>( zMax * fStepZInv - fZMinOverStep + 1.f );
114
115 unsigned int Nold = fN;
116 fN = fNy * fNz;
117
118 if (Nold < fN || Nold == 0) {
119 delete[] fFirstHitInBin;
120 fFirstHitInBin = new THitI[fN+1]; // one extra bin is needed by area to determine number of hits in the last bin
121 }
122}
123
124inline void L1Grid::Fill( const L1HitPoint* points, THitI n ) // call after sort
125{
126 unsigned int lastBin = 0;
127 fFirstHitInBin[lastBin] = 0;
128 for( THitI i = 0; i < n; i++ ) {
129 const unsigned int currBin = GetBinBounded(points[i].Xs(), points[i].Ys());
130 L1_assert( lastBin <= currBin );
131 memset( fFirstHitInBin + lastBin + 1, i, currBin - lastBin );
132 lastBin = currBin;
133 }
134 memset( fFirstHitInBin + lastBin + 1, n, fN - lastBin );
135 // for( THitI i = 0; i < fN+1; i++ ) cout << fFirstHitInBin[i] << " ";
136 // cout << endl;
137}
138
139inline int L1Grid::GetBin( float Y, float Z ) const
140{
141 //* get the bin pointer
142 const int yBin = static_cast<int>( Y * fStepYInv - fYMinOverStep );
143 const int zBin = static_cast<int>( Z * fStepZInv - fZMinOverStep );
144 assert( yBin >= 0 );
145 assert( zBin >= 0 );
146 assert( yBin < static_cast<int>( fNy ) );
147 assert( zBin < static_cast<int>( fNz ) );
148 const int bin = zBin * fNy + yBin;
149 return bin;
150}
151
152inline void L1Grid::GetBinBounds( unsigned int iBin, float &Ymin, float &Ymax, float &Zmin, float &Zmax) const
153{
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;
160}
161
162#endif
#define L1_assert(v)
Definition CbmL1Def.h:50
void memset(T *dest, T i, size_t num)
uses binary expansion of copied volume for speed up
Definition L1Grid.h:25
unsigned int THitI
Definition L1StsHit.h:6
int i
Definition P4_F32vec4.h:22
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
Definition P4_F32vec4.h:30
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
Definition P4_F32vec4.h:31
void Create(float yMin, float yMax, float zMin, float zMax, float sy, float sz)
Definition L1Grid.h:103
unsigned int N() const
Definition L1Grid.h:63
THitI FirstHitInBin(int i) const
Definition L1Grid.h:67
~L1Grid()
Definition L1Grid.h:52
unsigned short Nz() const
Definition L1Grid.h:65
unsigned int GetBinBounded(const float &Y, const float &Z) const
Definition L1Grid.h:85
int GetBin(float Y, float Z) const
Definition L1Grid.h:139
void GetBinBounds(unsigned int iBin, float &Ymin, float &Ymax, float &Zmin, float &Zmax) const
Definition L1Grid.h:152
void Fill(const L1HitPoint *points, THitI n)
Definition L1Grid.h:124
L1Grid()
Definition L1Grid.h:48
unsigned short Ny() const
Definition L1Grid.h:64
STL namespace.
contain strips positions and coordinates of hit
Definition L1HitPoint.h:6