r1005: insert arbitrary header lines
This commit is contained in:
parent
15c93e7a52
commit
b5f6ed3020
17
bwa.c
17
bwa.c
|
|
@ -367,13 +367,13 @@ int bwa_idx2mem(bwaidx_t *idx)
|
|||
* SAM header routines *
|
||||
***********************/
|
||||
|
||||
void bwa_print_sam_hdr(const bntseq_t *bns, const char *rg_line)
|
||||
void bwa_print_sam_hdr(const bntseq_t *bns, const char *hdr_line)
|
||||
{
|
||||
int i;
|
||||
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);
|
||||
if (rg_line) err_printf("%s\n", rg_line);
|
||||
if (hdr_line) err_printf("%s\n", hdr_line);
|
||||
if (bwa_pg) err_printf("%s\n", bwa_pg);
|
||||
}
|
||||
|
||||
|
|
@ -422,3 +422,16 @@ err_set_rg:
|
|||
return 0;
|
||||
}
|
||||
|
||||
char *bwa_insert_header(const char *s, char *hdr)
|
||||
{
|
||||
int len = 0;
|
||||
if (s == 0 || s[0] != '@') return hdr;
|
||||
if (hdr) {
|
||||
len = strlen(hdr);
|
||||
hdr = realloc(hdr, len + strlen(s) + 2);
|
||||
hdr[len++] = '\n';
|
||||
strcpy(hdr + len, s);
|
||||
} else hdr = strdup(s);
|
||||
bwa_escape(hdr + len);
|
||||
return hdr;
|
||||
}
|
||||
|
|
|
|||
3
bwa.h
3
bwa.h
|
|
@ -51,8 +51,9 @@ extern "C" {
|
|||
int bwa_idx2mem(bwaidx_t *idx);
|
||||
int bwa_mem2idx(int64_t l_mem, uint8_t *mem, bwaidx_t *idx);
|
||||
|
||||
void bwa_print_sam_hdr(const bntseq_t *bns, const char *rg_line);
|
||||
void bwa_print_sam_hdr(const bntseq_t *bns, const char *hdr_line);
|
||||
char *bwa_set_rg(const char *s);
|
||||
char *bwa_insert_header(const char *s, char *hdr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
16
fastmap.c
16
fastmap.c
|
|
@ -44,7 +44,7 @@ int main_mem(int argc, char *argv[])
|
|||
kseq_t *ks, *ks2 = 0;
|
||||
bseq1_t *seqs;
|
||||
bwaidx_t *idx;
|
||||
char *p, *rg_line = 0;
|
||||
char *p, *rg_line = 0, *hdr_line = 0;
|
||||
const char *mode = 0;
|
||||
void *ko = 0, *ko2 = 0;
|
||||
int64_t n_processed = 0;
|
||||
|
|
@ -55,7 +55,7 @@ int main_mem(int argc, char *argv[])
|
|||
|
||||
opt = mem_opt_init();
|
||||
memset(&opt0, 0, sizeof(mem_opt_t));
|
||||
while ((c = getopt(argc, argv, "epaFMCSPHVYjk:c:v:s:r:t:R:A:B:O:E:U:w:L:d:T:Q:D:m:I:N:W:x:G:h:y:K:X:")) >= 0) {
|
||||
while ((c = getopt(argc, argv, "epaFMCSPVYjk:c:v:s:r:t:R:A:B:O:E:U:w:L:d:T:Q:D:m:I:N:W:x:G:h:y:K:X:H:")) >= 0) {
|
||||
if (c == 'k') opt->min_seed_len = atoi(optarg), opt0.min_seed_len = 1;
|
||||
else if (c == 'x') mode = optarg;
|
||||
else if (c == 'w') opt->w = atoi(optarg), opt0.w = 1;
|
||||
|
|
@ -115,6 +115,8 @@ int main_mem(int argc, char *argv[])
|
|||
opt->pen_clip3 = strtol(p+1, &p, 10);
|
||||
} 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);
|
||||
} else if (c == 'I') { // specify the insert size distribution
|
||||
pes0 = pes;
|
||||
pes[1].failed = 0;
|
||||
|
|
@ -135,6 +137,12 @@ int main_mem(int argc, char *argv[])
|
|||
}
|
||||
else return 1;
|
||||
}
|
||||
|
||||
if (rg_line) {
|
||||
hdr_line = bwa_insert_header(rg_line, hdr_line);
|
||||
free(rg_line);
|
||||
}
|
||||
|
||||
if (opt->n_threads < 1) opt->n_threads = 1;
|
||||
if (optind + 1 >= argc || optind + 3 < argc) {
|
||||
fprintf(stderr, "\n");
|
||||
|
|
@ -169,6 +177,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, " -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);
|
||||
|
|
@ -261,7 +270,7 @@ int main_mem(int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
if (!(opt->flag & MEM_F_ALN_REG))
|
||||
bwa_print_sam_hdr(idx->bns, rg_line);
|
||||
bwa_print_sam_hdr(idx->bns, hdr_line);
|
||||
actual_chunk_size = fixed_chunk_size > 0? fixed_chunk_size : opt->chunk_size * opt->n_threads;
|
||||
while ((seqs = bseq_read(actual_chunk_size, &n, ks, ks2)) != 0) {
|
||||
int64_t size = 0;
|
||||
|
|
@ -301,6 +310,7 @@ int main_mem(int argc, char *argv[])
|
|||
free(seqs);
|
||||
}
|
||||
|
||||
free(hdr_line);
|
||||
free(opt);
|
||||
bwa_idx_destroy(idx);
|
||||
kseq_destroy(ks);
|
||||
|
|
|
|||
Loading…
Reference in New Issue