4747using namespace o2 ::gpu;
4848using namespace o2 ::tpc;
4949
50- GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict () merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track)
50+ GPUd () bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict () merger, int32_t iTrk, GPUTPCGMMergedTrackHit* GPUrestrict() clusters, int32_t& GPUrestrict() N, int32_t& GPUrestrict() NTolerated, float& GPUrestrict() Alpha, float maxSinPhi, GPUTPCGMMergedTrack& GPUrestrict() track, bool rebuilt )
5151{
5252 static constexpr float kDeg2Rad = M_PI / 180 .f ;
5353 CADEBUG (static constexpr float kSectAngle = 2 * M_PI / 18 .f );
@@ -60,7 +60,7 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
6060 prop.SetMaterialTPC ();
6161 prop.SetPolynomialField (¶m.polynomialField );
6262 prop.SetMaxSinPhi (maxSinPhi);
63- if (param.rec .tpc .mergerInterpolateErrors ) {
63+ if (param.rec .tpc .mergerInterpolateErrors && !rebuilt ) {
6464 for (int32_t i = 0 ; i < N; i++) {
6565 interpolation.hit [i].errorY = -1 ;
6666 }
@@ -70,12 +70,9 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
7070 const int32_t maxN = N;
7171 int32_t ihitStart = 0 ;
7272 float covYYUpd = 0 .f ;
73- float lastUpdateX = -1 .f ;
74- uint8_t lastRow = 255 ;
75- uint8_t lastSector = 255 ;
7673 float deltaZ = 0 .f ;
7774
78- for (int32_t iWay = 0 ; iWay < nWays; iWay++) {
75+ for (int32_t iWay = rebuilt ? nWays - 1 : 0 ; iWay < nWays; iWay++) { // DR: Unrolling has no performance improvement on GPU, why?
7976 int32_t nMissed = 0 , nMissed2 = 0 ;
8077 float sumInvSqrtCharge = 0 .f ;
8178 int32_t nAvgCharge = 0 ;
@@ -95,12 +92,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
9592 prop.SetFitInProjections (true ); // param.rec.fitInProjections == -1 ? (iWay == 0) : param.rec.fitInProjections); // TODO: Reenable once fixed
9693 prop.SetPropagateBzOnly (param.rec .fitPropagateBzOnly == -1 ? !finalFit : param.rec .fitPropagateBzOnly );
9794 prop.SetMatLUT ((param.rec .useMatLUT && finalFit) ? merger->GetConstantMem ()->calibObjects .matLUT : nullptr );
98- prop.SetTrack (this , iWay ? prop.GetAlpha () : Alpha);
95+ prop.SetTrack (this , iWay && !rebuilt ? prop.GetAlpha () : Alpha);
9996 ConstrainSinPhi (iWay == 0 ? 0 .95f : constants::MAX_SIN_PHI_LOW);
10097 CADEBUG (printf (" Fitting track %d way %d (sector %d, alpha %f) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n " , iTrk, iWay, CAMath::Float2IntRn (prop.GetAlpha () / kSectAngle ) + (mP [1 ] < 0 ? 18 : 0 ), prop.GetAlpha ()));
10198
10299 N = 0 ;
103- lastUpdateX = -1 ;
100+ uint8_t lastRow = 255 ;
101+ uint8_t lastSector = 255 ;
102+ float lastUpdateX = -1 ;
104103 const bool inFlyDirection = iWay & 1 ;
105104 const int32_t wayDirection = (iWay & 1 ) ? -1 : 1 ;
106105
@@ -110,9 +109,12 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
110109 lastSector = clusters[ihit].sector ;
111110 }
112111
113- if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) {
112+ if ((param.rec .tpc .trackFitRejectMode > 0 && nMissed >= param.rec .tpc .trackFitRejectMode ) || nMissed2 >= param.rec .tpc .trackFitMaxRowMissedHard || ( clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject) || (rebuilt && (clusters[ihit]. state & GPUTPCGMMergedTrackHit::flagHighIncl)) ) {
114113 CADEBUG (printf (" \t Skipping hit %d, %d hits rejected, flag %X\n " , ihit, nMissed, (int32_t )clusters[ihit].state ));
115- if (finalOutInFit && !(clusters[ihit].state & GPUTPCGMMergedTrackHit::flagReject)) {
114+ if (rebuilt && (clusters[ihit].state & GPUTPCGMMergedTrackHit::flagHighIncl)) {
115+ NTolerated++;
116+ }
117+ if (finalOutInFit && !(clusters[ihit].state & (GPUTPCGMMergedTrackHit::flagReject | GPUTPCGMMergedTrackHit::flagHighIncl))) {
116118 clusters[ihit].state |= GPUTPCGMMergedTrackHit::flagRejectErr;
117119 }
118120 continue ;
@@ -327,6 +329,14 @@ GPUd() bool GPUTPCGMTrackParam::Fit(GPUTPCGMMerger* GPUrestrict() merger, int32_
327329 } else {
328330 deltaZ = 0 .f ;
329331 }
332+
333+ if (param.rec .tpc .rebuildTrackInFit && iWay == nWays - 2 ) {
334+ Alpha = prop.GetAlpha ();
335+ if (ihitStart != 0 ) {
336+ MarkClusters (clusters, 0 , ihitStart - 1 , 1 , GPUTPCGMMergedTrackHit::flagHighIncl);
337+ }
338+ return true ;
339+ }
330340 }
331341 ConstrainSinPhi ();
332342
@@ -894,7 +904,7 @@ GPUd() bool GPUTPCGMTrackParam::CheckNumericalQuality(float overrideCovYY) const
894904 return ok;
895905}
896906
897- GPUdii () void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict () track, int32_t iTrk, GPUTPCGMMerger* GPUrestrict() merger) // VS: GPUd changed to GPUdii. No change in output and no performance penalty.
907+ GPUdii () void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict () track, int32_t iTrk, GPUTPCGMMerger* GPUrestrict() merger, bool rebuilt ) // VS: GPUd changed to GPUdii. No change in output and no performance penalty.
898908{
899909 if (!track.OK ()) {
900910 return ;
@@ -908,21 +918,21 @@ GPUdii() void GPUTPCGMTrackParam::RefitTrack(GPUTPCGMMergedTrack& GPUrestrict()
908918 int32_t NTolerated = 0 ; // Clusters not fit but tollerated for track length cut
909919 GPUTPCGMTrackParam t = track.Param ();
910920 float Alpha = track.Alpha ();
911- CADEBUG (int32_t nTrackHitsOld = nTrackHits; float ptOld = t.QPt ());
912- bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, constants::MAX_SIN_PHI, track);
913- CADEBUG (printf (" Finished Fit Track %d\n " , iTrk));
914- 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)));
921+ bool ok = t.Fit (merger, iTrk, merger->Clusters () + track.FirstClusterRef (), nTrackHits, NTolerated, Alpha, constants::MAX_SIN_PHI, track, rebuilt);
922+ CADEBUG (if (!merger->Param ().rec .tpc .rebuildTrackInFit || rebuilt) printf (" Finished Fit Track %7d --- OUTPUT hits %d -> %d+%d = %d, QPt %f -> %f, SP %f, OK %d chi2 %f chi2ndf %f\n " , iTrk, track.NClusters (), nTrackHits, NTolerated, nTrackHits + NTolerated, track.GetParam ().GetQPt (), t.QPt (), t.SinPhi (), (int32_t )ok, t.Chi2 (), t.Chi2 () / CAMath::Max (1 , nTrackHits)));
915923
916924 if (CAMath::Abs (t.QPt ()) < 1 .e -4f ) {
917- t.QPt () = 1 .e -4f ;
925+ t.QPt () = CAMath::Copysign ( 1 .e -4f , t. QPt ()) ;
918926 }
919927
920928 CADEBUG (if (t.GetX () > 250 ) { printf (" ERROR, Track %d at impossible X %f, Pt %f, Looper %d\n " , iTrk, t.GetX (), CAMath::Abs (1 .f / t.QPt ()), (int32_t )merger->MergedTracks ()[iTrk].Looper ()); });
921929
922930 track.SetOK (ok);
923- track.SetNClustersFitted (nTrackHits);
924931 track.Param () = t;
925932 track.Alpha () = Alpha;
933+ if (!merger->Param ().rec .tpc .rebuildTrackInFit || rebuilt) {
934+ track.SetNClustersFitted (nTrackHits);
935+ }
926936
927937 // if (track.OK()) merger->DebugRefitMergedTrack(track);
928938}
0 commit comments