diff --git a/format.c b/format.c index 0b861b0..17f0443 100644 --- a/format.c +++ b/format.c @@ -54,7 +54,16 @@ static void mm_sprintf_lite(kstring_t *s, const char *fmt, ...) s->s[s->l] = 0; } -void mm_write_paf(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r) +static inline void write_tags(kstring_t *s, const mm_reg1_t *r) +{ + mm_sprintf_lite(s, "\tcm:i:%d", r->cnt); + if (r->p) mm_sprintf_lite(s, "\ts1:i:%d", r->score); + if (r->parent == r->id) mm_sprintf_lite(s, "\ts2:i:%d", r->subsc); + if (r->split) mm_sprintf_lite(s, "\tzd:i:%d", r->split); + if (r->p) mm_sprintf_lite(s, "\tNM:i:%d\tAS:i:%d\tnn:i:%d", r->p->n_diff, r->p->score, r->p->n_ambi); +} + +void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const bseq1_t *t, const mm_reg1_t *r) { s->l = 0; 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]); @@ -63,12 +72,11 @@ void mm_write_paf(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r) mm_sprintf_lite(s, "\t%d\t%d\t%d", mi->seq[r->rid].len, r->rs, r->re); if (r->p) mm_sprintf_lite(s, "\t%d\t%d", r->p->blen - r->p->n_ambi - r->p->n_diff, r->p->blen); else mm_sprintf_lite(s, "\t%d\t%d", r->score, r->re - r->rs > r->qe - r->qs? r->re - r->rs : r->qe - r->qs); - mm_sprintf_lite(s, "\t%d\tcm:i:%d", r->mapq, r->cnt); - if (r->p) mm_sprintf_lite(s, "\ts1:i:%d", r->score); - if (r->parent == r->id) mm_sprintf_lite(s, "\ts2:i:%d", r->subsc); + mm_sprintf_lite(s, "\t%d", r->mapq); + write_tags(s, r); if (r->p) { uint32_t k; - mm_sprintf_lite(s, "\tNM:i:%d\tAS:i:%d\tnn:i:%d\tcg:Z:", r->p->n_diff, r->p->score, r->p->n_ambi); + mm_sprintf_lite(s, "cg:Z:"); for (k = 0; k < r->p->n_cigar; ++k) mm_sprintf_lite(s, "%d%c", r->p->cigar[k]>>4, "MID"[r->p->cigar[k]&0xf]); } @@ -98,7 +106,7 @@ static void sam_write_sq(kstring_t *s, char *seq, int l, int rev, int comp) } else str_copy(s, seq, seq + l); } -void mm_write_sam(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r) +void mm_write_sam(kstring_t *s, const mm_idx_t *mi, const bseq1_t *t, const mm_reg1_t *r) { int flag = 0; s->l = 0; @@ -115,8 +123,6 @@ void mm_write_sam(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r) } else mm_sprintf_lite(s, "*"); mm_sprintf_lite(s, "\t*\t0\t0\t"); sam_write_sq(s, t->seq, t->l_seq, r->rev, r->rev); - mm_sprintf_lite(s, "\t*\tcm:i:%d", r->cnt); - if (r->p) mm_sprintf_lite(s, "\ts1:i:%d", r->score); - if (r->parent == r->id) mm_sprintf_lite(s, "\ts2:i:%d", r->subsc); - if (r->p) mm_sprintf_lite(s, "\tNM:i:%d\tAS:i:%d\tnn:i:%d", r->p->n_diff, r->p->score, r->p->n_ambi); + mm_sprintf_lite(s, "\t*"); + write_tags(s, r); } diff --git a/hit.c b/hit.c index d3408b8..ff42d2c 100644 --- a/hit.c +++ b/hit.c @@ -36,7 +36,7 @@ void mm_split_reg(mm_reg1_t *r, mm_reg1_t *r2, int n, int qlen, mm128_t *a) r->cnt -= r2->cnt; r->score -= r2->score; mm_reg_set_coor(r, qlen, a); - r->split = r2->split = 1; + r->split |= 1, r2->split |= 2; } void mm_set_parent(void *km, float mask_level, int n, mm_reg1_t *r) // and compute mm_reg1_t::subsc diff --git a/main.c b/main.c index e0d4bfe..34a09ff 100644 --- a/main.c +++ b/main.c @@ -10,7 +10,7 @@ #include "minimap.h" #include "mmpriv.h" -#define MM_VERSION "2.0-r111-pre" +#define MM_VERSION "2.0-r112-pre" void liftrlimit() { diff --git a/minimap.h b/minimap.h index 13fc7d4..04c3391 100644 --- a/minimap.h +++ b/minimap.h @@ -54,13 +54,13 @@ typedef struct { typedef struct { int32_t id; - uint32_t cnt:30, rev:1, split:1; + uint32_t cnt:31, rev:1; uint32_t rid:31, rep:1; int32_t score; int32_t qs, qe, rs, re; int32_t parent, subsc; int32_t as; - uint32_t mapq:8, n_sub:24; // TODO: n_sub is not used for now + uint32_t mapq:8, split:2, n_sub:22; // TODO: n_sub is not used for now mm_extra_t *p; } mm_reg1_t; diff --git a/mmpriv.h b/mmpriv.h index 40397be..ee19d0f 100644 --- a/mmpriv.h +++ b/mmpriv.h @@ -31,8 +31,8 @@ void radix_sort_128x(mm128_t *beg, mm128_t *end); void radix_sort_64(uint64_t *beg, uint64_t *end); uint32_t ks_ksmall_uint32_t(size_t n, uint32_t arr[], size_t kk); -void mm_write_paf(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r); -void mm_write_sam(kstring_t *s, const mm_idx_t *mi, bseq1_t *t, mm_reg1_t *r); +void mm_write_paf(kstring_t *s, const mm_idx_t *mi, const bseq1_t *t, const mm_reg1_t *r); +void mm_write_sam(kstring_t *s, const mm_idx_t *mi, const bseq1_t *t, const mm_reg1_t *r); int mm_chain_dp(int max_dist, int bw, int max_skip, int min_cnt, int min_sc, int64_t n, mm128_t *a, uint64_t **_u, void *km); mm_reg1_t *mm_align_skeleton(void *km, const mm_mapopt_t *opt, const mm_idx_t *mi, int qlen, const char *qstr, int *n_regs_, mm_reg1_t *regs, mm128_t *a);