442377f11fc92393b84c1324bd2ca8cb5306372a
kent
Thu Oct 28 16:08:28 2010 -0700
Making hubs appear in group list.
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 23d5ac7..60a0982 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -101,30 +101,31 @@
boolean dragZooming = TRUE;
struct hash *oldVars = NULL;
boolean hideControls = FALSE; /* Hide all controls? */
boolean trackImgOnly = FALSE; /* caller wants just the track image and track table html */
boolean ideogramToo = FALSE; /* caller wants the ideoGram (when requesting just one track) */
/* Structure returned from findGenomePos.
* We use this to to expand any tracks to full
* that were found to contain the searched-upon
* position string */
struct hgPositions *hgp = NULL;
/* Other global variables. */
+struct trackHub *hubList = NULL; /* List of all relevant hubs. */
struct group *groupList = NULL; /* List of all tracks. */
char *browserName; /* Test or public browser */
char *organization; /* UCSC */
struct hash *trackHash = NULL; /* Hash of the tracks by their name. */
struct track *trackFindByName(struct track *tracks, char *trackName)
/* find a track in tracks by name, recursively searching subtracks */
{
struct track *track;
for (track = tracks; track != NULL; track = track->next)
{
if (sameString(track->track, trackName))
return track;
else if (track->subtracks != NULL)
@@ -3312,81 +3313,82 @@
{
if (wordCount != 3)
errAbort("Expecting 3 words in pix line");
trackLayoutSetPicWidth(&tl, words[2]);
}
}
}
for (ct = ctList; ct != NULL; ct = ct->next)
{
hasCustomTracks = TRUE;
tg = newCustomTrack(ct);
slAddHead(pTrackList, tg);
}
}
-void addTracksFromTrackHub(char *hubName, char *hubUrl, struct track **pTrackList)
+void addTracksFromTrackHub(char *hubName, char *hubUrl, struct track **pTrackList,
+ struct trackHub **pHubList)
/* Load up stuff from data hub and append to list. The hubUrl points to
* a trackDb.ra format file. */
{
-/* Squirrel away hub directory for later. */
-char hubDir[PATH_LEN];
-splitPath(hubUrl, hubDir, NULL, NULL);
-
/* Load trackDb.ra file and make it into proper trackDb tree */
struct trackHub *hub = trackHubOpen(hubUrl);
+if (hub != NULL)
+ {
struct trackHubGenome *hubGenome = trackHubFindGenome(hub, database);
+ hub->name = catTwoStrings("hub_", hubName);
if (hubGenome != NULL)
{
struct trackDb *tdb, *tdbList = trackHubTracksForGenome(hub, hubGenome);
uglyf("Got %d tracks from %s@%s
\n", slCount(tdbList), hubName, hubUrl);
trackDbAddTableField(tdbList);
trackHubAddNamePrefix(hubName, tdbList);
+ trackHubAddGroupName(hub->name, tdbList);
uglyf("added hub_%s_ prefix to track list
\n", hubName);
for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
{
trackDbFieldsFromSettings(tdb);
trackDbPolish(tdb);
}
uglyf("polished tracks
\n");
trackDbLinkUpGenerations(tdbList);
uglyf("About to addTdbListToTrackList
\n");
uglyOne = TRUE;
addTdbListToTrackList(tdbList, NULL, pTrackList);
- uglyf("Used to crash by here
\n");
-#ifdef SOON
-#endif /* SOON */
+ if (tdbList != NULL)
+ slAddHead(pHubList, hub);
}
}
+}
-void loadTrackHubs(struct track **pTrackList)
-/* Load up stuff from data hubs and append to list. */
+void loadTrackHubs(struct track **pTrackList, struct trackHub **pHubList)
+/* Load up stuff from data hubs and append to lists. */
{
char *trackHubs = cloneString(cartUsualString(cart, "trackHubs", NULL));
uglyf("trackHubs=%s\n
\n", trackHubs);
if (trackHubs == NULL)
return;
struct slPair *hubList = slPairFromString(trackHubs);
uglyf("Got %d hubs
\n", slCount(hubList));
struct slPair *hub;
for (hub = hubList; hub != NULL; hub = hub->next)
{
- addTracksFromTrackHub(hub->name, hub->val, pTrackList);
+ addTracksFromTrackHub(hub->name, hub->val, pTrackList, pHubList);
}
slPairFreeValsAndList(&hubList);
}
boolean restrictionEnzymesOk()
/* Check to see if it's OK to do restriction enzymes. */
{
return (hTableExists("hgFixed", "cutters") &&
hTableExists("hgFixed", "rebaseRefs") &&
hTableExists("hgFixed", "rebaseCompanies"));
}
void fr2ScaffoldEnsemblLink(char *archive)
/* print out Ensembl link to appropriate scaffold there */
{
@@ -3759,69 +3761,88 @@
/* Determine if any member tracks are visible -- currently
* recording this in the parent's visibility setting */
{
tdb->visibility = tvDense;
}
boolean superTrackHasVisibleMembers(struct trackDb *tdb)
/* Determine if any member tracks are visible -- currently
* recording this in the parent's visibility setting */
{
if (!tdbIsSuper(tdb))
return FALSE;
return (tdb->visibility != tvHide);
}
-static void groupTracks(struct track **pTrackList, struct group **pGroupList,
- int vis)
+static void groupTracks(struct trackHub *hubList, struct track **pTrackList,
+ struct group **pGroupList, int vis)
/* Make up groups and assign tracks to groups.
* If vis is -1, restore default groups to tracks. */
{
struct group *unknown = NULL;
struct group *group, *list = NULL;
struct hash *hash = newHash(8);
struct track *track;
struct trackRef *tr;
struct grp* grps = hLoadGrps(database);
struct grp *grp;
+float maxPriority = 0;
/* build group objects from database. */
for (grp = grps; grp != NULL; grp = grp->next)
{
/* deal with group reordering */
float priority = grp->priority;
+ if (priority > maxPriority) maxPriority = priority;
if (withPriorityOverride)
{
char cartVar[512];
safef(cartVar, sizeof(cartVar), "%s.priority",grp->name);
if (vis != -1)
priority = (float)cartUsualDouble(cart, cartVar, grp->priority);
if (priority == grp->priority)
cartRemove(cart, cartVar);
}
/* create group object; add to list and hash */
AllocVar(group);
group->name = cloneString(grp->name);
group->label = cloneString(grp->label);
group->defaultPriority = grp->priority;
group->priority = priority;
group->defaultIsClosed = grp->defaultIsClosed;
slAddHead(&list, group);
hashAdd(hash, grp->name, group);
}
grpFreeList(&grps);
+/* build group objects from hub */
+ {
+ uglyf("Got %d hubs, making groups from them
\n", slCount(hubList));
+ struct trackHub *hub;
+ for (hub = hubList; hub != NULL; hub = hub->next)
+ {
+ AllocVar(group);
+ group->name = cloneString(hub->name);
+ group->label = cloneString(hub->shortLabel);
+ group->defaultPriority = group->priority = maxPriority;
+ maxPriority += 1;
+ slAddHead(&list, group);
+ hashAdd(hash, group->name, group);
+ uglyf("group name %s, label %s, priority %f
\n", group->name, group->label, group->priority);
+ }
+ }
+
/* Loop through tracks and fill in their groups.
* If necessary make up an unknown group. */
for (track = *pTrackList; track != NULL; track = track->next)
{
/* handle track reordering feature -- change group assigned to track */
if (withPriorityOverride)
{
char *groupName = NULL;
char cartVar[256];
/* belt and suspenders -- accomodate inconsistent track/trackDb
* creation. Note -- with code cleanup, these default variables
* could be retired, and the tdb versions used as defaults */
if (!track->defaultGroupName)
{
@@ -3860,30 +3881,31 @@
/* remove cart variables that are the same as the trackDb settings */
/* UGLY - add me back when tdb->priority is no longer pre-clobbered by cart var value
if (priority == track->defaultPriority)
cartRemove(cart, cartVar);
*/
track->priority = priority;
}
/* assign group object to track */
if (track->groupName == NULL)
group = NULL;
else
group = hashFindVal(hash, track->groupName);
if (group == NULL)
{
+ uglyf("missing group for %s %s
\n", track->track, track->tdb->grp);
if (unknown == NULL)
{
AllocVar(unknown);
unknown->name = cloneString("other");
unknown->label = cloneString("other");
unknown->priority = 1000000;
slAddHead(&list, unknown);
}
group = unknown;
}
track->group = group;
}
/* Sort tracks by combined group/track priority, and
* then add references to track to group. */
@@ -4044,35 +4066,34 @@
struct track *track, *trackList = NULL;
registerTrackHandlers();
/* Load regular tracks, blatted tracks, and custom tracks.
* Best to load custom last. */
loadFromTrackDb(&trackList);
if (pcrResultParseCart(database, cart, NULL, NULL, NULL))
slSafeAddHead(&trackList, pcrResultTg());
if (userSeqString != NULL) slSafeAddHead(&trackList, userPslTg());
slSafeAddHead(&trackList, oligoMatchTg());
if (restrictionEnzymesOk())
{
slSafeAddHead(&trackList, cuttersTg());
}
if (wikiTrackEnabled(database, NULL))
addWikiTrack(&trackList);
-loadTrackHubs(&trackList);
-#ifdef SOON
-#endif /* SOON */
+loadTrackHubs(&trackList, &hubList);
+slReverse(&hubList);
loadCustomTracks(&trackList);
-groupTracks(&trackList, pGroupList, vis);
+groupTracks(hubList, &trackList, pGroupList, vis);
setSearchedTrackToPackOrFull(trackList);
if (cgiOptionalString( "hideTracks"))
changeTrackVis(groupList, NULL, tvHide);
/* Get visibility values if any from ui. */
for (track = trackList; track != NULL; track = track->next)
{
char *s = cartOptionalString(cart, track->track);
if (cgiOptionalString("hideTracks"))
{
s = cgiOptionalString(track->track);
if (s != NULL && (hTvFromString(s) != track->tdb->visibility))
{
cartSetString(cart, track->track, s);
}