Skip to content

Commit 9e23fb6

Browse files
committed
GPU TPC: Shift all segments of looping tracks once before track fit
1 parent 061d1ef commit 9e23fb6

File tree

4 files changed

+64
-40
lines changed

4 files changed

+64
-40
lines changed

GPU/GPUTracking/Merger/GPUTPCGMMerger.cxx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,8 @@ GPUd() int32_t GPUTPCGMMerger::RefitSectorTrack(GPUTPCGMSectorTrack& sectorTrack
515515
trk.DzDs() = inTrack->Param().GetDzDs();
516516
trk.QPt() = inTrack->Param().GetQPt();
517517
trk.TZOffset() = GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convZOffsetToVertexTime(sector, inTrack->Param().GetZOffset(), Param().continuousMaxTimeBin);
518-
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
518+
const auto tmp = sectorTrack.ClusterZTN() > sectorTrack.ClusterZT0() ? std::array<float, 2>{sectorTrack.ClusterZTN(), sectorTrack.ClusterZT0()} : std::array<float, 2>{sectorTrack.ClusterZT0(), sectorTrack.ClusterZTN()};
519+
trk.ShiftZ(this, sector, tmp[0], tmp[1], inTrack->Param().GetX()); // We do not store the inner / outer cluster X, so we just use the track X instead
519520
sectorTrack.SetX2(0.f);
520521
for (int32_t way = 0; way < 2; way++) {
521522
if (way) {
@@ -1791,12 +1792,36 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
17911792
{
17921793
for (uint32_t i = iBlock * nThreads + iThread; i < mMemory->nMergedTracks; i += nBlocks * nThreads) {
17931794
mTrackOrderAttach[mTrackSort[i]] = i;
1794-
const GPUTPCGMMergedTrack& trk = mMergedTracks[i];
1795+
GPUTPCGMMergedTrack& trk = mMergedTracks[i];
17951796
if (trk.OK()) {
17961797
for (uint32_t j = 0; j < trk.NClusters(); j++) {
17971798
mClusterAttachment[mClusters[trk.FirstClusterRef() + j].num] = attachAttached | attachGood;
17981799
CAMath::AtomicAdd(&mSharedCount[mClusters[trk.FirstClusterRef() + j].num], 1u);
17991800
}
1801+
if (!trk.CCE() && !trk.MergedLooper()) {
1802+
GPUTPCGMMergedTrack* updTrk = &trk;
1803+
while (updTrk->PrevSegment() >= 0) {
1804+
auto next = &mMergedTracks[updTrk->PrevSegment()];
1805+
if (next == &trk) {
1806+
break;
1807+
}
1808+
updTrk = next;
1809+
}
1810+
const auto &cl0 = mClusters[trk.FirstClusterRef()], &cln = mClusters[updTrk->FirstClusterRef() + updTrk->NClusters() - 1];
1811+
const auto& GPUrestrict() cls = GetConstantMem()->ioPtrs.clustersNative->clustersLinear;
1812+
float z0 = cls[cl0.num].getTime(), zn = cls[cln.num].getTime();
1813+
const auto tmp = zn > z0 ? std::array<float, 3>{zn, z0, GPUTPCGeometry::Row2X(cln.row)} : std::array<float, 3>{z0, zn, GPUTPCGeometry::Row2X(cl0.row)};
1814+
trk.Param().ShiftZ(this, cl0.sector, tmp[0], tmp[1], tmp[2]);
1815+
updTrk = &trk;
1816+
while (updTrk->PrevSegment() >= 0) {
1817+
auto next = &mMergedTracks[updTrk->PrevSegment()];
1818+
if (next == &trk) {
1819+
break;
1820+
}
1821+
updTrk = next;
1822+
updTrk->Param().TZOffset() = trk.Param().TZOffset();
1823+
}
1824+
}
18001825
}
18011826
}
18021827
}

GPU/GPUTracking/Merger/GPUTPCGMO2Output.cxx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,20 @@ GPUdii() void GPUTPCGMO2Output::Thread<GPUTPCGMO2Output::output>(int32_t nBlocks
211211
}
212212
}
213213

214+
if (track.PrevSegment() >= 0) {
215+
const GPUTPCGMMergedTrack* chkTrk = &tracks[track.PrevSegment()];
216+
while (chkTrk->PrevSegment() >= 0) {
217+
auto next = &tracks[chkTrk->PrevSegment()];
218+
if (next == &track) {
219+
break;
220+
}
221+
chkTrk = next;
222+
}
223+
const auto& firstPrevCluster = trackClusters[chkTrk->FirstClusterRef()];
224+
t1 = clusters->clustersLinear[firstPrevCluster.num].getTime();
225+
sector1 = firstPrevCluster.sector;
226+
}
227+
214228
bool cce = track.CCE() && ((sector1 < MAXSECTOR / 2) ^ (sector2 < MAXSECTOR / 2));
215229
float time0 = 0.f, tFwd = 0.f, tBwd = 0.f;
216230
if (merger.Param().par.continuousTracking) {

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.cxx

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
using namespace o2::gpu;
5454
using namespace o2::tpc;
5555

56-
GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, int32_t attempt, float maxSinPhi, gputpcgmmergertypes::GPUTPCOuterParam* GPUrestrict() outerParam, int8_t leg)
56+
GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, int32_t attempt, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track)
5757
{
5858
static constexpr float kDeg2Rad = M_PI / 180.f;
5959
CADEBUG(static constexpr float kSectAngle = 2 * M_PI / 18.f);
@@ -66,9 +66,6 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
6666
prop.SetMaterialTPC();
6767
prop.SetPolynomialField(&param.polynomialField);
6868
prop.SetMaxSinPhi(maxSinPhi);
69-
if ((clusters[0].sector < 18) == (clusters[N - 1].sector < 18)) {
70-
ShiftZ2(clusters, merger, N);
71-
}
7269
if (param.rec.tpc.mergerInterpolateErrors) {
7370
for (int32_t i = 0; i < N; i++) {
7471
interpolation.hit[i].errorY = -1;
@@ -88,9 +85,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
8885
float sumInvSqrtCharge = 0.f;
8986
int32_t nAvgCharge = 0;
9087

91-
if (iWay && param.rec.tpc.nWaysOuter && outerParam) {
88+
if (iWay && param.rec.tpc.nWaysOuter) {
9289
if (iWay == nWays - 1) {
93-
StoreOuter(outerParam, prop, 0);
90+
StoreOuter(&track.OuterParam(), prop, 0);
9491
}
9592
}
9693

@@ -109,7 +106,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
109106

110107
N = 0;
111108
lastUpdateX = -1;
112-
const bool inFlyDirection = (leg & 1);
109+
const bool inFlyDirection = (track.Leg() & 1);
113110
const int32_t wayDirection = (iWay & 1) ? -1 : 1;
114111

115112
bool noFollowCircle = false, noFollowCircle2 = false;
@@ -173,7 +170,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
173170
} else if (allowModification && lastRow != 255 && CAMath::Abs(cluster.row - lastRow) > 1) {
174171
if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR(param.par, dodEdx)) {
175172
bool dodEdx = param.dodEdxEnabled && param.rec.tpc.adddEdxSubThresholdClusters && iWay == nWays - 1 && CAMath::Abs(cluster.row - lastRow) == 2;
176-
dodEdx = AttachClustersPropagate(merger, cluster.sector, lastRow, cluster.row, iTrk, leg == 0, prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
173+
dodEdx = AttachClustersPropagate(merger, cluster.sector, lastRow, cluster.row, iTrk, track.Leg() == 0, prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
177174
if (dodEdx) {
178175
dEdx.fillSubThreshold(lastRow - wayDirection);
179176
if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR(param.rec.tpc, dEdxClusterRejectionFlagMask) != GPUCA_GET_CONSTEXPR(param.rec.tpc, dEdxClusterRejectionFlagMaskAlt)) {
@@ -244,7 +241,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
244241

245242
float uncorrectedY = -1e6f;
246243
if (allowModification) {
247-
uncorrectedY = AttachClusters(merger, cluster.sector, cluster.row, iTrk, leg == 0, prop);
244+
uncorrectedY = AttachClusters(merger, cluster.sector, cluster.row, iTrk, track.Leg() == 0, prop);
248245
}
249246

250247
const int32_t err2 = mNDF > 0 && CAMath::Abs(prop.GetSinPhi0()) >= maxSinForUpdate;
@@ -361,14 +358,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
361358
break; // bad chi2 for the whole track, stop the fit
362359
}
363360
}
364-
if (((nWays - iWay) & 1) && (iWay != nWays - 1) && (clusters[0].sector < 18) == (clusters[maxN - 1].sector < 18)) {
365-
ShiftZ2(clusters, merger, maxN);
361+
if (((nWays - iWay) & 1) && (iWay != nWays - 1) && !track.CCE() && !track.Looper()) {
362+
ShiftZ(clusters, merger, maxN);
366363
}
367364
}
368365
ConstrainSinPhi();
369366

370367
GPUCA_DEBUG_STREAMER_CHECK(if (o2::utils::DebugStreamer::checkStream(o2::utils::StreamFlags::streamUpdateTrack, iTrk)) {
371-
o2::utils::DebugStreamer::instance()->getStreamer("debug_accept_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("debug_accept_track").data() << "iTrk=" << iTrk << "outerParam=" << *outerParam << "track=" << this << "ihitStart=" << ihitStart << "\n";
368+
o2::utils::DebugStreamer::instance()->getStreamer("debug_accept_track", "UPDATE") << o2::utils::DebugStreamer::instance()->getUniqueTreeName("debug_accept_track").data() << "iTrk=" << iTrk << "outerParam=" << track.OuterParam() << "track=" << this << "ihitStart=" << ihitStart << "\n";
372369
})
373370

374371
if (!(N + NTolerated >= GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(mP[4] * param.qptB5Scaler) && 2 * NTolerated <= CAMath::Max(10, N) && CheckNumericalQuality(covYYUpd))) {
@@ -842,22 +839,18 @@ GPUdi() void GPUTPCGMTrackParam::AttachClustersMirror(const GPUTPCGMMerger* GPUr
842839
}
843840
}
844841

845-
GPUd() void GPUTPCGMTrackParam::ShiftZ2(const GPUTPCGMMergedTrackHit* clusters, const GPUTPCGMMerger* merger, int32_t N)
842+
GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMergedTrackHit* clusters, const GPUTPCGMMerger* merger, int32_t N)
846843
{
847-
float tzInner, tzOuter;
848-
float xInner, xOuter;
849844
if (N == 0) {
850845
N = 1;
851846
}
852847
const auto& GPUrestrict() cls = merger->GetConstantMem()->ioPtrs.clustersNative->clustersLinear;
853-
tzInner = cls[clusters[N - 1].num].getTime();
854-
tzOuter = cls[clusters[0].num].getTime();
855-
xInner = GPUTPCGeometry::Row2X(clusters[N - 1].row);
856-
xOuter = GPUTPCGeometry::Row2X(clusters[0].row);
857-
ShiftZ(merger, clusters[0].sector, tzInner, tzOuter, xInner, xOuter);
848+
float z0 = cls[clusters[0].num].getTime(), zn = cls[clusters[N - 1].num].getTime();
849+
const auto tmp = zn > z0 ? std::array<float, 3>{zn, z0, GPUTPCGeometry::Row2X(clusters[N - 1].row)} : std::array<float, 3>{z0, zn, GPUTPCGeometry::Row2X(clusters[0].row)};
850+
ShiftZ(merger, clusters[0].sector, tmp[0], tmp[1], tmp[2]);
858851
}
859852

860-
GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMerger* GPUrestrict() merger, int32_t sector, float tz1, float tz2, float x1, float x2)
853+
GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMerger* GPUrestrict() merger, int32_t sector, float cltmax, float cltmin, float clx)
861854
{
862855
if (!merger->Param().par.continuousTracking) {
863856
return;
@@ -891,25 +884,17 @@ GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMerger* GPUrestrict() merge
891884
}
892885

893886
if (!beamlineReached) {
894-
float baset, basex;
895-
if (CAMath::Abs(tz1) > CAMath::Abs(tz2)) {
896-
baset = tz1;
897-
basex = x1;
898-
} else {
899-
baset = tz2;
900-
basex = x2;
901-
}
902-
float refZ = ((sector < GPUCA_NSECTORS / 2) ? merger->Param().rec.tpc.defaultZOffsetOverR : -merger->Param().rec.tpc.defaultZOffsetOverR) * basex;
887+
float refZ = ((sector < GPUCA_NSECTORS / 2) ? merger->Param().rec.tpc.defaultZOffsetOverR : -merger->Param().rec.tpc.defaultZOffsetOverR) * clx;
903888
float basez;
904-
merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->TransformIdealZ(sector, baset, basez, mTZOffset);
889+
merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->TransformIdealZ(sector, cltmax, basez, mTZOffset);
905890
deltaZ = basez - refZ;
906891
}
907892
{
908893
float deltaT = merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->convDeltaZtoDeltaTimeInTimeFrame(sector, deltaZ);
909894
mTZOffset += deltaT;
910895
mP[1] -= deltaZ;
911-
const float maxT = CAMath::Min(tz1, tz2) - merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->getT0();
912-
const float minT = CAMath::Max(tz1, tz2) - merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->getMaxDriftTime(sector);
896+
const float maxT = cltmin - merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->getT0();
897+
const float minT = cltmax - merger->GetConstantMem()->calibObjects.fastTransformHelper->getCorrMap()->getMaxDriftTime(sector);
913898
// printf("T Check: Clusters %f %f, min %f max %f vtx %f\n", tz1, tz2, minT, maxT, mTZOffset);
914899
deltaT = 0.f;
915900
if (mTZOffset < minT) {
@@ -980,7 +965,7 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
980965
GPUTPCGMTrackParam t = track.Param();
981966
float Alpha = track.Alpha();
982967
CADEBUG(int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt());
983-
bool ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, &track.OuterParam(), track.Leg());
968+
bool ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, track);
984969
CADEBUG(printf("Finished Fit Track %d\n", iTrk));
985970
CADEBUG(printf("OUTPUT hits %d -> %d+%d = %d, QPt %f -> %f, SP %f, ok %d chi2 %f chi2ndf %f\n", nTrackHitsOld, nTrackHits, NTolerated, nTrackHits + NTolerated, ptOld, t.QPt(), t.SinPhi(), (int32_t)ok, t.Chi2(), t.Chi2() / CAMath::Max(1, nTrackHits)));
986971

@@ -994,7 +979,7 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
994979
NTolerated = 0; // Clusters not fit but tollerated for track length cut
995980
t = track.Param();
996981
Alpha = track.Alpha();
997-
ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, 1, GPUCA_MAX_SIN_PHI, &track.OuterParam(), track.Leg());
982+
ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, 1, GPUCA_MAX_SIN_PHI, track);
998983
} else {
999984
uint32_t nRefit = CAMath::AtomicAdd(&merger->Memory()->nRetryRefit, 1u);
1000985
merger->RetryRefitIds()[nRefit] = iTrk;

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class GPUTPCGMTrackParam
141141
GPUd() bool CheckNumericalQuality(float overrideCovYY = -1.f) const;
142142
GPUd() bool CheckCov() const;
143143

144-
GPUd() bool Fit(GPUTPCGMMerger* merger, int32_t iTrk, GPUTPCGMMergedTrackHit* clusters, int32_t& N, int32_t& NTolerated, float& Alpha, int32_t attempt = 0, float maxSinPhi = GPUCA_MAX_SIN_PHI, gputpcgmmergertypes::GPUTPCOuterParam* outerParam = nullptr, int8_t leg = 0);
144+
GPUd() bool Fit(GPUTPCGMMerger* merger, int32_t iTrk, GPUTPCGMMergedTrackHit* clusters, int32_t& N, int32_t& NTolerated, float& Alpha, int32_t attempt, float maxSinPhi, GPUTPCGMMergedTrack& track);
145145
GPUd() void MoveToReference(GPUTPCGMPropagator& prop, const GPUParam& param, float& alpha);
146146
GPUd() void MirrorTo(GPUTPCGMPropagator& prop, float toY, float toZ, bool inFlyDirection, const GPUParam& param, uint8_t row, uint8_t clusterState, bool mirrorParameters, int8_t sector);
147147
GPUd() int32_t MergeDoubleRowClusters(int32_t& ihit, int32_t wayDirection, GPUTPCGMMergedTrackHit* clusters, const GPUTPCGMMerger* merger, GPUTPCGMPropagator& prop, float& xx, float& yy, float& zz, int32_t maxN, float clAlpha, uint8_t& clusterState, bool rejectChi2);
@@ -183,8 +183,8 @@ class GPUTPCGMTrackParam
183183
}
184184

185185
GPUd() void Rotate(float alpha);
186-
GPUd() void ShiftZ(const GPUTPCGMMerger* merger, int32_t sector, float tzInner, float tzOuter, float x1, float x2);
187-
GPUd() void ShiftZ2(const GPUTPCGMMergedTrackHit* clusters, const GPUTPCGMMerger* merger, int32_t N);
186+
GPUd() void ShiftZ(const GPUTPCGMMerger* merger, int32_t sector, float cltmax, float cltmin, float clx);
187+
GPUd() void ShiftZ(const GPUTPCGMMergedTrackHit* clusters, const GPUTPCGMMerger* merger, int32_t N);
188188

189189
GPUd() static float Reciprocal(float x) { return 1.f / x; }
190190
GPUdi() static void Assign(float& x, bool mask, float v)

0 commit comments

Comments
 (0)