ea5b4301814c1df9f2a0f3b2d9e0d2f06b22635e
braney
  Tue May 24 18:37:10 2016 -0700
hgTables support , some display changes, and a better hgc
page for longTabix

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 17dc990..2b6e044 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -3913,30 +3913,31 @@
 	struct trackDb *tdb, char *item, char *itemForUrl)
 /* Print page for container of some sort. */
 {
 if (sameString(containerType, "multiWig"))
     {
     errAbort("It's suprising that multiWig container gets to hgc. It should go to hgTrackUi.");
     }
 else
     {
     errAbort("Unrecognized container type %s for %s", containerType, tdb->track);
     }
 }
 
 
 static void doLongTabix(struct trackDb *tdb, char *item)
+/* Handle a click on a long range interaction */
 {
 char *bigDataUrl = hashFindVal(tdb->settingsHash, "bigDataUrl");
 struct bedTabixFile *btf = bedTabixFileMayOpen(bigDataUrl, NULL, 0, 0);
 char *chromName = cartString(cart, "c");
 struct bed *list = bedTabixReadBeds(btf, chromName, winStart, winEnd, bedLoad5);
 bedTabixFileClose(btf);
 unsigned maxWidth;
 struct longRange *longRangeList = parseLongTabix(list, &maxWidth, 0);
 struct longRange *longRange, *ourLongRange = NULL;
 unsigned itemNum = sqlUnsigned(item);
 unsigned count = slCount(longRangeList);
 double *doubleArray;
 
 AllocArray(doubleArray, count);
 
@@ -3946,43 +3947,54 @@
     if (longRange->id == itemNum)
         {
         ourLongRange = longRange;
         }
     doubleArray[ii] = longRange->score;
     }
 
 if (ourLongRange == NULL)
     errAbort("cannot find long range item with id %d\n", itemNum);
 
 struct aveStats *as = aveStatsCalc(doubleArray, count);
 
 printf("Item you clicked on:<BR>\n");
 printf("<B>Score:</B> %g<BR>\n", ourLongRange->score);
 printf("<B>ID:</B> %u<BR>\n", ourLongRange->id);
-//printf("<A HREF=\"hgTracks?position=%s:%d-%d\" TARGET=_BLANK><B>Link to other block </A><BR>\n",  otherChrom, s, e);
-
-printf("<BR>All items in window:\n");
-
-printf("<BR>Q1 %f\n", as->q1);
-printf("<BR>median %f\n", as->median);
-printf("<BR>Q3 %f\n", as->q3);
-printf("<BR>average %f\n", as->average);
-printf("<BR>min %f\n", as->minVal);
-printf("<BR>max %f\n", as->maxVal);
-printf("<BR>count %d\n", as->count);
-printf("<BR>total %f\n", as->total);
-printf("<BR>standard deviation %f\n", as->stdDev);
+unsigned padding =  (ourLongRange->e - ourLongRange->s) / 10;
+int s = ourLongRange->s - padding; 
+int e = ourLongRange->e + padding; 
+if (s < 0 ) 
+    s = 0;
+int chromSize = hChromSize(database, seqName);
+if (e > chromSize)
+    e = chromSize;
+printf("<A HREF=\"hgTracks?position=%s:%d-%d\" TARGET=_BLANK><B>Link to range covered by interaction.</B></A><BR>\n",  
+    ourLongRange->sChrom, s, e);
+
+printf("<BR>Statistics on the scores of all items in window (go to track controls to set minimum score to display):\n");
+
+printf("<TABLE BORDER=1>\n");
+printf("<TR><TD><B>Q1</B></TD><TD>%f</TD></TR>\n", as->q1);
+printf("<TR><TD><B>median</B></TD><TD>%f</TD></TR>\n", as->median);
+printf("<TR><TD><B>Q3</B></TD><TD>%f</TD></TR>\n", as->q3);
+printf("<TR><TD><B>average</B></TD><TD>%f</TD></TR>\n", as->average);
+printf("<TR><TD><B>min</B></TD><TD>%f</TD></TR>\n", as->minVal);
+printf("<TR><TD><B>max</B></TD><TD>%f</TD></TR>\n", as->maxVal);
+printf("<TR><TD><B>count</B></TD><TD>%d</TD></TR>\n", as->count);
+printf("<TR><TD><B>total</B></TD><TD>%f</TD></TR>\n", as->total);
+printf("<TR><TD><B>standard deviation</B></TD><TD>%f</TD></TR>\n", as->stdDev);
+printf("</TABLE>\n");
 }
 
 void genericClickHandlerPlus(
         struct trackDb *tdb, char *item, char *itemForUrl, char *plus)
 /* Put up generic track info, with additional text appended after item. */
 {
 char *dupe, *type, *words[16], *headerItem;
 int wordCount;
 int start = cartInt(cart, "o");
 int end = cartInt(cart, "t");
 struct sqlConnection *conn = NULL;
 char *imagePath = trackDbSetting(tdb, ITEM_IMAGE_PATH);
 char *container = trackDbSetting(tdb, "container");
 
 if (!trackHubDatabase(database))