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/hgc/gvfClick.c src/hg/hgc/gvfClick.c index f49c21f10a9..88890c2ee5a 100644 --- src/hg/hgc/gvfClick.c +++ src/hg/hgc/gvfClick.c @@ -1,52 +1,76 @@ /* gvfClick - handler for variants from GVF (http://www.sequenceontology.org/gvf.html) */ /* Copyright (C) 2013 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "htmshell.h" #include "hgc.h" #include "bed8Attrs.h" +#include "quickLift.h" static boolean isInteger(char *word) /* Return TRUE if all characters of word are numeric. */ { if (word == NULL) return FALSE; char *s = word; while (*s != '\0') if (! isdigit(*s++)) return FALSE; return TRUE; } void doGvf(struct trackDb *tdb, char *item) /* Show details for variants represented as GVF, stored in a bed8Attrs table */ { -struct sqlConnection *conn = hAllocConn(database); +char *liftDb = cloneString(trackDbSetting(tdb, "quickLiftDb")); +char *db = (liftDb == NULL) ? database : liftDb; +struct sqlConnection *conn = hAllocConn(db); int start = cartInt(cart, "o"); +struct bed8Attrs *ba = NULL; + +if (liftDb == NULL) + { char query[1024]; sqlSafef(query, sizeof(query), "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", tdb->table, item, seqName, start); struct sqlResult *sr = sqlGetResult(conn, query); char **row; if ((row = sqlNextRow(sr)) == NULL) errAbort("doGvfDetails: can't find item '%s' in %s at %s:%d", item, database, seqName, start); -int rowOffset = hOffsetPastBin(database, seqName, tdb->table); -struct bed8Attrs *ba = bed8AttrsLoad(row+rowOffset); + int rowOffset = hOffsetPastBin(db, seqName, tdb->table); + ba = bed8AttrsLoad(row+rowOffset); + sqlFreeResult(&sr); + } +else + { + char *quickLiftFile = cloneString(trackDbSetting(tdb, "quickLiftUrl")); + struct hash *chainHash = newHash(8); + struct bed8Attrs *bed= (struct bed8Attrs *)quickLiftSql(conn, quickLiftFile, tdb->table, seqName, winStart, winEnd, NULL, NULL, (ItemLoader2)bed8AttrsLoad, 0, chainHash); + + ba = (struct bed8Attrs *)quickLiftBeds((struct bed *)bed, chainHash, FALSE); + + for(; ba; ba = ba->next) + if (sameString(ba->name, item) && (ba->chromStart == start)) + break; + + if (ba == NULL) + errAbort("doGvfDetails: can't find item '%s' in %s at %s:%d", item, liftDb, seqName, start); + } bedPrintPos((struct bed *)ba, 3, tdb); int i = 0; // Note: this loop modifies ba->attrVals[i], assuming we won't use them again: for (i = 0; i < ba->attrCount; i++) { // The ID is the bed8Attrs name and has already been displayed: if (sameString(ba->attrTags[i], "ID")) continue; cgiDecode(ba->attrVals[i], ba->attrVals[i], strlen(ba->attrVals[i])); char *tag = ba->attrTags[i]; // User-defined keywords used in dbVar's GVF: if (sameString(tag, "var_type")) // This one isn't anymore, but I add it back (hg18.txt). tag = "Variant type"; else if (sameString(tag, "clinical_int")) tag = "Clinical interpretation"; @@ -98,19 +122,18 @@ printf("%s: %s
\n", tag, htmlEncode(ba->attrVals[i])); } else if (sameWord(tag, "Phenotype_id") && startsWith("HPO:HP:", ba->attrVals[i])) { subChar(tag, '_', ' '); printf("%s: %s
\n", tag, ba->attrVals[i]+strlen("HPO:"), htmlEncode(ba->attrVals[i])); } else { subChar(tag, '_', ' '); printf("%s: %s
\n", tag, htmlEncode(ba->attrVals[i])); } } -sqlFreeResult(&sr); hFreeConn(&conn); /* printTrackHtml is done in genericClickHandlerPlus. */ }