Line data Source code
1 : // @(#) $Id: AliHLTTPCCATrackletSelector.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 :
21 : #include "AliHLTTPCCATrackletSelector.h"
22 : #include "AliHLTTPCCATrack.h"
23 : #include "AliHLTTPCCATracker.h"
24 : #include "AliHLTTPCCATrackParam.h"
25 : #include "AliHLTTPCCATracklet.h"
26 : #include "AliHLTTPCCAMath.h"
27 :
28 : GPUdi() void AliHLTTPCCATrackletSelector::Thread
29 : ( int nBlocks, int nThreads, int iBlock, int iThread, int iSync,
30 : GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &s, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker )
31 : {
32 : // select best tracklets and kill clones
33 :
34 0 : if ( iSync == 0 ) {
35 0 : if ( iThread == 0 ) {
36 0 : s.fNTracklets = *tracker.NTracklets();
37 0 : s.fNThreadsTotal = nThreads * nBlocks;
38 0 : s.fItr0 = nThreads * iBlock;
39 0 : }
40 0 : } else if ( iSync == 1 ) {
41 : int nHits, nFirstTrackHit;
42 0 : AliHLTTPCCAHitId trackHits[160 - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE];
43 :
44 0 : for ( int itr = s.fItr0 + iThread; itr < s.fNTracklets; itr += s.fNThreadsTotal ) {
45 :
46 : #ifdef HLTCA_GPU_EMULATION_DEBUG_TRACKLET
47 : if (itr == HLTCA_GPU_EMULATION_DEBUG_TRACKLET)
48 : {
49 : tracker.GPUParameters()->fGPUError = 1;
50 : }
51 : #endif //HLTCA_GPU_EMULATION_DEBUG_TRACKLET
52 :
53 0 : while (tracker.Tracklets()[itr].NHits() == 0)
54 : {
55 0 : itr += s.fNThreadsTotal;
56 0 : if (itr >= s.fNTracklets) return;
57 : }
58 :
59 0 : GPUglobalref() MEM_GLOBAL(AliHLTTPCCATracklet) &tracklet = tracker.Tracklets()[itr];
60 : const int kMaxRowGap = 4;
61 : const float kMaxShared = .1;
62 :
63 0 : int firstRow = tracklet.FirstRow();
64 0 : int lastRow = tracklet.LastRow();
65 0 : if (firstRow < 0 || lastRow > tracker.Param().NRows() || tracklet.NHits() < 0)
66 : {
67 : #ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
68 : //tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_WRONG_ROW;
69 : //return;
70 : #else
71 : continue;
72 : #endif
73 : }
74 :
75 0 : const int w = tracklet.HitWeight();
76 :
77 : //int w = (tNHits<<16)+itr;
78 : //int nRows = tracker.Param().NRows();
79 : //std::cout<<" store tracklet: "<<firstRow<<" "<<lastRow<<std::endl;
80 :
81 : int irow = firstRow;
82 :
83 : int gap = 0;
84 : int nShared = 0;
85 : nHits = 0;
86 0 : const int minHits = TRACKLET_SELECTOR_MIN_HITS(tracklet.Param().QPt());
87 :
88 0 : for (irow = firstRow; irow <= lastRow && lastRow - irow + nHits >= minHits; irow++ )
89 : {
90 0 : gap++;
91 : #ifdef EXTERN_ROW_HITS
92 0 : int ih = tracker.TrackletRowHits()[irow * s.fNTracklets + itr];
93 : #else
94 : int ih = tracklet.RowHit( irow );
95 : #endif //EXTERN_ROW_HITS
96 0 : if ( ih >= 0 ) {
97 0 : GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( irow );
98 : #ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
99 : bool own = ( abs(tracker.HitWeight( row, ih )) <= w );
100 : #else
101 0 : bool own = ( tracker.HitWeight( row, ih ) <= w );
102 : #endif
103 0 : bool sharedOK = ( ( nShared < nHits * kMaxShared ) );
104 0 : if ( own || sharedOK ) {//SG!!!
105 : gap = 0;
106 : #if HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
107 : if (nHits < HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE)
108 : s.fHits[iThread][nHits].Set( irow, ih );
109 : else
110 : #endif //HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
111 0 : trackHits[nHits - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE].Set( irow, ih );
112 0 : nHits++;
113 0 : if ( !own ) nShared++;
114 : }
115 0 : }
116 :
117 0 : if ( gap > kMaxRowGap || irow == lastRow ) { // store
118 0 : if ( nHits >= minHits ) { //SG!!!
119 0 : int itrout = CAMath::AtomicAdd( tracker.NTracks(), 1 );
120 : #ifdef HLTCA_GPUCODE
121 : if (itrout >= HLTCA_GPU_MAX_TRACKS)
122 : {
123 : tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_TRACK_OVERFLOW;
124 : CAMath::AtomicExch( tracker.NTracks(), 0 );
125 : return;
126 : }
127 : #endif //HLTCA_GPUCODE
128 0 : nFirstTrackHit = CAMath::AtomicAdd( tracker.NTrackHits(), nHits );
129 0 : tracker.Tracks()[itrout].SetAlive(1);
130 0 : tracker.Tracks()[itrout].SetLocalTrackId(itrout);
131 0 : tracker.Tracks()[itrout].SetParam(tracklet.Param());
132 0 : tracker.Tracks()[itrout].SetFirstHitID(nFirstTrackHit);
133 0 : tracker.Tracks()[itrout].SetNHits(nHits);
134 0 : for ( int jh = 0; jh < nHits; jh++ ) {
135 : #if HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
136 : if (jh < HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE)
137 : {
138 : tracker.TrackHits()[nFirstTrackHit + jh] = s.fHits[iThread][jh];
139 : #ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
140 : tracker.SetHitWeight( tracker.Row( s.fHits[iThread][jh].RowIndex() ), s.fHits[iThread][jh].HitIndex(), -w );
141 : #endif
142 : }
143 : else
144 : #endif //HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
145 : {
146 0 : tracker.TrackHits()[nFirstTrackHit + jh] = trackHits[jh - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE];
147 : #ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
148 : tracker.SetHitWeight( tracker.Row( trackHits[jh - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE].RowIndex() ), trackHits[jh - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE].HitIndex(), -w );
149 : #endif
150 : }
151 : }
152 0 : }
153 : nHits = 0;
154 : gap = 0;
155 : nShared = 0;
156 0 : }
157 : }
158 : }
159 0 : }
160 0 : }
|