LCOV - code coverage report
Current view: top level - HLT/TPCLib/tracking-ca - AliHLTTPCCANeighboursFinder.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 83 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 1 0.0 %

          Line data    Source code
       1             : // @(#) $Id: AliHLTTPCCANeighboursFinder1.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 "AliHLTTPCCANeighboursFinder.h"
      21             : #include "AliHLTTPCCAMath.h"
      22             : #include "AliHLTTPCCAHitArea.h"
      23             : #include "AliHLTTPCCATracker.h"
      24             : #include "AliHLTTPCCAHit.h"
      25             : 
      26             : //#define DRAW
      27             : 
      28             : #ifdef DRAW
      29             : #include "AliHLTTPCCADisplay.h"
      30             : #endif //DRAW
      31             : 
      32             : GPUdi() void AliHLTTPCCANeighboursFinder::Thread
      33             : ( int /*nBlocks*/, int nThreads, int iBlock, int iThread, int iSync,
      34             :   GPUsharedref() MEM_LOCAL(AliHLTTPCCASharedMemory) &s, GPUconstant() MEM_CONSTANT(AliHLTTPCCATracker) &tracker )
      35             : {
      36             :   //* find neighbours
      37             : 
      38           0 :   if ( iSync == 0 ) {
      39             : #ifdef HLTCA_GPUCODE
      40             :         for (int i = iThread;i < sizeof(MEM_PLAIN(AliHLTTPCCARow)) / sizeof(int);i += nThreads)
      41             :         {
      42             :                 reinterpret_cast<GPUsharedref() int*>(&s.fRow)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock])[i];
      43             :                 if (iBlock >= 2 && iBlock <= tracker.Param().NRows() - 3)
      44             :                 {
      45             :                         reinterpret_cast<GPUsharedref() int*>(&s.fRowUp)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock + 2])[i];
      46             :                         reinterpret_cast<GPUsharedref() int*>(&s.fRowDown)[i] = reinterpret_cast<GPUglobalref() int*>(&tracker.SliceDataRows()[iBlock - 2])[i];
      47             :                 }
      48             :         }
      49             :         GPUsync();
      50             : #endif
      51           0 :     if ( iThread == 0 ) {
      52           0 :       s.fNRows = tracker.Param().NRows();
      53           0 :       s.fIRow = iBlock;
      54           0 :       if ( s.fIRow < s.fNRows ) {
      55             : #ifdef HLTCA_GPUCODE
      56             :                 GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
      57             : #else
      58           0 :                 GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
      59             : #endif
      60           0 :         s.fNHits = row.NHits();
      61             : 
      62           0 :         if ( ( s.fIRow >= 2 ) && ( s.fIRow <= s.fNRows - 3 ) ) {
      63           0 :           s.fIRowUp = s.fIRow + 2;
      64           0 :           s.fIRowDn = s.fIRow - 2;
      65             : 
      66             :           // references to the rows above and below
      67             : 
      68             : #ifdef HLTCA_GPUCODE
      69             :           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowUp = s.fRowUp;
      70             :           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowDn = s.fRowDown;
      71             : #else
      72           0 :           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
      73           0 :           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
      74             : #endif
      75             :           // the axis perpendicular to the rows
      76           0 :           const float xDn = rowDn.X();
      77           0 :           const float x   = row.X();
      78           0 :           const float xUp = rowUp.X();
      79             : 
      80             :           // number of hits in rows above and below
      81           0 :           s.fUpNHits = tracker.Row( s.fIRowUp ).NHits();
      82           0 :           s.fDnNHits = tracker.Row( s.fIRowDn ).NHits();
      83             : 
      84             :           // distance of the rows (absolute and relative)
      85           0 :           s.fUpDx = xUp - x;
      86           0 :           s.fDnDx = xDn - x;
      87           0 :           s.fUpTx = xUp / x;
      88           0 :           s.fDnTx = xDn / x;
      89             :           // UpTx/DnTx is used to move the HitArea such that central events are preferred (i.e. vertices
      90             :           // coming from y = 0, z = 0).
      91             : 
      92             :           //s.fGridUp = tracker.Row( s.fIRowUp ).Grid();
      93             :           //s.fGridDn = tracker.Row( s.fIRowDn ).Grid();
      94           0 :         }
      95           0 :       }
      96             :     }
      97           0 :   } else if ( iSync == 1 ) {
      98           0 :     if ( s.fIRow < s.fNRows ) {
      99           0 :       if ( ( s.fIRow <= 1 ) || ( s.fIRow >= s.fNRows - 2 ) ) {
     100             : #ifdef HLTCA_GPUCODE
     101             :                 GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
     102             : #else
     103           0 :                 GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
     104             : #endif
     105           0 :         for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
     106           0 :           tracker.SetHitLinkUpData( row, ih, -1 );
     107           0 :           tracker.SetHitLinkDownData( row, ih, -1 );
     108             :         }
     109           0 :       } else {
     110             : /*#ifdef HLTCA_GPUCODE
     111             :           const AliHLTTPCCARow &rowUp = s.fRowUp;
     112             :           const AliHLTTPCCARow &rowDn = s.fRowDown;
     113             : #else
     114             :           const AliHLTTPCCARow &rowUp = tracker.Row( s.fIRowUp );
     115             :           const AliHLTTPCCARow &rowDn = tracker.Row( s.fIRowDn );
     116             : #endif
     117             : 
     118             :         for ( unsigned int ih = iThread; ih < s.fGridUp.N() + s.fGridUp.Ny() + 2; ih += nThreads ) {
     119             :           s.fGridContentUp[ih] = tracker.FirstHitInBin( rowUp, ih );
     120             :         }
     121             :         for ( unsigned int ih = iThread; ih < s.fGridDn.N() + s.fGridDn.Ny() + 2; ih += nThreads ) {
     122             :           s.fGridContentDn[ih] = tracker.FirstHitInBin( rowDn, ih );
     123             :         }*/
     124             :       }
     125             :     }
     126           0 :   } else if ( iSync == 2 ) {
     127             : 
     128             : #ifdef HLTCA_GPUCODE
     129             :     if ( ( iBlock <= 1 ) || ( iBlock >= s.fNRows - 2 ) ) return;
     130             : #else
     131           0 :     if ( ( s.fIRow <= 1 ) || ( s.fIRow >= s.fNRows - 2 ) ) return;
     132             : #endif
     133             : 
     134           0 :     float chi2Cut = 3.*3.*4 * ( s.fUpDx * s.fUpDx + s.fDnDx * s.fDnDx );
     135           0 :     const float kAreaSize = tracker.Param().NeighboursSearchArea();
     136             :     //float chi2Cut = 3.*3.*(s.fUpDx*s.fUpDx + s.fDnDx*s.fDnDx ); //SG
     137             : #define kMaxN 20
     138             : 
     139             : #ifdef HLTCA_GPUCODE
     140             :                   GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &row = s.fRow;
     141             :           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowUp = s.fRowUp;
     142             :           GPUsharedref() const MEM_LOCAL(AliHLTTPCCARow) &rowDn = s.fRowDown;
     143             : #else
     144           0 :                   GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &row = tracker.Row( s.fIRow );
     145           0 :                   GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowUp = tracker.Row( s.fIRowUp );
     146           0 :           GPUglobalref() const MEM_GLOBAL(AliHLTTPCCARow) &rowDn = tracker.Row( s.fIRowDn );
     147             : #endif
     148           0 :     const float y0 = row.Grid().YMin();
     149           0 :     const float z0 = row.Grid().ZMin();
     150           0 :     const float stepY = row.HstepY();
     151           0 :     const float stepZ = row.HstepZ();
     152             : 
     153           0 :         for ( int ih = iThread; ih < s.fNHits; ih += nThreads ) {
     154             : 
     155             :       int linkUp = -1;
     156             :       int linkDn = -1;
     157             : 
     158           0 :       if ( s.fDnNHits > 0 && s.fUpNHits > 0 ) {
     159             : 
     160             :        
     161             : 
     162             :         // coordinates of the hit in the current row
     163             : #if defined(HLTCA_GPU_TEXTURE_FETCHa)
     164             :                 ushort2 tmpval = tex1Dfetch(gAliTexRefu2, ((char*) tracker.Data().HitData() - tracker.Data().GPUTextureBase()) / sizeof(ushort2) + row.HitNumberOffset() + ih);
     165             :         const float y = y0 + tmpval.x * stepY;
     166             :         const float z = z0 + tmpval.y * stepZ;
     167             : #else
     168           0 :         const float y = y0 + tracker.HitDataY( row, ih ) * stepY;
     169           0 :         const float z = z0 + tracker.HitDataZ( row, ih ) * stepZ;
     170             : #endif
     171             : 
     172             : #if ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
     173           0 :       GPUsharedref() unsigned short *neighUp = s.fB[iThread];
     174           0 :       GPUsharedref() float2 *yzUp = s.fA[iThread];
     175             : #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP
     176             :           unsigned short neighUp2[kMaxN - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP];
     177             :           float2 yzUp2[kMaxN - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP];
     178             : #endif
     179             : #else
     180             :       unsigned short neighUp[kMaxN];
     181             :       float2 yzUp[kMaxN];
     182             : #endif //ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
     183             : 
     184             :                 int nNeighUp = 0;
     185           0 :         AliHLTTPCCAHitArea areaDn, areaUp;
     186           0 :         areaUp.Init( rowUp, tracker.Data(), y*s.fUpTx, z*s.fUpTx, kAreaSize, kAreaSize );
     187           0 :         areaDn.Init( rowDn, tracker.Data(), y*s.fDnTx, z*s.fDnTx, kAreaSize, kAreaSize );
     188             : 
     189           0 :         do {
     190           0 :           AliHLTTPCCAHit h;
     191           0 :           int i = areaUp.GetNext( tracker, rowUp, tracker.Data(), &h );
     192           0 :           if ( i < 0 ) break;
     193             : #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
     194             :                   if (nNeighUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP)
     195             :                   {
     196             :                         neighUp2[nNeighUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] = ( unsigned short ) i;
     197             :                         yzUp2[nNeighUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] = CAMath::MakeFloat2( s.fDnDx * ( h.Y() - y ), s.fDnDx * ( h.Z() - z ) );
     198             :                   }
     199             :                   else
     200             : #endif
     201             :                   {
     202           0 :                         neighUp[nNeighUp] = ( unsigned short ) i;
     203           0 :                         yzUp[nNeighUp] = CAMath::MakeFloat2( s.fDnDx * ( h.Y() - y ), s.fDnDx * ( h.Z() - z ) );
     204             :                   }
     205           0 :           if ( ++nNeighUp >= kMaxN ) break;
     206           0 :         } while ( 1 );
     207             : 
     208             :         int nNeighDn = 0;
     209             : 
     210           0 :         if ( nNeighUp > 0 ) {
     211             : 
     212             :           int bestDn = -1, bestUp = -1;
     213             :           float bestD = 1.e10;
     214             : 
     215           0 :           do {
     216           0 :             AliHLTTPCCAHit h;
     217           0 :             int i = areaDn.GetNext( tracker, rowDn, tracker.Data(), &h );
     218           0 :             if ( i < 0 ) break;
     219             : 
     220           0 :             nNeighDn++;
     221           0 :             float2 yzdn = CAMath::MakeFloat2( s.fUpDx * ( h.Y() - y ), s.fUpDx * ( h.Z() - z ) );
     222             : 
     223           0 :             for ( int iUp = 0; iUp < nNeighUp; iUp++ ) {
     224             : #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
     225             :                           float2 yzup = iUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP ? yzUp2[iUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] : yzUp[iUp];
     226             : #else
     227           0 :               float2 yzup = yzUp[iUp];
     228             : #endif
     229             : 
     230           0 :               float dy = yzdn.x - yzup.x;
     231           0 :               float dz = yzdn.y - yzup.y;
     232           0 :               float d = dy * dy + dz * dz;
     233           0 :               if ( d < bestD ) {
     234             :                 bestD = d;
     235             :                 bestDn = i;
     236             :                 bestUp = iUp;
     237           0 :               }
     238             :             }
     239           0 :           } while ( 1 );
     240             : 
     241           0 :           if ( bestD <= chi2Cut ) {
     242             : #if defined(HLTCA_GPUCODE) & kMaxN > ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP & ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP > 0
     243             :                         linkUp = bestUp >= ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP ? neighUp2[bestUp - ALIHLTTPCCANEIGHBOURS_FINDER_MAX_NNEIGHUP] : neighUp[bestUp];
     244             : #else
     245           0 :             linkUp = neighUp[bestUp];
     246             : #endif
     247             :             linkDn = bestDn;
     248           0 :           }
     249           0 :         }
     250             : #ifdef DRAW
     251             :         std::cout << "n NeighUp = " << nNeighUp << ", n NeighDn = " << nNeighDn << std::endl;
     252             : #endif //DRAW
     253           0 :       }
     254             : 
     255           0 :       tracker.SetHitLinkUpData( row, ih, linkUp );
     256           0 :       tracker.SetHitLinkDownData( row, ih, linkDn );
     257             : #ifdef DRAW
     258             :       std::cout << "Links for row " << s.fIRow << ", hit " << ih << ": " << linkUp << " " << linkDn << std::endl;
     259             :       if ( s.fIRow == 22 && ih == 5 ) {
     260             :         AliHLTTPCCADisplay::Instance().DrawSliceLink( s.fIRow, ih, -1, -1, 1 );
     261             :         AliHLTTPCCADisplay::Instance().DrawSliceHit( s.fIRow, ih, kBlue, 1. );
     262             :         AliHLTTPCCADisplay::Instance().Ask();
     263             :       }
     264             : #endif //DRAW
     265             :     }
     266           0 :   }
     267           0 : }
     268             : 

Generated by: LCOV version 1.11