@@ -1212,9 +1212,10 @@ void TrackFinder::removeConnectedTracks(int stMin, int stMax)
12121212 int chMax = 2 * stMax + 1 ;
12131213 int nPlane = 2 * (chMax - chMin + 1 );
12141214
1215- // first loop to fill the arrays of cluster Ids and number of fired chambers
1215+ // first loop to fill the arrays of cluster Ids, number of fired chambers and normalized chi2
12161216 std::vector<uint32_t > ClIds (nPlane * mTracks .size ());
12171217 std::vector<uint8_t > nFiredCh (mTracks .size ());
1218+ std::vector<double > nChi2 (mTracks .size ());
12181219 int previousCh (-1 );
12191220 int iTrack (0 );
12201221 for (auto itTrack = mTracks .begin (); itTrack != mTracks .end (); ++itTrack, ++iTrack) {
@@ -1228,23 +1229,22 @@ void TrackFinder::removeConnectedTracks(int stMin, int stMax)
12281229 ClIds[nPlane * iTrack + 2 * (ch - chMin) + itParam->getClusterPtr ()->getDEId () % 2 ] = itParam->getClusterPtr ()->uid ;
12291230 }
12301231 }
1232+ nChi2[iTrack] = itTrack->first ().getTrackChi2 () / (itTrack->getNDF () - 1 );
12311233 }
12321234
12331235 // second loop to tag the tracks to remove
1234- int iTrack1 = mTracks .size () - 1 ;
1236+ std::vector< bool > remove ( mTracks .size (), false ) ;
12351237 int iindex = ClIds.size () - 1 ;
1236- for (auto itTrack1 = mTracks .rbegin (); itTrack1 != mTracks .rend (); ++itTrack1, iindex -= nPlane, --iTrack1) {
1237- int iTrack2 = iTrack1 - 1 ;
1238+ for (int iTrack1 = mTracks .size () - 1 ; iTrack1 > -1 ; --iTrack1, iindex -= nPlane) {
12381239 int jindex = iindex - nPlane;
1239- for (auto itTrack2 = std::next (itTrack1); itTrack2 != mTracks . rend (); ++itTrack2, --iTrack2) {
1240+ for (int iTrack2 = iTrack1 - 1 ; iTrack2 > - 1 ; --iTrack2) {
12401241 for (int iPlane = nPlane; iPlane > 0 ; --iPlane) {
1241- if (ClIds[iindex] > 0 && ClIds[iindex] == ClIds[jindex]) {
1242- if ((nFiredCh[iTrack2] > nFiredCh[iTrack1]) ||
1243- ((nFiredCh[iTrack2] == nFiredCh[iTrack1]) &&
1244- (itTrack2->first ().getTrackChi2 () / (itTrack2->getNDF () - 1 ) < itTrack1->first ().getTrackChi2 () / (itTrack1->getNDF () - 1 )))) {
1245- itTrack1->connected ();
1242+ if (ClIds[iindex] == ClIds[jindex] && ClIds[iindex] > 0 ) {
1243+ if (nFiredCh[iTrack2] > nFiredCh[iTrack1] ||
1244+ (nFiredCh[iTrack2] == nFiredCh[iTrack1] && nChi2[iTrack2] < nChi2[iTrack1])) {
1245+ remove[iTrack1] = true ;
12461246 } else {
1247- itTrack2-> connected () ;
1247+ remove[iTrack2] = true ;
12481248 }
12491249 iindex -= iPlane;
12501250 jindex -= iPlane;
@@ -1258,8 +1258,9 @@ void TrackFinder::removeConnectedTracks(int stMin, int stMax)
12581258 }
12591259
12601260 // third loop to remove them. That way all combinations are tested.
1261- for (auto itTrack = mTracks .begin (); itTrack != mTracks .end ();) {
1262- if (itTrack->isConnected ()) {
1261+ iTrack = 0 ;
1262+ for (auto itTrack = mTracks .begin (); itTrack != mTracks .end (); ++iTrack) {
1263+ if (remove[iTrack]) {
12631264 print (" removeConnectedTracks: removing candidate at position #" , getTrackIndex (itTrack));
12641265 itTrack = mTracks .erase (itTrack);
12651266 } else {
0 commit comments