fa8c6c2c8140538f014381e43421163cc6c7eb98 kate Wed Jan 31 15:22:00 2018 -0800 Flesh out details page for interact track. refs #17512 diff --git src/hg/hgc/interactClick.c src/hg/hgc/interactClick.c index b4ab8c7..14e8bb4 100644 --- src/hg/hgc/interactClick.c +++ src/hg/hgc/interactClick.c @@ -1,21 +1,22 @@ /* 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 */ { struct sqlConnection *conn = hAllocConn(database); struct interact *inters = NULL, *inter; char **row; int offset; char where[512]; @@ -31,125 +32,57 @@ hFreeConn(&conn); return inters; } 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); if (inter == NULL) errAbort("Can't find interaction '%s'", item); genericHeader(tdb, item); -printf("<b>Source: </b> %s <a>%s:%d-%d</a><br>\n", - inter->sourceName, inter->sourceChrom, inter->sourceStart, inter->sourceEnd); -printf("<b>Target: </b> %s <a>%s:%d-%d</a><br>\n", - inter->targetName, inter->targetChrom, inter->targetStart, inter->targetEnd); -} - -#ifdef FOO -static void doLongTabix(struct trackDb *tdb, char *item) -/* Handle a click on a long range interaction */ -{ -char *bigDataUrl = hashFindVal(tdb->settingsHash, "bigDataUrl"); -struct bedTabixFile *btf = bedTabixFileMayOpen(bigDataUrl, NULL, 0, 0); -char *chromName = cartString(cart, "c"); -struct bed *list = bedTabixReadBeds(btf, chromName, winStart, winEnd, bedLoad5); -bedTabixFileClose(&btf); -unsigned maxWidth; -struct longRange *longRangeList = parseLongTabix(list, &maxWidth, 0); -struct longRange *longRange, *ourLongRange = NULL; -unsigned itemNum = sqlUnsigned(item); -unsigned count = slCount(longRangeList); -double *doubleArray; - -AllocArray(doubleArray, count); - -int ii = 0; -for(longRange = longRangeList; longRange; longRange = longRange->next, ii++) - { - if (longRange->id == itemNum) - { - ourLongRange = longRange; - } - doubleArray[ii] = longRange->score; - } - -if (ourLongRange == NULL) - errAbort("cannot find long range item with id %d\n", itemNum); -printf("Item you clicked on:<BR>\n"); -printf(" <B>ID:</B> %u<BR>\n", ourLongRange->id); -if (!ourLongRange->hasColor) - // if there's color, then there's no score in this format - printf("<B>Score:</B> %g<BR>\n", ourLongRange->score); - -unsigned padding = (ourLongRange->e - ourLongRange->s) / 10; -int s = ourLongRange->s - padding; -int e = ourLongRange->e + padding; -if (s < 0 ) - s = 0; -int chromSize = hChromSize(database, seqName); -if (e > chromSize) - e = chromSize; - -char sStartPosBuf[1024], sEndPosBuf[1024]; -char eStartPosBuf[1024], eEndPosBuf[1024]; -// FIXME: longRange should store region starts, not centers -sprintLongWithCommas(sStartPosBuf, ourLongRange->s - ourLongRange->sw/2 + 1); -sprintLongWithCommas(sEndPosBuf, ourLongRange->s + ourLongRange->sw/2 + 1); -sprintLongWithCommas(eStartPosBuf, ourLongRange->e - ourLongRange->ew/2 + 1); -sprintLongWithCommas(eEndPosBuf, ourLongRange->e + ourLongRange->ew/2 + 1); -char sWidthBuf[1024], eWidthBuf[1024]; -char regionWidthBuf[1024]; -sprintLongWithCommas(sWidthBuf, ourLongRange->sw); -sprintLongWithCommas(eWidthBuf, ourLongRange->ew); -sprintLongWithCommas(regionWidthBuf, ourLongRange->ew + ourLongRange->e - ourLongRange->s); - -if (differentString(ourLongRange->sChrom, ourLongRange->eChrom)) - { - printf("<B>Current region: </B>"); - printf("<A HREF=\"hgTracks?position=%s:%s-%s \" TARGET=_BLANK>%s:%s-%s (%s bp)</A><BR>\n", - ourLongRange->sChrom, sStartPosBuf, sEndPosBuf, - ourLongRange->sChrom, sStartPosBuf,sEndPosBuf, sWidthBuf); - printf("<B>Paired region: </B>"); - printf("<A HREF=\"hgTracks?position=%s:%s-%s \" TARGET=_BLANK>%s:%s-%s (%s bp)<BR></A><BR>\n", - ourLongRange->eChrom, eStartPosBuf, eEndPosBuf, - ourLongRange->eChrom, eStartPosBuf, eEndPosBuf, eWidthBuf); - } +char startBuf[1024], endBuf[1024], sizeBuf[1024]; +if (isNotEmpty(inter->name)) + printf("<b>Interaction name:</b> %s<br>\n", inter->name); +printf("<b>Interaction region:</b> "); +if (interactOtherChrom(inter)) + printf("across chromosomes<br>"); else { - printf("<B>Lower region: </B>"); - printf("<A HREF=\"hgTracks?position=%s:%s-%s \" TARGET=_BLANK>%s:%s-%s (%s bp)</A><BR>\n", - ourLongRange->sChrom, sStartPosBuf,sEndPosBuf, - ourLongRange->sChrom, sStartPosBuf,sEndPosBuf, sWidthBuf); - printf("<B>Upper region: </B>"); - printf("<A HREF=\"hgTracks?position=%s:%s-%s \" TARGET=_BLANK>%s:%s-%s (%s bp)<BR></A><BR>\n", - ourLongRange->eChrom, eStartPosBuf, eEndPosBuf, - ourLongRange->eChrom, eStartPosBuf, eEndPosBuf, eWidthBuf); - printf("<B>Interaction region: </B>"); - printf("<A HREF=\"hgTracks?position=%s:%s-%s \" TARGET=_BLANK>%s:%s-%s (%s bp)<BR></A><BR>\n", - ourLongRange->eChrom, sStartPosBuf, eEndPosBuf, - ourLongRange->eChrom, sStartPosBuf, eEndPosBuf, regionWidthBuf); + sprintLongWithCommas(startBuf, inter->chromStart+1); + sprintLongWithCommas(endBuf, inter->chromEnd); + sprintLongWithCommas(sizeBuf, inter->chromEnd - inter->chromStart); + printf("<a href='hgTracks?position=%s:%d-%d' target='_blank'>%s:%s-%s</a>", + inter->chrom, inter->chromStart, inter->chromEnd, + inter->chrom, startBuf, endBuf); + printf(" %s bp<br>\n", sizeBuf); } -if (ourLongRange->hasColor) - return; +printf("<b>Score:</b> %d<br>\n", inter->score); +printf("<b>Value:</b> %0.3f<br>\n", inter->value); +if (isNotEmpty(inter->exp)) + printf("<b>Experiment:</b> %s<br>\n", inter->exp); +puts("<p>"); -struct aveStats *as = aveStatsCalc(doubleArray, count); -printf("<BR>Statistics on the scores of all items in window (go to track controls to set minimum score to display):\n"); - -printf("<TABLE BORDER=1>\n"); -printf("<TR><TD><B>Q1</B></TD><TD>%f</TD></TR>\n", as->q1); -printf("<TR><TD><B>median</B></TD><TD>%f</TD></TR>\n", as->median); -printf("<TR><TD><B>Q3</B></TD><TD>%f</TD></TR>\n", as->q3); -printf("<TR><TD><B>average</B></TD><TD>%f</TD></TR>\n", as->average); -printf("<TR><TD><B>min</B></TD><TD>%f</TD></TR>\n", as->minVal); -printf("<TR><TD><B>max</B></TD><TD>%f</TD></TR>\n", as->maxVal); -printf("<TR><TD><B>count</B></TD><TD>%d</TD></TR>\n", as->count); -printf("<TR><TD><B>total</B></TD><TD>%f</TD></TR>\n", as->total); -printf("<TR><TD><B>standard deviation</B></TD><TD>%f</TD></TR>\n", as->stdDev); -printf("</TABLE>\n"); -} +sprintLongWithCommas(startBuf, inter->sourceStart+1); +sprintLongWithCommas(endBuf, inter->sourceEnd); +printf("<b>Source region:</b> %s " + "<a href='hgTracks?position=%s:%d-%d' target='_blank'>%s:%s-%s</a><br>\n", + inter->sourceName, inter->sourceChrom, inter->sourceStart+1, inter->sourceEnd, + inter->sourceChrom, startBuf, endBuf); +sprintLongWithCommas(startBuf, inter->targetStart+1); +sprintLongWithCommas(endBuf, inter->targetEnd); +printf("<b>Target region:</b> %s " + "<a href='hgTracks?position=%s:%d-%d' target='_blank'>%s:%s-%s</a><br>\n", + inter->targetName, inter->targetChrom, inter->targetStart+1, inter->targetEnd, + inter->targetChrom, startBuf, endBuf); +#ifdef TODO +/* TODO: get count and score stats of all interactions in window */ +double *scores; +AllocArray(scores, count); #endif +} +