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/hgTracks/gvfTrack.c src/hg/hgTracks/gvfTrack.c index 129fbf23b63..0816ed6aa29 100644 --- src/hg/hgTracks/gvfTrack.c +++ src/hg/hgTracks/gvfTrack.c @@ -1,25 +1,26 @@ /* gvfTrack.c - display variants from GVF (http://www.sequenceontology.org/gvf.html) */ /* Copyright (C) 2012 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "hgTracks.h" #include "imageV2.h" #include "hdb.h" #include "bed8Attrs.h" +#include "quickLift.h" static Color gvfColor(struct track *tg, void *item, struct hvGfx *hvg) /* Color item by var_type attribute, according to Deanna Church's document * SvRepresentation2.doc attached to redmine #34. */ { struct bed8Attrs *gvf = item; Color dbVarUnknown = hvGfxFindColorIx(hvg, 0xb2, 0xb2, 0xb2); int ix = stringArrayIx("var_type", gvf->attrTags, gvf->attrCount); if (ix < 0) return dbVarUnknown; char *varType = gvf->attrVals[ix]; if (sameString(varType, "CNV") || sameString(varType, "copy_number_variation")) return MG_BLACK; else if (strstrNoCase(varType, "Gain")) return hvGfxFindColorIx(hvg, 0x00, 0x00, 0xff); @@ -85,47 +86,72 @@ { // no need to compare chrom here diff = ((bedCmpB->chromEnd - bedCmpB->chromStart) - (bedCmpA->chromEnd - bedCmpA->chromStart)); if (diff == 0) diff = bedCmpA->chromStart - bedCmpB->chromStart; } if (diff == 0) diff = strcmp(aParentName, bParentName); return diff; } } static void gvfLoad(struct track *tg) /* Load GVF items from a bed8Attrs database table. */ +{ +struct bed8Attrs *list = NULL, *bed; +char *liftDb = cloneString(trackDbSetting(tg->tdb, "quickLiftDb")); +if (nameHash == NULL) + nameHash= hashNew(0); + +if (liftDb != NULL) + { + char *table; + if (isCustomTrack(tg->table)) + { + liftDb = CUSTOM_TRASH; + table = trackDbSetting(tg->tdb, "dbTableName"); + } + else + table = tg->table; + struct hash *chainHash = newHash(8); + struct sqlConnection *conn = hAllocConn(liftDb); + char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl")); + bed= (struct bed8Attrs *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd, NULL, NULL, (ItemLoader2)bed8AttrsLoad, 0, chainHash); + + list = (struct bed8Attrs *)quickLiftBeds((struct bed *)bed, chainHash, FALSE); + for(bed=list; bed; bed = bed->next) + hashAdd(nameHash, bed->name, bed); + hFreeConn(&conn); + } +else { struct sqlConnection *conn = hAllocConn(database); int rowOffset; struct sqlResult *sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd, NULL, &rowOffset); char **row; -struct bed8Attrs *list = NULL; // if we someday get dense GVF tracks, might consider upping the default hash size: -if (nameHash == NULL) - nameHash= hashNew(0); while ((row = sqlNextRow(sr)) != NULL) { struct bed8Attrs *gvf = bed8AttrsLoad(row+rowOffset); slAddHead(&list, gvf); hashAdd(nameHash, gvf->name, gvf); } sqlFreeResult(&sr); hFreeConn(&conn); + } slSort(&list, gvfHierCmp); tg->items = list; } static char *gvfItemName(struct track *tg, void *item) /* ISCA requested that we append abbreviated variant origin to the item names. */ { struct bed8Attrs *gvf = item; struct dyString *name = dyStringNew(0); int ix = stringArrayIx("var_origin", gvf->attrTags, gvf->attrCount); if (ix >= 0) { char *origin = gvf->attrVals[ix]; if (sameWord(origin, "Not tested") || sameWord(origin, "Not reported") || sameWord(origin, "Tested - inconclusive") || sameWord(origin, "Not Provided"))