- if (b->core.flag&BAM_FUNMAP) cond = 1;
- else if (b->core.qual < ma->min_mq) cond = 1;
- else if ((ma->flag&MPLP_NO_ORPHAN) && (b->core.flag&1) && !(b->core.flag&2)) cond = 1;
- if (ma->ref && !cond && (ma->flag&MPLP_REALN)) bam_realn(b, ma->ref);
- } while (cond);
+ skip = 0;
+ if (has_ref && (ma->flag&MPLP_REALN)) bam_realn(b, ma->ref);
+ if ((ma->flag&MPLP_CAPQ) && has_ref) {
+ int q = bam_cap_mapQ(b, ma->ref);
+ if (q < 0) skip = 1;
+ else if (b->core.qual > q) b->core.qual = q;
+ } else if (b->core.flag&BAM_FUNMAP) skip = 1;
+ else if (b->core.qual < ma->min_mq) skip = 1;
+ else if ((ma->flag&MPLP_NO_ORPHAN) && (b->core.flag&1) && !(b->core.flag&2)) skip = 1;
+ } while (skip);