diff --git a/main.c b/main.c index 14aa691..0282997 100644 --- a/main.c +++ b/main.c @@ -69,6 +69,8 @@ static ko_longopt_t long_options[] = { { "sam-hit-only", ko_no_argument, 342 }, { "idx-min-occ", ko_required_argument, 343 }, { "idx-max-occ", ko_required_argument, 344 }, + { "flt-max-dv", ko_required_argument, 345 }, + { "flt-min-blen", ko_required_argument, 346 }, { "help", ko_no_argument, 'h' }, { "max-intron-len", ko_required_argument, 'G' }, { "version", ko_no_argument, 'V' }, @@ -214,6 +216,8 @@ int main(int argc, char *argv[]) else if (c == 342) opt.flag |= MM_F_SAM_HIT_ONLY; // --sam-hit-only else if (c == 343) ipt.min_occ = mm_parse_num(o.arg); // --idx-min-occ else if (c == 344) ipt.max_occ = mm_parse_num(o.arg); // --idx-max-occ + else if (c == 345) opt.flt_max_dv = atof(o.arg); // --flt-max-dv + else if (c == 346) opt.flt_min_blen = mm_parse_num(o.arg); // --flt-min-blen else if (c == 314) { // --frag yes_or_no(&opt, MM_F_FRAG_MODE, o.longidx, o.arg, 1); } else if (c == 315) { // --secondary diff --git a/map.c b/map.c index 58e74fc..699ad11 100644 --- a/map.c +++ b/map.c @@ -351,6 +351,15 @@ void mm_map_frag(const mm_idx_t *mi, int n_segs, const int *qlens, const char ** chain_post(opt, max_chain_gap_ref, mi, b->km, qlen_sum, n_segs, qlens, &n_regs0, regs0, a); if (!is_sr) mm_est_err(mi, qlen_sum, n_regs0, regs0, a, n_mini_pos, mini_pos); + if (!is_sr && n_segs == 1) { + for (i = j = 0; i < n_regs0; ++i) { + mm_reg1_t *r = ®s0[i]; + if (r->div > opt->flt_max_dv) continue; + if (r->blen < opt->flt_min_blen) continue; + regs0[j++] = regs0[i]; + } + n_regs0 = j; + } if (n_segs == 1) { // uni-segment regs0 = align_regs(opt, mi, b->km, qlens[0], seqs[0], &n_regs0, regs0, a); diff --git a/minimap.h b/minimap.h index 6c46c91..8445c16 100644 --- a/minimap.h +++ b/minimap.h @@ -119,6 +119,9 @@ typedef struct { int min_cnt; // min number of minimizers on each chain int min_chain_score; // min chaining score + float flt_max_dv; + int flt_min_blen; + float mask_level; float pri_ratio; int best_n; // top best_n chains are subjected to DP alignment diff --git a/options.c b/options.c index fe76a87..99871a6 100644 --- a/options.c +++ b/options.c @@ -27,6 +27,9 @@ void mm_mapopt_init(mm_mapopt_t *opt) opt->max_chain_skip = 25; opt->max_chain_iter = 5000; + opt->flt_max_dv = 1.0f; + opt->flt_min_blen = 0; + opt->mask_level = 0.5f; opt->pri_ratio = 0.8f; opt->best_n = 5;