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