CMS 3D CMS Logo

CAFishbone.h
Go to the documentation of this file.
1 #ifndef RecoPixelVertexing_PixelTriplets_alpaka_CAFishbone_h
2 #define RecoPixelVertexing_PixelTriplets_alpaka_CAFishbone_h
3 
4 #include <algorithm>
5 #include <cmath>
6 #include <cstdint>
7 #include <cstdio>
8 #include <limits>
9 
10 #include <alpaka/alpaka.hpp>
15 
16 #include "CACell.h"
17 #include "CAStructures.h"
18 
20  namespace caPixelDoublets {
21 
22  template <typename TrackerTraits>
24  template <typename TrackerTraits>
26  template <typename TrackerTraits>
28  template <typename TrackerTraits>
30  template <typename TrackerTraits>
32  template <typename TrackerTraits>
34 
35  template <typename TrackerTraits>
36  class CAFishbone {
37  public:
38  template <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
39  ALPAKA_FN_ACC void operator()(TAcc const& acc,
42  uint32_t const* __restrict__ nCells,
44  int32_t nHits,
45  bool checkTrack) const {
46  if (nHits <= isOuterHitOfCellWrap->offset)
47  return;
49 
50  auto const isOuterHitOfCell = isOuterHitOfCellWrap->container;
51 
52  // x runs faster...
53 
54  float x[maxCellsPerHit], y[maxCellsPerHit], z[maxCellsPerHit], n[maxCellsPerHit];
55  uint16_t d[maxCellsPerHit];
56  uint32_t cc[maxCellsPerHit];
57  uint8_t l[maxCellsPerHit];
58  const uint32_t dimIndexY = 0u;
59  const uint32_t dimIndexX = 1u;
60  const uint32_t blockDimensionX(alpaka::getWorkDiv<alpaka::Block, alpaka::Elems>(acc)[dimIndexX]);
61  const auto& [firstElementIdxNoStrideX, endElementIdxNoStrideX] =
63 
64  // Outermost loop on Y
65  const uint32_t gridDimensionY(alpaka::getWorkDiv<alpaka::Grid, alpaka::Elems>(acc)[dimIndexY]);
66  const auto& [firstElementIdxNoStrideY, endElementIdxNoStrideY] =
68  uint32_t firstElementIdxY = firstElementIdxNoStrideY;
69  uint32_t endElementIdxY = endElementIdxNoStrideY;
70 
71  for (uint32_t idy = firstElementIdxY, nt = nHits; idy < nt; ++idy) {
74  break;
75 
76  auto const& vc = isOuterHitOfCell[idy];
77  auto s = vc.size();
78  if (s < 2)
79  continue;
80 
81  auto const& c0 = cells[vc[0]];
82  auto xo = c0.outer_x(hh);
83  auto yo = c0.outer_y(hh);
84  auto zo = c0.outer_z(hh);
85  auto sg = 0;
86  for (int32_t ic = 0; ic < s; ++ic) {
87  auto& ci = cells[vc[ic]];
88  if (ci.unused())
89  continue; // for triplets equivalent to next
90  if (checkTrack && ci.tracks().empty())
91  continue;
92  cc[sg] = vc[ic];
93  d[sg] = ci.inner_detIndex(hh);
94  l[sg] = ci.layerPairId();
95  x[sg] = ci.inner_x(hh) - xo;
96  y[sg] = ci.inner_y(hh) - yo;
97  z[sg] = ci.inner_z(hh) - zo;
98  n[sg] = x[sg] * x[sg] + y[sg] * y[sg] + z[sg] * z[sg];
99  ++sg;
100  }
101  if (sg < 2)
102  continue;
103  // here we parallelize in X
104  uint32_t firstElementIdxX = firstElementIdxNoStrideX;
105  uint32_t endElementIdxX = endElementIdxNoStrideX;
106  for (uint32_t ic = firstElementIdxX; (int)ic < sg - 1; ++ic) {
108  ic, firstElementIdxX, endElementIdxX, blockDimensionX, sg - 1))
109  break;
110 
111  auto& ci = cells[cc[ic]];
112  for (auto jc = ic + 1; (int)jc < sg; ++jc) {
113  auto& cj = cells[cc[jc]];
114  // must be different detectors (in the same layer)
115  // if (d[ic]==d[jc]) continue;
116  // || l[ic]!=l[jc]) continue;
117  auto cos12 = x[ic] * x[jc] + y[ic] * y[jc] + z[ic] * z[jc];
118 
119  if (d[ic] != d[jc] && cos12 * cos12 >= 0.99999f * (n[ic] * n[jc])) {
120  // alligned: kill farthest (prefer consecutive layers)
121  // if same layer prefer farthest (longer level arm) and make space for intermediate hit
122  bool sameLayer = l[ic] == l[jc];
123  if (n[ic] > n[jc]) {
124  if (sameLayer) {
125  cj.kill(); // closest
126  ci.setFishbone(acc, cj.inner_hit_id(), cj.inner_z(hh), hh);
127  } else {
128  ci.kill(); // farthest
129  // break; // removed to improve reproducibility. keep it for reference and tests
130  }
131  } else {
132  if (!sameLayer) {
133  cj.kill(); // farthest
134  } else {
135  ci.kill(); // closest
136  cj.setFishbone(acc, ci.inner_hit_id(), ci.inner_z(hh), hh);
137  // break; // removed to improve reproducibility. keep it for reference and tests
138  }
139  }
140  }
141  } //cj
142  } // ci
143  } // hits
144  }
145  };
146  } // namespace caPixelDoublets
147 } // namespace ALPAKA_ACCELERATOR_NAMESPACE
148 #endif // RecoPixelVertexing_PixelTriplets_alpaka_CAFishbone_h
ALPAKA_FN_ACC ALPAKA_FN_INLINE bool next_valid_element_index_strided(Idx &i, Idx &firstElementIdx, Idx &endElementIdx, const Idx stride, const Idx maxNumberOfElements)
Definition: workdivision.h:921
uint32_t cc[maxCellsPerHit]
Definition: gpuFishbone.h:49
GPUCACellT< TrackerTraits > uint32_t const *__restrict__ OuterHitOfCell< TrackerTraits > const isOuterHitOfCellWrap
Definition: gpuFishbone.h:34
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > * cells
ALPAKA_FN_ACC void operator()(TAcc const &acc, HitsConstView< TrackerTraits > hh, CACellT< TrackerTraits > *cells, uint32_t const *__restrict__ nCells, OuterHitOfCell< TrackerTraits > const *isOuterHitOfCellWrap, int32_t nHits, bool checkTrack) const
Definition: CAFishbone.h:39
double f[11][100]
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t CellNeighborsVector< TrackerTraits > CellTracksVector< TrackerTraits > HitsConstView< TrackerTraits > hh
d
Definition: ztail.py:151
ALPAKA_FN_ACC std::pair< Idx, Idx > element_index_range_in_block(const TAcc &acc, const Idx elementIdxShift, const unsigned int dimIndex=0u)
Definition: workdivision.h:818
const uint32_t gridDimensionY(alpaka::getWorkDiv< alpaka::Grid, alpaka::Elems >(acc)[dimIndexY])
int nt
Definition: AMPTWrapper.h:42
typename CACellT< TrackerTraits >::HitsConstView HitsConstView
Definition: CAFishbone.h:33
ALPAKA_FN_ACC std::pair< Idx, Idx > element_index_range_in_grid(const TAcc &acc, Idx elementIdxShift, const unsigned int dimIndex=0u)
Definition: workdivision.h:862
const uint32_t blockDimensionX(alpaka::getWorkDiv< alpaka::Block, alpaka::Elems >(acc)[dimIndexX])
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t * nCells
float x
TupleMultiplicity< TrackerTraits > const *__restrict__ uint32_t nHits
TrackingRecHitSoAConstView< TrackerTraits > HitsConstView
Definition: CACell.h:35
GPUCACellT< TrackerTraits > uint32_t const *__restrict__ OuterHitOfCell< TrackerTraits > const int32_t bool checkTrack
Definition: gpuFishbone.h:38
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t CellNeighborsVector< TrackerTraits > CellTracksVector< TrackerTraits > HitsConstView< TrackerTraits > OuterHitOfCell< TrackerTraits > isOuterHitOfCell