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() const GPUTPCRow& Row(const GPUTPCHitId& HitId) const { return mData.Row(HitId.RowIndex()); }
73 GPUhdni() GPUglobalref() commonMemoryStruct* CommonMemory() const
74 {
75 return (mCommonMem);
76 }
77
78 GPUdi() static void GetErrors2Seeding(const GPUParam& param, char sector, int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2)
79 {
80 // param.GetClusterErrors2(sector, iRow, param.GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
81 param.GetClusterErrorsSeeding2(sector, iRow, param.par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
82 }
83
84 GPUdi() void GetErrors2Seeding(int32_t iRow, const GPUTPCTrackParam& t, float time, float& ErrY2, float& ErrZ2) const
85 {
86 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, 0.f, 0.f, ErrY2, ErrZ2);
87 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : t.Z(), t.SinPhi(), t.DzDs(), time, ErrY2, ErrZ2);
88 }
89 GPUdi() void GetErrors2Seeding(int32_t iRow, float z, float sinPhi, float DzDs, float time, float& ErrY2, float& ErrZ2) const
90 {
91 // Param().GetClusterErrors2(mISector, iRow, Param().GetContinuousTracking() != 0. ? 125.f : z, sinPhi, DzDs, time, 0.f, 0.f, ErrY2, ErrZ2);
92 Param().GetClusterErrorsSeeding2(mISector, iRow, Param().par.continuousTracking != 0.f ? 125.f : z, sinPhi, DzDs, time, ErrY2, ErrZ2);
93 }
94
95 void SetupCommonMemory();
96 void* SetPointersDataLinks(void* mem);
97 void* SetPointersDataWeights(void* mem);
98 void* SetPointersDataScratch(void* mem);
99 void* SetPointersDataRows(void* mem);
100 void* SetPointersScratch(void* mem);
101 void* SetPointersScratchHost(void* mem);
102 void* SetPointersCommon(void* mem);
103 void* SetPointersTracklets(void* mem);
104 void* SetPointersOutput(void* mem);
106
107 int16_t MemoryResLinks() const { return mMemoryResLinks; }
108 int16_t MemoryResScratchHost() const { return mMemoryResScratchHost; }
109 int16_t MemoryResCommon() const { return mMemoryResCommon; }
110 int16_t MemoryResTracklets() const { return mMemoryResTracklets; }
111 int16_t MemoryResOutput() const { return mMemoryResOutput; }
112 int16_t MemoryResSectorScratch() const { return mMemoryResSectorScratch; }
113
114 void SetMaxData(const GPUTrackingInOutPointers& io);
115 void UpdateMaxData();
116
117 GPUhd() int32_t ISector() const { return mISector; }
118
119 GPUhd() GPUconstantref() const GPUTPCTrackingData& Data() const { return mData; }
121 {
122 return mData;
123 }
124
125 GPUhd() GPUglobalref() const GPUTPCRow& Row(int32_t rowIndex) const { return mData.Row(rowIndex); }
126
127 GPUhd() uint32_t NHitsTotal() const { return mData.NumberOfHits(); }
128 GPUhd() uint32_t NMaxTracklets() const { return mNMaxTracklets; }
129 GPUhd() uint32_t NMaxRowHits() const { return mNMaxRowHits; }
130 GPUhd() uint32_t NMaxTracks() const { return mNMaxTracks; }
131 GPUhd() uint32_t NMaxTrackHits() const { return mNMaxTrackHits; }
132 GPUhd() uint32_t NMaxStartHits() const { return mNMaxStartHits; }
133 GPUhd() uint32_t NMaxRowStartHits() const { return mNMaxRowStartHits; }
134
135 GPUd() void SetHitLinkUpData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkUpData(row, hitIndex, v); }
136 GPUd() void SetHitLinkDownData(const GPUTPCRow& row, int32_t hitIndex, calink v) { mData.SetHitLinkDownData(row, hitIndex, v); }
137 GPUd() calink HitLinkUpData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkUpData(row, hitIndex); }
138 GPUd() calink HitLinkDownData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitLinkDownData(row, hitIndex); }
139
140 GPUd() GPUglobalref() const cahit2* HitData(const GPUTPCRow& row) const { return mData.HitData(row); }
141 GPUd() GPUglobalref() const calink* HitLinkUpData(const GPUTPCRow& row) const { return mData.HitLinkUpData(row); }
142 GPUd() GPUglobalref() const calink* HitLinkDownData(const GPUTPCRow& row) const { return mData.HitLinkDownData(row); }
143 GPUd() GPUglobalref() const calink* FirstHitInBin(const GPUTPCRow& row) const { return mData.FirstHitInBin(row); }
144
145 GPUd() int32_t FirstHitInBin(const GPUTPCRow& row, int32_t binIndex) const { return mData.FirstHitInBin(row, binIndex); }
146
147 GPUd() cahit HitDataY(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataY(row, hitIndex); }
148 GPUd() cahit HitDataZ(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitDataZ(row, hitIndex); }
149 GPUd() cahit2 HitData(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitData(row, hitIndex); }
150
151 GPUhd() int32_t HitInputID(const GPUTPCRow& row, int32_t hitIndex) const { return mData.ClusterDataIndex(row, hitIndex); }
152
161 GPUdi() static int32_t CalculateHitWeight(int32_t NHits, float chi2)
162 {
163 float weight = NHits * (NHits * 2 - 5) * 128 / chi2; // TODO: Add QPt to this formula
164 if (weight < 0.f || weight > 2e9f) {
165 return 0;
166 }
167 return ((int32_t)weight);
168 }
169 GPUd() void MaximizeHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.MaximizeHitWeight(row, hitIndex, weight); }
170 GPUd() void SetHitWeight(const GPUTPCRow& row, int32_t hitIndex, int32_t weight) { mData.SetHitWeight(row, hitIndex, weight); }
171 GPUd() int32_t HitWeight(const GPUTPCRow& row, int32_t hitIndex) const { return mData.HitWeight(row, hitIndex); }
172
173 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracklets() const { return &mCommonMem->nTracklets; }
174 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NRowHits() const { return &mCommonMem->nRowHits; }
175 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NStartHits() const { return &mCommonMem->nStartHits; }
176
177 GPUhd() GPUglobalref() const GPUTPCHitId& TrackletStartHit(int32_t i) const { return mTrackletStartHits[i]; }
178 GPUhd() GPUglobalref() const GPUTPCHitId* TrackletStartHits() const { return mTrackletStartHits; }
179 GPUhd() GPUglobalref() GPUTPCHitId* TrackletStartHits() { return mTrackletStartHits; }
180 GPUhd() GPUglobalref() GPUTPCHitId* TrackletTmpStartHits() const { return mTrackletTmpStartHits; }
181 GPUhd() GPUglobalref() const GPUTPCTracklet& Tracklet(int32_t i) const { return mTracklets[i]; }
182 GPUhd() GPUglobalref() GPUTPCTracklet* Tracklets() const { return mTracklets; }
183 GPUhd() GPUglobalref() calink* TrackletRowHits() const { return mTrackletRowHits; }
184
185 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTracks() const { return &mCommonMem->nTracks; }
186 GPUhd() GPUglobalref() GPUTPCTrack* Tracks() const { return mTracks; }
187 GPUhd() GPUglobalref() GPUAtomic(uint32_t) * NTrackHits() const { return &mCommonMem->nTrackHits; }
188 GPUhd() GPUglobalref() GPUTPCHitId* TrackHits() const { return mTrackHits; }
189
190 GPUhd() GPUglobalref() GPUTPCRow* TrackingDataRows() const { return (mData.Rows()); }
191 GPUhd() GPUglobalref() int32_t* RowStartHitCountOffset() const { return (mRowStartHitCountOffset); }
192
194 int32_t fTtrack; // Track ID
195 float fSortVal; // Value to sort for
196 };
197
198 void* LinkTmpMemory() { return mLinkTmpMemory; }
199
200#ifdef GPUCA_TRACKLET_CONSTRUCTOR_DO_PROFILE
201 char* mStageAtSync = nullptr; // Temporary performance variable: Pointer to array storing current stage for every thread at every sync point
202#endif
203
204 private:
208 char* mLinkTmpMemory = nullptr; // tmp memory for hits after neighbours finder
209
210 int32_t mISector = -1; // Number of sector
211
212 GPUTPCTrackingData mData; // The TrackingData object. It is used to encapsulate the storage in memory from the access
213
214 uint32_t mNMaxStartHits = 0;
215 uint32_t mNMaxRowStartHits = 0;
216 uint32_t mNMaxTracklets = 0;
217 uint32_t mNMaxRowHits = 0;
218 uint32_t mNMaxTracks = 0;
219 uint32_t mNMaxTrackHits = 0;
220 uint16_t mMemoryResLinks = (uint16_t)-1;
221 uint16_t mMemoryResScratch = (uint16_t)-1;
222 uint16_t mMemoryResScratchHost = (uint16_t)-1;
223 uint16_t mMemoryResCommon = (uint16_t)-1;
224 uint16_t mMemoryResTracklets = (uint16_t)-1;
225 uint16_t mMemoryResOutput = (uint16_t)-1;
226 uint16_t mMemoryResSectorScratch = (uint16_t)-1;
227
228 // GPU Temp Arrays
229 GPUglobalref() int32_t* mRowStartHitCountOffset = nullptr; // Offset, length and new offset of start hits in row
230 GPUglobalref() GPUTPCHitId* mTrackletTmpStartHits = nullptr; // Unsorted start hits
231 GPUglobalref() char* mGPUTrackletTemp = nullptr; // Temp Memory for GPU Tracklet Constructor
232
233 // event
234 GPUglobalref() commonMemoryStruct* mCommonMem = nullptr; // common event memory
235 GPUglobalref() GPUTPCHitId* mTrackletStartHits = nullptr; // start hits for the tracklets
236 GPUglobalref() GPUTPCTracklet* mTracklets = nullptr; // tracklets
237 GPUglobalref() calink* mTrackletRowHits = nullptr; // Hits for each Tracklet in each row
238 GPUglobalref() GPUTPCTrack* mTracks = nullptr; // reconstructed tracks
239 GPUglobalref() GPUTPCHitId* mTrackHits = nullptr; // array of track hit numbers
240
241 static int32_t StarthitSortComparison(const void* a, const void* b);
242};
243} // namespace o2::gpu
244
245#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
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
int32_t int32_t weight
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