Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}