bbc500cc6664ee209a44d671d0230bd15aa2fe6c kent Mon Jun 21 22:43:48 2010 -0700 adding hTrackDbForTrackAndAncestors diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c index d38e630..23a765a 100644 --- src/hg/lib/hdb.c +++ src/hg/lib/hdb.c @@ -3598,6 +3598,44 @@ return rFindTrack(0, tdbList, track); } +struct trackDb *hTrackDbForTrackAndAncestors(char *db, char *track) +/* Load trackDb object for a track. If need be grab its ancestors too. + * This does not load children. hTrackDbForTrack will handle children, and + * is actually faster if being called on lots of tracks. This function + * though is faster on one or two tracks. */ +{ +uglyf("hTrackDbForTrackAndAncestors(%s,%s)\n", db, track); +struct sqlConnection *conn = hAllocConn(db); +struct trackDb *tdb = loadTrackDbForTrack(conn, track); +struct trackDb *ancestor = tdb; +for (;;) + { + /* Get name of previous generation if any handling both + * composite and supertrack ancestor tags. */ + char *parentTrack = NULL; + char *parent = trackDbLocalSetting(ancestor, "parent"); + if (parent != NULL) + parentTrack = cloneFirstWord(parent); + if (parentTrack == NULL) + { + char *super = trackDbLocalSetting(ancestor, "superTrack"); + if (super != NULL && !startsWith("on", super)) + parentTrack = cloneFirstWord(super); + } + + /* If no parent we're done. */ + uglyf("parentTrack = %s\n", parentTrack); + if (parentTrack == NULL) + break; + + ancestor->parent = loadTrackDbForTrack(conn, parentTrack); + ancestor = ancestor->parent; + } + +hFreeConn(&conn); +return tdb; +} + struct trackDb *hCompositeTrackDbForSubtrack(char *db, struct trackDb *sTdb) /* Given a trackDb that may be for a subtrack of a composite track, * return the trackDb for the composite track if we can find it, else NULL.