From de54c9dac2f8afaca4bb9d0facf8fddf43adf7c4 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Mon, 26 Jun 2017 13:56:25 -0400 Subject: [PATCH] r77: fixed an index loading bug (offset not set) --- align.c | 24 +++++++++++++++--------- chain.c | 2 +- index.c | 1 + main.c | 2 +- map.c | 2 +- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/align.c b/align.c index 684aca6..0fb3e6e 100644 --- a/align.c +++ b/align.c @@ -170,9 +170,11 @@ static void mm_align1(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int mm_seq_rev(qs - qs0, qseq); mm_seq_rev(rs - rs0, tseq); ksw_extz2_sse(km, qs - qs0, qseq, rs - rs0, tseq, 5, mat, opt->q, opt->e, bw, opt->zdrop, KSW_EZ_EXTZ_ONLY|KSW_EZ_RIGHT|KSW_EZ_REV_CIGAR, ez); - mm_append_cigar(r, ez->n_cigar, ez->cigar); - mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 1); - r->p->score += ez->max; + if (ez->n_cigar > 0) { + mm_append_cigar(r, ez->n_cigar, ez->cigar); + mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 1); + r->p->score += ez->max; + } rs1 = rs - (ez->max_t + 1); qs1 = qs - (ez->max_q + 1); mm_seq_rev(qs - qs0, qseq); @@ -185,8 +187,10 @@ static void mm_align1(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int qseq = &qseq0[rev][qs]; mm_idx_getseq(mi, rid, rs, re, tseq); ksw_extz2_sse(km, qe - qs, qseq, re - rs, tseq, 5, mat, opt->q, opt->e, bw, opt->zdrop, 0, ez); - mm_append_cigar(r, ez->n_cigar, ez->cigar); - mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 0); + if (ez->n_cigar > 0) { + mm_append_cigar(r, ez->n_cigar, ez->cigar); + mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 0); + } if (ez->score == KSW_NEG_INF) { // truncated by Z-drop int j; for (j = i - 1; j >= 0; --j) @@ -197,7 +201,7 @@ static void mm_align1(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int qe1 = qe + (ez->max_q + 1); mm_reg_split(r, r2, j + 1, qlen, a); break; - } else { + } else { // FIXME: in rare cases, r->p can be NULL, which leads to a segfault r->p->score += ez->score; } rs = re, qs = qe; @@ -208,9 +212,11 @@ static void mm_align1(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int qseq = &qseq0[rev][qe]; mm_idx_getseq(mi, rid, re, re0, tseq); ksw_extz2_sse(km, qe0 - qe, qseq, re0 - re, tseq, 5, mat, opt->q, opt->e, bw, opt->zdrop, KSW_EZ_EXTZ_ONLY, ez); - mm_append_cigar(r, ez->n_cigar, ez->cigar); - mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 0); - r->p->score += ez->max; + if (ez->n_cigar > 0) { + mm_append_cigar(r, ez->n_cigar, ez->cigar); + mm_update_extra(r->p, qseq, tseq, ez->n_cigar, ez->cigar, 0); + r->p->score += ez->max; + } re1 = re + (ez->max_t + 1); qe1 = qe + (ez->max_q + 1); } else if (r2->cnt == 0) { diff --git a/chain.c b/chain.c index a39f9ba..a6357e2 100644 --- a/chain.c +++ b/chain.c @@ -40,7 +40,7 @@ int mm_chain_dp(int max_dist, int bw, int max_skip, int min_sc, int n, mm128_t * for (j = i - 1; j >= st; --j) { int64_t dr = ri - a[j].x; int32_t dq = qi - (int32_t)a[j].y, dd, sc; - if (dq <= 0 || dq > max_dist) continue; + if (dr == 0 || dq <= 0 || dq > max_dist) continue; if (t[j] == i) { if (p[j] >= 0) t[p[j]] = i; if (++n_skip > max_skip) break; diff --git a/index.c b/index.c index 6a97718..426f7a9 100644 --- a/index.c +++ b/index.c @@ -371,6 +371,7 @@ mm_idx_t *mm_idx_load(FILE *fp) fread(s->name, 1, l, fp); s->name[l] = 0; fread(&s->len, 4, 1, fp); + s->offset = sum_len; sum_len += s->len; } for (i = 0; i < 1<b; ++i) { diff --git a/main.c b/main.c index 632ccfa..adf3232 100644 --- a/main.c +++ b/main.c @@ -10,7 +10,7 @@ #include "minimap.h" #include "mmpriv.h" -#define MM_VERSION "2.0-r76-pre" +#define MM_VERSION "2.0-r77-pre" void liftrlimit() { diff --git a/map.c b/map.c index 6200646..3ffaee0 100644 --- a/map.c +++ b/map.c @@ -55,7 +55,7 @@ mm_tbuf_t *mm_tbuf_init(void) { mm_tbuf_t *b; b = (mm_tbuf_t*)calloc(1, sizeof(mm_tbuf_t)); - b->km = km_init(); +// b->km = km_init(); b->sdb = sdust_buf_init(b->km); return b; }