Project
Loading...
Searching...
No Matches
TimeFrameGPU.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
12
13#ifndef TRACKINGITSGPU_INCLUDE_TIMEFRAMEGPU_H
14#define TRACKINGITSGPU_INCLUDE_TIMEFRAMEGPU_H
15
16#include <gsl/gsl>
17#include <bitset>
18
26
27namespace o2::its::gpu
28{
29
30template <int NLayers>
31class TimeFrameGPU : public TimeFrame<NLayers>
32{
38 using typename TimeFrame<NLayers>::TrackSeedN;
39 static constexpr int MaxLinks = TrackingTopologyN::MaxLinks;
40 static constexpr int MaxCells = TrackingTopologyN::MaxCells;
41 static constexpr int MaxStreams = MaxCells > NLayers ? MaxCells : NLayers;
42
43 public:
44 TimeFrameGPU() = default;
45 ~TimeFrameGPU() override = default;
46
48 void pushMemoryStack(const int);
49 void popMemoryStack(const int);
51 void initialise(const TrackingParameters&, int maxLayers);
52 void initialise(const TrackingParameters&, int maxLayers, int iteration);
56 void createTrackingFrameInfoDeviceArray(const int = NLayers);
58 void createUnsortedClustersDeviceArray(const int = NLayers);
59 void createClustersDeviceArray(const int = NLayers);
60 void loadClustersIndexTables(const int);
61 void createClustersIndexTablesArray(const int = NLayers);
62 void createClustersDevice(const int);
66 void sortClustersDevice(const int layer, const TrackingParameters& trkParam);
67 void createUsedClustersDevice(const int);
68 void createUsedClustersDeviceArray(const int = NLayers);
71 void createROFrameClustersDeviceArray(const int = NLayers);
72 void loadROFCutMask(const int);
78
80 void createTrackletsLUTDevice(bool, const int);
82 void createTrackSeedsDevice(const size_t capacity);
83 void createTrackletsBuffers(const int, size_t capacity);
85 void createCellsBuffers(const int, size_t capacity);
87 void createCellsLUTDevice(const int);
89 void createNeighboursDevice(const unsigned int layer, size_t capacity);
90 void createNeighboursLUTDevice(const int, const unsigned int);
91 void createTrackITSExtDevice(const size_t capacity);
92 void createTrackITSExtHost(const size_t nTracks);
93 void createTrackExtensionScratchDevice(const int nThreads, const int maxHypotheses);
95
96 // Seeding-vertexer
101
102 void createLinesDevice(const int nCells);
103 void createDiamondDevice(const Vertex& diamond);
104 unsigned int downloadLinesDevice();
105 unsigned int getNLines();
106 const auto& getHostLines() const { return mLinesHost; }
107 const auto& getHostLineRof() const { return mLineRofHost; }
108 const auto& getHostLineClusters() const { return mLineClustersHost; }
109
111 auto& getStream(const size_t stream) { return mGpuStreams[stream]; }
112 auto& getStreams() { return mGpuStreams; }
113 void syncStreams(const bool = true);
114 void waitEvent(const int, const int);
115 void recordEvent(const int);
116
118 virtual void wipe() final;
119
121 virtual bool isGPU() const noexcept final { return true; }
122 virtual const char* getName() const noexcept override final { return "GPU"; }
123 IndexTableUtilsN* getDeviceIndexTableUtils() { return mIndexTableUtilsDevice; }
124 const float* getDeviceLayerRadii() const { return mLayerRadiiDevice; }
125 const float* getDeviceMinPts() const { return mMinPtsDevice; }
126 const float* getDeviceLayerxX0() const { return mLayerxX0Device; }
127 const auto getDeviceROFOverlapTableView() { return mDeviceROFOverlapTableView; }
128 const auto getDeviceROFVertexLookupTableView() { return mDeviceROFVertexLookupTableView; }
129 const auto getDeviceROFMaskTableView() { return mDeviceROFMaskTableView; }
130 const auto getDeviceTrackingTopologyView() const { return mDeviceTrackingTopologyView; }
131 auto& getTrackITSExt() { return mTrackITSExt; }
132 auto& getTrackIndices() { return mTrackIndices; }
133 Vertex* getDeviceVertices() { return mPrimaryVerticesDevice; }
134 int* getDeviceROFramesClusters(const int layer) { return mROFramesClustersDevice[layer]; }
135 int* getDeviceClusterSortKeys(const int layer) { return mClusterSortKeysDevice[layer]; }
136 int* getDeviceClusterSortPerm(const int layer) { return mClusterSortPermDevice[layer]; }
137 Cluster* getDeviceUnsortedClusters(const int layer) { return mUnsortedClustersDevice[layer]; }
138 Cluster* getDeviceClusters(const int layer) { return mClustersDevice[layer]; }
139 int* getDeviceClustersIndexTable(const int layer) { return mClustersIndexTablesDevice[layer]; }
140 const float* getDeviceMinRs() const { return mClusterMinRDevice; }
141 const float* getDeviceMaxRs() const { return mClusterMaxRDevice; }
142 int* getDeviceROFramesPV() { return mROFramesPVDevice; }
143 unsigned char* getDeviceUsedClusters(const int);
145
146 // Hybrid
147 TrackITSExt* getDeviceTrackITSExt() { return mTrackITSExtDevice; }
148 int* getDeviceTrackIndices() { return mTrackIndicesDevice; }
149 TrackExtensionHypothesis<NLayers>* getDeviceActiveTrackExtensionHypotheses() { return mActiveTrackExtensionHypothesesDevice; }
150 TrackExtensionHypothesis<NLayers>* getDeviceNextTrackExtensionHypotheses() { return mNextTrackExtensionHypothesesDevice; }
151 int* getDeviceNeighboursLUT(const int layer) { return mNeighboursLUTDevice[layer]; }
152 CellNeighbour** getDeviceArrayNeighbours() { return mNeighboursDeviceArray; }
153 unsigned long long** getDeviceArrayClusterOwners() { return mClusterOwnersDeviceArray; }
154 o2::its::Line* getDeviceLines() { return mLinesDevice; }
155 int* getDeviceLineSlots() { return mLineSlotsDevice; }
156 int* getDeviceLineRof() { return mLineRofDevice; }
157 int* getDeviceLineClusters() { return mLineClustersDevice; }
158 float* getDeviceLineChi2() { return mLineChi2Device; }
159 float* getDeviceLinePt() { return mLinePtDevice; }
160 float* getDeviceLineZs() { return mLineZsDevice; }
161 o2::its::TimeEstBC* getDeviceLineTimes() { return mLineTimesDevice; }
162 int* getDeviceLineSortedIdx() { return mLinesSortedIdx; }
163 LineProjSoA getLineProjSoA() { return {mLineZsDevice, mLineTimesDevice, mLinesSortedIdx, mLineRofDevice}; }
164 LineProjSoA getLineProjSortedSoA() { return {mLineZsSortedDevice, mLineTimesSortedDevice, mLinesSortedIdx, mLineRofSortedDevice}; }
165 int* getDeviceRofLineOffsets() { return mRofLineOffsetsDevice; }
166 int* getDeviceLineDensity() { return mLineDensityDevice; }
167 gpu::LineWindow* getDeviceLineWin() { return mLineWinDevice; }
168 uint8_t* getDeviceLineIsPeak() { return mLineIsPeakDevice; }
169 int* getDeviceLineDensityFine() { return mLineDensityFineDevice; }
170 gpu::LineWindow* getDeviceLineWinFine() { return mLineWinFineDevice; }
171 uint8_t* getDeviceLineIsPeakFine() { return mLineIsPeakFineDevice; }
172 int* getDevicePeakScan() { return mPeakScanDevice; }
173 int* getDevicePeakLineIdx() { return mPeakLineIdxDevice; }
174 int* getDevicePeakOffsets() { return mPeakOffsetsDevice; }
175 const int* getDeviceNPeaks() { return mPeakOffsetsDevice + this->getNrof(1); }
176 VertexCand* getDeviceVertexCands() { return mVertexCandsDevice; }
178 void downloadPeakMembershipInputs(); // MC-only: peak indices, z-windows and the sorted time/idx columns
179 const auto& getHostVertexCands() const { return mVertexCandsHost; }
180 const auto& getHostPeakOffsets() const { return mPeakOffsetsHost; }
181 const auto& getHostPeakMembership() const { return mPeakMembershipHost; }
182 bounded_vector<o2::MCCompLabel>& getLineLabelFlat() { return mLineLabelFlatHost; }
183 const bounded_vector<o2::MCCompLabel>& getLineLabelFlat() const { return mLineLabelFlatHost; }
184 Vertex* getDeviceDiamond() { return mDiamondDevice; }
185 std::array<CellNeighbour*, MaxCells>& getDeviceNeighboursAll() { return mNeighboursDevice; }
186 CellNeighbour* getDeviceNeighbours(const int layer) { return mNeighboursDevice[layer]; }
187 const TrackingFrameInfo** getDeviceArrayTrackingFrameInfo() const { return mTrackingFrameInfoDeviceArray; }
188 const Cluster** getDeviceArrayClusters() const { return mClustersDeviceArray; }
189 const Cluster** getDeviceArrayUnsortedClusters() const { return mUnsortedClustersDeviceArray; }
190 const int** getDeviceArrayClustersIndexTables() const { return mClustersIndexTablesDeviceArray; }
191 std::vector<unsigned int> getClusterSizes();
192 uint8_t** getDeviceArrayUsedClusters() const { return mUsedClustersDeviceArray; }
193 const int** getDeviceROFrameClusters() const { return mROFramesClustersDeviceArray; }
194 Tracklet** getDeviceArrayTracklets() { return mTrackletsDeviceArray; }
195 int** getDeviceArrayTrackletsLUT() const { return mTrackletsLUTDeviceArray; }
196 int** getDeviceArrayCellsLUT() const { return mCellsLUTDeviceArray; }
197 int** getDeviceArrayNeighboursCellLUT() const { return mNeighboursCellLUTDeviceArray; }
198 CellSeed** getDeviceArrayCells() { return mCellsDeviceArray; }
199 TrackSeedN* getDeviceTrackSeeds() { return mTrackSeedsDevice; }
200 int* getDeviceTrackSeedIndices() { return mTrackSeedIndicesDevice; }
201 int* getDeviceTrackCounter() { return mTrackCounterDevice; }
202 auto getNTrackSeeds() const { return mNTracks; }
203
205
206 // Host-specific getters
207 gsl::span<int> getNTracklets() { return {mNTracklets.data(), static_cast<gsl::span<int>::size_type>(this->mTrackingTopologyView.nLinks)}; }
208 gsl::span<int> getNCells() { return {mNCells.data(), static_cast<gsl::span<int>::size_type>(this->mTrackingTopologyView.nCells)}; }
209 auto& getArrayNCells() { return mNCells; }
210 gsl::span<int> getNNeighbours() { return {mNNeighbours.data(), static_cast<gsl::span<int>::size_type>(this->mTrackingTopologyView.nCells)}; }
211
212 // Host-available device getters
213 gsl::span<int*> getDeviceTrackletsLUTs() { return mTrackletsLUTDevice; }
214 gsl::span<int*> getDeviceCellLUTs() { return mCellsLUTDevice; }
215 gsl::span<Tracklet*> getDeviceTracklets() { return mTrackletsDevice; }
216 gsl::span<CellSeed*> getDeviceCells() { return mCellsDevice; }
217
218 // Overridden getters
219 size_t getNumberOfTracklets() const final;
220 size_t getNumberOfCells() const final;
221 size_t getNumberOfNeighbours() const final;
222
223 protected:
224 void prepareClusters(const TrackingParameters& trkParam, const int maxLayers) override;
225 void allocateClusterSortStorage(const TrackingParameters& trkParam, const int maxLayers) override;
226
227 private:
228 enum class SlotInit {
229 Raw,
230 Zero
231 };
232
233 template <typename T>
234 T* allocDevice(size_t n, int32_t type = o2::gpu::GPUMemoryResource::MEMORY_GPU);
235 template <typename T>
236 T* allocDeviceAsync(size_t n, Stream&, int32_t type = o2::gpu::GPUMemoryResource::MEMORY_GPU);
237 template <typename SlotPtr>
238 SlotPtr* allocSlotArray(size_t n);
239 template <typename T>
240 void copyToDevice(T* dst, const T* src, size_t n);
241 template <typename T>
242 void copyFromDevice(T* dst, const T* src, size_t n);
243 template <typename T, typename ArrayT>
244 void publishSlot(ArrayT deviceArray, int slot, T* const& devicePtr, Stream&);
245 template <typename T, size_t N, typename ArrayT>
246 T* createSlot(std::array<T*, N>& slots, ArrayT deviceArray, int slot, size_t n, const char* what, SlotInit init = SlotInit::Raw, int32_t type = o2::gpu::GPUMemoryResource::MEMORY_GPU);
247 template <typename T, size_t N, typename ArrayT, typename Container>
248 void uploadSlot(std::array<T*, N>& slots, ArrayT deviceArray, int slot, const Container& host, const char* what);
249 template <typename ArrayT, typename T, size_t N>
250 void createPinnedSlotArray(ArrayT& deviceArray, std::array<T*, N>& slots, std::bitset<NLayers + 1>& pinned);
251 template <typename Layers>
252 void pinHostLayers(Layers& layers, std::bitset<NLayers + 1>& pinned, int maxLayers);
253 template <typename Table>
254 typename Table::View uploadNavigationTable(const Table& table, const typename Table::View& hostView);
255
256 // Host-available device buffer sizes
257 std::array<int, MaxLinks> mNTracklets{};
258 std::array<int, MaxCells> mNCells{};
259 std::array<int, MaxCells> mNNeighbours{};
260
261 // Device pointers
262 IndexTableUtilsN* mIndexTableUtilsDevice{nullptr};
263 float* mIterationParametersDevice{nullptr};
264 const float* mLayerRadiiDevice{nullptr};
265 const float* mMinPtsDevice{nullptr};
266 const float* mLayerxX0Device{nullptr};
267 // device navigation views
268 ROFOverlapTableN::View mDeviceROFOverlapTableView;
269 ROFVertexLookupTableN::View mDeviceROFVertexLookupTableView;
270 ROFMaskTableN::View mDeviceROFMaskTableView;
271 std::vector<typename TrackingTopologyN::View> mDeviceTrackerTopologyViews;
272 typename TrackingTopologyN::View mDeviceTrackingTopologyView;
273
274 // Hybrid pref
275 Vertex* mPrimaryVerticesDevice{nullptr};
276 std::array<Cluster*, NLayers> mClustersDevice{};
277 std::array<Cluster*, NLayers> mUnsortedClustersDevice{};
278 std::array<int*, NLayers> mClustersIndexTablesDevice{};
279 std::array<unsigned char*, NLayers> mUsedClustersDevice{};
280 std::array<int*, NLayers> mROFramesClustersDevice{};
281 const Cluster** mClustersDeviceArray{nullptr};
282 const Cluster** mUnsortedClustersDeviceArray{nullptr};
283 const int** mClustersIndexTablesDeviceArray{nullptr};
284 uint8_t** mUsedClustersDeviceArray{nullptr};
285 const int** mROFramesClustersDeviceArray{nullptr};
286 int* mROFramesPVDevice;
287 std::array<int*, NLayers> mClusterSortKeysDevice{};
288 std::array<int*, NLayers> mClusterSortPermDevice{};
289 float* mClusterMinRDevice{nullptr};
290 float* mClusterMaxRDevice{nullptr};
291 std::array<Tracklet*, MaxLinks> mTrackletsDevice{};
292 std::array<int*, MaxLinks> mTrackletsLUTDevice{};
293 std::array<int*, MaxCells> mCellsLUTDevice{};
294 std::array<int*, MaxCells> mNeighboursLUTDevice{};
295
296 Tracklet** mTrackletsDeviceArray{nullptr};
297 int** mCellsLUTDeviceArray{nullptr};
298 int** mNeighboursCellLUTDeviceArray{nullptr};
299 int** mTrackletsLUTDeviceArray{nullptr};
300 std::array<CellSeed*, MaxCells> mCellsDevice{};
301 CellSeed** mCellsDeviceArray{nullptr};
302 TrackSeedN* mTrackSeedsDevice{nullptr};
303 int* mTrackSeedIndicesDevice{nullptr};
304 int* mTrackCounterDevice{nullptr};
305 unsigned int mNTracks{0};
306
307 TrackITSExt* mTrackITSExtDevice{nullptr};
308 int* mTrackIndicesDevice{nullptr};
309 TrackExtensionHypothesis<NLayers>* mActiveTrackExtensionHypothesesDevice{nullptr};
310 TrackExtensionHypothesis<NLayers>* mNextTrackExtensionHypothesesDevice{nullptr};
311 std::array<CellNeighbour*, MaxCells> mNeighboursDevice{};
312 CellNeighbour** mNeighboursDeviceArray{nullptr};
313 std::array<TrackingFrameInfo*, NLayers> mTrackingFrameInfoDevice{};
314 const TrackingFrameInfo** mTrackingFrameInfoDeviceArray{nullptr};
315 std::array<unsigned long long*, 3> mClusterOwnersDevice{};
316 unsigned long long** mClusterOwnersDeviceArray{nullptr};
317 int* mLineSlotsDevice{nullptr};
318 o2::its::Line* mLinesDevice{nullptr};
319 int* mLineRofDevice{nullptr};
320 int* mLineClustersDevice{nullptr};
321 float* mLineChi2Device{nullptr};
322 float* mLinePtDevice{nullptr};
323 float* mLineZsDevice{nullptr};
324 o2::its::TimeEstBC* mLineTimesDevice{nullptr};
325 float* mLineZsSortedDevice{nullptr};
326 o2::its::TimeEstBC* mLineTimesSortedDevice{nullptr};
327 int* mLinesSortedIdx{nullptr};
328 int* mLineRofSortedDevice{nullptr}; // per (sorted) line's ROF
329 int* mRofLineOffsetsDevice{nullptr}; // CSR offsets into the (rof,z)-sorted lines, size nRofs+1
330 int* mLineDensityDevice{nullptr}; // per (sorted) line: count of time-compatible neighbours in its z-window
331 gpu::LineWindow* mLineWinDevice{nullptr}; // per (sorted) line: [lo,hi) bounds of its z-window (sorted coords)
332 uint8_t* mLineIsPeakDevice{nullptr}; // per (sorted) line: 1 if it is a local density peak (vertex candidate)
333 int* mLineDensityFineDevice{nullptr};
334 gpu::LineWindow* mLineWinFineDevice{nullptr};
335 uint8_t* mLineIsPeakFineDevice{nullptr};
336 int* mPeakScanDevice{nullptr}; // per (sorted) line: number of peaks strictly before it
337 int* mPeakLineIdxDevice{nullptr}; // per peak slot: the sorted line index it came from
338 int* mPeakOffsetsDevice{nullptr}; // CSR offsets into the compacted peaks
339 VertexCand* mVertexCandsDevice{nullptr};
340 int mNLinesCapacity{0}; // = nCells the line buffers were sized for
341 bounded_vector<o2::its::Line> mLinesHost;
342 bounded_vector<int> mLineRofHost;
343 bounded_vector<int> mLineClustersHost;
344 bounded_vector<VertexCand> mVertexCandsHost;
345 bounded_vector<int> mPeakOffsetsHost;
346 bounded_vector<o2::MCCompLabel> mLineLabelFlatHost;
347 PeakMembershipHost mPeakMembershipHost;
348 Vertex* mDiamondDevice{nullptr};
349
350 // State
351 Streams mGpuStreams;
352 std::bitset<NLayers + 1> mPinnedUnsortedClusters{0};
353 std::bitset<NLayers + 1> mPinnedClusters{0};
354 std::bitset<NLayers + 1> mPinnedClustersIndexTables{0};
355 std::bitset<NLayers + 1> mPinnedUsedClusters{0};
356 std::bitset<NLayers + 1> mPinnedROFramesClusters{0};
357 std::bitset<NLayers + 1> mPinnedTrackingFrameInfo{0};
358
359 // Temporary buffer for storing output tracks from GPU tracking
360 bounded_vector<TrackITSExt> mTrackITSExt;
361 bounded_vector<int> mTrackIndices;
362};
363
364template <int NLayers>
365inline std::vector<unsigned int> TimeFrameGPU<NLayers>::getClusterSizes()
366{
367 std::vector<unsigned int> sizes(this->mUnsortedClusters.size());
368 std::transform(this->mUnsortedClusters.begin(), this->mUnsortedClusters.end(), sizes.begin(),
369 [](const auto& v) { return static_cast<unsigned int>(v.size()); });
370 return sizes;
371}
372
373template <int NLayers>
375{
376 return std::accumulate(mNTracklets.begin(), mNTracklets.begin() + this->mTrackingTopologyView.nLinks, 0);
377}
378
379template <int NLayers>
381{
382 return std::accumulate(mNCells.begin(), mNCells.begin() + this->mTrackingTopologyView.nCells, 0);
383}
384
385template <int NLayers>
387{
388 return std::accumulate(mNNeighbours.begin(), mNNeighbours.begin() + this->mTrackingTopologyView.nCells, 0);
389}
390
391} // namespace o2::its::gpu
392
393#endif
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc Replace constant variables static by constexpr expressions Compile RTC in deterministic with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define Use RTC to optimize GPU code h configStandalone Processing proc_rtctech Use a file lock to serialize access to the cache folder int32_t
Shared budgeted host allocation and bounded-vector utilities.
small types shared by the host and device seeding vertexers, describing lines projected onto the beam...
#define protected
HMPID cluster implementation.
Definition Cluster.h:27
CellSeed: connections of three clusters.
Definition Cell.h:81
unsigned int downloadLinesDevice()
gsl::span< Tracklet * > getDeviceTracklets()
int * getDeviceClustersIndexTable(const int layer)
size_t getNumberOfTracklets() const final
virtual const char * getName() const noexcept override final
virtual bool isGPU() const noexcept final
interface
void createUsedClustersDevice(const int)
int * getDeviceROFramesClusters(const int layer)
void prepareClusters(const TrackingParameters &trkParam, const int maxLayers) override
void createClustersIndexTables(const int)
TrackExtensionHypothesis< NLayers > * getDeviceActiveTrackExtensionHypotheses()
void pushMemoryStack(const int)
Most relevant operations.
void createROFrameClustersDeviceArray(const int=NLayers)
const float * getDeviceMinRs() const
int * getDeviceClusterSortPerm(const int layer)
const auto getDeviceROFOverlapTableView()
void loadClustersIndexTables(const int)
TrackITSExt * getDeviceTrackITSExt()
TrackSeedN * getDeviceTrackSeeds()
void createTrackletsBuffers(const int, size_t capacity)
void initialise(const TrackingParameters &, int maxLayers, int iteration)
const auto & getHostLines() const
const auto getDeviceROFMaskTableView()
unsigned char * getDeviceUsedClusters(const int)
virtual void wipe() final
cleanup
void createTrackITSExtHost(const size_t nTracks)
size_t getNumberOfNeighbours() const final
void createTrackletsLUTDevice(bool, const int)
gpu::LineWindow * getDeviceLineWin()
uint8_t ** getDeviceArrayUsedClusters() const
const auto & getHostLineClusters() const
const int ** getDeviceArrayClustersIndexTables() const
const float * getDeviceMinPts() const
void createTrackExtensionScratchDevice(const int nThreads, const int maxHypotheses)
gpu::LineWindow * getDeviceLineWinFine()
void recordEvent(const int)
int ** getDeviceArrayCellsLUT() const
CellSeed ** getDeviceArrayCells()
gsl::span< CellSeed * > getDeviceCells()
o2::its::Line * getDeviceLines()
const auto getDeviceTrackingTopologyView() const
void waitEvent(const int, const int)
gsl::span< int * > getDeviceTrackletsLUTs()
void popMemoryStack(const int)
void createCellsBuffers(const int, size_t capacity)
void syncStreams(const bool=true)
~TimeFrameGPU() override=default
int * getDeviceNeighboursLUT(const int layer)
const int ** getDeviceROFrameClusters() const
uint8_t * getDeviceLineIsPeakFine()
VertexCand * getDeviceVertexCands()
void loadTrackingFrameInfoDevice(const int)
void createUnsortedClustersDeviceArray(const int=NLayers)
o2::its::TimeEstBC * getDeviceLineTimes()
const auto getDeviceROFVertexLookupTableView()
Tracklet ** getDeviceArrayTracklets()
void createClustersDevice(const int)
size_t getNumberOfCells() const final
auto & getStream(const size_t stream)
synchronization
void createTrackingFrameInfoDeviceArray(const int=NLayers)
Cluster * getDeviceUnsortedClusters(const int layer)
LineProjSoA getLineProjSortedSoA()
const auto & getHostLineRof() const
const auto & getHostPeakOffsets() const
void loadUnsortedClustersDevice(const int)
void createDiamondDevice(const Vertex &diamond)
const float * getDeviceLayerxX0() const
Cluster * getDeviceClusters(const int layer)
void loadROFCutMask(const int)
void createClustersDeviceArray(const int=NLayers)
void createCellsLUTDevice(const int)
void sortClustersDevice(const int layer, const TrackingParameters &trkParam)
const Cluster ** getDeviceArrayUnsortedClusters() const
void loadIterationParameters(const TrackingParameters &)
int * getDeviceClusterSortKeys(const int layer)
CellNeighbour ** getDeviceArrayNeighbours()
CellNeighbour * getDeviceNeighbours(const int layer)
const auto & getHostPeakMembership() const
void setDevicePropagator(const o2::base::PropagatorImpl< float > *p) final
void createTrackITSExtDevice(const size_t capacity)
int ** getDeviceArrayTrackletsLUT() const
gsl::span< int > getNCells()
void createLinesDevice(const int nCells)
const float * getDeviceMaxRs() const
void createClustersIndexTablesArray(const int=NLayers)
int ** getDeviceArrayNeighboursCellLUT() const
const o2::base::Propagator * getChainPropagator()
const Cluster ** getDeviceArrayClusters() const
TrackExtensionHypothesis< NLayers > * getDeviceNextTrackExtensionHypotheses()
gsl::span< int > getNNeighbours()
const TrackingFrameInfo ** getDeviceArrayTrackingFrameInfo() const
IndexTableUtilsN * getDeviceIndexTableUtils()
void createNeighboursLUTDevice(const int, const unsigned int)
const auto & getHostVertexCands() const
void loadROFrameClustersDevice(const int)
void createClusterSortScratchDevice(const int layer)
std::array< CellNeighbour *, MaxCells > & getDeviceNeighboursAll()
unsigned long long ** getDeviceArrayClusterOwners()
void createUsedClustersDeviceArray(const int=NLayers)
gsl::span< int * > getDeviceCellLUTs()
void initialise(const TrackingParameters &, int maxLayers)
void createNeighboursDevice(const unsigned int layer, size_t capacity)
void allocateClusterSortStorage(const TrackingParameters &trkParam, const int maxLayers) override
const float * getDeviceLayerRadii() const
void createTrackSeedsDevice(const size_t capacity)
bounded_vector< o2::MCCompLabel > & getLineLabelFlat()
gsl::span< int > getNTracklets()
std::vector< unsigned int > getClusterSizes()
const bounded_vector< o2::MCCompLabel > & getLineLabelFlat() const
GLdouble n
Definition glcorearb.h:1982
const GLdouble * v
Definition glcorearb.h:832
GLuint GLsizei const GLuint const GLintptr const GLsizeiptr * sizes
Definition glcorearb.h:2595
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GLenum GLenum dst
Definition glcorearb.h:1767
GLenum GLuint GLint GLint layer
Definition glcorearb.h:1310
GLuint GLuint stream
Definition glcorearb.h:1806
o2::its::LineWindow LineWindow
TrackExtensionHypothesis< NLayers > int const int maxHypotheses
o2::dataformats::Vertex< o2::its::TimeEstBC > Vertex
Definition Vertex.h:26
ROFVertexLookupTable< NLayers > ROFVertexLookupTableN
Definition TimeFrame.h:75
TrackSeed< NLayers > TrackSeedN
Definition TimeFrame.h:78
IndexTableUtils< NLayers > IndexTableUtilsN
Definition TimeFrame.h:73
const o2::base::PropagatorImpl< float > * mPropagatorDevice
Definition TimeFrame.h:315
int getNrof(int layer) const
Definition TimeFrame.h:109
TrackingTopologyN::View mTrackingTopologyView
Definition TimeFrame.h:366
TrackingTopology< NLayers > TrackingTopologyN
Definition TimeFrame.h:77
ROFOverlapTable< NLayers > ROFOverlapTableN
Definition TimeFrame.h:74
ROFMaskTable< NLayers > ROFMaskTableN
Definition TimeFrame.h:76