From a655cbef86f24619675da97eae99ee76bd929029 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sun, 15 Jul 2018 11:03:18 -0400 Subject: [PATCH] print SAM header; remove tmp files --- main.c | 2 +- map.c | 5 ++++- mmpriv.h | 1 + splitidx.c | 16 ++++++++++++++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/main.c b/main.c index d32fff0..064e2fc 100644 --- a/main.c +++ b/main.c @@ -329,7 +329,7 @@ int main(int argc, char *argv[]) mm_write_sam_hdr(mi, rg, MM_VERSION, argc, argv); } else { mm_write_sam_hdr(0, rg, MM_VERSION, argc, argv); - if (mm_verbose >= 2) + if (opt.split_prefix == 0 && mm_verbose >= 2) fprintf(stderr, "[WARNING]\033[1;31m For a multi-part index, no @SQ lines will be outputted.\033[0m\n"); } } diff --git a/map.c b/map.c index be4ae74..1a6ff1a 100644 --- a/map.c +++ b/map.c @@ -659,7 +659,6 @@ int mm_split_merge(int n_segs, const char **fn, const mm_mapopt_t *opt, int n_sp { int i; pipeline_t pl; - mm_idx_t *mi; if (n_segs < 1 || n_split_idx < 1) return -1; memset(&pl, 0, sizeof(pipeline_t)); pl.n_fp = n_segs; @@ -681,6 +680,9 @@ int mm_split_merge(int n_segs, const char **fn, const mm_mapopt_t *opt, int n_sp pl.rid_shift[i] = pl.rid_shift[i - 1]; for (pl.rid_shift[0] = 0, i = 1; i < n_split_idx; ++i) pl.rid_shift[i] += pl.rid_shift[i - 1]; + if (opt->flag & MM_F_OUT_SAM) + for (i = 0; i < pl.mi->n_seq; ++i) + printf("@SQ\tSN:%s\tLN:%d\n", pl.mi->seq[i].name, pl.mi->seq[i].len); kt_pipeline(2, worker_pipeline, &pl, 3); @@ -692,5 +694,6 @@ int mm_split_merge(int n_segs, const char **fn, const mm_mapopt_t *opt, int n_sp for (i = 0; i < pl.n_fp; ++i) mm_bseq_close(pl.fp[i]); free(pl.fp); + mm_split_rm_tmp(opt->split_prefix, n_split_idx); return 0; } diff --git a/mmpriv.h b/mmpriv.h index a02a1b7..f847445 100644 --- a/mmpriv.h +++ b/mmpriv.h @@ -92,6 +92,7 @@ void mm_pair(void *km, int max_gap_ref, int dp_bonus, int sub_diff, int match_sc FILE *mm_split_init(const char *prefix, const mm_idx_t *mi); mm_idx_t *mm_split_merge_prep(const char *prefix, int n_splits, FILE **fp, uint32_t *n_seq_part); int mm_split_merge(int n_segs, const char **fn, const mm_mapopt_t *opt, int n_split_idx); +void mm_split_rm_tmp(const char *prefix, int n_splits); void mm_err_puts(const char *str); void mm_err_fwrite(const void *p, size_t size, size_t nitems, FILE *fp); diff --git a/splitidx.c b/splitidx.c index 7d8627d..6d12071 100644 --- a/splitidx.c +++ b/splitidx.c @@ -33,7 +33,7 @@ mm_idx_t *mm_split_merge_prep(const char *prefix, int n_splits, FILE **fp, uint3 int i, j; if (n_splits < 1) return 0; - fn = (char*)calloc(strlen(prefix) + 10, 1); + fn = CALLOC(char, strlen(prefix) + 10); for (i = 0; i < n_splits; ++i) { sprintf(fn, "%s.%.4d.tmp", prefix, i); if ((fp[i] = fopen(fn, "rb")) == 0) { @@ -47,7 +47,7 @@ mm_idx_t *mm_split_merge_prep(const char *prefix, int n_splits, FILE **fp, uint3 } free(fn); - mi = (mm_idx_t*)calloc(1, sizeof(mm_idx_t)); + mi = CALLOC(mm_idx_t, 1); for (i = 0; i < n_splits; ++i) { mm_err_fread(&mi->k, 4, 1, fp[i]); // TODO: check if k is all the same mm_err_fread(&n_seq_part[i], 4, 1, fp[i]); @@ -66,3 +66,15 @@ mm_idx_t *mm_split_merge_prep(const char *prefix, int n_splits, FILE **fp, uint3 } return mi; } + +void mm_split_rm_tmp(const char *prefix, int n_splits) +{ + int i; + char *fn; + fn = CALLOC(char, strlen(prefix) + 10); + for (i = 0; i < n_splits; ++i) { + sprintf(fn, "%s.%.4d.tmp", prefix, i); + remove(fn); + } + free(fn); +}