78dfd4b6e906a962da40780c799f92bb7ea1b3c1
kent
  Wed Jan 12 15:47:29 2011 -0800
Starting to integrate data hub into table browser.  Still problems, so effectively is commented out at the moment.
diff --git src/hg/hgTables/hgTables.c src/hg/hgTables/hgTables.c
index 735a5a1..e6eb298 100644
--- src/hg/hgTables/hgTables.c
+++ src/hg/hgTables/hgTables.c
@@ -15,30 +15,32 @@
 #include "hui.h"
 #include "hCommon.h"
 #include "hgColors.h"
 #include "trackDb.h"
 #include "botDelay.h"
 #include "grp.h"
 #include "customTrack.h"
 #include "pipeline.h"
 #include "hgFind.h"
 #include "hgTables.h"
 #include "joiner.h"
 #include "bedCart.h"
 #include "hgMaf.h"
 #include "gvUi.h"
 #include "wikiTrack.h"
+#include "trackHub.h"
+#include "hubConnect.h"
 #include "hgConfig.h"
 
 static char const rcsid[] = "$Id: hgTables.c,v 1.198 2010/05/19 01:37:13 kent Exp $";
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "hgTables - Get table data associated with tracks and intersect tracks\n"
   "usage:\n"
   "   hgTables XXX\n"
   "options:\n"
   "   -xxx=XXX\n"
   );
 }
@@ -213,55 +215,94 @@
 void dbOverrideFromTable(char buf[256], char **pDb, char **pTable)
 /* If *pTable includes database, overrider *pDb with it, using
  * buf to hold string. */
 {
 char *s;
 safef(buf, 256, "%s", *pTable);
 s = strchr(buf, '.');
 if (s != NULL)
     {
     *pDb = buf;
     *s++ = 0;
     *pTable = s;
     }
 }
 
+struct grp *grpFromHub(struct hubConnectStatus *hub)
+/* Make up a grp structur from hub */
+{
+struct grp *grp;
+AllocVar(grp);
+char name[16];
+safef(name, sizeof(name), "hub_%d", hub->id);
+grp->name = cloneString(name);
+grp->label = cloneString(hub->shortLabel);
+return grp;
+}
 
-static struct trackDb *getFullTrackList()
+static struct trackDb *getFullTrackList(struct hubConnectStatus *hubList, struct grp **pHubGroups)
 /* Get all tracks including custom tracks if any. */
 {
 struct trackDb *list = hTrackDb(database);
 struct customTrack *ctList, *ct;
 
 /* exclude any track with a 'tableBrowser off' setting */
 struct trackDb *tdb, *nextTdb, *newList = NULL;
 for (tdb = list;  tdb != NULL;  tdb = nextTdb)
     {
     nextTdb = tdb->next;
     char *tbOff = trackDbSetting(tdb, "tableBrowser");
     if (tbOff != NULL && startsWithWord("off", tbOff))
 	slAddHead(&forbiddenTrackList, tdb);
     else
 	slAddHead(&newList, tdb);
     }
 slReverse(&newList);
 list = newList;
 
 /* add wikiTrack if enabled */
 if (wikiTrackEnabled(database, NULL))
     wikiTrackDb(&list);
 
+/* Add hub tracks. */
+struct hubConnectStatus *hubStatus;
+for (hubStatus = hubList; hubStatus != NULL; hubStatus = hubStatus->next)
+    {
+    /* Load trackDb.ra file and make it into proper trackDb tree */
+    char hubName[8];
+    safef(hubName, sizeof(hubName), "%d", hubStatus->id);
+    struct trackHub *hub = trackHubOpen(hubStatus->hubUrl, hubName);
+    if (hub != NULL)
+	{
+	struct trackHubGenome *hubGenome = trackHubFindGenome(hub, database);
+	if (hubGenome != NULL)
+	    {
+	    struct trackDb *tdbList = trackHubTracksForGenome(hub, hubGenome);
+	    tdbList = trackDbLinkUpGenerations(tdbList);
+	    tdbList = trackDbPolishAfterLinkup(tdbList, database);
+	    trackDbPrioritizeContainerItems(tdbList);
+	    if (tdbList != NULL)
+		{
+		list = slCat(list, tdbList);
+		struct grp *grp = grpFromHub(hubStatus);
+		slAddHead(pHubGroups, grp);
+		}
+	    }
+	}
+    }
+slReverse(pHubGroups);
+
 /* Create dummy group for custom tracks if any */
 ctList = getCustomTracks();
 for (ct = ctList; ct != NULL; ct = ct->next)
     {
     slAddHead(&list, ct->tdb);
     }
 
 return list;
 }
 
 boolean fullGenomeRegion()
 /* Return TRUE if region is full genome. */
 {
 char *regionType = cartUsualString(cart, hgtaRegionType, "genome");
 return sameString(regionType, "genome");
@@ -789,58 +830,65 @@
     {
     if (group == NULL || sameString(group->name, "all"))
         track = trackList;
     else
 	{
 	for (track = trackList; track != NULL; track = track->next)
 	    if (sameString(track->grp, group->name))
 	         break;
 	if (track == NULL)
 	    internalErr();
 	}
     }
 return track;
 }
 
-struct grp *makeGroupList(struct trackDb *trackList, boolean allTablesOk)
+struct grp *makeGroupList(struct trackDb *trackList, struct grp **pHubGrpList, boolean allTablesOk)
 /* Get list of groups that actually have something in them. */
 {
 struct grp *groupsAll, *groupList = NULL, *group;
 struct hash *groupsInTrackList = newHash(0);
 struct hash *groupsInDatabase = newHash(0);
 struct trackDb *track;
 
 /* Stream throught track list building up hash of active groups. */
 for (track = trackList; track != NULL; track = track->next)
     {
     if (!hashLookup(groupsInTrackList,track->grp))
         hashAdd(groupsInTrackList, track->grp, NULL);
     }
 
 /* Scan through group table, putting in ones where we have data. */
 groupsAll = hLoadGrps(database);
 for (group = slPopHead(&groupsAll); group != NULL; group = slPopHead(&groupsAll))
     {
     if (hashLookup(groupsInTrackList, group->name))
 	{
 	slAddTail(&groupList, group);
 	hashAdd(groupsInDatabase, group->name, group);
 	}
     else
         grpFree(&group);
     }
 
+/* Add in groups from hubs. */
+for (group = slPopHead(pHubGrpList); group != NULL; group = slPopHead(pHubGrpList))
+    {
+    slAddTail(&groupList, group);
+    hashAdd(groupsInDatabase, group->name, group);
+    }
+
 /* Do some error checking for tracks with group names that are
  * not in database.  Just warn about them. */
 for (track = trackList; track != NULL; track = track->next)
     {
     if (!hashLookup(groupsInDatabase, track->grp))
          warn("Track %s has group %s, which isn't in grp table",
 	 	track->table, track->grp);
     }
 
 /* Create dummy group for all tracks. */
 AllocVar(group);
 group->name = cloneString("allTracks");
 group->label = cloneString("All Tracks");
 slAddTail(&groupList, group);
 
@@ -1741,34 +1789,36 @@
 char *excludeVars[] = {"Submit", "submit", NULL};
 
 static struct hash *hashTrackList(struct trackDb *tdbList)
 /* Return hash full of trackDb's from list, keyed by tdb->track */
 {
 struct hash *hash = hashNew(0);
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     hashAdd(hash, tdb->track, tdb);
 return hash;
 }
 
 void initGroupsTracksTables()
 /* Get list of groups that actually have something in them. */
 {
-fullTrackList = getFullTrackList();
+struct hubConnectStatus *hubList = NULL; // hubConnectStatusListFromCart(cart);
+struct grp *hubGrpList = NULL;
+fullTrackList = getFullTrackList(hubList, &hubGrpList);
 fullTrackHash = hashTrackList(fullTrackList);
 curTrack = findSelectedTrack(fullTrackList, NULL, hgtaTrack);
-fullGroupList = makeGroupList(fullTrackList, allowAllTables());
+fullGroupList = makeGroupList(fullTrackList, &hubGrpList, allowAllTables());
 curGroup = findSelectedGroup(fullGroupList, hgtaGroup);
 if (sameString(curGroup->name, "allTables"))
     curTrack = NULL;
 curTable    = findSelectedTable(curTrack, hgtaTable);
 if (curTrack == NULL)
     {
     struct trackDb *tdb  = hTrackDbForTrack(database, curTable);
     struct trackDb *cTdb = hCompositeTrackDbForSubtrack(database, tdb);
     if (cTdb)
         curTrack = cTdb;
     else
         curTrack = tdb;
     }
 }