Line data Source code
1 : // @(#) $Id: AliHLTTPCCATrackletConstructor.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 "AliHLTTPCCATracker.h"
21 : #include "AliHLTTPCCATrackParam.h"
22 : #include "AliHLTTPCCATrackParam.h"
23 : #include "AliHLTTPCCAGrid.h"
24 : #include "AliHLTTPCCAMath.h"
25 : #include "AliHLTTPCCADef.h"
26 : #include "AliHLTTPCCATracklet.h"
27 : #include "AliHLTTPCCATrackletConstructor.h"
28 :
29 : #define kMaxRowGap 4
30 :
31 : MEM_CLASS_PRE2() GPUdi() void AliHLTTPCCATrackletConstructor::InitTracklet( MEM_LG2(AliHLTTPCCATrackParam) &tParam )
32 : {
33 : //Initialize Tracklet Parameters using default values
34 0 : tParam.InitParam();
35 0 : }
36 :
37 : MEM_CLASS_PRE2() GPUdi() bool AliHLTTPCCATrackletConstructor::CheckCov(MEM_LG2(AliHLTTPCCATrackParam) &tParam)
38 : {
39 : bool ok = 1;
40 0 : const float *c = tParam.Cov();
41 0 : for ( int i = 0; i < 15; i++ ) ok = ok && CAMath::Finite( c[i] );
42 0 : for ( int i = 0; i < 5; i++ ) ok = ok && CAMath::Finite( tParam.Par()[i] );
43 0 : ok = ok && ( tParam.X() > 50 );
44 0 : if ( c[0] <= 0 || c[2] <= 0 || c[5] <= 0 || c[9] <= 0 || c[14] <= 0 ) ok = 0;
45 0 : return(ok);
46 : }
47 :
48 :
49 : MEM_CLASS_PRE23() GPUdi() void AliHLTTPCCATrackletConstructor::StoreTracklet
50 : ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/,
51 : GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory)
52 : #if defined(HLTCA_GPUCODE) | defined(EXTERN_ROW_HITS)
53 : &s
54 : #else
55 : &/*s*/
56 : #endif //!HLTCA_GPUCODE
57 : , AliHLTTPCCAThreadMemory &r, GPUconstant() MEM_LG2(AliHLTTPCCATracker) &tracker, MEM_LG3(AliHLTTPCCATrackParam) &tParam )
58 : {
59 : // reconstruction of tracklets, tracklet store step
60 :
61 : do {
62 0 : if ( r.fNHits < TRACKLET_SELECTOR_MIN_HITS(tParam.QPt()) ) {
63 0 : r.fNHits = 0;
64 0 : break;
65 : }
66 :
67 : if ( 0 ) {
68 : if ( 1. / .5 < CAMath::Abs( tParam.QPt() ) ) { //SG!!!
69 : r.fNHits = 0;
70 : break;
71 : }
72 : }
73 :
74 : {
75 0 : bool ok = CheckCov(tParam);
76 :
77 0 : if ( !ok ) {
78 0 : r.fNHits = 0;
79 0 : break;
80 : }
81 0 : }
82 : } while ( 0 );
83 :
84 0 : if ( !SAVE() ) return;
85 :
86 : /*#ifndef HLTCA_GPUCODE
87 : printf("Tracklet %d: Hits %3d NDF %3d Chi %8.4f Sign %f Cov: %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f %2.4f\n", r.fItr, r.fNHits, tParam.GetNDF(), tParam.GetChi2(), tParam.GetSignCosPhi(),
88 : tParam.Cov()[0], tParam.Cov()[1], tParam.Cov()[2], tParam.Cov()[3], tParam.Cov()[4], tParam.Cov()[5], tParam.Cov()[6], tParam.Cov()[7], tParam.Cov()[8], tParam.Cov()[9],
89 : tParam.Cov()[10], tParam.Cov()[11], tParam.Cov()[12], tParam.Cov()[13], tParam.Cov()[14]);
90 : #endif*/
91 :
92 0 : GPUglobalref() MEM_GLOBAL(AliHLTTPCCATracklet) &tracklet = tracker.Tracklets()[r.fItr];
93 :
94 0 : tracklet.SetNHits( r.fNHits );
95 :
96 0 : if ( r.fNHits > 0 ) {
97 0 : if ( CAMath::Abs( tParam.Par()[4] ) < 1.e-4 ) tParam.SetPar( 4, 1.e-4 );
98 0 : if (r.fStartRow < r.fFirstRow) r.fFirstRow = r.fStartRow;
99 0 : tracklet.SetFirstRow( r.fFirstRow );
100 0 : tracklet.SetLastRow( r.fLastRow );
101 : #ifdef HLTCA_GPUCODE
102 : tracklet.SetParam( tParam.fParam );
103 : #else
104 0 : tracklet.SetParam( tParam.GetParam() );
105 : #endif //HLTCA_GPUCODE
106 0 : int w = tracker.CalculateHitWeight(r.fNHits, tParam.GetChi2(), r.fItr);
107 0 : tracklet.SetHitWeight(w);
108 0 : for ( int iRow = r.fFirstRow; iRow <= r.fLastRow; iRow++ ) {
109 : #ifdef EXTERN_ROW_HITS
110 0 : int ih = tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr];
111 : #else
112 : int ih = tracklet.RowHit( iRow );
113 : #endif //EXTERN_ROW_HITS
114 0 : if ( ih >= 0 ) {
115 : #if defined(HLTCA_GPUCODE)
116 : tracker.MaximizeHitWeight( s.fRows[ iRow ], ih, w );
117 : #else
118 0 : tracker.MaximizeHitWeight( tracker.Row( iRow ), ih, w );
119 : #endif //HLTCA_GPUCODE
120 0 : }
121 : }
122 0 : }
123 :
124 0 : }
125 :
126 : MEM_CLASS_PRE2() GPUdi() void AliHLTTPCCATrackletConstructor::UpdateTracklet
127 : ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/,
128 : GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory)
129 : #if defined(HLTCA_GPUCODE) | defined(EXTERN_ROW_HITS)
130 : &s
131 : #else
132 : &/*s*/
133 : #endif //HLTCA_GPUCODE
134 : , AliHLTTPCCAThreadMemory &r, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker, MEM_LG2(AliHLTTPCCATrackParam) &tParam, int iRow )
135 : {
136 : // reconstruction of tracklets, tracklets update step
137 :
138 0 : if ( !r.fGo ) return;
139 :
140 : #ifndef EXTERN_ROW_HITS
141 : AliHLTTPCCATracklet &tracklet = tracker.Tracklets()[r.fItr];
142 : #endif //EXTERN_ROW_HITS
143 :
144 : #if defined(HLTCA_GPUCODE)
145 : const GPUsharedref() MEM_LOCAL(AliHLTTPCCARow) &row = s.fRows[iRow];
146 : #else
147 0 : const GPUglobalref() MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( iRow );
148 : #endif //HLTCA_GPUCODE
149 :
150 0 : float y0 = row.Grid().YMin();
151 0 : float stepY = row.HstepY();
152 0 : float z0 = row.Grid().ZMin();
153 0 : float stepZ = row.HstepZ();
154 0 : float stepYi = row.HstepYi();
155 0 : float stepZi = row.HstepZi();
156 :
157 0 : if ( r.fStage == 0 ) { // fitting part
158 : do {
159 :
160 0 : if ( iRow < r.fStartRow || r.fCurrIH < 0 ) break;
161 0 : if ( ( iRow - r.fStartRow ) % 2 != 0 )
162 : {
163 : #ifndef EXTERN_ROW_HITS
164 : tracklet.SetRowHit(iRow, -1);
165 : #else
166 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
167 : #endif //EXTERN_ROW_HITS
168 0 : break; // SG!!! - jump over the row
169 : }
170 :
171 :
172 : ushort2 hh;
173 : #if defined(HLTCA_GPU_TEXTURE_FETCH)
174 : hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + r.fCurrIH);
175 : #else
176 0 : hh = tracker.HitData(row)[r.fCurrIH];
177 : #endif //HLTCA_GPU_TEXTURE_FETCH
178 :
179 0 : int oldIH = r.fCurrIH;
180 : #if defined(HLTCA_GPU_TEXTURE_FETCH)
181 : r.fCurrIH = tex1Dfetch(gAliTexRefs, ((char*) tracker.Data().HitLinkUpData(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + r.fCurrIH);
182 : #else
183 0 : r.fCurrIH = tracker.HitLinkUpData(row)[r.fCurrIH]; // read from linkup data
184 : #endif //HLTCA_GPU_TEXTURE_FETCH
185 :
186 0 : float x = row.X();
187 0 : float y = y0 + hh.x * stepY;
188 0 : float z = z0 + hh.y * stepZ;
189 :
190 0 : if ( iRow == r.fStartRow ) {
191 0 : tParam.SetX( x );
192 0 : tParam.SetY( y );
193 0 : tParam.SetZ( z );
194 0 : r.fLastY = y;
195 0 : r.fLastZ = z;
196 0 : } else {
197 :
198 0 : float err2Y, err2Z;
199 0 : float dx = x - tParam.X();
200 0 : float dy = y - r.fLastY;//tParam.Y();
201 0 : float dz = z - r.fLastZ;//tParam.Z();
202 0 : r.fLastY = y;
203 0 : r.fLastZ = z;
204 :
205 0 : float ri = 1. / CAMath::Sqrt( dx * dx + dy * dy );
206 0 : if ( iRow == r.fStartRow + 2 ) { //SG!!! important - thanks to Matthias
207 0 : tParam.SetSinPhi( dy*ri );
208 0 : tParam.SetSignCosPhi( dx );
209 0 : tParam.SetDzDs( dz*ri );
210 : //std::cout << "Init. errors... " << r.fItr << std::endl;
211 0 : tracker.GetErrors2( iRow, tParam, err2Y, err2Z );
212 : //std::cout << "Init. errors = " << err2Y << " " << err2Z << std::endl;
213 0 : tParam.SetCov( 0, err2Y );
214 0 : tParam.SetCov( 2, err2Z );
215 0 : }
216 : float sinPhi, cosPhi;
217 0 : if ( r.fNHits >= 10 && CAMath::Abs( tParam.SinPhi() ) < .99 ) {
218 0 : sinPhi = tParam.SinPhi();
219 0 : cosPhi = CAMath::Sqrt( 1 - sinPhi * sinPhi );
220 0 : } else {
221 0 : sinPhi = dy * ri;
222 0 : cosPhi = dx * ri;
223 : }
224 0 : if ( !tParam.TransportToX( x, sinPhi, cosPhi, tracker.Param().ConstBz(), -1 ) ) {
225 : #ifndef EXTERN_ROW_HITS
226 : tracklet.SetRowHit( iRow, -1 );
227 : #else
228 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
229 : #endif //EXTERN_ROW_HITS
230 0 : break;
231 : }
232 0 : tracker.GetErrors2( iRow, tParam.GetZ(), sinPhi, cosPhi, tParam.GetDzDs(), err2Y, err2Z );
233 :
234 0 : if ( !tParam.Filter( y, z, err2Y, err2Z, .99 ) ) {
235 : #ifndef EXTERN_ROW_HITS
236 : tracklet.SetRowHit( iRow, -1 );
237 : #else
238 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
239 : #endif //EXTERN_ROW_HITS
240 0 : break;
241 : }
242 0 : }
243 : #ifndef EXTERN_ROW_HITS
244 : tracklet.SetRowHit( iRow, oldIH );
245 : #else
246 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = oldIH;
247 : #endif //!EXTERN_ROW_HITS
248 0 : r.fNHits++;
249 0 : r.fLastRow = iRow;
250 0 : r.fEndRow = iRow;
251 0 : break;
252 : } while ( 0 );
253 :
254 0 : if ( r.fCurrIH < 0 ) {
255 0 : r.fStage = 1;
256 0 : if ( CAMath::Abs( tParam.SinPhi() ) > .999 ) {
257 0 : r.fNHits = 0; r.fGo = 0;
258 0 : } else {
259 : //tParam.SetCosPhi( CAMath::Sqrt(1-tParam.SinPhi()*tParam.SinPhi()) );
260 : }
261 : }
262 : } else { // forward/backward searching part
263 : do {
264 0 : if ( r.fStage == 2 && ( ( iRow >= r.fEndRow ) ||
265 0 : ( iRow >= r.fStartRow && ( iRow - r.fStartRow ) % 2 == 0 )
266 : ) ) break;
267 0 : if ( r.fNMissed > kMaxRowGap ) {
268 : break;
269 : }
270 :
271 0 : r.fNMissed++;
272 :
273 0 : float x = row.X();
274 0 : float err2Y, err2Z;
275 0 : if ( !tParam.TransportToX( x, tParam.SinPhi(), tParam.GetCosPhi(), tracker.Param().ConstBz(), .99 ) ) {
276 : #ifndef EXTERN_ROW_HITS
277 : tracklet.SetRowHit(iRow, -1);
278 : #else
279 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
280 : #endif //!EXTERN_ROW_HITS
281 0 : break;
282 : }
283 0 : if ( row.NHits() < 1 ) {
284 : // skip empty row
285 : #ifndef EXTERN_ROW_HITS
286 : tracklet.SetRowHit(iRow, -1);
287 : #else
288 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
289 : #endif //!EXTERN_ROW_HITS
290 0 : break;
291 : }
292 :
293 : #ifndef HLTCA_GPU_TEXTURE_FETCH
294 0 : GPUglobalref() const ushort2 *hits = tracker.HitData(row);
295 : #endif //!HLTCA_GPU_TEXTURE_FETCH
296 :
297 0 : float fY = tParam.GetY();
298 0 : float fZ = tParam.GetZ();
299 : int best = -1;
300 :
301 : { // search for the closest hit
302 0 : const int fIndYmin = row.Grid().GetBinBounded( fY - 1.f, fZ - 1.f );
303 0 : assert( fIndYmin >= 0 );
304 :
305 : int ds;
306 0 : int fY0 = ( int ) ( ( fY - y0 ) * stepYi );
307 0 : int fZ0 = ( int ) ( ( fZ - z0 ) * stepZi );
308 : int ds0 = ( ( ( int )1 ) << 30 );
309 : ds = ds0;
310 :
311 : unsigned int fHitYfst = 1, fHitYlst = 0, fHitYfst1 = 1, fHitYlst1 = 0;
312 :
313 : {
314 0 : int nY = row.Grid().Ny();
315 :
316 : #ifndef HLTCA_GPU_TEXTURE_FETCH
317 0 : GPUglobalref() const unsigned short *sGridP = tracker.FirstHitInBin(row);
318 : #endif //!HLTCA_GPU_TEXTURE_FETCH
319 :
320 : #ifdef HLTCA_GPU_TEXTURE_FETCH
321 : fHitYfst = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin);
322 : fHitYlst = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+2);
323 : fHitYfst1 = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+nY);
324 : fHitYlst1 = tex1Dfetch(gAliTexRefu, ((char*) tracker.Data().FirstHitInBin(row) - tracker.Data().GPUTextureBase()) / sizeof(unsigned short) + fIndYmin+nY+2);
325 : #else
326 0 : fHitYfst = sGridP[fIndYmin];
327 0 : fHitYlst = sGridP[fIndYmin+2];
328 0 : fHitYfst1 = sGridP[fIndYmin+nY];
329 0 : fHitYlst1 = sGridP[fIndYmin+nY+2];
330 : #endif //HLTCA_GPU_TEXTURE_FETCH
331 0 : assert( (signed) fHitYfst <= row.NHits() );
332 0 : assert( (signed) fHitYlst <= row.NHits() );
333 0 : assert( (signed) fHitYfst1 <= row.NHits() );
334 0 : assert( (signed) fHitYlst1 <= row.NHits() );
335 : }
336 :
337 0 : for ( unsigned int fIh = fHitYfst; fIh < fHitYlst; fIh++ ) {
338 0 : assert( (signed) fIh < row.NHits() );
339 : ushort2 hh;
340 0 : if (r.fStage <= 2 || tracker.HitWeight(row, fIh) >= 0)
341 : {
342 :
343 : #if defined(HLTCA_GPU_TEXTURE_FETCH)
344 : hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh);
345 : #else
346 0 : hh = hits[fIh];
347 : #endif //HLTCA_GPU_TEXTURE_FETCH
348 0 : int ddy = ( int )( hh.x ) - fY0;
349 0 : int ddz = ( int )( hh.y ) - fZ0;
350 0 : int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz );
351 0 : if ( dds < ds ) {
352 : ds = dds;
353 : best = fIh;
354 0 : }
355 0 : }
356 : }
357 :
358 0 : for ( unsigned int fIh = fHitYfst1; fIh < fHitYlst1; fIh++ ) {
359 : ushort2 hh;
360 : #if defined(HLTCA_GPU_TEXTURE_FETCH)
361 : hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh);
362 : #else
363 0 : hh = hits[fIh];
364 : #endif //HLTCA_GPU_TEXTURE_FETCH
365 0 : int ddy = ( int )( hh.x ) - fY0;
366 0 : int ddz = ( int )( hh.y ) - fZ0;
367 0 : int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz );
368 0 : if ( dds < ds ) {
369 : ds = dds;
370 : best = fIh;
371 0 : }
372 : }
373 : }// end of search for the closest hit
374 :
375 0 : if ( best < 0 )
376 : {
377 : #ifndef EXTERN_ROW_HITS
378 : tracklet.SetRowHit(iRow, -1);
379 : #else
380 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
381 : #endif //!EXTERN_ROW_HITS
382 0 : break;
383 : }
384 :
385 : ushort2 hh;
386 : #if defined(HLTCA_GPU_TEXTURE_FETCH)
387 : hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + best);
388 : #else
389 0 : hh = hits[best];
390 : #endif //HLTCA_GPU_TEXTURE_FETCH
391 :
392 0 : tracker.GetErrors2( iRow, *( ( MEM_LG2(AliHLTTPCCATrackParam)* )&tParam ), err2Y, err2Z );
393 :
394 0 : float y = y0 + hh.x * stepY;
395 0 : float z = z0 + hh.y * stepZ;
396 0 : float dy = y - fY;
397 0 : float dz = z - fZ;
398 :
399 0 : const float kFactor = tracker.Param().HitPickUpFactor() * tracker.Param().HitPickUpFactor() * 3.5 * 3.5;
400 0 : float sy2 = kFactor * ( tParam.GetErr2Y() + err2Y );
401 0 : float sz2 = kFactor * ( tParam.GetErr2Z() + err2Z );
402 0 : if ( sy2 > 2. ) sy2 = 2.;
403 0 : if ( sz2 > 2. ) sz2 = 2.;
404 :
405 0 : if ( CAMath::FMulRZ( dy, dy ) > sy2 || CAMath::FMulRZ( dz, dz ) > sz2 ) {
406 : #ifndef EXTERN_ROW_HITS
407 : tracklet.SetRowHit(iRow, -1);
408 : #else
409 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
410 : #endif //!EXTERN_ROW_HITS
411 0 : break;
412 : }
413 : #ifdef GLOBAL_TRACKING_EXTRAPOLATE_ONLY
414 : if ( r.fStage <= 2)
415 : #endif
416 0 : if (!tParam.Filter( y, z, err2Y, err2Z, .99 ) ) {
417 0 : break;
418 : }
419 : #ifndef EXTERN_ROW_HITS
420 : tracklet.SetRowHit( iRow, best );
421 : #else
422 0 : tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = best;
423 : #endif //!EXTERN_ROW_HITS
424 0 : r.fNHits++;
425 0 : r.fNMissed = 0;
426 0 : if ( r.fStage == 1 ) r.fLastRow = iRow;
427 0 : else r.fFirstRow = iRow;
428 0 : } while ( 0 );
429 : }
430 0 : }
431 :
432 : #ifdef HLTCA_GPUCODE
433 :
434 : #include "AliHLTTPCCATrackletConstructorGPU.h"
435 :
436 : #else //HLTCA_GPUCODE
437 :
438 : GPUdi() void AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorCPU(AliHLTTPCCATracker &tracker)
439 : {
440 : //Tracklet constructor simple CPU Function that does not neew a scheduler
441 0 : GPUshared() AliHLTTPCCASharedMemory sMem;
442 0 : sMem.fNTracklets = *tracker.NTracklets();
443 0 : for (int iTracklet = 0;iTracklet < *tracker.NTracklets();iTracklet++)
444 : {
445 0 : AliHLTTPCCATrackParam tParam;
446 0 : AliHLTTPCCAThreadMemory rMem;
447 :
448 0 : AliHLTTPCCAHitId id = tracker.TrackletStartHits()[iTracklet];
449 :
450 0 : rMem.fStartRow = rMem.fEndRow = rMem.fFirstRow = rMem.fLastRow = id.RowIndex();
451 0 : rMem.fCurrIH = id.HitIndex();
452 0 : rMem.fStage = 0;
453 0 : rMem.fNHits = 0;
454 0 : rMem.fNMissed = 0;
455 :
456 0 : AliHLTTPCCATrackletConstructor::InitTracklet(tParam);
457 :
458 0 : rMem.fItr = iTracklet;
459 0 : rMem.fGo = 1;
460 :
461 0 : for (int j = rMem.fStartRow;j < tracker.Param().NRows();j++)
462 : {
463 0 : UpdateTracklet(1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j);
464 0 : if (!rMem.fGo) break;
465 : }
466 :
467 0 : rMem.fNMissed = 0;
468 0 : rMem.fStage = 2;
469 0 : if ( rMem.fGo )
470 : {
471 0 : if ( !tParam.TransportToX( tracker.Row( rMem.fEndRow ).X(), tracker.Param().ConstBz(), .999 ) ) rMem.fGo = 0;
472 : }
473 :
474 0 : for (int j = rMem.fEndRow;j >= 0;j--)
475 : {
476 0 : if (!rMem.fGo) break;
477 0 : UpdateTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j);
478 : }
479 :
480 0 : StoreTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam );
481 0 : }
482 0 : }
483 :
484 : GPUdi() int AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorGlobalTracking(AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam& tParam, int row, int increment)
485 : {
486 0 : AliHLTTPCCAThreadMemory rMem;
487 0 : GPUshared() AliHLTTPCCASharedMemory sMem;
488 0 : sMem.fNTracklets = *tracker.NTracklets();
489 0 : rMem.fItr = 0;
490 0 : rMem.fStage = 3;
491 0 : rMem.fNHits = rMem.fNMissed = 0;
492 0 : rMem.fGo = 1;
493 0 : while (rMem.fGo && row >= 0 && row < tracker.Param().NRows())
494 : {
495 0 : UpdateTracklet(1, 1, 0, 0, sMem, rMem, tracker, tParam, row);
496 0 : row += increment;
497 : }
498 0 : if (!CheckCov(tParam)) rMem.fNHits = 0;
499 0 : return(rMem.fNHits);
500 0 : }
501 :
502 : #endif //HLTCA_GPUCODE
|