(ArrayList<Kmer> kmers,
BloomFilterDeBruijnGraph graph,
int maxTipLength,
float minKmerCov)
| 6565 | } |
| 6566 | |
| 6567 | public static int[] extendPE(ArrayList<Kmer> kmers, |
| 6568 | BloomFilterDeBruijnGraph graph, |
| 6569 | int maxTipLength, |
| 6570 | float minKmerCov) { |
| 6571 | final int d = graph.getFragPairedKmerDistance(); |
| 6572 | final float multiplier = 0.1f; |
| 6573 | |
| 6574 | int origLen = kmers.size(); |
| 6575 | |
| 6576 | HashSet<Kmer> usedKmers = new HashSet<>(kmers); |
| 6577 | |
| 6578 | Collections.reverse(kmers); |
| 6579 | |
| 6580 | while (true) { |
| 6581 | float covThreshold = getMinimumKmerCoverage(kmers, Math.max(0, kmers.size()-d), kmers.size()); |
| 6582 | |
| 6583 | ArrayDeque<Kmer> e = null; |
| 6584 | |
| 6585 | while (true) { |
| 6586 | covThreshold = Math.max(minKmerCov, covThreshold * multiplier); |
| 6587 | |
| 6588 | e = extendLeftPE(kmers, graph, maxTipLength, covThreshold); |
| 6589 | |
| 6590 | if ((e != null && !e.isEmpty()) || covThreshold == minKmerCov) { |
| 6591 | break; |
| 6592 | } |
| 6593 | } |
| 6594 | |
| 6595 | if (e == null || e.isEmpty()) { |
| 6596 | break; |
| 6597 | } |
| 6598 | |
| 6599 | Iterator<Kmer> itr = e.iterator(); |
| 6600 | boolean used = true; |
| 6601 | |
| 6602 | while (itr.hasNext() && used) { |
| 6603 | Kmer kmer = itr.next(); |
| 6604 | |
| 6605 | if (!usedKmers.contains(kmer)) { |
| 6606 | used = false; |
| 6607 | } |
| 6608 | } |
| 6609 | |
| 6610 | int endIndex = Math.max(0, kmers.size()-d+e.size()); |
| 6611 | for (int i=kmers.size()-1; i>=endIndex && used; --i) { |
| 6612 | Kmer kmer = kmers.get(i); |
| 6613 | |
| 6614 | if (!usedKmers.contains(kmer)) { |
| 6615 | used = false; |
| 6616 | } |
| 6617 | } |
| 6618 | |
| 6619 | if (used && (kmers.size() < d || hasDuplicatedKmerPair(kmers, e.getLast(), d, kmers.size()-1-d+e.size()))) { |
| 6620 | break; |
| 6621 | } |
| 6622 | |
| 6623 | kmers.addAll(e); |
| 6624 | usedKmers.addAll(e); |
no test coverage detected