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 "GPUTPCSectorOutput.h"
29#include "GPUTPCGMMergedTrack.h"
30#include "GPUParam.h"
31#include "GPUParam.inc"
32#include "GPUTPCGMTrackParam.h"
33#include "GPUTPCGMSectorTrack.h"
34#include "GPUTPCGMBorderTrack.h"
35#include "GPUReconstruction.h"
36#include "GPUDebugStreamer.h"
38#include "GPUTrackingRefit.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->nOutputTracks : 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->nOutputTracks; i++) {
142 const auto& trk = mOutputTracks[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->nOutputTracks; i++) {
154 const auto& trk = mOutputTracks[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->nOutputTracks; i++) {
166 out << " " << i << ": " << mTrackOrderAttach[i] << "\n";
167 }
168 out << " Clusters\n";
169 for (uint32_t j = 0; j < mMemory->nOutputTracks; j++) {
170 const auto& trk = mOutputTracks[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->nOutputTracks; i++) {
199 const auto& trk = mOutputTracks[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() ? mOutputTracksdEdx[i].dEdxTotTPC : -1.f) << "/" << (trk.OK() ? mOutputTracksdEdx[i].dEdxMaxTPC : -1.f)
207 << " Outer " << po.P[0] << "/" << po.P[1] << "/" << po.P[2] << "/" << po.P[3] << "/" << po.P[4] << "\n";
208 }
209 out << std::setprecision(ss);
210}
211
212void GPUTPCGMMerger::DumpFinal(std::ostream& out) const
213{
214 out << "\nTPC Merger Finalized\n";
215 for (uint32_t j = 0; j < mMemory->nOutputTracks; j++) {
216 const auto& trk = mOutputTracks[j];
217 if (trk.NClusters() == 0) {
218 continue;
219 }
220 out << " Track " << j << ": ";
221 for (uint32_t i = trk.FirstClusterRef(); i < trk.FirstClusterRef() + trk.NClusters(); i++) {
222 if (mClusters[i].state != 0) {
223 out << j << "/" << (i - trk.FirstClusterRef()) << ": " << mClusters[i].num << "/" << (int32_t)mClusters[i].state << ", ";
224 }
225 }
226 out << "\n";
227 }
228 uint32_t maxId = mNMaxClusters;
229 uint32_t j = 0;
230 for (uint32_t i = 0; i < maxId; i++) {
231 if ((mClusterAttachment[i] & attachFlagMask) != 0) {
232 if (++j % 10 == 0) {
233 out << " Cluster attachment ";
234 }
235 out << i << ": " << (mClusterAttachment[i] & attachTrackMask) << " / " << (mClusterAttachment[i] & attachFlagMask) << " - ";
236 if (j % 10 == 0) {
237 out << "\n";
238 }
239 }
240 }
241 out << "\n";
242}
243
244template <int32_t mergeType>
245inline 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
246{
247#ifdef DEBUG_STREAMER
248 std::vector<int32_t> hits1(152), hits2(152);
249 for (int32_t i = 0; i < 152; i++) {
250 hits1[i] = hits2[i] = -1;
251 }
252 const GPUTPCTracker& tracker1 = GetConstantMem()->tpcTrackers[sector1];
253 const GPUTPCGMSectorTrack& sectorTrack1 = mSectorTrackInfos[b1.TrackID()];
254 const GPUTPCTrack& inTrack1 = *sectorTrack1.OrigTrack();
255 for (int32_t i = 0; i < inTrack1.NHits(); i++) {
256 const GPUTPCHitId& ic1 = tracker1.TrackHits()[inTrack1.FirstHitID() + i];
257 int32_t clusterIndex = tracker1.Data().ClusterDataIndex(tracker1.Data().Row(ic1.RowIndex()), ic1.HitIndex());
258 hits1[ic1.RowIndex()] = clusterIndex;
259 }
260 const GPUTPCTracker& tracker2 = GetConstantMem()->tpcTrackers[sector2];
261 const GPUTPCGMSectorTrack& sectorTrack2 = mSectorTrackInfos[b2.TrackID()];
262 const GPUTPCTrack& inTrack2 = *sectorTrack2.OrigTrack();
263 for (int32_t i = 0; i < inTrack2.NHits(); i++) {
264 const GPUTPCHitId& ic2 = tracker2.TrackHits()[inTrack2.FirstHitID() + i];
265 int32_t clusterIndex = tracker2.Data().ClusterDataIndex(tracker2.Data().Row(ic2.RowIndex()), ic2.HitIndex());
266 hits2[ic2.RowIndex()] = clusterIndex;
267 }
268
269 std::string debugname = std::string("debug_") + name;
270 std::string treename = std::string("tree_") + name;
271 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";
272#endif
273}
274
275void 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
276{
277#ifdef DEBUG_STREAMER
278 if (mergeMode == 0) {
279 MergedTrackStreamerInternal<0>(b1, b2, name, sector1, sector2, mergeMode, weight, frac);
280 } else if (mergeMode >= 1 && mergeMode <= 0) {
281 // MergedTrackStreamerInternal<1>(b1, b2, name, sector1, sector2, mergeMode, weight, frac); Not yet working
282 }
283#endif
284}
285
287{
288 for (int32_t i = 0; i < N; i++) {
289 if (tracks[i].TrackID() == trackId) {
290 return tracks[i];
291 }
292 }
293 throw std::runtime_error("didn't find border track");
294}
295
297{
298 GPUTPCGMMergedTrack trk = track;
299 GPUTrackingRefit refit;
300 ((GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHitStates = ClusterStateExt();
301 ((GPUConstantMem*)GetConstantMem())->ioPtrs.mergedTrackHits = Clusters();
302 refit.SetPtrsFromGPUConstantMem(GetConstantMem());
303 int32_t retval = refit.RefitTrackAsGPU(trk, false, true);
304 if (retval > 0) {
306 prop.SetMaterialTPC();
307 prop.SetPolynomialField(&Param().polynomialField);
308 prop.SetMaxSinPhi(GPUCA_MAX_SIN_PHI);
309 prop.SetPropagateBzOnly(false);
310 prop.SetMatLUT(Param().rec.useMatLUT ? GetConstantMem()->calibObjects.matLUT : nullptr);
311 prop.SetTrack(&trk.Param(), trk.GetAlpha());
312 int32_t err = prop.PropagateToXAlpha(track.GetParam().GetX(), track.GetAlpha(), false);
313 if (err == 0) {
314 printf("REFIT RESULT %d, SnpDiff %f\n", retval, trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi());
315 if (retval > 20 && fabsf(trk.GetParam().GetSinPhi() - track.GetParam().GetSinPhi()) > 0.01f) {
316 printf("LARGE DIFF\n");
317 }
318 } else {
319 printf("PROPAGATE ERROR\n");
320 }
321 } else {
322 printf("REFIT ERROR\n");
323 }
324}
325
326std::vector<uint32_t> GPUTPCGMMerger::StreamerOccupancyBin(int32_t iSector, int32_t iRow, float time) const
327{
328 static int32_t size = getenv("O2_DEBUG_STREAMER_OCCUPANCY_NBINS") ? atoi(getenv("O2_DEBUG_STREAMER_OCCUPANCY_NBINS")) : Param().rec.tpc.occupancyMapTimeBinsAverage;
329 std::vector<uint32_t> retVal(1 + 2 * size);
330#ifdef DEBUG_STREAMER
331 const int32_t bin = CAMath::Max(0.f, time / Param().rec.tpc.occupancyMapTimeBins);
332 for (int32_t i = 0; i < 1 + 2 * size; i++) {
333 const int32_t mybin = bin + i - size;
334 retVal[i] = (mybin >= 0 && mybin < (int32_t)GPUTPCClusterOccupancyMapBin::getNBins(Param())) ? Param().occupancyMap[mybin] : 0;
335 }
336#endif
337 return retVal;
338}
339
340std::vector<float> GPUTPCGMMerger::StreamerUncorrectedZY(int32_t iSector, int32_t iRow, const GPUTPCGMTrackParam& track, const GPUTPCGMPropagator& prop) const
341{
342 std::vector<float> retVal(2);
343#ifdef DEBUG_STREAMER
344 GetConstantMem()->calibObjects.fastTransformHelper->InverseTransformYZtoNominalYZ(iSector, iRow, track.GetY(), track.GetZ(), retVal[0], retVal[1]);
345#endif
346 return retVal;
347}
348
349void 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
350{
351#ifdef DEBUG_STREAMER
352 float time = clusterNative.getTime();
353 auto occupancyBins = StreamerOccupancyBin(cluster.sector, cluster.row, time);
354 auto uncorrectedYZ = StreamerUncorrectedZY(cluster.sector, cluster.row, track, prop);
355 float invCharge = 1.f / clusterNative.qMax;
356 int32_t iRow = cluster.row;
357 float unscaledMult = (time >= 0.f ? Param().GetUnscaledMult(time) / Param().tpcGeometry.Row2X(iRow) : 0.f);
358 const float clAlpha = Param().Alpha(cluster.sector);
359 uint32_t occupancyTotal = Param().occupancyTotal;
360 o2::utils::DebugStreamer::instance()->getStreamer("debug_update_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("tree_update_track").data()
361 << "iTrk=" << iTrk
362 << "ihit=" << ihit
363 << "xx=" << xx
364 << "yy=" << yy
365 << "zz=" << zz
366 << "cluster=" << cluster
367 << "clusterNative=" << clusterNative
368 << "track=" << track
369 << "rejectChi2=" << rejectChi2
370 << "interpolationhit=" << interpolation
371 << "refit=" << refit
372 << "retVal=" << retVal
373 << "occupancyBins=" << occupancyBins
374 << "occupancyTotal=" << occupancyTotal
375 << "trackUncorrectedYZ=" << uncorrectedYZ
376 << "avgInvCharge=" << avgInvCharge
377 << "invCharge=" << invCharge
378 << "unscaledMultiplicity=" << unscaledMult
379 << "alpha=" << clAlpha
380 << "iRow=" << iRow
381 << "posY=" << posY
382 << "posZ=" << posZ
383 << "clusterState=" << clusterState
384 << "retValReject=" << retValReject
385 << "err2Y=" << err2Y
386 << "err2Z=" << err2Z
387 << "\n";
388#endif
389}
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
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]