2654a3d85847492877e5d2b48d921a292e991771 braney Thu May 7 09:40:26 2026 -0700 hgConvert quickLift: fix subtrack selection, hgc Predicted Protein / CDS FASTA links Three remaining issues on this ticket: (vii) After "+ Select all subtracks" on hg38 refSeqComposite then quickLifting to hs1, only RefSeq Curated rendered. dumpTdbAndChildren built buffer="_sel" but then read cart[tdb->track] (the visibility, not the checkbox state); the visibility is never "1", so every subtrack emitted "parent off" and only trackDb-default-on subtracks rendered. Read cart[buffer] and accept any cartUsualBoolean-true value ("on" or positive int). Predicted Protein blank page on quickLifted refGene: getGenePredForPositionSql passed the hub-prefixed tdb->table to quickLiftSql, which then queried the source DB (hg38) for a "hub_NNN_refGene" table that doesn't exist. Strip the prefix with trackHubSkipHubName before the source-DB query. Also, doRefGene was overriding pepName to rl->mrnaAcc for every quickLifted item, so for non-coding NR_* the mrnaAcc matched gbSeq and we offered a Predicted Protein link that htcTranslatedPredMRna can only abort on. Only override pepName for coding mRNAs; non-coding falls through to the existing "Non-protein coding gene..." message. CDS FASTA "Unknown database hub_NNN_": addPalLink generates an hgPal URL with no db=, so hgPal tries to open the destination hub-virtual db and dies. palInfo coords are in destination space anyway while the multiZ alignment lives in source coords, so skip addPalLink for quickLifted tracks. refs #36125 Co-Authored-By: Claude Opus 4.7 (1M context) diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c index b747cfc69e0..5dfa88c8d31 100644 --- src/hg/lib/trackHub.c +++ src/hg/lib/trackHub.c @@ -1669,36 +1669,34 @@ char *cartVis = cartOptionalString(cart, tdb->track); if (cartVis != NULL) tdb->visibility = hTvFromString(cartVis); dyStringPrintf(dy, "visibility %s\n", hStringFromTv(tdb->visibility)); if (tdbIsSuperTrack(tdb->parent)) dyStringPrintf(dy, "parent %s\n", trackHubSkipHubName(tdb->parent->track)); while ((hel = hashNext(&cookie)) != NULL) { if (sameString(hel->name, "parent")) { char buffer[1024]; safef(buffer, sizeof buffer, "%s_sel", tdb->track); - char *cartSelected = cartOptionalString(cart, tdb->track); + char *cartSelected = cartOptionalString(cart, buffer); if (cartSelected != NULL) { - char *str = "off"; - if (sameString(cartSelected, "1")) - str = "on"; + char *str = (sameWord(cartSelected, "on") || atoi(cartSelected) > 0) ? "on" : "off"; dyStringPrintf(dy, "parent %s %s\n", trackHubSkipHubName(tdb->parent->track), str); } else dyStringPrintf(dy, "%s %s\n", hel->name, trackHubSkipHubName(((char *)hel->val))); } else if (sameString(hel->name, "html")) dyStringPrintf(dy, "%s %s\n", hel->name, trackHubSkipHubName((char *)hel->val)); else if (differentString(hel->name, "track") && differentString(hel->name, "visibility")) dyStringPrintf(dy, "%s %s\n", hel->name, ((char *)hel->val)); } if (tdb->subtracks) { for (tdb = tdb->subtracks; tdb; tdb = tdb->next) {