From e896c9ec05f4f637ad495a82ab6bb466479a70f3 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Wed, 8 Nov 2017 13:22:16 -0500 Subject: [PATCH] r559: prefer a chain involving more segments --- chain.c | 5 +++-- main.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/chain.c b/chain.c index 3cbe89c..8bccb43 100644 --- a/chain.c +++ b/chain.c @@ -49,7 +49,7 @@ mm128_t *mm_chain_dp(int max_dist_x, int max_dist_y, int bw, int max_skip, int m int64_t dr = ri - a[j].x; int32_t dq = qi - (int32_t)a[j].y, dd, sc, log_dd; int32_t sidj = (a[j].y & MM_SEED_SEG_MASK) >> MM_SEED_SEG_SHIFT; - if (dr == 0 || dq <= 0) continue; + if ((sidi == sidj && dr == 0) || dq <= 0) continue; // don't skip if an anchor is used by multiple segments; see below if ((sidi == sidj && dq > max_dist_y) || dq > max_dist_x) continue; dd = dr > dq? dr - dq : dq - dr; if (sidi == sidj && dd > bw) continue; @@ -61,7 +61,8 @@ mm128_t *mm_chain_dp(int max_dist_x, int max_dist_y, int bw, int max_skip, int m int c_log, c_lin; c_lin = (int)(dd * .01 * avg_qspan); c_log = log_dd; - if (dr > dq || sidi != sidj) sc -= c_lin < c_log? c_lin : c_log; + if (sidi != sidj && dr == 0) ++sc; // possibly due to overlapping paired ends; give a minor bonus + else if (dr > dq || sidi != sidj) sc -= c_lin < c_log? c_lin : c_log; else sc -= c_lin + (c_log>>1); } else sc -= (int)(dd * .01 * avg_qspan) + (log_dd>>1); sc += f[j]; diff --git a/main.c b/main.c index fd97297..1c4f19e 100644 --- a/main.c +++ b/main.c @@ -6,7 +6,7 @@ #include "mmpriv.h" #include "getopt.h" -#define MM_VERSION "2.4-r558-dirty" +#define MM_VERSION "2.4-r559-dirty" #ifdef __linux__ #include