Skip to content

Commit d990619

Browse files
committed
Add a GPU-refit-to-propagation fallback (GPUTPCGMTrackParam::MoveToReference()/GPUTrackingRefit::RefitTrack() report whether they reached the reference X) so CalculatedEdx recovers rows where RefitTrackAsGPU() stalls, redesign same-row cluster handling into a configurable dEdxSettings::sameRowClusterMethod with a pad/time proximity gate, remove the duplicated legacy calculatedEdx() implementation in favor of the shared two-pass gatherRowClusterData()/calculatedEdxFromRowData() path, and simplify calculatedEdx.C into a single-threaded usage example
1 parent 945bf43 commit d990619

9 files changed

Lines changed: 786 additions & 1030 deletions

File tree

Detectors/TPC/calibration/include/TPCCalibration/CalculatedEdx.h

Lines changed: 98 additions & 32 deletions
Large diffs are not rendered by default.

Detectors/TPC/calibration/macro/calculatedEdx.C

Lines changed: 89 additions & 121 deletions
Large diffs are not rendered by default.

Detectors/TPC/calibration/src/CalculatedEdx.cxx

Lines changed: 555 additions & 841 deletions
Large diffs are not rendered by default.

GPU/GPUTracking/Interface/GPUO2InterfaceRefit.cxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,10 @@ void GPUO2InterfaceRefit::updateCalib(const TPCFastTransformPOD* trans, float bz
133133
mRefit->SetFastTransform(trans);
134134
}
135135

136-
int32_t GPUO2InterfaceRefit::RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward, bool resetCov) { return mRefit->RefitTrackAsGPU(trk, outward, resetCov); }
137-
int32_t GPUO2InterfaceRefit::RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward, bool resetCov) { return mRefit->RefitTrackAsTrackParCov(trk, outward, resetCov); }
138-
int32_t GPUO2InterfaceRefit::RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2, bool outward, bool resetCov) { return mRefit->RefitTrackAsGPU(trk, clusRef, time0, chi2, outward, resetCov); }
139-
int32_t GPUO2InterfaceRefit::RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2, bool outward, bool resetCov) { return mRefit->RefitTrackAsTrackParCov(trk, clusRef, time0, chi2, outward, resetCov); }
136+
int32_t GPUO2InterfaceRefit::RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward, bool resetCov, bool* reachedReferenceOut) { return mRefit->RefitTrackAsGPU(trk, outward, resetCov, reachedReferenceOut); }
137+
int32_t GPUO2InterfaceRefit::RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward, bool resetCov, bool* reachedReferenceOut) { return mRefit->RefitTrackAsTrackParCov(trk, outward, resetCov, reachedReferenceOut); }
138+
int32_t GPUO2InterfaceRefit::RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2, bool outward, bool resetCov, bool* reachedReferenceOut) { return mRefit->RefitTrackAsGPU(trk, clusRef, time0, chi2, outward, resetCov, reachedReferenceOut); }
139+
int32_t GPUO2InterfaceRefit::RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2, bool outward, bool resetCov, bool* reachedReferenceOut) { return mRefit->RefitTrackAsTrackParCov(trk, clusRef, time0, chi2, outward, resetCov, reachedReferenceOut); }
140140
void GPUO2InterfaceRefit::setIgnoreErrorsAtTrackEnds(bool v) { mRefit->mIgnoreErrorsOnTrackEnds = v; }
141141
void GPUO2InterfaceRefit::setTrackReferenceX(float v) { mParam->rec.tpc.trackReferenceX = v; }
142142

GPU/GPUTracking/Interface/GPUO2InterfaceRefit.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ class GPUO2InterfaceRefit
6464
GPUO2InterfaceRefit(const o2::tpc::ClusterNativeAccess* cl, const o2::gpu::TPCFastTransformPOD* trans, float bzNominalGPU, const o2::tpc::TPCClRefElem* trackRef, uint32_t nHbfPerTf = 0, const uint8_t* sharedmap = nullptr, const uint32_t* occupancymap = nullptr, int32_t occupancyMapSize = -1, const std::vector<o2::tpc::TrackTPC>* trks = nullptr, o2::base::Propagator* p = nullptr);
6565
~GPUO2InterfaceRefit();
6666

67-
int32_t RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false);
68-
int32_t RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false);
69-
int32_t RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false);
70-
int32_t RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false);
67+
int32_t RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr);
68+
int32_t RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr);
69+
int32_t RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr);
70+
int32_t RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr);
7171
void setTrackReferenceX(float v);
7272
void setIgnoreErrorsAtTrackEnds(bool v);
7373
void updateCalib(const o2::gpu::TPCFastTransformPOD* trans, float bzNominalGPU);

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.cxx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,16 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
364364
return true;
365365
}
366366

367-
GPUdni() void GPUTPCGMTrackParam::MoveToReference(GPUTPCGMPropagator& prop, const GPUParam& param, float& Alpha)
367+
GPUdni() bool GPUTPCGMTrackParam::MoveToReference(GPUTPCGMPropagator& prop, const GPUParam& param, float& Alpha)
368368
{
369369
static constexpr float kDeg2Rad = M_PI / 180.f;
370370
static constexpr float kSectAngle = 2 * M_PI / 18.f;
371371

372+
bool reachedReference = true;
372373
if (param.rec.tpc.trackReferenceX <= 500) {
373374
GPUTPCGMTrackParam save = *this;
374375
float saveAlpha = Alpha;
376+
reachedReference = false;
375377
for (int32_t attempt = 0; attempt < 3; attempt++) {
376378
float dAngle = CAMath::Round(CAMath::ATan2(mP[0], mX) / kDeg2Rad / 20.f) * kSectAngle;
377379
Alpha += dAngle;
@@ -380,7 +382,7 @@ GPUdni() void GPUTPCGMTrackParam::MoveToReference(GPUTPCGMPropagator& prop, cons
380382
}
381383
ConstrainSinPhi();
382384
if (CAMath::Abs(mP[0]) <= mX * CAMath::Tan(kSectAngle / 2.f)) {
383-
return;
385+
return true;
384386
}
385387
}
386388
*this = save;
@@ -392,6 +394,7 @@ GPUdni() void GPUTPCGMTrackParam::MoveToReference(GPUTPCGMPropagator& prop, cons
392394
ConstrainSinPhi();
393395
Alpha += dAngle;
394396
}
397+
return reachedReference;
395398
}
396399

397400
GPUd() void GPUTPCGMTrackParam::MirrorTo(GPUTPCGMPropagator& GPUrestrict() prop, float toY, float toZ, bool inFlyDirection, const GPUParam& param, uint8_t row, uint8_t clusterState, bool mirrorParameters, int8_t sector)

GPU/GPUTracking/Merger/GPUTPCGMTrackParam.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class GPUTPCGMTrackParam
142142
GPUd() bool CheckCov() const;
143143

144144
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);
145-
GPUd() void MoveToReference(GPUTPCGMPropagator& prop, const GPUParam& param, float& alpha);
145+
GPUd() bool MoveToReference(GPUTPCGMPropagator& prop, const GPUParam& param, float& alpha); ///< returns false if the track could not be propagated to param.rec.tpc.trackReferenceX (position/momentum then rolled back to their pre-call values, but the trailing sector-normalization step may still rotate the track and update alpha); true if it reached it or the reference is disabled (trackReferenceX > 500)
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);
148148

@@ -214,12 +214,12 @@ class GPUTPCGMTrackParam
214214
private:
215215
GPUd() int32_t initResetT0();
216216

217-
float mX; // x position
218-
float mTOffset; // Z offset with early transform, T offset otherwise
219-
float mP[5]; // 'active' track parameters: Y, Z, SinPhi, DzDs, q/Pt
220-
float mC[15]; // the covariance matrix for Y,Z,SinPhi,..
221-
float mChi2; // the chi^2 value
222-
int32_t mNDF; // the Number of Degrees of Freedom
217+
float mX; // x position
218+
float mTOffset; // Z offset with early transform, T offset otherwise
219+
float mP[5]; // 'active' track parameters: Y, Z, SinPhi, DzDs, q/Pt
220+
float mC[15]; // the covariance matrix for Y,Z,SinPhi,..
221+
float mChi2; // the chi^2 value
222+
int32_t mNDF; // the Number of Degrees of Freedom
223223
};
224224

225225
struct GPUTPCGMLoopData {

GPU/GPUTracking/Refit/GPUTrackingRefit.cxx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ GPUd() static const float* getPar(const GPUTPCGMTrackParam& trk) { return trk.Ge
212212
GPUd() static const float* getPar(const TrackParCov& trk) { return trk.getParams(); }
213213

214214
template <class T, class S>
215-
GPUd() int32_t GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov)
215+
GPUd() int32_t GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov, bool* reachedReferenceOut)
216216
{
217217
CADEBUG(int32_t ii; printf("\nRefitting track\n"));
218218
typename internal::refitTrackTypes<S>::propagator prop;
@@ -392,20 +392,22 @@ GPUd() int32_t GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov
392392
resetCov = false;
393393
nFitted++;
394394
}
395+
bool reachedReference = true;
395396
if constexpr (std::is_same_v<S, GPUTPCGMTrackParam>) {
396397
float alpha = prop.GetAlpha();
397-
trk.MoveToReference(prop, *mPparam, alpha);
398+
reachedReference = trk.MoveToReference(prop, *mPparam, alpha);
398399
trk.NormalizeAlpha(alpha);
399400
prop.SetAlpha(alpha);
400401
} else if constexpr (std::is_same_v<S, TrackParCov>) {
401402
static constexpr float kDeg2Rad = M_PI / 180.f;
402403
static constexpr float kSectAngle = 2 * M_PI / 18.f;
403404
if (mPparam->rec.tpc.trackReferenceX <= 500) {
404-
if (prop->PropagateToXBxByBz(trk, mPparam->rec.tpc.trackReferenceX)) {
405+
reachedReference = prop->PropagateToXBxByBz(trk, mPparam->rec.tpc.trackReferenceX);
406+
if (reachedReference) {
405407
if (CAMath::Abs(trk.getY()) > trk.getX() * CAMath::Tan(kSectAngle / 2.f)) {
406408
float newAlpha = trk.getAlpha() + CAMath::Round(CAMath::ATan2(trk.getY(), trk.getX()) / kDeg2Rad / 20.f) * kSectAngle;
407409
GPUTPCGMTrackParam::NormalizeAlpha(newAlpha);
408-
trk.rotate(newAlpha) && prop->PropagateToXBxByBz(trk, mPparam->rec.tpc.trackReferenceX);
410+
reachedReference = trk.rotate(newAlpha) && prop->PropagateToXBxByBz(trk, mPparam->rec.tpc.trackReferenceX);
409411
}
410412
}
411413
}
@@ -414,16 +416,19 @@ GPUd() int32_t GPUTrackingRefit::RefitTrack(T& trkX, bool outward, bool resetCov
414416
}
415417

416418
convertTrack<T, S, typename internal::refitTrackTypes<S>::propagator>(trkX, trk, prop, &TrackParCovChi2);
419+
if (reachedReferenceOut) {
420+
*reachedReferenceOut = reachedReference;
421+
}
417422
return nFitted;
418423
}
419424

420425
#if !defined(GPUCA_GPUCODE) || defined(GPUCA_GPUCODE_DEVICE) // FIXME: DR: WORKAROUND to avoid CUDA bug creating host symbols for device code.
421-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTPCGMMergedTrack, TrackParCov>(GPUTPCGMMergedTrack& trk, bool outward, bool resetCov);
422-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam>(GPUTPCGMMergedTrack& trk, bool outward, bool resetCov);
423-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<TrackTPC, TrackParCov>(TrackTPC& trk, bool outward, bool resetCov);
424-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<TrackTPC, GPUTPCGMTrackParam>(TrackTPC& trk, bool outward, bool resetCov);
425-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTrackingRefit::TrackParCovWithArgs, TrackParCov>(GPUTrackingRefit::TrackParCovWithArgs& trk, bool outward, bool resetCov);
426-
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMTrackParam>(GPUTrackingRefit::TrackParCovWithArgs& trk, bool outward, bool resetCov);
426+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTPCGMMergedTrack, TrackParCov>(GPUTPCGMMergedTrack& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
427+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam>(GPUTPCGMMergedTrack& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
428+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<TrackTPC, TrackParCov>(TrackTPC& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
429+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<TrackTPC, GPUTPCGMTrackParam>(TrackTPC& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
430+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTrackingRefit::TrackParCovWithArgs, TrackParCov>(GPUTrackingRefit::TrackParCovWithArgs& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
431+
template GPUdni() int32_t GPUTrackingRefit::RefitTrack<GPUTrackingRefit::TrackParCovWithArgs, GPUTPCGMTrackParam>(GPUTrackingRefit::TrackParCovWithArgs& trk, bool outward, bool resetCov, bool* reachedReferenceOut);
427432
#endif
428433

429434
#ifndef GPUCA_GPUCODE

GPU/GPUTracking/Refit/GPUTrackingRefit.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,26 +63,26 @@ class GPUTrackingRefit
6363
void SetTrackHitReferences(const uint32_t* v) { mPtrackHitReferences = v; }
6464
void SetFastTransform(const TPCFastTransformPOD* v) { mPfastTransform = v; }
6565
void SetGPUParam(const GPUParam* v) { mPparam = v; }
66-
GPUd() int32_t RefitTrackAsGPU(GPUTPCGMMergedTrack& trk, bool outward = false, bool resetCov = false) { return RefitTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam>(trk, outward, resetCov); }
67-
GPUd() int32_t RefitTrackAsTrackParCov(GPUTPCGMMergedTrack& trk, bool outward = false, bool resetCov = false) { return RefitTrack<GPUTPCGMMergedTrack, o2::track::TrackParCov>(trk, outward, resetCov); }
68-
GPUd() int32_t RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false) { return RefitTrack<o2::tpc::TrackTPC, GPUTPCGMTrackParam>(trk, outward, resetCov); }
69-
GPUd() int32_t RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false) { return RefitTrack<o2::tpc::TrackTPC, o2::track::TrackParCov>(trk, outward, resetCov); }
66+
GPUd() int32_t RefitTrackAsGPU(GPUTPCGMMergedTrack& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr) { return RefitTrack<GPUTPCGMMergedTrack, GPUTPCGMTrackParam>(trk, outward, resetCov, reachedReferenceOut); }
67+
GPUd() int32_t RefitTrackAsTrackParCov(GPUTPCGMMergedTrack& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr) { return RefitTrack<GPUTPCGMMergedTrack, o2::track::TrackParCov>(trk, outward, resetCov, reachedReferenceOut); }
68+
GPUd() int32_t RefitTrackAsGPU(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr) { return RefitTrack<o2::tpc::TrackTPC, GPUTPCGMTrackParam>(trk, outward, resetCov, reachedReferenceOut); }
69+
GPUd() int32_t RefitTrackAsTrackParCov(o2::tpc::TrackTPC& trk, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr) { return RefitTrack<o2::tpc::TrackTPC, o2::track::TrackParCov>(trk, outward, resetCov, reachedReferenceOut); }
7070

7171
struct TrackParCovWithArgs {
7272
o2::track::TrackParCov& trk;
7373
const o2::tpc::TrackTPCClusRef& clusRef;
7474
float time0;
7575
float* chi2;
7676
};
77-
GPUd() int32_t RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false)
77+
GPUd() int32_t RefitTrackAsGPU(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr)
7878
{
7979
TrackParCovWithArgs x{trk, clusRef, time0, chi2};
80-
return RefitTrack<TrackParCovWithArgs, GPUTPCGMTrackParam>(x, outward, resetCov);
80+
return RefitTrack<TrackParCovWithArgs, GPUTPCGMTrackParam>(x, outward, resetCov, reachedReferenceOut);
8181
}
82-
GPUd() int32_t RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false)
82+
GPUd() int32_t RefitTrackAsTrackParCov(o2::track::TrackParCov& trk, const o2::tpc::TrackTPCClusRef& clusRef, float time0, float* chi2 = nullptr, bool outward = false, bool resetCov = false, bool* reachedReferenceOut = nullptr)
8383
{
8484
TrackParCovWithArgs x{trk, clusRef, time0, chi2};
85-
return RefitTrack<TrackParCovWithArgs, o2::track::TrackParCov>(x, outward, resetCov);
85+
return RefitTrack<TrackParCovWithArgs, o2::track::TrackParCov>(x, outward, resetCov, reachedReferenceOut);
8686
}
8787

8888
bool mIgnoreErrorsOnTrackEnds = true; // Ignore errors during propagation / update at the beginning / end of tracks for int16_t tracks / tracks with high incl. angle
@@ -97,7 +97,7 @@ class GPUTrackingRefit
9797
const TPCFastTransformPOD* mPfastTransform = nullptr; // Ptr to TPC fast transform object helper
9898
const GPUParam* mPparam = nullptr; // Ptr to GPUParam
9999
template <class T, class S>
100-
GPUd() int32_t RefitTrack(T& trk, bool outward, bool resetCov);
100+
GPUd() int32_t RefitTrack(T& trk, bool outward, bool resetCov, bool* reachedReferenceOut = nullptr);
101101
template <class T, class S, class U>
102102
GPUd() void convertTrack(T& trk, const S& trkX, U& prop, float* chi2);
103103
template <class U>

0 commit comments

Comments
 (0)