7 KHASH_MAP_INIT_STR(sm, int)
9 bam_sample_t *bam_smpl_init(void)
12 s = calloc(1, sizeof(bam_sample_t));
13 s->rg2smid = kh_init(sm);
14 s->sm2id = kh_init(sm);
18 void bam_smpl_destroy(bam_sample_t *sm)
22 khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid;
24 for (i = 0; i < sm->n; ++i) free(sm->smpl[i]);
26 for (k = kh_begin(rg2smid); k != kh_end(rg2smid); ++k)
27 if (kh_exist(rg2smid, k)) free((char*)kh_key(rg2smid, k));
28 kh_destroy(sm, sm->rg2smid);
29 kh_destroy(sm, sm->sm2id);
33 static void add_pair(bam_sample_t *sm, khash_t(sm) *sm2id, const char *key, const char *val)
37 khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid;
38 k_rg = kh_get(sm, rg2smid, key);
39 if (k_rg != kh_end(rg2smid)) return; // duplicated @RG-ID
40 k_rg = kh_put(sm, rg2smid, strdup(key), &ret);
41 k_sm = kh_get(sm, sm2id, val);
42 if (k_sm == kh_end(sm2id)) { // absent
44 sm->m = sm->m? sm->m<<1 : 1;
45 sm->smpl = realloc(sm->smpl, sizeof(void*) * sm->m);
47 sm->smpl[sm->n] = strdup(val);
48 k_sm = kh_put(sm, sm2id, sm->smpl[sm->n], &ret);
49 kh_val(sm2id, k_sm) = sm->n++;
51 kh_val(rg2smid, k_rg) = kh_val(sm2id, k_sm);
54 int bam_smpl_add(bam_sample_t *sm, const char *fn, const char *txt)
56 const char *p = txt, *q, *r;
59 khash_t(sm) *sm2id = (khash_t(sm)*)sm->sm2id;
60 memset(&buf, 0, sizeof(kstring_t));
61 while ((q = strstr(p, "@RG")) != 0) {
64 if ((q = strstr(p, "\tID:")) != 0) q += 4;
65 if ((r = strstr(p, "\tSM:")) != 0) r += 4;
69 for (u = (char*)q; *u && *u != '\t' && *u != '\n'; ++u);
70 for (v = (char*)r; *v && *v != '\t' && *v != '\n'; ++v);
71 oq = *u; or = *v; *u = *v = '\0';
72 buf.l = 0; kputs(fn, &buf); kputc('/', &buf); kputs(q, &buf);
73 add_pair(sm, sm2id, buf.s, r);
79 if (n == 0) add_pair(sm, sm2id, fn, fn);
80 // add_pair(sm, sm2id, fn, fn);
85 int bam_smpl_rg2smid(const bam_sample_t *sm, const char *fn, const char *rg, kstring_t *str)
88 khash_t(sm) *rg2smid = (khash_t(sm)*)sm->rg2smid;
91 kputs(fn, str); kputc('/', str); kputs(rg, str);
92 k = kh_get(sm, rg2smid, str->s);
93 } else k = kh_get(sm, rg2smid, fn);
94 return k == kh_end(rg2smid)? -1 : kh_val(rg2smid, k);