Line data Source code
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 0 : 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 0 : if ( iThread == 0 ) {
52 0 : s.fNRows = tracker.Param().NRows();
53 0 : s.fIRow = iBlock;
54 0 : if ( s.fIRow < s.fNRows ) {
55 : #ifdef HLTCA_GPUCODE
56 : GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
57 : #else
58 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
59 : #endif
60 0 : s.fNHits = row.NHits();
61 :
62 0 : if ( ( s.fIRow >= 2 ) && ( s.fIRow <= s.fNRows - 3 ) ) {
63 0 : s.fIRowUp = s.fIRow + 2;
64 0 : 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 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
73 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
74 : #endif
75 : // the axis perpendicular to the rows
76 0 : const float xDn = rowDn.X();
77 0 : const float x = row.X();
78 0 : const float xUp = rowUp.X();
79 :
80 : // number of hits in rows above and below
81 0 : s.fUpNHits = tracker.Row( s.fIRowUp ).NHits();
82 0 : s.fDnNHits = tracker.Row( s.fIRowDn ).NHits();
83 :
84 : // distance of the rows (absolute and relative)
85 0 : s.fUpDx = xUp - x;
86 0 : s.fDnDx = xDn - x;
87 0 : s.fUpTx = xUp / x;
88 0 : 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 0 : }
95 0 : }
96 : }
97 0 : } else if ( iSync == 1 ) {
98 0 : if ( s.fIRow < s.fNRows ) {
99 0 : 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 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
104 : #endif
105 0 : for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
106 0 : tracker.SetHitLinkUpData( row, ih, -1 );
107 0 : tracker.SetHitLinkDownData( row, ih, -1 );
108 : }
109 0 : } 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 0 : } else if ( iSync == 2 ) {
127 :
128 : #ifdef HLTCA_GPUCODE
129 : if ( ( iBlock <= 1 ) || ( iBlock >= s.fNRows - 2 ) ) return;
130 : #else
131 0 : if ( ( s.fIRow <= 1 ) || ( s.fIRow >= s.fNRows - 2 ) ) return;
132 : #endif
133 :
134 0 : float chi2Cut = 3.*3.*4 * ( s.fUpDx * s.fUpDx + s.fDnDx * s.fDnDx );
135 0 : 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 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
145 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
146 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
147 : #endif
148 0 : const float y0 = row.Grid().YMin();
149 0 : const float z0 = row.Grid().ZMin();
150 0 : const float stepY = row.HstepY();
151 0 : const float stepZ = row.HstepZ();
152 :
153 0 : for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
154 :
155 : int linkUp = -1;
156 : int linkDn = -1;
157 :
158 0 : 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 0 : const float y = y0 + tracker.HitDataY( row, ih ) * stepY;
169 0 : const float z = z0 + tracker.HitDataZ( row, ih ) * stepZ;
170 : #endif
171 :
172 : #if ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
173 0 : GPUsharedref() unsigned short *neighUp = s.fB[iThread];
174 0 : 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 0 : AliHLTTPCCAHitArea areaDn, areaUp;
186 0 : areaUp.Init( rowUp, tracker.Data(), y*s.fUpTx, z*s.fUpTx, kAreaSize, kAreaSize );
187 0 : areaDn.Init( rowDn, tracker.Data(), y*s.fDnTx, z*s.fDnTx, kAreaSize, kAreaSize );
188 :
189 0 : do {
190 0 : AliHLTTPCCAHit h;
191 0 : int i = areaUp.GetNext( tracker, rowUp, tracker.Data(), &h );
192 0 : 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 0 : neighUp[nNeighUp] = ( unsigned short ) i;
203 0 : yzUp[nNeighUp] = CAMath::MakeFloat2( s.fDnDx * ( h.Y() - y ), s.fDnDx * ( h.Z() - z ) );
204 : }
205 0 : if ( ++nNeighUp >= kMaxN ) break;
206 0 : } while ( 1 );
207 :
208 : int nNeighDn = 0;
209 :
210 0 : if ( nNeighUp > 0 ) {
211 :
212 : int bestDn = -1, bestUp = -1;
213 : float bestD = 1.e10;
214 :
215 0 : do {
216 0 : AliHLTTPCCAHit h;
217 0 : int i = areaDn.GetNext( tracker, rowDn, tracker.Data(), &h );
218 0 : if ( i < 0 ) break;
219 :
220 0 : nNeighDn++;
221 0 : float2 yzdn = CAMath::MakeFloat2( s.fUpDx * ( h.Y() - y ), s.fUpDx * ( h.Z() - z ) );
222 :
223 0 : 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 0 : float2 yzup = yzUp[iUp];
228 : #endif
229 :
230 0 : float dy = yzdn.x - yzup.x;
231 0 : float dz = yzdn.y - yzup.y;
232 0 : float d = dy * dy + dz * dz;
233 0 : if ( d < bestD ) {
234 : bestD = d;
235 : bestDn = i;
236 : bestUp = iUp;
237 0 : }
238 : }
239 0 : } while ( 1 );
240 :
241 0 : 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 0 : linkUp = neighUp[bestUp];
246 : #endif
247 : linkDn = bestDn;
248 0 : }
249 0 : }
250 : #ifdef DRAW
251 : std::cout << "n NeighUp = " << nNeighUp << ", n NeighDn = " << nNeighDn << std::endl;
252 : #endif //DRAW
253 0 : }
254 :
255 0 : tracker.SetHitLinkUpData( row, ih, linkUp );
256 0 : 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 0 : }
267 0 : }
268 :
|