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/hgc/hgc.c src/hg/hgc/hgc.c index 41dba1418d8..df84bcab6b2 100644 --- src/hg/hgc/hgc.c +++ src/hg/hgc/hgc.c @@ -3251,31 +3251,34 @@ puts("
  • \n"); hgcAnchorSomewhere(mrnaClick, geneName, geneTable, seqName); /* hack to put out a correct message describing the mRNA */ if (sameString(mrnaClick, "htcGeneMrna")) printf("%s from genomic sequences\n", mrnaDescription); else printf("%s (may be different from the genomic sequence)\n", mrnaDescription); puts("
  • \n"); puts("
  • \n"); hgcAnchorSomewhere(genomicClick, geneName, geneTable, seqName); printf("Genomic Sequence from assembly\n"); puts("
  • \n"); -if (palInfo) +// Skip the CDS FASTA alignment link for quickLifted tracks: hgPal would try +// to open the destination's hub-virtual db, and palInfo coords are in +// destination space while the multiZ alignment lives in source coords. +if (palInfo && liftDb == NULL) { struct sqlConnection *conn = hAllocConn(srcDb); addPalLink(conn, tdb->track, palInfo->chrom, palInfo->left, palInfo->right, palInfo->rnaName); hFreeConn(&conn); } printf("\n"); } void geneShowPosAndLinks(char *geneName, char *pepName, struct trackDb *tdb, char *pepTable, char *pepClick, char *mrnaClick, char *genomicClick, char *mrnaDescription) { geneShowPosAndLinksPal(geneName, pepName, tdb, @@ -9645,31 +9648,31 @@ db = liftDb; struct sqlConnection *conn = hAllocConn(db); struct sqlResult *sr; char **row; struct genePred *gp; int rowOffset = hOffsetPastBin(db, seqName, tdb->table); if (liftDb != NULL) { char *table; if (isCustomTrack(tdb->table)) { liftDb = CUSTOM_TRASH; table = trackDbSetting(tdb, "dbTableName"); } else - table = tdb->table; + table = trackHubSkipHubName(tdb->table); struct hash *chainHash = newHash(8); struct sqlConnection *conn = hAllocConn(liftDb); // using this loader on genePred tables with less than 15 fields may be a problem. extern struct genePred *genePredExtLoad15(char **row); char extraWhere[4096]; sqlSafef(extraWhere, sizeof extraWhere, "name = \"%s\"", geneName); gpList = (struct genePred *)quickLiftSql(conn, quickLiftFile, table, seqName, winStart, winEnd, NULL, extraWhere, (ItemLoader2)genePredExtLoad15, 0, chainHash); hFreeConn(&conn); calcLiftOverGenePreds( gpList, chainHash, 0.0, 0.0, TRUE, NULL, NULL, TRUE, FALSE); } else { @@ -13798,37 +13801,41 @@ if (genbankIsRefSeqCodingMRnaAcc(rnaName)) { AllocVar(palInfo); palInfo->chrom = chrom; palInfo->left = left; palInfo->right = right; palInfo->rnaName = rnaName; } // For quickLifted tracks, route the Predicted Protein/mRNA links to the // genome-derived handlers so the sequences reflect the destination // assembly at the lifted exon coordinates, rather than the NCBI-authored // sequence that lives with the source refPep/refMrna extFiles. // htcTranslatedPredMRna keys on the transcript name rather than the -// protein accession, so swap the pepName for that case. +// protein accession, so swap the pepName for that case. For non-coding +// transcripts (NR_*) leave pepName as the empty protAcc, otherwise gbSeq +// would match the mrnaAcc and we'd offer a Predicted Protein link that +// htcTranslatedPredMRna can only abort on. char *pepClick = "htcTranslatedProtein"; char *pepName = rl->protAcc; char *mrnaClick = "htcRefMrna"; if (liftDb != NULL) { pepClick = "htcTranslatedPredMRna"; + if (genbankIsRefSeqCodingMRnaAcc(rnaName)) pepName = rl->mrnaAcc; mrnaClick = "htcGeneMrna"; } geneShowPosAndLinksPal(rl->mrnaAcc, pepName, tdb, refPepTable, pepClick, mrnaClick, "htcGeneInGenome", "mRNA Sequence",palInfo); printTrackHtml(tdb); hFreeConn(&conn); } char *kgIdToSpId(struct sqlConnection *conn, char* kgId) /* get the swissprot id for a known genes id; resulting string should be * freed */ { char query[512];