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