736a3a779c20bf482ed252e5077f1c851c6a500f braney Thu Apr 10 10:51:26 2025 -0700 add support for GVF in quickLift. Grab HTML from native db for quick lifted tracks. diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c index 31845ea6f78..fed10068a84 100644 --- src/hg/lib/trackHub.c +++ src/hg/lib/trackHub.c @@ -1614,103 +1614,104 @@ if (!(sameString(track, "decipherSnvs")|| sameString(track, "omimLocation") || sameString(track, "omimAvSnp")|| sameString(track, "ncbiRefSeq"))) dyStringPrintf(dy, "avoidHandler on\n"); dumpTdbAndChildren(dy, tdb); return dy; } static boolean validateOneTdb(char *db, struct trackDb *tdb) /* Make sure the tdb is a track type we grok. */ { if (!( startsWith("bigBed", tdb->type) || \ startsWith("bigWig", tdb->type) || \ startsWith("bigDbSnp", tdb->type) || \ startsWith("bigGenePred", tdb->type) || \ + startsWith("gvf", tdb->type) || \ startsWith("genePred", tdb->type) || \ startsWith("bed ", tdb->type))) { //printf("%s not included: bad type %s\n",tdb->track,tdb->type); return FALSE; } // make sure we have a bigDataUrl if (startsWith("bigBed", tdb->type) || \ startsWith("bigWig", tdb->type)) { char *fileName = cloneString(trackDbSetting(tdb, "bigDataUrl")); if (fileName == NULL) { struct sqlConnection *conn = hAllocConnTrack(db, tdb); fileName = bbiNameFromSettingOrTable(tdb, conn, tdb->table); hashAdd(tdb->settingsHash, "bigDataUrl", fileName); } } return TRUE; } -static struct trackDb * validateTdbChildren(char *db, struct trackDb *tdb) +static struct trackDb * validateTdbChildren(struct cart *cart, char *db, struct trackDb *tdb) /* return a list of the children that can be quick lifted */ { struct trackDb *validTdbs = NULL; struct trackDb *nextTdb; unsigned count = 0; if (tdb->subtracks) // this is a view, descend again { struct trackDb *view = tdb; for (; view; view = nextTdb) { nextTdb = view->next; - view->subtracks = validateTdbChildren(db,view->subtracks); + view->subtracks = validateTdbChildren(cart, db,view->subtracks); if (view->subtracks != NULL) { slAddHead(&validTdbs, view); if (view->visibility) count++; } } } else { for(; tdb; tdb = nextTdb) { nextTdb = tdb->next; if (validateOneTdb(db, tdb)) { slAddHead(&validTdbs, tdb); - if (tdb->visibility) + if (isSubtrackVisible(cart, tdb)) count++; } } } if (count) return validTdbs; return NULL; } -static boolean validateTdb(char *db, struct trackDb *tdb) +static boolean validateTdb(struct cart *cart, char *db, struct trackDb *tdb) // make sure we only output track types that can // be quickLifted. Return true if we any tracks survive { if (tdb->subtracks) { - tdb->subtracks = validateTdbChildren(db, tdb->subtracks); + tdb->subtracks = validateTdbChildren(cart, db, tdb->subtracks); if (tdb->subtracks == NULL) return FALSE; return TRUE; } return validateOneTdb(db, tdb); } static void walkTree(FILE *f, char *db, struct cart *cart, struct trackDb *tdb, struct dyString *visDy) /* walk tree looking for visible tracks. */ { for(; tdb; tdb = tdb->next) { boolean isVisible = FALSE; @@ -1722,31 +1723,31 @@ { tdb->visibility = hTvFromString(cartVis); } isVisible = tdb->visibility != tvHide; } else if (isParentVisible(cart, tdb) && isSubtrackVisible(cart, tdb)) // child of supertrack { char *cartVis = cartOptionalString(cart, tdb->parent->track); if (cartVis != NULL) tdb->visibility = hTvFromString(cartVis); else if (tdbIsSuperTrack(tdb->parent)) tdb->visibility = tdb->parent->isShow; isVisible = TRUE; } - if (isVisible && validateTdb(db, tdb)) + if (isVisible && validateTdb(cart, db, tdb)) { dyStringPrintf(visDy, "&%s=%s", trackHubSkipHubName(tdb->track),hStringFromTv(tdb->visibility)); //if (hashLookup(tdb->settingsHash, "customized") == NULL) { hashRemove(tdb->settingsHash, "maxHeightPixels"); hashRemove(tdb->settingsHash, "superTrack"); hashRemove(tdb->settingsHash, "subGroups"); hashRemove(tdb->settingsHash, "polished"); hashRemove(tdb->settingsHash, "noInherit"); hashRemove(tdb->settingsHash, "group"); hashRemove(tdb->settingsHash, "parent"); } //hashReplace(tdb->settingsHash, "customized", "on");