6dcef0d057b21be3cb1cbe699998764883543c84
kate
  Thu Apr 6 16:46:22 2017 -0700
First cut bigBarChart track type for hubs. Basic function on hgTracks, hgTrackUi, and hgc.  Lacks boxplot on details page, custom track support, extra fields

diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c
index da2759d..17ad9c4 100644
--- src/hg/hgTracks/bedTrack.c
+++ src/hg/hgTracks/bedTrack.c
@@ -82,62 +82,46 @@
         }
 
     struct slPair *thisLabel = labelList;
     for(; thisLabel; thisLabel = thisLabel->next)
         {
         if (hashLookup(onHash, thisLabel->name))
             {
             // put this column number in the list of columns to use to make label
             slAddHead(&track->labelColumns, slIntNew(ptToInt(thisLabel->val)));
             }
         }
     slReverse(&track->labelColumns);
     }
 }
 
-void loadSimpleBed(struct track *tg)
-/* Load the items in one track - just move beds in
- * window... */
+char *bedName(struct track *tg, void *item);
+
+void loadSimpleBedWithLoader(struct track *tg, bedItemLoader loader)
+/* Load the items in one track using specified loader - just move beds in window... */
 {
-struct bed *(*loader)(char **row);
 struct bed *bed, *list = NULL;
 char **row;
 int rowOffset;
 char *words[3];
 int wordCt;
 char query[128];
-char *setting = NULL;
 bool doScoreCtFilter = FALSE;
 int scoreFilterCt = 0;
+char *setting;
 char *topTable = NULL;
 
-if (tg->bedSize <= 3)
-    loader = bedLoad3;
-else if (tg->bedSize == 4)
-    loader = bedLoad;
-else if (tg->bedSize == 5)
-    loader = bedLoad5;
-else
-    loader = bedLoad6;
-
-// pairedTagAlign loader is required for base coloring using sequence from seq1 & seq2
-// after removing optional bin column, this loader assumes seq1 and seq2 are in
-// row[6] and row[7] respectively of the sql result.
-if ((setting = trackDbSetting(tg->tdb, BASE_COLOR_USE_SEQUENCE))
-	&& sameString(setting, "seq1Seq2"))
-    loader = bedLoadPairedTagAlign;
-
 /* limit to a specified count of top scoring items.
  * If this is selected, it overrides selecting item by specified score */
 if ((setting = trackDbSettingClosestToHome(tg->tdb, "filterTopScorers")) != NULL)
     {
     wordCt = chopLine(cloneString(setting), words);
     if (wordCt >= 3)
         {
         doScoreCtFilter = cartUsualBooleanClosestToHome(cart, tg->tdb, FALSE,
                              "filterTopScorersOn",sameString(words[0], "on"));
         scoreFilterCt = cartUsualIntClosestToHome(cart, tg->tdb, FALSE,
                              "filterTopScorersCt", atoi(words[1]));
         topTable = words[2];
         /* if there are not too many rows in the table then can define */
         /* top table as the track or subtrack table */
         if (sameWord(topTable, "self"))
@@ -153,31 +137,31 @@
     struct bedTabixFile *btf = bedTabixFileMayOpen(bigDataUrl, NULL, 0, 0);
     list = bedTabixReadBeds(btf, chromName, winStart, winEnd, loader);
     bedTabixFileClose(&btf);
     }
 else if (tg->isBigBed)
     { // avoid opening an unneeded db connection for bigBed; required not to use mysql for parallel fetch tracks
     char *scoreFilter = cartOrTdbString(cart, tg->tdb, "scoreFilter", NULL);
     struct lm *lm = lmInit(0);
     struct bigBedInterval *bb, *bbList = bigBedSelectRange(tg, chromName, winStart, winEnd, lm);
     char *bedRow[32];
     char startBuf[16], endBuf[16];
     int minScore = 0;
     if (scoreFilter)
 	minScore = atoi(scoreFilter);
 
-    if (!trackDbSettingClosestToHomeOn(tg->tdb, "linkIdInName"))
+     if (tg->itemName == bedName && !trackDbSettingClosestToHomeOn(tg->tdb, "linkIdInName"))
         tg->itemName = bigBedItemName;
 
     calculateLabelFields(tg);
     for (bb = bbList; bb != NULL; bb = bb->next)
         {
         bigBedIntervalToRow(bb, chromName, startBuf, endBuf, bedRow, ArraySize(bedRow));
         bed = loader(bedRow);
         bed->label = makeLabel(tg, bb);
         if (scoreFilter == NULL || bed->score >= minScore)
             slAddHead(&list, bed);
         }
     lmCleanup(&lm);
     }
 else
     {
@@ -208,30 +192,54 @@
 	}
     sqlFreeResult(&sr);
     hFreeConn(&conn);
     }
 
 if (doScoreCtFilter)
     {
     /* filter out items not in this window */
     struct bed *newList = bedFilterListInRange(list, NULL, chromName, winStart, winEnd);
     list = newList;
     }
 slReverse(&list);
 tg->items = list;
 }
 
+void loadSimpleBed(struct track *tg)
+/* Load the items in one track - just move beds in
+ * window... */
+{
+struct bed *(*loader)(char **row);
+if (tg->bedSize <= 3)
+    loader = bedLoad3;
+else if (tg->bedSize == 4)
+    loader = bedLoad;
+else if (tg->bedSize == 5)
+    loader = bedLoad5;
+else
+    loader = bedLoad6;
+
+char *setting = NULL;
+// pairedTagAlign loader is required for base coloring using sequence from seq1 & seq2
+// after removing optional bin column, this loader assumes seq1 and seq2 are in
+// row[6] and row[7] respectively of the sql result.
+if ((setting = trackDbSetting(tg->tdb, BASE_COLOR_USE_SEQUENCE))
+	&& sameString(setting, "seq1Seq2"))
+    loader = bedLoadPairedTagAlign;
+loadSimpleBedWithLoader(tg, loader);
+}
+
 void bed8To12(struct bed *bed)
 /* Turn a bed 8 into a bed 12 by defining one block. */
 {
 // Make up a block: the whole thing.
 bed->blockCount  = 1;
 bed->blockSizes  = needMem(bed->blockCount * sizeof(int));
 bed->chromStarts = needMem(bed->blockCount * sizeof(int));
 bed->blockSizes[0]  = bed->chromEnd - bed->chromStart;
 bed->chromStarts[0] = 0;
 // Some tracks overload thickStart and thickEnd -- catch garbage here.
 if ((bed->thickStart != 0) &&
     ((bed->thickStart < bed->chromStart) ||
      (bed->thickStart > bed->chromEnd)))
     bed->thickStart = bed->chromStart;
 if ((bed->thickEnd != 0) &&