From a609a07f8cff4662b39f25fb042f7fff730807b9 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sat, 7 Jul 2018 10:26:08 -0500 Subject: [PATCH] optionally output unmapped query in PAF --- format.c | 4 ++++ main.c | 2 ++ map.c | 9 +++++++++ minimap.h | 1 + 4 files changed, 16 insertions(+) diff --git a/format.c b/format.c index f38289f..a4b8234 100644 --- a/format.c +++ b/format.c @@ -259,6 +259,10 @@ static inline void write_tags(kstring_t *s, const mm_reg1_t *r) void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int opt_flag) { s->l = 0; + if (r == 0) { + mm_sprintf_lite(s, "%s\t%d", t->name, t->l_seq); + return; + } mm_sprintf_lite(s, "%s\t%d\t%d\t%d\t%c\t", t->name, t->l_seq, r->qs, r->qe, "+-"[r->rev]); if (mi->seq[r->rid].name) mm_sprintf_lite(s, "%s", mi->seq[r->rid].name); else mm_sprintf_lite(s, "%d", r->rid); diff --git a/main.c b/main.c index 1b25541..22d55e3 100644 --- a/main.c +++ b/main.c @@ -60,6 +60,7 @@ static struct option long_options[] = { { "lj-min-ratio", required_argument, 0, 0 }, // 30 { "score-N", required_argument, 0, 0 }, // 31 { "eqx", no_argument, 0, 0 }, // 32 + { "paf-no-hit", no_argument, 0, 0 }, // 33 { "help", no_argument, 0, 'h' }, { "max-intron-len", required_argument, 0, 'G' }, { "version", no_argument, 0, 'V' }, @@ -179,6 +180,7 @@ int main(int argc, char *argv[]) else if (c == 0 && long_idx ==30) opt.min_join_flank_ratio = atof(optarg); // --lj-min-ratio else if (c == 0 && long_idx ==31) opt.sc_ambi = atoi(optarg); // --score-N else if (c == 0 && long_idx ==32) opt.flag |= MM_F_EQX; // --eqx + else if (c == 0 && long_idx ==33) opt.flag |= MM_F_PAF_NO_HIT; // --paf-no-hit else if (c == 0 && long_idx == 14) { // --frag yes_or_no(&opt, MM_F_FRAG_MODE, long_idx, optarg, 1); } else if (c == 0 && long_idx == 15) { // --secondary diff --git a/map.c b/map.c index 08dfe60..0864c09 100644 --- a/map.c +++ b/map.c @@ -496,6 +496,15 @@ static void *worker_pipeline(void *shared, int step, void *in) mm_write_paf(&p->str, mi, t, r, km, p->opt->flag); mm_err_puts(p->str.s); } + if (s->n_reg[i] == 0) { + if (p->opt->flag & MM_F_OUT_SAM) { + mm_write_sam2(&p->str, mi, t, i - seg_st, -1, s->n_seg[k], &s->n_reg[seg_st], (const mm_reg1_t*const*)&s->reg[seg_st], km, p->opt->flag); + mm_err_puts(p->str.s); + } else if (p->opt->flag & MM_F_PAF_NO_HIT) { + mm_write_paf(&p->str, mi, t, 0, 0, p->opt->flag); + mm_err_puts(p->str.s); + } + } if (s->n_reg[i] == 0 && (p->opt->flag & MM_F_OUT_SAM)) { // write an unmapped record mm_write_sam2(&p->str, mi, t, i - seg_st, -1, s->n_seg[k], &s->n_reg[seg_st], (const mm_reg1_t*const*)&s->reg[seg_st], km, p->opt->flag); mm_err_puts(p->str.s); diff --git a/minimap.h b/minimap.h index 3590173..c1a9267 100644 --- a/minimap.h +++ b/minimap.h @@ -32,6 +32,7 @@ #define MM_F_OUT_MD 0x1000000 #define MM_F_COPY_COMMENT 0x2000000 #define MM_F_EQX 0x4000000 // use =/X instead of M +#define MM_F_PAF_NO_HIT 0x8000000 // output unmapped reads to PAF #define MM_I_HPC 0x1 #define MM_I_NO_SEQ 0x2