From 35d3e064bf6769fb3b5d52c38d041240ccef317d Mon Sep 17 00:00:00 2001 From: Heng Li Date: Fri, 2 Feb 2018 10:35:33 -0500 Subject: [PATCH] r677: reduce the change of missing hits that are close to end of alignments. It is still possible to create examples that fail the heuristic. --- align.c | 18 +++++++++++------- main.c | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/align.c b/align.c index ac005ed..f096bae 100644 --- a/align.c +++ b/align.c @@ -291,33 +291,37 @@ static void mm_filter_bad_seeds(void *km, int as1, int cnt1, mm128_t *a, int min kfree(km, K); } -static void mm_fix_bad_ends(const mm_reg1_t *r, const mm128_t *a, int bw, int32_t *as, int32_t *cnt) +static void mm_fix_bad_ends(const mm_reg1_t *r, const mm128_t *a, int bw, int min_match, int32_t *as, int32_t *cnt) { - int32_t i, l; + int32_t i, l, m; *as = r->as, *cnt = r->cnt; if (r->cnt < 3) return; - l = a[r->as].y >> 32 & 0xff; + m = l = a[r->as].y >> 32 & 0xff; for (i = r->as + 1; i < r->as + r->cnt - 1; ++i) { int32_t lq, lr, min, max; + int32_t q_span = a[i].y >> 32 & 0xff; lr = (int32_t)a[i].x - (int32_t)a[i-1].x; lq = (int32_t)a[i].y - (int32_t)a[i-1].y; min = lr < lq? lr : lq; max = lr > lq? lr : lq; if (max - min > l >> 1) *as = i; l += min; - if (l >= bw << 1) break; + m += min < q_span? min : q_span; + if (l >= bw << 1 || m >= min_match) break; } *cnt = r->as + r->cnt - *as; - l = a[r->as + r->cnt - 1].y >> 32 & 0xff; + m = l = a[r->as + r->cnt - 1].y >> 32 & 0xff; for (i = r->as + r->cnt - 2; i > *as; --i) { int32_t lq, lr, min, max; + int32_t q_span = a[i+1].y >> 32 & 0xff; lr = (int32_t)a[i+1].x - (int32_t)a[i].x; lq = (int32_t)a[i+1].y - (int32_t)a[i].y; min = lr < lq? lr : lq; max = lr > lq? lr : lq; if (max - min > l >> 1) *cnt = i + 1 - *as; l += min; - if (l >= bw) break; + m += min < q_span? min : q_span; + if (l >= bw << 1 || m >= min_match) break; } } @@ -418,7 +422,7 @@ static void mm_align1(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int if (is_splice) { mm_fix_bad_ends_splice(km, opt, mi, r, mat, qlen, qseq0, a, &as1, &cnt1); } else { - mm_fix_bad_ends(r, a, opt->bw, &as1, &cnt1); + mm_fix_bad_ends(r, a, opt->bw, opt->min_chain_score, &as1, &cnt1); } mm_filter_bad_seeds(km, as1, cnt1, a, 10, 40, opt->max_gap>>1, 10); mm_adjust_minier(mi, qseq0, &a[as1], &rs, &qs); diff --git a/main.c b/main.c index f49acf6..f45655f 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ #include "mmpriv.h" #include "getopt.h" -#define MM_VERSION "2.8-r672" +#define MM_VERSION "2.8-r677-dirty" #ifdef __linux__ #include