(ArrayList<Kmer> kmers,
BloomFilterDeBruijnGraph graph,
int maxTipLen,
float minKmerCov)
| 6309 | } |
| 6310 | |
| 6311 | private static ArrayDeque<Kmer> extendLeftPE(ArrayList<Kmer> kmers, |
| 6312 | BloomFilterDeBruijnGraph graph, |
| 6313 | int maxTipLen, |
| 6314 | float minKmerCov) { |
| 6315 | // `kmers` is reversed |
| 6316 | |
| 6317 | final int k = graph.getK(); |
| 6318 | final int numHash = graph.getMaxNumHash(); |
| 6319 | final int readPairedKmersDist = graph.getReadPairedKmerDistance(); |
| 6320 | final int fragPairedKmersDist = graph.getFragPairedKmerDistance(); |
| 6321 | final int numKmers = kmers.size(); |
| 6322 | int maxExtensionLength = fragPairedKmersDist - 2; // -1 for candidate k-mer; -1 for partner kmer on current sequence |
| 6323 | |
| 6324 | ArrayDeque<Kmer> candidates = kmers.get(numKmers-1).getPredecessors(k, numHash, graph); |
| 6325 | |
| 6326 | if (candidates.size() == 1) { |
| 6327 | Kmer c = candidates.peek(); |
| 6328 | ArrayDeque<Kmer> e = naiveExtendLeftNoBackChecks(c, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6329 | e.addFirst(c); |
| 6330 | return e; |
| 6331 | } |
| 6332 | |
| 6333 | for (int i=numKmers-1; i>=0; --i) { |
| 6334 | if (graph.isRepeatKmer(kmers.get(i))) { |
| 6335 | --maxExtensionLength; |
| 6336 | } |
| 6337 | else { |
| 6338 | break; |
| 6339 | } |
| 6340 | } |
| 6341 | |
| 6342 | final float pathMinCov = getMinimumKmerCoverage(kmers, Math.max(numKmers - fragPairedKmersDist, 0), numKmers); |
| 6343 | float bestScore = 0; |
| 6344 | float bestCov = 0; |
| 6345 | ArrayDeque<Kmer> bestExtension = null; |
| 6346 | int[] result = new int[3]; |
| 6347 | |
| 6348 | for (Kmer candidate : candidates) { |
| 6349 | ArrayDeque<Kmer> e = naiveExtendLeftNoBackChecks(candidate, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6350 | e.addFirst(candidate); |
| 6351 | |
| 6352 | countKmerPairsReversedPE(e, kmers, 0, graph, result); |
| 6353 | |
| 6354 | int lastPartneredKmerIndex = result[2]; |
| 6355 | |
| 6356 | if (lastPartneredKmerIndex >= 0 && result[0] > 0 && result[1] > 0) { |
| 6357 | float cov = getMedianKmerCoverage(e); |
| 6358 | float score = Math.min(pathMinCov, cov) * (result[0] + result[1]) / (lastPartneredKmerIndex+1); |
| 6359 | if (score > bestScore || (score == bestScore && cov > bestCov)) { |
| 6360 | bestScore = score; |
| 6361 | bestCov = cov; |
| 6362 | bestExtension = e; |
| 6363 | |
| 6364 | Iterator<Kmer> itr = e.descendingIterator(); |
| 6365 | for (int i=e.size()-1; i>lastPartneredKmerIndex; --i) { |
| 6366 | itr.next(); |
| 6367 | itr.remove(); |
| 6368 | } |
no test coverage detected