int Ladder :: MergeThisLadderInto (Ladder* ladder) { list <Locus*>::const_iterator locusIterator; Locus* nextLocus; Locus* prevLocus = NULL; double prevMax; double nextMin; double nextOriginal; double prevOriginal; for (locusIterator = mLocusList.begin(); locusIterator != mLocusList.end(); locusIterator++) { nextLocus = *locusIterator; ladder->MergeLocusIntoLadder (nextLocus); } // To do: test that search regions do not overlap neighboring loci for (locusIterator = mLocusList.begin(); locusIterator != mLocusList.end(); locusIterator++) { nextLocus = *locusIterator; if (prevLocus == NULL) { prevLocus = nextLocus; continue; } if (nextLocus->GetChannel () != prevLocus->GetChannel ()) { prevLocus = nextLocus; continue; } prevMax = prevLocus->GetMaxSearchILSBP (); nextMin = nextLocus->GetMinSearchILSBP (); if (prevMax <= nextMin) { prevLocus = nextLocus; continue; } nextOriginal = nextLocus->GetOriginalMinSearchILSBP () - 0.55; prevOriginal = prevLocus->GetOriginalMaxSearchILSBP () + 0.55; if (prevOriginal > nextOriginal) prevOriginal = nextOriginal = 0.5 * (prevOriginal + nextOriginal); if (prevMax >= nextOriginal) prevLocus->SetMaxSearhILSBP (nextOriginal); if (nextMin <= prevOriginal) nextLocus->SetMinSearhILSBP (prevOriginal); prevLocus = nextLocus; } return 0; }