e443dee06a48dc2ae206afcfb4a4478549503d33
braney
  Thu Mar 1 09:35:16 2018 -0800
don't calculate (add, subtract) with tracks that are turned off

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 05e0480..9c7b36d 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -14097,52 +14097,70 @@
         }
     }
 track->height = height;
 return track->height;
 }
 
 int trackPriCmp(const void *va, const void *vb)
 /* Compare for sort based on priority */
 {
 const struct track *a = *((struct track **)va);
 const struct track *b = *((struct track **)vb);
 
 return (a->priority - b->priority);
 }
 
+
+static bool isSubtrackVisibleTdb(struct cart *cart, struct trackDb *tdb)
+/* Has this subtrack not been deselected in hgTrackUi or declared with
+ *  * "subTrack ... off"?  -- assumes composite track is visible. */
+{
+boolean overrideComposite = (NULL != cartOptionalString(cart, tdb->track));
+bool enabledInTdb = TRUE; // assume that this track is enabled in tdb
+char option[1024];
+safef(option, sizeof(option), "%s_sel", tdb->track);
+boolean enabled = cartUsualBoolean(cart, option, enabledInTdb);
+if (overrideComposite)
+    enabled = TRUE;
+return enabled;
+}
+
 void buildMathWig(struct trackDb *tdb)
 /* Turn a mathWig composite into a mathWig track. */
 {
 char *aggregateFunc = cartOrTdbString(cart, tdb, "aggregate" , FALSE);
 
 if ((aggregateFunc == NULL) || !(sameString("add", aggregateFunc) || sameString("subtract", aggregateFunc)))
     return;
 
 struct trackDb *subTracks = tdb->subtracks;
 
 tdb->subtracks = NULL;
 tdb->type = "mathWig";
 
 struct dyString *dy = newDyString(1024);
 
 if (sameString("add", aggregateFunc))
     dyStringPrintf(dy, "+ ");
 else // subtract
     dyStringPrintf(dy, "- ");
 struct trackDb *subTdb;
 for (subTdb=subTracks; subTdb; subTdb = subTdb->next)
     {
+    if (!isSubtrackVisibleTdb(cart, subTdb) )
+        continue;
+
     char *bigDataUrl = trackDbSetting(subTdb, "bigDataUrl");
     char *useDb;
     char *table;
     if (bigDataUrl != NULL)
         dyStringPrintf(dy, "%s ",bigDataUrl);
     else 
         {
         if (isCustomTrack(trackHubSkipHubName(subTdb->track)))
             {
             useDb = CUSTOM_TRASH;
             table = trackDbSetting(subTdb, "dbTableName");
             }
         else
             {
             useDb = database;