From 23d2674c39eab6591c3aec59a4a3426bbc25abdf Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sun, 10 Mar 2024 14:12:56 -0400 Subject: [PATCH] r1187: set stage for the ds tag; not added yet --- format.c | 20 ++++++++++---------- main.c | 2 ++ minimap.h | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/format.c b/format.c index fc03f00..cb7ad64 100644 --- a/format.c +++ b/format.c @@ -139,10 +139,10 @@ int mm_write_sam_hdr(const mm_idx_t *idx, const char *rg, const char *ver, int a return ret; } -static void write_cs_core(kstring_t *s, const uint8_t *tseq, const uint8_t *qseq, const mm_reg1_t *r, char *tmp, int no_iden, int write_tag) +static void write_cs_ds_core(kstring_t *s, const uint8_t *tseq, const uint8_t *qseq, const mm_reg1_t *r, char *tmp, int no_iden, int is_ds, int write_tag) { int i, q_off, t_off; - if (write_tag) mm_sprintf_lite(s, "\tcs:Z:"); + if (write_tag) mm_sprintf_lite(s, "\t%cs:Z:", is_ds? 'd' : 'c'); for (i = q_off = t_off = 0; i < (int)r->p->n_cigar; ++i) { int j, op = r->p->cigar[i]&0xf, len = r->p->cigar[i]>>4; assert((op >= MM_CIGAR_MATCH && op <= MM_CIGAR_N_SKIP) || op == MM_CIGAR_EQ_MATCH || op == MM_CIGAR_X_MISMATCH); @@ -218,7 +218,7 @@ static void write_MD_core(kstring_t *s, const uint8_t *tseq, const uint8_t *qseq assert(t_off == r->re - r->rs && q_off == r->qe - r->qs); } -static void write_cs_or_MD(void *km, kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, int no_iden, int is_MD, int write_tag, int is_qstrand) +static void write_cs_ds_or_MD(void *km, kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const mm_reg1_t *r, int no_iden, int is_MD, int is_ds, int write_tag, int is_qstrand) { extern unsigned char seq_nt4_table[256]; int i; @@ -244,8 +244,8 @@ static void write_cs_or_MD(void *km, kstring_t *s, const mm_idx_t *mi, const mm_ } } } - if (is_MD) write_MD_core(s, tseq, qseq, r, tmp, write_tag); - else write_cs_core(s, tseq, qseq, r, tmp, no_iden, write_tag); + if (is_MD == 1) write_MD_core(s, tseq, qseq, r, tmp, write_tag); + else write_cs_ds_core(s, tseq, qseq, r, tmp, no_iden, is_ds, write_tag); kfree(km, qseq); kfree(km, tseq); kfree(km, tmp); } @@ -256,7 +256,7 @@ int mm_gen_cs_or_MD(void *km, char **buf, int *max_len, const mm_idx_t *mi, cons str.s = *buf, str.l = 0, str.m = *max_len; t.l_seq = strlen(seq); t.seq = (char*)seq; - write_cs_or_MD(km, &str, mi, &t, r, no_iden, is_MD, 0, is_qstrand); + write_cs_ds_or_MD(km, &str, mi, &t, r, no_iden, is_MD, 0, 0, is_qstrand); *max_len = str.m; *buf = str.s; return str.l; @@ -326,8 +326,8 @@ void mm_write_paf3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, const for (k = 0; k < r->p->n_cigar; ++k) mm_sprintf_lite(s, "%d%c", r->p->cigar[k]>>4, MM_CIGAR_STR[r->p->cigar[k]&0xf]); } - if (r->p && (opt_flag & (MM_F_OUT_CS|MM_F_OUT_MD))) - write_cs_or_MD(km, s, mi, t, r, !(opt_flag&MM_F_OUT_CS_LONG), opt_flag&MM_F_OUT_MD, 1, !!(opt_flag&MM_F_QSTRAND)); + if (r->p && (opt_flag & (MM_F_OUT_CS|MM_F_OUT_DS|MM_F_OUT_MD))) + write_cs_ds_or_MD(km, s, mi, t, r, !(opt_flag&MM_F_OUT_CS_LONG), opt_flag&MM_F_OUT_MD, !!(opt_flag&MM_F_OUT_DS), 1, !!(opt_flag&MM_F_QSTRAND)); if ((opt_flag & MM_F_COPY_COMMENT) && t->comment) mm_sprintf_lite(s, "\t%s", t->comment); } @@ -535,8 +535,8 @@ void mm_write_sam3(kstring_t *s, const mm_idx_t *mi, const mm_bseq1_t *t, int se } } } - if (r->p && (opt_flag & (MM_F_OUT_CS|MM_F_OUT_MD))) - write_cs_or_MD(km, s, mi, t, r, !(opt_flag&MM_F_OUT_CS_LONG), opt_flag&MM_F_OUT_MD, 1, 0); + if (r->p && (opt_flag & (MM_F_OUT_CS|MM_F_OUT_DS|MM_F_OUT_MD))) + write_cs_ds_or_MD(km, s, mi, t, r, !(opt_flag&MM_F_OUT_CS_LONG), opt_flag&MM_F_OUT_MD, !!(opt_flag&MM_F_OUT_DS), 1, 0); if (cigar_in_tag) write_sam_cigar(s, flag, 1, t->l_seq, r, opt_flag); } diff --git a/main.c b/main.c index 09c551e..c5c910a 100644 --- a/main.c +++ b/main.c @@ -77,6 +77,7 @@ static ko_longopt_t long_options[] = { { "print-chains", ko_no_argument, 352 }, { "no-hash-name", ko_no_argument, 353 }, { "secondary-seq", ko_no_argument, 354 }, + { "ds", ko_no_argument, 355 }, { "help", ko_no_argument, 'h' }, { "max-intron-len", ko_required_argument, 'G' }, { "version", ko_no_argument, 'V' }, @@ -243,6 +244,7 @@ int main(int argc, char *argv[]) else if (c == 352) mm_dbg_flag |= MM_DBG_PRINT_CHAIN; // --print-chains else if (c == 353) opt.flag |= MM_F_NO_HASH_NAME; // --no-hash-name else if (c == 354) opt.flag |= MM_F_SECONDARY_SEQ; // --secondary-seq + else if (c == 355) opt.flag |= MM_F_OUT_DS; // --ds else if (c == 330) { fprintf(stderr, "[WARNING] \033[1;31m --lj-min-ratio has been deprecated.\033[0m\n"); } else if (c == 314) { // --frag diff --git a/minimap.h b/minimap.h index a8929c3..f3b7d6f 100644 --- a/minimap.h +++ b/minimap.h @@ -5,7 +5,7 @@ #include #include -#define MM_VERSION "2.26-r1183-dirty" +#define MM_VERSION "2.26-r1187-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 @@ -44,6 +44,7 @@ #define MM_F_NO_HASH_NAME (0x400000000LL) #define MM_F_SPLICE_OLD (0x800000000LL) #define MM_F_SECONDARY_SEQ (0x1000000000LL) //output SEQ field for seqondary alignments using hard clipping +#define MM_F_OUT_DS (0x2000000000LL) #define MM_I_HPC 0x1 #define MM_I_NO_SEQ 0x2