a2b887e7bae9377807d176890e0958f4a10edecb
braney
  Mon Nov 4 14:28:40 2019 -0800
add FilterLabel for labeling bigBed filters

diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 0aaa42b..d4ffb3b 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -3634,49 +3634,65 @@
 }
 
 char *extractFieldName(char *cartVariable, char *filterType)
 /* Extract field name from a filter cart variable.  Variables can either be
  * <columnName>Filter* or <columnName>.Filter* */
 {
 char *field = cloneString(cartVariable);
 int ix = strlen(field) - strlen(filterType); 
 field[ix] = '\0';
 if (field[ix - 1] == '.')
     field[ix - 1] = '\0';
 
 return field;
 }
 
+static char *getLabelSetting(struct cart *cart, struct trackDb *tdb, char *field)
+{
+char labelSetting[4096];
+safef(labelSetting, sizeof labelSetting, "%s%s", field, FILTER_LABEL_NAME);
+char *trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL);
+if (trackDbLabel == NULL)
+    {
+    safef(labelSetting, sizeof labelSetting, "%s.%s", field, FILTER_LABEL_NAME);
+    trackDbLabel = cartOrTdbString(cart, tdb, labelSetting, NULL);
+    }
+return trackDbLabel;
+}
+
 filterBy_t *buildFilterBy(struct trackDb *tdb, struct cart *cart, struct asObject *as, char *filterName, char *name)
 /* Build a filterBy_t structure from a <column>FilterValues statement. */
 {
 char *field = extractFieldName(filterName, FILTER_VALUES_NAME);
 char *setting = trackDbSetting(tdb, filterName);
 if (isEmpty(setting))
     errAbort("FilterValues setting of field '%s' must have a value.", field);
 
 char *value = cartUsualStringClosestToHome(cart, tdb, FALSE, filterName, setting);
 
 filterBy_t *filterBy;
 AllocVar(filterBy);
 filterBy->column = field;
 filterBy->title = field; ///  title should come from AS file, or trackDb variable
 struct asColumn *asCol = asColumnFind(as, field);
 if (asCol != NULL)
     filterBy->title = asCol->comment;
 else
     errAbort("Building filter on field %s which is not in AS file.", field);
+char *trackDbLabel = getLabelSetting(cart, tdb, field);
+if (trackDbLabel)
+    filterBy->title = trackDbLabel;
 filterBy->useIndex = FALSE;
 filterBy->slValues = slNameListFromCommaEscaped(value);
 chopUpValues(filterBy);
 if (cart != NULL)
     {
     char suffix[256];
     safef(suffix, sizeof(suffix), "%s.%s", "filterBy", filterBy->column);
     boolean parentLevel = isNameAtParentLevel(tdb,tdb->track);
     if (cartLookUpVariableClosestToHome(cart,tdb,parentLevel,suffix,&(filterBy->htmlName)))
         {
         filterBy->slChoices = cartOptionalSlNameList(cart,filterBy->htmlName);
         freeMem(filterBy->htmlName);
         }
     }
 
@@ -6083,48 +6099,54 @@
     if (!isHubTrack(db))
         conn = hAllocConnTrack(db, tdb);
     struct asObject *as = asForTdb(conn, tdb);
     hFreeConn(&conn);
 
     while ((filter = slPopHead(&filterSettings)) != NULL)
         {
         if (differentString(filter->name,NO_SCORE_FILTER))
             {
             // Determine floating point or integer
             char *setting = trackDbSetting(tdb, filter->name);
             boolean isFloat = (strchr(setting,'.') != NULL);
 
             char *scoreName = cloneString(filter->name);
             char *field = extractFieldName(filter->name, FILTER_NUMBER_NAME);
+            char *trackDbLabel = getLabelSetting(cart, tdb, field);
 
             if (as != NULL)
                 {
                 struct asColumn *asCol = asColumnFind(as, field);
                 if (asCol != NULL)
                     { // Found label so replace field
                     field = asCol->comment;
                     if (!isFloat)
                         isFloat = asTypesIsFloating(asCol->lowType->type);
                     }
                 else 
                     errAbort("Building filter on field %s which is not in AS file.", field);
                 }
             char varName[256];
-            char label[128];
+            char labelBuf[1024];
+            char *label = labelBuf;
             safef(varName, sizeof(varName), "%s%s", scoreName, _BY_RANGE);
             boolean filterByRange = trackDbSettingClosestToHomeOn(tdb, varName);
-            safef(label, sizeof(label),"%s%s", filterByRange ? "": "Minimum ", field);
+
+            if (trackDbLabel)
+                label = trackDbLabel;
+            else
+                safef(labelBuf, sizeof(labelBuf),"%s%s", filterByRange ? "": "Minimum ", field);
 
             showScoreFilter(cart,tdb,opened,boxed,parentLevel,name,title,label,scoreName,isFloat);
             freeMem(scoreName);
             count++;
             }
         slNameFree(&filter);
         }
     if (as != NULL)
         asObjectFree(&as);
     }
 if (count > 0)
     puts("</TABLE>");
 return count;
 }