a367c929ac286f2c8868f59e63bb0de2331ec588
kate
  Wed Mar 21 00:15:18 2018 -0700
Fix off-by-one. refs #17512

diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c
index 7f952bd..aee8b9d 100644
--- src/hg/hgTracks/interactTrack.c
+++ src/hg/hgTracks/interactTrack.c
@@ -98,31 +98,31 @@
         dyStringPrintf(ds, "%s bp", buf);
         }
     }
 else
     dyStringPrintf(ds, "%s", inter->name);
 if (inter->score)
     dyStringPrintf(ds, " %d", inter->score);
 if (inter->value != 0.0)
     dyStringPrintf(ds, " %0.2f", inter->value);
 return dyStringCannibalize(&ds);
 }
 
 int regionCenter(int start, int end)
 /* Return center of genomic region */
 {
-return round((double)(end - start + .5) / 2) + start;
+return ((double)(end - start + .5) / 2) + start;
 }
 
 int regionFootWidth(int start, int end, double scale)
 /* Return half foot width in pixels */
 {
     unsigned size = end - start;
     int width = scale * (double)size / 2;
     if (width == 0)
         width = 1;
     return width;
 }
 
 void interactRegionCenters(struct interact *inter, int *sourceCenter, int *targetCenter)
 /* Return genomic position of endpoint centers */
 {
@@ -133,31 +133,31 @@
 }
 
 int interactSize(struct interact *inter)
 /* Compute length of interaction (distance between middle of each region) in bp */
 {
 int sourceCenter = 0, targetCenter = 0;
 interactRegionCenters(inter, &sourceCenter, &targetCenter);
 return abs(targetCenter - sourceCenter);
 }
 
 int getX(int pos, int seqStart, double scale, int xOff)
 /* Get x coordinate of a genomic location. Return -1 if off-screen */
 {
 if (pos < seqStart)
     return -1;
-return round((double)(pos - seqStart + .5) * scale) + xOff;
+return ((double)(pos - seqStart + .5) * scale) + xOff;
 }
 
 struct interactTrackInfo {
     boolean isDirectional;
     boolean doOtherLabels;  // true to suppress labels on other chrom items (prevent overlap)
     int maxSize;        // longest interaction (midpoint to midpoint) in bp
     int fontHeight;
     int sameCount;      // number of same chromosome interactions in window
     int sameHeight;     // vertical space for same chromosome interactions
     int otherCount;     // number of other chromosome interactions in window
     int otherHeight;    // vertical space for other chromosome interactions
 } interactTrackInfo;
 
 struct interactTrackInfo *interactGetTrackInfo(struct track *tg, int seqStart, struct hvGfx *hvg,                                                       int xOff, MgFont *font, double scale)
 /* Get layout info from interact items in window */
@@ -179,31 +179,30 @@
         {
         tInfo->sameCount++;
         // determine maximum interaction size, for later use laying out 'peaks'
         int size = interactSize(inter);
         if (size > tInfo->maxSize)
             tInfo->maxSize = size;
         }
     else
         {
         tInfo->otherCount++;
         // suppress interchromosomal labels if they overlap
         if (!tInfo->doOtherLabels)
             continue;
         int labelWidth = vgGetFontStringWidth(hvg->vg, font, otherChrom);
         int x = getX(inter->chromStart, seqStart, scale, xOff);
-        assert(x > 0);
         int labelStart = round((double)(x - labelWidth)/2);
         int labelEnd = labelStart + labelWidth - 1;
         if (labelStart <= prevLabelEnd && 
                 !(labelStart == prevLabelStart && labelEnd == prevLabelEnd && 
                     sameString(otherChrom, prevLabel)))
             tInfo->doOtherLabels = FALSE;
         prevLabelStart = labelStart;
         prevLabelEnd = labelEnd;
         prevLabel = otherChrom;
         }
     }
 tInfo->fontHeight = vgGetFontPixelHeight(hvg->vg, font);
 tInfo->otherHeight = (tInfo->otherCount) ? 3 * tInfo->fontHeight : 0;
 tInfo->sameHeight = (tInfo->sameCount) ? tg->height - tInfo->otherHeight : 0;
 return tInfo;
@@ -226,30 +225,31 @@
                                 INTERACT_DRAW, INTERACT_DRAW_DEFAULT);
     if (sameString(drawMode, INTERACT_DRAW_CURVE))
         draw = DRAW_CURVE;
     else if (sameString(drawMode, INTERACT_DRAW_ELLIPSE))
         draw = DRAW_ELLIPSE;
     }
 
 double scale = scaleForWindow(width, seqStart, seqEnd);
 struct interact *inter = NULL;
 char buffer[1024];
 char itemBuf[2048];
 
 // Gather info for layout
 struct interactTrackInfo *tInfo = interactGetTrackInfo(tg, seqStart, hvg, xOff, font, scale);
 
+
 // Draw items
 for (inter = (struct interact *)tg->items; inter; inter = inter->next)
     {
     char *otherChrom = interactOtherChrom(inter);
     safef(itemBuf, sizeof itemBuf, "%s", inter->name);
     char *statusBuf = interactMouseover(inter, otherChrom);
 
     // Pick colors
     color = interactItemColor(tg, inter, hvg);
     if (vis == tvDense && otherChrom && color == MG_BLACK)
         // use highlight color for other chrom items in dense mode
         color = MG_MAGENTA;
     int peakColor = (color == MG_BLACK || tg->colorShades) ? MG_MAGENTA : MG_GRAY;
     
     if (otherChrom)