73b74e92fd0ccbea53939947f6b7d593bc663375
galt
Wed Aug 15 14:23:42 2012 -0700
fix hgc/encodeClick doEncodePeak to support items and use them to match unique display - even though multiples are now incredibly rare with new item=name matching, the code improves the display of the multiples by separating them with a vertical space
diff --git src/hg/hgc/encodeClick.c src/hg/hgc/encodeClick.c
index 22e7c9f..679f983 100644
--- src/hg/hgc/encodeClick.c
+++ src/hg/hgc/encodeClick.c
@@ -1,281 +1,290 @@
/* 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"
#include "peptideMapping.h"
#ifdef UNUSED
static boolean pairInList(struct slPair *pair, struct slPair *list)
/* Return TRUE if pair is in list. */
{
struct slPair *el;
for (el = list; el != NULL; el = el->next)
if (sameString(pair->name, el->name) && sameString(pair->val, el->val))
return TRUE;
return FALSE;
}
static boolean selGroupListMatch(struct trackDb *tdb, struct slPair *selGroupList)
/* Return TRUE if tdb has match to every item in selGroupList */
{
char *subGroups = trackDbSetting(tdb, "subGroups");
if (subGroups == NULL)
return FALSE;
struct slPair *groupList = slPairFromString(subGroups);
struct slPair *selGroup;
for (selGroup = selGroupList; selGroup != NULL; selGroup = selGroup->next)
{
if (!pairInList(selGroup, groupList))
return FALSE;
}
return TRUE;
}
static void rAddMatching(struct trackDb *tdb, struct slPair *selGroupList, struct slName **pList)
/* Add track and any descendents that match selGroupList to pList */
{
if (selGroupListMatch(tdb, selGroupList))
slNameAddHead(pList, tdb->track);
struct trackDb *sub;
for (sub = tdb->subtracks; sub != NULL; sub = sub->next)
rAddMatching(sub, selGroupList, pList);
}
#endif//def UNUSED
-void doEncodePeak(struct trackDb *tdb, struct customTrack *ct)
+void doEncodePeak(struct trackDb *tdb, struct customTrack *ct, char *item)
/* details for encodePeak type tracks. */
{
struct sqlConnection *conn;
struct sqlResult *sr;
enum encodePeakType peakType;
char **row;
char *db;
char *table = tdb->table;
char *chrom = cartString(cart,"c");
int start = cgiInt("o");
int end = cgiInt("t");
int rowOffset;
+boolean firstTime = TRUE;
/* 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->table);
-genericHeader(tdb, NULL);
+genericHeader(tdb, NULL); // genericClickHandlerPlus gets there first anyway and overrides this which is now moot.
sr = hOrderedRangeQuery(conn, table, chrom, start, end,
NULL, &rowOffset);
while((row = sqlNextRow(sr)) != NULL)
{
char **rowPastOffset = row + rowOffset;
if ((sqlUnsigned(rowPastOffset[1]) != start) || (sqlUnsigned(rowPastOffset[2]) != end))
continue;
+ if (!sameString(rowPastOffset[3], item))
+ continue;
float signal = -1;
float pValue = -1;
float qValue = -1;
+
+ if (firstTime)
+ firstTime = FALSE;
+ else // print separator
+ printf("
\n");
+
/* Name */
if (rowPastOffset[3][0] != '.')
printf("Name: %s
\n", rowPastOffset[3]);
/* Position */
printf("Position: "
"%s:%d-%d
\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("Peak point: %d
\n", start + peak + 1); // one based
}
/* Strand, score */
if (rowPastOffset[5][0] != '.')
printf("Strand: %c
\n", rowPastOffset[5][0]);
printf("Score: %d
\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("Signal value: %.3f
\n", signal);
if (pValue >= 0)
printf("P-value (-log10): %.3f
\n", pValue);
if (qValue >= 0)
printf("Q-value (FDR): %.3f
\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 = cartString(cart,"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("Position: "
"%s:%d-%d
\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), "%s:%d-%d",
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);
}
void doPeptideMapping(struct sqlConnection *conn, struct trackDb *tdb, char *item)
/* Print details for a peptideMapping track. */
{
char *chrom = cartString(cart,"c");
int start = cgiInt("o");
int end = cgiInt("t");
char query[256];
char **row;
struct sqlResult *sr;
struct peptideMapping pos;
int rowOffset = 0; // skip bin field
int found = 0;
genericHeader(tdb, NULL);
/* Just get the current item. */
safef(query, sizeof(query),
"select * from %s where name='%s' and chrom='%s' and chromStart=%d and chromEnd=%d",
tdb->track, item, chrom, start, end);
sr = sqlGetResult(conn, query);
if (sqlFieldColumn(sr, "bin") == 0)
rowOffset = 1;
while ((row = sqlNextRow(sr)) != NULL)
{
++found;
peptideMappingStaticLoad(row + rowOffset, &pos);
if (found == 1)
{
printf("Item: %s
\n", pos.name);
printPos(pos.chrom, pos.chromStart, pos.chromEnd, pos.strand, TRUE, item);
printf("
\n");
printf("Additional details for all peptide mappings of %s:
\n", item);
webPrintLinkTableStart();
webPrintLabelCell("Score");
webPrintLabelCell("Raw Score");
webPrintLabelCell("Spectrum ID");
webPrintLabelCell("Peptide Rank");
}
webPrintLinkTableNewRow();
webPrintIntCell(pos.score);
webPrintDoubleCell(pos.rawScore);
webPrintLinkCell(pos.spectrumId);
webPrintIntCell(pos.peptideRank);
}
if (found == 0)
errAbort("No items in range");
webPrintLinkTableEnd();
sqlFreeResult(&sr);
/* Draw table of other locations */
printf("
\n");
printf("Peptide Repeat Count: %d
\n", pos.peptideRepeatCount);
if (pos.peptideRepeatCount > 1)
{
struct hash *hash = hashNew(8);
struct peptideMapping anotherPos;
safef(query, sizeof(query),
"select * from %s where name='%s' and not (chrom='%s' and chromStart=%d and chromEnd=%d)",
tdb->track, item, chrom, start, end);
printf("
\n");
webPrintLinkTableStart();
webPrintLabelCell("Other genomic loci");
sr = sqlGetResult(conn, query);
while ((row = sqlNextRow(sr)) != NULL)
{
char s[1024];
peptideMappingStaticLoad(row + rowOffset, &anotherPos);
char k[1024];
safef(k, sizeof k, "%s.%d.%d", anotherPos.chrom, anotherPos.chromStart, anotherPos.chromEnd);
if (!hashLookup(hash, k))
{
hashAdd(hash, k, NULL);
safef(s, sizeof(s), "%s:%d-%d",
hgTracksPathAndSettings(), database, anotherPos.chrom, anotherPos.chromStart+1,
anotherPos.chromEnd, anotherPos.chrom, anotherPos.chromStart+1, anotherPos.chromEnd);
webPrintLinkTableNewRow();
webPrintLinkCell(s);
}
}
webPrintLinkTableEnd();
sqlFreeResult(&sr);
freeHash(&hash);
}
}