8cdb1f118cfc901ec346fbaffa3e0a07155675c6 braney Mon Jan 5 11:27:58 2015 -0800 support '=' and 'X' in BAM cigars #14593 diff --git src/hg/hgTracks/bamTrack.c src/hg/hgTracks/bamTrack.c index 7d1bece..11e541e 100644 --- src/hg/hgTracks/bamTrack.c +++ src/hg/hgTracks/bamTrack.c @@ -51,30 +51,32 @@ psl->tName = cloneString(chromName); unsigned blockCount = 0; unsigned *blockSizes, *qStarts, *tStarts; AllocArray(blockSizes, core->n_cigar); AllocArray(qStarts, core->n_cigar); AllocArray(tStarts, core->n_cigar); int tPos = core->pos, qPos = 0, qLength = 0; unsigned int *cigar = bam1_cigar(bam); int i; for (i = 0; i < core->n_cigar; i++) { char op; int n = bamUnpackCigarElement(cigar[i], &op); switch (op) { + case 'X': // mismatch (gapless aligned block) + case '=': // match (gapless aligned block) case 'M': // match or mismatch (gapless aligned block) blockSizes[blockCount] = n; qStarts[blockCount] = qPos; tStarts[blockCount] = tPos; blockCount++; tPos += n; qPos += n; qLength += n; break; case 'I': // inserted in query qPos += n; qLength += n; break; case 'D': // deleted from query case 'N': // long deletion from query (intron as opposed to small del) @@ -109,30 +111,32 @@ struct simpleFeature *sfFromNumericCigar(const bam1_t *bam, int *retLength) /* Translate BAM's numeric CIGAR encoding into a list of simpleFeatures, * and tally up length on reference sequence while we're at it. */ { const bam1_core_t *core = &bam->core; struct simpleFeature *sf, *sfList = NULL; int tLength=0, tPos = core->pos, qPos = 0; unsigned int *cigar = bam1_cigar(bam); int i; for (i = 0; i < core->n_cigar; i++) { char op; int n = bamUnpackCigarElement(cigar[i], &op); switch (op) { + case 'X': // mismatch (gapless aligned block) + case '=': // match (gapless aligned block) case 'M': // match or mismatch (gapless aligned block) AllocVar(sf); sf->start = tPos; sf->qStart = qPos; tPos = sf->end = tPos + n; qPos = sf->qEnd = qPos + n; slAddHead(&sfList, sf); tLength += n; break; case 'I': // inserted in query qPos += n; break; case 'D': // deleted from query case 'N': // long deletion from query (intron as opposed to small del) tPos += n; @@ -853,30 +857,32 @@ /* bam_fetch() calls this on each bam alignment retrieved. */ { struct bamWigTrackData *btd = (struct bamWigTrackData *)data; const bam1_core_t *core = &bam->core; int tLength=0, tPos = core->pos, qPos = 0; unsigned int *cigar = bam1_cigar(bam); int i; double scale = btd->scale; for (i = 0; i < core->n_cigar; i++) { char op; int n = bamUnpackCigarElement(cigar[i], &op); switch (op) { + case 'X': // mismatch (gapless aligned block) + case '=': // match (gapless aligned block) case 'M': // match or mismatch (gapless aligned block) { int start = (int)(scale * (tPos - winStart)); int end = (int)(scale * ((tPos + n) - winStart)); for(i=start; i < end; i++) btd->preDraw[i + btd->preDrawZero].count++; tPos = tPos + n; qPos = qPos + n; tLength += n; break; } case 'I': // inserted in query qPos += n; break; case 'D': // deleted from query