c2c780666cf30f764fe4eb81b7fad350b0a7391a
kate
  Thu Mar 8 15:56:39 2018 -0800
Add trackDb setting to indicate if there is a direction to the interaction (interactDirectional). refs #17512

diff --git src/hg/hgTracks/interactTrack.c src/hg/hgTracks/interactTrack.c
index b9c5228..e92a3ee 100644
--- src/hg/hgTracks/interactTrack.c
+++ src/hg/hgTracks/interactTrack.c
@@ -43,30 +43,32 @@
         MgFont *font, Color color, enum trackVisibility vis)
 /* Draw a list of interact structures. */
 {
 #define DRAW_LINE       0
 #define DRAW_CURVE      1
 #define DRAW_ELLIPSE    2
 
 char *drawMode = cartUsualStringClosestToHome(cart, tg->tdb, FALSE,
                                 INTERACT_DRAW, INTERACT_DRAW_DEFAULT);
 int draw  = DRAW_LINE;
 if (sameString(drawMode, INTERACT_DRAW_CURVE))
     draw = DRAW_CURVE;
 else if (sameString(drawMode, INTERACT_DRAW_ELLIPSE))
     draw = DRAW_ELLIPSE;
 
+boolean isDirectional = interactUiDirectional(tg->tdb);
+
 double scale = scaleForWindow(width, seqStart, seqEnd);
 struct interact *inters = tg->items;
 unsigned int maxWidth = 0;
 struct interact *inter;
 char buffer[1024];
 char itemBuf[2048];
 safef(buffer, sizeof buffer, "%s.%s", tg->tdb->track, INTERACT_MINSCORE);
 
 // Determine if there are mixed inter and intra-chromosomal 
 // Suppress interchromosomal labels if they overlap
 int nSame = 0, nOther = 0;
 int prevLabelEnd = 0, prevLabelStart = 0;
 char *prevLabel = 0;
 boolean doOtherLabels = TRUE;
 char *otherChrom = NULL;
@@ -164,34 +166,36 @@
         if (tg->visibility == tvDense)
             {
             height = tg->height;
             }
         else
             {
             height = otherHeight/2;
             yOffOther = yOff + sameHeight;
             }
         yPos = yOffOther + height;
 
         // draw the foot
         hvGfxLine(hvg, sx - sFootWidth, yOffOther, sx + sFootWidth, yOffOther, color);
 
         // draw the vertical
-        if (sameString(inter->chrom, inter->sourceChrom))
-            hvGfxLine(hvg, sx, yOffOther, sx, yPos, color);
-        else
+        // TODO: modularize directional/non-directional draws
+        if (differentString(inter->chrom, inter->sourceChrom) && isDirectional)
             hvGfxDottedLine(hvg, sx, yOffOther, sx, yPos, color, TRUE);
+        else
+            hvGfxLine(hvg, sx, yOffOther, sx, yPos, color);
+        
         if (tg->visibility == tvFull)
             {
             // add map box to foot
             char *nameBuf = (inter->chromStart == inter->sourceStart ?      
                             inter->sourceName : inter->targetName);
             mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, 
                             sx - sFootWidth, yOffOther, sFootWidth * 2, 4,
                             tg->track, itemBuf, nameBuf, NULL, TRUE, NULL);
 
             // add map box to vertical
             mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, sx - 2, yOffOther, 4, height,
                                    tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
             if (doOtherLabels)
                 {
                 safef(buffer, sizeof buffer, "%s", sameString(inter->chrom, inter->sourceChrom) ?
@@ -212,45 +216,45 @@
     boolean eOnScreen = (e >= seqStart) && (e < seqEnd);
 
     double interWidth = e - s;
     int peakHeight = (sameHeight - 15) * ((double)interWidth / maxWidth) + 10;
     int peak = yOff + peakHeight;
     if (tg->visibility == tvDense)
         peak = yOff + tg->height;
 
     if (sOnScreen)
         {
         // draw foot of lower region
         hvGfxLine(hvg, sx - sFootWidth, yOff, sx + sFootWidth, yOff, color);
         // draw vertical
         if (!eOnScreen || draw == DRAW_LINE)
             {
-            if (inter->chromStart == inter->targetStart)
+            if (inter->chromStart == inter->targetStart && isDirectional)
                 hvGfxDottedLine(hvg, sx, yOff, sx, peak, color, TRUE);
             else
                 hvGfxLine(hvg, sx, yOff, sx, peak, color);
             }
         }
     if (eOnScreen)
         {
         // draw foot of upper region
         hvGfxLine(hvg, ex - eFootWidth, yOff, ex + eFootWidth, yOff, color);
 
         // draw vertical
         if (!sOnScreen || draw == DRAW_LINE)
             {
-            if (inter->chromStart == inter->targetStart)
+            if (inter->chromStart == inter->targetStart && isDirectional)
                 hvGfxDottedLine(hvg, ex, yOff, ex, peak, color, TRUE);
             else
                 hvGfxLine(hvg, ex, yOff, ex, peak, color);
             }
         }
     if (tg->visibility == tvFull)
         {
         char *nameBuf = NULL;
         if (sOnScreen)
             {
             /* add mapbox to lower region */
             nameBuf = (inter->chromStart == inter->sourceStart ?      
                             inter->sourceName : inter->targetName);
             mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd, 
                             sx - sFootWidth, yOff, sFootWidth * 2, 4,
@@ -286,31 +290,31 @@
                 int yTop = yOff - peakHeight;
                 hvGfxEllipseDraw(hvg, sx, yLeft, ex, yTop, color, ELLIPSE_BOTTOM, isDashed);
                 // map box on peak
                 // FIXME: not working
                 /*mapBoxHgcOrHgGene(hvg, inter->chromStart, inter->chromEnd,
                                     sx - sFootWidth - 2, yOff + peakHeight, 4, 4,
                                     tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
 */
                 }
             }
         else
             {
             // draw link horizontal line between regions (dense mode just shows feet ??)
             unsigned ePeak = eOnScreen ? ex : xOff + width;
             unsigned sPeak = sOnScreen ? sx : xOff;
-            if (inter->sourceStart > inter->targetStart)
+            if (inter->sourceStart > inter->targetStart && isDirectional)
                 hvGfxDottedLine(hvg, sPeak, peak, ePeak, peak, color, TRUE);
             else
                 hvGfxLine(hvg, sPeak, peak, ePeak, peak, color);
 
             // map box on horizontal line
             mapBoxHgcOrHgGene(hvg, s, e, sPeak, peak-2, ePeak - sPeak, 4,
                                tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
 
             // map boxes on verticals
             if (sOnScreen)
                 mapBoxHgcOrHgGene(hvg, s, e, sx - 2, yOff, 4, peak - yOff,
                                        tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);
             if (eOnScreen)
                 mapBoxHgcOrHgGene(hvg, s, e, ex - 2, yOff, 4, peak - yOff,
                                        tg->track, itemBuf, statusBuf, NULL, TRUE, NULL);