(ArrayList<Kmer> kmers,
BloomFilterDeBruijnGraph graph,
int maxTipLen,
float minKmerCov)
| 6204 | } |
| 6205 | |
| 6206 | private static ArrayDeque<Kmer> extendRightPE(ArrayList<Kmer> kmers, |
| 6207 | BloomFilterDeBruijnGraph graph, |
| 6208 | int maxTipLen, |
| 6209 | float minKmerCov) { |
| 6210 | final int k = graph.getK(); |
| 6211 | final int numHash = graph.getMaxNumHash(); |
| 6212 | final int readPairedKmersDist = graph.getReadPairedKmerDistance(); |
| 6213 | final int fragPairedKmersDist = graph.getFragPairedKmerDistance(); |
| 6214 | final int numKmers = kmers.size(); |
| 6215 | int maxExtensionLength = fragPairedKmersDist - 2; // -1 for candidate k-mer; -1 for partner kmer on current sequence |
| 6216 | |
| 6217 | ArrayDeque<Kmer> candidates = kmers.get(numKmers-1).getSuccessors(k, numHash, graph); |
| 6218 | |
| 6219 | if (candidates.size() == 1) { |
| 6220 | Kmer c = candidates.peek(); |
| 6221 | ArrayDeque<Kmer> e = naiveExtendRightNoBackChecks(c, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6222 | e.addFirst(c); |
| 6223 | return e; |
| 6224 | } |
| 6225 | |
| 6226 | for (int i=numKmers-1; i>=0; --i) { |
| 6227 | if (graph.isRepeatKmer(kmers.get(i))) { |
| 6228 | --maxExtensionLength; |
| 6229 | } |
| 6230 | else { |
| 6231 | break; |
| 6232 | } |
| 6233 | } |
| 6234 | |
| 6235 | final float pathMinCov = getMinimumKmerCoverage(kmers, Math.max(numKmers - fragPairedKmersDist, 0), numKmers); |
| 6236 | float bestScore = 0; |
| 6237 | float bestCov = 0; |
| 6238 | ArrayDeque<Kmer> bestExtension = null; |
| 6239 | int[] result = new int[3]; |
| 6240 | |
| 6241 | for (Kmer candidate : candidates) { |
| 6242 | ArrayDeque<Kmer> e = naiveExtendRightNoBackChecks(candidate, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6243 | e.addFirst(candidate); |
| 6244 | |
| 6245 | countKmerPairsPE(kmers, e, 0, graph, result); |
| 6246 | |
| 6247 | int lastPartneredKmerIndex = result[2]; |
| 6248 | |
| 6249 | if (lastPartneredKmerIndex >= 0 && result[0] > 0 && result[1] > 0) { |
| 6250 | float cov = getMedianKmerCoverage(e); |
| 6251 | float score = Math.min(pathMinCov, cov) * (result[0] + result[1]) / (lastPartneredKmerIndex+1); |
| 6252 | // System.out.println(score + ": " + graph.assemble(e)); |
| 6253 | if (score > bestScore || (score == bestScore && cov > bestCov)) { |
| 6254 | bestScore = score; |
| 6255 | bestCov = cov; |
| 6256 | bestExtension = e; |
| 6257 | |
| 6258 | Iterator<Kmer> itr = e.descendingIterator(); |
| 6259 | for (int i=e.size()-1; i>lastPartneredKmerIndex; --i) { |
| 6260 | itr.next(); |
| 6261 | itr.remove(); |
| 6262 | } |
| 6263 | } |
no test coverage detected