@@ -1461,7 +1461,9 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
14611461 if (trbase->PrevSegmentNeighbour () >= 0 ) {
14621462 trbase = nullptr ;
14631463 } else {
1464- trbase->SetPrevSegmentNeighbour (1000000001 );
1464+ if (Param ().rec .enableCyclicGraphWorkarounds ) {
1465+ trbase->SetPrevSegmentNeighbour (1000000001 );
1466+ }
14651467 leg += revertSegments ? 1 : -1 ;
14661468 }
14671469 } else {
@@ -1483,13 +1485,15 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
14831485 }
14841486 revertSegments = false ;
14851487 revertInSegment = false ;
1486- trbase->SetPrevSegmentNeighbour (1000000000 );
1488+ if (Param ().rec .enableCyclicGraphWorkarounds ) {
1489+ trbase->SetPrevSegmentNeighbour (1000000000 );
1490+ }
14871491 int32_t jtr = trbase->NextNeighbour ();
14881492 leg = 0 ;
14891493 if (jtr >= 0 ) {
14901494 int32_t lasttr = itr;
14911495 while (jtr >= 0 ) { // --------------- count segments ---------------
1492- if (&mSectorTrackInfos [jtr] == trbase) {
1496+ if (Param (). rec . enableCyclicGraphWorkarounds && &mSectorTrackInfos [jtr] == trbase) {
14931497 break ; // Break cyclic graph
14941498 }
14951499 lasttr = jtr;
@@ -1512,7 +1516,7 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15121516 mainT = t;
15131517 }
15141518 int32_t next = trchk->NextSegmentNeighbour ();
1515- if (next < 0 || next == ichk) {
1519+ if (next < 0 || ( Param (). rec . enableCyclicGraphWorkarounds && next == ichk) ) {
15161520 break ; // Breaks also cycles
15171521 }
15181522 trchk = &mSectorTrackInfos [next];
@@ -1533,7 +1537,7 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15331537 length = trchk->OrigTrack ()->NHits ();
15341538 }
15351539 int32_t next = trchk->NextSegmentNeighbour ();
1536- if (next < 0 || next == ichk) {
1540+ if (next < 0 || ( Param (). rec . enableCyclicGraphWorkarounds && next == ichk) ) {
15371541 break ; // Breaks also cycles
15381542 }
15391543 trchk = &mSectorTrackInfos [next];
@@ -1575,7 +1579,9 @@ GPUd() void GPUTPCGMMerger::CollectMergedTracks(int32_t nBlocks, int32_t nThread
15751579 int32_t jtr = tr->NextSegmentNeighbour ();
15761580 if (jtr >= 0 ) {
15771581 tr = &(mSectorTrackInfos [jtr]);
1578- tr->SetPrevSegmentNeighbour (1000000002 );
1582+ if (Param ().rec .enableCyclicGraphWorkarounds ) {
1583+ tr->SetPrevSegmentNeighbour (1000000002 );
1584+ }
15791585 continue ;
15801586 }
15811587 break ;
@@ -1797,7 +1803,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
17971803 CAMath::AtomicAdd (&mSharedCount [mClusters [trk.FirstClusterRef () + j].num ], 1u );
17981804 }
17991805 if (!trk.CCE () && !trk.MergedLooper ()) {
1800- GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment (mMergedTracks );
1806+ GPUTPCGMMergedTrack* updTrk = trk.GetFirstSegment (mMergedTracks , Param (). rec . enableCyclicGraphWorkarounds );
18011807 const auto &cl0 = mClusters [trk.FirstClusterRef ()], &cln = mClusters [updTrk->FirstClusterRef () + updTrk->NClusters () - 1 ];
18021808 const auto & GPUrestrict () cls = GetConstantMem ()->ioPtrs .clustersNative ->clustersLinear ;
18031809 float z0 = cls[cl0.num ].getTime (), zn = cls[cln.num ].getTime ();
@@ -1806,7 +1812,7 @@ GPUd() void GPUTPCGMMerger::PrepareForFit1(int32_t nBlocks, int32_t nThreads, in
18061812 updTrk = &trk;
18071813 while (updTrk->PrevSegment () >= 0 ) {
18081814 auto next = &mMergedTracks [updTrk->PrevSegment ()];
1809- if (next == &trk) {
1815+ if (Param (). rec . enableCyclicGraphWorkarounds && next == &trk) {
18101816 break ;
18111817 }
18121818 updTrk = next;
@@ -1966,7 +1972,7 @@ GPUd() void GPUTPCGMMerger::MergeLoopersMain(int32_t nBlocks, int32_t nThreads,
19661972 const GPUTPCGMMergedTrack* trkI = &mMergedTracks [candidates[i].id ];
19671973 float refZI = candidates[i].refz ;
19681974 {
1969- const auto * tmp = trkI->GetFirstSegment (mMergedTracks );
1975+ const auto * tmp = trkI->GetFirstSegment (mMergedTracks , Param (). rec . enableCyclicGraphWorkarounds );
19701976 if (tmp != trkI && tmp->CSide () == trkI->CSide () && CAMath::Abs (tmp->GetParam ().GetZ ()) > CAMath::Abs (trkI->GetParam ().GetZ ())) {
19711977 float tmpRefZ = refZI + tmp->GetParam ().GetZ () - trkI->GetParam ().GetZ ();
19721978 if (CAMath::Abs (tmpRefZ) < CAMath::Abs (candidates[j].refz ) && CAMath::Abs (tmpRefZ) > CAMath::Abs (refZI)) {
0 commit comments