Пример #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;
}
Пример #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;
}
Пример #3
0
int bcf_p1_cal(const bcf1_t *b, int do_contrast, bcf_p1aux_t *ma, bcf_p1rst_t *rst)
{
	int i, k;
	long double sum = 0.;
	ma->is_indel = bcf_is_indel(b);
	rst->perm_rank = -1;
	// 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 (i == b->n_gi) return -1; // no PL
	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_folded, &rst->p_var_folded);
	rst->p_ref = ma->afs1[ma->M];
	for (k = 0, sum = 0.; k < ma->M; ++k)
		sum += ma->afs1[k];
	rst->p_var = (double)sum;
	{ // compute the allele count
		double max = -1;
		rst->ac = -1;
		for (k = 0; k <= ma->M; ++k)
			if (max < ma->z[k]) max = ma->z[k], rst->ac = k;
		rst->ac = ma->M - rst->ac;
	}
	// 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;
	{ // estimate equal-tail credible interval (95% level)
		int l, h;
		double p;
		for (i = 0, p = 0.; i <= ma->M; ++i)
			if (p + ma->afs1[i] > 0.025) break;
			else p += ma->afs1[i];
		l = i;
		for (i = ma->M, p = 0.; i >= 0; --i)
			if (p + ma->afs1[i] > 0.025) break;
			else p += ma->afs1[i];
		h = i;
		rst->cil = (double)(ma->M - h) / ma->M; rst->cih = (double)(ma->M - l) / ma->M;
	}
	if (ma->n1 > 0) { // compute LRT
		double max0, max1, max2;
		for (k = 0, max0 = -1; k <= ma->M; ++k)
			if (max0 < ma->z[k]) max0 = ma->z[k];
		for (k = 0, max1 = -1; k <= ma->n1 * 2; ++k)
			if (max1 < ma->z1[k]) max1 = ma->z1[k];
		for (k = 0, max2 = -1; k <= ma->M - ma->n1 * 2; ++k)
			if (max2 < ma->z2[k]) max2 = ma->z2[k];
		rst->lrt = log(max1 * max2 / max0);
		rst->lrt = rst->lrt < 0? 1 : kf_gammaq(.5, rst->lrt);
	} else rst->lrt = -1.0;
	rst->cmp[0] = rst->cmp[1] = rst->cmp[2] = rst->p_chi2 = -1.0;
	if (do_contrast && rst->p_var > 0.5) // skip contrast2() if the locus is a strong non-variant
		rst->p_chi2 = contrast2(ma, rst->cmp);
	return 0;
}