be4311c07e14feb728abc6425ee606ffaa611a58
markd
  Fri Jan 22 06:46:58 2021 -0800
merge with master

diff --git src/hg/lib/barChartUi.c src/hg/lib/barChartUi.c
index f5d3e78..6e9e885 100644
--- src/hg/lib/barChartUi.c
+++ src/hg/lib/barChartUi.c
@@ -103,68 +103,90 @@
         catSel->checked = TRUE;
     else
         catSel->checked = (hashLookup(checkHash, categ->name) != NULL);
     slAddHead(&all, catSel);
     }
 slReverse(&all);
 makeGroupCheckboxes(name, NULL, all);
 puts("</tr></table>");
 char buf[512];
 safef(buf, sizeof(buf), "%s%s", cgiMultListShadowPrefix(), name);
 cgiMakeHiddenVar(buf, "0");
 }
 
 /* Convenience functions for hgTrackUi */
 
+boolean barChartIsLogTransformed(struct cart *cart, char *track, struct trackDb *tdb)
+/* Return TRUE if bar chart needs to be log transformed */
+{
+char cartVar[1024];
+safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_LOG_TRANSFORM);
+boolean isLog = TRUE;
+char *trans = trackDbSetting(tdb, "transformFunc");
+if (trans != NULL)
+    isLog = sameWord(trans, "LOG");
+return cartCgiUsualBoolean(cart, cartVar, isLog);
+}
+
 void barChartUiLogTransform(struct cart *cart, char *track, struct trackDb *tdb)
 /* Checkbox to select log-transformed RPKM values */
 /* NOTE: this code from gtexUi.c.  Consider sharing. */
 {
 char cartVar[1024];
-puts("<b>Log10(x+1) transform:</b>\n");
 safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_LOG_TRANSFORM);
-boolean isLogTransform = cartCgiUsualBoolean(cart, cartVar, BAR_CHART_LOG_TRANSFORM_DEFAULT);
+puts("<b>Log10(x+1) transform:</b>\n");
+boolean isLogTransform = barChartIsLogTransformed(cart, track, tdb);
 cgiMakeCheckBoxWithId(cartVar, isLogTransform, cartVar);
 jsOnEventByIdF("change", cartVar, "barChartUiTransformChanged('%s');", track);
 }
 
 double barChartUiMaxMedianScore(struct trackDb *tdb)
 /* Max median score, for scaling */
 {
 char *setting = trackDbSettingClosestToHome(tdb, BAR_CHART_MAX_LIMIT);
 if (setting != NULL)
     {
     double max = sqlDouble(setting);
     if (max > 0.0)
         return max;
     }
 return BAR_CHART_MAX_LIMIT_DEFAULT;
 }
 
+double barChartCurViewMax(struct cart *cart, char *trackName, struct trackDb *tdb)
+/* Look up max value to scale for this bar chart - consults both cart and trackDb defaults. */
+{
+char cartVar[1024];
+safef(cartVar, sizeof(cartVar), "%s.%s", trackName, BAR_CHART_MAX_VIEW_LIMIT);
+char *limitString = trackDbSettingOrDefault(tdb, BAR_CHART_LIMIT, "50");
+double limit = atof(limitString);
+if (limit <= 0) limit = 0.001;
+return cartCgiUsualDouble(cart, cartVar, limit);
+}
+
 void barChartUiViewLimits(struct cart *cart, char *track, struct trackDb *tdb)
 /* Set viewing limits if log transform not checked */
 /* NOTE: this code from gtexUi.c.  Consider sharing. */
 {
-char cartVar[1024];
 char buf[512];
-safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_LOG_TRANSFORM);
-boolean isLogTransform = cartCgiUsualBoolean(cart, cartVar, BAR_CHART_LOG_TRANSFORM_DEFAULT);
+boolean isLogTransform = barChartIsLogTransformed(cart, track, tdb);
 safef(buf, sizeof buf, "%sViewLimitsMaxLabel %s", track, isLogTransform ? "disabled" : "");
 printf("<span class='%s'><b>View limits maximum:</b></span>\n", buf);
+double viewMax = barChartCurViewMax(cart, track, tdb);
+char cartVar[1024];
 safef(cartVar, sizeof(cartVar), "%s.%s", track, BAR_CHART_MAX_VIEW_LIMIT);
-int viewMax = cartCgiUsualInt(cart, cartVar, BAR_CHART_MAX_VIEW_LIMIT_DEFAULT);
-cgiMakeIntVarWithExtra(cartVar, viewMax, 4, isLogTransform ? "disabled" : "");
+cgiMakeDoubleVarWithExtra(cartVar, viewMax, 4, isLogTransform ? "disabled" : "");
 char *unit = trackDbSettingClosestToHomeOrDefault(tdb, BAR_CHART_UNIT, "");
 printf("<span class='%s'> %s (range 0-%d)</span>\n", buf, unit, 
                                 round(barChartUiMaxMedianScore(tdb)));
 }
 
 // TODO: libify
 static boolean isUrl(char *url)
 {
 return startsWith("http://", url)
    || startsWith("https://", url)
    || startsWith("ftp://", url);
 }
 
 static void getCategsFromSettings(char *track, char *labelSetting, char *colorSetting, 
                                         struct slName **labels, struct slName **colors)