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("
Sequence 1: %s
Sequence 2: %s
\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("\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;