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"))