diff --git a/hit.c b/hit.c index 1bd9683..25d85e5 100644 --- a/hit.c +++ b/hit.c @@ -256,19 +256,25 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec { if (pri_ratio > 0.0f && *n_ > 0) { int i, k, n = *n_, n_2nd = 0; - for (i = k = 0; i < n; ++i) { + uint8_t *keep = (uint8_t*)kmalloc(km, n); + for (i = 0; i < n; ++i) { int p = r[i].parent; + keep[i] = 0; if (p == i || r[i].inv) { // primary or inversion - r[k++] = r[i]; + keep[i] = 1; } else if ((r[i].score >= r[p].score * pri_ratio || r[i].score + min_diff >= r[p].score) && n_2nd < best_n) { if (!(r[i].qs == r[p].qs && r[i].qe == r[p].qe && r[i].rid == r[p].rid && r[i].rs == r[p].rs && r[i].re == r[p].re)) // not identical hits - r[k++] = r[i], ++n_2nd; - else if (r[i].p) free(r[i].p); + keep[i] = 1, ++n_2nd; } else if (check_strand && n_2nd < best_n && r[i].score > min_strand_sc && r[i].rev != r[p].rev) { r[i].strand_retained = 1; - r[k++] = r[i], ++n_2nd; - } else if (r[i].p) free(r[i].p); + keep[i] = 1, ++n_2nd; + } } + for (i = k = 0; i < n; ++i) { + if (keep[i]) r[k++] = r[i]; + else if (r[i].p) free(r[i].p); + } + kfree(km, keep); if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync() *n_ = k; } @@ -277,13 +283,18 @@ void mm_select_sub(void *km, float pri_ratio, int min_diff, int best_n, int chec int mm_filter_strand_retained(int n_regs, mm_reg1_t *r) { int i, k; - for (i = k = 0; i < n_regs; ++i) { + uint8_t *keep = (uint8_t*)malloc(n_regs); + for (i = 0; i < n_regs; ++i) { int p = r[i].parent; - if (!r[i].strand_retained || r[i].div < r[p].div * 5.0f || r[i].div < 0.01f) { + keep[i] = (!r[i].strand_retained || r[i].div < r[p].div * 5.0f || r[i].div < 0.01f); + } + for (i = k = 0; i < n_regs; ++i) { + if (keep[i]) { if (k < i) r[k++] = r[i]; else ++k; } } + free(keep); return k; } diff --git a/minimap.h b/minimap.h index ee92aec..da0a10b 100644 --- a/minimap.h +++ b/minimap.h @@ -5,7 +5,7 @@ #include #include -#define MM_VERSION "2.30-r1298-dirty" +#define MM_VERSION "2.30-r1299-dirty" #define MM_F_NO_DIAG (0x001LL) // no exact diagonal hit #define MM_F_NO_DUAL (0x002LL) // skip pairs where query name is lexicographically larger than target name diff --git a/pe.c b/pe.c index 1591c98..bfd3819 100644 --- a/pe.c +++ b/pe.c @@ -8,7 +8,8 @@ void mm_select_sub_multi(void *km, float pri_ratio, float pri1, float pri2, int if (pri_ratio > 0.0f && *n_ > 0) { int i, k, n = *n_, n_2nd = 0; int max_dist = n_segs == 2? qlens[0] + qlens[1] + max_gap_ref : 0; - for (i = k = 0; i < n; ++i) { + uint8_t *keep = (uint8_t*)kmalloc(km, n); + for (i = 0; i < n; ++i) { int to_keep = 0; if (r[i].parent == i) { // primary to_keep = 1; @@ -34,9 +35,13 @@ void mm_select_sub_multi(void *km, float pri_ratio, float pri1, float pri2, int if (to_keep && r[i].parent != i) { if (n_2nd++ >= best_n) to_keep = 0; // don't keep if there are too many secondary hits } - if (to_keep) r[k++] = r[i]; + keep[i] = to_keep; + } + for (i = k = 0; i < n; ++i) { + if (keep[i]) r[k++] = r[i]; else if (r[i].p) free(r[i].p); } + kfree(km, keep); if (k != n) mm_sync_regs(km, k, r); // removing hits requires sync() *n_ = k; }