]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/TPCLib/tracking-ca/AliHLTTPCCANeighboursFinder.cxx
OpenCL version of the HLT tracker added (the new code is not used in standard compila...
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCANeighboursFinder.cxx
1 // @(#) $Id: AliHLTTPCCANeighboursFinder1.cxx 27042 2008-07-02 12:06:02Z richterm $
2 // **************************************************************************
3 // This file is property of and copyright by the ALICE HLT Project          *
4 // ALICE Experiment at CERN, All rights reserved.                           *
5 //                                                                          *
6 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
7 //                  Ivan Kisel <kisel@kip.uni-heidelberg.de>                *
8 //                  for The ALICE HLT Project.                              *
9 //                                                                          *
10 // Permission to use, copy, modify and distribute this software and its     *
11 // documentation strictly for non-commercial purposes is hereby granted     *
12 // without fee, provided that the above copyright notice appears in all     *
13 // copies and that both the copyright notice and this permission notice     *
14 // appear in the supporting documentation. The authors make no claims       *
15 // about the suitability of this software for any purpose. It is            *
16 // provided "as is" without express or implied warranty.                    *
17 //                                                                          *
18 //***************************************************************************
19
20 #include "AliHLTTPCCANeighboursFinder.h"
21 #include "AliHLTTPCCAMath.h"
22 #include "AliHLTTPCCAHitArea.h"
23 #include "AliHLTTPCCATracker.h"
24 #include "AliHLTTPCCAHit.h"
25
26 //#define DRAW
27
28 #ifdef DRAW
29 #include "AliHLTTPCCADisplay.h"
30 #endif //DRAW
31
32 GPUdi() void AliHLTTPCCANeighboursFinder::Thread
33 ( int /*nBlocks*/, int nThreads, int iBlock, int iThread, int iSync,
34   GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &s, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker )
35 {
36   //* find neighbours
37
38   if ( iSync == 0 ) {
39 #ifdef HLTCA_GPUCODE
40         for (int i = iThread;i < sizeof(MEM_PLAIN(AliHLTTPCCARow)) / sizeof(int);i += nThreads)
41         {
42                 reinterpret_cast<GPUsharedref() int*>(&s.fRow)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock])[i];
43                 if (iBlock >= 2 && iBlock <= tracker.Param().NRows() - 3)
44                 {
45                         reinterpret_cast<GPUsharedref() int*>(&s.fRowUp)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock + 2])[i];
46                         reinterpret_cast<GPUsharedref() int*>(&s.fRowDown)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock - 2])[i];
47                 }
48         }
49         GPUsync();
50 #endif
51     if ( iThread == 0 ) {
52       s.fNRows = tracker.Param().NRows();
53       s.fIRow = iBlock;
54       if ( s.fIRow < s.fNRows ) {
55 #ifdef HLTCA_GPUCODE
56                 GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
57 #else
58                 GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
59 #endif
60         s.fNHits = row.NHits();
61
62         if ( ( s.fIRow >= 2 ) && ( s.fIRow <= s.fNRows - 3 ) ) {
63           s.fIRowUp = s.fIRow + 2;
64           s.fIRowDn = s.fIRow - 2;
65
66           // references to the rows above and below
67
68 #ifdef HLTCA_GPUCODE
69           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowUp = s.fRowUp;
70           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowDn = s.fRowDown;
71 #else
72           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
73           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
74 #endif
75           // the axis perpendicular to the rows
76           const float xDn = rowDn.X();
77           const float x   = row.X();
78           const float xUp = rowUp.X();
79
80           // number of hits in rows above and below
81           s.fUpNHits = tracker.Row( s.fIRowUp ).NHits();
82           s.fDnNHits = tracker.Row( s.fIRowDn ).NHits();
83
84           // distance of the rows (absolute and relative)
85           s.fUpDx = xUp - x;
86           s.fDnDx = xDn - x;
87           s.fUpTx = xUp / x;
88           s.fDnTx = xDn / x;
89           // UpTx/DnTx is used to move the HitArea such that central events are preferred (i.e. vertices
90           // coming from y = 0, z = 0).
91
92           //s.fGridUp = tracker.Row( s.fIRowUp ).Grid();
93           //s.fGridDn = tracker.Row( s.fIRowDn ).Grid();
94         }
95       }
96     }
97   } else if ( iSync == 1 ) {
98     if ( s.fIRow < s.fNRows ) {
99       if ( ( s.fIRow <= 1 ) || ( s.fIRow >= s.fNRows - 2 ) ) {
100 #ifdef HLTCA_GPUCODE
101                 GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
102 #else
103                 GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
104 #endif
105         for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
106           tracker.SetHitLinkUpData( row, ih, -1 );
107           tracker.SetHitLinkDownData( row, ih, -1 );
108         }
109       } else {
110 /*#ifdef HLTCA_GPUCODE
111           const AliHLTTPCCARow &rowUp = s.fRowUp;
112           const AliHLTTPCCARow &rowDn = s.fRowDown;
113 #else
114           const AliHLTTPCCARow &rowUp = tracker.Row( s.fIRowUp );
115           const AliHLTTPCCARow &rowDn = tracker.Row( s.fIRowDn );
116 #endif
117
118         for ( unsigned int ih = iThread; ih < s.fGridUp.N() + s.fGridUp.Ny() + 2; ih += nThreads ) {
119           s.fGridContentUp[ih] = tracker.FirstHitInBin( rowUp, ih );
120         }
121         for ( unsigned int ih = iThread; ih < s.fGridDn.N() + s.fGridDn.Ny() + 2; ih += nThreads ) {
122           s.fGridContentDn[ih] = tracker.FirstHitInBin( rowDn, ih );
123         }*/
124       }
125     }
126   } else if ( iSync == 2 ) {
127
128 #ifdef HLTCA_GPUCODE
129     if ( ( iBlock <= 1 ) || ( iBlock >= s.fNRows - 2 ) ) return;
130 #else
131     if ( ( s.fIRow <= 1 ) || ( s.fIRow >= s.fNRows - 2 ) ) return;
132 #endif
133
134     float chi2Cut = 3.*3.*4 * ( s.fUpDx * s.fUpDx + s.fDnDx * s.fDnDx );
135     const float kAreaSize = tracker.Param().NeighboursSearchArea();
136     //float chi2Cut = 3.*3.*(s.fUpDx*s.fUpDx + s.fDnDx*s.fDnDx ); //SG
137 #define kMaxN 20
138
139 #ifdef HLTCA_GPUCODE
140                   GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
141           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowUp = s.fRowUp;
142           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowDn = s.fRowDown;
143 #else
144                   GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
145                   GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
146           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
147 #endif
148     const float y0 = row.Grid().YMin();
149     const float z0 = row.Grid().ZMin();
150     const float stepY = row.HstepY();
151     const float stepZ = row.HstepZ();
152
153         for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
154
155       int linkUp = -1;
156       int linkDn = -1;
157
158       if ( s.fDnNHits > 0 && s.fUpNHits > 0 ) {
159
160        
161
162         // coordinates of the hit in the current row
163 #if defined(HLTCA_GPU_TEXTURE_FETCHa)
164                 ushort2 tmpval = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + ih);
165         const float y = y0 + tmpval.x * stepY;
166         const float z = z0 + tmpval.y * stepZ;
167 #else
168         const float y = y0 + tracker.HitDataY( row, ih ) * stepY;
169         const float z = z0 + tracker.HitDataZ( row, ih ) * stepZ;
170 #endif
171
172 #if ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
173       GPUsharedref() unsigned short *neighUp = s.fB[iThread];
174       GPUsharedref() float2 *yzUp = s.fA[iThread];
175 #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP
176           unsigned short neighUp2[kMaxN - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP];
177           float2 yzUp2[kMaxN - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP];
178 #endif
179 #else
180       unsigned short neighUp[kMaxN];
181       float2 yzUp[kMaxN];
182 #endif //ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
183
184                 int nNeighUp = 0;
185         AliHLTTPCCAHitArea areaDn, areaUp;
186         areaUp.Init( rowUp, tracker.Data(), y*s.fUpTx, z*s.fUpTx, kAreaSize, kAreaSize );
187         areaDn.Init( rowDn, tracker.Data(), y*s.fDnTx, z*s.fDnTx, kAreaSize, kAreaSize );
188
189         do {
190           AliHLTTPCCAHit h;
191           int i = areaUp.GetNext( tracker, rowUp, tracker.Data(), &h );
192           if ( i < 0 ) break;
193 #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
194                   if (nNeighUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP)
195                   {
196                         neighUp2[nNeighUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] = ( unsigned short ) i;
197                         yzUp2[nNeighUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] = CAMath::MakeFloat2( s.fDnDx * ( h.Y() - y ), s.fDnDx * ( h.Z() - z ) );
198                   }
199                   else
200 #endif
201                   {
202                         neighUp[nNeighUp] = ( unsigned short ) i;
203                         yzUp[nNeighUp] = CAMath::MakeFloat2( s.fDnDx * ( h.Y() - y ), s.fDnDx * ( h.Z() - z ) );
204                   }
205           if ( ++nNeighUp >= kMaxN ) break;
206         } while ( 1 );
207
208         int nNeighDn = 0;
209
210         if ( nNeighUp > 0 ) {
211
212           int bestDn = -1, bestUp = -1;
213           float bestD = 1.e10;
214
215           do {
216             AliHLTTPCCAHit h;
217             int i = areaDn.GetNext( tracker, rowDn, tracker.Data(), &h );
218             if ( i < 0 ) break;
219
220             nNeighDn++;
221             float2 yzdn = CAMath::MakeFloat2( s.fUpDx * ( h.Y() - y ), s.fUpDx * ( h.Z() - z ) );
222
223             for ( int iUp = 0; iUp < nNeighUp; iUp++ ) {
224 #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
225                           float2 yzup = iUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP ? yzUp2[iUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] : yzUp[iUp];
226 #else
227               float2 yzup = yzUp[iUp];
228 #endif
229
230               float dy = yzdn.x - yzup.x;
231               float dz = yzdn.y - yzup.y;
232               float d = dy * dy + dz * dz;
233               if ( d < bestD ) {
234                 bestD = d;
235                 bestDn = i;
236                 bestUp = iUp;
237               }
238             }
239           } while ( 1 );
240
241           if ( bestD <= chi2Cut ) {
242 #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
243                         linkUp = bestUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP ? neighUp2[bestUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] : neighUp[bestUp];
244 #else
245             linkUp = neighUp[bestUp];
246 #endif
247             linkDn = bestDn;
248           }
249         }
250 #ifdef DRAW
251         std::cout << "n NeighUp = " << nNeighUp << ", n NeighDn = " << nNeighDn << std::endl;
252 #endif //DRAW
253       }
254
255       tracker.SetHitLinkUpData( row, ih, linkUp );
256       tracker.SetHitLinkDownData( row, ih, linkDn );
257 #ifdef DRAW
258       std::cout << "Links for row " << s.fIRow << ", hit " << ih << ": " << linkUp << " " << linkDn << std::endl;
259       if ( s.fIRow == 22 && ih == 5 ) {
260         AliHLTTPCCADisplay::Instance().DrawSliceLink( s.fIRow, ih, -1, -1, 1 );
261         AliHLTTPCCADisplay::Instance().DrawSliceHit( s.fIRow, ih, kBlue, 1. );
262         AliHLTTPCCADisplay::Instance().Ask();
263       }
264 #endif //DRAW
265     }
266   }
267 }
268