6f726d2bcdb4fca993c06cf2181dce97b061702d
kate
Thu Feb 22 08:59:49 2018 -0800
Add support for custom tracks and hub tracks. refs #17512
diff --git src/hg/hgc/interactClick.c src/hg/hgc/interactClick.c
index 14e8bb4..e9b5b38 100644
--- src/hg/hgc/interactClick.c
+++ src/hg/hgc/interactClick.c
@@ -1,88 +1,142 @@
/* Details page for interact type tracks */
/* Copyright (C) 2018 The Regents of the University of California
* See README in this or parent directory for licensing information. */
#include "common.h"
#include "obscure.h"
#include "hdb.h"
#include "hgc.h"
#include "interact.h"
#include "interactUi.h"
-static struct interact *getInteract(char *item, char *chrom, int start, int end, char *table)
-/* Retrieve this item from track table
- * TODO: Hubbify */
+static struct interact *getInteractFromTable(struct trackDb *tdb, char *item,
+ char *chrom, int start, int end)
+/* Retrieve this item from track table */
{
-struct sqlConnection *conn = hAllocConn(database);
+struct sqlConnection *conn = NULL;
+struct customTrack *ct = lookupCt(tdb->track);
+char *table;
+if (ct != NULL)
+ {
+ conn = hAllocConn(CUSTOM_TRASH);
+ table = ct->dbTableName;
+ }
+else
+ {
+ conn = hAllocConnTrack(database, tdb);
+ table = tdb->table;
+ }
+if (conn == NULL)
+ return NULL;
+
struct interact *inters = NULL, *inter;
char **row;
int offset;
char where[512];
+if (isNotEmpty(item))
sqlSafefFrag(where, sizeof(where), "name='%s'", item);
struct sqlResult *sr = hRangeQuery(conn, table, chrom, start, end, where, &offset);
while ((row = sqlNextRow(sr)) != NULL)
{
inter = interactLoad(row+offset);
slAddHead(&inters, inter);
}
slReverse(&inters);
sqlFreeResult(&sr);
hFreeConn(&conn);
return inters;
}
+static struct interact *getInteractFromFile(char *file, char *item, char *chrom, int start, int end)
+/* Retrieve interact BED item from big file */
+{
+struct bbiFile *bbi = bigBedFileOpen(file);
+struct lm *lm = lmInit(0);
+struct bigBedInterval *bb, *bbList = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm);
+for (bb = bbList; bb != NULL; bb = bb->next)
+ {
+ char startBuf[16], endBuf[16];
+ char *row[32];
+ bigBedIntervalToRow(bb, chrom, startBuf, endBuf, row, ArraySize(row));
+ struct interact *interact = interactLoad(row);
+ if (interact == NULL)
+ continue;
+ if (sameString(interact->name, item))
+ return interact;
+ }
+return NULL;
+}
+
+static struct interact *getInteract(struct trackDb *tdb, char *item,
+ char *chrom, int start, int end)
+/* Retrieve interact BED item from track */
+{
+struct interact *interact = NULL;
+char *file = trackDbSetting(tdb, "bigDataUrl");
+if (file != NULL)
+ interact = getInteractFromFile(file, item, chrom, start, end);
+else
+ interact = getInteractFromTable(tdb, item, chrom, start, end);
+return interact;
+}
+
+
void doInteractDetails(struct trackDb *tdb, char *item)
/* Details of interaction item */
{
char *chrom = cartString(cart, "c");
int start = cartInt(cart, "o");
int end = cartInt(cart, "t");
-// TODO: hubbify
-struct interact *inter = getInteract(item, chrom, start, end, tdb->table);
+struct interact *inter = getInteract(tdb, item, chrom, start, end);
if (inter == NULL)
errAbort("Can't find interaction '%s'", item);
genericHeader(tdb, item);
char startBuf[1024], endBuf[1024], sizeBuf[1024];
if (isNotEmpty(inter->name))
printf("Interaction name: %s
\n", inter->name);
printf("Interaction region: ");
if (interactOtherChrom(inter))
printf("across chromosomes
");
else
{
sprintLongWithCommas(startBuf, inter->chromStart+1);
sprintLongWithCommas(endBuf, inter->chromEnd);
sprintLongWithCommas(sizeBuf, inter->chromEnd - inter->chromStart);
printf("%s:%s-%s",
inter->chrom, inter->chromStart, inter->chromEnd,
inter->chrom, startBuf, endBuf);
printf(" %s bp
\n", sizeBuf);
}
printf("Score: %d
\n", inter->score);
printf("Value: %0.3f
\n", inter->value);
if (isNotEmpty(inter->exp))
printf("Experiment: %s
\n", inter->exp);
puts("
");
sprintLongWithCommas(startBuf, inter->sourceStart+1);
sprintLongWithCommas(endBuf, inter->sourceEnd);
+sprintLongWithCommas(sizeBuf, inter->sourceEnd - inter->sourceStart);
+// TODO: Change labels if non-directional
printf("Source region: %s "
- "%s:%s-%s
\n",
+ "%s:%s-%s",
inter->sourceName, inter->sourceChrom, inter->sourceStart+1, inter->sourceEnd,
inter->sourceChrom, startBuf, endBuf);
+printf(" %s bp
\n", sizeBuf);
sprintLongWithCommas(startBuf, inter->targetStart+1);
sprintLongWithCommas(endBuf, inter->targetEnd);
+sprintLongWithCommas(sizeBuf, inter->targetEnd - inter->targetStart);
printf("Target region: %s "
- "%s:%s-%s
\n",
+ "%s:%s-%s",
inter->targetName, inter->targetChrom, inter->targetStart+1, inter->targetEnd,
inter->targetChrom, startBuf, endBuf);
+printf(" %s bp
\n", sizeBuf);
#ifdef TODO
-/* TODO: get count and score stats of all interactions in window */
+/* TODO: get count and score stats of all interactions in window ?*/
double *scores;
AllocArray(scores, count);
#endif
}