From 83e9b2e28c35772411d150c8cca41b465283d726 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Tue, 1 Apr 2025 10:48:15 -0400 Subject: [PATCH] r1242: append /[12] to read name in --frag mode Resolve #1079 --- format.c | 14 +++++++++++--- map.c | 4 ++-- minimap.h | 2 +- mmpriv.h | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/format.c b/format.c index 764210a..5a6d8ae 100644 --- a/format.c +++ b/format.c @@ -366,15 +366,18 @@ static inline void write_tags(kstring_t *s, const mm_reg1_t *r) if (r->split) mm_sprintf_lite(s, "\tzd:i:%d", r->split); } -void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag, int rep_len) +void mm_write_paf4(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag, int rep_len, int n_seg, int seg_idx) { s->l = 0; + mm_sprintf_lite(s, "%s", t->name); + if ((opt_flag & MM_F_FRAG_MODE) && n_seg >= 2 && seg_idx >= 0) + mm_sprintf_lite(s, "/%d", seg_idx + 1); if (r == 0) { - mm_sprintf_lite(s, "%s\t%d\t0\t0\t*\t*\t0\t0\t0\t0\t0\t0", t->name, t->l_seq); + mm_sprintf_lite(s, "\t%d\t0\t0\t*\t*\t0\t0\t0\t0\t0\t0", t->l_seq); if (rep_len >= 0) mm_sprintf_lite(s, "\trl:i:%d", rep_len); 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]); + mm_sprintf_lite(s, "\t%d\t%d\t%d\t%c\t", 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); mm_sprintf_lite(s, "\t%d", mi->seq[r->rid].len); @@ -398,6 +401,11 @@ void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_sprintf_lite(s, "\t%s", t->comment); } +void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag, int rep_len) +{ + mm_write_paf4(s, mi, t, r, km, opt_flag, rep_len, 0, 0); +} + void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag) { mm_write_paf3(s, mi, t, r, km, opt_flag, -1); diff --git a/map.c b/map.c index 8e10445..385e1dd 100644 --- a/map.c +++ b/map.c @@ -599,14 +599,14 @@ static void *worker_pipeline(void *shared, int step, void *in) if (p->opt->flag & MM_F_OUT_SAM) mm_write_sam3(&p->str, mi, t, i - seg_st, j, s->n_seg[k], &s->n_reg[seg_st], (const mm_reg1_t*const*)&s->reg[seg_st], km, p->opt->flag, s->rep_len[i]); else - mm_write_paf3(&p->str, mi, t, r, km, p->opt->flag, s->rep_len[i]); + mm_write_paf4(&p->str, mi, t, r, km, p->opt->flag, s->rep_len[i], s->n_seg[k], i - seg_st); mm_err_puts(p->str.s); } } else if ((p->opt->flag & MM_F_PAF_NO_HIT) || ((p->opt->flag & MM_F_OUT_SAM) && !(p->opt->flag & MM_F_SAM_HIT_ONLY))) { // output an empty hit, if requested if (p->opt->flag & MM_F_OUT_SAM) mm_write_sam3(&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, s->rep_len[i]); else - mm_write_paf3(&p->str, mi, t, 0, 0, p->opt->flag, s->rep_len[i]); + mm_write_paf4(&p->str, mi, t, 0, 0, p->opt->flag, s->rep_len[i], s->n_seg[k], i - seg_st); mm_err_puts(p->str.s); } } diff --git a/minimap.h b/minimap.h index 3223a8d..7bdd45a 100644 --- a/minimap.h +++ b/minimap.h @@ -5,7 +5,7 @@ #include #include -#define MM_VERSION "2.28-r1241-dirty" +#define MM_VERSION "2.28-r1242-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/mmpriv.h b/mmpriv.h index 6de9d0c..d62fb2e 100644 --- a/mmpriv.h +++ b/mmpriv.h @@ -69,6 +69,7 @@ double mm_event_identity(const mm_reg1_t *r); int mm_write_sam_hdr(const mm_idx_t *mi, const char *rg, const char *ver, int argc, char *argv[]); void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag); void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag, int rep_len); +void mm_write_paf4(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, void *km, int64_t opt_flag, int rep_len, int n_seg, int seg_idx); void mm_write_sam(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, int n_regs, const mm_reg1_t *regs); void mm_write_sam2(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, int seg_idx, int reg_idx, int n_seg, const int *n_regs, const mm_reg1_t *const* regs, void *km, int64_t opt_flag); void mm_write_sam3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, int seg_idx, int reg_idx, int n_seg, const int *n_regss, const mm_reg1_t *const* regss, void *km, int64_t opt_flag, int rep_len);