29#include "GPUParam.inc"
39#include <oneapi/tbb.h>
43#define GET_CID(sector, i) (mParam->par.earlyTpcTransform ? mIOPtrs->clusterData[sector][i].id : (mIOPtrs->clustersNative->clusterOffset[sector][0] + i))
53 vBuf.first->emplace_back(
first);
54 vBuf.second->emplace_back(last -
first);
56inline void GPUDisplay::insertVertexList(int32_t iSector,
size_t first,
size_t last)
58 std::pair<vecpod<int32_t>*,
vecpod<uint32_t>*> vBuf(mVertexBufferStart + iSector, mVertexBufferCount + iSector);
59 insertVertexList(vBuf,
first, last);
62inline void GPUDisplay::drawPointLinestrip(int32_t iSector, int32_t cid, int32_t
id, int32_t id_limit)
64 mVertexBuffer[iSector].emplace_back(mGlobalPos[cid].
x, mGlobalPos[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPos[cid].
z);
66 while ((curVal = mGlobalPos[cid].
w) < id_limit) {
67 if (GPUCommonMath::AtomicCAS(&mGlobalPos[cid].
w, curVal, (
float)
id)) {
70 curVal = mGlobalPos[cid].
w;
74GPUDisplay::vboList GPUDisplay::DrawSpacePointsTRD(int32_t iSector, int32_t
select, int32_t iCol)
76 size_t startCount = mVertexBufferStart[iSector].size();
77 size_t startCountInner = mVertexBuffer[iSector].size();
81 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->
trdTracklets[
i].GetDetector());
82 bool draw = iSector == iSec && mGlobalPosTRD[
i].
w ==
select;
84 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD[
i].
x, mGlobalPosTRD[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD[
i].
z);
85 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD2[
i].
x, mGlobalPosTRD2[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD2[
i].
z);
90 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
91 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
94GPUDisplay::vboList GPUDisplay::DrawSpacePointsTOF(int32_t iSector, int32_t
select, int32_t iCol)
96 size_t startCount = mVertexBufferStart[iSector].size();
97 size_t startCountInner = mVertexBuffer[iSector].size();
99 if (iCol == 0 && iSector == 0) {
101 mVertexBuffer[iSector].emplace_back(mGlobalPosTOF[
i].
x, mGlobalPosTOF[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTOF[
i].
z);
105 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
106 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
109GPUDisplay::vboList GPUDisplay::DrawSpacePointsITS(int32_t iSector, int32_t
select, int32_t iCol)
111 size_t startCount = mVertexBufferStart[iSector].size();
112 size_t startCountInner = mVertexBuffer[iSector].size();
114 if (iCol == 0 && iSector == 0 && mIOPtrs->
itsClusters) {
116 mVertexBuffer[iSector].emplace_back(mGlobalPosITS[
i].
x, mGlobalPosITS[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosITS[
i].
z);
120 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
121 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
124GPUDisplay::vboList GPUDisplay::DrawClusters(int32_t iSector, int32_t
select, uint32_t iCol)
126 size_t startCount = mVertexBufferStart[iSector].size();
127 size_t startCountInner = mVertexBuffer[iSector].size();
128 if (mOverlayTFClusters.size() > 0 || iCol == 0 || mNCollissions) {
129 const int32_t firstCluster = (mOverlayTFClusters.size() > 1 && iCol > 0) ? mOverlayTFClusters[iCol - 1][iSector] : 0;
130 const int32_t lastCluster = (mOverlayTFClusters.size() > 1 && iCol + 1 < mOverlayTFClusters.size()) ? mOverlayTFClusters[iCol][iSector] : (mParam->par.earlyTpcTransform ? mIOPtrs->nClusterData[iSector] : mIOPtrs->clustersNative ? mIOPtrs->clustersNative->nClustersSector[iSector] : 0);
132 for (int32_t cidInSector = firstCluster; cidInSector < lastCluster; cidInSector++) {
133 const int32_t cid =
GET_CID(iSector, cidInSector);
134#ifdef GPUCA_TPC_GEOMETRY_O2
135 if (checkClusterCollision) {
137 if (labels.size() ? (iCol != mQA->GetMCLabelCol(labels[0])) : (iCol != 0)) {
142 (
void)checkClusterCollision;
144 if (mCfgH.hideUnmatchedClusters && mQA && mQA->
SuppressHit(cid)) {
147 bool draw = mGlobalPos[cid].
w ==
select;
149 if (mCfgH.markAdjacentClusters) {
152 if (mCfgH.markAdjacentClusters >= 32) {
153 if (mQA && mQA->
clusterRemovable(attach, mCfgH.markAdjacentClusters == 33)) {
164 }
else if (mCfgH.markAdjacentClusters & 8) {
170 }
else if (mCfgH.markClusters) {
172 if (mParam->
par.earlyTpcTransform) {
177 const bool match =
flags & mCfgH.markClusters;
179 }
else if (mCfgH.markFakeClusters) {
181 draw = (
select == tMARKED) ? (fake) : (draw && !fake);
184 mVertexBuffer[iSector].emplace_back(mGlobalPos[cid].
x, mGlobalPos[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPos[cid].
z);
188 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
189 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
192GPUDisplay::vboList GPUDisplay::DrawLinks(
const GPUTPCTracker& tracker, int32_t
id,
bool dodown)
194 int32_t iSector = tracker.ISector();
195 if (mCfgH.clustersOnly) {
196 return (vboList(0, 0, iSector));
198 size_t startCount = mVertexBufferStart[iSector].size();
199 size_t startCountInner = mVertexBuffer[iSector].size();
204 const GPUTPCRow& rowUp = tracker.Data().Row(
i + 2);
205 for (int32_t
j = 0;
j <
row.NHits();
j++) {
207 const int32_t cid1 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row,
j));
208 const int32_t cid2 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(rowUp, tracker.Data().HitLinkUpData(
row,
j)));
209 drawPointLinestrip(iSector, cid1,
id);
210 drawPointLinestrip(iSector, cid2,
id);
215 if (dodown &&
i >= 2) {
216 const GPUTPCRow& rowDown = tracker.Data().Row(
i - 2);
217 for (int32_t
j = 0;
j <
row.NHits();
j++) {
219 const int32_t cid1 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row,
j));
220 const int32_t cid2 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(rowDown, tracker.Data().HitLinkDownData(
row,
j)));
221 drawPointLinestrip(iSector, cid1,
id);
222 drawPointLinestrip(iSector, cid2,
id);
227 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
228 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
231GPUDisplay::vboList GPUDisplay::DrawSeeds(
const GPUTPCTracker& tracker)
233 int32_t iSector = tracker.ISector();
234 if (mCfgH.clustersOnly) {
235 return (vboList(0, 0, iSector));
237 size_t startCount = mVertexBufferStart[iSector].size();
238 for (uint32_t
i = 0;
i < *tracker.NStartHits();
i++) {
240 size_t startCountInner = mVertexBuffer[iSector].size();
241 int32_t
ir = hit.RowIndex();
242 calink ih = hit.HitIndex();
245 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, ih));
246 drawPointLinestrip(iSector, cid, tSEED);
248 ih = tracker.Data().HitLinkUpData(
row, ih);
250 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
252 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
255GPUDisplay::vboList GPUDisplay::DrawTracklets(
const GPUTPCTracker& tracker)
257 int32_t iSector = tracker.ISector();
258 if (mCfgH.clustersOnly) {
259 return (vboList(0, 0, iSector));
261 size_t startCount = mVertexBufferStart[iSector].size();
262 for (uint32_t
i = 0;
i < *tracker.NTracklets();
i++) {
264 size_t startCountInner = mVertexBuffer[iSector].size();
266 for (int32_t
j = tracklet.FirstRow();
j <= tracklet.LastRow();
j++) {
267 const calink rowHit = tracker.TrackletRowHits()[tracklet.FirstHit() + (
j - tracklet.FirstRow())];
270 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, rowHit));
271 oldpos = mGlobalPos[cid];
272 drawPointLinestrip(iSector, cid, tTRACKLET);
275 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
277 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
280GPUDisplay::vboList GPUDisplay::DrawTracks(
const GPUTPCTracker& tracker, int32_t global)
282 int32_t iSector = tracker.ISector();
283 if (mCfgH.clustersOnly) {
284 return (vboList(0, 0, iSector));
286 size_t startCount = mVertexBufferStart[iSector].size();
287 for (uint32_t
i = (global ? tracker.CommonMemory()->nLocalTracks : 0);
i < (global ? *tracker.NTracks() : tracker.CommonMemory()->nLocalTracks);
i++) {
289 size_t startCountInner = mVertexBuffer[iSector].size();
290 for (int32_t
j = 0;
j < track.NHits();
j++) {
291 const GPUTPCHitId& hit = tracker.TrackHits()[track.FirstHitID() +
j];
292 const GPUTPCRow&
row = tracker.Data().Row(hit.RowIndex());
293 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, hit.HitIndex()));
294 drawPointLinestrip(iSector, cid, tSECTORTRACK + global);
296 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
298 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
301void GPUDisplay::DrawTrackITS(int32_t trackId, int32_t iSector)
303 const auto& trk = mIOPtrs->
itsTracks[trackId];
304 for (int32_t k = 0; k < trk.getNClusters(); k++) {
305 int32_t cid = mIOPtrs->
itsTrackClusIdx[trk.getFirstClusterEntry() + k];
306 mVertexBuffer[iSector].emplace_back(mGlobalPosITS[cid].
x, mGlobalPosITS[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosITS[cid].
z);
307 mGlobalPosITS[cid].
w = tITSATTACHED;
311GPUDisplay::vboList GPUDisplay::DrawFinalITS()
313 const int32_t iSector = 0;
314 size_t startCount = mVertexBufferStart[iSector].size();
316 if (mITSStandaloneTracks[
i]) {
317 size_t startCountInner = mVertexBuffer[iSector].size();
318 DrawTrackITS(
i, iSector);
319 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
322 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
326void GPUDisplay::DrawFinal(int32_t iSector, int32_t ,
const GPUTPCGMPropagator* prop, std::array<
vecpod<int32_t>, 2>& trackList, threadVertexBuffer& threadBuffer)
328 auto& vBuf = threadBuffer.vBuf;
329 auto&
buffer = threadBuffer.buffer;
330 uint32_t nTracks = std::max(trackList[0].
size(), trackList[1].
size());
331 if (mCfgH.clustersOnly) {
334 for (uint32_t ii = 0; ii < nTracks; ii++) {
336 const T* track =
nullptr;
337 int32_t lastCluster = -1;
339 if (ii >= trackList[0].
size()) {
342 i = trackList[0][ii];
344 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
347 }
else if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
354 throw std::runtime_error(
"invalid type");
357 size_t startCountInner = mVertexBuffer[iSector].size();
358 bool drawing =
false;
360 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
369 if (mCfgH.trackFilter && !mTrackFilter[
i]) {
374 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
378 mVertexBuffer[iSector].emplace_back(mGlobalPosTOF[cid].
x, mGlobalPosTOF[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTOF[cid].
z);
379 mGlobalPosTOF[cid].
w = tTOFATTACHED;
384 auto tmpDoTRDTracklets = [&](
const auto& trk) {
385 for (int32_t k = 5; k >= 0; k--) {
386 int32_t cid = trk.getTrackletIndex(k);
391 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD2[cid].
x, mGlobalPosTRD2[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD2[cid].
z);
392 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD[cid].
x, mGlobalPosTRD[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD[cid].
z);
393 mGlobalPosTRD[cid].
w = tTRDATTACHED;
397 if (mChain && ((int32_t)mConfig.showTPCTracksFromO2Format == (int32_t)mChain->
GetProcessingSettings().trdTrackModelO2) && mTRDTrackIds[
i] != -1 && mIOPtrs->
nTRDTracklets) {
399 tmpDoTRDTracklets(mIOPtrs->
trdTracksO2[mTRDTrackIds[
i]]);
401 tmpDoTRDTracklets(mIOPtrs->
trdTracks[mTRDTrackIds[
i]]);
404 }
else if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
408 const auto& trk = container[mIOPtrs->
tpcLinkTRD[
i] & 0x3FFFFFFF];
409 tmpDoTRDTracklets(trk);
415 int32_t separateExtrapolatedTracksLimit = (mCfgH.separateExtrapolatedTracks ? tEXTRAPOLATEDTRACK : TRACK_TYPE_ID_LIMIT);
416 uint32_t lastSide = -1;
417 for (int32_t k = 0; k <
nClusters; k++) {
418 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
424 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
429 int32_t
w = mGlobalPos[cid].
w;
431 if (mCfgH.splitCETracks && lastSide != (mGlobalPos[cid].z < 0)) {
432 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
436 drawPointLinestrip(iSector, cid, tFINALTRACK, separateExtrapolatedTracksLimit);
439 if (
w == separateExtrapolatedTracksLimit) {
441 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
446 startCountInner = mVertexBuffer[iSector].size();
447 if (lastCluster != -1 && (!mCfgH.splitCETracks || lastSide == (mGlobalPos[cid].z < 0))) {
449 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
454 drawPointLinestrip(iSector, lastcid, tFINALTRACK, separateExtrapolatedTracksLimit);
456 drawPointLinestrip(iSector, cid, tFINALTRACK, separateExtrapolatedTracksLimit);
461 lastSide = mGlobalPos[cid].
z < 0;
465 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
470 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
479 for (int32_t iMC = 0; iMC < 2; iMC++) {
481 if (ii >= trackList[1].
size()) {
484 i = trackList[1][ii];
486 if (track ==
nullptr) {
489 if (lastCluster == -1) {
494 size_t startCountInner = mVertexBuffer[iSector].size();
495 for (int32_t inFlyDirection = 0; inFlyDirection < 2; inFlyDirection++) {
504 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
505 trkParam.Set(track->GetParam());
506 alphaOrg = mParam->Alpha(iSector);
509 convertTrackParam(t, *track);
510 alphaOrg = track->getAlpha();
514 if (mParam->
par.earlyTpcTransform) {
515 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
517 ZOffset = track->GetParam().GetTZOffset();
521 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
522 auto cl = mIOPtrs->
mergedTrackHits[track->FirstClusterRef() + lastCluster];
524 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, cl.sector, cl.row, cln.getPad(), cln.getTime(),
x,
y,
z);
529 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, sector,
row, cln.getPad(), cln.getTime(),
x,
y,
z);
542 alphaOrg = mParam->Alpha(iSector);
543 float c = cosf(alphaOrg);
544 float s = sinf(alphaOrg);
548 mclocal[0] =
x *
c +
y *
s;
549 mclocal[1] = -
x *
s +
y *
c;
552 mclocal[2] = px *
c + py *
s;
553 mclocal[3] = -px *
s + py *
c;
557#ifdef GPUCA_TPC_GEOMETRY_O2
558 trkParam.Set(mclocal[0], mclocal[1], mc.
z, mclocal[2], mclocal[3], mc.
pZ, -
charge);
559 if (mParam->
par.continuousTracking) {
563 if (fabsf(mc.
z) > GPUTPCGeometry::TPCLength()) {
564 ZOffset = mc.
z > 0 ? (mc.
z - GPUTPCGeometry::TPCLength()) : (mc.
z +
GPUTPCGeometry::TPCLength());
566 trkParam.Set(mclocal[0], mclocal[1], mc.
z - ZOffset, mclocal[2], mclocal[3], mc.
pZ,
charge);
569 float z0 = trkParam.
Z();
570 if (iMC && inFlyDirection == 0) {
576 if (fabsf(trkParam.SinPhi()) > 1) {
579 float alpha = alphaOrg;
580 vecpod<vtx>& useBuffer = iMC && inFlyDirection == 0 ?
buffer : mVertexBuffer[iSector];
583 while (nPoints++ < 5000) {
584 if ((inFlyDirection == 0 &&
x < 0) || (inFlyDirection &&
x *
x + trkParam.
Y() * trkParam.
Y() > (iMC ? (450 * 450) : (300 * 300)))) {
587 if (fabsf(trkParam.
Z() + ZOffset) > mMaxClusterZ + (iMC ? 0 : 0)) {
590 if (fabsf(trkParam.
Z() - z0) > (iMC ? GPUTPCGeometry::TPCLength() :
GPUTPCGeometry::TPCLength())) {
593 if (inFlyDirection) {
594 if (fabsf(trkParam.SinPhi()) > 0.4f) {
595 float dalpha = asinf(trkParam.SinPhi());
596 trkParam.Rotate(dalpha);
599 x = trkParam.X() + 1.f;
600 if (!mCfgH.propagateLoopers) {
601 float diff = fabsf(
alpha - alphaOrg) / (2.f * CAMath::Pi());
603 if (diff > 0.25f && diff < 0.75f) {
609 prop->GetBxByBz(
alpha, trkParam.GetX(), trkParam.GetY(), trkParam.GetZ(),
B);
611 if (trkParam.PropagateToXBxByBz(
x,
B[0],
B[1],
B[2], dLp)) {
614 if (fabsf(trkParam.SinPhi()) > 0.9f) {
618 float drawX = trkParam.X() + mCfgH.xAdd;
619 useBuffer.emplace_back((ca * drawX - sa * trkParam.
Y()) * GL_SCALE_FACTOR, (ca * trkParam.
Y() + sa * drawX) * mYFactor * GL_SCALE_FACTOR, mCfgH.projectXY ? 0 : (trkParam.Z() + ZOffset) * GL_SCALE_FACTOR);
620 x += inFlyDirection ? 1 : -1;
623 if (inFlyDirection == 0) {
625 for (int32_t k = (int32_t)
buffer.size() - 1; k >= 0; k--) {
626 mVertexBuffer[iSector].emplace_back(
buffer[k]);
629 insertVertexList(vBuf[1], startCountInner, mVertexBuffer[iSector].
size());
630 startCountInner = mVertexBuffer[iSector].size();
634 insertVertexList(vBuf[iMC ? 3 : 2], startCountInner, mVertexBuffer[iSector].
size());
639GPUDisplay::vboList GPUDisplay::DrawGrid(
const GPUTPCTracker& tracker)
641 int32_t iSector = tracker.ISector();
642 size_t startCount = mVertexBufferStart[iSector].size();
643 size_t startCountInner = mVertexBuffer[iSector].size();
646 for (int32_t
j = 0;
j <= (signed)
row.Grid().Ny();
j++) {
647 float z1 =
row.Grid().ZMin();
648 float z2 =
row.Grid().ZMax();
649 float x =
row.X() + mCfgH.xAdd;
650 float y =
row.Grid().YMin() + (
float)
j /
row.Grid().StepYInv();
651 float zz1, zz2, yy1, yy2, xx1, xx2;
652 mParam->Sector2Global(tracker.ISector(),
x,
y,
z1, &xx1, &yy1, &zz1);
653 mParam->Sector2Global(tracker.ISector(),
x,
y,
z2, &xx2, &yy2, &zz2);
661 mVertexBuffer[iSector].emplace_back(xx1 * GL_SCALE_FACTOR, yy1 * GL_SCALE_FACTOR * mYFactor, zz1 * GL_SCALE_FACTOR);
662 mVertexBuffer[iSector].emplace_back(xx2 * GL_SCALE_FACTOR, yy2 * GL_SCALE_FACTOR * mYFactor, zz2 * GL_SCALE_FACTOR);
664 for (int32_t
j = 0;
j <= (signed)
row.Grid().Nz();
j++) {
665 float y1 =
row.Grid().YMin();
666 float y2 =
row.Grid().YMax();
667 float x =
row.X() + mCfgH.xAdd;
668 float z =
row.Grid().ZMin() + (
float)
j /
row.Grid().StepZInv();
669 float zz1, zz2, yy1, yy2, xx1, xx2;
670 mParam->Sector2Global(tracker.ISector(),
x,
y1,
z, &xx1, &yy1, &zz1);
671 mParam->Sector2Global(tracker.ISector(),
x,
y2,
z, &xx2, &yy2, &zz2);
679 mVertexBuffer[iSector].emplace_back(xx1 * GL_SCALE_FACTOR, yy1 * GL_SCALE_FACTOR * mYFactor, zz1 * GL_SCALE_FACTOR);
680 mVertexBuffer[iSector].emplace_back(xx2 * GL_SCALE_FACTOR, yy2 * GL_SCALE_FACTOR * mYFactor, zz2 * GL_SCALE_FACTOR);
683 insertVertexList(tracker.ISector(), startCountInner, mVertexBuffer[iSector].size());
684 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
687GPUDisplay::vboList GPUDisplay::DrawGridTRD(int32_t sector)
690 size_t startCount = mVertexBufferStart[sector].size();
691 size_t startCountInner = mVertexBuffer[sector].size();
692 auto* geo = trdGeometry();
694 int32_t trdsector = NSECTORS / 2 - 1 - sector;
695 float alpha = geo->GetAlpha() / 2.f + geo->GetAlpha() * trdsector;
696 if (trdsector >= 9) {
697 alpha -= 2 * CAMath::Pi();
701 int32_t iDet = geo->GetDetector(iLy, iStack, trdsector);
702 auto matrix = geo->GetClusterMatrix(iDet);
706 auto pp = geo->GetPadPlane(iDet);
707 for (int32_t
i = 0;
i < pp->GetNrows();
i++) {
712 xyzLoc1[0] = xyzLoc2[0] = geo->AnodePos();
713 xyzLoc1[1] = pp->GetCol0();
714 xyzLoc2[1] = pp->GetColEnd();
715 xyzLoc1[2] = xyzLoc2[2] = pp->GetRowPos(
i) - pp->GetRowPos(pp->GetNrows() / 2);
716 matrix->LocalToMaster(xyzLoc1, xyzGlb1);
717 matrix->LocalToMaster(xyzLoc2, xyzGlb2);
718 float x1Tmp = xyzGlb1[0];
719 xyzGlb1[0] = xyzGlb1[0] * cosf(
alpha) + xyzGlb1[1] * sinf(
alpha);
720 xyzGlb1[1] = -x1Tmp * sinf(
alpha) + xyzGlb1[1] * cosf(
alpha);
721 float x2Tmp = xyzGlb2[0];
722 xyzGlb2[0] = xyzGlb2[0] * cosf(
alpha) + xyzGlb2[1] * sinf(
alpha);
723 xyzGlb2[1] = -x2Tmp * sinf(
alpha) + xyzGlb2[1] * cosf(
alpha);
724 mVertexBuffer[sector].emplace_back(xyzGlb1[0] * GL_SCALE_FACTOR, xyzGlb1[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb1[2] * GL_SCALE_FACTOR);
725 mVertexBuffer[sector].emplace_back(xyzGlb2[0] * GL_SCALE_FACTOR, xyzGlb2[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb2[2] * GL_SCALE_FACTOR);
727 for (int32_t
j = 0;
j < pp->GetNcols(); ++
j) {
732 xyzLoc1[0] = xyzLoc2[0] = geo->AnodePos();
733 xyzLoc1[1] = xyzLoc2[1] = pp->GetColPos(
j) + pp->GetColSize(
j) / 2.f;
734 xyzLoc1[2] = pp->GetRow0() - pp->GetRowPos(pp->GetNrows() / 2);
735 xyzLoc2[2] = pp->GetRowEnd() - pp->GetRowPos(pp->GetNrows() / 2);
736 matrix->LocalToMaster(xyzLoc1, xyzGlb1);
737 matrix->LocalToMaster(xyzLoc2, xyzGlb2);
738 float x1Tmp = xyzGlb1[0];
739 xyzGlb1[0] = xyzGlb1[0] * cosf(
alpha) + xyzGlb1[1] * sinf(
alpha);
740 xyzGlb1[1] = -x1Tmp * sinf(
alpha) + xyzGlb1[1] * cosf(
alpha);
741 float x2Tmp = xyzGlb2[0];
742 xyzGlb2[0] = xyzGlb2[0] * cosf(
alpha) + xyzGlb2[1] * sinf(
alpha);
743 xyzGlb2[1] = -x2Tmp * sinf(
alpha) + xyzGlb2[1] * cosf(
alpha);
744 mVertexBuffer[sector].emplace_back(xyzGlb1[0] * GL_SCALE_FACTOR, xyzGlb1[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb1[2] * GL_SCALE_FACTOR);
745 mVertexBuffer[sector].emplace_back(xyzGlb2[0] * GL_SCALE_FACTOR, xyzGlb2[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb2[2] * GL_SCALE_FACTOR);
750 insertVertexList(sector, startCountInner, mVertexBuffer[sector].
size());
751 return (vboList(startCount, mVertexBufferStart[sector].
size() - startCount, sector));
754size_t GPUDisplay::DrawGLScene_updateVertexList()
756 for (int32_t
i = 0;
i < NSECTORS;
i++) {
757 mVertexBuffer[
i].clear();
758 mVertexBufferStart[
i].clear();
759 mVertexBufferCount[
i].clear();
762 for (int32_t
i = 0;
i < mCurrentClusters;
i++) {
763 mGlobalPos[
i].
w = tCLUSTER;
765 for (int32_t
i = 0;
i < mCurrentSpacePointsTRD;
i++) {
766 mGlobalPosTRD[
i].
w = tTRDCLUSTER;
769 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
770 for (int32_t
i = 0;
i < N_POINTS_TYPE;
i++) {
771 mGlDLPoints[iSector][
i].resize(mNCollissions);
773 for (int32_t
i = 0;
i < N_FINAL_TYPE;
i++) {
774 mGlDLFinal[iSector].resize(mNCollissions);
777 int32_t numThreads = getNumThreads();
778 tbb::task_arena(numThreads).execute([&] {
779 if (mChain && (mChain->
GetRecoSteps() & GPUDataTypes::RecoStep::TPCSectorTracking)) {
780 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
781 GPUTPCTracker& tracker = (GPUTPCTracker&)sectorTracker(iSector);
782 tracker.SetPointersDataLinks(tracker.LinkTmpMemory());
783 mGlDLLines[iSector][tINITLINK] = DrawLinks(tracker, tINITLINK, true);
784 tracker.SetPointersDataLinks(mChain->rec()->Res(tracker.MemoryResLinks()).Ptr());
785 }, tbb::simple_partitioner());
787 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
790 mGlDLLines[iSector][tLINK] = DrawLinks(tracker, tLINK);
791 mGlDLLines[iSector][tSEED] = DrawSeeds(tracker);
792 mGlDLLines[iSector][tTRACKLET] = DrawTracklets(tracker);
793 mGlDLLines[iSector][tSECTORTRACK] = DrawTracks(tracker, 0);
794 mGlDLGrid[iSector] = DrawGrid(tracker);
795 if (iSector < NSECTORS / 2) {
796 mGlDLGridTRD[iSector] = DrawGridTRD(iSector);
798 }, tbb::simple_partitioner());
800 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
802 mGlDLLines[iSector][tEXTRAPOLATEDTRACK] = DrawTracks(tracker, 1);
803 }, tbb::simple_partitioner());
805 tbb::parallel_for(0, numThreads, [&](int32_t iThread) {
806 mThreadTracks[iThread].resize(mNCollissions);
807 for (int32_t
i = 0;
i < mNCollissions;
i++) {
808 for (int32_t
j = 0;
j < NSECTORS;
j++) {
809 for (int32_t k = 0; k < 2; k++) {
810 mThreadTracks[iThread][
i][
j][k].clear();
814 }, tbb::simple_partitioner());
815 if (mConfig.showTPCTracksFromO2Format) {
816#ifdef GPUCA_TPC_GEOMETRY_O2
820 if (mIOPtrs->clustersNative) {
821 mIOPtrs->outputTracksTPCO2[i].getCluster(mIOPtrs->outputClusRefsTPCO2, 0, *mIOPtrs->clustersNative, sector, row);
826 col = mQA->GetMCLabelCol(mIOPtrs->outputTracksTPCO2MC[i]);
832 tbb::parallel_for<uint32_t>(0, mIOPtrs->nMergedTracks, [&](
auto i) {
833 const GPUTPCGMMergedTrack* track = &mIOPtrs->mergedTracks[i];
834 if (track->NClusters() == 0) {
837 if (mCfgH.hideRejectedTracks && !track->OK()) {
840 int32_t sector = mIOPtrs->mergedTrackHits[track->FirstClusterRef() + track->NClusters() - 1].sector;
843 const auto&
label = mQA->GetMCTrackLabel(
i);
844#ifdef GPUCA_TPC_GEOMETRY_O2
847 while (
label.isValid() &&
col < mOverlayTFClusters.size() && mOverlayTFClusters[
col][NSECTORS] <
label.track) {
855 for (uint32_t
col = 0;
col < mIOPtrs->nMCInfosTPCCol;
col++) {
856 tbb::parallel_for(mIOPtrs->mcInfosTPCCol[
col].first, mIOPtrs->mcInfosTPCCol[
col].first + mIOPtrs->mcInfosTPCCol[
col].num, [&](uint32_t
i) {
857 const GPUTPCMCInfo& mc = mIOPtrs->mcInfosTPC[i];
858 if (mc.charge == 0.f) {
865 float alpha = atan2f(mc.
y, mc.
x);
867 alpha += 2 * CAMath::Pi();
869 int32_t sector =
alpha / (2 * CAMath::Pi()) * 18;
878 prop.SetMaxSinPhi(.999);
879 prop.SetMaterialTPC();
880 prop.SetPolynomialField(&mParam->polynomialField);
882 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
884 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
885 mThreadBuffers[numThread].clear();
886 for (int32_t iSet = 0; iSet < numThreads; iSet++) {
887 if (mConfig.showTPCTracksFromO2Format) {
888 DrawFinal<o2::tpc::TrackTPC>(iSector, iCol, &prop, mThreadTracks[iSet][iCol][iSector], mThreadBuffers[numThread]);
890 DrawFinal<GPUTPCGMMergedTrack>(iSector, iCol, &prop, mThreadTracks[iSet][iCol][iSector], mThreadBuffers[numThread]);
893 vboList*
list = &mGlDLFinal[iSector][iCol][0];
894 for (int32_t
i = 0;
i < N_FINAL_TYPE;
i++) {
895 size_t startCount = mVertexBufferStart[iSector].size();
896 for (uint32_t
j = 0;
j < mThreadBuffers[numThread].start[
i].size();
j++) {
897 mVertexBufferStart[iSector].emplace_back(mThreadBuffers[numThread].
start[
i][
j]);
898 mVertexBufferCount[iSector].emplace_back(mThreadBuffers[numThread].
count[
i][
j]);
900 list[
i] = vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector);
903 }, tbb::simple_partitioner());
905 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
906 for (int32_t
i = 0;
i < N_POINTS_TYPE_TPC;
i++) {
907 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
908 mGlDLPoints[iSector][
i][iCol] = DrawClusters(iSector,
i, iCol);
911 }, tbb::simple_partitioner());
915 mGlDLFinalITS = DrawFinalITS();
917 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
918 for (int32_t
i = N_POINTS_TYPE_TPC;
i < N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD;
i++) {
919 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
920 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsTRD(iSector,
i, iCol);
925 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
926 for (int32_t
i = N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD;
i < N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD + N_POINTS_TYPE_TOF;
i++) {
927 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
928 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsTOF(iSector,
i, iCol);
934 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
935 for (int32_t
i = N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD + N_POINTS_TYPE_TOF;
i < N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD + N_POINTS_TYPE_TOF + N_POINTS_TYPE_ITS;
i++) {
936 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
937 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsITS(iSector,
i, iCol);
943 mUpdateVertexLists = 0;
944 size_t totalVertizes = 0;
945 for (int32_t
i = 0;
i < NSECTORS;
i++) {
946 totalVertizes += mVertexBuffer[
i].size();
948 if (totalVertizes > 0xFFFFFFFF) {
949 throw std::runtime_error(
"Display vertex count exceeds 32bit uint32_t counter");
951 size_t needMultiVBOSize = mBackend->needMultiVBO();
952 mUseMultiVBO = needMultiVBOSize && (totalVertizes *
sizeof(mVertexBuffer[0][0]) >= needMultiVBOSize);
954 size_t totalYet = mVertexBuffer[0].size();
955 mVertexBuffer[0].resize(totalVertizes);
957 for (uint32_t
j = 0;
j < mVertexBufferStart[
i].size();
j++) {
958 mVertexBufferStart[
i][
j] += totalYet;
960 memcpy(&mVertexBuffer[0][totalYet], &mVertexBuffer[
i][0], mVertexBuffer[
i].
size() *
sizeof(mVertexBuffer[
i][0]));
961 totalYet += mVertexBuffer[
i].size();
962 mVertexBuffer[
i].clear();
965 mBackend->loadDataToGPU(totalVertizes);
967 mVertexBuffer[
i].clear();
969 return totalVertizes;
A const (ready only) version of MCTruthContainer.
#define GET_CID(sector, i)
#define CALINK_DEAD_CHANNEL
Online TRD tracker based on extrapolated TPC tracks.
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
Definition of the ITS track.
GPUTPCTracker * GetTPCSectorTrackers()
GPUReconstruction::RecoStepField GetRecoSteps() const
const GPUSettingsProcessing & GetProcessingSettings() const
bool clusterRemovable(int32_t attach, bool prot) const
int32_t HitAttachStatus(int32_t iHit) const
bool SuppressHit(int32_t iHit) const
static int32_t getHostThreadIndex()
bool match(const std::vector< std::string > &queries, const char *pattern)
GLfloat GLfloat GLfloat alpha
GLuint GLfloat GLfloat GLfloat GLfloat y1
GLuint GLsizei const GLchar * label
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLubyte GLubyte GLubyte GLubyte w
GLdouble GLdouble GLdouble z
uint8_t itsSharedClusterMap uint8_t
std::vector< InputSpec > select(char const *matcher="")
float float float float float z2
float float float float z1
const float3 float float float y2
if(!okForPhiMin(phi0, phi1))
S< o2::trd::GeometryFlat >::type * trdGeometry
S< TPCFastTransform >::type * fastTransform
S< CorrectionMapsHelper >::type * fastTransformHelper
const GPUTPCGMMergedTrackHitXYZ * mergedTrackHitsXYZ
const o2::tpc::ClusterNativeAccess * clustersNative
const GPUTPCMCInfo * mcInfosTPC
const uint32_t * outputClusRefsTPCO2
const int32_t * itsTrackClusIdx
const o2::BaseCluster< float > * itsClusters
const uint32_t * mergedTrackHitAttachment
const GPUTRDTrackGPU * trdTracks
uint32_t nTRDTracksTPCTRD
const GPUTRDTrackletWord * trdTracklets
const GPUTRDTrack * trdTracksO2
const GPUTPCClusterData * clusterData[NSECTORS]
const o2::its::TrackITS * itsTracks
const o2::MCCompLabel * outputTracksTPCO2MC
uint32_t nOutputTracksTPCO2
const o2::tpc::TrackTPC * outputTracksTPCO2
const GPUTPCGMMergedTrackHit * mergedTrackHits
const GPUTRDTrack * trdTracksITSTPCTRD
uint32_t nTRDTracksITSTPCTRD
const GPUTPCGMMergedTrack * mergedTracks
int32_t continuousMaxTimeBin
const o2::dataformats::ConstMCTruthContainerView< o2::MCCompLabel > * clustersMCTruth
const ClusterNative * clustersLinear
o2::InteractionRecord ir(0, 0)
typename std::vector< T, vecpod_allocator< T > > vecpod