CMS 3D CMS Logo

CACell.h
Go to the documentation of this file.
1 #ifndef RecoTracker_PixelSeeding_plugins_alpaka_CACell_h
2 #define RecoTracker_PixelSeeding_plugins_alpaka_CACell_h
3 
4 // #define ONLY_TRIPLETS_IN_HOLE
5 
6 #include <cmath>
7 #include <limits>
8 
9 #include <alpaka/alpaka.hpp>
10 
19 
20 #include "CAStructures.h"
21 
23  template <typename TrackerTraits>
24  class CACellT {
25  public:
26  using PtrAsInt = unsigned long long;
27 
28  static constexpr auto maxCellsPerHit = TrackerTraits::maxCellsPerHit;
35 
37  using hindex_type = typename TrackerTraits::hindex_type;
38  using tindex_type = typename TrackerTraits::tindex_type;
40 
42 
46 
47  enum class StatusBit : uint16_t { kUsed = 1, kInTrack = 2, kKilled = 1 << 15 };
48 
49  CACellT() = default;
50 
51  ALPAKA_FN_ACC ALPAKA_FN_INLINE void init(CellNeighborsVector& cellNeighbors,
53  const HitsConstView& hh,
54  int layerPairId,
55  hindex_type innerHitId,
56  hindex_type outerHitId) {
57  theInnerHitId = innerHitId;
58  theOuterHitId = outerHitId;
59  theLayerPairId_ = layerPairId;
60  theStatus_ = 0;
61  theFishboneId = invalidHitId;
62 
63  // optimization that depends on access pattern
64  theInnerZ = hh[innerHitId].zGlobal();
65  theInnerR = hh[innerHitId].rGlobal();
66 
67  // link to default empty
68  theOuterNeighbors = &cellNeighbors[0];
69  theTracks = &cellTracks[0];
71  assert(tracks().empty());
72  }
73 
74  template <typename TAcc>
75  ALPAKA_FN_ACC ALPAKA_FN_INLINE __attribute__((always_inline)) int addOuterNeighbor(
76  const TAcc& acc, typename TrackerTraits::cindex_type t, CellNeighborsVector& cellNeighbors) {
77  // use smart cache
78  if (outerNeighbors().empty()) {
79  auto i = cellNeighbors.extend(acc); // maybe wasted....
80  if (i > 0) {
82  alpaka::mem_fence(acc, alpaka::memory_scope::Grid{});
83 #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
84  theOuterNeighbors = &cellNeighbors[i];
85 #else
86  auto zero = (PtrAsInt)(&cellNeighbors[0]);
87  alpaka::atomicCas(acc,
88  (PtrAsInt*)(&theOuterNeighbors),
89  zero,
91  alpaka::hierarchy::Blocks{}); // if fails we cannot give "i" back...
92 #endif
93  } else
94  return -1;
95  }
96  alpaka::mem_fence(acc, alpaka::memory_scope::Grid{});
97  return outerNeighbors().push_back(acc, t);
98  }
99 
100  template <typename TAcc>
101  ALPAKA_FN_ACC ALPAKA_FN_INLINE __attribute__((always_inline)) int addTrack(TAcc const& acc,
104  if (tracks().empty()) {
105  auto i = cellTracks.extend(acc); // maybe wasted....
106  if (i > 0) {
107  cellTracks[i].reset();
108  alpaka::mem_fence(acc, alpaka::memory_scope::Grid{});
109 #ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_ENABLED
110  theTracks = &cellTracks[i];
111 #else
112  auto zero = (PtrAsInt)(&cellTracks[0]);
113  alpaka::atomicCas(acc,
114  (PtrAsInt*)(&theTracks),
115  zero,
116  (PtrAsInt)(&cellTracks[i]),
117  alpaka::hierarchy::Blocks{}); // if fails we cannot give "i" back...
118 
119 #endif
120  } else
121  return -1;
122  }
123  alpaka::mem_fence(acc, alpaka::memory_scope::Grid{});
124  return tracks().push_back(acc, t);
125  }
126 
127  ALPAKA_FN_ACC ALPAKA_FN_INLINE CellTracks& tracks() { return *theTracks; }
128  ALPAKA_FN_ACC ALPAKA_FN_INLINE CellTracks const& tracks() const { return *theTracks; }
129  ALPAKA_FN_ACC ALPAKA_FN_INLINE CellNeighbors& outerNeighbors() { return *theOuterNeighbors; }
130  ALPAKA_FN_ACC ALPAKA_FN_INLINE CellNeighbors const& outerNeighbors() const { return *theOuterNeighbors; }
131  ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_x(const HitsConstView& hh) const { return hh[theInnerHitId].xGlobal(); }
132  ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_x(const HitsConstView& hh) const { return hh[theOuterHitId].xGlobal(); }
133  ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_y(const HitsConstView& hh) const { return hh[theInnerHitId].yGlobal(); }
134  ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_y(const HitsConstView& hh) const { return hh[theOuterHitId].yGlobal(); }
135  ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_z(const HitsConstView& hh) const { return theInnerZ; }
136  ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_z(const HitsConstView& hh) const { return hh[theOuterHitId].zGlobal(); }
137  ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_r(const HitsConstView& hh) const { return theInnerR; }
138  ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_r(const HitsConstView& hh) const { return hh[theOuterHitId].rGlobal(); }
139 
140  ALPAKA_FN_ACC ALPAKA_FN_INLINE auto inner_iphi(const HitsConstView& hh) const { return hh[theInnerHitId].iphi(); }
141  ALPAKA_FN_ACC ALPAKA_FN_INLINE auto outer_iphi(const HitsConstView& hh) const { return hh[theOuterHitId].iphi(); }
142 
143  ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_detIndex(const HitsConstView& hh) const {
144  return hh[theInnerHitId].detectorIndex();
145  }
146  ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_detIndex(const HitsConstView& hh) const {
147  return hh[theOuterHitId].detectorIndex();
148  }
149 
150  constexpr unsigned int inner_hit_id() const { return theInnerHitId; }
151  constexpr unsigned int outer_hit_id() const { return theOuterHitId; }
152 
153  ALPAKA_FN_ACC void print_cell() const {
154  printf("printing cell: on layerPair: %d, innerHitId: %d, outerHitId: %d \n",
155  theLayerPairId_,
156  theInnerHitId,
157  theOuterHitId);
158  }
159 
160  ALPAKA_FN_ACC bool check_alignment(const HitsConstView& hh,
161  CACellT const& otherCell,
162  const float ptmin,
163  const float hardCurvCut,
164  const float caThetaCutBarrel,
165  const float caThetaCutForward,
166  const float dcaCutInnerTriplet,
167  const float dcaCutOuterTriplet) const {
168  // detIndex of the layerStart for the Phase1 Pixel Detector:
169  // [BPX1, BPX2, BPX3, BPX4, FP1, FP2, FP3, FN1, FN2, FN3, LAST_VALID]
170  // [ 0, 96, 320, 672, 1184, 1296, 1408, 1520, 1632, 1744, 1856]
171  auto ri = inner_r(hh);
172  auto zi = inner_z(hh);
173 
174  auto ro = outer_r(hh);
175  auto zo = outer_z(hh);
176 
177  auto r1 = otherCell.inner_r(hh);
178  auto z1 = otherCell.inner_z(hh);
179  auto isBarrel = otherCell.outer_detIndex(hh) < TrackerTraits::last_barrel_detIndex;
180  // TODO tune CA cuts below (theta and dca)
181  bool aligned = areAlignedRZ(r1, z1, ri, zi, ro, zo, ptmin, isBarrel ? caThetaCutBarrel : caThetaCutForward);
182  return (aligned && dcaCut(hh,
183  otherCell,
184  otherCell.inner_detIndex(hh) < TrackerTraits::last_bpix1_detIndex ? dcaCutInnerTriplet
186  hardCurvCut));
187  }
188 
189  ALPAKA_FN_ACC ALPAKA_FN_INLINE __attribute__((always_inline)) static bool areAlignedRZ(
190  float r1, float z1, float ri, float zi, float ro, float zo, const float ptmin, const float thetaCut) {
191  float radius_diff = std::abs(r1 - ro);
192  float distance_13_squared = radius_diff * radius_diff + (z1 - zo) * (z1 - zo);
193 
194  float pMin = ptmin * std::sqrt(distance_13_squared); // this needs to be divided by
195  // radius_diff later
196 
197  float tan_12_13_half_mul_distance_13_squared = fabs(z1 * (ri - ro) + zi * (ro - r1) + zo * (r1 - ri));
199  }
200 
201  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool dcaCut(const HitsConstView& hh,
202  CACellT const& otherCell,
203  const float region_origin_radius_plus_tolerance,
204  const float maxCurv) const {
205  auto x1 = otherCell.inner_x(hh);
206  auto y1 = otherCell.inner_y(hh);
207 
208  auto x2 = inner_x(hh);
209  auto y2 = inner_y(hh);
210 
211  auto x3 = outer_x(hh);
212  auto y3 = outer_y(hh);
213 
214  CircleEq<float> eq(x1, y1, x2, y2, x3, y3);
215 
216  if (eq.curvature() > maxCurv)
217  return false;
218 
219  return std::abs(eq.dca0()) < region_origin_radius_plus_tolerance * std::abs(eq.curvature());
220  }
221 
222  ALPAKA_FN_ACC ALPAKA_FN_INLINE __attribute__((always_inline)) static bool dcaCutH(
223  float x1,
224  float y1,
225  float x2,
226  float y2,
227  float x3,
228  float y3,
229  const float region_origin_radius_plus_tolerance,
230  const float maxCurv) {
231  CircleEq<float> eq(x1, y1, x2, y2, x3, y3);
232 
233  if (eq.curvature() > maxCurv)
234  return false;
235 
236  return std::abs(eq.dca0()) < region_origin_radius_plus_tolerance * std::abs(eq.curvature());
237  }
238 
239  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool hole0(const HitsConstView& hh, CACellT const& innerCell) const {
240  using namespace phase1PixelTopology;
241 
242  int p = innerCell.inner_iphi(hh);
243  if (p < 0)
246  p %= max_ladder_bpx0;
247  auto il = first_ladder_bpx0 + p;
248  auto r0 = hh.averageGeometry().ladderR[il];
249  auto ri = innerCell.inner_r(hh);
250  auto zi = innerCell.inner_z(hh);
251  auto ro = outer_r(hh);
252  auto zo = outer_z(hh);
253  auto z0 = zi + (r0 - ri) * (zo - zi) / (ro - ri);
254  auto z_in_ladder = std::abs(z0 - hh.averageGeometry().ladderZ[il]);
255  auto z_in_module = z_in_ladder - module_length_bpx0 * int(z_in_ladder / module_length_bpx0);
256  auto gap = z_in_module < module_tolerance_bpx0 || z_in_module > (module_length_bpx0 - module_tolerance_bpx0);
257  return gap;
258  }
259 
260  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool hole4(const HitsConstView& hh, CACellT const& innerCell) const {
261  using namespace phase1PixelTopology;
262 
263  int p = outer_iphi(hh);
264  if (p < 0)
267  p %= max_ladder_bpx4;
268  auto il = first_ladder_bpx4 + p;
269  auto r4 = hh.averageGeometry().ladderR[il];
270  auto ri = innerCell.inner_r(hh);
271  auto zi = innerCell.inner_z(hh);
272  auto ro = outer_r(hh);
273  auto zo = outer_z(hh);
274  auto z4 = zo + (r4 - ro) * (zo - zi) / (ro - ri);
275  auto z_in_ladder = std::abs(z4 - hh.averageGeometry().ladderZ[il]);
276  auto z_in_module = z_in_ladder - module_length_bpx4 * int(z_in_ladder / module_length_bpx4);
277  auto gap = z_in_module < module_tolerance_bpx4 || z_in_module > (module_length_bpx4 - module_tolerance_bpx4);
278  auto holeP = z4 > hh.averageGeometry().ladderMaxZ[il] && z4 < hh.averageGeometry().endCapZ[0];
279  auto holeN = z4 < hh.averageGeometry().ladderMinZ[il] && z4 > hh.averageGeometry().endCapZ[1];
280  return gap || holeP || holeN;
281  }
282 
283  // trying to free the track building process from hardcoded layers, leaving
284  // the visit of the graph based on the neighborhood connections between cells.
285  template <int DEPTH, typename TAcc>
286  ALPAKA_FN_ACC ALPAKA_FN_INLINE void find_ntuplets(TAcc const& acc,
287  const HitsConstView& hh,
288  CACellT* __restrict__ cells,
292  Quality* __restrict__ quality,
293  TmpTuple& tmpNtuplet,
294  const unsigned int minHitsPerNtuplet,
295  bool startAt0) const {
296  // the building process for a track ends if:
297  // it has no right neighbor
298  // it has no compatible neighbor
299  // the ntuplets is then saved if the number of hits it contains is greater
300  // than a threshold
301 
302  if constexpr (DEPTH <= 0) {
303  printf("ERROR: CACellT::find_ntuplets reached full depth!\n");
304  ALPAKA_ASSERT_ACC(false);
305  } else {
306  auto doubletId = this - cells;
307  tmpNtuplet.push_back_unsafe(doubletId);
308  ALPAKA_ASSERT_ACC(tmpNtuplet.size() <= int(TrackerTraits::maxHitsOnTrack - 3));
309 
310  bool last = true;
311  for (unsigned int otherCell : outerNeighbors()) {
312  if (cells[otherCell].isKilled())
313  continue; // killed by earlyFishbone
314  last = false;
315  cells[otherCell].template find_ntuplets<DEPTH - 1>(
316  acc, hh, cells, cellTracks, foundNtuplets, apc, quality, tmpNtuplet, minHitsPerNtuplet, startAt0);
317  }
318  if (last) { // if long enough save...
319  if ((unsigned int)(tmpNtuplet.size()) >= minHitsPerNtuplet - 1) {
320 #ifdef ONLY_TRIPLETS_IN_HOLE
321  // triplets accepted only pointing to the hole
322  if (tmpNtuplet.size() >= 3 || (startAt0 && hole4(hh, cells[tmpNtuplet[0]])) ||
323  ((!startAt0) && hole0(hh, cells[tmpNtuplet[0]])))
324 #endif
325  {
327  auto nh = 0U;
328  constexpr int maxFB = 2; // for the time being let's limit this
329  int nfb = 0;
330  for (auto c : tmpNtuplet) {
331  hits[nh++] = cells[c].theInnerHitId;
332  if (nfb < maxFB && cells[c].hasFishbone()) {
333  ++nfb;
334  hits[nh++] = cells[c].theFishboneId; // Fishbone hit is always outer than inner hit
335  }
336  }
337  assert(nh < TrackerTraits::maxHitsOnTrack);
338  hits[nh] = theOuterHitId;
339  auto it = foundNtuplets.bulkFill(acc, apc, hits, nh + 1);
340  if (it >= 0) { // if negative is overflow....
341  for (auto c : tmpNtuplet)
342  cells[c].addTrack(acc, it, cellTracks);
343  quality[it] = bad; // initialize to bad
344  }
345  }
346  }
347  }
348  tmpNtuplet.pop_back();
349  assert(tmpNtuplet.size() < int(TrackerTraits::maxHitsOnTrack - 1));
350  }
351  }
352 
353  // Cell status management
354  ALPAKA_FN_ACC ALPAKA_FN_INLINE void kill() { theStatus_ |= uint16_t(StatusBit::kKilled); }
355  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool isKilled() const { return theStatus_ & uint16_t(StatusBit::kKilled); }
356 
357  ALPAKA_FN_ACC ALPAKA_FN_INLINE int16_t layerPairId() const { return theLayerPairId_; }
358 
359  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool unused() const { return 0 == (uint16_t(StatusBit::kUsed) & theStatus_); }
360  ALPAKA_FN_ACC ALPAKA_FN_INLINE void setStatusBits(StatusBit mask) { theStatus_ |= uint16_t(mask); }
361 
362  template <typename TAcc>
363  ALPAKA_FN_ACC ALPAKA_FN_INLINE void setFishbone(TAcc const& acc, hindex_type id, float z, const HitsConstView& hh) {
364  // make it deterministic: use the farther apart (in z)
365  auto old = theFishboneId;
366  while (old !=
367  alpaka::atomicCas(
368  acc,
369  &theFishboneId,
370  old,
371  (invalidHitId == old || std::abs(z - theInnerZ) > std::abs(hh[old].zGlobal() - theInnerZ)) ? id : old,
373  old = theFishboneId;
374  }
375  ALPAKA_FN_ACC ALPAKA_FN_INLINE auto fishboneId() const { return theFishboneId; }
376  ALPAKA_FN_ACC ALPAKA_FN_INLINE bool hasFishbone() const { return theFishboneId != invalidHitId; }
377 
378  private:
379  CellNeighbors* theOuterNeighbors;
380  CellTracks* theTracks;
381 
382  int16_t theLayerPairId_;
383  uint16_t theStatus_; // tbd
384 
385  float theInnerZ;
386  float theInnerR;
387  hindex_type theInnerHitId;
388  hindex_type theOuterHitId;
389  hindex_type theFishboneId;
390  };
391 
392 } // namespace ALPAKA_ACCELERATOR_NAMESPACE
393 
394 #endif // RecoTracker_PixelSeeding_plugins_alpaka_CACell_h
::pixelTrack::Quality Quality
Definition: CACell.h:44
ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_detIndex(const HitsConstView &hh) const
Definition: CACell.h:143
ALPAKA_FN_ACC ALPAKA_FN_INLINE TrackerTraits::cindex_type CellNeighborsVector & cellNeighbors
Definition: CACell.h:76
constexpr unsigned int inner_hit_id() const
Definition: CACell.h:150
ALPAKA_FN_ACC ALPAKA_FN_INLINE CellNeighbors & outerNeighbors()
Definition: CACell.h:129
ALPAKA_FN_ACC ALPAKA_FN_INLINE CellTracks const & tracks() const
Definition: CACell.h:128
constexpr float module_length_bpx0
cms::alpakatools::VecArray< uint32_t, TrackerTraits::maxDepth > TmpTuple
Definition: CACell.h:41
typename TrackerTraits::tindex_type tindex_type
Definition: CACell.h:38
ALPAKA_FN_ACC bool check_alignment(const HitsConstView &hh, CACellT const &otherCell, const float ptmin, const float hardCurvCut, const float caThetaCutBarrel, const float caThetaCutForward, const float dcaCutInnerTriplet, const float dcaCutOuterTriplet) const
Definition: CACell.h:160
return outerNeighbors().push_back(acc
ALPAKA_FN_ACC ALPAKA_FN_INLINE CellNeighbors const & outerNeighbors() const
Definition: CACell.h:130
ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_detIndex(const HitsConstView &hh) const
Definition: CACell.h:146
ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_y(const HitsConstView &hh) const
Definition: CACell.h:133
static constexpr auto bad
Definition: CACell.h:45
static constexpr auto invalidHitId
Definition: CACell.h:39
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float ri
Definition: CACell.h:190
ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_x(const HitsConstView &hh) const
Definition: CACell.h:131
ALPAKA_FN_ACC void print_cell() const
Definition: CACell.h:153
static constexpr auto maxCellsPerHit
Definition: CACell.h:28
ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_x(const HitsConstView &hh) const
Definition: CACell.h:132
constexpr float module_length_bpx4
assert(be >=bs)
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float float zi
Definition: CACell.h:190
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float float float ro
Definition: CACell.h:190
ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_z(const HitsConstView &hh) const
Definition: CACell.h:135
ALPAKA_FN_ACC ALPAKA_FN_INLINE auto inner_iphi(const HitsConstView &hh) const
Definition: CACell.h:140
ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_r(const HitsConstView &hh) const
Definition: CACell.h:138
string quality
constexpr uint32_t first_ladder_bpx4
caStructures::CellNeighborsT< TrackerTraits > CellNeighbors
Definition: CACell.h:31
constexpr float module_tolerance_bpx0
typename reco::TrackSoA< TrackerTraits >::HitContainer HitContainer
Definition: CACell.h:43
T sqrt(T t)
Definition: SSEVec.h:19
typename TrackerTraits::hindex_type hindex_type
Definition: CACell.h:37
std::vector< Block > Blocks
Definition: Block.h:99
constexpr uint32_t max_ladder_bpx4
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ALPAKA_FN_ACC int extend(const TAcc &acc, int size=1)
Definition: SimpleVector.h:85
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float float float float zo
Definition: CACell.h:190
uint32_t nh
ALPAKA_FN_ACC ALPAKA_FN_INLINE void uint32_t const uint32_t CACellT< TrackerTraits > uint32_t CellNeighborsVector< TrackerTraits > CellTracksVector< TrackerTraits > HitsConstView< TrackerTraits > hh
ALPAKA_FN_ACC ALPAKA_FN_INLINE float z1
Definition: CACell.h:190
unsigned long long PtrAsInt
Definition: CACell.h:26
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float float float float const float ptmin
Definition: CACell.h:190
ALPAKA_FN_ACC ALPAKA_FN_INLINE __attribute__((always_inline)) int addOuterNeighbor(const TAcc &acc
typename CACellT< TrackerTraits >::HitsConstView HitsConstView
Definition: CAFishbone.h:34
constexpr uint32_t max_ladder_bpx0
ALPAKA_FN_ACC ALPAKA_FN_INLINE float float float float float const float const float thetaCut
Definition: CACell.h:190
typename TrackingRecHitSoA< TrackerTraits >::template TrackingRecHitSoALayout<>::ConstView TrackingRecHitSoAConstView
ALPAKA_FN_ACC ALPAKA_FN_INLINE float inner_r(const HitsConstView &hh) const
Definition: CACell.h:137
caStructures::CellTracksT< TrackerTraits > CellTracks
Definition: CACell.h:32
caStructures::CellTracksVectorT< TrackerTraits > CellTracksVector
Definition: CACell.h:34
TupleMultiplicity< TrackerTraits > const HitToTuple< TrackerTraits > const cms::cuda::AtomicPairCounter * apc
ALPAKA_FN_ACC ALPAKA_FN_INLINE TrackerTraits::cindex_type t
Definition: CACell.h:76
constexpr float module_tolerance_bpx4
ALPAKA_FN_ACC ALPAKA_FN_INLINE auto outer_iphi(const HitsConstView &hh) const
Definition: CACell.h:141
constexpr unsigned int outer_hit_id() const
Definition: CACell.h:151
ALPAKA_FN_ACC ALPAKA_FN_INLINE void init(CellNeighborsVector &cellNeighbors, CellTracksVector &cellTracks, const HitsConstView &hh, int layerPairId, hindex_type innerHitId, hindex_type outerHitId)
Definition: CACell.h:51
ALPAKA_FN_ACC ALPAKA_FN_INLINE CellTracks & tracks()
Definition: CACell.h:127
constexpr uint32_t first_ladder_bpx0
ALPAKA_FN_ACC ALPAKA_FN_INLINE tindex_type CellTracksVector & cellTracks
Definition: CACell.h:103
TrackingRecHitSoAConstView< TrackerTraits > HitsConstView
Definition: CACell.h:36
ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_z(const HitsConstView &hh) const
Definition: CACell.h:136
ALPAKA_FN_ACC ALPAKA_FN_INLINE float outer_y(const HitsConstView &hh) const
Definition: CACell.h:134