Skip to content

Commit 6325efb

Browse files
Add operator->()
1 parent abbbbee commit 6325efb

4 files changed

Lines changed: 37 additions & 32 deletions

File tree

GPU/Common/MemLayout.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ struct wrapper<S, reference> : public S<reference> {
145145

146146
constexpr wrapper<S, pointer> operator&() { return Base::apply(GetPointer<S<pointer>>{}); }
147147
//constexpr wrapper<S, const_pointer> operator&() const { return Base::apply(GetPointer<S<const_pointer>>{}); }
148+
constexpr pointer<wrapper<S, reference>> operator->() { return this; }
148149
};
149150

150151
template <template <template <class> class> class S>
@@ -185,6 +186,7 @@ struct wrapper<S, reference_restrict> : public S<reference_restrict> {
185186

186187
constexpr wrapper<S, pointer> operator&() { return Base::apply(GetPointer<S<pointer>>{}); }
187188
//constexpr wrapper<S, const_pointer> operator&() const { return Base::apply(GetPointer<S<const_pointer>>{}); }
189+
constexpr pointer<wrapper<S, reference>> operator->() { return this; }
188190
};
189191

190192
template <template <template <class> class> class S>
@@ -199,6 +201,7 @@ struct wrapper<S, const_reference> : public S<const_reference> {
199201
constexpr wrapper(const S<const_reference_restrict>& other) : Base(other.apply(AggregateConstructor<Base>{})) {}
200202

201203
constexpr wrapper<S, const_pointer> operator&() const { return Base::apply(GetPointer<S<const_pointer>>{}); }
204+
constexpr const_pointer<wrapper<S, const_reference>> operator->() const { return this; }
202205
};
203206

204207
template <template <template <class> class> class S>
@@ -213,6 +216,7 @@ struct wrapper<S, const_reference_restrict> : public S<const_reference_restrict>
213216
constexpr wrapper(const S<const_reference>& other) : Base(other.apply(AggregateConstructor<Base>{})) {}
214217

215218
constexpr wrapper<S, const_pointer> operator&() const { return Base::apply(GetPointer<S<const_pointer>>{}); }
219+
constexpr const_pointer<wrapper<S, const_reference>> operator->() const { return this; }
216220
};
217221

218222
template <template <template <class> class> class S>
@@ -227,6 +231,8 @@ struct wrapper<S, pointer> : public S<pointer> {
227231

228232
constexpr wrapper<S, reference> operator*() { return operator[](0); }
229233
constexpr wrapper<S, const_reference> operator*() const { return operator[](0); }
234+
constexpr wrapper<S, reference> operator->() { return operator[](0); }
235+
constexpr wrapper<S, const_reference> operator->() const { return operator[](0); }
230236

231237
constexpr bool operator==(const wrapper& other) const { return Base::apply(FirstMember{}) == other.apply(FirstMember{}); }
232238
constexpr bool operator!=(const wrapper& other) const { return !this->operator==(other); }
@@ -252,6 +258,7 @@ struct wrapper<S, const_pointer> : public S<const_pointer> {
252258

253259
constexpr wrapper<S, const_reference> operator[] (size_t i) const { return Base::apply(RandomAccessAt<S<const_reference>>{i}); }
254260
constexpr wrapper<S, const_reference> operator*() const { return operator[](0); }
261+
constexpr wrapper<S, const_reference> operator->() const { return operator[](0); }
255262

256263
constexpr bool operator==(const wrapper& other) const { return Base::apply(FirstMember{}) == other.apply(FirstMember{}); }
257264
constexpr bool operator!=(const wrapper& other) const { return !this->operator==(other); }

GPU/GPUTracking/Merger/GPUTPCGMMerger.cxx

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ int64_t GPUTPCGMMerger::GetTrackLabelA(const S& trk) const
237237
int32_t nClusters = 0;
238238
if constexpr (std::is_same_v<S, GPUTPCGMBorderTrack&>) {
239239
sectorTrack = &mSectorTrackInfos[trk.TrackID()];
240-
nClusters = (*sectorTrack->OrigTrack()).NHits();
240+
nClusters = sectorTrack->OrigTrack()->NHits();
241241
} else {
242242
nClusters = trk.NClusters();
243243
}
@@ -246,7 +246,7 @@ int64_t GPUTPCGMMerger::GetTrackLabelA(const S& trk) const
246246
int32_t id;
247247
if constexpr (std::is_same_v<S, GPUTPCGMBorderTrack&>) {
248248
const GPUTPCTracker& tracker = GetConstantMem()->tpcTrackers[sectorTrack->Sector()];
249-
const GPUTPCHitId& ic = tracker.TrackHits()[(*sectorTrack->OrigTrack()).FirstHitID() + i];
249+
const GPUTPCHitId& ic = tracker.TrackHits()[sectorTrack->OrigTrack()->FirstHitID() + i];
250250
id = tracker.Data().ClusterDataIndex(tracker.Data().Row(ic.RowIndex()), ic.HitIndex()) + GetConstantMem()->ioPtrs.clustersNative->clusterOffset[sectorTrack->Sector()][0];
251251
} else {
252252
id = mClusters[trk.FirstClusterRef() + i].num;
@@ -497,15 +497,14 @@ GPUd() int32_t GPUTPCGMMerger::RefitSectorTrack(GPUTPCGMSectorTrack& sectorTrack
497497
prop.SetFitInProjections(false);
498498
prop.SetPolynomialField(&Param().polynomialField);
499499
GPUTPCGMTrackParam trk;
500-
MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_reference> inTrack_cref = *inTrack;
501-
trk.X() = inTrack_cref.Param().GetX();
502-
trk.Y() = inTrack_cref.Param().GetY();
503-
trk.Z() = inTrack_cref.Param().GetZ();
504-
trk.SinPhi() = inTrack_cref.Param().GetSinPhi();
505-
trk.DzDs() = inTrack_cref.Param().GetDzDs();
506-
trk.QPt() = inTrack_cref.Param().GetQPt();
507-
trk.TZOffset() = Param().par.earlyTpcTransform ? inTrack_cref.Param().GetZOffset() : GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, inTrack_cref.Param().GetZOffset(), Param().continuousMaxTimeBin);
508-
trk.ShiftZ(this, sector, sectorTrack.ClusterZT0(), sectorTrack.ClusterZTN(), inTrack_cref.Param().GetX(), inTrack_cref.Param().GetX()); // We do not store the inner / outer cluster X, so we just use the track X instead
500+
trk.X() = inTrack->Param().GetX();
501+
trk.Y() = inTrack->Param().GetY();
502+
trk.Z() = inTrack->Param().GetZ();
503+
trk.SinPhi() = inTrack->Param().GetSinPhi();
504+
trk.DzDs() = inTrack->Param().GetDzDs();
505+
trk.QPt() = inTrack->Param().GetQPt();
506+
trk.TZOffset() = Param().par.earlyTpcTransform ? inTrack->Param().GetZOffset() : GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, inTrack->Param().GetZOffset(), Param().continuousMaxTimeBin);
507+
trk.ShiftZ(this, sector, sectorTrack.ClusterZT0(), sectorTrack.ClusterZTN(), inTrack->Param().GetX(), inTrack->Param().GetX()); // We do not store the inner / outer cluster X, so we just use the track X instead
509508
sectorTrack.SetX2(0.f);
510509
for (int32_t way = 0; way < 2; way++) {
511510
if (way) {
@@ -514,14 +513,14 @@ GPUd() int32_t GPUTPCGMMerger::RefitSectorTrack(GPUTPCGMSectorTrack& sectorTrack
514513
}
515514
trk.ResetCovariance();
516515
prop.SetTrack(&trk, alpha);
517-
int32_t start = way ? inTrack_cref.NHits() - 1 : 0;
518-
int32_t end = way ? 0 : (inTrack_cref.NHits() - 1);
516+
int32_t start = way ? inTrack->NHits() - 1 : 0;
517+
int32_t end = way ? 0 : (inTrack->NHits() - 1);
519518
int32_t incr = way ? -1 : 1;
520519
for (int32_t i = start; i != end; i += incr) {
521520
float x, y, z;
522521
int32_t row, flags;
523522
const GPUTPCTracker& tracker = GetConstantMem()->tpcTrackers[sector];
524-
const GPUTPCHitId& ic = tracker.TrackHits()[inTrack_cref.FirstHitID() + i];
523+
const GPUTPCHitId& ic = tracker.TrackHits()[inTrack->FirstHitID() + i];
525524
int32_t clusterIndex = tracker.Data().ClusterDataIndex(tracker.Data().Row(ic.RowIndex()), ic.HitIndex());
526525
row = ic.RowIndex();
527526
const ClusterNative& cl = GetConstantMem()->ioPtrs.clustersNative->clustersLinear[GetConstantMem()->ioPtrs.clustersNative->clusterOffset[sector][0] + clusterIndex];
@@ -553,10 +552,9 @@ GPUd() int32_t GPUTPCGMMerger::RefitSectorTrack(GPUTPCGMSectorTrack& sectorTrack
553552

554553
GPUd() void GPUTPCGMMerger::SetTrackClusterZT(GPUTPCGMSectorTrack& track, int32_t iSector, MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr)
555554
{
556-
MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_reference> sectorTr_cref = *sectorTr;
557555
const GPUTPCTracker& trk = GetConstantMem()->tpcTrackers[iSector];
558-
const GPUTPCHitId& ic1 = trk.TrackHits()[sectorTr_cref.FirstHitID()];
559-
const GPUTPCHitId& ic2 = trk.TrackHits()[sectorTr_cref.FirstHitID() + sectorTr_cref.NHits() - 1];
556+
const GPUTPCHitId& ic1 = trk.TrackHits()[sectorTr->FirstHitID()];
557+
const GPUTPCHitId& ic2 = trk.TrackHits()[sectorTr->FirstHitID() + sectorTr->NHits() - 1];
560558
int32_t clusterIndex1 = trk.Data().ClusterDataIndex(trk.Data().Row(ic1.RowIndex()), ic1.HitIndex());
561559
int32_t clusterIndex2 = trk.Data().ClusterDataIndex(trk.Data().Row(ic2.RowIndex()), ic2.HitIndex());
562560
if (Param().par.earlyTpcTransform) {
@@ -576,13 +574,12 @@ GPUd() void GPUTPCGMMerger::UnpackSectorGlobal(int32_t nBlocks, int32_t nThreads
576574
{
577575
const GPUTPCTracker& trk = GetConstantMem()->tpcTrackers[iSector];
578576
float alpha = Param().Alpha(iSector);
579-
// GPUTPCTrackSkeleton<MemLayout::const_pointer> sectorTr = mMemory->firstExtrapolatedTracks[iSector];
580577
MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr = mMemory->firstExtrapolatedTracks[iSector];
581578
uint32_t nLocalTracks = trk.CommonMemory()->nLocalTracks;
582579
uint32_t nTracks = *trk.NTracks();
583580
for (uint32_t itr = nLocalTracks + iBlock * nThreads + iThread; itr < nTracks; itr += nBlocks * nThreads) {
584581
sectorTr = &trk.Tracks()[itr];
585-
int32_t localId = mTrackIDs[((*sectorTr).LocalTrackId() >> 24) * mNMaxSingleSectorTracks + ((*sectorTr).LocalTrackId() & 0xFFFFFF)];
582+
int32_t localId = mTrackIDs[(sectorTr->LocalTrackId() >> 24) * mNMaxSingleSectorTracks + (sectorTr->LocalTrackId() & 0xFFFFFF)];
586583
if (localId == -1) {
587584
continue;
588585
}
@@ -614,9 +611,10 @@ GPUd() void GPUTPCGMMerger::RefitSectorTracks(int32_t nBlocks, int32_t nThreads,
614611
uint32_t nLocalTracks = trk.CommonMemory()->nLocalTracks;
615612

616613
float alpha = Param().Alpha(iSector);
614+
MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr;
617615

618616
for (uint32_t itr = iBlock * nThreads + iThread; itr < nLocalTracks; itr += nBlocks * nThreads) {
619-
MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr = &trk.Tracks()[itr];
617+
sectorTr = &trk.Tracks()[itr];
620618
GPUTPCGMSectorTrack track;
621619
SetTrackClusterZT(track, iSector, sectorTr);
622620
if (Param().rec.tpc.mergerCovSource == 0) {
@@ -644,7 +642,7 @@ GPUd() void GPUTPCGMMerger::RefitSectorTracks(int32_t nBlocks, int32_t nThreads,
644642
track.SetExtrapolatedTrackId(0, -1);
645643
track.SetExtrapolatedTrackId(1, -1);
646644
uint32_t myTrack = CAMath::AtomicAdd(&mMemory->nUnpackedTracks, 1u);
647-
mTrackIDs[iSector * mNMaxSingleSectorTracks + (*sectorTr).LocalTrackId()] = myTrack;
645+
mTrackIDs[iSector * mNMaxSingleSectorTracks + sectorTr->LocalTrackId()] = myTrack;
648646
mSectorTrackInfos[myTrack] = track;
649647
}
650648
}
@@ -1605,7 +1603,7 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
16051603
trackCluster* c2 = trackClusters + nHits + nTrackHits - 1;
16061604
for (int32_t i = 0; i < nTrackHits; i++, c2--) {
16071605
const GPUTPCTracker& trk = GetConstantMem()->tpcTrackers[t->Sector()];
1608-
const GPUTPCHitId& ic = trk.TrackHits()[(*t->OrigTrack()).FirstHitID() + i];
1606+
const GPUTPCHitId& ic = trk.TrackHits()[t->OrigTrack()->FirstHitID() + i];
16091607
uint32_t id = trk.Data().ClusterDataIndex(trk.Data().Row(ic.RowIndex()), ic.HitIndex()) + GetConstantMem()->ioPtrs.clustersNative->clusterOffset[t->Sector()][0];
16101608
*c2 = trackCluster{id, (uint8_t)ic.RowIndex(), t->Sector(), t->Leg()};
16111609
}
@@ -1659,9 +1657,9 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
16591657
if (trackParts[i]->Leg() != baseLeg) {
16601658
break;
16611659
}
1662-
if ((*trackParts[i]->OrigTrack()).NHits() > length) {
1660+
if (trackParts[i]->OrigTrack()->NHits() > length) {
16631661
iLongest = i;
1664-
length = (*trackParts[i]->OrigTrack()).NHits();
1662+
length = trackParts[i]->OrigTrack()->NHits();
16651663
}
16661664
}
16671665
bool outwards;

GPU/GPUTracking/Merger/GPUTPCGMSectorTrack.cxx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ using namespace o2::tpc;
2626

2727
GPUd() void GPUTPCGMSectorTrack::Set(const GPUTPCGMMerger* merger, MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr, float alpha, int32_t sector)
2828
{
29-
MemLayout::wrapper<GPUTPCBaseTrackParamSkeleton, MemLayout::const_reference> t = (*sectorTr).Param();
29+
MemLayout::wrapper<GPUTPCBaseTrackParamSkeleton, MemLayout::const_reference> t = sectorTr->Param();
3030
mOrigTrack = sectorTr;
3131
mParam.mX = t.GetX();
3232
mParam.mY = t.GetY();
@@ -43,7 +43,7 @@ GPUd() void GPUTPCGMSectorTrack::Set(const GPUTPCGMMerger* merger, MemLayout::wr
4343
} else {
4444
mTZOffset = merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, t.GetZOffset(), merger->Param().continuousMaxTimeBin);
4545
}
46-
mNClusters = (*sectorTr).NHits();
46+
mNClusters = sectorTr->NHits();
4747
}
4848

4949
GPUd() void GPUTPCGMSectorTrack::Set(const GPUTPCGMTrackParam& trk, MemLayout::wrapper<GPUTPCTrackSkeleton, MemLayout::const_pointer> sectorTr, float alpha, int32_t sector)
@@ -60,7 +60,7 @@ GPUd() void GPUTPCGMSectorTrack::Set(const GPUTPCGMTrackParam& trk, MemLayout::w
6060
mAlpha = alpha;
6161
mSector = sector;
6262
mTZOffset = trk.GetTZOffset();
63-
mNClusters = (*sectorTr).NHits();
63+
mNClusters = sectorTr->NHits();
6464
mParam.mC0 = trk.GetCov(0);
6565
mParam.mC2 = trk.GetCov(2);
6666
mParam.mC3 = trk.GetCov(3);
@@ -96,11 +96,11 @@ GPUd() void GPUTPCGMSectorTrack::SetParam2(const GPUTPCGMTrackParam& trk)
9696
GPUd() bool GPUTPCGMSectorTrack::FilterErrors(const GPUTPCGMMerger* merger, int32_t iSector, float maxSinPhi, float sinPhiMargin)
9797
{
9898
float lastX;
99-
// float lastX = GPUTPCGeometry::Row2X((*mOrigTrack).Cluster((*mOrigTrack).NClusters() - 1).GetRow()); // TODO: Why is this needed to be set below, Row2X should work, but looses some tracks
99+
// float lastX = GPUTPCGeometry::Row2X(mOrigTrack->Cluster(mOrigTrack->NHits() - 1).GetRow()); // TODO: Why is this needed to be set below, Row2X should work, but looses some tracks
100100
float y, z;
101101
int32_t row, index;
102102
const GPUTPCTracker& trk = merger->GetConstantMem()->tpcTrackers[iSector];
103-
const GPUTPCHitId& ic = trk.TrackHits()[(*mOrigTrack).FirstHitID() + (*mOrigTrack).NHits() - 1];
103+
const GPUTPCHitId& ic = trk.TrackHits()[mOrigTrack->FirstHitID() + mOrigTrack->NHits() - 1];
104104
index = trk.Data().ClusterDataIndex(trk.Data().Row(ic.RowIndex()), ic.HitIndex()) + merger->GetConstantMem()->ioPtrs.clustersNative->clusterOffset[iSector][0];
105105
row = ic.RowIndex();
106106
const ClusterNative& cl = merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear[index];
@@ -493,7 +493,7 @@ GPUd() bool GPUTPCGMSectorTrack::TransportToXAlpha(GPUTPCGMMerger* merger, float
493493

494494
GPUd() void GPUTPCGMSectorTrack::CopyBaseTrackCov()
495495
{
496-
const float* GPUrestrict() cov = (*mOrigTrack).Param().mC;
496+
const float* GPUrestrict() cov = mOrigTrack->Param().mC;
497497
mParam.mC0 = cov[0];
498498
mParam.mC2 = cov[2];
499499
mParam.mC3 = cov[3];

GPU/GPUTracking/SectorTracker/GPUTPCSectorDebugSortKernels.cxx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,6 @@ GPUdii() void GPUTPCSectorDebugSortKernels::Thread<GPUTPCSectorDebugSortKernels:
106106
}
107107
return tracker.TrackHits()[trk1.FirstHitID()].HitIndex() > tracker.TrackHits()[trk2.FirstHitID()].HitIndex();
108108
};
109-
GPUCommonAlgorithm::sortDeviceDynamic(tracker.Tracks(), &tracker.Tracks()[tracker.CommonMemory()->nLocalTracks], sorter);
110-
GPUCommonAlgorithm::sortDeviceDynamic(&tracker.Tracks()[tracker.CommonMemory()->nLocalTracks], &tracker.Tracks()[*tracker.NTracks()], sorter);
109+
GPUCommonAlgorithm::sortDeviceDynamic(tracker.Tracks(), tracker.Tracks() + tracker.CommonMemory()->nLocalTracks, sorter);
110+
GPUCommonAlgorithm::sortDeviceDynamic(tracker.Tracks() + tracker.CommonMemory()->nLocalTracks, tracker.Tracks() + *tracker.NTracks(), sorter);
111111
}

0 commit comments

Comments
 (0)