- if (bam_cigar_op(cigar2[i]) == BAM_CMATCH && bam_cigar_op(cigar2[i-1]) == BAM_CPAD && bam_cigar_op(cigar2[i-2]) == BAM_CMATCH)
- cigar2[i] += cigar2[i-2], cigar2[i-2] = cigar2[i-1] = 0;
+ if (bam_cigar_op(cigar2[i-1]) == BAM_CPAD) {
+ pre_op = bam_cigar_op(cigar2[i-2]);
+ post_op = bam_cigar_op(cigar2[i]);
+ /* Note don't need to check for X/= as code above will use M only */
+ if ((pre_op == BAM_CMATCH || pre_op == BAM_CDEL) && (post_op == BAM_CMATCH || post_op == BAM_CDEL)) {
+ /* This is a redundant P operator */
+ cigar2[i-1] = 0; // i.e. 0M
+ /* If had same operator either side, combine them in post_op */
+ if (pre_op == post_op) {
+ /* If CIGAR M, could treat as simple integers since BAM_CMATCH is zero*/
+ cigar2[i] = bam_cigar_gen(bam_cigar_oplen(cigar2[i-2]) + bam_cigar_oplen(cigar2[i]), post_op);
+ cigar2[i-2] = 0; // i.e. 0M
+ }
+ }
+ }
+ /* Remove the zero'd operators (0M) */