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.