X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=bcftools%2Fbcfutils.c;h=0eab4c1f322b398750fdda9da4caec6eea8e7579;hb=1ef8ee37fa796dd58e4c18681939a2fafe84ee0c;hp=9608846bef3b435edf470d3b3ae8a075431e82b3;hpb=5329dbb6df3eee6a46d875b9d50e7f1a869f6b25;p=samtools.git diff --git a/bcftools/bcfutils.c b/bcftools/bcfutils.c index 9608846..0eab4c1 100644 --- a/bcftools/bcfutils.c +++ b/bcftools/bcfutils.c @@ -354,8 +354,6 @@ int bcf_gl10(const bcf1_t *b, uint8_t *gl) for (i = 0; i < b->n_smpl; ++i) { const uint8_t *p = PL->data + i * PL->len; // the PL for the i-th individual uint8_t *g = gl + 10 * i; - for (j = 0; j < PL->len; ++j) - if (p[j]) break; for (k = j = 0; k < 4; ++k) { for (l = k; l < 4; ++l) { int t, x = map[k], y = map[l]; @@ -366,3 +364,27 @@ int bcf_gl10(const bcf1_t *b, uint8_t *gl) } return 0; } + +int bcf_gl10_indel(const bcf1_t *b, uint8_t *gl) +{ + int k, l, j, i; + const bcf_ginfo_t *PL; + if (b->alt[0] == 0) return -1; // no alternate allele + for (i = 0; i < b->n_gi; ++i) + if (b->gi[i].fmt == bcf_str2int("PL", 2)) break; + if (i == b->n_gi) return -1; // no PL + PL = b->gi + i; + for (i = 0; i < b->n_smpl; ++i) { + const uint8_t *p = PL->data + i * PL->len; // the PL for the i-th individual + uint8_t *g = gl + 10 * i; + for (k = j = 0; k < 4; ++k) { + for (l = k; l < 4; ++l) { + int t, x = k, y = l; + if (x > y) t = x, x = y, y = t; // make sure x is the smaller + x = y * (y+1) / 2 + x; + g[j++] = x < PL->len? p[x] : 255; + } + } + } + return 0; +}