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. *
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. *
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. *
18 //***************************************************************************
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"
31 GPUdi() void AliHLTTPCCATrackletConstructor::InitTracklet( AliHLTTPCCATrackParam &tParam )
33 //Initialize Tracklet Parameters using default values
37 GPUdi() bool AliHLTTPCCATrackletConstructor::CheckCov(AliHLTTPCCATrackParam &tParam)
40 const float *c = tParam.Cov();
41 for ( int i = 0; i < 15; i++ ) ok = ok && CAMath::Finite( c[i] );
42 for ( int i = 0; i < 5; i++ ) ok = ok && CAMath::Finite( tParam.Par()[i] );
43 ok = ok && ( tParam.X() > 50 );
44 if ( c[0] <= 0 || c[2] <= 0 || c[5] <= 0 || c[9] <= 0 || c[14] <= 0 ) ok = 0;
49 GPUdi() void AliHLTTPCCATrackletConstructor::StoreTracklet
50 ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/,
51 AliHLTTPCCASharedMemory
52 #if defined(HLTCA_GPUCODE) | defined(EXTERN_ROW_HITS)
56 #endif //!HLTCA_GPUCODE
57 , AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam )
59 // reconstruction of tracklets, tracklet store step
62 if ( r.fNHits < TRACKLET_SELECTOR_MIN_HITS ) {
68 if ( 1. / .5 < CAMath::Abs( tParam.QPt() ) ) { //SG!!!
75 bool ok = CheckCov(tParam);
84 if ( !SAVE() ) return;
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]);
92 AliHLTTPCCATracklet &tracklet = tracker.Tracklets()[r.fItr];
94 tracklet.SetNHits( r.fNHits );
97 if ( CAMath::Abs( tParam.Par()[4] ) < 1.e-4 ) tParam.SetPar( 4, 1.e-4 );
98 if (r.fStartRow < r.fFirstRow) r.fFirstRow = r.fStartRow;
99 tracklet.SetFirstRow( r.fFirstRow );
100 tracklet.SetLastRow( r.fLastRow );
102 tracklet.SetParam( tParam.fParam );
104 tracklet.SetParam( tParam.GetParam() );
105 #endif //HLTCA_GPUCODE
106 int w = tracker.CalculateHitWeight(r.fNHits, tParam.GetChi2(), r.fItr);
107 tracklet.SetHitWeight(w);
108 for ( int iRow = r.fFirstRow; iRow <= r.fLastRow; iRow++ ) {
109 #ifdef EXTERN_ROW_HITS
110 int ih = tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr];
112 int ih = tracklet.RowHit( iRow );
113 #endif //EXTERN_ROW_HITS
115 #if defined(HLTCA_GPUCODE)
116 tracker.MaximizeHitWeight( s.fRows[ iRow ], ih, w );
118 tracker.MaximizeHitWeight( tracker.Row( iRow ), ih, w );
119 #endif //HLTCA_GPUCODE
126 GPUdi() void AliHLTTPCCATrackletConstructor::UpdateTracklet
127 ( int /*nBlocks*/, int /*nThreads*/, int /*iBlock*/, int /*iThread*/,
128 AliHLTTPCCASharedMemory
129 #if defined(HLTCA_GPUCODE) | defined(EXTERN_ROW_HITS)
133 #endif //HLTCA_GPUCODE
134 , AliHLTTPCCAThreadMemory &r, AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam &tParam, int iRow )
136 // reconstruction of tracklets, tracklets update step
138 if ( !r.fGo ) return;
140 #ifndef EXTERN_ROW_HITS
141 AliHLTTPCCATracklet &tracklet = tracker.Tracklets()[r.fItr];
142 #endif //EXTERN_ROW_HITS
144 #if defined(HLTCA_GPUCODE)
145 const AliHLTTPCCARow &row = s.fRows[iRow];
147 const AliHLTTPCCARow &row = tracker.Row( iRow );
148 #endif //HLTCA_GPUCODE
150 float y0 = row.Grid().YMin();
151 float stepY = row.HstepY();
152 float z0 = row.Grid().ZMin();
153 float stepZ = row.HstepZ();
154 float stepYi = row.HstepYi();
155 float stepZi = row.HstepZi();
157 if ( r.fStage == 0 ) { // fitting part
160 if ( iRow < r.fStartRow || r.fCurrIH < 0 ) break;
161 if ( ( iRow - r.fStartRow ) % 2 != 0 )
163 #ifndef EXTERN_ROW_HITS
164 tracklet.SetRowHit(iRow, -1);
166 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
167 #endif //EXTERN_ROW_HITS
168 break; // SG!!! - jump over the row
173 #if defined(HLTCA_GPU_TEXTURE_FETCH)
174 hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + r.fCurrIH);
176 hh = tracker.HitData(row)[r.fCurrIH];
177 #endif //HLTCA_GPU_TEXTURE_FETCH
179 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);
183 r.fCurrIH = tracker.HitLinkUpData(row)[r.fCurrIH]; // read from linkup data
184 #endif //HLTCA_GPU_TEXTURE_FETCH
187 float y = y0 + hh.x * stepY;
188 float z = z0 + hh.y * stepZ;
190 if ( iRow == r.fStartRow ) {
199 float dx = x - tParam.X();
200 float dy = y - r.fLastY;//tParam.Y();
201 float dz = z - r.fLastZ;//tParam.Z();
205 float ri = 1. / CAMath::Sqrt( dx * dx + dy * dy );
206 if ( iRow == r.fStartRow + 2 ) { //SG!!! important - thanks to Matthias
207 tParam.SetSinPhi( dy*ri );
208 tParam.SetSignCosPhi( dx );
209 tParam.SetDzDs( dz*ri );
210 //std::cout << "Init. errors... " << r.fItr << std::endl;
211 tracker.GetErrors2( iRow, tParam, err2Y, err2Z );
212 //std::cout << "Init. errors = " << err2Y << " " << err2Z << std::endl;
213 tParam.SetCov( 0, err2Y );
214 tParam.SetCov( 2, err2Z );
216 float sinPhi, cosPhi;
217 if ( r.fNHits >= 10 && CAMath::Abs( tParam.SinPhi() ) < .99 ) {
218 sinPhi = tParam.SinPhi();
219 cosPhi = CAMath::Sqrt( 1 - sinPhi * sinPhi );
224 if ( !tParam.TransportToX( x, sinPhi, cosPhi, tracker.Param().ConstBz(), -1 ) ) {
225 #ifndef EXTERN_ROW_HITS
226 tracklet.SetRowHit( iRow, -1 );
228 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
229 #endif //EXTERN_ROW_HITS
232 tracker.GetErrors2( iRow, tParam.GetZ(), sinPhi, cosPhi, tParam.GetDzDs(), err2Y, err2Z );
234 if ( !tParam.Filter( y, z, err2Y, err2Z, .99 ) ) {
235 #ifndef EXTERN_ROW_HITS
236 tracklet.SetRowHit( iRow, -1 );
238 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
239 #endif //EXTERN_ROW_HITS
243 #ifndef EXTERN_ROW_HITS
244 tracklet.SetRowHit( iRow, oldIH );
246 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = oldIH;
247 #endif //!EXTERN_ROW_HITS
254 if ( r.fCurrIH < 0 ) {
256 if ( CAMath::Abs( tParam.SinPhi() ) > .999 ) {
257 r.fNHits = 0; r.fGo = 0;
259 //tParam.SetCosPhi( CAMath::Sqrt(1-tParam.SinPhi()*tParam.SinPhi()) );
262 } else { // forward/backward searching part
264 if ( r.fStage == 2 && ( ( iRow >= r.fEndRow ) ||
265 ( iRow >= r.fStartRow && ( iRow - r.fStartRow ) % 2 == 0 )
267 if ( r.fNMissed > kMaxRowGap ) {
275 if ( !tParam.TransportToX( x, tParam.SinPhi(), tParam.GetCosPhi(), tracker.Param().ConstBz(), .99 ) ) {
276 #ifndef EXTERN_ROW_HITS
277 tracklet.SetRowHit(iRow, -1);
279 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
280 #endif //!EXTERN_ROW_HITS
283 if ( row.NHits() < 1 ) {
285 #ifndef EXTERN_ROW_HITS
286 tracklet.SetRowHit(iRow, -1);
288 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
289 #endif //!EXTERN_ROW_HITS
293 #ifndef HLTCA_GPU_TEXTURE_FETCH
294 const ushort2 *hits = tracker.HitData(row);
295 #endif //!HLTCA_GPU_TEXTURE_FETCH
297 float fY = tParam.GetY();
298 float fZ = tParam.GetZ();
301 { // search for the closest hit
302 const int fIndYmin = row.Grid().GetBinBounded( fY - 1.f, fZ - 1.f );
303 assert( fIndYmin >= 0 );
306 int fY0 = ( int ) ( ( fY - y0 ) * stepYi );
307 int fZ0 = ( int ) ( ( fZ - z0 ) * stepZi );
308 int ds0 = ( ( ( int )1 ) << 30 );
311 unsigned int fHitYfst = 1, fHitYlst = 0, fHitYfst1 = 1, fHitYlst1 = 0;
314 int nY = row.Grid().Ny();
316 #ifndef HLTCA_GPU_TEXTURE_FETCH
317 const unsigned short *sGridP = tracker.FirstHitInBin(row);
318 #endif //!HLTCA_GPU_TEXTURE_FETCH
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);
326 fHitYfst = sGridP[fIndYmin];
327 fHitYlst = sGridP[fIndYmin+2];
328 fHitYfst1 = sGridP[fIndYmin+nY];
329 fHitYlst1 = sGridP[fIndYmin+nY+2];
330 #endif //HLTCA_GPU_TEXTURE_FETCH
331 assert( (signed) fHitYfst <= row.NHits() );
332 assert( (signed) fHitYlst <= row.NHits() );
333 assert( (signed) fHitYfst1 <= row.NHits() );
334 assert( (signed) fHitYlst1 <= row.NHits() );
337 for ( unsigned int fIh = fHitYfst; fIh < fHitYlst; fIh++ ) {
338 assert( (signed) fIh < row.NHits() );
340 if (r.fStage <= 2 || tracker.HitWeight(row, fIh) >= 0)
343 #if defined(HLTCA_GPU_TEXTURE_FETCH)
344 hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh);
347 #endif //HLTCA_GPU_TEXTURE_FETCH
348 int ddy = ( int )( hh.x ) - fY0;
349 int ddz = ( int )( hh.y ) - fZ0;
350 int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz );
358 for ( unsigned int fIh = fHitYfst1; fIh < fHitYlst1; fIh++ ) {
360 #if defined(HLTCA_GPU_TEXTURE_FETCH)
361 hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + fIh);
364 #endif //HLTCA_GPU_TEXTURE_FETCH
365 int ddy = ( int )( hh.x ) - fY0;
366 int ddz = ( int )( hh.y ) - fZ0;
367 int dds = CAMath::Abs( ddy ) + CAMath::Abs( ddz );
373 }// end of search for the closest hit
377 #ifndef EXTERN_ROW_HITS
378 tracklet.SetRowHit(iRow, -1);
380 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
381 #endif //!EXTERN_ROW_HITS
386 #if defined(HLTCA_GPU_TEXTURE_FETCH)
387 hh = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + best);
390 #endif //HLTCA_GPU_TEXTURE_FETCH
392 tracker.GetErrors2( iRow, *( ( AliHLTTPCCATrackParam* )&tParam ), err2Y, err2Z );
394 float y = y0 + hh.x * stepY;
395 float z = z0 + hh.y * stepZ;
399 const float kFactor = tracker.Param().HitPickUpFactor() * tracker.Param().HitPickUpFactor() * 3.5 * 3.5;
400 float sy2 = kFactor * ( tParam.GetErr2Y() + err2Y );
401 float sz2 = kFactor * ( tParam.GetErr2Z() + err2Z );
402 if ( sy2 > 2. ) sy2 = 2.;
403 if ( sz2 > 2. ) sz2 = 2.;
405 if ( CAMath::FMulRZ( dy, dy ) > sy2 || CAMath::FMulRZ( dz, dz ) > sz2 ) {
406 #ifndef EXTERN_ROW_HITS
407 tracklet.SetRowHit(iRow, -1);
409 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = -1;
410 #endif //!EXTERN_ROW_HITS
413 #ifdef GLOBAL_TRACKING_EXTRAPOLATE_ONLY
416 if (!tParam.Filter( y, z, err2Y, err2Z, .99 ) ) {
419 #ifndef EXTERN_ROW_HITS
420 tracklet.SetRowHit( iRow, best );
422 tracker.TrackletRowHits()[iRow * s.fNTracklets + r.fItr] = best;
423 #endif //!EXTERN_ROW_HITS
426 if ( r.fStage == 1 ) r.fLastRow = iRow;
427 else r.fFirstRow = iRow;
434 #include "AliHLTTPCCATrackletConstructorGPU.h"
436 #else //HLTCA_GPUCODE
438 GPUdi() void AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorCPU(AliHLTTPCCATracker &tracker)
440 //Tracklet constructor simple CPU Function that does not neew a scheduler
441 GPUshared() AliHLTTPCCASharedMemory sMem;
442 sMem.fNTracklets = *tracker.NTracklets();
443 for (int iTracklet = 0;iTracklet < *tracker.NTracklets();iTracklet++)
445 AliHLTTPCCATrackParam tParam;
446 AliHLTTPCCAThreadMemory rMem;
448 AliHLTTPCCAHitId id = tracker.TrackletStartHits()[iTracklet];
450 rMem.fStartRow = rMem.fEndRow = rMem.fFirstRow = rMem.fLastRow = id.RowIndex();
451 rMem.fCurrIH = id.HitIndex();
456 AliHLTTPCCATrackletConstructor::InitTracklet(tParam);
458 rMem.fItr = iTracklet;
461 for (int j = rMem.fStartRow;j < tracker.Param().NRows();j++)
463 UpdateTracklet(1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j);
464 if (!rMem.fGo) break;
471 if ( !tParam.TransportToX( tracker.Row( rMem.fEndRow ).X(), tracker.Param().ConstBz(), .999 ) ) rMem.fGo = 0;
474 for (int j = rMem.fEndRow;j >= 0;j--)
476 if (!rMem.fGo) break;
477 UpdateTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam, j);
480 StoreTracklet( 1, 1, 0, iTracklet, sMem, rMem, tracker, tParam );
484 GPUdi() int AliHLTTPCCATrackletConstructor::AliHLTTPCCATrackletConstructorGlobalTracking(AliHLTTPCCATracker &tracker, AliHLTTPCCATrackParam& tParam, int row, int increment)
486 AliHLTTPCCAThreadMemory rMem;
487 GPUshared() AliHLTTPCCASharedMemory sMem;
488 sMem.fNTracklets = *tracker.NTracklets();
491 rMem.fNHits = rMem.fNMissed = 0;
493 while (rMem.fGo && row >= 0 && row < tracker.Param().NRows())
495 UpdateTracklet(1, 1, 0, 0, sMem, rMem, tracker, tParam, row);
498 if (!CheckCov(tParam)) rMem.fNHits = 0;
502 #endif //HLTCA_GPUCODE