11bc4be74936249529960fb3a532376779debbe5
braney
  Thu Feb 6 11:06:45 2025 -0800
add hgc support for click throughs on quickLifted custom tracks

diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index dda6c31ce36..05375ebeff0 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -1988,32 +1988,58 @@
 }
 
 
 void genericBedClick(struct sqlConnection *conn, struct trackDb *tdb,
 		     char *item, int start, int bedSize)
 /* Handle click in generic BED track. */
 {
 char table[HDB_MAX_TABLE_STRING];
 boolean hasBin;
 struct bed *bed;
 char query[512];
 struct sqlResult *sr;
 char **row;
 boolean firstTime = TRUE;
 
-if (!hFindSplitTable(database, seqName, tdb->table, table, sizeof table, &hasBin))
+char *liftDb = cloneString(trackDbSetting(tdb, "quickLiftDb"));
+
+char *db = database;
+char *sqlTable = tdb->table;
+if (liftDb != NULL)
+    {
+    if (isCustomTrack(trackHubSkipHubName(tdb->track)))
+        {
+        liftDb = CUSTOM_TRASH;
+        sqlTable = trackDbSetting(tdb, "dbTableName");
+        }
+    db = liftDb;
+    }
+
+if (!hFindSplitTable(db, seqName, tdb->table, table, sizeof table, &hasBin))
     errAbort("genericBedClick track %s not found", tdb->table);
+
+if (liftDb)
+    {
+    struct hash *chainHash = newHash(10);
+    char *quickLiftFile = cloneString(trackDbSetting(tdb, "quickLiftUrl"));
+    bed = (struct bed *)quickLiftSql(conn, quickLiftFile, sqlTable, seqName, winStart, winEnd,  NULL, NULL, (ItemLoader2)bedLoadN, bedSize, chainHash);
+    bedPrintPos(bed, bedSize, tdb);
+
+    //extraFieldsPrint(tdb,sr,row,sqlCountColumns(sr));
+    }
+else 
+    {
     if (bedSize <= 3)
         sqlSafef(query, sizeof query, "select * from %s where chrom = '%s' and chromStart = %d", table, seqName, start);
     else
         {
         struct hTableInfo *hti = hFindTableInfoWithConn(conn, seqName, tdb->table);
         if (hti && *hti->nameField && differentString("name", hti->nameField))
             sqlSafef(query, sizeof query, "select * from %s where %s = '%s' and chrom = '%s' and chromStart = %d",
                 table, hti->nameField, item, seqName, start);
         else
             sqlSafef(query, sizeof query, "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d",
                 table, item, seqName, start);
         }
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
@@ -2022,30 +2048,31 @@
         else
             htmlHorizontalLine();
         bed = bedLoadN(row+hasBin, bedSize);
         bedPrintPos(bed, bedSize, tdb);
 
         extraFieldsPrint(tdb,sr,row,sqlCountColumns(sr));
 
         // check for seq1 and seq2 in columns 7+8 (eg, pairedTagAlign)
         char *setting = trackDbSetting(tdb, BASE_COLOR_USE_SEQUENCE);
         if (bedSize == 6 && setting && sameString(setting, "seq1Seq2"))
             printf("<br><B>Sequence 1:</B> %s<br><B>Sequence 2:</B> %s<br>\n",row[hasBin+6], row[hasBin+7]);
         printCompareGenomeLinks(tdb,bed->name);
         }
     sqlFreeResult(&sr);
     getBedTopScorers(conn, tdb, table, item, start, bedSize);
+    }
 printItemDetailsHtml(tdb, item);
 }
 
 #define INTRON 10
 #define CODINGA 11
 #define CODINGB 12
 #define UTR5 13
 #define UTR3 14
 #define STARTCODON 15
 #define STOPCODON 16
 #define SPLICESITE 17
 #define NONCONSPLICE 18
 #define INFRAMESTOP 19
 #define INTERGENIC 20
 #define REGULATORY 21
@@ -4629,31 +4656,42 @@
 printf("</TABLE>\n");
 }
 
 void genericClickHandlerPlus(
         struct trackDb *tdb, char *item, char *itemForUrl, char *plus)
 /* Put up generic track info, with additional text appended after item. */
 {
 char *dupe, *type, *words[16], *headerItem;
 int wordCount;
 int start = cartInt(cart, "o");
 int end = cartInt(cart, "t");
 struct sqlConnection *conn = NULL;
 char *imagePath = trackDbSetting(tdb, ITEM_IMAGE_PATH);
 char *container = trackDbSetting(tdb, "container");
 
-if (!trackHubDatabase(database))
+char *liftDb = cloneString(trackDbSetting(tdb, "quickLiftDb"));
+
+if (liftDb)
+    {
+    if (isCustomTrack(trackHubSkipHubName(tdb->track)))
+        {
+        liftDb = CUSTOM_TRASH;
+        tdb->table = trackDbSetting(tdb, "dbTableName");
+        }
+    conn = hAllocConnTrack(liftDb, tdb);
+    }
+else if (!trackHubDatabase(database))
     conn = hAllocConnTrack(database, tdb);
 if (itemForUrl == NULL)
     itemForUrl = item;
 dupe = cloneString(tdb->type);
 wordCount = chopLine(dupe, words);
 headerItem = cloneString(item);
 type = words[0];
 
 /* Suppress printing item name in page header, as it is not informative for these types of
  * tracks... */
 if (container == NULL && wordCount > 0)
     {
     if (sameString(type, "maf") || sameString(type, "wigMaf") || sameString(type, "bigMaf") || sameString(type, "netAlign")
         || sameString(type, "encodePeak"))
         headerItem = NULL;