Project
Loading...
Searching...
No Matches
GPUTPCGMMergerDump.cxx
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#include <cstdio>
16#include <cstring>
17#include <cmath>
18#include <algorithm>
19#include <iomanip>
20#include <numeric>
21#include "GPUTPCTracker.h"
22#include "GPUTPCClusterData.h"
23#include "GPUTPCTrackParam.h"
24#include "GPUTPCGMMerger.h"
25#include "GPUO2DataTypes.h"
26#include "GPUCommonMath.h"
27#include "GPUTPCTrackParam.h"
28#include "GPUTPCGMMergedTrack.h"
29#include "GPUParam.h"
30#include "GPUParam.inc"
31#include "GPUTPCGMTrackParam.h"
32#include "GPUTPCGMSectorTrack.h"
33#include "GPUTPCGMBorderTrack.h"
34#include "GPUReconstruction.h"
35#include "GPUDebugStreamer.h"
37#include "GPUTrackingRefit.h"
39#include "GPUConstantMem.h"
40
41using namespace o2::gpu;
42using namespace gputpcgmmergertypes;
43
44void GPUTPCGMMerger::DumpSectorTracks(std::ostream& out) const
45{
46 std::streamsize ss = out.precision();
47 out << std::setprecision(2);
48 out << "\nTPC Merger Sector Tracks\n";
49 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
50 out << "Sector Track Info Index " << (mSectorTrackInfoIndex[iSector + 1] - mSectorTrackInfoIndex[iSector]) << " / " << (mSectorTrackInfoIndex[NSECTORS + iSector + 1] - mSectorTrackInfoIndex[NSECTORS + iSector]) << "\n";
51 for (int32_t iGlobal = 0; iGlobal < 2; iGlobal++) {
52 out << " Track type " << iGlobal << "\n";
53 for (int32_t j = mSectorTrackInfoIndex[iSector + NSECTORS * iGlobal]; j < mSectorTrackInfoIndex[iSector + NSECTORS * iGlobal + 1]; j++) {
54 const auto& trk = mSectorTrackInfos[j];
55 out << " Track " << j << ": LocalId " << (iGlobal ? (trk.LocalTrackId() >> 24) : -1) << "/" << (iGlobal ? (trk.LocalTrackId() & 0xFFFFFF) : -1) << " X " << trk.X() << " offsetz " << trk.TZOffset() << " A " << trk.Alpha() << " Y " << trk.Y() << " Z " << trk.Z() << " SinPhi " << trk.SinPhi() << " CosPhi " << trk.CosPhi() << " SecPhi " << trk.SecPhi() << " Tgl " << trk.DzDs() << " QPt " << trk.QPt() << "\n";
56 }
57 }
58 }
59 out << std::setprecision(ss);
60}
61
62void GPUTPCGMMerger::DumpMergeRanges(std::ostream& out, int32_t withinSector, int32_t mergeMode) const
63{
64 int32_t n = withinSector == -1 ? NSECTORS / 2 : NSECTORS;
65 for (int32_t i = 0; i < n; i++) {
66 int32_t n1, n2;
68 int32_t jSector;
69 MergeBorderTracksSetup(n1, n2, b1, b2, jSector, i, withinSector, mergeMode);
70 const int32_t nTrk = *mRec->GetConstantMem().tpcTrackers[jSector].NTracks();
71 const gputpcgmmergertypes::GPUTPCGMBorderRange* range1 = BorderRange(i);
72 const gputpcgmmergertypes::GPUTPCGMBorderRange* range2 = BorderRange(jSector) + nTrk;
73 out << "\nBorder Tracks : i " << i << " withinSector " << withinSector << " mergeMode " << mergeMode << "\n";
74 for (int32_t k = 0; k < n1; k++) {
75 out << " " << k << ": t " << b1[k].TrackID() << " ncl " << b1[k].NClusters() << " row " << (mergeMode > 0 ? b1[k].Row() : -1) << " par " << b1[k].Par()[0] << " " << b1[k].Par()[1] << " " << b1[k].Par()[2] << " " << b1[k].Par()[3] << " " << b1[k].Par()[4]
76 << " offset " << b1[k].ZOffsetLinear() << " cov " << b1[k].Cov()[0] << " " << b1[k].Cov()[1] << " " << b1[k].Cov()[2] << " " << b1[k].Cov()[3] << " " << b1[k].Cov()[4] << " covd " << b1[k].CovD()[0] << " " << b1[k].CovD()[1] << "\n";
77 }
78 if (i != jSector) {
79 for (int32_t k = 0; k < n2; k++) {
80 out << " " << k << ": t " << b2[k].TrackID() << " ncl " << b2[k].NClusters() << " row " << (mergeMode > 0 ? b2[k].Row() : -1) << " par " << b2[k].Par()[0] << " " << b2[k].Par()[1] << " " << b2[k].Par()[2] << " " << b2[k].Par()[3] << " " << b2[k].Par()[4]
81 << " offset " << b2[k].ZOffsetLinear() << " cov " << b2[k].Cov()[0] << " " << b2[k].Cov()[1] << " " << b2[k].Cov()[2] << " " << b2[k].Cov()[3] << " " << b2[k].Cov()[4] << " covd " << b2[k].CovD()[0] << " " << b2[k].CovD()[1] << "\n";
82 }
83 }
84 out << "\nBorder Range : i " << i << " withinSector " << withinSector << " mergeMode " << mergeMode << "\n";
85 for (int32_t k = 0; k < n1; k++) {
86 out << " " << k << ": " << range1[k].fId << " " << range1[k].fMin << " " << range1[k].fMax << "\n";
87 }
88 for (int32_t k = 0; k < n2; k++) {
89 out << " " << k << ": " << range2[k].fId << " " << range2[k].fMin << " " << range2[k].fMax << "\n";
90 }
91 }
92}
93
94void GPUTPCGMMerger::DumpTrackLinks(std::ostream& out, bool output, const char* type) const
95{
96 out << "\nTPC Merger Links " << type << "\n";
97 const int32_t n = output ? mMemory->nMergedTracks : SectorTrackInfoLocalTotal();
98 for (int32_t i = 0; i < n; i++) {
99 if (mTrackLinks[i] != -1) {
100 out << " " << i << ": " << mTrackLinks[i] << "\n";
101 }
102 }
103}
104
105void GPUTPCGMMerger::DumpMergedWithinSectors(std::ostream& out) const
106{
107 DumpTrackLinks(out, false, "within Sectors");
108 out << "\nTPC Merger Merge Within Sectors\n";
109 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
110 for (int32_t j = mSectorTrackInfoIndex[iSector]; j < mSectorTrackInfoIndex[iSector + 1]; j++) {
111 const auto& trk = mSectorTrackInfos[j];
112 if (trk.NextSegmentNeighbour() >= 0 || trk.PrevSegmentNeighbour() >= 0) {
113 out << " Track " << j << ": Neighbour " << trk.PrevSegmentNeighbour() << " / " << trk.NextSegmentNeighbour() << "\n";
114 }
115 }
116 }
117}
118
119void GPUTPCGMMerger::DumpMergedBetweenSectors(std::ostream& out) const
120{
121 DumpTrackLinks(out, false, "between Sectors");
122 out << "\nTPC Merger Merge Between Sectors\n";
123 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
124 for (int32_t j = mSectorTrackInfoIndex[iSector]; j < mSectorTrackInfoIndex[iSector + 1]; j++) {
125 const auto& trk = mSectorTrackInfos[j];
126 if (trk.NextNeighbour() >= 0 || trk.PrevNeighbour() >= 0) {
127 out << " Track " << j << ": Neighbour " << trk.PrevNeighbour() << " / " << trk.NextNeighbour() << "\n";
128 }
129 if (trk.PrevNeighbour() == -1 && trk.PrevSegmentNeighbour() == -1) {
130 PrintMergeGraph(&trk, out);
131 }
132 }
133 }
134}
135
136void GPUTPCGMMerger::DumpCollected(std::ostream& out) const
137{
138 std::streamsize ss = out.precision();
139 out << std::setprecision(2);
140 out << "\nTPC Merger Collected Tracks\n";
141 for (uint32_t i = 0; i < mMemory->nMergedTracks; i++) {
142 const auto& trk = mMergedTracks[i];
143 const auto& p = trk.GetParam();
144 out << " Track " << i << ": Loop " << trk.Looper() << " Alpha " << trk.GetAlpha() << " X " << p.GetX() << " offset " << p.GetTZOffset() << " Y " << p.GetY() << " Z " << p.GetZ() << " SPhi " << p.GetSinPhi() << " Tgl " << p.GetDzDs() << " QPt " << p.GetQPt() << " NCl " << trk.NClusters() << "\n";
145 }
146 out << std::setprecision(ss);
147}
148
149void GPUTPCGMMerger::DumpMergeCE(std::ostream& out) const
150{
151 DumpTrackLinks(out, true, " for CE merging");
152 out << "\nTPC Merger Merge CE\n";
153 for (uint32_t i = 0; i < mMemory->nMergedTracks; i++) {
154 const auto& trk = mMergedTracks[i];
155 if (trk.CCE()) {
156 out << " Track " << i << ": CCE\n";
157 }
158 }
159}
160
161void GPUTPCGMMerger::DumpFitPrepare(std::ostream& out) const
162{
163 out << "\nTPC Merger Refit Prepare\n";
164 out << " Sort\n";
165 for (uint32_t i = 0; i < mMemory->nMergedTracks; i++) {
166 out << " " << i << ": " << mTrackOrderAttach[i] << "\n";
167 }
168 out << " Clusters\n";
169 for (uint32_t j = 0; j < mMemory->nMergedTracks; j++) {
170 const auto& trk = mMergedTracks[j];
171 out << " Track " << j << ": ";
172 for (uint32_t i = trk.FirstClusterRef(); i < trk.FirstClusterRef() + trk.NClusters(); i++) {
173 out << j << "/" << (i - trk.FirstClusterRef()) << ": " << mClusters[i].num << "/" << (int32_t)mClusters[i].state << ", ";
174 }
175 out << "\n";
176 }
177 uint32_t maxId = mNMaxClusters;
178 uint32_t j = 0;
179 for (uint32_t i = 0; i < maxId; i++) {
180 if ((mClusterAttachment[i] & attachFlagMask) != 0) {
181 if (++j % 10 == 0) {
182 out << " Cluster attachment ";
183 }
184 out << i << ": " << (mClusterAttachment[i] & attachTrackMask) << " / " << (mClusterAttachment[i] & attachFlagMask) << " - ";
185 if (j % 10 == 0) {
186 out << "\n";
187 }
188 }
189 }
190 out << "\n";
191}
192
193void GPUTPCGMMerger::DumpRefit(std::ostream& out) const
194{
195 std::streamsize ss = out.precision();
196 out << std::setprecision(2);
197 out << "\nTPC Merger Refit\n";
198 for (uint32_t i = 0; i < mMemory->nMergedTracks; i++) {
199 const auto& trk = mMergedTracks[i];
200 if (trk.NClusters() == 0) {
201 continue;
202 }
203 const auto& p = trk.GetParam();
204 const auto& po = trk.OuterParam();
205 out << " Track " << i << ": OK " << trk.OK() << " Alpha " << trk.GetAlpha() << " X " << p.GetX() << " offset " << p.GetTZOffset() << " Y " << p.GetY() << " Z " << p.GetZ() << " SPhi " << p.GetSinPhi() << " Tgl " << p.GetDzDs() << " QPt " << p.GetQPt() << " NCl " << trk.NClusters() << " / " << trk.NClustersFitted() << " Cov " << p.GetErr2Y() << "/" << p.GetErr2Z()
206 << " dEdx " << (trk.OK() && Param().dodEdxEnabled ? mMergedTracksdEdx[i].dEdxTotTPC : -1.f) << "/" << (trk.OK() && Param().dodEdxEnabled ? mMergedTracksdEdx[i].dEdxMaxTPC : -1.f)
207 << " Outer " << po.P[0] << "/" << po.P[1] << "/" << po.P[2] << "/" << po.P[3] << "/" << po.P[4]
208 << " NFitted " << trk.NClustersFitted() << " legs " << (int)trk.Legs() << " flags " << (int)trk.Flags() << "\n";
209 }
210 out << std::setprecision(ss);
211}
212
213void GPUTPCGMMerger::DumpLoopers(std::ostream& out) const
214{
215 out << "\n TPC Merger Looper Afterburner\n";
216 for (uint32_t i = 0; i < mMemory->nMergedTracks; i++) {
217 if (i && i % 100 == 0) {
218 out << "\n";
219 }
220 out << (int)mMergedTracks[i].MergedLooper() << " ";
221 }
222 out << "\n";
223}
224
225void GPUTPCGMMerger::DumpFinal(std::ostream& out) const
226{
227 out << "\nTPC Merger Finalized\n";
228 for (uint32_t j = 0; j < mMemory->nMergedTracks; j++) {
229 const auto& trk = mMergedTracks[j];
230 if (trk.NClusters() == 0) {
231 continue;
232 }
233 out << " Track " << j << ": ";
234 for (uint32_t i = trk.FirstClusterRef(); i < trk.FirstClusterRef() + trk.NClusters(); i++) {
235 if (mClusters[i].state != 0) {
236 out << j << "/" << (i - trk.FirstClusterRef()) << ": " << mClusters[i].num << "/" << (int32_t)mClusters[i].state << ", ";
237 }
238 }
239 out << "\n";
240 }
241 uint32_t maxId = mNMaxClusters;
242 uint32_t j = 0;
243 for (uint32_t i = 0; i < maxId; i++) {
244 if ((mClusterAttachment[i] & attachFlagMask) != 0) {
245 if (++j % 10 == 0) {
246 out << " Cluster attachment ";
247 }
248 out << i << ": " << (mClusterAttachment[i] & attachTrackMask) << " / " << (mClusterAttachment[i] & attachFlagMask) << " - ";
249 if (j % 10 == 0) {
250 out << "\n";
251 }
252 }
253 }
254 out << "\n";
255}
256
257template <int32_t mergeType>
258inline void GPUTPCGMMerger::MergedTrackStreamerInternal(const GPUTPCGMBorderTrack& b1, const GPUTPCGMBorderTrack& b2, const char* name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
259{
260#ifdef DEBUG_STREAMER
261 std::vector<int32_t> hits1(152), hits2(152);
262 for (int32_t i = 0; i < 152; i++) {
263 hits1[i] = hits2[i] = -1;
264 }
265 const GPUTPCTracker& tracker1 = GetConstantMem()->tpcTrackers[sector1];
266 const GPUTPCGMSectorTrack& sectorTrack1 = mSectorTrackInfos[b1.TrackID()];
267 const GPUTPCTrack& inTrack1 = *sectorTrack1.OrigTrack();
268 for (int32_t i = 0; i < inTrack1.NHits(); i++) {
269 const GPUTPCHitId& ic1 = tracker1.TrackHits()[inTrack1.FirstHitID() + i];
270 int32_t clusterIndex = tracker1.Data().ClusterDataIndex(tracker1.Data().Row(ic1.RowIndex()), ic1.HitIndex());
271 hits1[ic1.RowIndex()] = clusterIndex;
272 }
273 const GPUTPCTracker& tracker2 = GetConstantMem()->tpcTrackers[sector2];
274 const GPUTPCGMSectorTrack& sectorTrack2 = mSectorTrackInfos[b2.TrackID()];
275 const GPUTPCTrack& inTrack2 = *sectorTrack2.OrigTrack();
276 for (int32_t i = 0; i < inTrack2.NHits(); i++) {
277 const GPUTPCHitId& ic2 = tracker2.TrackHits()[inTrack2.FirstHitID() + i];
278 int32_t clusterIndex = tracker2.Data().ClusterDataIndex(tracker2.Data().Row(ic2.RowIndex()), ic2.HitIndex());
279 hits2[ic2.RowIndex()] = clusterIndex;
280 }
281
282 std::string debugname = std::string("debug_") + name;
283 std::string treename = std::string("tree_") + name;
284 o2::utils::DebugStreamer::instance()->getStreamer(debugname.c_str(), "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName(treename.c_str()).data() << "sector1=" << sector1 << "sector2=" << sector2 << "b1=" << b1 << "b2=" << b2 << "clusters1=" << hits1 << "clusters2=" << hits2 << "sectorTrack1=" << sectorTrack1 << "sectorTrack2=" << sectorTrack2 << "mergeMode=" << mergeMode << "weight=" << weight << "fraction=" << frac << "\n";
285#endif
286}
287
288void GPUTPCGMMerger::MergedTrackStreamer(const GPUTPCGMBorderTrack& b1, const GPUTPCGMBorderTrack& b2, const char* name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
289{
290#ifdef DEBUG_STREAMER
291 if (mergeMode == 0) {
292 MergedTrackStreamerInternal<0>(b1, b2, name, sector1, sector2, mergeMode, weight, frac);
293 } else if (mergeMode >= 1 && mergeMode <= 0) {
294 // MergedTrackStreamerInternal<1>(b1, b2, name, sector1, sector2, mergeMode, weight, frac); Not yet working
295 }
296#endif
297}
298
300{
301 for (int32_t i = 0; i < N; i++) {
302 if (tracks[i].TrackID() == trackId) {
303 return tracks[i];
304 }
305 }
306 throw std::runtime_error("didn't find border track");
307}
308
310{
311 GPUTPCGMMergedTrack trk = track;
312 GPUTrackingRefit refit;
313 ((GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHitStates = ClusterStateExt();
314 ((GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHits = Clusters();
315 refit.SetPtrsFromGPUConstantMem(GetConstantMem());
316 int32_t retval = refit.RefitTrackAsGPU(trk, false, true);
317 if (retval > 0) {
319 prop.SetMaterialTPC();
320 prop.SetPolynomialField(&Param().polynomialField);
321 prop.SetMaxSinPhi(GPUCA_MAX_SIN_PHI);
322 prop.SetPropagateBzOnly(false);
323 prop.SetMatLUT(Param().rec.useMatLUT ? GetConstantMem()->calibObjects.matLUT : nullptr);
324 prop.SetTrack(&trk.Param(), trk.GetAlpha());
325 int32_t err = prop.PropagateToXAlpha(track.GetParam().GetX(), track.GetAlpha(), false);
326 if (err == 0) {
327 printf("REFIT RESULT %d, SnpDiff %f\n", retval, trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi());
328 if (retval > 20 && fabsf(trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi()) > 0.01f) {
329 printf("LARGE DIFF\n");
330 }
331 } else {
332 printf("PROPAGATE ERROR\n");
333 }
334 } else {
335 printf("REFIT ERROR\n");
336 }
337}
338
339std::vector<uint32_t> GPUTPCGMMerger::StreamerOccupancyBin(int32_t iSector, int32_t iRow, float time) const
340{
341 static int32_t size = getenv("O2_DEBUG_STREAMER_OCCUPANCY_NBINS") ? atoi(getenv("O2_DEBUG_STREAMER_OCCUPANCY_NBINS")) : Param().rec.tpc.occupancyMapTimeBinsAverage;
342 std::vector<uint32_t> retVal(1 + 2 * size);
343#ifdef DEBUG_STREAMER
344 const int32_t bin = CAMath::Max(0.f, time / Param().rec.tpc.occupancyMapTimeBins);
345 for (int32_t i = 0; i < 1 + 2 * size; i++) {
346 const int32_t mybin = bin + i - size;
347 retVal[i] = (mybin >= 0 && mybin < (int32_t)GPUTPCClusterOccupancyMapBin::getNBins(Param())) ? Param().occupancyMap[mybin] : 0;
348 }
349#endif
350 return retVal;
351}
352
353std::vector<float> GPUTPCGMMerger::StreamerUncorrectedZY(int32_t iSector, int32_t iRow, const GPUTPCGMTrackParam& track, const GPUTPCGMPropagator& prop) const
354{
355 std::vector<float> retVal(2);
356#ifdef DEBUG_STREAMER
357 GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(iSector, iRow, track.GetY(), track.GetZ(), retVal[0], retVal[1]);
358#endif
359 return retVal;
360}
361
362void GPUTPCGMMerger::DebugStreamerUpdate(int32_t iTrk, int32_t ihit, float xx, float yy, float zz, const GPUTPCGMMergedTrackHit& cluster, const o2::tpc::ClusterNative& clusterNative, const GPUTPCGMTrackParam& track, const GPUTPCGMPropagator& prop, const gputpcgmmergertypes::InterpolationErrorHit& interpolation, int8_t rejectChi2, bool refit, int32_t retVal, float avgInvCharge, float posY, float posZ, int16_t clusterState, int32_t retValReject, float err2Y, float err2Z) const
363{
364#ifdef DEBUG_STREAMER
365 float time = clusterNative.getTime();
366 auto occupancyBins = StreamerOccupancyBin(cluster.sector, cluster.row, time);
367 auto uncorrectedYZ = StreamerUncorrectedZY(cluster.sector, cluster.row, track, prop);
368 float invCharge = 1.f / clusterNative.qMax;
369 int32_t iRow = cluster.row;
370 float unscaledMult = (time >= 0.f ? Param().GetUnscaledMult(time) / GPUTPCGeometry::Row2X(iRow) : 0.f);
371 const float clAlpha = Param().Alpha(cluster.sector);
372 uint32_t occupancyTotal = Param().occupancyTotal;
373 o2::utils::DebugStreamer::instance()->getStreamer("debug_update_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("tree_update_track").data()
374 << "iTrk=" << iTrk
375 << "ihit=" << ihit
376 << "xx=" << xx
377 << "yy=" << yy
378 << "zz=" << zz
379 << "cluster=" << cluster
380 << "clusterNative=" << clusterNative
381 << "track=" << track
382 << "rejectChi2=" << rejectChi2
383 << "interpolationhit=" << interpolation
384 << "refit=" << refit
385 << "retVal=" << retVal
386 << "occupancyBins=" << occupancyBins
387 << "occupancyTotal=" << occupancyTotal
388 << "trackUncorrectedYZ=" << uncorrectedYZ
389 << "avgInvCharge=" << avgInvCharge
390 << "invCharge=" << invCharge
391 << "unscaledMultiplicity=" << unscaledMult
392 << "alpha=" << clAlpha
393 << "iRow=" << iRow
394 << "posY=" << posY
395 << "posZ=" << posZ
396 << "clusterState=" << clusterState
397 << "retValReject=" << retValReject
398 << "err2Y=" << err2Y
399 << "err2Z=" << err2Z
400 << "\n";
401#endif
402}
benchmark::State & state
Helper class to access correction maps.
int16_t time
Definition RawEventData.h:4
int32_t i
#define GPUCA_MAX_SIN_PHI
int32_t retVal
const GPUTPCGMMerger::trackCluster & b1
void output(const std::map< std::string, ChannelStat > &channels)
Definition rawdump.cxx:197
uint32_t j
Definition RawData.h:0
double num
GPUReconstruction * mRec
const GPUConstantMem & GetConstantMem() const
int32_t int32_t int32_t int32_t int8_t int8_t mergeMode
void DumpMergeCE(std::ostream &out) const
void DumpMergedBetweenSectors(std::ostream &out) const
void MergedTrackStreamerInternal(const GPUTPCGMBorderTrack &b1, const GPUTPCGMBorderTrack &b2, const char *name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
void DumpFitPrepare(std::ostream &out) const
static constexpr const int32_t NSECTORS
void DebugRefitMergedTrack(const GPUTPCGMMergedTrack &track) const
int32_t int32_t int32_t bool output
int32_t int32_t int32_t gputpcgmmergertypes::GPUTPCGMBorderRange int32_t N
int32_t GPUTPCGMBorderTrack GPUTPCGMBorderTrack *& b2
void DumpTrackLinks(std::ostream &out, bool output, const char *type) const
void DumpFinal(std::ostream &out) const
std::vector< float > StreamerUncorrectedZY(int32_t iSector, int32_t iRow, const GPUTPCGMTrackParam &track, const GPUTPCGMPropagator &prop) const
std::vector< uint32_t > StreamerOccupancyBin(int32_t iSector, int32_t iRow, float time) const
void DumpRefit(std::ostream &out) const
void DumpMergedWithinSectors(std::ostream &out) const
void DumpCollected(std::ostream &out) const
int32_t GPUTPCGMBorderTrack GPUTPCGMBorderTrack int32_t & jSector
const GPUTPCGMBorderTrack & MergedTrackStreamerFindBorderTrack(const GPUTPCGMBorderTrack *tracks, int32_t N, int32_t trackId) const
void DumpLoopers(std::ostream &out) const
int32_t int32_t int32_t int32_t int8_t withinSector
void DebugStreamerUpdate(int32_t iTrk, int32_t ihit, float xx, float yy, float zz, const GPUTPCGMMergedTrackHit &cluster, const o2::tpc::ClusterNative &clusterNative, const GPUTPCGMTrackParam &track, const GPUTPCGMPropagator &prop, const gputpcgmmergertypes::InterpolationErrorHit &interpolation, int8_t rejectChi2, bool refit, int32_t retVal, float avgInvCharge, float posY, float posZ, int16_t clusterState, int32_t retValReject, float err2Y, float err2Z) const
void DumpMergeRanges(std::ostream &out, int32_t withinSector, int32_t mergeMode) const
void MergedTrackStreamer(const GPUTPCGMBorderTrack &b1, const GPUTPCGMBorderTrack &b2, const char *name, int32_t sector1, int32_t sector2, int32_t mergeMode, float weight, float frac) const
int32_t GPUTPCGMBorderTrack *& b1
void DumpSectorTracks(std::ostream &out) const
void SetPtrsFromGPUConstantMem(const GPUConstantMem *v, GPUParam *p=nullptr)
GLdouble n
Definition glcorearb.h:1982
GLsizeiptr size
Definition glcorearb.h:659
GLuint const GLchar * name
Definition glcorearb.h:781
GLuint GLuint GLfloat weight
Definition glcorearb.h:5477
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
GPUReconstruction * rec
GPUTPCTracker tpcTrackers[GPUCA_NSECTORS]