int mc_cal(int ref, int *n, const bam_pileup1_t **plp, mc_aux_t *ma, mc_rst_t *rst, int level) { int i, tot; memset(rst, 0, sizeof(mc_rst_t)); rst->f_em = rst->f_exp = -1.; rst->ref = rst->alt = -1; // precalculation tot = sum_err(n, plp, ma); if (tot == 0) return 0; // no good bases set_allele(ref, ma); cal_pdg(ma); // set ref/major allele rst->ref = ma->ref; rst->alt = ma->alt; rst->alt2 = ma->alt2; // calculate naive and Nielsen's freq rst->f_naive = mc_freq0(ma, &rst->f_nielsen); { // calculate f_em double flast = rst->f_naive; for (i = 0; i < MC_MAX_EM_ITER; ++i) { rst->f_em = mc_freq_iter(flast, ma); if (fabs(rst->f_em - flast) < MC_EM_EPS) break; flast = rst->f_em; } } if (level >= 2) { rst->f_exp = mc_add_afs(ma); rst->p_ref = ma->afs1[ma->M]; } return tot; }
int bcf_p1_cal(bcf1_t *b, bcf_p1aux_t *ma, bcf_p1rst_t *rst) { int i, k; long double sum = 0.; // set PL and PL_len for (i = 0; i < b->n_gi; ++i) { if (b->gi[i].fmt == bcf_str2int("PL", 2)) { ma->PL = (uint8_t*)b->gi[i].data; ma->PL_len = b->gi[i].len; break; } } if (b->n_alleles < 2) return -1; // FIXME: find a better solution // rst->rank0 = cal_pdg(b, ma); rst->f_exp = mc_cal_afs(ma); rst->p_ref = ma->afs1[ma->M]; // calculate f_flat and f_em for (k = 0, sum = 0.; k <= ma->M; ++k) sum += (long double)ma->z[k]; rst->f_flat = 0.; for (k = 0; k <= ma->M; ++k) { double p = ma->z[k] / sum; rst->f_flat += k * p; } rst->f_flat /= ma->M; { // calculate f_em double flast = rst->f_flat; for (i = 0; i < MC_MAX_EM_ITER; ++i) { rst->f_em = mc_freq_iter(flast, ma); if (fabs(rst->f_em - flast) < MC_EM_EPS) break; flast = rst->f_em; } } rst->g[0] = rst->g[1] = rst->g[2] = -1.; contrast(ma, rst->pc); return 0; }