X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sample.c;h=830b9d1cb9f1aad1230c82dd8d24ad958645c7ff;hb=9f118264ea012adc21a46d7c03eaad4f9ce7d4d4;hp=95bec6887c488deb7d270403a88b40903ce5fa94;hpb=d14782f26230244039bf38f6384a7a9106b0daed;p=samtools.git diff --git a/sample.c b/sample.c index 95bec68..830b9d1 100644 --- a/sample.c +++ b/sample.c @@ -9,6 +9,7 @@ bam_sample_t *bam_smpl_init(void) bam_sample_t *s; s = calloc(1, sizeof(bam_sample_t)); s->rg2smid = kh_init(sm); + s->sm2id = kh_init(sm); return s; } @@ -23,6 +24,7 @@ void bam_smpl_destroy(bam_sample_t *sm) for (k = kh_begin(rg2smid); k != kh_end(rg2smid); ++k) if (kh_exist(rg2smid, k)) free((char*)kh_key(rg2smid, k)); kh_destroy(sm, sm->rg2smid); + kh_destroy(sm, sm->sm2id); free(sm); } @@ -50,11 +52,15 @@ static void add_pair(bam_sample_t *sm, khash_t(sm) *sm2id, const char *key, cons int bam_smpl_add(bam_sample_t *sm, const char *fn, const char *txt) { const char *p = txt, *q, *r; - kstring_t buf; + kstring_t buf, first_sm; int n = 0; - khash_t(sm) *sm2id; - sm2id = kh_init(sm); + khash_t(sm) *sm2id = (khash_t(sm)*)sm->sm2id; + if (txt == 0) { + add_pair(sm, sm2id, fn, fn); + return 0; + } memset(&buf, 0, sizeof(kstring_t)); + memset(&first_sm, 0, sizeof(kstring_t)); while ((q = strstr(p, "@RG")) != 0) { p = q + 3; r = q = 0; @@ -68,14 +74,23 @@ int bam_smpl_add(bam_sample_t *sm, const char *fn, const char *txt) oq = *u; or = *v; *u = *v = '\0'; buf.l = 0; kputs(fn, &buf); kputc('/', &buf); kputs(q, &buf); add_pair(sm, sm2id, buf.s, r); + if ( !first_sm.s ) + kputs(r,&first_sm); *u = oq; *v = or; } else break; p = q > r? q : r; ++n; } if (n == 0) add_pair(sm, sm2id, fn, fn); + // If there is only one RG tag present in the header and reads are not annotated, don't refuse to work but + // use the tag instead. + else if ( n==1 && first_sm.s ) + add_pair(sm,sm2id,fn,first_sm.s); + if ( first_sm.s ) + free(first_sm.s); + +// add_pair(sm, sm2id, fn, fn); free(buf.s); - kh_destroy(sm, sm2id); return 0; }