From 925ddfb6973c77f51940c077bf7f20b663d9bb5f Mon Sep 17 00:00:00 2001 From: Heng Li Date: Thu, 11 Dec 2014 10:38:36 -0500 Subject: [PATCH] r1025: accept file with -H; allow to replace @SQ --- bwa.c | 14 +++++++++++--- fastmap.c | 18 ++++++++++++++++-- main.c | 2 +- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/bwa.c b/bwa.c index 2411b4a..6739edd 100644 --- a/bwa.c +++ b/bwa.c @@ -369,10 +369,18 @@ int bwa_idx2mem(bwaidx_t *idx) void bwa_print_sam_hdr(const bntseq_t *bns, const char *hdr_line) { - int i; + int i, n_SQ = 0; + const char *p = hdr_line; extern char *bwa_pg; - for (i = 0; i < bns->n_seqs; ++i) - err_printf("@SQ\tSN:%s\tLN:%d\n", bns->anns[i].name, bns->anns[i].len); + while ((p = strstr(p, "@SQ\t")) != 0) { + if (p == hdr_line || *(p-1) == '\n') ++n_SQ; + p += 4; + } + if (n_SQ == 0) { + for (i = 0; i < bns->n_seqs; ++i) + err_printf("@SQ\tSN:%s\tLN:%d\n", bns->anns[i].name, bns->anns[i].len); + } else if (n_SQ != bns->n_seqs && bwa_verbose >= 2) + fprintf(stderr, "[W::%s] %d @SQ lines provided with -H; %d sequences in the index. Continue anyway.\n", __func__, n_SQ, bns->n_seqs); if (hdr_line) err_printf("%s\n", hdr_line); if (bwa_pg) err_printf("%s\n", bwa_pg); } diff --git a/fastmap.c b/fastmap.c index 537fff7..79ebd39 100644 --- a/fastmap.c +++ b/fastmap.c @@ -192,7 +192,21 @@ int main_mem(int argc, char *argv[]) } else if (c == 'R') { if ((rg_line = bwa_set_rg(optarg)) == 0) return 1; // FIXME: memory leak } else if (c == 'H') { - hdr_line = bwa_insert_header(optarg, hdr_line); + if (optarg[0] != '@') { + FILE *fp; + if ((fp = fopen(optarg, "r")) != 0) { + char *buf; + buf = calloc(1, 0x10000); + while (fgets(buf, 0xffff, fp)) { + i = strlen(buf); + assert(buf[i-1] == '\n'); // a long line + buf[i-1] = 0; + hdr_line = bwa_insert_header(buf, hdr_line); + } + free(buf); + fclose(fp); + } + } else hdr_line = bwa_insert_header(optarg, hdr_line); } else if (c == 'I') { // specify the insert size distribution aux.pes0 = pes; pes[1].failed = 0; @@ -253,7 +267,7 @@ int main_mem(int argc, char *argv[]) fprintf(stderr, "\nInput/output options:\n\n"); fprintf(stderr, " -p smart pairing (ignoring in2.fq)\n"); fprintf(stderr, " -R STR read group header line such as '@RG\\tID:foo\\tSM:bar' [null]\n"); - fprintf(stderr, " -H STR insert an arbitrary header line [null]\n"); + fprintf(stderr, " -H STR/FILE insert STR to header if it starts with @; or insert lines in FILE [null]\n"); fprintf(stderr, " -j ignore ALT contigs\n"); fprintf(stderr, "\n"); fprintf(stderr, " -v INT verbose level: 1=error, 2=warning, 3=message, 4+=debugging [%d]\n", bwa_verbose); diff --git a/main.c b/main.c index 8216811..2a0118c 100644 --- a/main.c +++ b/main.c @@ -4,7 +4,7 @@ #include "utils.h" #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "0.7.10-r1017-dirty" +#define PACKAGE_VERSION "0.7.10-r1025-dirty" #endif int bwa_fa2pac(int argc, char *argv[]);