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; } }