Project
Loading...
Searching...
No Matches
GPUTPCTracker.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.
11
14
15#ifndef GPUTPCTRACKER_H
16#define GPUTPCTRACKER_H
17
18#include "GPUTPCDef.h"
19
20#if !defined(GPUCA_GPUCODE)
21#include <iostream>
22#endif
23
24#include "GPUTPCHitId.h"
25#include "GPUTPCTrackingData.h"
26#include "GPUTPCTrackParam.h"
27#include "GPUTPCTracklet.h"
28#include "GPUProcessor.h"
29
30namespace o2::gpu
31{
32struct GPUTPCClusterData;
33struct GPUParam;
34class GPUTPCTrack;
35class GPUTPCTrackParam;
36class GPUTPCRow;
37
39{
40 public:
41#ifndef GPUCA_GPUCODE_DEVICE
42 GPUTPCTracker() = default;
44 GPUTPCTracker(const GPUTPCTracker&) = delete;
46
47 void SetSector(int32_t iSector);
50
52
53 // Debugging Stuff
54 void DumpTrackingData(std::ostream& out); // Dump Input Sector Data
55 void DumpLinks(std::ostream& out, int32_t phase); // Dump all links to file (for comparison after NeighboursFinder/Cleaner)
56 void DumpStartHits(std::ostream& out); // Same for Start Hits
57 void DumpHitWeights(std::ostream& out); //....
58 void DumpTrackHits(std::ostream& out); // Same for Track Hits
59 void DumpTrackletHits(std::ostream& out); // Same for Track Hits
60#endif
61
63 GPUAtomic(uint32_t) nStartHits = 0; // number of start hits
64 GPUAtomic(uint32_t) nTracklets = 0; // number of tracklets
65 GPUAtomic(uint32_t) nRowHits = 0; // number of tracklet hits
66 GPUAtomic(uint32_t) nTracks = 0; // number of reconstructed tracks
67 int32_t nLocalTracks = 0; // number of reconstructed tracks before extrapolation tracking
68 GPUAtomic(uint32_t) nTrackHits = 0; // number of track hits
69 int32_t nLocalTrackHits = 0; // see above
70 };
71
72 GPUhdi() GPUglobalref() const GPUTPCClusterData* ClusterData() const
73 {
74 return mData.ClusterData();
75 }
76 GPUhdi() const GPUTPCRow& Row(const GPUTPCHitId& HitId) const { return mData.Row(HitId.RowIndex()); }
77 GPUhdni() GPUglobalref() commonMemoryStruct* CommonMemory() const
78 {
79 return (mCommonMem);
80 }
81
82 GPUdi() static void GetErrors2Seeding(const GPUParam& param, char sector, int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2)
83 {
84 // param.GetClusterErrors2(sector, iRow, param.GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
85 param.GetClusterErrorsSeeding2(sector, iRow, param.par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
86 }
87
88 GPUdi() void GetErrors2Seeding(int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2) const
89 {
90 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
91 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
92 }
93 GPUdi() void GetErrors2Seeding(int32_t iRow, float z, float sinPhi, float DzDs, float time, float& ErrY2, float& ErrZ2) const
94 {
95 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : z, sinPhi, DzDs, time, 0.f, 0.f, ErrY2, ErrZ2);
96 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : z, sinPhi, DzDs, time, ErrY2, ErrZ2);
97 }
98
99 void SetupCommonMemory();
100 void* SetPointersDataLinks(void* mem);
101 void* SetPointersDataWeights(void* mem);
102 void* SetPointersDataScratch(void* mem);
103 void* SetPointersDataRows(void* mem);
104 void* SetPointersScratch(void* mem);
105 void* SetPointersScratchHost(void* mem);
106 void* SetPointersCommon(void* mem);
107 void* SetPointersTracklets(void* mem);
108 void* SetPointersOutput(void* mem);
110
111 int16_t MemoryResLinks() const { return mMemoryResLinks; }
112 int16_t MemoryResScratchHost() const { return mMemoryResScratchHost; }
113 int16_t MemoryResCommon() const { return mMemoryResCommon; }
114 int16_t MemoryResTracklets() const { return mMemoryResTracklets; }
115 int16_t MemoryResOutput() const { return mMemoryResOutput; }
116 int16_t MemoryResSectorScratch() const { return mMemoryResSectorScratch; }
117
118 void SetMaxData(const GPUTrackingInOutPointers& io);
119 void UpdateMaxData();
120
121 GPUhd() int32_t ISector() const { return mISector; }
122
123 GPUhd() GPUconstantref() const GPUTPCTrackingData& Data() const { return mData; }
125 {
126 return mData;
127 }
128
129 GPUhd() GPUglobalref() const GPUTPCRow& Row(int32_t rowIndex) const { return mData.Row(rowIndex); }
130
131 GPUhd() uint32_t NHitsTotal() const { return mData.NumberOfHits(); }
132 GPUhd() uint32_t NMaxTracklets() const { return mNMaxTracklets; }
133 GPUhd() uint32_t NMaxRowHits() const { return mNMaxRowHits; }
134 GPUhd() uint32_t NMaxTracks() const { return mNMaxTracks; }
135 GPUhd() uint32_t NMaxTrackHits() const { return mNMaxTrackHits; }
136 GPUhd() uint32_t NMaxStartHits() const { return mNMaxStartHits; }
137 GPUhd() uint32_t NMaxRowStartHits() const { return mNMaxRowStartHits; }
138
139 GPUd() void SetHitLinkUpData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkUpData(row, hitIndex, v); }
140 GPUd() void SetHitLinkDownData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkDownData(row, hitIndex, v); }
141 GPUd() calink HitLinkUpData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkUpData(row, hitIndex); }
142 GPUd() calink HitLinkDownData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkDownData(row, hitIndex); }
143
144 GPUd() GPUglobalref() const cahit2* HitData(const GPUTPCRow& row) const { return mData.HitData(row); }
145 GPUd() GPUglobalref() const calink* HitLinkUpData(const GPUTPCRow& row) const { return mData.HitLinkUpData(row); }
146 GPUd() GPUglobalref() const calink* HitLinkDownData(const GPUTPCRow& row) const { return mData.HitLinkDownData(row); }
147 GPUd() GPUglobalref() const calink* FirstHitInBin(const GPUTPCRow& row) const { return mData.FirstHitInBin(row); }
148
149 GPUd() int32_t FirstHitInBin(const GPUTPCRow& row, int32_t binIndex) const { return mData.FirstHitInBin(row, binIndex); }
150
151 GPUd() cahit HitDataY(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataY(row, hitIndex); }
152 GPUd() cahit HitDataZ(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataZ(row, hitIndex); }
153 GPUd() cahit2 HitData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitData(row, hitIndex); }
154
155 GPUhd() int32_t HitInputID(const GPUTPCRow& row, int32_t hitIndex) const { return mData.ClusterDataIndex(row, hitIndex); }
156
165 GPUdi() static int32_t CalculateHitWeight(int32_t NHits, float chi2)
166 {
167 const float chi2_suppress = 6.f;
168 float weight = (((float)NHits * (chi2_suppress - chi2 / 500.f)) * (1e9f / chi2_suppress / 160.f));
169 if (weight < 0.f || weight > 2e9f) {
170 return 0;
171 }
172 return ((int32_t)weight);
173 // return( (NHits << 16) + num);
174 }
175 GPUd() void MaximizeHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.MaximizeHitWeight(row, hitIndex, weight); }
176 GPUd() void SetHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.SetHitWeight(row, hitIndex, weight); }
177 GPUd() int32_t HitWeight(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitWeight(row, hitIndex); }
178
179 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracklets() const { return &mCommonMem->nTracklets; }
180 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NRowHits() const { return &mCommonMem->nRowHits; }
181 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NStartHits() const { return &mCommonMem->nStartHits; }
182
183 GPUhd() GPUglobalref() const GPUTPCHitId& TrackletStartHit(int32_t i) const { return mTrackletStartHits[i]; }
184 GPUhd() GPUglobalref() const GPUTPCHitId* TrackletStartHits() const { return mTrackletStartHits; }
185 GPUhd() GPUglobalref() GPUTPCHitId* TrackletStartHits() { return mTrackletStartHits; }
186 GPUhd() GPUglobalref() GPUTPCHitId* TrackletTmpStartHits() const { return mTrackletTmpStartHits; }
187 GPUhd() GPUglobalref() const GPUTPCTracklet& Tracklet(int32_t i) const { return mTracklets[i]; }
188 GPUhd() GPUglobalref() GPUTPCTracklet* Tracklets() const { return mTracklets; }
189 GPUhd() GPUglobalref() calink* TrackletRowHits() const { return mTrackletRowHits; }
190
191 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracks() const { return &mCommonMem->nTracks; }
192 GPUhd() GPUglobalref() GPUTPCTrack* Tracks() const { return mTracks; }
193 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTrackHits() const { return &mCommonMem->nTrackHits; }
194 GPUhd() GPUglobalref() GPUTPCHitId* TrackHits() const { return mTrackHits; }
195
196 GPUhd() GPUglobalref() GPUTPCRow* TrackingDataRows() const { return (mData.Rows()); }
197 GPUhd() GPUglobalref() int32_t* RowStartHitCountOffset() const { return (mRowStartHitCountOffset); }
198
200 int32_t fTtrack; // Track ID
201 float fSortVal; // Value to sort for
202 };
203
204 void* LinkTmpMemory() { return mLinkTmpMemory; }
205
206#ifdef GPUCA_TRACKLET_CONSTRUCTOR_DO_PROFILE
207 char* mStageAtSync = nullptr; // Temporary performance variable: Pointer to array storing current stage for every thread at every sync point
208#endif
209
210 private:
214 char* mLinkTmpMemory = nullptr; // tmp memory for hits after neighbours finder
215
216 int32_t mISector = -1; // Number of sector
217
218 GPUTPCTrackingData mData; // The TrackingData object. It is used to encapsulate the storage in memory from the access
219
220 uint32_t mNMaxStartHits = 0;
221 uint32_t mNMaxRowStartHits = 0;
222 uint32_t mNMaxTracklets = 0;
223 uint32_t mNMaxRowHits = 0;
224 uint32_t mNMaxTracks = 0;
225 uint32_t mNMaxTrackHits = 0;
226 uint16_t mMemoryResLinks = (uint16_t)-1;
227 uint16_t mMemoryResScratch = (uint16_t)-1;
228 uint16_t mMemoryResScratchHost = (uint16_t)-1;
229 uint16_t mMemoryResCommon = (uint16_t)-1;
230 uint16_t mMemoryResTracklets = (uint16_t)-1;
231 uint16_t mMemoryResOutput = (uint16_t)-1;
232 uint16_t mMemoryResSectorScratch = (uint16_t)-1;
233
234 // GPU Temp Arrays
235 GPUglobalref() int32_t* mRowStartHitCountOffset = nullptr; // Offset, length and new offset of start hits in row
236 GPUglobalref() GPUTPCHitId* mTrackletTmpStartHits = nullptr; // Unsorted start hits
237 GPUglobalref() char* mGPUTrackletTemp = nullptr; // Temp Memory for GPU Tracklet Constructor
238
239 // event
240 GPUglobalref() commonMemoryStruct* mCommonMem = nullptr; // common event memory
241 GPUglobalref() GPUTPCHitId* mTrackletStartHits = nullptr; // start hits for the tracklets
242 GPUglobalref() GPUTPCTracklet* mTracklets = nullptr; // tracklets
243 GPUglobalref() calink* mTrackletRowHits = nullptr; // Hits for each Tracklet in each row
244 GPUglobalref() GPUTPCTrack* mTracks = nullptr; // reconstructed tracks
245 GPUglobalref() GPUTPCHitId* mTrackHits = nullptr; // array of track hit numbers
246
247 static int32_t StarthitSortComparison(const void* a, const void* b);
248};
249} // namespace o2::gpu
250
251#endif // GPUTPCTRACKER_H
uint64_t phase
Definition RawEventData.h:7
int32_t i
#define GPUAtomic(type)
#define GPUglobalref()
GPUconstantref() const GPUConstantMem *mConstantMem
GPUd() GPUconstantref() const GPUConstantMem *GetConstantMem() const
GPUhd() uint32_t NMaxRowHits() const
GPUhd() GPUglobalref() int32_t *RowStartHitCountOffset() const
GPUd() void SetHitWeight(const GPUTPCRow &row
GPUd() calink HitLinkDownData(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NStartHits() const
GPUhdni() GPUglobalref() commonMemoryStruct *CommonMemory() const
void * SetPointersScratchHost(void *mem)
GPUhd() uint32_t NMaxTrackHits() const
int16_t MemoryResTracklets() const
GPUd() int32_t HitWeight(const GPUTPCRow &row
void * SetPointersDataWeights(void *mem)
char int32_t const GPUTPCTrackParam float float & ErrY2
GPUhd() GPUglobalref() const GPUTPCHitId &TrackletStartHit(int32_t i) const
void * SetPointersDataRows(void *mem)
void * SetPointersOutput(void *mem)
float float float DzDs
GPUhd() GPUglobalref() GPUTPCTrack *Tracks() const
int16_t MemoryResLinks() const
GPUhd() uint32_t NMaxTracks() const
void SetMaxData(const GPUTrackingInOutPointers &io)
GPUhd() GPUglobalref() GPUTPCHitId *TrackletStartHits()
void * SetPointersDataLinks(void *mem)
int16_t MemoryResOutput() const
GPUd() void SetHitLinkDownData(const GPUTPCRow &row
GPUhd() GPUglobalref() const GPUTPCRow &Row(int32_t rowIndex) const
void * SetPointersDataScratch(void *mem)
void DumpTrackHits(std::ostream &out)
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTracklets() const
GPUTPCTracker(const GPUTPCTracker &)=delete
GPUd() GPUglobalref() const cahit2 *HitData(const GPUTPCRow &row) const
GPUhd() GPUglobalref() GPUTPCHitId *TrackletTmpStartHits() const
GPUd() GPUglobalref() const calink *HitLinkUpData(const GPUTPCRow &row) const
GPUd() cahit2 HitData(const GPUTPCRow &row
GPUhd() GPUglobalref() const GPUTPCTracklet &Tracklet(int32_t i) const
GPUhdi() const GPUTPCRow &Row(const GPUTPCHitId &HitId) const
int16_t MemoryResSectorScratch() const
void InitializeRows(const GPUParam *param)
GPUd() cahit HitDataZ(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTrackHits() const
GPUhdi() GPUconstantref() GPUTPCTrackingData &Data()
void DumpLinks(std::ostream &out, int32_t phase)
void DumpStartHits(std::ostream &out)
GPUhd() uint32_t NMaxStartHits() const
GPUhd() GPUglobalref() GPUTPCTracklet *Tracklets() const
int16_t MemoryResScratchHost() const
GPUhdi() GPUglobalref() const GPUTPCClusterData *ClusterData() const
GPUd() void SetHitLinkUpData(const GPUTPCRow &row
GPUhd() uint32_t NMaxRowStartHits() const
GPUdi() void GetErrors2Seeding(int32_t iRow
GPUhd() GPUglobalref() GPUTPCHitId *TrackHits() const
GPUhd() GPUglobalref() const GPUTPCHitId *TrackletStartHits() const
GPUhd() uint32_t NHitsTotal() const
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NRowHits() const
void DumpHitWeights(std::ostream &out)
void * SetPointersCommon(void *mem)
GPUhd() GPUglobalref() GPUAtomic(uint32_t) *NTracks() const
int16_t MemoryResCommon() const
GPUTPCTracker & operator=(const GPUTPCTracker &)=delete
GPUd() GPUglobalref() const calink *FirstHitInBin(const GPUTPCRow &row) const
char int32_t const GPUTPCTrackParam float float float & ErrZ2
char int32_t const GPUTPCTrackParam float time
void * SetPointersTracklets(void *mem)
char int32_t const GPUTPCTrackParam & t
GPUhd() int32_t ISector() const
GPUhd() GPUglobalref() calink *TrackletRowHits() const
GPUhd() GPUconstantref() const GPUTPCTrackingData &Data() const
GPUhd() uint32_t NMaxTracklets() const
GPUhd() int32_t HitInputID(const GPUTPCRow &row
void * SetPointersScratch(void *mem)
void DumpTrackingData(std::ostream &out)
void DumpTrackletHits(std::ostream &out)
GPUd() cahit HitDataY(const GPUTPCRow &row
GPUhd() GPUglobalref() GPUTPCRow *TrackingDataRows() const
void SetSector(int32_t iSector)
const GPUTPCTrackParam float float float &ErrZ2 const
GPUd() GPUglobalref() const calink *HitLinkDownData(const GPUTPCRow &row) const
GPUd() void MaximizeHitWeight(const GPUTPCRow &row
void InitializeRows(const GPUParam &p)
const GLdouble * v
Definition glcorearb.h:832
GLuint GLuint GLfloat weight
Definition glcorearb.h:5477
GLboolean GLboolean GLboolean b
Definition glcorearb.h:1233
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLenum GLfloat param
Definition glcorearb.h:271
GLboolean GLboolean GLboolean GLboolean a
Definition glcorearb.h:1233
GLdouble GLdouble GLdouble z
Definition glcorearb.h:843
uint32_t cahit
Definition GPUTPCDef.h:31
uint32_t calink
Definition GPUTPCDef.h:30
std::vector< int > row