12431b42d1616cb02adead491a305b8dc163ca71
kate
  Mon Mar 28 11:59:03 2016 -0700
Add support for filter on score.  Show total median expression (from which score is computed) on details page. refs #15645

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index e63d0a0..9afd22a 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -7555,58 +7555,70 @@
     newScoreMin = cartMinGrayLevel * scoreMax/maxShade;
     prevTrackName = tdb->track;
     }
 if (cartMinGrayLevel != scoreMinGrayLevel)
     {
     float realScore = (float)(bed->score - scoreMin) / (scoreMax - scoreMin);
     bed->score = newScoreMin + (realScore * (scoreMax - newScoreMin)) + 0.5;
     }
 else if (scoreMin != 0 && scoreMax == 1000) // Changes gray level even when
     {                                       // UI does not allow selecting it.
     float realScore = (float)(bed->score) / 1000;
     bed->score = scoreMin + (realScore * (scoreMax - scoreMin)) + 0.5;
     }
 }
 
-void bedLoadItemByQuery(struct track *tg, char *table,
-                        char *query, ItemLoader loader)
-/* Generic tg->item loader. If query is NULL use generic
- hRangeQuery(). */
+void bedLoadItemByQueryWhere(struct track *tg, char *table, char *query,  
+                                char *extraWhere, ItemLoader loader)
+/* Generic itg->item loader, adding extra clause to hgRangeQuery if query is NULL 
+ * and extraWhere is not NULL */
 {
 struct sqlConnection *conn = hAllocConn(database);
 int rowOffset = 0;
 struct sqlResult *sr = NULL;
 char **row = NULL;
 struct slList *itemList = NULL, *item = NULL;
 
 if (query == NULL)
     sr = hRangeQuery(conn, table, chromName,
-		     winStart, winEnd, NULL, &rowOffset);
+		     winStart, winEnd, extraWhere, &rowOffset);
 else
     sr = sqlGetResult(conn, query);
 
 while ((row = sqlNextRow(sr)) != NULL)
     {
     item = loader(row + rowOffset);
     slAddHead(&itemList, item);
     }
 slSort(&itemList, bedCmp);
 sqlFreeResult(&sr);
 tg->items = itemList;
 hFreeConn(&conn);
 }
 
+void bedLoadItemWhere(struct track *tg, char *table, char *extraWhere, ItemLoader loader)
+/* Generic tg->item loader, adding extra clause to hgRangeQuery */
+{
+bedLoadItemByQueryWhere(tg, table, NULL, extraWhere, loader);
+}
+
+void bedLoadItemByQuery(struct track *tg, char *table, char *query, ItemLoader loader)
+/* Generic tg->item loader. If query is NULL use generic hRangeQuery(). */
+{
+bedLoadItemByQueryWhere(tg, table, query, NULL, loader);
+}
+
 void bedLoadItem(struct track *tg, char *table, ItemLoader loader)
 /* Generic tg->item loader. */
 {
 bedLoadItemByQuery(tg, table, NULL, loader);
 }
 
 
 void atomDrawSimpleAt(struct track *tg, void *item,
                       struct hvGfx *hvg, int xOff, int y,
                       double scale, MgFont *font, Color color, enum trackVisibility vis)
 /* Draw a single simple bed item at position. */
 {
 struct bed *bed = item;
 int heightPer = tg->heightPer;
 int x1 = round((double)((int)bed->chromStart-winStart)*scale) + xOff;