(ArrayList<Kmer> kmers,
BloomFilterDeBruijnGraph graph,
int maxTipLen,
float minKmerCov)
| 6110 | } |
| 6111 | |
| 6112 | private static ArrayDeque<Kmer> extendLeftSE(ArrayList<Kmer> kmers, |
| 6113 | BloomFilterDeBruijnGraph graph, |
| 6114 | int maxTipLen, |
| 6115 | float minKmerCov) { |
| 6116 | // `kmers` is reversed |
| 6117 | |
| 6118 | final int k = graph.getK(); |
| 6119 | final int numHash = graph.getMaxNumHash(); |
| 6120 | final int readPairedKmersDist = graph.getReadPairedKmerDistance(); |
| 6121 | final int numKmers = kmers.size(); |
| 6122 | int maxExtensionLength = readPairedKmersDist - 2; // -1 for candidate k-mer; -1 for partner kmer on current sequence |
| 6123 | |
| 6124 | ArrayDeque<Kmer> candidates = kmers.get(numKmers-1).getPredecessors(k, numHash, graph); |
| 6125 | |
| 6126 | if (candidates.size() == 1) { |
| 6127 | Kmer c = candidates.peek(); |
| 6128 | ArrayDeque<Kmer> e = naiveExtendLeftNoBackChecks(c, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6129 | e.addFirst(c); |
| 6130 | return e; |
| 6131 | } |
| 6132 | |
| 6133 | final float pathMinCov = getMinimumKmerCoverage(kmers, Math.max(numKmers - readPairedKmersDist, 0), numKmers); |
| 6134 | float bestScore = 0; |
| 6135 | float bestCov = 0; |
| 6136 | ArrayDeque<Kmer> bestExtension = null; |
| 6137 | int[] result = new int[2]; |
| 6138 | |
| 6139 | for (Kmer candidate : candidates) { |
| 6140 | ArrayDeque<Kmer> e = naiveExtendLeftNoBackChecks(candidate, graph, maxTipLen, maxExtensionLength, minKmerCov); |
| 6141 | e.addFirst(candidate); |
| 6142 | |
| 6143 | countKmerPairsReversedSE(e, kmers, 0, graph, result); |
| 6144 | |
| 6145 | int lastPartneredKmerIndex = result[1]; |
| 6146 | |
| 6147 | if (lastPartneredKmerIndex >= 0 && result[0] > 0) { |
| 6148 | float cov = getMedianKmerCoverage(e); |
| 6149 | float score = Math.min(pathMinCov, cov) * result[0] / (lastPartneredKmerIndex+1); |
| 6150 | if (score > bestScore || (score == bestScore && cov > bestCov)) { |
| 6151 | bestScore = score; |
| 6152 | bestCov = cov; |
| 6153 | bestExtension = e; |
| 6154 | |
| 6155 | Iterator<Kmer> itr = e.descendingIterator(); |
| 6156 | for (int i=e.size()-1; i>lastPartneredKmerIndex; --i) { |
| 6157 | itr.next(); |
| 6158 | itr.remove(); |
| 6159 | } |
| 6160 | } |
| 6161 | } |
| 6162 | else { |
| 6163 | int gap = e.size(); |
| 6164 | |
| 6165 | if (gap >= readPairedKmersDist-1 && result[0] == 0) { |
| 6166 | continue; |
| 6167 | } |
| 6168 | |
| 6169 | // not enough supporting paired k-mers in first extension |
no test coverage detected