(ArrayList<Kmer> seqKmers, BloomFilterDeBruijnGraph graph, BloomFilter assembledKmers, int lookahead)
| 8432 | } |
| 8433 | |
| 8434 | public static boolean isTemplateSwitch(ArrayList<Kmer> seqKmers, BloomFilterDeBruijnGraph graph, BloomFilter assembledKmers, int lookahead) { |
| 8435 | int k = graph.getK(); |
| 8436 | int numKmers = seqKmers.size(); |
| 8437 | |
| 8438 | float leftEdgeCov = getMinimumKmerCoverage(seqKmers, 0, Math.min(lookahead, numKmers)); |
| 8439 | float rightEdgeCov = getMinimumKmerCoverage(seqKmers, Math.max(0, numKmers-lookahead), numKmers); |
| 8440 | |
| 8441 | if (assembledKmers.lookup(seqKmers.get(0).getHash()) && |
| 8442 | (!assembledKmers.lookup(seqKmers.get(numKmers-1).getHash()) || leftEdgeCov > rightEdgeCov)) { |
| 8443 | int i = 1; |
| 8444 | for (; i < numKmers; ++i) { |
| 8445 | if (!assembledKmers.lookup(seqKmers.get(i).getHash())) { |
| 8446 | break; |
| 8447 | } |
| 8448 | } |
| 8449 | |
| 8450 | if (i == numKmers) { |
| 8451 | return false; |
| 8452 | } |
| 8453 | |
| 8454 | --i; |
| 8455 | |
| 8456 | String tipRC = reverseComplement(graph.assemble(seqKmers, Math.min(i+k, numKmers-1), numKmers)); |
| 8457 | |
| 8458 | if (i-lookahead >= 0) { |
| 8459 | i -= lookahead; |
| 8460 | } |
| 8461 | |
| 8462 | ArrayDeque<Kmer> leftExtension = greedyExtendLeft(graph, seqKmers.get(0), lookahead, 1000, assembledKmers); |
| 8463 | ArrayDeque<Kmer> rightExtension = greedyExtendRight(graph, seqKmers.get(i), lookahead, 1000, assembledKmers); |
| 8464 | |
| 8465 | leftExtension.addAll(seqKmers.subList(0, i+1)); |
| 8466 | leftExtension.addAll(rightExtension); |
| 8467 | |
| 8468 | String backbone = graph.assemble(leftExtension); |
| 8469 | if (backbone.contains(tipRC)) { |
| 8470 | return true; |
| 8471 | } |
| 8472 | // else { |
| 8473 | // HashSet<Kmer> intersection = new HashSet<>(rightExtension); |
| 8474 | // intersection.retainAll(greedyExtendLeft(graph, graph.getKmer(getFirstKmer(tipRC, k)), lookahead, 1000, assembledKmers)); |
| 8475 | // if (!intersection.isEmpty()) { |
| 8476 | // return true; |
| 8477 | // } |
| 8478 | // |
| 8479 | // intersection = new HashSet<>(leftExtension); |
| 8480 | // intersection.retainAll(greedyExtendRight(graph, graph.getKmer(getLastKmer(tipRC, k)), lookahead, 1000, assembledKmers)); |
| 8481 | // if (!intersection.isEmpty()) { |
| 8482 | // return true; |
| 8483 | // } |
| 8484 | // } |
| 8485 | } |
| 8486 | else if (assembledKmers.lookup(seqKmers.get(numKmers-1).getHash()) && |
| 8487 | (!assembledKmers.lookup(seqKmers.get(0).getHash()) || leftEdgeCov < rightEdgeCov)) { |
| 8488 | int j = numKmers-2; |
| 8489 | for (; j >= 0; --j) { |
| 8490 | if (!assembledKmers.lookup(seqKmers.get(j).getHash())) { |
| 8491 | break; |
nothing calls this directly
no test coverage detected