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= for endpoint '/getdata/track' given hubUrl='%s'", hubUrl); if (isEmpty(track)) apiErrAbort("missing track= 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))