- printf("%s\t%d\t%c", h->target_name[tid], pos + 1, (ref && pos < ref_len)? ref[pos] : 'N');
- for (i = 0; i < n; ++i) {
- int j;
- printf("\t%d\t", n_plp[i]);
- if (n_plp[i] == 0) printf("*\t*");
- else {
- for (j = 0; j < n_plp[i]; ++j)
- pileup_seq(plp[i] + j, pos, ref_len, ref);
- putchar('\t');
+ if (conf->flag & MPLP_GLF) {
+ int _ref0, ref16;
+ bcf1_t *b = calloc(1, sizeof(bcf1_t));
+ _ref0 = (ref && pos < ref_len)? ref[pos] : 'N';
+ ref16 = bam_nt16_table[_ref0];
+ for (i = 0; i < n; ++i)
+ bcf_call_glfgen(n_plp[i], plp[i], ref16, bca, bcr + i);
+ bcf_call_combine(n, bcr, ref16, &bc);
+ bcf_call2bcf(tid, pos, &bc, b);
+ bcf_write(bp, bh, b);
+ //fprintf(stderr, "%d,%d,%d\n", b->tid, b->pos, b->l_str);
+ bcf_destroy(b);
+ } else if (conf->flag & MPLP_VCF) {
+ mc_rst_t r;
+ int j, _ref0, depth, rms_q, _ref0b, is_var = 0, qref = 0, level = 2, tot;
+ uint64_t sqr_sum;
+ _ref0 = _ref0b = (ref && pos < ref_len)? ref[pos] : 'N';
+ _ref0 = bam_nt16_nt4_table[bam_nt16_table[_ref0]];
+ tot = mc_cal(_ref0, n_plp, plp, ma, &r, level);
+ if (tot) { // has good bases
+ double q;
+ is_var = (r.p_ref < .5);
+ q = is_var? r.p_ref : 1. - r.p_ref;
+ if (q < 1e-308) q = 1e-308;
+ qref = (int)(-3.434 * log(q) + .499);
+ if (qref > 99) qref = 99;
+ }
+ if ((conf->flag & MPLP_VAR) && !is_var) continue;
+ ++N; // number of processed lines
+ printf("%s\t%d\t.\t%c\t", h->target_name[tid], pos + 1, _ref0b);
+ if (is_var) {
+ putchar("ACGTN"[r.alt]);
+ if (r.alt2 >= 0 && r.alt2 < 4) printf(",%c", "ACGT"[r.alt2]);
+ } else putchar('.');
+ printf("\t%d\t", qref);
+ if (!tot) printf("Q13\t");
+ else if (r.f_exp < 0.) printf("FPE\t");
+ else printf(".\t");
+ for (i = depth = 0, sqr_sum = 0; i < n; ++i) {
+ depth += n_plp[i];