\n"
);
#define DATA_INFO_JUMP_ARROW_ID "hgGtexDataInfo_jumpArrow"
printf(
"
\n",
DATA_INFO_JUMP_ARROW_ID
);
onclickJumpToTop(DATA_INFO_JUMP_ARROW_ID);
puts(
@@ -445,233 +456,211 @@
puts(
"
\n"
"
\n");
puts("
");
puts("
");
webIncludeHelpFileSubst("hgCompositeHelp", NULL, FALSE);
puts("
");
puts("
");
puts(
"
\n"
"
\n");
-puts("");
-puts("");
-jsIncludeFile("jquery.treetable.js", NULL);
-jsIncludeFile("utils.js", NULL);
-jsIncludeFile("ajax.js", NULL);
-jsIncludeFile("hgTracks.js", NULL);
-jsIncludeFile("spectrum.min.js", NULL);
-jsIncludeFile("hgCollection.js", NULL);
}
void doMainPage()
/* Print out initial HTML of control page. */
{
webStartGbNoBanner(cart, database, "Collections");
webIncludeResourceFile("jquery.treetable.css");
webIncludeResourceFile("jquery.treetable.theme.default.css");
webIncludeResourceFile("gb.css");
webIncludeResourceFile("jWest.css");
webIncludeResourceFile("spectrum.min.css");
webIncludeResourceFile("hgGtexTrackSettings.css");
-//webIncludeFile("inc/hgCollection.html");
-
-printf(
-"
");
printHelp();
-
+puts("");
+puts("");
+jsIncludeFile("jquery.treetable.js", NULL);
+jsIncludeFile("utils.js", NULL);
+jsIncludeFile("ajax.js", NULL);
+jsIncludeFile("spectrum.min.js", NULL);
+jsIncludeFile("hgCollection.js", NULL);
+webEndGb();
}
static char *getSqlBigWig(struct sqlConnection *conn, char *db, struct trackDb *tdb)
+// figure out the bigWig for native tables
{
char buffer[4096];
safef(buffer, sizeof buffer, "NOSQLINJ select fileName from %s", tdb->table);
return sqlQuickString(conn, buffer);
}
char *getUrl(struct sqlConnection *conn, char *db, struct track *track, struct hash *nameHash)
+// get the bigDataUrl for a track
{
struct trackDb *tdb = hashMustFindVal(nameHash, track->name);
if (tdb == NULL)
errAbort("cannot find trackDb for %s\n", track->name);
char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
if (bigDataUrl == NULL)
{
if (startsWith("bigWig", tdb->type))
bigDataUrl = getSqlBigWig(conn, db, tdb);
}
return bigDataUrl;
}
void outTdb(struct sqlConnection *conn, char *db, FILE *f, char *name, struct trackDb *tdb, char *parent, unsigned int color, struct track *track, struct hash *nameHash, struct hash *collectionNameHash)
+// out the trackDb for one track
{
char *dataUrl = NULL;
char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
if (bigDataUrl == NULL)
{
if (startsWith("bigWig", tdb->type))
dataUrl = getSqlBigWig(conn, db, tdb);
}
struct hashCookie cookie = hashFirst(tdb->settingsHash);
struct hashEl *hel;
fprintf(f, "\ttrack %s\n", makeUnique(collectionNameHash, name));
while ((hel = hashNext(&cookie)) != NULL)
{
- if (sameString(hel->name, "mathDataUrl"))
- {
-/*
- fprintf(f, "\ttrackNames ");
- struct mathTrack *mt = (struct mathTrack *)track;
- struct track *tr = mt->trackList;
- for(; tr; tr = tr->next)
- {
- fprintf(f, "%s ", tr->name);
- }
- fprintf(f, "\n");
-
- fprintf(f, "\tmathDataUrl ");
- tr = mt->trackList;
- if ((mt->function == NULL) || sameString(mt->function, "add"))
- fprintf(f, "+ ");
- else
- fprintf(f, "- ");
- for(; tr; tr = tr->next)
- {
- fprintf(f, "%s ", getUrl(conn, db, wigTracks, tr, nameHash));
- }
- fprintf(f, "\n");
-*/
- }
- else if (differentString(hel->name, "parent") && differentString(hel->name, "polished")&& differentString(hel->name, "color")&& differentString(hel->name, "track")&& differentString(hel->name, "trackNames")&& differentString(hel->name, "superTrack"))
+ if (differentString(hel->name, "parent") && differentString(hel->name, "polished")&& differentString(hel->name, "color")&& differentString(hel->name, "track")&& differentString(hel->name, "trackNames")&& differentString(hel->name, "superTrack"))
fprintf(f, "\t%s %s\n", hel->name, (char *)hel->val);
}
if (bigDataUrl == NULL)
{
if (dataUrl != NULL)
fprintf(f, "\tbigDataUrl %s\n", dataUrl);
}
fprintf(f, "\tparent %s\n",parent);
fprintf(f, "\tcolor %d,%d,%d\n", (color >> 16) & 0xff,(color >> 8) & 0xff,color & 0xff);
fprintf(f, "\n");
}
static void outComposite(FILE *f, struct track *collection)
+// output a composite header for user composite
{
char *parent = collection->name;
char *shortLabel = collection->shortLabel;
char *longLabel = collection->longLabel;
fprintf(f,"track %s\n\
shortLabel %s\n\
compositeTrack on\n\
aggregate none\n\
longLabel %s\n\
%s on\n\
type wig \n\
visibility full\n\n", parent, &shortLabel[2], longLabel, CUSTOM_COMPOSITE_SETTING);
}
static int snakePalette2[] =
{
0x1f77b4, 0xaec7e8, 0xff7f0e, 0xffbb78, 0x2ca02c, 0x98df8a, 0xd62728, 0xff9896, 0x9467bd, 0xc5b0d5, 0x8c564b, 0xc49c94, 0xe377c2, 0xf7b6d2, 0x7f7f7f, 0xc7c7c7, 0xbcbd22, 0xdbdb8d, 0x17becf, 0x9edae5
};
-static void outMathWig(FILE *f, struct sqlConnection *conn, char *db, struct track *mathWig, struct hash *nameHash)
+static void outView(FILE *f, struct sqlConnection *conn, char *db, struct track *view, char *parent, struct hash *nameHash, struct hash *collectionNameHash)
+// output a view to a trackhub
{
fprintf(f,"\ttrack %s\n\
\tshortLabel %s\n\
\tlongLabel %s\n\
-\ttype mathWig \n\
-\tvisibility full\n", mathWig->name, &mathWig->shortLabel[2], mathWig->longLabel);
-fprintf(f,"\tmathDataUrl + ");
-struct track *track = mathWig->trackList;
+\tview %s \n\
+\tparent %s \n\
+\tvisibility full\n", view->name, &view->shortLabel[2], view->longLabel, view->name, parent);
+//fprintf(f,"\tequation +\n");
+fprintf(f, "\n");
+
+int useColor = 0;
+struct track *track = view->trackList;
for(; track; track = track->next)
{
- fprintf(f, "%s ", getUrl(conn, db, track, nameHash));
- }
+ struct trackDb *tdb = hashMustFindVal(nameHash, track->name);
-fprintf(f, "\n");
+ outTdb(conn, db, f, track->name,tdb, view->name, snakePalette2[useColor], track, nameHash, collectionNameHash);
+ useColor++;
+ }
}
void updateHub(char *db, struct track *collectionList, struct hash *nameHash)
+// save our state to the track hub
{
char *hubName = getHubName(db);
chmod(hubName, 0666);
FILE *f = mustOpen(hubName, "w");
struct hash *collectionNameHash = newHash(6);
outHubHeader(f, db, hubName);
int useColor = 0;
struct track *collection;
struct sqlConnection *conn = hAllocConn(db);
for(collection = collectionList; collection; collection = collection->next)
{
outComposite(f, collection);
struct trackDb *tdb;
struct track *track;
for (track = collection->trackList; track; track = track->next)
{
if (track->trackList != NULL)
{
- outMathWig(f, conn, db, track, nameHash);
+ outView(f, conn, db, track, collection->name, nameHash, collectionNameHash);
}
else
{
tdb = hashMustFindVal(nameHash, track->name);
outTdb(conn, db, f, track->name,tdb, collection->name, snakePalette2[useColor], track, nameHash, collectionNameHash);
useColor++;
if (useColor == (sizeof snakePalette2 / sizeof(int)))
useColor = 0;
}
}
}
fclose(f);
hFreeConn(&conn);
}
static struct track *parseJson(char *jsonText)
+// parse the JSON of the treetable from the Javascript
{
struct hash *trackHash = newHash(5);
struct track *collectionList = NULL;
struct track *track;
char *ptr = jsonText;
if (*ptr != '[')
errAbort("element didn't start with [");
ptr++;
do
{
if (*ptr != '[')
errAbort("element didn't start with [");
ptr++;
@@ -689,54 +678,56 @@
track->longLabel = getString(&ptr);
track->name = getString(&ptr);
track->visibility = getString(&ptr);
hashAdd(trackHash, track->name, track);
if (*ptr != ']')
errAbort("element didn't end with ]");
ptr++;
if (*ptr == ',')
ptr++;
} while (*ptr != ']');
return collectionList;
}
void doAjax(char *db, char *jsonText, struct hash *nameHash)
+// Save our state
{
struct track *collectionList = parseJson(jsonText);
updateHub(db, collectionList, nameHash);
}
static struct hash *buildNameHash(struct trackDb *list)
// TODO; needs to go down one more layer
{
struct hash *nameHash = newHash(8);
struct trackDb *tdb;
for(tdb = list; tdb; tdb = tdb->next)
{
hashAdd(nameHash, trackHubSkipHubName(tdb->track), tdb);
struct trackDb *subTdb = tdb->subtracks;
for(; subTdb; subTdb = subTdb->next)
{
hashAdd(nameHash, trackHubSkipHubName(subTdb->track), subTdb);
}
}
return nameHash;
}
static struct trackDb *traverseTree(struct trackDb *oldList, struct hash *groupHash)
+// add acceptable tracks to our tree
{
struct trackDb *newList = NULL, *tdb, *tdbNext;
for(tdb = oldList; tdb ; tdb = tdbNext)
{
tdbNext = tdb->next;
if (tdb->subtracks)
{
tdb->subtracks = traverseTree(tdb->subtracks, groupHash);
if (tdb->subtracks)
{
hashStore(groupHash, tdb->grp);
slAddHead(&newList, tdb);
}
@@ -744,30 +735,31 @@
else
{
if (trackCanBeAdded(tdb))
{
hashStore(groupHash, tdb->grp);
slAddHead(&newList, tdb);
}
}
}
slReverse(&newList);
return newList;
}
static void pruneTrackList(struct trackDb **fullTrackList, struct grp **fullGroupList)
+// drop track types we don't grok yet
{
struct hash *groupHash = newHash(5);
*fullTrackList = traverseTree(*fullTrackList, groupHash);
struct grp *newGroupList = NULL, *grp, *nextGrp;
for (grp = *fullGroupList; grp; grp = nextGrp)
{
nextGrp = grp->next;
if (hashLookup(groupHash, grp->name))
slAddHead(&newGroupList, grp);
}
slReverse(&newGroupList);
*fullGroupList = newGroupList;