29#include "GPUParam.inc"
40#include <oneapi/tbb.h>
44#define GET_CID(sector, i) (mParam->par.earlyTpcTransform ? mIOPtrs->clusterData[sector][i].id : (mIOPtrs->clustersNative->clusterOffset[sector][0] + i))
54 vBuf.first->emplace_back(
first);
55 vBuf.second->emplace_back(last -
first);
57inline void GPUDisplay::insertVertexList(int32_t iSector,
size_t first,
size_t last)
59 std::pair<vecpod<int32_t>*,
vecpod<uint32_t>*> vBuf(mVertexBufferStart + iSector, mVertexBufferCount + iSector);
60 insertVertexList(vBuf,
first, last);
63inline void GPUDisplay::drawPointLinestrip(int32_t iSector, int32_t cid, int32_t
id, int32_t id_limit)
65 mVertexBuffer[iSector].emplace_back(mGlobalPos[cid].
x, mGlobalPos[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPos[cid].
z);
67 while ((curVal = mGlobalPos[cid].
w) < id_limit) {
68 if (CAMath::AtomicCAS(&mGlobalPos[cid].
w, curVal, (
float)
id)) {
71 curVal = mGlobalPos[cid].
w;
75GPUDisplay::vboList GPUDisplay::DrawSpacePointsTRD(int32_t iSector, int32_t
select, int32_t iCol)
77 size_t startCount = mVertexBufferStart[iSector].size();
78 size_t startCountInner = mVertexBuffer[iSector].size();
82 int32_t iSec = trdGeometry()->GetSector(mIOPtrs->
trdTracklets[
i].GetDetector());
83 bool draw = iSector == iSec && mGlobalPosTRD[
i].
w ==
select;
85 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD[
i].
x, mGlobalPosTRD[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD[
i].
z);
86 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD2[
i].
x, mGlobalPosTRD2[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD2[
i].
z);
91 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
92 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
95GPUDisplay::vboList GPUDisplay::DrawSpacePointsTOF(int32_t iSector, int32_t
select, int32_t iCol)
97 size_t startCount = mVertexBufferStart[iSector].size();
98 size_t startCountInner = mVertexBuffer[iSector].size();
100 if (iCol == 0 && iSector == 0) {
102 mVertexBuffer[iSector].emplace_back(mGlobalPosTOF[
i].
x, mGlobalPosTOF[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTOF[
i].
z);
106 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
107 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
110GPUDisplay::vboList GPUDisplay::DrawSpacePointsITS(int32_t iSector, int32_t
select, int32_t iCol)
112 size_t startCount = mVertexBufferStart[iSector].size();
113 size_t startCountInner = mVertexBuffer[iSector].size();
115 if (iCol == 0 && iSector == 0 && mIOPtrs->
itsClusters) {
117 mVertexBuffer[iSector].emplace_back(mGlobalPosITS[
i].
x, mGlobalPosITS[
i].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosITS[
i].
z);
121 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
122 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
125GPUDisplay::vboList GPUDisplay::DrawClusters(int32_t iSector, int32_t
select, uint32_t iCol)
127 size_t startCount = mVertexBufferStart[iSector].size();
128 size_t startCountInner = mVertexBuffer[iSector].size();
129 if (mOverlayTFClusters.size() > 0 || iCol == 0 || mNCollissions) {
130 const int32_t firstCluster = (mOverlayTFClusters.size() > 1 && iCol > 0) ? mOverlayTFClusters[iCol - 1][iSector] : 0;
131 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);
133 for (int32_t cidInSector = firstCluster; cidInSector < lastCluster; cidInSector++) {
134 const int32_t cid =
GET_CID(iSector, cidInSector);
135#ifdef GPUCA_TPC_GEOMETRY_O2
136 if (checkClusterCollision) {
138 if (labels.size() ? (iCol != mQA->GetMCLabelCol(labels[0])) : (iCol != 0)) {
143 (
void)checkClusterCollision;
145 if (mCfgH.hideUnmatchedClusters && mQA && mQA->
SuppressHit(cid)) {
148 bool draw = mGlobalPos[cid].
w ==
select;
150 if (mCfgH.markAdjacentClusters) {
153 if (mCfgH.markAdjacentClusters >= 32) {
154 if (mQA && mQA->
clusterRemovable(attach, mCfgH.markAdjacentClusters == 33)) {
165 }
else if (mCfgH.markAdjacentClusters & 8) {
171 }
else if (mCfgH.markClusters) {
173 if (mParam->
par.earlyTpcTransform) {
178 const bool match =
flags & mCfgH.markClusters;
180 }
else if (mCfgH.markFakeClusters) {
182 draw = (
select == tMARKED) ? (fake) : (draw && !fake);
185 mVertexBuffer[iSector].emplace_back(mGlobalPos[cid].
x, mGlobalPos[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPos[cid].
z);
189 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
190 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
193GPUDisplay::vboList GPUDisplay::DrawLinks(
const GPUTPCTracker& tracker, int32_t
id,
bool dodown)
195 int32_t iSector = tracker.ISector();
196 if (mCfgH.clustersOnly) {
197 return (vboList(0, 0, iSector));
199 size_t startCount = mVertexBufferStart[iSector].size();
200 size_t startCountInner = mVertexBuffer[iSector].size();
205 const GPUTPCRow& rowUp = tracker.Data().Row(
i + 2);
206 for (int32_t
j = 0;
j <
row.NHits();
j++) {
208 const int32_t cid1 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row,
j));
209 const int32_t cid2 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(rowUp, tracker.Data().HitLinkUpData(
row,
j)));
210 drawPointLinestrip(iSector, cid1,
id);
211 drawPointLinestrip(iSector, cid2,
id);
216 if (dodown &&
i >= 2) {
217 const GPUTPCRow& rowDown = tracker.Data().Row(
i - 2);
218 for (int32_t
j = 0;
j <
row.NHits();
j++) {
220 const int32_t cid1 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row,
j));
221 const int32_t cid2 =
GET_CID(iSector, tracker.Data().ClusterDataIndex(rowDown, tracker.Data().HitLinkDownData(
row,
j)));
222 drawPointLinestrip(iSector, cid1,
id);
223 drawPointLinestrip(iSector, cid2,
id);
228 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
229 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
232GPUDisplay::vboList GPUDisplay::DrawSeeds(
const GPUTPCTracker& tracker)
234 int32_t iSector = tracker.ISector();
235 if (mCfgH.clustersOnly) {
236 return (vboList(0, 0, iSector));
238 size_t startCount = mVertexBufferStart[iSector].size();
239 for (uint32_t
i = 0;
i < *tracker.NStartHits();
i++) {
241 size_t startCountInner = mVertexBuffer[iSector].size();
242 int32_t
ir = hit.RowIndex();
243 calink ih = hit.HitIndex();
246 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, ih));
247 drawPointLinestrip(iSector, cid, tSEED);
249 ih = tracker.Data().HitLinkUpData(
row, ih);
251 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
253 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
256GPUDisplay::vboList GPUDisplay::DrawTracklets(
const GPUTPCTracker& tracker)
258 int32_t iSector = tracker.ISector();
259 if (mCfgH.clustersOnly) {
260 return (vboList(0, 0, iSector));
262 size_t startCount = mVertexBufferStart[iSector].size();
263 for (uint32_t
i = 0;
i < *tracker.NTracklets();
i++) {
265 size_t startCountInner = mVertexBuffer[iSector].size();
267 for (int32_t
j = tracklet.FirstRow();
j <= tracklet.LastRow();
j++) {
268 const calink rowHit = tracker.TrackletRowHits()[tracklet.FirstHit() + (
j - tracklet.FirstRow())];
271 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, rowHit));
272 oldpos = mGlobalPos[cid];
273 drawPointLinestrip(iSector, cid, tTRACKLET);
276 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
278 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
281GPUDisplay::vboList GPUDisplay::DrawTracks(
const GPUTPCTracker& tracker, int32_t global)
283 int32_t iSector = tracker.ISector();
284 if (mCfgH.clustersOnly) {
285 return (vboList(0, 0, iSector));
287 size_t startCount = mVertexBufferStart[iSector].size();
288 for (uint32_t
i = (global ? tracker.CommonMemory()->nLocalTracks : 0);
i < (global ? *tracker.NTracks() : tracker.CommonMemory()->nLocalTracks);
i++) {
290 size_t startCountInner = mVertexBuffer[iSector].size();
291 for (int32_t
j = 0;
j < track.NHits();
j++) {
292 const GPUTPCHitId& hit = tracker.TrackHits()[track.FirstHitID() +
j];
293 const GPUTPCRow&
row = tracker.Data().Row(hit.RowIndex());
294 const int32_t cid =
GET_CID(iSector, tracker.Data().ClusterDataIndex(
row, hit.HitIndex()));
295 drawPointLinestrip(iSector, cid, tSECTORTRACK + global);
297 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
299 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
302void GPUDisplay::DrawTrackITS(int32_t trackId, int32_t iSector)
304 const auto& trk = mIOPtrs->
itsTracks[trackId];
305 for (int32_t k = 0; k < trk.getNClusters(); k++) {
306 int32_t cid = mIOPtrs->
itsTrackClusIdx[trk.getFirstClusterEntry() + k];
307 mVertexBuffer[iSector].emplace_back(mGlobalPosITS[cid].
x, mGlobalPosITS[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosITS[cid].
z);
308 mGlobalPosITS[cid].
w = tITSATTACHED;
312GPUDisplay::vboList GPUDisplay::DrawFinalITS()
314 const int32_t iSector = 0;
315 size_t startCount = mVertexBufferStart[iSector].size();
317 if (mITSStandaloneTracks[
i]) {
318 size_t startCountInner = mVertexBuffer[iSector].size();
319 DrawTrackITS(
i, iSector);
320 insertVertexList(iSector, startCountInner, mVertexBuffer[iSector].
size());
323 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
327void GPUDisplay::DrawFinal(int32_t iSector, int32_t ,
const GPUTPCGMPropagator* prop, std::array<
vecpod<int32_t>, 2>& trackList, threadVertexBuffer& threadBuffer)
329 auto& vBuf = threadBuffer.vBuf;
330 auto&
buffer = threadBuffer.buffer;
331 uint32_t nTracks = std::max(trackList[0].
size(), trackList[1].
size());
332 if (mCfgH.clustersOnly) {
335 for (uint32_t ii = 0; ii < nTracks; ii++) {
337 const T* track =
nullptr;
338 int32_t lastCluster = -1;
340 if (ii >= trackList[0].
size()) {
343 i = trackList[0][ii];
345 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
348 }
else if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
355 throw std::runtime_error(
"invalid type");
358 size_t startCountInner = mVertexBuffer[iSector].size();
359 bool drawing =
false;
361 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
370 if (mCfgH.trackFilter && !mTrackFilter[
i]) {
375 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
379 mVertexBuffer[iSector].emplace_back(mGlobalPosTOF[cid].
x, mGlobalPosTOF[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTOF[cid].
z);
380 mGlobalPosTOF[cid].
w = tTOFATTACHED;
385 auto tmpDoTRDTracklets = [&](
const auto& trk) {
386 for (int32_t k = 5; k >= 0; k--) {
387 int32_t cid = trk.getTrackletIndex(k);
392 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD2[cid].
x, mGlobalPosTRD2[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD2[cid].
z);
393 mVertexBuffer[iSector].emplace_back(mGlobalPosTRD[cid].
x, mGlobalPosTRD[cid].
y * mYFactor, mCfgH.projectXY ? 0 : mGlobalPosTRD[cid].
z);
394 mGlobalPosTRD[cid].
w = tTRDATTACHED;
398 if (mChain && ((int32_t)mConfig.showTPCTracksFromO2Format == (int32_t)mChain->
GetProcessingSettings().trdTrackModelO2) && mTRDTrackIds[
i] != -1 && mIOPtrs->
nTRDTracklets) {
400 tmpDoTRDTracklets(mIOPtrs->
trdTracksO2[mTRDTrackIds[
i]]);
402 tmpDoTRDTracklets(mIOPtrs->
trdTracks[mTRDTrackIds[
i]]);
405 }
else if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
409 const auto& trk = container[mIOPtrs->
tpcLinkTRD[
i] & 0x3FFFFFFF];
410 tmpDoTRDTracklets(trk);
416 int32_t separateExtrapolatedTracksLimit = (mCfgH.separateExtrapolatedTracks ? tEXTRAPOLATEDTRACK : TRACK_TYPE_ID_LIMIT);
417 uint32_t lastSide = -1;
418 for (int32_t k = 0; k <
nClusters; k++) {
419 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
425 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
430 int32_t
w = mGlobalPos[cid].
w;
432 if (mCfgH.splitCETracks && lastSide != (mGlobalPos[cid].z < 0)) {
433 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
437 drawPointLinestrip(iSector, cid, tFINALTRACK, separateExtrapolatedTracksLimit);
440 if (
w == separateExtrapolatedTracksLimit) {
442 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
447 startCountInner = mVertexBuffer[iSector].size();
448 if (lastCluster != -1 && (!mCfgH.splitCETracks || lastSide == (mGlobalPos[cid].z < 0))) {
450 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
455 drawPointLinestrip(iSector, lastcid, tFINALTRACK, separateExtrapolatedTracksLimit);
457 drawPointLinestrip(iSector, cid, tFINALTRACK, separateExtrapolatedTracksLimit);
462 lastSide = mGlobalPos[cid].
z < 0;
466 if constexpr (std::is_same_v<T, o2::tpc::TrackTPC>) {
471 insertVertexList(vBuf[0], startCountInner, mVertexBuffer[iSector].
size());
480 for (int32_t iMC = 0; iMC < 2; iMC++) {
482 if (ii >= trackList[1].
size()) {
485 i = trackList[1][ii];
487 if (track ==
nullptr) {
490 if (lastCluster == -1) {
495 size_t startCountInner = mVertexBuffer[iSector].size();
496 for (int32_t inFlyDirection = 0; inFlyDirection < 2; inFlyDirection++) {
505 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
506 trkParam.Set(track->GetParam());
507 alphaOrg = mParam->Alpha(iSector);
510 convertTrackParam(t, *track);
511 alphaOrg = track->getAlpha();
515 if (mParam->
par.earlyTpcTransform) {
516 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
518 ZOffset = track->GetParam().GetTZOffset();
522 if constexpr (std::is_same_v<T, GPUTPCGMMergedTrack>) {
523 auto cl = mIOPtrs->
mergedTrackHits[track->FirstClusterRef() + lastCluster];
525 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, cl.sector, cl.row, cln.getPad(), cln.getTime(),
x,
y,
z);
530 GPUTPCConvertImpl::convert(*mCalib->
fastTransform, *mParam, sector,
row, cln.getPad(), cln.getTime(),
x,
y,
z);
543 alphaOrg = mParam->Alpha(iSector);
544 float c = cosf(alphaOrg);
545 float s = sinf(alphaOrg);
549 mclocal[0] =
x *
c +
y *
s;
550 mclocal[1] = -
x *
s +
y *
c;
553 mclocal[2] = px *
c + py *
s;
554 mclocal[3] = -px *
s + py *
c;
558#ifdef GPUCA_TPC_GEOMETRY_O2
559 trkParam.Set(mclocal[0], mclocal[1], mc.
z, mclocal[2], mclocal[3], mc.
pZ, -
charge);
560 if (mParam->
par.continuousTracking) {
564 if (fabsf(mc.
z) > GPUTPCGeometry::TPCLength()) {
565 ZOffset = mc.
z > 0 ? (mc.
z - GPUTPCGeometry::TPCLength()) : (mc.
z +
GPUTPCGeometry::TPCLength());
567 trkParam.Set(mclocal[0], mclocal[1], mc.
z - ZOffset, mclocal[2], mclocal[3], mc.
pZ,
charge);
570 float z0 = trkParam.
Z();
571 if (iMC && inFlyDirection == 0) {
577 if (fabsf(trkParam.SinPhi()) > 1) {
580 float alpha = alphaOrg;
581 vecpod<vtx>& useBuffer = iMC && inFlyDirection == 0 ?
buffer : mVertexBuffer[iSector];
584 while (nPoints++ < 5000) {
585 if ((inFlyDirection == 0 &&
x < 0) || (inFlyDirection &&
x *
x + trkParam.
Y() * trkParam.
Y() > (iMC ? (450 * 450) : (300 * 300)))) {
588 if (fabsf(trkParam.
Z() + ZOffset) > mMaxClusterZ + (iMC ? 0 : 0)) {
591 if (fabsf(trkParam.
Z() - z0) > (iMC ? GPUTPCGeometry::TPCLength() :
GPUTPCGeometry::TPCLength())) {
594 if (inFlyDirection) {
595 if (fabsf(trkParam.SinPhi()) > 0.4f) {
596 float dalpha = asinf(trkParam.SinPhi());
597 trkParam.Rotate(dalpha);
600 x = trkParam.X() + 1.f;
601 if (!mCfgH.propagateLoopers) {
602 float diff = fabsf(
alpha - alphaOrg) / (2.f * CAMath::Pi());
604 if (diff > 0.25f && diff < 0.75f) {
610 prop->GetBxByBz(
alpha, trkParam.GetX(), trkParam.GetY(), trkParam.GetZ(),
B);
612 if (trkParam.PropagateToXBxByBz(
x,
B[0],
B[1],
B[2], dLp)) {
615 if (fabsf(trkParam.SinPhi()) > 0.9f) {
619 float drawX = trkParam.X() + mCfgH.xAdd;
620 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);
621 x += inFlyDirection ? 1 : -1;
624 if (inFlyDirection == 0) {
626 for (int32_t k = (int32_t)
buffer.size() - 1; k >= 0; k--) {
627 mVertexBuffer[iSector].emplace_back(
buffer[k]);
630 insertVertexList(vBuf[1], startCountInner, mVertexBuffer[iSector].
size());
631 startCountInner = mVertexBuffer[iSector].size();
635 insertVertexList(vBuf[iMC ? 3 : 2], startCountInner, mVertexBuffer[iSector].
size());
640GPUDisplay::vboList GPUDisplay::DrawGrid(
const GPUTPCTracker& tracker)
642 int32_t iSector = tracker.ISector();
643 size_t startCount = mVertexBufferStart[iSector].size();
644 size_t startCountInner = mVertexBuffer[iSector].size();
647 for (int32_t
j = 0;
j <= (signed)
row.Grid().Ny();
j++) {
648 float z1 =
row.Grid().ZMin();
649 float z2 =
row.Grid().ZMax();
650 float x =
row.X() + mCfgH.xAdd;
651 float y =
row.Grid().YMin() + (
float)
j /
row.Grid().StepYInv();
652 float zz1, zz2, yy1, yy2, xx1, xx2;
653 mParam->Sector2Global(tracker.ISector(),
x,
y,
z1, &xx1, &yy1, &zz1);
654 mParam->Sector2Global(tracker.ISector(),
x,
y,
z2, &xx2, &yy2, &zz2);
662 mVertexBuffer[iSector].emplace_back(xx1 * GL_SCALE_FACTOR, yy1 * GL_SCALE_FACTOR * mYFactor, zz1 * GL_SCALE_FACTOR);
663 mVertexBuffer[iSector].emplace_back(xx2 * GL_SCALE_FACTOR, yy2 * GL_SCALE_FACTOR * mYFactor, zz2 * GL_SCALE_FACTOR);
665 for (int32_t
j = 0;
j <= (signed)
row.Grid().Nz();
j++) {
666 float y1 =
row.Grid().YMin();
667 float y2 =
row.Grid().YMax();
668 float x =
row.X() + mCfgH.xAdd;
669 float z =
row.Grid().ZMin() + (
float)
j /
row.Grid().StepZInv();
670 float zz1, zz2, yy1, yy2, xx1, xx2;
671 mParam->Sector2Global(tracker.ISector(),
x,
y1,
z, &xx1, &yy1, &zz1);
672 mParam->Sector2Global(tracker.ISector(),
x,
y2,
z, &xx2, &yy2, &zz2);
680 mVertexBuffer[iSector].emplace_back(xx1 * GL_SCALE_FACTOR, yy1 * GL_SCALE_FACTOR * mYFactor, zz1 * GL_SCALE_FACTOR);
681 mVertexBuffer[iSector].emplace_back(xx2 * GL_SCALE_FACTOR, yy2 * GL_SCALE_FACTOR * mYFactor, zz2 * GL_SCALE_FACTOR);
684 insertVertexList(tracker.ISector(), startCountInner, mVertexBuffer[iSector].size());
685 return (vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector));
688GPUDisplay::vboList GPUDisplay::DrawGridTRD(int32_t sector)
691 size_t startCount = mVertexBufferStart[sector].size();
692 size_t startCountInner = mVertexBuffer[sector].size();
693 auto* geo = trdGeometry();
695 int32_t trdsector = NSECTORS / 2 - 1 - sector;
696 float alpha = geo->GetAlpha() / 2.f + geo->GetAlpha() * trdsector;
697 if (trdsector >= 9) {
698 alpha -= 2 * CAMath::Pi();
702 int32_t iDet = geo->GetDetector(iLy, iStack, trdsector);
703 auto matrix = geo->GetClusterMatrix(iDet);
707 auto pp = geo->GetPadPlane(iDet);
708 for (int32_t
i = 0;
i < pp->GetNrows();
i++) {
713 xyzLoc1[0] = xyzLoc2[0] = geo->AnodePos();
714 xyzLoc1[1] = pp->GetCol0();
715 xyzLoc2[1] = pp->GetColEnd();
716 xyzLoc1[2] = xyzLoc2[2] = pp->GetRowPos(
i) - pp->GetRowPos(pp->GetNrows() / 2);
717 matrix->LocalToMaster(xyzLoc1, xyzGlb1);
718 matrix->LocalToMaster(xyzLoc2, xyzGlb2);
719 float x1Tmp = xyzGlb1[0];
720 xyzGlb1[0] = xyzGlb1[0] * cosf(
alpha) + xyzGlb1[1] * sinf(
alpha);
721 xyzGlb1[1] = -x1Tmp * sinf(
alpha) + xyzGlb1[1] * cosf(
alpha);
722 float x2Tmp = xyzGlb2[0];
723 xyzGlb2[0] = xyzGlb2[0] * cosf(
alpha) + xyzGlb2[1] * sinf(
alpha);
724 xyzGlb2[1] = -x2Tmp * sinf(
alpha) + xyzGlb2[1] * cosf(
alpha);
725 mVertexBuffer[sector].emplace_back(xyzGlb1[0] * GL_SCALE_FACTOR, xyzGlb1[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb1[2] * GL_SCALE_FACTOR);
726 mVertexBuffer[sector].emplace_back(xyzGlb2[0] * GL_SCALE_FACTOR, xyzGlb2[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb2[2] * GL_SCALE_FACTOR);
728 for (int32_t
j = 0;
j < pp->GetNcols(); ++
j) {
733 xyzLoc1[0] = xyzLoc2[0] = geo->AnodePos();
734 xyzLoc1[1] = xyzLoc2[1] = pp->GetColPos(
j) + pp->GetColSize(
j) / 2.f;
735 xyzLoc1[2] = pp->GetRow0() - pp->GetRowPos(pp->GetNrows() / 2);
736 xyzLoc2[2] = pp->GetRowEnd() - pp->GetRowPos(pp->GetNrows() / 2);
737 matrix->LocalToMaster(xyzLoc1, xyzGlb1);
738 matrix->LocalToMaster(xyzLoc2, xyzGlb2);
739 float x1Tmp = xyzGlb1[0];
740 xyzGlb1[0] = xyzGlb1[0] * cosf(
alpha) + xyzGlb1[1] * sinf(
alpha);
741 xyzGlb1[1] = -x1Tmp * sinf(
alpha) + xyzGlb1[1] * cosf(
alpha);
742 float x2Tmp = xyzGlb2[0];
743 xyzGlb2[0] = xyzGlb2[0] * cosf(
alpha) + xyzGlb2[1] * sinf(
alpha);
744 xyzGlb2[1] = -x2Tmp * sinf(
alpha) + xyzGlb2[1] * cosf(
alpha);
745 mVertexBuffer[sector].emplace_back(xyzGlb1[0] * GL_SCALE_FACTOR, xyzGlb1[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb1[2] * GL_SCALE_FACTOR);
746 mVertexBuffer[sector].emplace_back(xyzGlb2[0] * GL_SCALE_FACTOR, xyzGlb2[1] * GL_SCALE_FACTOR * mYFactor, xyzGlb2[2] * GL_SCALE_FACTOR);
751 insertVertexList(sector, startCountInner, mVertexBuffer[sector].
size());
752 return (vboList(startCount, mVertexBufferStart[sector].
size() - startCount, sector));
755size_t GPUDisplay::DrawGLScene_updateVertexList()
757 for (int32_t
i = 0;
i < NSECTORS;
i++) {
758 mVertexBuffer[
i].clear();
759 mVertexBufferStart[
i].clear();
760 mVertexBufferCount[
i].clear();
763 for (int32_t
i = 0;
i < mCurrentClusters;
i++) {
764 mGlobalPos[
i].
w = tCLUSTER;
766 for (int32_t
i = 0;
i < mCurrentSpacePointsTRD;
i++) {
767 mGlobalPosTRD[
i].
w = tTRDCLUSTER;
770 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
771 for (int32_t
i = 0;
i < N_POINTS_TYPE;
i++) {
772 mGlDLPoints[iSector][
i].resize(mNCollissions);
774 for (int32_t
i = 0;
i < N_FINAL_TYPE;
i++) {
775 mGlDLFinal[iSector].resize(mNCollissions);
778 int32_t numThreads = getNumThreads();
779 tbb::task_arena(numThreads).execute([&] {
781 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
782 GPUTPCTracker& tracker = (GPUTPCTracker&)sectorTracker(iSector);
783 tracker.SetPointersDataLinks(tracker.LinkTmpMemory());
784 mGlDLLines[iSector][tINITLINK] = DrawLinks(tracker, tINITLINK, true);
785 tracker.SetPointersDataLinks(mChain->rec()->Res(tracker.MemoryResLinks()).Ptr());
786 }, tbb::simple_partitioner());
788 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
791 mGlDLLines[iSector][tLINK] = DrawLinks(tracker, tLINK);
792 mGlDLLines[iSector][tSEED] = DrawSeeds(tracker);
793 mGlDLLines[iSector][tTRACKLET] = DrawTracklets(tracker);
794 mGlDLLines[iSector][tSECTORTRACK] = DrawTracks(tracker, 0);
795 mGlDLGrid[iSector] = DrawGrid(tracker);
796 if (iSector < NSECTORS / 2) {
797 mGlDLGridTRD[iSector] = DrawGridTRD(iSector);
799 }, tbb::simple_partitioner());
801 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
803 mGlDLLines[iSector][tEXTRAPOLATEDTRACK] = DrawTracks(tracker, 1);
804 }, tbb::simple_partitioner());
806 tbb::parallel_for(0, numThreads, [&](int32_t iThread) {
807 mThreadTracks[iThread].resize(mNCollissions);
808 for (int32_t
i = 0;
i < mNCollissions;
i++) {
809 for (int32_t
j = 0;
j < NSECTORS;
j++) {
810 for (int32_t k = 0; k < 2; k++) {
811 mThreadTracks[iThread][
i][
j][k].clear();
815 }, tbb::simple_partitioner());
816 if (mConfig.showTPCTracksFromO2Format) {
817#ifdef GPUCA_TPC_GEOMETRY_O2
821 if (mIOPtrs->clustersNative) {
822 mIOPtrs->outputTracksTPCO2[i].getCluster(mIOPtrs->outputClusRefsTPCO2, 0, *mIOPtrs->clustersNative, sector, row);
827 col = mQA->GetMCLabelCol(mIOPtrs->outputTracksTPCO2MC[i]);
833 tbb::parallel_for<uint32_t>(0, mIOPtrs->nMergedTracks, [&](
auto i) {
834 const GPUTPCGMMergedTrack* track = &mIOPtrs->mergedTracks[i];
835 if (track->NClusters() == 0) {
838 if (mCfgH.hideRejectedTracks && !track->OK()) {
841 int32_t sector = mIOPtrs->mergedTrackHits[track->FirstClusterRef() + track->NClusters() - 1].sector;
844 const auto&
label = mQA->GetMCTrackLabel(
i);
845#ifdef GPUCA_TPC_GEOMETRY_O2
848 while (
label.isValid() &&
col < mOverlayTFClusters.size() && mOverlayTFClusters[
col][NSECTORS] <
label.track) {
856 for (uint32_t
col = 0;
col < mIOPtrs->nMCInfosTPCCol;
col++) {
857 tbb::parallel_for(mIOPtrs->mcInfosTPCCol[
col].first, mIOPtrs->mcInfosTPCCol[
col].first + mIOPtrs->mcInfosTPCCol[
col].num, [&](uint32_t
i) {
858 const GPUTPCMCInfo& mc = mIOPtrs->mcInfosTPC[i];
859 if (mc.charge == 0.f) {
866 float alpha = atan2f(mc.
y, mc.
x);
868 alpha += 2 * CAMath::Pi();
870 int32_t sector =
alpha / (2 * CAMath::Pi()) * 18;
879 prop.SetMaxSinPhi(.999);
880 prop.SetMaterialTPC();
881 prop.SetPolynomialField(&mParam->polynomialField);
883 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
885 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
886 mThreadBuffers[numThread].clear();
887 for (int32_t iSet = 0; iSet < numThreads; iSet++) {
888 if (mConfig.showTPCTracksFromO2Format) {
889 DrawFinal<o2::tpc::TrackTPC>(iSector, iCol, &prop, mThreadTracks[iSet][iCol][iSector], mThreadBuffers[numThread]);
891 DrawFinal<GPUTPCGMMergedTrack>(iSector, iCol, &prop, mThreadTracks[iSet][iCol][iSector], mThreadBuffers[numThread]);
894 vboList*
list = &mGlDLFinal[iSector][iCol][0];
895 for (int32_t
i = 0;
i < N_FINAL_TYPE;
i++) {
896 size_t startCount = mVertexBufferStart[iSector].size();
897 for (uint32_t
j = 0;
j < mThreadBuffers[numThread].start[
i].size();
j++) {
898 mVertexBufferStart[iSector].emplace_back(mThreadBuffers[numThread].
start[
i][
j]);
899 mVertexBufferCount[iSector].emplace_back(mThreadBuffers[numThread].
count[
i][
j]);
901 list[
i] = vboList(startCount, mVertexBufferStart[iSector].
size() - startCount, iSector);
904 }, tbb::simple_partitioner());
906 tbb::parallel_for(0, NSECTORS, [&](int32_t iSector) {
907 for (int32_t
i = 0;
i < N_POINTS_TYPE_TPC;
i++) {
908 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
909 mGlDLPoints[iSector][
i][iCol] = DrawClusters(iSector,
i, iCol);
912 }, tbb::simple_partitioner());
916 mGlDLFinalITS = DrawFinalITS();
918 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
919 for (int32_t
i = N_POINTS_TYPE_TPC;
i < N_POINTS_TYPE_TPC + N_POINTS_TYPE_TRD;
i++) {
920 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
921 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsTRD(iSector,
i, iCol);
926 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
927 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++) {
928 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
929 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsTOF(iSector,
i, iCol);
935 for (int32_t iSector = 0; iSector < NSECTORS; iSector++) {
936 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++) {
937 for (int32_t iCol = 0; iCol < mNCollissions; iCol++) {
938 mGlDLPoints[iSector][
i][iCol] = DrawSpacePointsITS(iSector,
i, iCol);
944 mUpdateVertexLists = 0;
945 size_t totalVertizes = 0;
946 for (int32_t
i = 0;
i < NSECTORS;
i++) {
947 totalVertizes += mVertexBuffer[
i].size();
949 if (totalVertizes > 0xFFFFFFFF) {
950 throw std::runtime_error(
"Display vertex count exceeds 32bit uint32_t counter");
952 size_t needMultiVBOSize = mBackend->needMultiVBO();
953 mUseMultiVBO = needMultiVBOSize && (totalVertizes *
sizeof(mVertexBuffer[0][0]) >= needMultiVBOSize);
955 size_t totalYet = mVertexBuffer[0].size();
956 mVertexBuffer[0].resize(totalVertizes);
958 for (uint32_t
j = 0;
j < mVertexBufferStart[
i].size();
j++) {
959 mVertexBufferStart[
i][
j] += totalYet;
961 memcpy(&mVertexBuffer[0][totalYet], &mVertexBuffer[
i][0], mVertexBuffer[
i].
size() *
sizeof(mVertexBuffer[
i][0]));
962 totalYet += mVertexBuffer[
i].size();
963 mVertexBuffer[
i].clear();
966 mBackend->loadDataToGPU(totalVertizes);
968 mVertexBuffer[
i].clear();
970 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.
GPUReconstruction::RecoStepField GetRecoSteps() const
const GPUSettingsProcessing & GetProcessingSettings() const
const GPUConstantMem * GetProcessors() 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
Node par(int index)
Parameters.
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
GPUTPCTracker tpcTrackers[GPUCA_NSECTORS]
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