private void removeOverlap(List<ClusteredResult> clusteredResultList) { Collections.sort(clusteredResultList); Collections.reverse(clusteredResultList); for (int i = clusteredResultList.size() - 1; i >= 1; i--) { for (int j = i - 1; j >= 0; j--) for (OptMapResultNode result1 : clusteredResultList.get(i).updatedResult) for (OptMapResultNode result2 : clusteredResultList.get(j).updatedResult) if (result1.overlap(result2)) { clusteredResultList.remove(i); break; } } }
/** * Check if two partial maps can be connected. Trimming is done on overlapping partial maps * * <p>It is essential to use trimming. Yet, there are two drawbacks using trimming 1. Trimming is * expensive. 2. Trimming may lead to inappropriate results (This is done by validation using * trimear) * * @param optrefmap * @param maxTrim * @param result1 * @param result2 * @param vmProcessor * @param ear * @return */ private TrimResult trimOverlap( LinkedHashMap<String, DataNode> optrefmap, OptMapResultNode[] trim1Result, OptMapResultNode[] trim2Result, PathBuilderFilter pbFilter, VirtualMapProcessor vmProcessor) { int penalty = vmProcessor.calcBasicPenalty(trim1Result[0], trim2Result[0]); double bestscore = Double.NEGATIVE_INFINITY; int bestTrim1 = -1; int bestTrim2 = -1; boolean[][] trimPair = new boolean[maxTrim + 1][maxTrim + 1]; // temp increasing maxTrim greatly: // 1. if the two score addition is already lower than any one of the score, discard // 2. maxTrim for (int trimmed = 0; trimmed <= maxTrim; trimmed++) { for (int trim1 = 0; trim1 <= trimmed; trim1++) { int trim2 = trimmed - trim1; if (trimPair[trim1][trim2]) // this trim pair should no longer be done continue; if ((trim1Result[0].cigar.getMatch() - trim1 >= minMatch) && (trim2Result[0].cigar.getMatch() - trim2 >= minMatch)) { OptMapResultNode tresult1 = trim1Result[trim1]; OptMapResultNode tresult2 = trim2Result[trim2]; // trim1Result[trim1 - 1] must exist if (tresult1 == null) { tresult1 = new OptMapResultNode(trim1Result[trim1 - 1]); tresult1.trimResult(-1 * trim1Result[trim1 - 1].mappedstrand, optrefmap); tresult1.updateScore(optrefmap, match, fpp, fnp); trim1Result[trim1] = tresult1; } if (tresult2 == null) { tresult2 = new OptMapResultNode(trim2Result[trim2 - 1]); tresult2.trimResult(1 * trim2Result[trim2 - 1].mappedstrand, optrefmap); tresult2.updateScore(optrefmap, match, fpp, fnp); trim2Result[trim2] = tresult2; } boolean withinTrimear = true; withinTrimear = Math.abs(tresult1.getMapScale() - 1) < trimear && Math.abs(tresult2.getMapScale() - 1) < trimear; boolean removeLaterTrim = false; if (pbFilter.checkPass(tresult1, tresult2)) { if (withinTrimear && !tresult1.overlap(tresult2)) { if (tresult1.mappedscore + tresult2.mappedscore - vmProcessor.calcPenalty(tresult1, tresult2) > bestscore) { bestscore = tresult1.mappedscore + tresult2.mappedscore - vmProcessor.calcPenalty(tresult1, tresult2); bestTrim1 = trim1; bestTrim2 = trim2; } removeLaterTrim = true; } else if (withinTrimear && tresult1.mappedscore + tresult2.mappedscore - penalty < bestscore) // We could not calcPenalty directly when // tresult1.overlap(tresult2) removeLaterTrim = true; } else removeLaterTrim = true; if (removeLaterTrim) for (int i = trim1; i <= maxTrim; i++) for (int j = trim2; j <= maxTrim; j++) trimPair[i][j] = true; } } } if (bestTrim1 == -1) return TrimResult.FailedTrimResult(); else return TrimResult.SuccessfulTrimResult(trim1Result[bestTrim1], trim2Result[bestTrim2]); }