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