X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=pysam.git;a=blobdiff_plain;f=samtools%2Fbcftools%2Fbcfutils.c.pysam.c;fp=samtools%2Fbcftools%2Fbcfutils.c.pysam.c;h=c48ab03c29cbcbd08c84f3cfd13ae1f8b1d81678;hp=110d0bb0855f59ec2e8eacb7fc0d144bd5ebb1b3;hb=e1756c41e7a1d7cc01fb95e42df9dd04da2d2991;hpb=ca46ef4ba4a883c57cea62d5bf1bc021f1185109 diff --git a/samtools/bcftools/bcfutils.c.pysam.c b/samtools/bcftools/bcfutils.c.pysam.c index 110d0bb..c48ab03 100644 --- a/samtools/bcftools/bcfutils.c.pysam.c +++ b/samtools/bcftools/bcfutils.c.pysam.c @@ -7,12 +7,6 @@ #include "khash.h" KHASH_MAP_INIT_STR(str2id, int) -#ifdef _WIN32 -#define srand48(x) srand(x) -#define drand48() ((double)rand() / RAND_MAX) -#endif - -// FIXME: valgrind report a memory leak in this function. Probably it does not get deallocated... void *bcf_build_refhash(bcf_hdr_t *h) { khash_t(str2id) *hash; @@ -316,77 +310,3 @@ int bcf_subsam(int n_smpl, int *list, bcf1_t *b) b->n_smpl = n_smpl; return 0; } - -static int8_t nt4_table[128] = { - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 /*'-'*/, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 3, 4, 4, 4, -1, 4, 4, 4, 4, 4, 4, 4, - 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 3, 4, 4, 4, -1, 4, 4, 4, 4, 4, 4, 4 -}; - -int bcf_gl10(const bcf1_t *b, uint8_t *gl) -{ - int a[4], k, l, map[4], k1, j, i; - const bcf_ginfo_t *PL; - char *s; - if (b->ref[1] != 0 || b->n_alleles > 4) return -1; // ref is not a single base or >4 alleles - 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; - a[0] = nt4_table[(int)b->ref[0]]; - if (a[0] > 3 || a[0] < 0) return -1; // ref is not A/C/G/T - a[1] = a[2] = a[3] = -2; // -1 has a special meaning - if (b->alt[0] == 0) return -1; // no alternate allele - map[0] = map[1] = map[2] = map[3] = -2; - map[a[0]] = 0; - for (k = 0, s = b->alt, k1 = -1; k < 3 && *s; ++k, s += 2) { - if (s[1] != ',' && s[1] != 0) return -1; // ALT is not single base - a[k+1] = nt4_table[(int)*s]; - if (a[k+1] >= 0) map[a[k+1]] = k+1; - else k1 = k + 1; - if (s[1] == 0) break; // the end of the ALT string - } - for (k = 0; k < 4; ++k) - if (map[k] < 0) map[k] = k1; - 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 = map[k], y = map[l]; - if (x > y) t = x, x = y, y = t; // make sure x is the smaller - g[j++] = p[y * (y+1) / 2 + x]; - } - } - } - 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; -}