X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sam.c;h=45cb05cf3dd6f8a04acfd4dd92c8d250835855a2;hb=0a5854b381b30670ba749b8575bc85548a10578d;hp=9a6e201d75e24d366903ff4e937f80d71e45303c;hpb=9360df156b23158232dca10ffdb8a8ffdcaf0930;p=samtools.git diff --git a/sam.c b/sam.c index 9a6e201..45cb05c 100644 --- a/sam.c +++ b/sam.c @@ -19,8 +19,21 @@ bam_header_t *bam_header_dup(const bam_header_t *h0) h->target_len[i] = h0->target_len[i]; h->target_name[i] = strdup(h0->target_name[i]); } + if (h0->rg2lib) h->rg2lib = bam_strmap_dup(h0->rg2lib); return h; } +static void append_header_text(bam_header_t *header, char* text, int len) +{ + int x = header->l_text + 1; + int y = header->l_text + len + 1; // 1 byte null + if (text == 0) return; + kroundup32(x); + kroundup32(y); + if (x < y) header->text = (char*)realloc(header->text, y); + strncpy(header->text + header->l_text, text, len); // we cannot use strcpy() here. + header->l_text += len; + header->text[header->l_text] = 0; +} samfile_t *samopen(const char *fn, const char *mode, const void *aux) { @@ -39,18 +52,23 @@ samfile_t *samopen(const char *fn, const char *mode, const void *aux) fp->header = sam_header_read(fp->x.tamr); if (fp->header->n_targets == 0) { // no @SQ fields if (aux) { // check if aux is present - bam_header_destroy(fp->header); + bam_header_t *textheader = fp->header; fp->header = sam_header_read2((const char*)aux); + append_header_text(fp->header, textheader->text, textheader->l_text); + bam_header_destroy(textheader); } if (fp->header->n_targets == 0) fprintf(stderr, "[samopen] no @SQ lines in the header.\n"); } else fprintf(stderr, "[samopen] SAM header is present: %d sequences.\n", fp->header->n_targets); } + sam_header_parse_rg(fp->header); } else if (mode[0] == 'w') { // write fp->header = bam_header_dup((const bam_header_t*)aux); if (mode[1] == 'b') { // binary + char bmode[3]; + bmode[0] = 'w'; bmode[1] = strstr(mode, "u")? 'u' : 0; bmode[2] = 0; fp->type |= TYPE_BAM; - fp->x.bam = strcmp(fn, "-")? bam_open(fn, "w") : bam_dopen(fileno(stdout), "w"); + fp->x.bam = strcmp(fn, "-")? bam_open(fn, bmode) : bam_dopen(fileno(stdout), bmode); if (fp->x.bam == 0) goto open_err_ret; bam_header_write(fp->x.bam, fp->header); } else { // text @@ -116,7 +134,7 @@ int samwrite(samfile_t *fp, const bam1_t *b) } } -int sampileup(samfile_t *fp, int mask, int min_mapQ, bam_pileup_f func, void *func_data) +int sampileup(samfile_t *fp, int mask, bam_pileup_f func, void *func_data) { bam_plbuf_t *buf; int ret; @@ -125,8 +143,7 @@ int sampileup(samfile_t *fp, int mask, int min_mapQ, bam_pileup_f func, void *fu buf = bam_plbuf_init(func, func_data); bam_plbuf_set_mask(buf, mask); while ((ret = samread(fp, b)) >= 0) - if (b->core.qual >= min_mapQ) - bam_plbuf_push(b, buf); + bam_plbuf_push(b, buf); bam_plbuf_push(0, buf); bam_plbuf_destroy(buf); bam_destroy1(b);