b159fa56513cfc78d000a66cc65ff1a85a2e0c27
braney
  Tue Sep 5 17:23:40 2017 -0700
ongoing work on hgCollection

diff --git src/hg/hgTracks/simpleTracks.c src/hg/hgTracks/simpleTracks.c
index 92f896d..c2dc74b 100644
--- src/hg/hgTracks/simpleTracks.c
+++ src/hg/hgTracks/simpleTracks.c
@@ -14166,34 +14166,82 @@
         }
     }
 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);
 }
 
+void buildMathWig(struct trackDb *tdb)
+/* Turn a mathWig view into a mathWig track. */
+{
+char *viewFunc =  trackDbSetting(tdb, "viewFunc");
+
+if ((viewFunc == NULL) || sameString("show all", viewFunc))
+    return;
+
+struct trackDb *subTracks = tdb->subtracks;
+
+tdb->subtracks = NULL;
+tdb->type = "mathWig";
+
+struct dyString *dy = newDyString(1024);
+
+if (sameString("add all", viewFunc))
+    dyStringPrintf(dy, "+ ");
+else
+    dyStringPrintf(dy, "- ");
+struct trackDb *subTdb;
+for (subTdb=subTracks; subTdb; subTdb = subTdb->next)
+    {
+    char *bigDataUrl = trackDbSetting(subTdb, "bigDataUrl");
+    dyStringPrintf(dy, "%s ",bigDataUrl);
+    }
+
+hashAdd(tdb->settingsHash, "mathDataUrl", dy->string);
+}
+
+void fixupMathWigs(struct trackDb *tdb)
+/* Look through a container to see if it has a mathWig view and convert it. */
+{
+struct trackDb *subTdb;
+
+for(subTdb = tdb->subtracks; subTdb; subTdb = subTdb->next)
+    {
+    char *type;
+    if ((type = trackDbSetting(subTdb, "container")) != NULL)
+        {
+        if (sameString(type, "mathWig"))
+            {
+            buildMathWig(subTdb);
+            }
+        }
+    }
+}
+
 void makeCompositeTrack(struct track *track, struct trackDb *tdb)
 /* Construct track subtrack list from trackDb entry.
  * Sets up color gradient in subtracks if requested */
 {
+fixupMathWigs(tdb);
 unsigned char finalR = track->color.r, finalG = track->color.g,
                             finalB = track->color.b;
 unsigned char altR = track->altColor.r, altG = track->altColor.g,
                             altB = track->altColor.b;
 unsigned char deltaR = 0, deltaG = 0, deltaB = 0;
 
 struct slRef *tdbRef, *tdbRefList = trackDbListGetRefsToDescendantLeaves(tdb->subtracks);
 
 struct trackDb *subTdb;
 int subCount = slCount(tdbRefList);
 int altColors = subCount - 1;
 struct track *subtrack = NULL;
 TrackHandler handler;
 boolean smart = FALSE;