dee575dd40edfb8115a977926ad5d5ccc591c114 kate Tue Jan 28 12:14:26 2014 -0800 Add some flexibility to Motif section display. refs #9092 diff --git src/hg/hgc/regMotif.c src/hg/hgc/regMotif.c index 3b43161..dc5cc9c 100644 --- src/hg/hgc/regMotif.c +++ src/hg/hgc/regMotif.c @@ -89,46 +89,43 @@ printProbRow(f, "T", motif->tProb, motif->columnCount); } struct dnaMotif *loadDnaMotif(char *motifName, char *motifTable) /* Load dnaMotif from table. */ { struct sqlConnection *conn = hAllocConn(database); char query[256]; struct dnaMotif *motif; sqlSafefFrag(query, sizeof query, "name = '%s'", motifName); motif = dnaMotifLoadWhere(conn, motifTable, query); hFreeConn(&conn); return motif; } - -void motifMultipleHitsSection(struct dnaSeq **seqs, int count, struct dnaMotif *motif) -/* Print out section about motif, possibly with mutliple occurrences. */ +void motifLogoAndMatrix(struct dnaSeq **seqs, int count, struct dnaMotif *motif) +/* Print out motif sequence logo and text (possibly with multiple occurences) */ { // Detect inconsistent motif/pwm tables and suppress confusing display if (motif != NULL) { if (seqs != NULL && motif->columnCount != seqs[0]->size) { warn("Motif seq length doesn't match PWM\n"); return; } } - #define MOTIF_HELP_PAGE "../goldenPath/help/hgRegMotifHelp.html" -webNewSection("Motif Sequence from Matching Strand"); printf("<PRE>\n"); printf("<table>\n"); if (motif != NULL) { struct tempName pngTn; dnaMotifMakeProbabalistic(motif); makeTempName(&pngTn, "logo", ".png"); dnaMotifToLogoPng(motif, 47, 140, NULL, "../trash", pngTn.forCgi); printf("<tr><td></td><td colspan='%d'align=right><a href=\"%s\" target=_blank>Motif display help</a></td></tr>", motif->columnCount, MOTIF_HELP_PAGE); printf("<tr><td></td><td colspan='%d'>", motif->columnCount); printf("<IMG SRC=\"%s\" BORDER=1>", pngTn.forHtml); printf("</td><td></td></tr>\n"); } if (count > 0) @@ -146,37 +143,54 @@ // is there a library routine to get 1st, 2nd ...? printf("<td>occurrence #%d</td></tr>\n", i + 1); } } if (motif != NULL) { printf("<tr><td></td>"); printConsensus(motif); printf("<td>motif consensus</td></tr>\n"); dnaMotifPrintProbTable(motif, stdout); } printf("</table>\n"); printf("</PRE>"); } +void motifMultipleHitsSection(struct dnaSeq **seqs, int count, struct dnaMotif *motif, char *title) +/* Print out section about motif, possibly with mutliple occurrences. */ +{ +// Detect inconsistent motif/pwm tables and suppress confusing display +if (motif != NULL) + { + if (seqs != NULL && motif->columnCount != seqs[0]->size) + { + warn("Motif seq length doesn't match PWM\n"); + return; + } + } +webNewSection(title); +motifLogoAndMatrix(seqs, count, motif); +} + void motifHitSection(struct dnaSeq *seq, struct dnaMotif *motif) /* Print out section about motif. */ { +static char *title = "Motif Sequence"; if(seq == NULL) - motifMultipleHitsSection(NULL, 0, motif); + motifMultipleHitsSection(NULL, 0, motif, title); else - motifMultipleHitsSection(&seq, 1, motif); + motifMultipleHitsSection(&seq, 1, motif, title); } void doTriangle(struct trackDb *tdb, char *item, char *motifTable) /* Display detailed info on a regulatory triangle item. */ { int start = cartInt(cart, "o"); struct dnaSeq *seq = NULL; struct dnaMotif *motif = loadDnaMotif(item, motifTable); char *table = tdb->table; int rowOffset = hOffsetPastBin(database, seqName, table); char query[256]; struct sqlResult *sr; char **row; struct bed *hit = NULL; struct sqlConnection *conn = hAllocConn(database);