DNALength Locate(DNALength bwtPos) { DNALength seqPos; DNALength offset = 0; while (1) { if (pos.Lookup(bwtPos, seqPos)) { break; } else { DNALength bwtPrevPos; bwtPrevPos = LFBacktrack(bwtPos); if (useDebugData) { assert(saCopy[bwtPos-1] - 1 == saCopy[bwtPrevPos-1]); } bwtPos = bwtPrevPos; assert(bwtPos <= bwtSequence.length); /* * Boundary condition at the beginning of the bwt string. */ if (bwtPos == firstCharPos) { seqPos = 1; break; } } ++offset; } return seqPos + offset; }