Skip to content

Commit 2ec5599

Browse files
committed
GPU TPC: Shift all segments of looping tracks once before track fit
1 parent c98033f commit 2ec5599

File tree

9 files changed

+72
-71
lines changed

9 files changed

+72
-71
lines changed

GPU/GPUTracking/Definitions/GPUDefParametersDefaults.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@
5757
#define GPUCA_LB_GPUTPCGMMergerLinkExtrapolatedTracks 256
5858
#define GPUCA_LB_GPUTPCGMMergerCollect 512
5959
#define GPUCA_LB_GPUTPCGMMergerSortTracksPrepare 256
60-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0 256
61-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1 256
62-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2 256
60+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0 256
61+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1 256
62+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2 256
6363
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
6464
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
6565
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
@@ -119,9 +119,9 @@
119119
#define GPUCA_LB_GPUTPCGMMergerLinkExtrapolatedTracks 256
120120
#define GPUCA_LB_GPUTPCGMMergerCollect 512
121121
#define GPUCA_LB_GPUTPCGMMergerSortTracksPrepare 256
122-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0 256
123-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1 256
124-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2 256
122+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0 256
123+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1 256
124+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2 256
125125
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
126126
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
127127
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
@@ -181,9 +181,9 @@
181181
#define GPUCA_LB_GPUTPCGMMergerLinkExtrapolatedTracks 256
182182
#define GPUCA_LB_GPUTPCGMMergerCollect 256, 2
183183
#define GPUCA_LB_GPUTPCGMMergerSortTracksPrepare 256
184-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0 256
185-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1 256
186-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2 256
184+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0 256
185+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1 256
186+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2 256
187187
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
188188
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
189189
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
@@ -243,9 +243,9 @@
243243
#define GPUCA_LB_GPUTPCGMMergerLinkExtrapolatedTracks 256
244244
#define GPUCA_LB_GPUTPCGMMergerCollect 128, 2
245245
#define GPUCA_LB_GPUTPCGMMergerSortTracksPrepare 256
246-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0 256
247-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1 256
248-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2 256
246+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0 256
247+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1 256
248+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2 256
249249
#define GPUCA_LB_GPUTPCGMMergerFinalize_0 256
250250
#define GPUCA_LB_GPUTPCGMMergerFinalize_1 256
251251
#define GPUCA_LB_GPUTPCGMMergerFinalize_2 256
@@ -398,14 +398,14 @@
398398
#ifndef GPUCA_LB_GPUTPCGMMergerSortTracksPrepare
399399
#define GPUCA_LB_GPUTPCGMMergerSortTracksPrepare 256
400400
#endif
401-
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0
402-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step0 256
401+
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0
402+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step0 256
403403
#endif
404-
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1
405-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step1 256
404+
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1
405+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step1 256
406406
#endif
407-
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2
408-
#define GPUCA_LB_GPUTPCGMMergerPrepareClusters_step2 256
407+
#ifndef GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2
408+
#define GPUCA_LB_GPUTPCGMMergerPrepareForFit_step2 256
409409
#endif
410410
#ifndef GPUCA_LB_GPUTPCGMMergerFinalize_step0
411411
#define GPUCA_LB_GPUTPCGMMergerFinalize_step0 256

GPU/GPUTracking/Global/GPUChainTrackingMerger.cxx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,11 @@ int32_t GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
196196
}
197197
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadowAll.SharedCount(), maxId * sizeof(*MergerShadowAll.SharedCount()));
198198
runKernel<GPUMemClean16>({{numBlocks, -ThreadCount(), 0, deviceType, RecoStep::TPCMerging}}, MergerShadowAll.ClusterAttachment(), maxId * sizeof(*MergerShadowAll.ClusterAttachment()));
199-
runKernel<GPUTPCGMMergerPrepareClusters, 0>(GetGridAuto(0, deviceType));
199+
runKernel<GPUTPCGMMergerPrepareForFit, 0>(GetGridAuto(0, deviceType));
200200
CondWaitEvent(waitForTransfer, &mEvents->single);
201201
runKernel<GPUTPCGMMergerSortTracksQPt>(GetGridAuto(0, deviceType));
202-
runKernel<GPUTPCGMMergerPrepareClusters, 1>(GetGridAuto(0, deviceType));
203-
runKernel<GPUTPCGMMergerPrepareClusters, 2>(GetGridAuto(0, deviceType));
202+
runKernel<GPUTPCGMMergerPrepareForFit, 1>(GetGridAuto(0, deviceType));
203+
runKernel<GPUTPCGMMergerPrepareForFit, 2>(GetGridAuto(0, deviceType));
204204

205205
DoDebugAndDump(RecoStep::TPCMerging, GPUChainTrackingDebugFlags::TPCMergingPrepareFit, doGPU, Merger, &GPUTPCGMMerger::DumpFitPrepare, *mDebugFile);
206206

GPU/GPUTracking/Merger/GPUTPCGMMerger.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ void* GPUTPCGMMerger::SetPointersMerger(void* mem)
325325
computePointerWithAlignment(mem, mTrackIDs, GPUCA_NSECTORS * mNMaxSingleSectorTracks); // UnpackResetIds - RefitSectorTracks - UnpackSectorGlobal
326326
memMax = (void*)std::max((size_t)mem, (size_t)memMax);
327327
mem = memBase;
328-
computePointerWithAlignment(mem, mTrackSort, mNMaxTracks); // PrepareClustersForFit0 - SortTracksQPt - PrepareClustersForFit1 - PrepareClustersForFit1 / Finalize0 - Finalize2
328+
computePointerWithAlignment(mem, mTrackSort, mNMaxTracks); // PrepareForFit0 - SortTracksQPt - PrepareForFit1 - PrepareForFit1 / Finalize0 - Finalize2
329329
computePointerWithAlignment(mem, mSharedCount, mNMaxClusters);
330330
memMax = (void*)std::max((size_t)mem, (size_t)memMax);
331331
mem = memBase;
@@ -1738,7 +1738,7 @@ GPUd() void GPUTPCGMMerger::SortTracksPrepare(int32_t nBlocks, int32_t nThreads,
17381738
}
17391739
}
17401740

1741-
GPUd() void GPUTPCGMMerger::PrepareClustersForFit0(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
1741+
GPUd() void GPUTPCGMMerger::PrepareForFit0(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
17421742
{
17431743
for (uint32_t i = iBlock * nThreads + iThread; i < mMemory->nMergedTracks; i += nBlocks * nThreads) {
17441744
mTrackSort[i] = i;
@@ -1763,7 +1763,7 @@ GPUd() void GPUTPCGMMerger::SortTracksQPt(int32_t nBlocks, int32_t nThreads, int
17631763
#endif
17641764
}
17651765

1766-
GPUd() void GPUTPCGMMerger::PrepareClustersForFit1(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
1766+
GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
17671767
{
17681768
for (uint32_t i = iBlock * nThreads + iThread; i < mMemory->nMergedTracks; i += nBlocks * nThreads) {
17691769
mTrackOrderAttach[mTrackSort[i]] = i;
@@ -1777,7 +1777,7 @@ GPUd() void GPUTPCGMMerger::PrepareClustersForFit1(int32_t nBlocks, int32_t nThr
17771777
}
17781778
}
17791779

1780-
GPUd() void GPUTPCGMMerger::PrepareClustersForFit2(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
1780+
GPUd() void GPUTPCGMMerger::PrepareForFit2(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread)
17811781
{
17821782
for (uint32_t i = iBlock * nThreads + iThread; i < mMemory->nMergedTrackClusters; i += nBlocks * nThreads) {
17831783
if (mSharedCount[mClusters[i].num] > 1) {

GPU/GPUTracking/Merger/GPUTPCGMMerger.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ class GPUTPCGMMerger : public GPUProcessor
170170
GPUd() void SortTracks(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
171171
GPUd() void SortTracksQPt(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
172172
GPUd() void SortTracksPrepare(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
173-
GPUd() void PrepareClustersForFit0(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
174-
GPUd() void PrepareClustersForFit1(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
175-
GPUd() void PrepareClustersForFit2(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
173+
GPUd() void PrepareForFit0(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
174+
GPUd() void PrepareForFit1(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
175+
GPUd() void PrepareForFit2(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
176176
GPUd() void LinkExtrapolatedTracks(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
177177
GPUd() void CollectMergedTracks(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);
178178
GPUd() void Finalize0(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread);

GPU/GPUTracking/Merger/GPUTPCGMMergerGPU.cxx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,21 +163,21 @@ GPUdii() void GPUTPCGMMergerSortTracksPrepare::Thread<0>(int32_t nBlocks, int32_
163163
}
164164

165165
template <>
166-
GPUdii() void GPUTPCGMMergerPrepareClusters::Thread<0>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
166+
GPUdii() void GPUTPCGMMergerPrepareForFit::Thread<0>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
167167
{
168-
merger.PrepareClustersForFit0(nBlocks, nThreads, iBlock, iThread);
168+
merger.PrepareForFit0(nBlocks, nThreads, iBlock, iThread);
169169
}
170170

171171
template <>
172-
GPUdii() void GPUTPCGMMergerPrepareClusters::Thread<1>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
172+
GPUdii() void GPUTPCGMMergerPrepareForFit::Thread<1>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
173173
{
174-
merger.PrepareClustersForFit1(nBlocks, nThreads, iBlock, iThread);
174+
merger.PrepareForFit1(nBlocks, nThreads, iBlock, iThread);
175175
}
176176

177177
template <>
178-
GPUdii() void GPUTPCGMMergerPrepareClusters::Thread<2>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
178+
GPUdii() void GPUTPCGMMergerPrepareForFit::Thread<2>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& GPUrestrict() merger)
179179
{
180-
merger.PrepareClustersForFit2(nBlocks, nThreads, iBlock, iThread);
180+
merger.PrepareForFit2(nBlocks, nThreads, iBlock, iThread);
181181
}
182182

183183
template <>

GPU/GPUTracking/Merger/GPUTPCGMMergerGPU.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class GPUTPCGMMergerCollect : public GPUTPCGMMergerGeneral
138138
GPUd() static void Thread(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUsharedref() GPUSharedMemory& smem, processorType& merger);
139139
};
140140

141-
class GPUTPCGMMergerPrepareClusters : public GPUTPCGMMergerGeneral
141+
class GPUTPCGMMergerPrepareForFit : public GPUTPCGMMergerGeneral
142142
{
143143
public:
144144
template <int32_t iKernel = defaultKernel>

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.cxx

Lines changed: 33 additions & 32 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,7 +66,7 @@ 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)) {
69+
if (!track.CCE() && !track.Looper()) {
7070
ShiftZ2(clusters, merger, N);
7171
}
7272
if (param.rec.tpc.mergerInterpolateErrors) {
@@ -88,9 +88,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
8888
float sumInvSqrtCharge = 0.f;
8989
int32_t nAvgCharge = 0;
9090

91-
if (iWay && param.rec.tpc.nWaysOuter && outerParam) {
91+
if (iWay && param.rec.tpc.nWaysOuter) {
9292
if (iWay == nWays - 1) {
93-
StoreOuter(outerParam, prop, 0);
93+
StoreOuter(&track.OuterParam(), prop, 0);
9494
}
9595
}
9696

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

110110
N = 0;
111111
lastUpdateX = -1;
112-
const bool inFlyDirection = (leg & 1);
112+
const bool inFlyDirection = (track.Leg() & 1);
113113
const int32_t wayDirection = (iWay & 1) ? -1 : 1;
114114

115115
bool noFollowCircle = false, noFollowCircle2 = false;
@@ -173,7 +173,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
173173
} else if (allowModification && lastRow != 255 && CAMath::Abs(cluster.row - lastRow) > 1) {
174174
if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR(param.par, dodEdx)) {
175175
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);
176+
dodEdx = AttachClustersPropagate(merger, cluster.sector, lastRow, cluster.row, iTrk, track.Leg() == 0, prop, inFlyDirection, GPUCA_MAX_SIN_PHI, dodEdx);
177177
if (dodEdx) {
178178
dEdx.fillSubThreshold(lastRow - wayDirection);
179179
if GPUCA_RTC_CONSTEXPR (GPUCA_GET_CONSTEXPR(param.rec.tpc, dEdxClusterRejectionFlagMask) != GPUCA_GET_CONSTEXPR(param.rec.tpc, dEdxClusterRejectionFlagMaskAlt)) {
@@ -244,7 +244,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
244244

245245
float uncorrectedY = -1e6f;
246246
if (allowModification) {
247-
uncorrectedY = AttachClusters(merger, cluster.sector, cluster.row, iTrk, leg == 0, prop);
247+
uncorrectedY = AttachClusters(merger, cluster.sector, cluster.row, iTrk, track.Leg() == 0, prop);
248248
}
249249

250250
const int32_t err2 = mNDF > 0 && CAMath::Abs(prop.GetSinPhi0()) >= maxSinForUpdate;
@@ -361,14 +361,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
361361
break; // bad chi2 for the whole track, stop the fit
362362
}
363363
}
364-
if (((nWays - iWay) & 1) && (iWay != nWays - 1) && (clusters[0].sector < 18) == (clusters[maxN - 1].sector < 18)) {
364+
if (((nWays - iWay) & 1) && (iWay != nWays - 1) && !track.CCE() && !track.Looper()) {
365365
ShiftZ2(clusters, merger, maxN);
366366
}
367367
}
368368
ConstrainSinPhi();
369369

370370
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";
371+
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";
372372
})
373373

374374
if (!(N + NTolerated >= GPUCA_TRACKLET_SELECTOR_MIN_HITS_B5(mP[4] * param.qptB5Scaler) && 2 * NTolerated <= CAMath::Max(10, N) && CheckNumericalQuality(covYYUpd))) {
@@ -862,30 +862,31 @@ GPUd() void GPUTPCGMTrackParam::ShiftZ(const GPUTPCGMMerger* GPUrestrict() merge
862862
if (!merger->Param().par.continuousTracking) {
863863
return;
864864
}
865-
const float r1 = CAMath::Max(0.0001f, CAMath::Abs(mP[4] * merger->Param().polynomialField.GetNominalBz()));
866-
867-
const float dist2 = mX * mX + mP[0] * mP[0];
868-
const float dist1r2 = dist2 * r1 * r1;
869865
float deltaZ = 0.f;
870866
bool beamlineReached = false;
871-
if (dist1r2 < 4) {
872-
const float alpha = CAMath::ACos(1 - 0.5f * dist1r2); // Angle of a circle, such that |(cosa, sina) - (1,0)| == dist
873-
const float beta = CAMath::ATan2(mP[0], mX);
874-
const int32_t comp = mP[2] > CAMath::Sin(beta);
875-
const float sinab = CAMath::Sin((comp ? 0.5f : -0.5f) * alpha + beta); // Angle of circle through origin and track position, to be compared to Snp
876-
const float res = CAMath::Abs(sinab - mP[2]);
877-
878-
if (res < 0.2) {
879-
const float r = 1.f / r1;
880-
const float dS = alpha * r;
881-
float z0 = dS * mP[3];
882-
if (CAMath::Abs(z0) > GPUTPCGeometry::TPCLength()) {
883-
z0 = z0 > 0 ? GPUTPCGeometry::TPCLength() : -GPUTPCGeometry::TPCLength();
884-
}
885-
deltaZ = mP[1] - z0;
886-
beamlineReached = true;
867+
const float r1 = CAMath::Max(0.0001f, CAMath::Abs(mP[4] * merger->Param().polynomialField.GetNominalBz()));
868+
if (r1 < 0.01501) { // 100 MeV @ 0.5T ~ 0.66m cutof
869+
const float dist2 = mX * mX + mP[0] * mP[0];
870+
const float dist1r2 = dist2 * r1 * r1;
871+
if (dist1r2 < 4) {
872+
const float alpha = CAMath::ACos(1 - 0.5f * dist1r2); // Angle of a circle, such that |(cosa, sina) - (1,0)| == dist
873+
const float beta = CAMath::ATan2(mP[0], mX);
874+
const int32_t comp = mP[2] > CAMath::Sin(beta);
875+
const float sinab = CAMath::Sin((comp ? 0.5f : -0.5f) * alpha + beta); // Angle of circle through origin and track position, to be compared to Snp
876+
const float res = CAMath::Abs(sinab - mP[2]);
877+
878+
if (res < 0.2) {
879+
const float r = 1.f / r1;
880+
const float dS = alpha * r;
881+
float z0 = dS * mP[3];
882+
if (CAMath::Abs(z0) > GPUTPCGeometry::TPCLength()) {
883+
z0 = z0 > 0 ? GPUTPCGeometry::TPCLength() : -GPUTPCGeometry::TPCLength();
884+
}
885+
deltaZ = mP[1] - z0;
886+
beamlineReached = true;
887887

888-
// printf("X %9.3f Y %9.3f QPt %9.3f R %9.3f --> Alpha %9.3f Snp %9.3f Snab %9.3f Res %9.3f dS %9.3f z0 %9.3f\n", mX, mP[0], mP[4], r, alpha / 3.1415 * 180, mP[2], sinab, res, dS, z0);
888+
// printf("X %9.3f Y %9.3f QPt %9.3f R %9.3f --> Alpha %9.3f Snp %9.3f Snab %9.3f Res %9.3f dS %9.3f z0 %9.3f\n", mX, mP[0], mP[4], r, alpha / 3.1415 * 180, mP[2], sinab, res, dS, z0);
889+
}
889890
}
890891
}
891892

@@ -979,7 +980,7 @@ GPUd() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict() tr
979980
GPUTPCGMTrackParam t = track.Param();
980981
float Alpha = track.Alpha();
981982
CADEBUG(int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt());
982-
bool ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, &track.OuterParam(), track.Leg());
983+
bool ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, attempt, GPUCA_MAX_SIN_PHI, track);
983984
CADEBUG(printf("Finished Fit Track %d\n", iTrk));
984985
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)));
985986

@@ -993,7 +994,7 @@ GPUd() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict() tr
993994
NTolerated = 0; // Clusters not fit but tollerated for track length cut
994995
t = track.Param();
995996
Alpha = track.Alpha();
996-
ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, 1, GPUCA_MAX_SIN_PHI, &track.OuterParam(), track.Leg());
997+
ok = t.Fit(merger, iTrk, merger->Clusters() + track.FirstClusterRef(), nTrackHits, NTolerated, Alpha, 1, GPUCA_MAX_SIN_PHI, track);
997998
} else {
998999
uint32_t nRefit = CAMath::AtomicAdd(&merger->Memory()->nRetryRefit, 1u);
9991000
merger->RetryRefitIds()[nRefit] = iTrk;

0 commit comments

Comments
 (0)