58ada3bc410cb2ee88828d95f2be1168328bc0d9
braney
  Tue Feb 7 10:11:53 2017 -0800
more tweaks to label support for big* files.   Added defaultLabelFields
and labelSeparator.  Also support "none" for both labelFields and
defaultLabelFields.

diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c
index 74ceb60..68ed7c8 100644
--- src/hg/hgTracks/bedTrack.c
+++ src/hg/hgTracks/bedTrack.c
@@ -35,30 +35,32 @@
 
 static void calculateLabelFields(struct track *track)
 /* Figure out which fields are available to label a bigBed track. */
 {
 struct bbiFile *bbi = fetchBbiForTrack(track);
 struct asObject *as = bigBedAsOrDefault(bbi);
 struct slPair *labelList = buildFieldList(track->tdb, "labelFields",  as);
 
 if (labelList == NULL)
     {
     // There is no labelFields entry in the trackDb.
     // If there is a name, use it by default, otherwise no label by default 
     if (track->bedSize > 3)
         slAddHead(&track->labelColumns, slIntNew(3));
     }
+else if (sameString(labelList->name, "none"))
+    return;  // no label
 else
     {
     // what has the user said to use as a label
     char cartVar[1024];
     safef(cartVar, sizeof cartVar, "%s.label", track->tdb->track);
     struct hashEl *labelEl = cartFindPrefix(cart, cartVar);
     struct hash *onHash = newHash(4);
 
     // fill hash with fields that should be used for labels
     if (labelEl == NULL) 
         {
         // there are no cart variables, so look for defaults
         struct slPair *defaultLabelList = buildFieldList(track->tdb, "defaultLabelFields",  as);
         if (defaultLabelList != NULL)
             {
@@ -152,42 +154,46 @@
     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"))
         tg->itemName = bigBedItemName;
+    else
+        {
         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
     {
     struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
     struct sqlResult *sr = NULL;
     /* limit to items above a specified score */
     char *scoreFilterClause = getScoreFilterClause(cart, tg->tdb,NULL);
     if (doScoreCtFilter && (topTable != NULL) && hTableExists(database, topTable))
 	{
 	sqlSafef(query, sizeof(query),"select * from %s order by score desc limit %d",
 	      topTable, scoreFilterCt);
 	sr = sqlGetResult(conn, query);
 	rowOffset = hOffsetPastBin(database, hDefaultChrom(database), topTable);
 	}
     else if(scoreFilterClause != NULL && tg->bedSize >= 5)
 	{