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;