087cf4606b0df6c0c5b9db6df76ea8e15b1551c7
braney
  Fri May 13 17:22:30 2016 -0700
oops... missed a file needed for bedTabix and longTabix

diff --git src/hg/hgTracks/connectTrack.c src/hg/hgTracks/connectTrack.c
new file mode 100644
index 0000000..5309417
--- /dev/null
+++ src/hg/hgTracks/connectTrack.c
@@ -0,0 +1,143 @@
+
+#include "common.h"
+#include "hgTracks.h"
+
+struct connect
+{
+struct connect *next;
+unsigned s;
+unsigned sw;
+int sOrient;
+char *sChrom;
+unsigned e;
+unsigned ew;
+int eOrient;
+char *eChrom;
+unsigned height;
+double score;
+unsigned id;
+};
+
+int trackHeight = 200;
+
+static int connectHeight(struct track *tg, enum trackVisibility vis)
+/* calculate height of all the snakes being displayed */
+{
+return trackHeight;
+}
+
+static char *getOther(struct bed *bed, unsigned *s, unsigned *e, double *score)
+{
+char *otherChrom = cloneString(bed->name);
+char *ptr = strchr(otherChrom, ':');
+if (ptr == NULL)
+    errAbort("bad longTabix bed name %s\n", bed->name);
+*ptr++ = 0;
+*s = atoi(ptr);
+ptr = strchr(ptr, '-');
+if (ptr == NULL)
+    errAbort("bad longTabix bed name %s\n", bed->name);
+ptr++;
+*e = atoi(ptr);
+ptr = strchr(ptr, ',');
+if (ptr == NULL)
+    errAbort("bad longTabix bed name %s\n", bed->name);
+ptr++;
+*score = sqlDouble(ptr);
+
+return otherChrom;
+}
+
+static void connectDraw(struct track *tg, int seqStart, int seqEnd,
+        struct hvGfx *hvg, int xOff, int yOff, int width, 
+        MgFont *font, Color color, enum trackVisibility vis)
+{
+double scale = scaleForWindow(width, seqStart, seqEnd);
+struct bed *beds = tg->items;
+struct connect *connect;
+struct connect *connectList = NULL;
+
+double maxWidth = 0;
+for(; beds; beds=beds->next)
+    {
+    AllocVar(connect);
+    slAddHead(&connectList, connect);
+
+    unsigned otherS;
+    unsigned otherE;
+    double score;
+    char *otherChrom = getOther(beds, &otherS, &otherE, &score);
+    unsigned otherCenter = (otherS + otherE)/2;
+    unsigned otherWidth = otherE - otherS;
+    unsigned thisWidth = beds->chromEnd - beds->chromStart;
+    unsigned center = (beds->chromEnd + beds->chromStart) / 2;
+
+
+    // don't have oriented feet at the moment
+    connect->sOrient = connect->eOrient = 0;
+    connect->id = beds->score;
+    connect->score = score;
+    
+    if (otherCenter < center)
+        {
+        connect->s = otherCenter;
+        connect->sw = otherWidth;
+        connect->sChrom = otherChrom;
+        connect->e = center;
+        connect->ew = thisWidth;
+        connect->eChrom = beds->chrom;
+        }
+    else
+        {
+        connect->s = center;
+        connect->sw = thisWidth;
+        connect->sChrom = beds->chrom;
+        connect->e = otherCenter;
+        connect->ew = otherWidth;
+        connect->eChrom = otherChrom;
+        }
+    double connectWidth = connect->e - connect->s;
+    if (connectWidth > maxWidth)
+        maxWidth = connectWidth;
+    }
+
+    for(connect=connectList; connect; connect=connect->next)
+        {
+        if (sameString(connect->sChrom, connect->eChrom))
+            {
+            int sx = (connect->s - seqStart) * scale + xOff;
+            int ex = (connect->e - seqStart) * scale + xOff;
+            double connectWidth = connect->e - connect->s;
+            int height = (trackHeight - 15) * (connectWidth / maxWidth) + yOff + 10;
+            int tsx = sx;
+            int tex = ex;
+
+            if (tsx > tex)
+                {
+                tsx = sx;
+                tex = ex;
+                }
+            
+            hvGfxLine(hvg, sx, yOff, tsx, height, color);
+            hvGfxLine(hvg, tsx, height, tex, height, color);
+            hvGfxLine(hvg, ex, yOff, tex, height, color);
+            char itemBuf[2048];
+            safef(itemBuf, sizeof itemBuf, "%d", connect->id);
+            char statusBuf[2048];
+            safef(statusBuf, sizeof statusBuf, "%g %s:%d", connect->score, connect->eChrom, connect->e);
+            mapBoxHgcOrHgGene(hvg, connect->s, connect->e,tsx, height-2, tex-tsx, 4,
+                                   tg->track, itemBuf, statusBuf, "directUrl", TRUE,
+                                   "extra");
+            }
+        }
+}
+
+void connectMethods(struct track *tg, struct trackDb *tdb)
+{
+tg->drawItems = linkedFeaturesDraw;
+tg->drawItemAt = linkedFeaturesDrawAt;
+tg->canPack = tdb->canPack = TRUE;
+tg->drawItems = connectDraw;
+tg->totalHeight = connectHeight; 
+tg->mapsSelf = TRUE;
+}