]>
Commit | Line | Data |
---|---|---|
00d07bcd | 1 | // @(#) $Id: AliHLTTPCCATrackletConstructor.cxx 27042 2008-07-02 12:06:02Z richterm $ |
ce565086 | 2 | // ************************************************************************** |
fbb9b71b | 3 | // This file is property of and copyright by the ALICE HLT Project * |
00d07bcd | 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. * | |
ce565086 | 17 | // * |
00d07bcd | 18 | //*************************************************************************** |
19 | ||
20 | #include "AliHLTTPCCATracker.h" | |
21 | #include "AliHLTTPCCATrackParam.h" | |
4687b8fc | 22 | #include "AliHLTTPCCATrackParam.h" |
00d07bcd | 23 | #include "AliHLTTPCCAGrid.h" |
00d07bcd | 24 | #include "AliHLTTPCCAMath.h" |
25 | #include "AliHLTTPCCADef.h" | |
ce565086 | 26 | #include "AliHLTTPCCATracklet.h" |
00d07bcd | 27 | #include "AliHLTTPCCATrackletConstructor.h" |
b22af1bf | 28 | #include "MemoryAssignmentHelpers.h" |
29 | ||
693d2443 | 30 | //#include "AliHLTTPCCAPerformance.h" |
31 | //#include "TH1D.h" | |
32 | ||
33 | //#define DRAW | |
34 | ||
35 | #ifdef DRAW | |
36 | #include "AliHLTTPCCADisplay.h" | |
31649d4b | 37 | #endif //DRAW |
00d07bcd | 38 | |
b22af1bf | 39 | #define kMaxRowGap 4 |
00d07bcd | 40 | |
b22af1bf | 41 | GPUd() void AliHLTTPCCATrackletConstructor::InitTracklet( AliHLTTPCCATrackParam &tParam ) |
00d07bcd | 42 | { |
73a33d2e | 43 | //Initialize Tracklet Parameters using default values |
44 | tParam.InitParam(); | |
00d07bcd | 45 | } |
46 | ||
fbb9b71b | 47 | GPUd() void AliHLTTPCCATrackletConstructor::ReadData |
b22af1bf | 48 | #ifndef HLTCA_GPU_PREFETCHDATA |
49 | ( int /*iThread*/, AliHLTTPCCASharedMemory& /*s*/, AliHLTTPCCAThreadMemory& /*r*/, AliHLTTPCCATracker& /*tracker*/, int /*iRow*/ ) | |
50 | { | |
51 | //Prefetch Data to shared memory | |
52 | #else | |
53 | ( int iThread, AliHLTTPCCASharedMemory& s, AliHLTTPCCAThreadMemory& r, AliHLTTPCCATracker& tracker, int iRow ) | |
fbb9b71b | 54 | { |
00d07bcd | 55 | // reconstruction of tracklets, read data step |
fbb9b71b | 56 | const AliHLTTPCCARow &row = tracker.Row( iRow ); |
b22af1bf | 57 | //bool jr = !r.fCurrentData; |
4acc2401 | 58 | |
59 | // copy hits, grid content and links | |
60 | ||
61 | // FIXME: inefficient copy | |
b22af1bf | 62 | //const int numberOfHitsAligned = NextMultipleOf<sizeof(HLTCA_GPU_ROWALIGNMENT) / sizeof(ushort_v)>(row.NHits()); |
63 | ||
64 | /* | |
65 | #ifdef HLTCA_GPU_REORDERHITDATA | |
4acc2401 | 66 | ushort2 *sMem1 = reinterpret_cast<ushort2 *>( s.fData[jr] ); |
b22af1bf | 67 | for ( int i = iThread; i < numberOfHitsAligned; i += TRACKLET_CONSTRUCTOR_NMEMTHREDS ) { |
4acc2401 | 68 | sMem1[i].x = tracker.HitDataY( row, i ); |
69 | sMem1[i].y = tracker.HitDataZ( row, i ); | |
70 | } | |
b22af1bf | 71 | #else |
72 | ushort_v *sMem1 = reinterpret_cast<ushort_v *>( s.fData[jr] ); | |
73 | for ( int i = iThread; i < numberOfHitsAligned; i += TRACKLET_CONSTRUCTOR_NMEMTHREDS ) { | |
74 | sMem1[i] = tracker.HitDataY( row, i ); | |
75 | } | |
76 | ||
77 | ushort_v *sMem1a = reinterpret_cast<ushort_v *>( s.fData[jr] ) + numberOfHitsAligned; | |
78 | for ( int i = iThread; i < numberOfHitsAligned; i += TRACKLET_CONSTRUCTOR_NMEMTHREDS ) { | |
79 | sMem1a[i] = tracker.HitDataZ( row, i ); | |
4acc2401 | 80 | } |
31649d4b | 81 | #endif //HLTCA_GPU_REORDERHITDATA |
4acc2401 | 82 | |
b22af1bf | 83 | short *sMem2 = reinterpret_cast<short *>( s.fData[jr] ) + 2 * numberOfHitsAligned; |
84 | for ( int i = iThread; i < numberOfHitsAligned; i += TRACKLET_CONSTRUCTOR_NMEMTHREDS ) { | |
85 | sMem2[i] = tracker.HitLinkUpData( row, i ); | |
86 | } | |
87 | ||
88 | unsigned short *sMem3 = reinterpret_cast<unsigned short *>( s.fData[jr] ) + 3 * numberOfHitsAligned; | |
4acc2401 | 89 | const int n = row.FullSize(); // + grid content size |
7be9b0d7 | 90 | for ( int i = iThread; i < n; i += TRACKLET_CONSTRUCTOR_NMEMTHREDS ) { |
4acc2401 | 91 | sMem3[i] = tracker.FirstHitInBin( row, i ); |
b22af1bf | 92 | }*/ |
93 | ||
94 | /*for (int k = 0;k < 2;k++) | |
95 | { | |
96 | HLTCA_GPU_ROWCOPY* sharedMem; | |
97 | const HLTCA_GPU_ROWCOPY* sourceMem; | |
98 | int copyCount; | |
99 | switch (k) | |
100 | { | |
101 | case 0: | |
102 | sourceMem = reinterpret_cast<const HLTCA_GPU_ROWCOPY *>( tracker.HitDataY(row) ); | |
103 | sharedMem = reinterpret_cast<HLTCA_GPU_ROWCOPY *> (reinterpret_cast<ushort_v *>( s.fData[jr] ) + k * numberOfHitsAligned); | |
104 | copyCount = numberOfHitsAligned * sizeof(ushort_v) / sizeof(HLTCA_GPU_ROWCOPY); | |
105 | break; | |
106 | case 1: | |
107 | sourceMem = reinterpret_cast<const HLTCA_GPU_ROWCOPY *>( tracker.HitDataZ(row) ); | |
108 | sharedMem = reinterpret_cast<HLTCA_GPU_ROWCOPY *> (reinterpret_cast<ushort_v *>( s.fData[jr] ) + k * numberOfHitsAligned); | |
109 | copyCount = numberOfHitsAligned * sizeof(ushort_v) / sizeof(HLTCA_GPU_ROWCOPY); | |
110 | break; | |
111 | case 2: | |
112 | sourceMem = reinterpret_cast<const HLTCA_GPU_ROWCOPY *>( tracker.HitLinkUpData(row) ); | |
113 | sharedMem = reinterpret_cast<HLTCA_GPU_ROWCOPY *> (reinterpret_cast<ushort_v *>( s.fData[jr] ) + k * numberOfHitsAligned); | |
114 | copyCount = numberOfHitsAligned * sizeof(ushort_v) / sizeof(HLTCA_GPU_ROWCOPY); | |
115 | break; | |
116 | case 1: | |
117 | sourceMem = reinterpret_cast<const HLTCA_GPU_ROWCOPY *>( tracker.FirstHitInBin(row) ); | |
118 | sharedMem = reinterpret_cast<HLTCA_GPU_ROWCOPY *> (reinterpret_cast<ushort_v *>( s.fData[jr] ) + k * numberOfHitsAligned); | |
119 | copyCount = NextMultipleOf<sizeof(HLTCA_GPU_ROWALIGNMENT) / sizeof(ushort_v)>(row.FullSize()) * sizeof(ushort_v) / sizeof(HLTCA_GPU_ROWCOPY); | |
120 | break; | |
121 | } | |
122 | for (int i = iThread;i < copyCount;i += TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
123 | { | |
124 | sharedMem[i] = sourceMem[i]; | |
125 | } | |
126 | }*/ | |
127 | ||
128 | for (unsigned int i = iThread;i < row.FullSize() * sizeof(ushort_v) / sizeof(HLTCA_GPU_ROWCOPY);i += TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
129 | { | |
130 | reinterpret_cast<HLTCA_GPU_ROWCOPY *> (reinterpret_cast<ushort_v *>( s.fData[!r.fCurrentData] ))[i] = reinterpret_cast<const HLTCA_GPU_ROWCOPY *>( tracker.FirstHitInBin(row) )[i]; | |
131 | } | |
132 | ||
133 | const HLTCA_GPU_ROWCOPY* const sourceMem = (const HLTCA_GPU_ROWCOPY *) &row; | |
134 | HLTCA_GPU_ROWCOPY* const sharedMem = reinterpret_cast<HLTCA_GPU_ROWCOPY *> ( &s.fRow[!r.fCurrentData] ); | |
135 | for (unsigned int i = iThread;i < sizeof(AliHLTTPCCARow) / sizeof(HLTCA_GPU_ROWCOPY);i += TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
136 | { | |
137 | sharedMem[i] = sourceMem[i]; | |
138 | } | |
31649d4b | 139 | #endif //!HLTCA_GPU_PREFETCHDATA |
00d07bcd | 140 | } |
141 | ||
142 | ||
fbb9b71b | 143 | GPUd() void AliHLTTPCCATrackletConstructor::StoreTracklet |
144 | ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/, | |
8566066c | 145 | AliHLTTPCCASharedMemory |
146 | #ifdef HLTCA_GPUCODE | |
147 | &s | |
148 | #else | |
149 | &/*s*/ | |
31649d4b | 150 | #endif //!HLTCA_GPUCODE |
8566066c | 151 | , AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam ) |
fbb9b71b | 152 | { |
00d07bcd | 153 | // reconstruction of tracklets, tracklet store step |
fbb9b71b | 154 | |
693d2443 | 155 | //AliHLTTPCCAPerformance::Instance().HNHitsPerTrackCand()->Fill(r.fNHits); |
156 | ||
fbb9b71b | 157 | do { |
693d2443 | 158 | { |
7be9b0d7 | 159 | //std::cout<<"tracklet to store: "<<r.fItr<<", nhits = "<<r.fNHits<<std::endl; |
693d2443 | 160 | } |
161 | ||
b22af1bf | 162 | if ( r.fNHits < TRACKLET_SELECTOR_MIN_HITS ) { |
00d07bcd | 163 | r.fNHits = 0; |
164 | break; | |
165 | } | |
ce565086 | 166 | |
fbb9b71b | 167 | if ( 0 ) { |
168 | if ( 1. / .5 < CAMath::Abs( tParam.QPt() ) ) { //SG!!! | |
169 | r.fNHits = 0; | |
170 | break; | |
ce565086 | 171 | } |
172 | } | |
fbb9b71b | 173 | |
174 | { | |
175 | bool ok = 1; | |
176 | const float *c = tParam.Cov(); | |
177 | for ( int i = 0; i < 15; i++ ) ok = ok && CAMath::Finite( c[i] ); | |
178 | for ( int i = 0; i < 5; i++ ) ok = ok && CAMath::Finite( tParam.Par()[i] ); | |
179 | ok = ok && ( tParam.X() > 50 ); | |
180 | ||
181 | if ( c[0] <= 0 || c[2] <= 0 || c[5] <= 0 || c[9] <= 0 || c[14] <= 0 ) ok = 0; | |
182 | ||
183 | if ( !ok ) { | |
184 | r.fNHits = 0; | |
185 | break; | |
00d07bcd | 186 | } |
fbb9b71b | 187 | } |
188 | } while ( 0 ); | |
189 | ||
190 | if ( !SAVE() ) return; | |
191 | ||
ce565086 | 192 | AliHLTTPCCATracklet &tracklet = tracker.Tracklets()[r.fItr]; |
193 | ||
fbb9b71b | 194 | tracklet.SetNHits( r.fNHits ); |
195 | ||
196 | if ( r.fNHits > 0 ) { | |
693d2443 | 197 | #ifdef DRAW |
fbb9b71b | 198 | if ( 0 ) { |
199 | std::cout << "store tracklet " << r.fItr << ", nhits = " << r.fNHits << std::endl; | |
200 | if ( AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kBlue, 1. ) ) { | |
201 | AliHLTTPCCADisplay::Instance().Ask(); | |
693d2443 | 202 | } |
203 | } | |
31649d4b | 204 | #endif //DRAW |
91794c67 | 205 | if ( CAMath::Abs( tParam.Par()[4] ) < 1.e-4 ) tParam.SetPar( 4, 1.e-4 ); |
b22af1bf | 206 | if (r.fStartRow < r.fFirstRow) r.fFirstRow = r.fStartRow; |
207 | tracklet.SetFirstRow( r.fFirstRow ); | |
ce565086 | 208 | tracklet.SetLastRow( r.fLastRow ); |
444e5682 | 209 | #ifdef HLTCA_GPUCODE |
73a33d2e | 210 | tracklet.SetParam( tParam.fParam ); |
444e5682 | 211 | #else |
212 | tracklet.SetParam( tParam.GetParam() ); | |
31649d4b | 213 | #endif //HLTCA_GPUCODE |
fbb9b71b | 214 | int w = ( r.fNHits << 16 ) + r.fItr; |
b22af1bf | 215 | for ( int iRow = r.fFirstRow; iRow <= r.fLastRow; iRow++ ) { |
216 | #ifdef EXTERN_ROW_HITS | |
217 | int ih = tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr]; | |
218 | #else | |
219 | int ih = tracklet.RowHit( iRow ); | |
31649d4b | 220 | #endif //EXTERN_ROW_HITS |
fbb9b71b | 221 | if ( ih >= 0 ) { |
b22af1bf | 222 | #if defined(HLTCA_GPUCODE) & !defined(HLTCA_GPU_PREFETCHDATA) & !defined(HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY) |
223 | tracker.MaximizeHitWeight( s.fRows[ iRow ], ih, w ); | |
224 | #else | |
225 | tracker.MaximizeHitWeight( tracker.Row( iRow ), ih, w ); | |
31649d4b | 226 | #endif //HLTCA_GPUCODE & !HLTCA_GPU_PREFETCHDATA & !HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY |
00d07bcd | 227 | } |
228 | } | |
fbb9b71b | 229 | } |
b22af1bf | 230 | |
00d07bcd | 231 | } |
232 | ||
233 | GPUd() void AliHLTTPCCATrackletConstructor::UpdateTracklet | |
fbb9b71b | 234 | ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/, |
8566066c | 235 | AliHLTTPCCASharedMemory |
236 | #ifdef HLTCA_GPUCODE | |
237 | &s | |
238 | #else | |
239 | &/*s*/ | |
31649d4b | 240 | #endif //HLTCA_GPUCODE |
8566066c | 241 | , AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam, int iRow ) |
fbb9b71b | 242 | { |
00d07bcd | 243 | // reconstruction of tracklets, tracklets update step |
244 | ||
693d2443 | 245 | //std::cout<<"Update tracklet: "<<r.fItr<<" "<<r.fGo<<" "<<r.fStage<<" "<<iRow<<std::endl; |
fbb9b71b | 246 | bool drawSearch = 0;//r.fItr==2; |
247 | bool drawFit = 0;//r.fItr==2; | |
248 | bool drawFitted = drawFit ;//|| 1;//r.fItr==16; | |
693d2443 | 249 | |
fbb9b71b | 250 | if ( !r.fGo ) return; |
251 | ||
b22af1bf | 252 | #ifndef EXTERN_ROW_HITS |
ce565086 | 253 | AliHLTTPCCATracklet &tracklet = tracker.Tracklets()[r.fItr]; |
31649d4b | 254 | #endif //EXTERN_ROW_HITS |
ce565086 | 255 | |
b22af1bf | 256 | #ifdef HLTCA_GPU_PREFETCHDATA |
257 | const AliHLTTPCCARow &row = s.fRow[r.fCurrentData]; | |
258 | #elif defined(HLTCA_GPUCODE) | |
259 | const AliHLTTPCCARow &row = s.fRows[iRow]; | |
260 | #else | |
fbb9b71b | 261 | const AliHLTTPCCARow &row = tracker.Row( iRow ); |
31649d4b | 262 | #endif //HLTCA_GPU_PREFETCHDATA |
fbb9b71b | 263 | |
264 | float y0 = row.Grid().YMin(); | |
265 | float stepY = row.HstepY(); | |
266 | float z0 = row.Grid().ZMin(); | |
267 | float stepZ = row.HstepZ(); | |
268 | float stepYi = row.HstepYi(); | |
269 | float stepZi = row.HstepZi(); | |
270 | ||
271 | if ( r.fStage == 0 ) { // fitting part | |
272 | do { | |
273 | ||
274 | if ( iRow < r.fStartRow || r.fCurrIH < 0 ) break; | |
275 | ||
b22af1bf | 276 | if ( ( iRow - r.fStartRow ) % 2 != 0 ) |
277 | { | |
278 | #ifndef EXTERN_ROW_HITS | |
279 | tracklet.SetRowHit(iRow, -1); | |
280 | #else | |
281 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 282 | #endif //EXTERN_ROW_HITS |
b22af1bf | 283 | break; // SG!!! - jump over the row |
284 | } | |
285 | ||
286 | //#ifdef HLTCA_GPU_PREFETCHDATA | |
287 | // uint4 *tmpint4 = s.fData[r.fCurrentData]; | |
288 | //#endif | |
289 | ushort2 hh; | |
290 | //#ifdef HLTCA_GPU_REORDERHITDATA | |
291 | // hh = reinterpret_cast<ushort2*>( tmpint4 )[r.fCurrIH]; | |
292 | //#else | |
293 | //#ifdef HLTCA_GPU_PREFETCHDATA | |
294 | // hh.x = reinterpret_cast<ushort_v*>( tmpint4 )[r.fCurrIH]; | |
295 | // hh.y = reinterpret_cast<ushort_v*>( tmpint4 )[NextMultipleOf<sizeof(HLTCA_GPU_ROWALIGNMENT) / sizeof(ushort_v)>(row.NHits()) + r.fCurrIH]; | |
296 | //#else | |
297 | #if defined(HLTCA_GPU_TEXTURE_FETCH) | |
8566066c | 298 | hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + r.fCurrIH); |
b22af1bf | 299 | #else |
300 | hh = tracker.HitData(row)[r.fCurrIH]; | |
31649d4b | 301 | #endif //HLTCA_GPU_TEXTURE_FETCH |
b22af1bf | 302 | //#endif |
303 | //#endif | |
fbb9b71b | 304 | |
305 | int oldIH = r.fCurrIH; | |
b22af1bf | 306 | //#ifdef HLTCA_GPU_PREFETCHDATA |
307 | // r.fCurrIH = reinterpret_cast<short*>( tmpint4 )[2 * NextMultipleOf<sizeof(HLTCA_GPU_ROWALIGNMENT) / sizeof(ushort_v)>(row.NHits()) + r.fCurrIH]; // read from linkup data | |
308 | //#else | |
309 | #if defined(HLTCA_GPU_TEXTURE_FETCH) | |
8566066c | 310 | r.fCurrIH = tex1Dfetch(gAliTexRefs, ((char*) tracker.Data().HitLinkUpData(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + r.fCurrIH); |
b22af1bf | 311 | #else |
312 | r.fCurrIH = tracker.HitLinkUpData(row)[r.fCurrIH]; // read from linkup data | |
31649d4b | 313 | #endif //HLTCA_GPU_TEXTURE_FETCH |
b22af1bf | 314 | //#endif |
fbb9b71b | 315 | |
316 | float x = row.X(); | |
317 | float y = y0 + hh.x * stepY; | |
318 | float z = z0 + hh.y * stepZ; | |
7be9b0d7 | 319 | #ifdef DRAW |
fbb9b71b | 320 | if ( drawFit ) std::cout << " fit tracklet: new hit " << oldIH << ", xyz=" << x << " " << y << " " << z << std::endl; |
31649d4b | 321 | #endif //DRAW |
fbb9b71b | 322 | |
323 | if ( iRow == r.fStartRow ) { | |
324 | tParam.SetX( x ); | |
325 | tParam.SetY( y ); | |
326 | tParam.SetZ( z ); | |
327 | r.fLastY = y; | |
328 | r.fLastZ = z; | |
7be9b0d7 | 329 | #ifdef DRAW |
fbb9b71b | 330 | if ( drawFit ) std::cout << " fit tracklet " << r.fItr << ", row " << iRow << " first row" << std::endl; |
31649d4b | 331 | #endif //DRAW |
fbb9b71b | 332 | } else { |
333 | ||
334 | float err2Y, err2Z; | |
335 | float dx = x - tParam.X(); | |
336 | float dy = y - r.fLastY;//tParam.Y(); | |
337 | float dz = z - r.fLastZ;//tParam.Z(); | |
338 | r.fLastY = y; | |
339 | r.fLastZ = z; | |
340 | ||
341 | float ri = 1. / CAMath::Sqrt( dx * dx + dy * dy ); | |
5abba7a4 | 342 | if ( iRow == r.fStartRow + 2 ) { //SG!!! important - thanks to Matthias |
fbb9b71b | 343 | tParam.SetSinPhi( dy*ri ); |
344 | tParam.SetSignCosPhi( dx ); | |
345 | tParam.SetDzDs( dz*ri ); | |
4acc2401 | 346 | //std::cout << "Init. errors... " << r.fItr << std::endl; |
fbb9b71b | 347 | tracker.GetErrors2( iRow, tParam, err2Y, err2Z ); |
4acc2401 | 348 | //std::cout << "Init. errors = " << err2Y << " " << err2Z << std::endl; |
fbb9b71b | 349 | tParam.SetCov( 0, err2Y ); |
350 | tParam.SetCov( 2, err2Z ); | |
351 | } | |
352 | if ( drawFit ) { | |
7be9b0d7 | 353 | #ifdef DRAW |
fbb9b71b | 354 | std::cout << " fit tracklet " << r.fItr << ", row " << iRow << " transporting.." << std::endl; |
355 | std::cout << " params before transport=" << std::endl; | |
356 | tParam.Print(); | |
31649d4b | 357 | #endif //DRAW |
fbb9b71b | 358 | } |
359 | float sinPhi, cosPhi; | |
360 | if ( r.fNHits >= 10 && CAMath::Abs( tParam.SinPhi() ) < .99 ) { | |
361 | sinPhi = tParam.SinPhi(); | |
362 | cosPhi = CAMath::Sqrt( 1 - sinPhi * sinPhi ); | |
363 | } else { | |
364 | sinPhi = dy * ri; | |
365 | cosPhi = dx * ri; | |
366 | } | |
7be9b0d7 | 367 | #ifdef DRAW |
fbb9b71b | 368 | if ( drawFit ) std::cout << "sinPhi0 = " << sinPhi << ", cosPhi0 = " << cosPhi << std::endl; |
31649d4b | 369 | #endif //DRAW |
91794c67 | 370 | if ( !tParam.TransportToX( x, sinPhi, cosPhi, tracker.Param().ConstBz(), -1 ) ) { |
7be9b0d7 | 371 | #ifdef DRAW |
fbb9b71b | 372 | if ( drawFit ) std::cout << " tracklet " << r.fItr << ", row " << iRow << ": can not transport!!" << std::endl; |
31649d4b | 373 | #endif //DRAW |
b22af1bf | 374 | #ifndef EXTERN_ROW_HITS |
375 | tracklet.SetRowHit( iRow, -1 ); | |
376 | #else | |
377 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 378 | #endif //EXTERN_ROW_HITS |
fbb9b71b | 379 | break; |
380 | } | |
381 | //std::cout<<"mark1 "<<r.fItr<<std::endl; | |
382 | //tParam.Print(); | |
383 | tracker.GetErrors2( iRow, tParam.GetZ(), sinPhi, cosPhi, tParam.GetDzDs(), err2Y, err2Z ); | |
384 | //std::cout<<"mark2"<<std::endl; | |
385 | ||
386 | if ( drawFit ) { | |
7be9b0d7 | 387 | #ifdef DRAW |
fbb9b71b | 388 | std::cout << " params after transport=" << std::endl; |
389 | tParam.Print(); | |
390 | std::cout << "fit tracklet before filter: " << r.fItr << ", row " << iRow << " errs=" << err2Y << " " << err2Z << std::endl; | |
fbb9b71b | 391 | AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kBlue, 2., 1 ); |
392 | AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 393 | #endif //DRAW |
fbb9b71b | 394 | } |
395 | if ( !tParam.Filter( y, z, err2Y, err2Z, .99 ) ) { | |
7be9b0d7 | 396 | #ifdef DRAW |
fbb9b71b | 397 | if ( drawFit ) std::cout << " tracklet " << r.fItr << ", row " << iRow << ": can not filter!!" << std::endl; |
31649d4b | 398 | #endif //DRAW |
b22af1bf | 399 | #ifndef EXTERN_ROW_HITS |
400 | tracklet.SetRowHit( iRow, -1 ); | |
401 | #else | |
402 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 403 | #endif //EXTERN_ROW_HITS |
fbb9b71b | 404 | break; |
405 | } | |
00d07bcd | 406 | } |
b22af1bf | 407 | #ifndef EXTERN_ROW_HITS |
408 | tracklet.SetRowHit( iRow, oldIH ); | |
409 | #else | |
410 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = oldIH; | |
31649d4b | 411 | #endif //!EXTERN_ROW_HITS |
fbb9b71b | 412 | if ( drawFit ) { |
7be9b0d7 | 413 | #ifdef DRAW |
fbb9b71b | 414 | std::cout << "fit tracklet after filter " << r.fItr << ", row " << iRow << std::endl; |
415 | tParam.Print(); | |
fbb9b71b | 416 | AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kGreen, 2. ); |
417 | AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 418 | #endif //DRAW |
693d2443 | 419 | } |
00d07bcd | 420 | r.fNHits++; |
421 | r.fLastRow = iRow; | |
ce565086 | 422 | r.fEndRow = iRow; |
00d07bcd | 423 | break; |
fbb9b71b | 424 | } while ( 0 ); |
425 | ||
426 | if ( r.fCurrIH < 0 ) { | |
7be9b0d7 | 427 | #ifdef DRAW |
fbb9b71b | 428 | if ( drawFitted ) std::cout << "fitted tracklet " << r.fItr << ", nhits=" << r.fNHits << std::endl; |
31649d4b | 429 | #endif //DRAW |
693d2443 | 430 | r.fStage = 1; |
431 | //AliHLTTPCCAPerformance::Instance().HNHitsPerSeed()->Fill(r.fNHits); | |
fbb9b71b | 432 | if ( r.fNHits < 3 ) { r.fNHits = 0; r.fGo = 0;}//SG!!! |
433 | if ( CAMath::Abs( tParam.SinPhi() ) > .999 ) { | |
7be9b0d7 | 434 | #ifdef DRAW |
fbb9b71b | 435 | if ( drawFitted ) std::cout << " fitted tracklet error: sinPhi=" << tParam.SinPhi() << std::endl; |
31649d4b | 436 | #endif //DRAW |
fbb9b71b | 437 | r.fNHits = 0; r.fGo = 0; |
438 | } else { | |
439 | //tParam.SetCosPhi( CAMath::Sqrt(1-tParam.SinPhi()*tParam.SinPhi()) ); | |
693d2443 | 440 | } |
fbb9b71b | 441 | if ( drawFitted ) { |
7be9b0d7 | 442 | #ifdef DRAW |
fbb9b71b | 443 | std::cout << "fitted tracklet " << r.fItr << " miss=" << r.fNMissed << " go=" << r.fGo << std::endl; |
444 | tParam.Print(); | |
fbb9b71b | 445 | AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kBlue ); |
446 | AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 447 | #endif //DRAW |
693d2443 | 448 | } |
fbb9b71b | 449 | } |
450 | } else { // forward/backward searching part | |
451 | do { | |
452 | if ( drawSearch ) { | |
7be9b0d7 | 453 | #ifdef DRAW |
fbb9b71b | 454 | std::cout << "search tracklet " << r.fItr << " row " << iRow << " miss=" << r.fNMissed << " go=" << r.fGo << " stage=" << r.fStage << std::endl; |
31649d4b | 455 | #endif //DRAW |
fbb9b71b | 456 | } |
457 | ||
458 | if ( r.fStage == 2 && ( ( iRow >= r.fEndRow ) || | |
459 | ( iRow >= r.fStartRow && ( iRow - r.fStartRow ) % 2 == 0 ) | |
460 | ) ) break; | |
461 | if ( r.fNMissed > kMaxRowGap ) { | |
462 | break; | |
463 | } | |
464 | ||
465 | r.fNMissed++; | |
466 | ||
467 | float x = row.X(); | |
468 | float err2Y, err2Z; | |
469 | if ( drawSearch ) { | |
7be9b0d7 | 470 | #ifdef DRAW |
fbb9b71b | 471 | std::cout << "tracklet " << r.fItr << " before transport to row " << iRow << " : " << std::endl; |
472 | tParam.Print(); | |
31649d4b | 473 | #endif //DRAW |
fbb9b71b | 474 | } |
91794c67 | 475 | if ( !tParam.TransportToX( x, tParam.SinPhi(), tParam.GetCosPhi(), tracker.Param().ConstBz(), .99 ) ) { |
7be9b0d7 | 476 | #ifdef DRAW |
fbb9b71b | 477 | if ( drawSearch ) std::cout << " tracklet " << r.fItr << ", row " << iRow << ": can not transport!!" << std::endl; |
31649d4b | 478 | #endif //DRAW |
b22af1bf | 479 | #ifndef EXTERN_ROW_HITS |
480 | tracklet.SetRowHit(iRow, -1); | |
481 | #else | |
482 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 483 | #endif //!EXTERN_ROW_HITS |
fbb9b71b | 484 | break; |
485 | } | |
4acc2401 | 486 | if ( row.NHits() < 1 ) { |
487 | // skip empty row | |
b22af1bf | 488 | #ifndef EXTERN_ROW_HITS |
489 | tracklet.SetRowHit(iRow, -1); | |
490 | #else | |
491 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 492 | #endif //!EXTERN_ROW_HITS |
4acc2401 | 493 | break; |
494 | } | |
fbb9b71b | 495 | if ( drawSearch ) { |
7be9b0d7 | 496 | #ifdef DRAW |
fbb9b71b | 497 | std::cout << "tracklet " << r.fItr << " after transport to row " << iRow << " : " << std::endl; |
498 | tParam.Print(); | |
fbb9b71b | 499 | AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kBlue, 2., 1 ); |
500 | AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 501 | #endif //DRAW |
fbb9b71b | 502 | } |
b22af1bf | 503 | #ifdef HLTCA_GPU_PREFETCHDATA |
fbb9b71b | 504 | uint4 *tmpint4 = s.fData[r.fCurrentData]; |
31649d4b | 505 | #endif //HLTCA_GPU_PREFETCHDATA |
fbb9b71b | 506 | |
b22af1bf | 507 | //#ifdef HLTCA_GPU_REORDERHITDATA |
508 | // const ushort2 *hits = reinterpret_cast<ushort2*>( tmpint4 ); | |
509 | //#else | |
510 | //#ifdef HLTCA_GPU_PREFETCHDATA | |
511 | // const ushort_v *hitsx = reinterpret_cast<ushort_v*>( tmpint4 ); | |
512 | // const ushort_v *hitsy = reinterpret_cast<ushort_v*>( tmpint4 ) + NextMultipleOf<sizeof(HLTCA_GPU_ROWALIGNMENT) / sizeof(ushort_v)>(row.NHits()); | |
513 | //#else | |
514 | #ifndef HLTCA_GPU_TEXTURE_FETCH | |
515 | const ushort2 *hits = tracker.HitData(row); | |
31649d4b | 516 | #endif //!HLTCA_GPU_TEXTURE_FETCH |
b22af1bf | 517 | //#endif |
518 | //#endif | |
fbb9b71b | 519 | |
520 | float fY = tParam.GetY(); | |
521 | float fZ = tParam.GetZ(); | |
522 | int best = -1; | |
523 | ||
524 | { // search for the closest hit | |
4acc2401 | 525 | const int fIndYmin = row.Grid().GetBinBounded( fY - 1.f, fZ - 1.f ); |
526 | assert( fIndYmin >= 0 ); | |
fbb9b71b | 527 | |
528 | int ds; | |
529 | int fY0 = ( int ) ( ( fY - y0 ) * stepYi ); | |
530 | int fZ0 = ( int ) ( ( fZ - z0 ) * stepZi ); | |
531 | int ds0 = ( ( ( int )1 ) << 30 ); | |
532 | ds = ds0; | |
533 | ||
fbb9b71b | 534 | unsigned int fHitYfst = 1, fHitYlst = 0, fHitYfst1 = 1, fHitYlst1 = 0; |
535 | ||
fbb9b71b | 536 | if ( drawSearch ) { |
693d2443 | 537 | #ifdef DRAW |
fbb9b71b | 538 | std::cout << " tracklet " << r.fItr << ", row " << iRow << ": grid N=" << row.Grid().N() << std::endl; |
539 | std::cout << " tracklet " << r.fItr << ", row " << iRow << ": minbin=" << fIndYmin << std::endl; | |
31649d4b | 540 | #endif //DRAW |
fbb9b71b | 541 | } |
542 | { | |
543 | int nY = row.Grid().Ny(); | |
544 | ||
b22af1bf | 545 | //#ifdef HLTCA_GPU_PREFETCHDATA |
546 | // const unsigned short *sGridP = ( reinterpret_cast<unsigned short*>( tmpint4 ) ); | |
547 | //#else | |
548 | #ifndef HLTCA_GPU_TEXTURE_FETCH | |
549 | const unsigned short *sGridP = tracker.FirstHitInBin(row); | |
31649d4b | 550 | #endif //!HLTCA_GPU_TEXTURE_FETCH |
b22af1bf | 551 | //#endif |
552 | ||
553 | #ifdef HLTCA_GPU_TEXTURE_FETCH | |
8566066c | 554 | fHitYfst = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin); |
555 | fHitYlst = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+2); | |
556 | fHitYfst1 = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+nY); | |
557 | fHitYlst1 = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+nY+2); | |
b22af1bf | 558 | #else |
fbb9b71b | 559 | fHitYfst = sGridP[fIndYmin]; |
560 | fHitYlst = sGridP[fIndYmin+2]; | |
561 | fHitYfst1 = sGridP[fIndYmin+nY]; | |
562 | fHitYlst1 = sGridP[fIndYmin+nY+2]; | |
31649d4b | 563 | #endif //HLTCA_GPU_TEXTURE_FETCH |
b22af1bf | 564 | assert( (signed) fHitYfst <= row.NHits() ); |
565 | assert( (signed) fHitYlst <= row.NHits() ); | |
566 | assert( (signed) fHitYfst1 <= row.NHits() ); | |
567 | assert( (signed) fHitYlst1 <= row.NHits() ); | |
fbb9b71b | 568 | if ( drawSearch ) { |
693d2443 | 569 | #ifdef DRAW |
fbb9b71b | 570 | std::cout << " Grid, row " << iRow << ": nHits=" << row.NHits() << ", grid n=" << row.Grid().N() << ", c[n]=" << sGridP[row.Grid().N()] << std::endl; |
571 | std::cout << "hit steps = " << stepY << " " << stepZ << std::endl; | |
572 | std::cout << " Grid bins:" << std::endl; | |
573 | for ( unsigned int i = 0; i < row.Grid().N(); i++ ) { | |
574 | std::cout << " bin " << i << ": "; | |
575 | for ( int j = sGridP[i]; j < sGridP[i+1]; j++ ) { | |
576 | ushort2 hh = hits[j]; | |
577 | float y = y0 + hh.x * stepY; | |
578 | float z = z0 + hh.y * stepZ; | |
579 | std::cout << "[" << j << "|" << y << "," << z << "] "; | |
580 | } | |
581 | std::cout << std::endl; | |
582 | } | |
31649d4b | 583 | #endif //DRAW |
fbb9b71b | 584 | } |
693d2443 | 585 | #ifdef DRAW |
b22af1bf | 586 | if ( sGridP[row.Grid().N()] != row.NHits() ) { |
fbb9b71b | 587 | std::cout << " grid, row " << iRow << ": nHits=" << row.NHits() << ", grid n=" << row.Grid().N() << ", c[n]=" << sGridP[row.Grid().N()] << std::endl; |
588 | //exit(0); | |
fbb9b71b | 589 | } |
31649d4b | 590 | #endif //DRAW |
fbb9b71b | 591 | } |
b22af1bf | 592 | #ifdef DRAW |
fbb9b71b | 593 | if ( drawSearch ) { |
fbb9b71b | 594 | std::cout << " tracklet " << r.fItr << ", row " << iRow << ", yz= " << fY << "," << fZ << ": search hits=" << fHitYfst << " " << fHitYlst << " / " << fHitYfst1 << " " << fHitYlst1 << std::endl; |
595 | std::cout << " hit search :" << std::endl; | |
fbb9b71b | 596 | } |
31649d4b | 597 | #endif //DRAW |
fbb9b71b | 598 | for ( unsigned int fIh = fHitYfst; fIh < fHitYlst; fIh++ ) { |
b22af1bf | 599 | assert( (signed) fIh < row.NHits() ); |
600 | ushort2 hh; | |
601 | #if defined(HLTCA_GPU_TEXTURE_FETCH) | |
8566066c | 602 | hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh); |
b22af1bf | 603 | #else |
604 | hh = hits[fIh]; | |
31649d4b | 605 | #endif //HLTCA_GPU_TEXTURE_FETCH |
fbb9b71b | 606 | int ddy = ( int )( hh.x ) - fY0; |
607 | int ddz = ( int )( hh.y ) - fZ0; | |
608 | int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz ); | |
609 | if ( drawSearch ) { | |
7be9b0d7 | 610 | #ifdef DRAW |
fbb9b71b | 611 | std::cout << fIh << ": hityz= " << hh.x << " " << hh.y << "(" << hh.x*stepY << " " << hh.y*stepZ << "), trackyz=" << fY0 << " " << fZ0 << "(" << fY0*stepY << " " << fZ0*stepZ << "), dy,dz,ds= " << ddy << " " << ddz << " " << dds << "(" << ddy*stepY << " " << ddz*stepZ << std::endl; |
31649d4b | 612 | #endif //DRAW |
fbb9b71b | 613 | } |
614 | if ( dds < ds ) { | |
615 | ds = dds; | |
616 | best = fIh; | |
617 | } | |
618 | } | |
619 | ||
b22af1bf | 620 | for ( unsigned int fIh = fHitYfst1; fIh < fHitYlst1; fIh++ ) { |
621 | ushort2 hh; | |
622 | #if defined(HLTCA_GPU_TEXTURE_FETCH) | |
8566066c | 623 | hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh); |
b22af1bf | 624 | #else |
625 | hh = hits[fIh]; | |
31649d4b | 626 | #endif //HLTCA_GPU_TEXTURE_FETCH |
fbb9b71b | 627 | int ddy = ( int )( hh.x ) - fY0; |
628 | int ddz = ( int )( hh.y ) - fZ0; | |
629 | int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz ); | |
630 | if ( drawSearch ) { | |
7be9b0d7 | 631 | #ifdef DRAW |
fbb9b71b | 632 | std::cout << fIh << ": hityz= " << hh.x << " " << hh.y << "(" << hh.x*stepY << " " << hh.y*stepZ << "), trackyz=" << fY0 << " " << fZ0 << "(" << fY0*stepY << " " << fZ0*stepZ << "), dy,dz,ds= " << ddy << " " << ddz << " " << dds << "(" << ddy*stepY << " " << ddz*stepZ << std::endl; |
31649d4b | 633 | #endif //DRAW |
fbb9b71b | 634 | } |
635 | if ( dds < ds ) { | |
636 | ds = dds; | |
637 | best = fIh; | |
638 | } | |
639 | } | |
640 | }// end of search for the closest hit | |
641 | ||
b22af1bf | 642 | if ( best < 0 ) |
643 | { | |
644 | #ifndef EXTERN_ROW_HITS | |
645 | tracklet.SetRowHit(iRow, -1); | |
646 | #else | |
647 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 648 | #endif //!EXTERN_ROW_HITS |
b22af1bf | 649 | break; |
650 | } | |
fbb9b71b | 651 | if ( drawSearch ) { |
7be9b0d7 | 652 | #ifdef DRAW |
fbb9b71b | 653 | std::cout << "hit search " << r.fItr << ", row " << iRow << " hit " << best << " found" << std::endl; |
fbb9b71b | 654 | AliHLTTPCCADisplay::Instance().DrawSliceHit( iRow, best, kRed, 1. ); |
655 | AliHLTTPCCADisplay::Instance().Ask(); | |
656 | AliHLTTPCCADisplay::Instance().DrawSliceHit( iRow, best, kWhite, 1 ); | |
657 | AliHLTTPCCADisplay::Instance().DrawSliceHit( iRow, best ); | |
31649d4b | 658 | #endif //DRAW |
fbb9b71b | 659 | } |
660 | ||
b22af1bf | 661 | ushort2 hh; |
662 | #if defined(HLTCA_GPU_TEXTURE_FETCH) | |
8566066c | 663 | hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + best); |
b22af1bf | 664 | #else |
665 | hh = hits[best]; | |
31649d4b | 666 | #endif //HLTCA_GPU_TEXTURE_FETCH |
fbb9b71b | 667 | |
668 | //std::cout<<"mark 3, "<<r.fItr<<std::endl; | |
669 | //tParam.Print(); | |
670 | tracker.GetErrors2( iRow, *( ( AliHLTTPCCATrackParam* )&tParam ), err2Y, err2Z ); | |
671 | //std::cout<<"mark 4"<<std::endl; | |
672 | ||
673 | float y = y0 + hh.x * stepY; | |
674 | float z = z0 + hh.y * stepZ; | |
675 | float dy = y - fY; | |
676 | float dz = z - fZ; | |
677 | ||
678 | const float kFactor = tracker.Param().HitPickUpFactor() * tracker.Param().HitPickUpFactor() * 3.5 * 3.5; | |
679 | float sy2 = kFactor * ( tParam.GetErr2Y() + err2Y ); | |
680 | float sz2 = kFactor * ( tParam.GetErr2Z() + err2Z ); | |
681 | if ( sy2 > 2. ) sy2 = 2.; | |
682 | if ( sz2 > 2. ) sz2 = 2.; | |
683 | ||
684 | if ( drawSearch ) { | |
7be9b0d7 | 685 | #ifdef DRAW |
fbb9b71b | 686 | std::cout << "dy,sy= " << dy << " " << CAMath::Sqrt( sy2 ) << ", dz,sz= " << dz << " " << CAMath::Sqrt( sz2 ) << std::endl; |
687 | std::cout << "dy,dz= " << dy << " " << dz << ", sy,sz= " << CAMath::Sqrt( sy2 ) << " " << CAMath::Sqrt( sz2 ) << ", sy,sz= " << CAMath::Sqrt( kFactor*( tParam.GetErr2Y() + err2Y ) ) << " " << CAMath::Sqrt( kFactor*( tParam.GetErr2Z() + err2Z ) ) << std::endl; | |
31649d4b | 688 | #endif //DRAW |
fbb9b71b | 689 | } |
690 | if ( CAMath::FMulRZ( dy, dy ) > sy2 || CAMath::FMulRZ( dz, dz ) > sz2 ) { | |
691 | if ( drawSearch ) { | |
7be9b0d7 | 692 | #ifdef DRAW |
fbb9b71b | 693 | std::cout << "found hit is out of the chi2 window\n " << std::endl; |
31649d4b | 694 | #endif //DRAW |
fbb9b71b | 695 | } |
b22af1bf | 696 | #ifndef EXTERN_ROW_HITS |
697 | tracklet.SetRowHit(iRow, -1); | |
698 | #else | |
699 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1; | |
31649d4b | 700 | #endif //!EXTERN_ROW_HITS |
fbb9b71b | 701 | break; |
702 | } | |
693d2443 | 703 | #ifdef DRAW |
fbb9b71b | 704 | //if( SAVE() ) hitstore[ iRow ] = best; |
705 | //std::cout<<"hit search before filter: "<<r.fItr<<", row "<<iRow<<std::endl; | |
706 | //AliHLTTPCCADisplay::Instance().DrawTracklet(tParam, hitstore, kBlue); | |
707 | //AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 708 | #endif //DRAW |
fbb9b71b | 709 | if ( !tParam.Filter( y, z, err2Y, err2Z, .99 ) ) { |
710 | if ( drawSearch ) { | |
7be9b0d7 | 711 | #ifdef DRAW |
fbb9b71b | 712 | std::cout << "tracklet " << r.fItr << " at row " << iRow << " : can not filter!!!! " << std::endl; |
31649d4b | 713 | #endif //DRAW |
fbb9b71b | 714 | } |
715 | break; | |
716 | } | |
b22af1bf | 717 | #ifndef EXTERN_ROW_HITS |
718 | tracklet.SetRowHit( iRow, best ); | |
719 | #else | |
720 | tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = best; | |
31649d4b | 721 | #endif //!EXTERN_ROW_HITS |
fbb9b71b | 722 | if ( drawSearch ) { |
7be9b0d7 | 723 | #ifdef DRAW |
fbb9b71b | 724 | std::cout << "tracklet " << r.fItr << " after filter at row " << iRow << " : " << std::endl; |
725 | tParam.Print(); | |
fbb9b71b | 726 | AliHLTTPCCADisplay::Instance().DrawTracklet( tParam, hitstore, kRed ); |
727 | AliHLTTPCCADisplay::Instance().Ask(); | |
31649d4b | 728 | #endif //DRAW |
fbb9b71b | 729 | } |
730 | r.fNHits++; | |
731 | r.fNMissed = 0; | |
732 | if ( r.fStage == 1 ) r.fLastRow = iRow; | |
733 | else r.fFirstRow = iRow; | |
734 | } while ( 0 ); | |
735 | } | |
00d07bcd | 736 | } |
737 | ||
b22af1bf | 738 | #ifdef HLTCA_GPUCODE |
739 | GPUd() void AliHLTTPCCATrackletConstructor::CopyTrackletTempData( AliHLTTPCCAThreadMemory &rMemSrc, AliHLTTPCCAThreadMemory &rMemDst, AliHLTTPCCATrackParam &tParamSrc, AliHLTTPCCATrackParam &tParamDst) | |
740 | { | |
741 | //Copy Temporary Tracklet data from registers to global mem and vice versa | |
742 | rMemDst.fStartRow = rMemSrc.fStartRow; | |
743 | rMemDst.fEndRow = rMemSrc.fEndRow; | |
744 | rMemDst.fFirstRow = rMemSrc.fFirstRow; | |
745 | rMemDst.fLastRow = rMemSrc.fLastRow; | |
746 | rMemDst.fCurrIH = rMemSrc.fCurrIH; | |
747 | rMemDst.fGo = rMemSrc.fGo; | |
748 | rMemDst.fStage = rMemSrc.fStage; | |
749 | rMemDst.fNHits = rMemSrc.fNHits; | |
750 | rMemDst.fNMissed = rMemSrc.fNMissed; | |
751 | rMemDst.fLastY = rMemSrc.fLastY; | |
752 | rMemDst.fLastZ = rMemSrc.fLastZ; | |
753 | ||
754 | tParamDst.SetSinPhi( tParamSrc.GetSinPhi() ); | |
755 | tParamDst.SetDzDs( tParamSrc.GetDzDs() ); | |
756 | tParamDst.SetQPt( tParamSrc.GetQPt() ); | |
757 | tParamDst.SetSignCosPhi( tParamSrc.GetSignCosPhi() ); | |
758 | tParamDst.SetChi2( tParamSrc.GetChi2() ); | |
759 | tParamDst.SetNDF( tParamSrc.GetNDF() ); | |
760 | tParamDst.SetCov( 0, tParamSrc.GetCov(0) ); | |
761 | tParamDst.SetCov( 1, tParamSrc.GetCov(1) ); | |
762 | tParamDst.SetCov( 2, tParamSrc.GetCov(2) ); | |
763 | tParamDst.SetCov( 3, tParamSrc.GetCov(3) ); | |
764 | tParamDst.SetCov( 4, tParamSrc.GetCov(4) ); | |
765 | tParamDst.SetCov( 5, tParamSrc.GetCov(5) ); | |
766 | tParamDst.SetCov( 6, tParamSrc.GetCov(6) ); | |
767 | tParamDst.SetCov( 7, tParamSrc.GetCov(7) ); | |
768 | tParamDst.SetCov( 8, tParamSrc.GetCov(8) ); | |
769 | tParamDst.SetCov( 9, tParamSrc.GetCov(9) ); | |
770 | tParamDst.SetCov( 10, tParamSrc.GetCov(10) ); | |
771 | tParamDst.SetCov( 11, tParamSrc.GetCov(11) ); | |
772 | tParamDst.SetCov( 12, tParamSrc.GetCov(12) ); | |
773 | tParamDst.SetCov( 13, tParamSrc.GetCov(13) ); | |
774 | tParamDst.SetCov( 14, tParamSrc.GetCov(14) ); | |
775 | tParamDst.SetX( tParamSrc.GetX() ); | |
776 | tParamDst.SetY( tParamSrc.GetY() ); | |
777 | tParamDst.SetZ( tParamSrc.GetZ() ); | |
778 | } | |
00d07bcd | 779 | |
b22af1bf | 780 | GPUd() int AliHLTTPCCATrackletConstructor::FetchTracklet(AliHLTTPCCATracker &tracker, AliHLTTPCCASharedMemory &sMem, int Reverse, int RowBlock, int &mustInit) |
781 | { | |
782 | //Fetch a new trackled to be processed by this thread | |
783 | __syncthreads(); | |
784 | int nextTracketlFirstRun = sMem.fNextTrackletFirstRun; | |
785 | if (threadIdx.x == TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
786 | { | |
787 | sMem.fNTracklets = *tracker.NTracklets(); | |
788 | if (sMem.fNextTrackletFirstRun) | |
789 | { | |
790 | #ifdef HLTCA_GPU_SCHED_FIXED_START | |
791 | const int iSlice = tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + (HLTCA_GPU_BLOCK_COUNT % tracker.GPUParametersConst()->fGPUnSlices != 0 && tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + 1) % HLTCA_GPU_BLOCK_COUNT != 0)) / HLTCA_GPU_BLOCK_COUNT; | |
792 | const int nSliceBlockOffset = HLTCA_GPU_BLOCK_COUNT * iSlice / tracker.GPUParametersConst()->fGPUnSlices; | |
793 | const uint2 &nTracklet = tracker.BlockStartingTracklet()[blockIdx.x - nSliceBlockOffset]; | |
794 | ||
795 | sMem.fNextTrackletCount = nTracklet.y; | |
796 | if (sMem.fNextTrackletCount == 0) | |
797 | { | |
798 | sMem.fNextTrackletFirstRun = 0; | |
799 | } | |
800 | else | |
801 | { | |
802 | if (tracker.TrackletStartHits()[nTracklet.x].RowIndex() / HLTCA_GPU_SCHED_ROW_STEP != RowBlock) | |
803 | { | |
804 | sMem.fNextTrackletCount = 0; | |
805 | } | |
806 | else | |
807 | { | |
808 | sMem.fNextTrackletFirst = nTracklet.x; | |
809 | sMem.fNextTrackletNoDummy = 1; | |
810 | } | |
811 | } | |
31649d4b | 812 | #endif //HLTCA_GPU_SCHED_FIXED_START |
b22af1bf | 813 | } |
814 | else | |
815 | { | |
816 | const int nFetchTracks = CAMath::Max(CAMath::Min((*tracker.RowBlockPos(Reverse, RowBlock)).x - (*tracker.RowBlockPos(Reverse, RowBlock)).y, HLTCA_GPU_THREAD_COUNT - TRACKLET_CONSTRUCTOR_NMEMTHREDS), 0); | |
817 | sMem.fNextTrackletCount = nFetchTracks; | |
818 | const int nUseTrack = nFetchTracks ? CAMath::AtomicAdd(&(*tracker.RowBlockPos(Reverse, RowBlock)).y, nFetchTracks) : 0; | |
819 | sMem.fNextTrackletFirst = nUseTrack; | |
820 | ||
821 | const int nFillTracks = CAMath::Min(nFetchTracks, nUseTrack + nFetchTracks - (*((volatile int2*) (tracker.RowBlockPos(Reverse, RowBlock)))).x); | |
822 | if (nFillTracks > 0) | |
823 | { | |
8566066c | 824 | const int nStartFillTrack = CAMath::AtomicAdd(&(*tracker.RowBlockPos(Reverse, RowBlock)).x, nFillTracks); |
825 | if (nFillTracks + nStartFillTrack >= HLTCA_GPU_MAX_TRACKLETS) | |
826 | { | |
827 | tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_ROWBLOCK_TRACKLET_OVERFLOW; | |
828 | } | |
829 | for (int i = 0;i < nFillTracks;i++) | |
830 | { | |
831 | tracker.RowBlockTracklets(Reverse, RowBlock)[(nStartFillTrack + i) % HLTCA_GPU_MAX_TRACKLETS] = -3; //Dummy filling track | |
832 | } | |
b22af1bf | 833 | } |
8566066c | 834 | sMem.fNextTrackletNoDummy = 0; |
b22af1bf | 835 | } |
836 | } | |
837 | __syncthreads(); | |
838 | mustInit = 0; | |
839 | if (sMem.fNextTrackletCount == 0) | |
840 | { | |
841 | return(-2); //No more track in this RowBlock | |
842 | } | |
843 | #if HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS > 0 | |
844 | else if (threadIdx.x < TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
845 | { | |
846 | return(-1); | |
847 | } | |
31649d4b | 848 | #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_NMEMTHREDS > 0 |
b22af1bf | 849 | else if (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS >= sMem.fNextTrackletCount) |
850 | { | |
851 | return(-1); //No track in this RowBlock for this thread | |
852 | } | |
853 | else if (nextTracketlFirstRun) | |
854 | { | |
855 | if (threadIdx.x == TRACKLET_CONSTRUCTOR_NMEMTHREDS) sMem.fNextTrackletFirstRun = 0; | |
856 | mustInit = 1; | |
857 | return(sMem.fNextTrackletFirst + threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS); | |
858 | } | |
859 | else | |
860 | { | |
8566066c | 861 | const int nTrackPos = sMem.fNextTrackletFirst + threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS; |
862 | mustInit = (nTrackPos < tracker.RowBlockPos(Reverse, RowBlock)->w); | |
863 | volatile int* const ptrTracklet = &tracker.RowBlockTracklets(Reverse, RowBlock)[nTrackPos % HLTCA_GPU_MAX_TRACKLETS]; | |
864 | int nTracklet; | |
865 | int nTryCount = 0; | |
866 | while ((nTracklet = *ptrTracklet) == -1) | |
867 | { | |
3a4ab1ca | 868 | for (int i = 0;i < 20000;i++) |
8566066c | 869 | sMem.fNextTrackletStupidDummy++; |
870 | nTryCount++; | |
3a4ab1ca | 871 | if (nTryCount > 30) |
8566066c | 872 | { |
873 | tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_SCHEDULE_COLLISION; | |
874 | return(-1); | |
875 | } | |
876 | }; | |
877 | return(nTracklet); | |
b22af1bf | 878 | } |
879 | } | |
00d07bcd | 880 | |
b22af1bf | 881 | GPUd() void AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorNewGPU(AliHLTTPCCATracker *pTracker) |
fbb9b71b | 882 | { |
b22af1bf | 883 | //Main Tracklet construction function that calls the scheduled (FetchTracklet) and then Processes the tracklet (mainly UpdataTracklet) and at the end stores the tracklet. |
884 | //Can also dispatch a tracklet to be rescheduled | |
885 | #ifdef HLTCA_GPU_EMULATION_SINGLE_TRACKLET | |
886 | pTracker[0].BlockStartingTracklet()[0].x = HLTCA_GPU_EMULATION_SINGLE_TRACKLET; | |
887 | pTracker[0].BlockStartingTracklet()[0].y = 1; | |
888 | for (int i = 1;i < HLTCA_GPU_BLOCK_COUNT;i++) | |
889 | { | |
890 | pTracker[0].BlockStartingTracklet()[i].x = pTracker[0].BlockStartingTracklet()[i].y = 0; | |
891 | } | |
31649d4b | 892 | #endif //HLTCA_GPU_EMULATION_SINGLE_TRACKLET |
00d07bcd | 893 | |
b22af1bf | 894 | GPUshared() AliHLTTPCCASharedMemory sMem; |
fbb9b71b | 895 | |
b22af1bf | 896 | #ifdef HLTCA_GPU_SCHED_FIXED_START |
897 | if (threadIdx.x == TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
898 | { | |
899 | sMem.fNextTrackletFirstRun = 1; | |
900 | } | |
901 | __syncthreads(); | |
31649d4b | 902 | #endif //HLTCA_GPU_SCHED_FIXED_START |
fbb9b71b | 903 | |
b22af1bf | 904 | #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE |
905 | if (threadIdx.x == TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
906 | { | |
907 | sMem.fMaxSync = 0; | |
908 | } | |
909 | int threadSync = 0; | |
31649d4b | 910 | #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE |
fbb9b71b | 911 | |
b22af1bf | 912 | for (int iReverse = 0;iReverse < 2;iReverse++) |
913 | { | |
914 | for (int iRowBlock = 0;iRowBlock < HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1;iRowBlock++) | |
915 | { | |
916 | #ifdef HLTCA_GPU_SCHED_FIXED_SLICE | |
917 | int iSlice = tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + (HLTCA_GPU_BLOCK_COUNT % tracker.GPUParametersConst()->fGPUnSlices != 0 && tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + 1) % HLTCA_GPU_BLOCK_COUNT != 0)) / HLTCA_GPU_BLOCK_COUNT; | |
918 | #else | |
919 | for (int iSlice = 0;iSlice < pTracker[0].GPUParametersConst()->fGPUnSlices;iSlice++) | |
31649d4b | 920 | #endif //HLTCA_GPU_SCHED_FIXED_SLICE |
b22af1bf | 921 | { |
922 | AliHLTTPCCATracker &tracker = pTracker[iSlice]; | |
923 | if (sMem.fNextTrackletFirstRun && iSlice != tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + (HLTCA_GPU_BLOCK_COUNT % tracker.GPUParametersConst()->fGPUnSlices != 0 && tracker.GPUParametersConst()->fGPUnSlices * (blockIdx.x + 1) % HLTCA_GPU_BLOCK_COUNT != 0)) / HLTCA_GPU_BLOCK_COUNT) | |
924 | { | |
925 | continue; | |
926 | } | |
927 | /*if (!sMem.fNextTrackletFirstRun && tracker.RowBlockPos(1, HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP)->x <= tracker.RowBlockPos(1, HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP)->y) | |
928 | { | |
929 | continue; | |
930 | }*/ | |
931 | int sharedRowsInitialized = 0; | |
932 | ||
933 | int iTracklet; | |
934 | int mustInit; | |
935 | while ((iTracklet = FetchTracklet(tracker, sMem, iReverse, iRowBlock, mustInit)) != -2) | |
936 | { | |
937 | #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE | |
938 | CAMath::AtomicMax(&sMem.fMaxSync, threadSync); | |
939 | __syncthreads(); | |
940 | threadSync = CAMath::Min(sMem.fMaxSync, 100000000 / blockDim.x / gridDim.x); | |
31649d4b | 941 | #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE |
b22af1bf | 942 | #ifndef HLTCA_GPU_PREFETCHDATA |
943 | if (!sharedRowsInitialized) | |
944 | { | |
945 | #ifdef HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY | |
946 | if (iReverse) | |
947 | { | |
948 | for (int i = CAMath::Max(0, HLTCA_ROW_COUNT - (iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP) * sizeof(AliHLTTPCCARow) / sizeof(int) + threadIdx.x;i < (HLTCA_ROW_COUNT - iRowBlock * HLTCA_GPU_SCHED_ROW_STEP) * sizeof(AliHLTTPCCARow) / sizeof(int);i += blockDim.x) | |
949 | { | |
950 | reinterpret_cast<int*>(&sMem.fRows)[i] = reinterpret_cast<int*>(tracker.SliceDataRows())[i]; | |
951 | } | |
952 | } | |
953 | else | |
954 | { | |
955 | for (int i = CAMath::Max(1, iRowBlock * HLTCA_GPU_SCHED_ROW_STEP) * sizeof(AliHLTTPCCARow) / sizeof(int) + threadIdx.x;i < CAMath::Min((iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP, HLTCA_ROW_COUNT) * sizeof(AliHLTTPCCARow) / sizeof(int);i += blockDim.x) | |
956 | { | |
957 | reinterpret_cast<int*>(&sMem.fRows)[i] = reinterpret_cast<int*>(tracker.SliceDataRows())[i]; | |
958 | } | |
959 | } | |
960 | #else | |
961 | for (int i = threadIdx.x;i < HLTCA_ROW_COUNT * sizeof(AliHLTTPCCARow) / sizeof(int);i += blockDim.x) | |
962 | { | |
963 | reinterpret_cast<int*>(&sMem.fRows)[i] = reinterpret_cast<int*>(tracker.SliceDataRows())[i]; | |
964 | } | |
31649d4b | 965 | #endif //HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY |
b22af1bf | 966 | sharedRowsInitialized = 1; |
967 | } | |
31649d4b | 968 | #endif //!HLTCA_GPU_PREFETCHDATA |
b22af1bf | 969 | #ifdef HLTCA_GPU_RESCHED |
970 | short2 storeToRowBlock; | |
971 | int storePosition = 0; | |
972 | if (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS < 2 * (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1)) | |
973 | { | |
974 | const int nReverse = (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS) / (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1); | |
975 | const int nRowBlock = (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS) % (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1); | |
976 | sMem.fTrackletStoreCount[nReverse][nRowBlock] = 0; | |
977 | } | |
31649d4b | 978 | #endif //HLTCA_GPU_RESCHED |
b22af1bf | 979 | __syncthreads(); |
980 | AliHLTTPCCATrackParam tParam; | |
981 | AliHLTTPCCAThreadMemory rMem; | |
fbb9b71b | 982 | |
b22af1bf | 983 | rMem.fCurrentData = 0; |
984 | ||
985 | #ifdef HLTCA_GPU_EMULATION_DEBUG_TRACKLET | |
986 | if (iTracklet == HLTCA_GPU_EMULATION_DEBUG_TRACKLET) | |
987 | { | |
988 | tracker.GPUParameters()->fGPUError = 1; | |
989 | } | |
31649d4b | 990 | #endif //HLTCA_GPU_EMULATION_DEBUG_TRACKLET |
b22af1bf | 991 | AliHLTTPCCAThreadMemory &rMemGlobal = tracker.GPUTrackletTemp()[iTracklet].fThreadMem; |
992 | AliHLTTPCCATrackParam &tParamGlobal = tracker.GPUTrackletTemp()[iTracklet].fParam; | |
993 | if (mustInit) | |
994 | { | |
995 | AliHLTTPCCAHitId id = tracker.TrackletStartHits()[iTracklet]; | |
996 | ||
997 | rMem.fStartRow = rMem.fEndRow = rMem.fFirstRow = rMem.fLastRow = id.RowIndex(); | |
998 | rMem.fCurrIH = id.HitIndex(); | |
999 | rMem.fStage = 0; | |
1000 | rMem.fNHits = 0; | |
1001 | rMem.fNMissed = 0; | |
1002 | ||
1003 | AliHLTTPCCATrackletConstructor::InitTracklet(tParam); | |
1004 | } | |
1005 | else if (iTracklet >= 0) | |
1006 | { | |
1007 | CopyTrackletTempData( rMemGlobal, rMem, tParamGlobal, tParam ); | |
1008 | } | |
1009 | #ifdef HLTCA_GPU_PREFETCHDATA | |
1010 | else if (threadIdx.x < TRACKLET_CONSTRUCTOR_NMEMTHREDS) | |
1011 | { | |
1012 | ReadData(threadIdx.x, sMem, rMem, tracker, iReverse ? (HLTCA_ROW_COUNT - 1 - iRowBlock * HLTCA_GPU_SCHED_ROW_STEP) : (CAMath::Max(1, iRowBlock * HLTCA_GPU_SCHED_ROW_STEP))); | |
1013 | } | |
31649d4b | 1014 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1015 | rMem.fItr = iTracklet; |
1016 | rMem.fGo = (iTracklet >= 0); | |
1017 | ||
1018 | #ifdef HLTCA_GPU_RESCHED | |
1019 | storeToRowBlock.x = iRowBlock + 1; | |
1020 | storeToRowBlock.y = iReverse; | |
1021 | #ifdef HLTCA_GPU_PREFETCHDATA | |
1022 | rMem.fCurrentData ^= 1; | |
1023 | __syncthreads(); | |
31649d4b | 1024 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1025 | if (iReverse) |
1026 | { | |
1027 | for (int j = HLTCA_ROW_COUNT - 1 - iRowBlock * HLTCA_GPU_SCHED_ROW_STEP;j >= CAMath::Max(0, HLTCA_ROW_COUNT - (iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP);j--) | |
1028 | { | |
1029 | #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE | |
1030 | if (rMem.fNMissed <= kMaxRowGap && rMem.fGo && !(j >= rMem.fEndRow || ( j >= rMem.fStartRow && j - rMem.fStartRow % 2 == 0))) | |
1031 | pTracker[0].fStageAtSync[threadSync++ * blockDim.x * gridDim.x + blockIdx.x * blockDim.x + threadIdx.x] = rMem.fStage + 1; | |
31649d4b | 1032 | #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE |
b22af1bf | 1033 | #ifdef HLTCA_GPU_PREFETCHDATA |
1034 | if (threadIdx.x < TRACKLET_CONSTRUCTOR_NMEMTHREDS && j > CAMath::Max(0, HLTCA_ROW_COUNT - (iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP)) | |
1035 | { | |
1036 | ReadData(threadIdx.x, sMem, rMem, tracker, j - 1); | |
1037 | } | |
1038 | else | |
31649d4b | 1039 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1040 | if (iTracklet >= 0) |
1041 | { | |
1042 | UpdateTracklet(gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam, j); | |
1043 | if (rMem.fNMissed > kMaxRowGap) | |
1044 | { | |
1045 | rMem.fGo = 0; | |
1046 | #ifndef HLTCA_GPU_PREFETCHDATA | |
1047 | break; | |
31649d4b | 1048 | #endif //!HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1049 | } |
1050 | } | |
1051 | #ifdef HLTCA_GPU_PREFETCHDATA | |
1052 | __syncthreads(); | |
1053 | rMem.fCurrentData ^= 1; | |
31649d4b | 1054 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1055 | } |
1056 | ||
1057 | if (iTracklet >= 0 && (!rMem.fGo || iRowBlock == HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP)) | |
1058 | { | |
1059 | StoreTracklet( gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam ); | |
1060 | } | |
1061 | } | |
1062 | else | |
1063 | { | |
1064 | for (int j = CAMath::Max(1, iRowBlock * HLTCA_GPU_SCHED_ROW_STEP);j < CAMath::Min((iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP, HLTCA_ROW_COUNT);j++) | |
1065 | { | |
1066 | #ifdef HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE | |
1067 | if (rMem.fNMissed <= kMaxRowGap && rMem.fGo && j >= rMem.fStartRow && (rMem.fStage > 0 || rMem.fCurrIH >= 0 || (j - rMem.fStartRow) % 2 == 0 )) | |
1068 | pTracker[0].fStageAtSync[threadSync++ * blockDim.x * gridDim.x + blockIdx.x * blockDim.x + threadIdx.x] = rMem.fStage + 1; | |
31649d4b | 1069 | #endif //HLTCA_GPU_TRACKLET_CONSTRUCTOR_DO_PROFILE |
b22af1bf | 1070 | #ifdef HLTCA_GPU_PREFETCHDATA |
1071 | if (threadIdx.x < TRACKLET_CONSTRUCTOR_NMEMTHREDS && j < CAMath::Min((iRowBlock + 1) * HLTCA_GPU_SCHED_ROW_STEP, HLTCA_ROW_COUNT) - 1) | |
1072 | { | |
1073 | ReadData(threadIdx.x, sMem, rMem, tracker, j + 1); | |
1074 | } | |
1075 | else | |
31649d4b | 1076 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1077 | if (iTracklet >= 0) |
1078 | { | |
1079 | UpdateTracklet( gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam, j); | |
1080 | #ifndef HLTCA_GPU_PREFETCHDATA | |
1081 | //if (rMem.fNMissed > kMaxRowGap || rMem.fGo == 0) break; //DR!!! CUDA Crashes with this enabled | |
31649d4b | 1082 | #endif //!HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1083 | } |
1084 | #ifdef HLTCA_GPU_PREFETCHDATA | |
1085 | __syncthreads(); | |
1086 | rMem.fCurrentData ^= 1; | |
31649d4b | 1087 | #endif //HLTCA_GPU_PREFETCHDATA |
b22af1bf | 1088 | } |
1089 | if (rMem.fGo && (rMem.fNMissed > kMaxRowGap || iRowBlock == HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP)) | |
1090 | { | |
1091 | #if defined(HLTCA_GPU_PREFETCHDATA) | !defined(HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY) | |
1092 | if ( !tParam.TransportToX( tracker.Row( rMem.fEndRow ).X(), tracker.Param().ConstBz(), .999 ) ) | |
1093 | #else | |
1094 | if ( !tParam.TransportToX( sMem.fRows[ rMem.fEndRow ].X(), tracker.Param().ConstBz(), .999 ) ) | |
31649d4b | 1095 | #endif //HLTCA_GPU_PREFETCHDATA | !HLTCA_GPU_PREFETCH_ROWBLOCK_ONLY |
b22af1bf | 1096 | { |
1097 | rMem.fGo = 0; | |
1098 | } | |
1099 | else | |
1100 | { | |
1101 | storeToRowBlock.x = (HLTCA_ROW_COUNT - rMem.fEndRow) / HLTCA_GPU_SCHED_ROW_STEP; | |
1102 | storeToRowBlock.y = 1; | |
1103 | rMem.fNMissed = 0; | |
1104 | rMem.fStage = 2; | |
1105 | } | |
1106 | } | |
1107 | ||
1108 | if (iTracklet >= 0 && !rMem.fGo) | |
1109 | { | |
1110 | StoreTracklet( gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam ); | |
1111 | } | |
1112 | } | |
1113 | ||
1114 | if (rMem.fGo && (iRowBlock != HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP || iReverse == 0)) | |
1115 | { | |
1116 | CopyTrackletTempData( rMem, rMemGlobal, tParam, tParamGlobal ); | |
1117 | storePosition = CAMath::AtomicAdd(&sMem.fTrackletStoreCount[storeToRowBlock.y][storeToRowBlock.x], 1); | |
1118 | } | |
1119 | #else | |
1120 | if (iTracklet >= 0) | |
1121 | { | |
8566066c | 1122 | for (int j = rMem.fStartRow;j < HLTCA_ROW_COUNT;j++) |
1123 | { | |
1124 | UpdateTracklet(gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam, j); | |
1125 | if (!rMem.fGo) break; | |
1126 | } | |
1127 | ||
1128 | rMem.fNMissed = 0; | |
1129 | rMem.fStage = 2; | |
1130 | if ( rMem.fGo ) | |
1131 | { | |
1132 | if ( !tParam.TransportToX( tracker.Row( rMem.fEndRow ).X(), tracker.Param().ConstBz(), .999 ) ) rMem.fGo = 0; | |
1133 | } | |
1134 | ||
1135 | for (int j = rMem.fEndRow;j >= 0;j--) | |
1136 | { | |
1137 | if (!rMem.fGo) break; | |
1138 | UpdateTracklet( gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam, j); | |
1139 | } | |
1140 | ||
b22af1bf | 1141 | StoreTracklet( gridDim.x, blockDim.x, blockIdx.x, threadIdx.x, sMem, rMem, tracker, tParam ); |
1142 | } | |
31649d4b | 1143 | #endif //HLTCA_GPU_RESCHED |
b22af1bf | 1144 | #ifdef HLTCA_GPU_RESCHED |
1145 | __syncthreads(); | |
1146 | if (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS < 2 * (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1)) | |
1147 | { | |
1148 | const int nReverse = (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS) / (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1); | |
1149 | const int nRowBlock = (threadIdx.x - TRACKLET_CONSTRUCTOR_NMEMTHREDS) % (HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP + 1); | |
1150 | if (sMem.fTrackletStoreCount[nReverse][nRowBlock]) | |
1151 | { | |
1152 | sMem.fTrackletStoreCount[nReverse][nRowBlock] = CAMath::AtomicAdd(&tracker.RowBlockPos(nReverse, nRowBlock)->x, sMem.fTrackletStoreCount[nReverse][nRowBlock]); | |
1153 | } | |
1154 | } | |
1155 | __syncthreads(); | |
1156 | if (iTracklet >= 0 && rMem.fGo && (iRowBlock != HLTCA_ROW_COUNT / HLTCA_GPU_SCHED_ROW_STEP || iReverse == 0)) | |
1157 | { | |
1158 | tracker.RowBlockTracklets(storeToRowBlock.y, storeToRowBlock.x)[sMem.fTrackletStoreCount[storeToRowBlock.y][storeToRowBlock.x] + storePosition] = iTracklet; | |
1159 | } | |
1160 | __syncthreads(); | |
31649d4b | 1161 | #endif //HLTCA_GPU_RESCHED |
b22af1bf | 1162 | } |
1163 | } | |
1164 | } | |
1165 | } | |
00d07bcd | 1166 | } |
1167 | ||
b22af1bf | 1168 | GPUd() void AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorInit(int iTracklet, AliHLTTPCCATracker &tracker) |
1169 | { | |
1170 | //Initialize Row Blocks | |
1171 | ||
1172 | #ifndef HLTCA_GPU_EMULATION_SINGLE_TRACKLET | |
1173 | AliHLTTPCCAHitId id = tracker.TrackletStartHits()[iTracklet]; | |
1174 | #ifdef HLTCA_GPU_SCHED_FIXED_START | |
1175 | const int firstDynamicTracklet = tracker.GPUParameters()->fScheduleFirstDynamicTracklet; | |
1176 | if (iTracklet >= firstDynamicTracklet) | |
31649d4b | 1177 | #endif //HLTCA_GPU_SCHED_FIXED_START |
b22af1bf | 1178 | { |
1179 | const int firstTrackletInRowBlock = CAMath::Max(firstDynamicTracklet, tracker.RowStartHitCountOffset()[CAMath::Max(id.RowIndex() / HLTCA_GPU_SCHED_ROW_STEP * HLTCA_GPU_SCHED_ROW_STEP, 1)].z); | |
1180 | if (iTracklet == firstTrackletInRowBlock) | |
1181 | { | |
1182 | const int firstRowInNextBlock = (id.RowIndex() / HLTCA_GPU_SCHED_ROW_STEP + 1) * HLTCA_GPU_SCHED_ROW_STEP; | |
1183 | int trackletsInRowBlock; | |
1184 | if (firstRowInNextBlock >= HLTCA_ROW_COUNT - 3) | |
1185 | trackletsInRowBlock = *tracker.NTracklets() - firstTrackletInRowBlock; | |
1186 | else | |
1187 | trackletsInRowBlock = CAMath::Max(firstDynamicTracklet, tracker.RowStartHitCountOffset()[firstRowInNextBlock].z) - firstTrackletInRowBlock; | |
1188 | ||
1189 | tracker.RowBlockPos(0, id.RowIndex() / HLTCA_GPU_SCHED_ROW_STEP)->x = trackletsInRowBlock; | |
1190 | tracker.RowBlockPos(0, id.RowIndex() / HLTCA_GPU_SCHED_ROW_STEP)->w = trackletsInRowBlock; | |
1191 | } | |
1192 | tracker.RowBlockTracklets(0, id.RowIndex() / HLTCA_GPU_SCHED_ROW_STEP)[iTracklet - firstTrackletInRowBlock] = iTracklet; | |
1193 | } | |
31649d4b | 1194 | #endif //!HLTCA_GPU_EMULATION_SINGLE_TRACKLET |
b22af1bf | 1195 | } |
1196 | ||
1197 | GPUg() void AliHLTTPCCATrackletConstructorInit(int iSlice) | |
1198 | { | |
1199 | //GPU Wrapper for AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorInit | |
1200 | AliHLTTPCCATracker &tracker = ( ( AliHLTTPCCATracker* ) gAliHLTTPCCATracker )[iSlice]; | |
1201 | int i = blockIdx.x * blockDim.x + threadIdx.x; | |
1202 | if (i >= *tracker.NTracklets()) return; | |
1203 | AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorInit(i, tracker); | |
1204 | } | |
1205 | ||
1206 | GPUg() void AliHLTTPCCATrackletConstructorNewGPU() | |
1207 | { | |
1208 | //GPU Wrapper for AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorNewGPU | |
1209 | AliHLTTPCCATracker *pTracker = ( ( AliHLTTPCCATracker* ) gAliHLTTPCCATracker ); | |
1210 | AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorNewGPU(pTracker); | |
1211 | } | |
1212 | ||
31649d4b | 1213 | #else //HLTCA_GPUCODE |
1214 | ||
b22af1bf | 1215 | GPUd() void AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorNewCPU(AliHLTTPCCATracker &tracker) |
1216 | { | |
1217 | //Tracklet constructor simple CPU Function that does not neew a scheduler | |
1218 | GPUshared() AliHLTTPCCASharedMemory sMem; | |
1219 | sMem.fNTracklets = *tracker.NTracklets(); | |
1220 | for (int iTracklet = 0;iTracklet < *tracker.NTracklets();iTracklet++) | |
1221 | { | |
1222 | AliHLTTPCCATrackParam tParam; | |
1223 | AliHLTTPCCAThreadMemory rMem; | |
1224 | ||
1225 | AliHLTTPCCAHitId id = tracker.TrackletStartHits()[iTracklet]; | |
1226 | ||
1227 | rMem.fStartRow = rMem.fEndRow = rMem.fFirstRow = rMem.fLastRow = id.RowIndex(); | |
1228 | rMem.fCurrIH = id.HitIndex(); | |
1229 | rMem.fStage = 0; | |
1230 | rMem.fNHits = 0; | |
1231 | rMem.fNMissed = 0; | |
1232 | ||
1233 | AliHLTTPCCATrackletConstructor::InitTracklet(tParam); | |
1234 | ||
1235 | rMem.fItr = iTracklet; | |
1236 | rMem.fGo = 1; | |
1237 | ||
8566066c | 1238 | for (int j = rMem.fStartRow;j < tracker.Param().NRows();j++) |
1239 | { | |
1240 | UpdateTracklet(1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j); | |
1241 | if (!rMem.fGo) break; | |
1242 | } | |
1243 | ||
1244 | rMem.fNMissed = 0; | |
1245 | rMem.fStage = 2; | |
1246 | if ( rMem.fGo ) | |
1247 | { | |
1248 | if ( !tParam.TransportToX( tracker.Row( rMem.fEndRow ).X(), tracker.Param().ConstBz(), .999 ) ) rMem.fGo = 0; | |
1249 | } | |
1250 | ||
1251 | for (int j = rMem.fEndRow;j >= 0;j--) | |
1252 | { | |
1253 | if (!rMem.fGo) break; | |
1254 | UpdateTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j); | |
1255 | } | |
1256 | ||
b22af1bf | 1257 | StoreTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam ); |
1258 | } | |
1259 | } | |
31649d4b | 1260 | #endif //HLTCA_GPUCODE |