5194786c88bd4ab5e802eec79089897461389fe9
hiram
  Fri Mar 22 14:52:22 2019 -0700
getting a little bit better refs #18869

diff --git src/hg/hubApi/getData.c src/hg/hubApi/getData.c
index 6a90351..ae734ce 100644
--- src/hg/hubApi/getData.c
+++ src/hg/hubApi/getData.c
@@ -205,30 +205,52 @@
 struct bbiChromInfo *chromList = NULL;
 // struct bbiSummaryElement sum = bbiTotalSummary(bwf);
 if (isEmpty(chrom))
     {
     chromList = bbiChromList(bwf);
     struct bbiChromInfo *bci;
     for (bci = chromList; bci; bci = bci->next)
 	{
 	wigDataOutput(jw, bwf, bci->name, 0, bci->size);
 	}
     }
     else
 	wigDataOutput(jw, bwf, chrom, start, end);
 }
 
+static struct trackDb *findTrackDb(char *track, struct trackDb *tdb)
+/* search tdb structure for specific track, recursion on subtracks */
+{
+struct trackDb *trackFound = NULL;
+
+for (trackFound = tdb; trackFound; trackFound = trackFound->next)
+    {
+    if (trackFound->subtracks)
+	{
+        struct trackDb *subTrack = findTrackDb(track, trackFound->subtracks);
+	if (subTrack)
+	    {
+	    if (sameOk(subTrack->track, track))
+		trackFound = subTrack;
+	    }
+	}
+    if (sameOk(trackFound->track, track))
+	break;
+    }
+return trackFound;
+}
+
 static void getHubTrackData(char *hubUrl)
 /* return data from a hub track, optionally just one chrom data,
  *  optionally just one section of that chrom data
  */
 {
 char *genome = cgiOptionalString("genome");
 char *track = cgiOptionalString("track");
 char *chrom = cgiOptionalString("chrom");
 char *start = cgiOptionalString("start");
 char *end = cgiOptionalString("end");
 
 if (isEmpty(genome))
     apiErrAbort("missing genome=<name> for endpoint '/getdata/track'  given hubUrl='%s'", hubUrl);
 if (isEmpty(track))
     apiErrAbort("missing track=<name> for endpoint '/getdata/track'  given hubUrl='%s'", hubUrl);
@@ -236,36 +258,32 @@
 struct trackHub *hub = errCatchTrackHubOpen(hubUrl);
 struct trackHubGenome *hubGenome = NULL;
 for (hubGenome = hub->genomeList; hubGenome; hubGenome = hubGenome->next)
     {
     if (sameString(genome, hubGenome->name))
 	break;
     }
 if (NULL == hubGenome)
     apiErrAbort("failed to find specified genome=%s for endpoint '/getdata/track'  given hubUrl '%s'", genome, hubUrl);
 
 struct trackDb *tdb = obtainTdb(hubGenome, NULL);
 
 if (NULL == tdb)
     apiErrAbort("failed to find a track hub definition in genome=%s for endpoint '/getdata/track'  given hubUrl='%s'", genome, hubUrl);
 
-struct trackDb *thisTrack = NULL;
-for (thisTrack = tdb; thisTrack; thisTrack = thisTrack->next)
-    {
-    if (sameWord(thisTrack->track, track))
-	break;
-    }
+struct trackDb *thisTrack = findTrackDb(track, tdb);
+
 if (NULL == thisTrack)
     apiErrAbort("failed to find specified track=%s in genome=%s for endpoint '/getdata/track'  given hubUrl='%s'", track, genome, hubUrl);
 
 char *bigDataUrl = trackDbSetting(thisTrack, "bigDataUrl");
 struct bbiFile *bbi = bigFileOpen(thisTrack->type, bigDataUrl);
 if (NULL == bbi)
     apiErrAbort("track type %s management not implemented yet TBD track=%s in genome=%s for endpoint '/getdata/track'  given hubUrl='%s'", track, genome, hubUrl);
 
 struct jsonWrite *jw = apiStartOutput();
 jsonWriteString(jw, "hubUrl", hubUrl);
 jsonWriteString(jw, "genome", genome);
 // jsonWriteString(jw, "track", track);
 unsigned chromSize = 0;
 struct bbiChromInfo *chromList = NULL;
 if (isNotEmpty(chrom))