]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/tracking-ca/AliHLTTPCCATrackletSelector.cxx
fixing clang issues
[u/mrichter/AliRoot.git] / HLT / TPCLib / tracking-ca / AliHLTTPCCATrackletSelector.cxx
index 27944864ba31bb6c42b156e3025425d88b044afd..61f52aadb0472b6219e4aaaa85d716a21ebf9ab1 100644 (file)
@@ -1,6 +1,6 @@
 // @(#) $Id: AliHLTTPCCATrackletSelector.cxx 27042 2008-07-02 12:06:02Z richterm $
-//***************************************************************************
-// This file is property of and copyright by the ALICE HLT Project          * 
+// **************************************************************************
+// This file is property of and copyright by the ALICE HLT Project          *
 // ALICE Experiment at CERN, All rights reserved.                           *
 //                                                                          *
 // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
 // appear in the supporting documentation. The authors make no claims       *
 // about the suitability of this software for any purpose. It is            *
 // provided "as is" without express or implied warranty.                    *
+//                                                                          *
 //***************************************************************************
 
+
 #include "AliHLTTPCCATrackletSelector.h"
 #include "AliHLTTPCCATrack.h"
 #include "AliHLTTPCCATracker.h"
 #include "AliHLTTPCCATrackParam.h"
+#include "AliHLTTPCCATracklet.h"
 #include "AliHLTTPCCAMath.h"
 
-GPUd() void AliHLTTPCCATrackletSelector::Thread
-( Int_t nBlocks, Int_t nThreads, Int_t iBlock, Int_t iThread, Int_t iSync,
 AliHLTTPCCASharedMemory &s, AliHLTTPCCATracker &tracker )
+GPUdi() void AliHLTTPCCATrackletSelector::Thread
+( int nBlocks, int nThreads, int iBlock, int iThread, int iSync,
GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &s, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker )
 {
-  // select best tracklets and kill clones
+       // select best tracklets and kill clones
 
-  if( iSync==0 )
-    {
-      if( iThread==0 ){
-       if(iBlock==0){
-         CAMath::atomicExch(&(tracker.NTracks()),0);
-         CAMath::atomicExch(tracker.TrackHits(),0);
-       }
-       s.fNTracklets = tracker.Tracklets()[0];
-       s.fNThreadsTotal = nThreads*nBlocks;
-       s.fItr0 = nThreads*iBlock;
-       //if( iBlock==0 ) tracker.StartHits()[0] = 0;//SG!!!
-      }
-    }
-  else if( iSync==1 )
-    {
-      AliHLTTPCCATrack tout;
-      Int_t trackHits[160];
-       
-      for( Int_t itr= s.fItr0 + iThread; itr<s.fNTracklets; itr+=s.fNThreadsTotal ){                   
-       Int_t *t = tracker.Tracklets() + 1 + itr*(5+ sizeof(AliHLTTPCCATrackParam)/4 + 160 );   
-       Int_t tNHits = *t;
-       if( tNHits<=0 ) continue;
-       
-       CAMath::atomicAdd( tracker.StartHits(), 1);//SG!!!
-       tout.NHits() = 0;
-       Int_t *hitstore = t + 5+ sizeof(AliHLTTPCCATrackParam)/4 ;    
-       Int_t w = (tNHits<<16)+itr;     
-       Int_t nRows = tracker.Param().NRows();
-       for( Int_t irow=0; irow<nRows; irow++ ){
-         Int_t ih = hitstore[irow];
-         if( ih<0 ) continue;
-         AliHLTTPCCARow &row = tracker.Rows()[irow];
-         Int_t ihTot = row.FirstHit()+ih;      
-         if( tracker.HitIsUsed()[ihTot] > w ) continue;
-         Int_t th = AliHLTTPCCATracker::IRowIHit2ID(irow,ih);
-         trackHits[tout.NHits()] = th;
-         tout.NHits()++;
-       }       
-       if( tout.NHits()<10 ) continue;//SG!!!
-       Int_t itrout = CAMath::atomicAdd(&(tracker.NTracks()),1);
-       tout.FirstHitID() = CAMath::atomicAdd( tracker.TrackHits(), tout.NHits() ) + 1;
-       tout.Param() = *( (AliHLTTPCCATrackParam*)( t+5) );
-       tout.Alive() = 1;
-       tracker.Tracks()[itrout] = tout;
-       for( Int_t ih=0; ih<tout.NHits(); ih++ ){//SG
-         tracker.TrackHits()[tout.FirstHitID() + ih] = trackHits[ih];
+       if ( iSync == 0 ) {
+               if ( iThread == 0 ) {
+                       s.fNTracklets = *tracker.NTracklets();
+                       s.fNThreadsTotal = nThreads * nBlocks;
+                       s.fItr0 = nThreads * iBlock;
+               }
+       } else if ( iSync == 1 ) {
+               int nHits, nFirstTrackHit;
+               AliHLTTPCCAHitId trackHits[160 - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE];
+
+               for ( int itr = s.fItr0 + iThread; itr < s.fNTracklets; itr += s.fNThreadsTotal ) {
+
+#ifdef HLTCA_GPU_EMULATION_DEBUG_TRACKLET
+                       if (itr == HLTCA_GPU_EMULATION_DEBUG_TRACKLET)
+                       {
+                               tracker.GPUParameters()->fGPUError = 1;
+                       }
+#endif //HLTCA_GPU_EMULATION_DEBUG_TRACKLET
+
+                       while (tracker.Tracklets()[itr].NHits() == 0)
+                       {
+                               itr += s.fNThreadsTotal;
+                               if (itr >= s.fNTracklets) return;
+                       }
+
+                       GPUglobalref() MEM_GLOBAL(AliHLTTPCCATracklet) &tracklet = tracker.Tracklets()[itr];
+                       const int kMaxRowGap = 4;
+                       const float kMaxShared = .1;
+
+                       int firstRow = tracklet.FirstRow();
+                       int lastRow = tracklet.LastRow();
+                       if (firstRow < 0 || lastRow > tracker.Param().NRows() || tracklet.NHits() < 0)
+                       {
+#ifdef HLTCA_GPU_ALTERNATIVE_SCHEDULER
+                               //tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_WRONG_ROW;
+                               //return;
+#else
+                               continue;
+#endif
+                       }
+
+                       const int w = tracklet.HitWeight();
+
+                       //int w = (tNHits<<16)+itr;
+                       //int nRows = tracker.Param().NRows();
+                       //std::cout<<" store tracklet: "<<firstRow<<" "<<lastRow<<std::endl;
+
+                       int irow = firstRow;
+
+                       int gap = 0;
+                       int nShared = 0;
+                       nHits = 0;
+
+                       for (irow = firstRow; irow <= lastRow && lastRow - irow + nHits >= TRACKLET_SELECTOR_MIN_HITS; irow++ )
+                       {
+                               gap++;
+#ifdef EXTERN_ROW_HITS
+                               int ih = tracker.TrackletRowHits()[irow * s.fNTracklets + itr];
+#else
+                               int ih = tracklet.RowHit( irow );
+#endif //EXTERN_ROW_HITS
+                               if ( ih >= 0 ) {
+                                       GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( irow );
+#ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
+                                       bool own = ( abs(tracker.HitWeight( row, ih )) <= w );
+#else
+                                       bool own = ( tracker.HitWeight( row, ih ) <= w );
+#endif
+                                       bool sharedOK = ( ( nShared < nHits * kMaxShared ) );
+                                       if ( own || sharedOK ) {//SG!!!
+                                               gap = 0;
+#if HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
+                                               if (nHits < HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE)
+                                                       s.fHits[iThread][nHits].Set( irow, ih );
+                                               else
+#endif //HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
+                                                       trackHits[nHits - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE].Set( irow, ih );
+                                               nHits++;
+                                               if ( !own ) nShared++;
+                                       }
+                               }
+
+                               if ( gap > kMaxRowGap || irow == lastRow ) { // store
+                                       if ( nHits >= TRACKLET_SELECTOR_MIN_HITS ) { //SG!!!
+                                               int itrout = CAMath::AtomicAdd( tracker.NTracks(), 1 );
+#ifdef HLTCA_GPUCODE
+                                               if (itrout >= HLTCA_GPU_MAX_TRACKS)
+                                               {
+                                                       tracker.GPUParameters()->fGPUError = HLTCA_GPU_ERROR_TRACK_OVERFLOW;
+                                                       CAMath::AtomicExch( tracker.NTracks(), 0 );
+                                                       return;
+                                               }
+#endif //HLTCA_GPUCODE
+                                               nFirstTrackHit = CAMath::AtomicAdd( tracker.NTrackHits(), nHits );
+                                               tracker.Tracks()[itrout].SetAlive(1);
+                                               tracker.Tracks()[itrout].SetLocalTrackId(itrout);
+                                               tracker.Tracks()[itrout].SetParam(tracklet.Param());
+                                               tracker.Tracks()[itrout].SetFirstHitID(nFirstTrackHit);
+                                               tracker.Tracks()[itrout].SetNHits(nHits);
+                                               for ( int jh = 0; jh < nHits; jh++ ) {
+#if HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
+                                                       if (jh < HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE)
+                                                       {
+                                                               tracker.TrackHits()[nFirstTrackHit + jh] = s.fHits[iThread][jh];
+#ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
+                                                           tracker.SetHitWeight( tracker.Row( s.fHits[iThread][jh].RowIndex() ), s.fHits[iThread][jh].HitIndex(), -w );
+#endif
+                                                       }
+                                                       else
+#endif //HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE != 0
+                                                       {
+                                                               tracker.TrackHits()[nFirstTrackHit + jh] = trackHits[jh - HLTCA_GPU_TRACKLET_SELECTOR_HITS_REG_SIZE];
+#ifdef GLOBAL_TRACKING_ONLY_UNASSIGNED_HITS
+                                                               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 );
+#endif
+                                                       }
+                                               }
+                                       }
+                                       nHits = 0;
+                                       gap = 0;
+                                       nShared = 0;
+                               }
+                       }
+               }
        }
-      }
-    }
 }