957f2123050742982ef6c7aefcab70d29144924c
braney
Mon Oct 9 17:49:04 2017 -0700
allow bedGraph. Change names in collections so they don't match names in
trackDb, move the copying of custom tracks and collections to BEFORE the
load of trackHubs, misc other bugs
diff --git src/hg/hgCollection/hgCollection.c src/hg/hgCollection/hgCollection.c
index 2189d4a..84526e1 100644
--- src/hg/hgCollection/hgCollection.c
+++ src/hg/hgCollection/hgCollection.c
@@ -62,71 +62,75 @@
{
safef(buffer, sizeof buffer, "%s%d", skipHub, count);
if (hashLookup(nameHash, buffer) == NULL)
{
hashStore(nameHash, buffer);
return cloneString(buffer);
}
}
return NULL;
}
static boolean trackCanBeAdded(struct trackDb *tdb)
// are we allowing this track into a custom composite
{
-return (tdb->subtracks == NULL) && !startsWith("wigMaf",tdb->type) && (startsWith("wig",tdb->type) || startsWith("bigWig",tdb->type)) ;
+return (tdb->subtracks == NULL) && !startsWith("wigMaf",tdb->type) && (startsWith("wig",tdb->type) || startsWith("bigWig",tdb->type) || startsWith("bedGraph",tdb->type)) ;
}
static void printGroup(char *parent, struct trackDb *tdb, boolean folder, boolean user)
// output list elements for a group
{
char *userString = "";
char *prefix = "";
-char *viewFunc = "show all";
+char *viewFunc = NULL;
if (user)
{
- //prefix = "coll_";
if (tdb->parent && tdb->subtracks)
{
viewFunc = trackDbSetting(tdb, "viewFunc");
- if (viewFunc == NULL)
- viewFunc = "show all";
- userString = "data-jstree='{\\\"icon\\\":\\\"../images/folderC.png\\\"}'viewType='track'viewType='view' class='folder'";
+ userString = "data-jstree='{\\\"icon\\\":\\\"../images/folderC.png\\\"}' viewType='view' class='folder'";
}
else if (tdb->subtracks)
userString = "data-jstree='{\\\"icon\\\":\\\"../images/folderC.png\\\"}' viewType='track' class='folder'";
else
userString = "data-jstree='{\\\"icon\\\":\\\"../images/invisible16.png\\\"}' viewType='track'";
}
else
{
- //prefix = "coll_";
if (tdb->parent && tdb->subtracks)
userString = "data-jstree='{\\\"icon\\\":\\\"../images/folderC.png\\\"}'viewType='track'class='nodrop' viewType='view'";
else if (tdb->subtracks)
userString = "data-jstree='{\\\"icon\\\":\\\"../images/folderC.png\\\"}'viewType='track'class='nodrop' viewType='track'";
else
userString = "data-jstree='{\\\"icon\\\":\\\"../images/invisible16.png\\\"}'class='nodrop' viewType='track'";
}
//userString = "viewType='track data-jstree='{'icon':'images/folderC.png'}''";
#define IMAKECOLOR_32(r,g,b) ( ((unsigned int)b<<0) | ((unsigned int)g << 8) | ((unsigned int)r << 16))
-jsInlineF("
%s", tdb->shortLabel, tdb->longLabel,IMAKECOLOR_32(tdb->colorR,tdb->colorG,tdb->colorB), viewFunc, hStringFromTv(tdb->visibility), prefix, trackHubSkipHubName(tdb->track), userString, tdb->shortLabel );
+char buffer[1024];
+char *viewFuncString = "";
+if (viewFunc != NULL)
+ {
+ safef(buffer, sizeof buffer, "viewFunc='%s' ", viewFunc);
+ viewFuncString = buffer;
+ }
+
+jsInlineF("%s", tdb->shortLabel, tdb->longLabel,IMAKECOLOR_32(tdb->colorR,tdb->colorG,tdb->colorB), viewFuncString, hStringFromTv(tdb->visibility), prefix, trackHubSkipHubName(tdb->track), userString, tdb->shortLabel );
jsInlineF(" (%s)", tdb->longLabel);
if (tdb->subtracks)
{
struct trackDb *subTdb;
jsInlineF("");
for(subTdb = tdb->subtracks; subTdb; subTdb = subTdb->next)
printGroup(trackHubSkipHubName(tdb->track), subTdb, user && (subTdb->subtracks != NULL), user);
jsInlineF("
");
}
jsInlineF("");
}
@@ -277,48 +281,48 @@
jsInlineF("");
}
static void doTable(struct cart *cart, char *db, struct grp *groupList, struct trackDb *trackList)
// output the tree table
{
char *hubName = hubNameFromUrl(getHubName(cart, db));
struct grp *curGroup;
for(curGroup = groupList; curGroup; curGroup = curGroup->next)
{
if ((hubName != NULL) && sameString(curGroup->name, hubName))
break;
}
if (curGroup != NULL)
{
- // print out all the tracks in this group
+ // print out all the tracks in all the collections
struct trackDb *tdb;
jsInlineF("$('#currentCollection').append(\"");
for(tdb = trackList; tdb; tdb = tdb->next)
{
if (sameString(tdb->grp, hubName))
{
jsInlineF("", trackHubSkipHubName(tdb->track), tdb->shortLabel);
jsInlineF("
");
printGroup("collections", tdb, TRUE, TRUE);
jsInlineF("
");
jsInlineF("
");
continue;
}
}
jsInlineF("\");\n");
- // print out all the tracks in this group
+ // print out all the collections
jsInlineF("$('#collectionList').append(\"");
for(tdb = trackList; tdb; tdb = tdb->next)
{
if (sameString(tdb->grp, hubName))
{
jsInlineF("%s", trackHubSkipHubName(tdb->track),trackHubSkipHubName(tdb->track), tdb->shortLabel);
//printGroup("collections", tdb, TRUE, TRUE);
}
}
jsInlineF("\");\n");
}
jsInlineF("$('#tracks').append(\"");
addVisibleTracks(cart, trackList);
for(curGroup = groupList; curGroup; curGroup = curGroup->next)
{
@@ -421,30 +425,35 @@
static void outTdb(struct sqlConnection *conn, char *db, FILE *f, char *name, struct trackDb *tdb, char *parent, char *visibility, unsigned int color, struct track *track, struct hash *nameHash, struct hash *collectionNameHash, int numTabs, int priority)
// out the trackDb for one track
{
char *dataUrl = NULL;
char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
char *tabs = "\t";
if (numTabs == 2)
tabs = "\t\t";
if (bigDataUrl == NULL)
{
if (startsWith("bigWig", tdb->type))
dataUrl = getSqlBigWig(conn, db, tdb);
}
+
+char *tdbType = trackDbSetting(tdb, "tdbType");
+if (tdbType != NULL)
+ hashReplace(tdb->settingsHash, "type", tdbType);
+
struct hashCookie cookie = hashFirst(tdb->settingsHash);
struct hashEl *hel;
fprintf(f, "%strack %s\n",tabs, makeUnique(collectionNameHash, name));
fprintf(f, "%sshortLabel %s\n",tabs, track->shortLabel);
fprintf(f, "%slongLabel %s\n",tabs, track->longLabel);
while ((hel = hashNext(&cookie)) != NULL)
{
if (differentString(hel->name, "parent") && differentString(hel->name, "polished")&& differentString(hel->name, "shortLabel")&& differentString(hel->name, "longLabel")&& differentString(hel->name, "color")&& differentString(hel->name, "visibility")&& differentString(hel->name, "track")&& differentString(hel->name, "trackNames")&& differentString(hel->name, "superTrack")&& differentString(hel->name, "priority")&& differentString(hel->name, "group"))
fprintf(f, "%s%s %s\n", tabs,hel->name, (char *)hel->val);
}
if (bigDataUrl == NULL)
{
if (dataUrl != NULL)
fprintf(f, "%sbigDataUrl %s\n", tabs,dataUrl);
}
@@ -463,118 +472,112 @@
char *longLabel = collection->longLabel;
fprintf(f,"track %s\n\
shortLabel %s\n\
compositeTrack on\n\
autoScale on\n\
aggregate none\n\
longLabel %s\n\
%s on\n\
color %ld,%ld,%ld \n\
type wig \n\
visibility full\n\n", parent, shortLabel, longLabel, CUSTOM_COMPOSITE_SETTING,
0xff& (collection->color >> 16),0xff& (collection->color >> 8),0xff& (collection->color));
}
-static char *skipColl(char *str)
-{
-if (startsWith("coll_", str))
- return &str[5];
-return str;
-}
-
-static int outView(FILE *f, struct sqlConnection *conn, char *db, struct track *view, char *parent, struct hash *nameHash, struct hash *collectionNameHash, int priority)
+static int outView(FILE *f, struct sqlConnection *conn, char *db, struct track *view, char *parent, struct hash *nameHash, struct hash *collectionNameHash, int priority, char *hubName)
// output a view to a trackhub
{
fprintf(f,"\ttrack %s\n\
\tshortLabel %s\n\
\tlongLabel %s\n\
\tview %s \n\
\tcontainer mathWig\n\
\tautoScale on \n\
\tparent %s \n\
\tcolor %ld,%ld,%ld \n\
\tpriority %d\n\
\tviewFunc %s \n\
\tvisibility %s\n", view->name, view->shortLabel, view->longLabel, view->name, parent, 0xff& (view->color >> 16),0xff& (view->color >> 8),0xff& (view->color), priority++, view->viewFunc, view->visibility);
//fprintf(f,"\tequation +\n");
fprintf(f, "\n");
//int useColor = 0;
struct track *track = view->trackList;
for(; track; track = track->next)
{
- struct trackDb *tdb = hashMustFindVal(nameHash, skipColl(track->name));
+ struct trackDb *tdb = hashMustFindVal(nameHash, track->name);
+ if ((tdb->grp == NULL) || differentString(tdb->grp, hubName))
+ {
+ // this is a new track in the collection. We want to make sure
+ // it gets a different name than the track in trackDb
+ hashStore(collectionNameHash, tdb->track);
+ }
- outTdb(conn, db, f, skipColl(track->name),tdb, view->name, track->visibility, track->color, track, nameHash, collectionNameHash, 2, priority++);
+ outTdb(conn, db, f, track->name,tdb, view->name, track->visibility, track->color, track, nameHash, collectionNameHash, 2, priority++);
//useColor++;
}
return priority;
}
static void updateHub(struct cart *cart, char *db, struct track *collectionList, struct hash *nameHash)
// save our state to the track hub
{
-char *hubName = getHubName(cart, db);
+char *filename = getHubName(cart, db);
+char *hubName = hubNameFromUrl(filename);
+
+FILE *f = mustOpen(filename, "w");
+chmod(filename, 0666);
-chmod(hubName, 0666);
-FILE *f = mustOpen(hubName, "w");
struct hash *collectionNameHash = newHash(6);
outHubHeader(f, db);
-//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;
int priority = 1;
for (track = collection->trackList; track; track = track->next)
{
- if (track->trackList != NULL)
+ if (track->viewFunc != NULL)
{
- priority = outView(f, conn, db, track, collection->name, nameHash, collectionNameHash, priority);
+ priority = outView(f, conn, db, track, collection->name, nameHash, collectionNameHash, priority, hubName);
}
else
{
tdb = hashMustFindVal(nameHash, track->name);
+ if ((tdb->grp == NULL) || differentString(tdb->grp, hubName))
+ {
+ // this is a new track in the collection. We want to make sure
+ // it gets a different name than the track in trackDb
+ hashStore(collectionNameHash, tdb->track);
+ }
outTdb(conn, db, f, track->name,tdb, collection->name, track->visibility, track->color, track, nameHash, collectionNameHash, 1, priority++);
- /*
- useColor++;
- if (useColor == (sizeof snakePalette2 / sizeof(int)))
- useColor = 0;
- */
}
}
}
fclose(f);
hFreeConn(&conn);
}
static unsigned long hexStringToLong(char *str)
{
-/*
-char buffer[1024];
-
-strcpy(buffer, "0x");
-strcat(buffer, &str[1]);
-*/
-
return strtol(&str[1], NULL, 16);
}
struct jsonParseData
{
struct track **collectionList;
struct hash *trackHash;
};
static void jsonObjStart(struct jsonElement *ele, char *name,
boolean isLast, void *context)
{
struct jsonParseData *jpd = (struct jsonParseData *)context;
struct track **collectionList = jpd->collectionList;
struct hash *trackHash = jpd->trackHash;