b8a81ed72bfd0502d0fd0cb4ed26517953ad032a
braney
  Thu Feb 28 15:05:46 2019 -0800
if being called through AJAX to draw a single track, make sure to load
any composite parents as well.  #23027

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index fa2f566..275ab9c 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -5770,31 +5770,44 @@
     else if (track->drawItems == NULL)
         warn("No draw handler for %s", tdb->track);
     else
         slAddHead(pTrackList, track);
     }
 }
 
 void loadFromTrackDb(struct track **pTrackList)
 /* Load tracks from database, consulting handler list. */
 {
 char *trackNameFilter = cartOptionalString(cart, "hgt.trackNameFilter");
 struct trackDb *tdbList;
 if(trackNameFilter == NULL)
     tdbList = hTrackDb(database);
 else
+    {
     tdbList = hTrackDbForTrack(database, trackNameFilter);
+
+    if (tdbList->parent)        // we want to give the composite parent a chance to load and set options
+        {
+        while(tdbList->parent)
+            {
+            if (tdbList->parent->subtracks == NULL)     // we don't want to go up to a supertrack
+                break;
+            tdbList = tdbList->parent;
+            }
+        trackNameFilter = tdbList->track;
+        }
+    }
 addTdbListToTrackList(tdbList, trackNameFilter, pTrackList);
 }
 
 static int getScoreFilter(char *trackName)
 /* check for score filter configuration setting */
 {
 char optionScoreStr[256];
 
 safef(optionScoreStr, sizeof(optionScoreStr), "%s.scoreFilter", trackName);
 return cartUsualInt(cart, optionScoreStr, 0);
 }
 
 void ctLoadSimpleBed(struct track *tg)
 /* Load the items in one custom track - just move beds in
  * window... */