6e60e7d3ae54dab60eb8c7ad1af02441266729c3
kate
  Mon Aug 13 15:24:08 2018 -0700
Expanding interactDirectional to allow source or target offset display. refs #21109

diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c
index 688a982..e667d78 100644
--- src/hg/hgTracks/interactTrack.c
+++ src/hg/hgTracks/interactTrack.c
@@ -169,48 +169,48 @@
 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 ((double)(pos - seqStart + .5) * scale) + xOff;
 }
 
 struct interactTrackInfo {
     boolean isDirectional; // source and target are distinct item types
-    boolean isOffset;   // source and target ends are on different horizontals
+    char *offset;          // which end to draw offset (source or target)
     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 */
 {
 struct interactTrackInfo *tInfo = NULL;
 AllocVar(tInfo);
 tInfo->doOtherLabels = TRUE;
 tInfo->isDirectional = interactUiDirectional(tg->tdb);
-tInfo->isOffset = interactUiOffset(tg->tdb);
+tInfo->offset = interactUiOffset(tg->tdb);
 
 char *otherChrom = NULL;
 int prevLabelEnd = 0, prevLabelStart = 0;
 char *prevLabel = 0;
 struct interact *inter;
 
 for (inter = (struct interact *)tg->items; inter; inter = inter->next)
     {
     otherChrom = interactOtherChrom(inter);
     if (otherChrom == NULL)
         {
         tInfo->sameCount++;
         // determine maximum interaction size, for later use laying out 'peaks'
         int size = interactSize(inter);
         if (size > tInfo->maxSize)
@@ -378,31 +378,32 @@
     // NOTE: until time permits, force to rectangle when in reversed strand mode.
 
     if (sOnScreen)
         {
         // draw foot of source region (2 pixels high)
         hvGfxBox(hvg, sX - sWidth, yOff, sWidth + sWidth + 1, 2, color);
         if (vis == tvDense || !tOnScreen || draw == DRAW_LINE || hvg->rc)
             {
             // draw vertical
             if (isReversed)
                 hvGfxDottedLine(hvg, sX, yOff, sX, peak, color, TRUE);
             else
                 hvGfxLine(hvg, sX, yOff, sX, peak, color);
             }
         }
-    int yOffTarget = (tInfo->isOffset ? yOff + tg->height/20 + 1 : yOff);
+    int yOffTarget = (tInfo->offset && sameString(tInfo->offset, INTERACT_OFFSET_TARGET)? 
+                        yOff + tg->height/20 + 1 : yOff);
     if (tOnScreen)
         {
         // draw foot of target region (2 pixels high)
         hvGfxBox(hvg, tX - tWidth, yOffTarget, tWidth + tWidth + 1, 2, color);
         if (vis == tvDense || !sOnScreen || draw == DRAW_LINE || hvg->rc)
             {
             // draw vertical
             if (isReversed)
                 hvGfxDottedLine(hvg, tX, yOffTarget, tX, peak, color, TRUE);
             else
                 hvGfxLine(hvg, tX, yOffTarget, tX, peak, color);
             }
         }
     if (vis == tvDense)
         continue;