src/hg/hgc/encodeClick.c 1.10

1.10 2009/10/26 15:32:52 aamp
Details stuff for 5C tracks.
Index: src/hg/hgc/encodeClick.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgc/encodeClick.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -b -B -U 1000000 -r1.9 -r1.10
--- src/hg/hgc/encodeClick.c	4 Mar 2009 19:22:35 -0000	1.9
+++ src/hg/hgc/encodeClick.c	26 Oct 2009 15:32:52 -0000	1.10
@@ -1,87 +1,150 @@
 /* Handle details page for ENCODE tracks. */
 
 #include "common.h"
 #include "cart.h"
 #include "hgc.h"
 #include "hCommon.h"
 #include "hgColors.h"
 #include "customTrack.h"
 #include "web.h"
 #include "encode/encodePeak.h"
 
 void doEncodePeak(struct trackDb *tdb, struct customTrack *ct)
 /*  details for encodePeak type tracks. */
 {
 struct sqlConnection *conn;
 struct sqlResult *sr;
 enum encodePeakType peakType;
 char **row;
 char *db;
 char *table = tdb->tableName;
 char *chrom = cgiString("c");
 int start = cgiInt("o");
 int end = cgiInt("t");
 int rowOffset;
 /* connect to DB */
 if (ct)
     {
     db = CUSTOM_TRASH;
     table = ct->dbTableName;
     }
 else 
     db = database;
 conn = hAllocConn(db);
 peakType = encodePeakInferTypeFromTable(db, table, tdb->type);
 if (peakType == 0)
     errAbort("unrecognized peak type from table %s", tdb->tableName);
 genericHeader(tdb, NULL);
 sr = hOrderedRangeQuery(conn, table, chrom, start, end,
 			NULL, &rowOffset);
 row = sqlNextRow(sr);
 if (row != NULL)
     {
     char **rowPastOffset = row + rowOffset;
     float signal = -1;
     float pValue = -1;
     float qValue = -1;
     /* Name */
     if (rowPastOffset[3][0] != '.')
 	printf("<B>Name:</B> %s<BR>\n", rowPastOffset[3]);
     /* Position */
     printf("<B>Position:</B> "
        "<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">%s:%d-%d</a><BR>\n",
        hgTracksPathAndSettings(), database, chrom, start+1, end, chrom, start+1, end);
     /* Print peak base */
     if ((peakType == narrowPeak) || (peakType == encodePeak))
 	{
 	int peak = sqlSigned(rowPastOffset[9]);
 	if (peak > -1)
 	    printf("<B>Peak base on chrom:</B> %d<BR>\n", start + peak);
 	}
     /* Strand, score */
     if (rowPastOffset[5][0] != '.')
 	    printf("<B>Strand:</B> %c<BR>\n", rowPastOffset[5][0]);
     printf("<B>Score:</B> %d<BR>\n", sqlUnsigned(rowPastOffset[4]));       
     /* signalVal, pVal */
     if (peakType != gappedPeak)
 	{
 	signal = sqlFloat(rowPastOffset[6]);
 	pValue = sqlFloat(rowPastOffset[7]);
 	qValue = sqlFloat(rowPastOffset[8]);
 	}
     else
 	{
 	signal = sqlFloat(rowPastOffset[12]);
 	pValue = sqlFloat(rowPastOffset[13]);
 	qValue = sqlFloat(rowPastOffset[14]);
 	}
     if (signal >= 0)
 	printf("<B>Signal value:</B> %.3f<BR>\n", signal);
     if (pValue >= 0)
 	printf("<B>P-value (-log10):</B> %.3f<BR>\n", pValue);
     if (qValue >= 0)
 	printf("<B>Q-value (FDR): </B> %.3f<BR>\n", qValue);	
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
+
+int encodeFiveCInterCmp(const void *va, const void *vb)
+/* reverse sort on bed nine's reserved field which in this */
+/* case is the where the strength of the interaction is stored */ 
+{
+const struct bed *a = *((struct bed **)va);
+const struct bed *b = *((struct bed **)vb);
+return b->itemRgb - a->itemRgb;
+}
+
+void doEncodeFiveC(struct sqlConnection *conn, struct trackDb *tdb)
+/* Print details for 5C track */
+{
+char *interTable = trackDbRequiredSetting(tdb, "interTable");
+char *interTableKind = trackDbRequiredSetting(tdb, "interTableKind");
+char **row;
+char *chrom = cgiString("c");
+int start = cgiInt("o");
+int end = cgiInt("t");
+int rowOffset;
+int outCount = 0;
+struct sqlResult *sr;
+struct bed *interList = NULL, *inter;
+genericHeader(tdb, NULL);
+sr = hOrderedRangeQuery(conn, interTable, chrom, start, end, NULL, &rowOffset);
+printf("<B>Position:</B> "
+       "<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">%s:%d-%d</a><BR>\n",
+       hgTracksPathAndSettings(), database, chrom, start+1, end, chrom, start+1, end);
+while ((row = sqlNextRow(sr)) != NULL)
+    {
+    inter = bedLoadN(row + rowOffset, 9);
+    slAddHead(&interList, inter);
+    }
+slSort(&interList, encodeFiveCInterCmp);
+webNewSection("Top %s interations", interTableKind);
+webPrintLinkTableStart();
+webPrintLabelCell("Position");
+webPrintLabelCell("5C signal");
+webPrintLabelCell("Distance");
+webPrintLinkTableNewRow();
+for (inter = interList; inter != NULL; inter = inter->next)
+    {
+    char s[1024];
+    int distance = 0;
+    safef(s, sizeof(s), "<A HREF=\"%s&db=%s&position=%s%%3A%d-%d\">%s:%d-%d</A>",
+       hgTracksPathAndSettings(), database, chrom, inter->thickStart+1, inter->thickEnd, chrom, inter->thickStart+1, inter->thickEnd);
+    webPrintLinkCell(s);
+    safef(s, sizeof(s), "%d", inter->itemRgb);
+    webPrintLinkCell(s);
+    if (start > inter->thickStart)
+	distance = inter->thickEnd - start;
+    else 
+	distance = inter->thickStart - end;
+    safef(s, sizeof(s), "%d", distance);
+    webPrintLinkCell(s);
+    if (++outCount == 50)
+	break;
+    if (inter->next != NULL)
+	webPrintLinkTableNewRow();
+    }
+webPrintLinkTableEnd();
+sqlFreeResult(&sr);
+}