7 int8_t seq_bitcnt[] = { 4, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
8 char *seq_nt16rev = "XACMGRSVTWYHKDBN";
10 uint32_t *bcf_trio_prep(int is_x, int is_son)
12 int i, j, k, n, map[10];
14 ret = calloc(MAX_GENO, 4);
15 for (i = 0, k = 0; i < 4; ++i)
16 for (j = i; j < 4; ++j)
18 for (i = 0, n = 1; i < 10; ++i) { // father
19 if (is_x && seq_bitcnt[map[i]] != 1) continue;
21 for (j = 0; j < 10; ++j) // mother
22 for (k = 0; k < 10; ++k) // child
23 if (seq_bitcnt[map[k]] == 1 && (map[j]&map[k]))
24 ret[n++] = j<<16 | i<<8 | k;
26 for (j = 0; j < 10; ++j) // mother
27 for (k = 0; k < 10; ++k) // child
28 if ((map[i]&map[k]) && (map[j]&map[k]) && ((map[i]|map[j])&map[k]) == map[k])
29 ret[n++] = j<<16 | i<<8 | k;
36 int bcf_trio_call(const uint32_t *prep, const bcf1_t *b, int *llr, int64_t *gt)
39 const bcf_ginfo_t *PL;
42 if (b->n_smpl != 3) return -1; // not a trio
43 for (i = 0; i < b->n_gi; ++i)
44 if (b->gi[i].fmt == bcf_str2int("PL", 2)) break;
45 if (i == b->n_gi) return -1; // no PL
46 gl10 = alloca(10 * b->n_smpl);
47 if (bcf_gl10(b, gl10) < 0) return -1;
49 for (i = 0, k = 0; i < 4; ++i)
50 for (j = i; j < 4; ++j)
51 map[k++] = seq_nt16rev[1<<i|1<<j];
52 for (j = 0; j < 3; ++j) // check if ref hom is the most probable in all members
53 if (((uint8_t*)PL->data)[j * PL->len] != 0) break;
54 if (j < 3) { // we need to go through the complex procedure
56 int minc = 1<<30, minc_j = -1, minf = 0, gtf = 0, gtc = 0;
60 for (j = 1; j <= (int)prep[0]; ++j) { // compute LK with constraint
61 int sum = g[0][prep[j]&0xff] + g[1][prep[j]>>8&0xff] + g[2][prep[j]>>16&0xff];
62 if (sum < minc) minc = sum, minc_j = j;
64 gtc |= map[prep[minc_j]&0xff]; gtc |= map[prep[minc_j]>>8&0xff]<<8; gtc |= map[prep[minc_j]>>16]<<16;
65 for (j = 0; j < 3; ++j) { // compute LK without constraint
66 int min = 1<<30, min_k = -1;
67 for (k = 0; k < 10; ++k)
68 if (g[j][k] < min) min = g[j][k], min_k = k;
69 gtf |= map[min_k]<<(j*8);
72 *llr = minc - minf; *gt = (int64_t)gtc<<32 | gtf;
73 } else *llr = 0, *gt = -1;
77 int bcf_pair_call(const bcf1_t *b)
80 const bcf_ginfo_t *PL;
81 if (b->n_smpl != 2) return -1; // not a pair
82 for (i = 0; i < b->n_gi; ++i)
83 if (b->gi[i].fmt == bcf_str2int("PL", 2)) break;
84 if (i == b->n_gi) return -1; // no PL
86 for (j = 0; j < 2; ++j) // check if ref hom is the most probable in all members
87 if (((uint8_t*)PL->data)[j * PL->len] != 0) break;
88 if (j < 2) { // we need to go through the complex procedure
90 int minc = 1<<30, minf = 0;
92 g[1] = (uint8_t*)PL->data + PL->len;
93 for (j = 0; j < PL->len; ++j) // compute LK with constraint
94 minc = minc < g[0][j] + g[1][j]? minc : g[0][j] + g[1][j];
95 for (j = 0; j < 2; ++j) { // compute LK without constraint
97 for (k = 0; k < PL->len; ++k)
98 min = min < g[j][k]? min : g[j][k];
105 int bcf_min_diff(const bcf1_t *b)
108 const bcf_ginfo_t *PL;
109 for (i = 0; i < b->n_gi; ++i)
110 if (b->gi[i].fmt == bcf_str2int("PL", 2)) break;
111 if (i == b->n_gi) return -1; // no PL
113 for (i = 0; i < b->n_smpl; ++i) {
115 const uint8_t *p = (uint8_t*)PL->data;
117 for (j = 0; j < PL->len; ++j) {
118 if ((int)p[j] < m1) m2 = m1, m1 = p[j];
119 else if ((int)p[j] < m2) m2 = p[j];
121 min = min < m2 - m1? min : m2 - m1;