0d5a46d70307e7f00bc09e422f09df600043b77f kate Wed Jan 15 15:41:53 2014 -0800 1. Split out motif display code for better modularization. Clean up motif details info (add Name, remove max score for perf reasons) diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c index 01adf9f..e6b40f2 100644 --- src/hg/hgc/peakClusters.c +++ src/hg/hgc/peakClusters.c @@ -357,177 +357,194 @@ } else errAbort("Missing required trackDb setting %s for track %s", "inputTableFieldDisplay", tdb->track); webPrintLinkTableEnd(); } printf("<A HREF=\"%s&g=htcListItemsAssayed&table=%s\" TARGET_blank>", hgcPathAndSettings(), tdb->track); printf("List all items assayed"); printf("</A><BR>\n"); webNewSection("Track Description"); printTrackHtml(tdb); hFreeConn(&conn); } -void doFactorSource(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) -/* Display detailed info about a cluster of TFBS peaks from other tracks. */ +void doClusterMotifDetails(struct sqlConnection *conn, struct trackDb *tdb, + struct factorSource *cluster) +/* Display details about TF binding motif(s) in cluster */ { -int rowOffset = hOffsetPastBin(database, seqName, tdb->table); -char **row; -struct sqlResult *sr; -char query[256], buf[256]; char *motifTable = trackDbSetting(tdb, "motifTable"); // localizations char *motifPwmTable = trackDbSetting(tdb, "motifPwmTable"); // PWM used to draw sequence logo char *motifMapTable = trackDbSetting(tdb, "motifMapTable"); // map target to motif - -sqlSafef(query, sizeof(query), - "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", - tdb->table, item, seqName, start); -sr = sqlGetResult(conn, query); -row = sqlNextRow(sr); -struct factorSource *cluster = NULL; -if (row != NULL) - cluster = factorSourceLoad(row + rowOffset); -sqlFreeResult(&sr); - -if (cluster == NULL) - errAbort("Error loading cluster from track %s", tdb->track); - -char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable"); +char *motifName = cluster->name; /* default to same as target */ struct dnaMotif *motif = NULL; struct dnaSeq **seqs = NULL; struct bed6FloatScore *hits = NULL; -char *target = item; +char **row; +#ifdef SHOW_MAX_SCORE +struct sqlResult *sr; +#endif +char query[256], buf[256]; if (motifTable != NULL && sqlTableExists(conn, motifTable)) { struct sqlResult *sr; int rowOffset; char where[256]; if (motifMapTable != NULL && sqlTableExists(conn, motifMapTable)) { sqlSafef(query, sizeof(query), - "select motif from %s where target = '%s'", motifMapTable, item); + "select motif from %s where target = '%s'", motifMapTable, cluster->name); // TODO: perhaps sqlQuickString ? - target = sqlQuickQuery(conn, query, buf, sizeof(buf)); + motifName = sqlQuickQuery(conn, query, buf, sizeof(buf)); } - #define HIGHEST_SCORING #ifdef HIGHEST_SCORING - sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", target); + sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", motifName); #else - sqlSafefFrag(where, sizeof(where), "name = '%s'", item); + sqlSafefFrag(where, sizeof(where), "name = '%s'", motifName); #endif sr = hRangeQuery(conn, motifTable, cluster->chrom, cluster->chromStart, cluster->chromEnd, where, &rowOffset); #ifdef HIGHEST_SCORING if ((row = sqlNextRow(sr)) != NULL) #else while ((row = sqlNextRow(sr)) != NULL) #endif { struct bed6FloatScore *hit = NULL; AllocVar(hit); hit->chromStart = sqlUnsigned(row[rowOffset + 1]); hit->chromEnd = sqlUnsigned(row[rowOffset + 2]); hit->score = sqlFloat(row[rowOffset + 4]); hit->strand[0] = row[rowOffset + 5][0]; slAddHead(&hits, hit); } sqlFreeResult(&sr); } - -char *factorLink = cluster->name; -char *vocab = trackDbSetting(tdb, "controlledVocabulary"); -if (vocab != NULL) - { - char *file = cloneFirstWord(vocab); - factorLink = controlledVocabLink(file, "term", factorLink, factorLink, factorLink, ""); - } -printf("<B>Factor:</B> %s<BR>\n", factorLink); -printf("<B>Cluster Score (out of 1000):</B> %d<BR>\n", cluster->score); -printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL); - int hitCount = 0; if (hits != NULL) { hitCount = slCount(hits); if (motifPwmTable != NULL && sqlTableExists(conn, motifPwmTable)) { - motif = loadDnaMotif(target, motifPwmTable); + motif = loadDnaMotif(motifName, motifPwmTable); } } - if (motif != NULL && hits != NULL) { struct bed6FloatScore *hit = NULL; int i; seqs = needMem(sizeof(struct dnaSeq *) * slCount(hits)); char posLink[1024]; - char query[256]; - float maxScore = -1; - + #ifdef SHOW_MAX_SCORE + float maxScore = -1; sqlSafef(query, sizeof(query), - "select max(score) from %s where name = '%s'", motifTable, item); + "select max(score) from %s where name = '%s'", motifTable, motifName); sr = sqlGetResult(conn, query); if ((row = sqlNextRow(sr)) != NULL) { if(!isEmpty(row[0])) { maxScore = sqlFloat(row[0]); } } sqlFreeResult(&sr); + #endif puts("<p></p>"); for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++) { - struct dnaSeq *seq = hDnaFromSeq(database, seqName, hit->chromStart, hit->chromEnd, dnaLower); if(hit->strand[0] == '-') reverseComplement(seq->dna, seq->size); seqs[i] = seq; - // TODO: move to hgc.c (with other pos printers) safef(posLink, sizeof(posLink),"<a href=\"%s&db=%s&position=%s%%3A%d-%d\">%s:%d-%d</a>", hgTracksPathAndSettings(), database, cluster->chrom, hit->chromStart+1, hit->chromEnd, cluster->chrom, hit->chromStart+1, hit->chromEnd); + printf("<b>Motif Name:</b> %s<br>\n", motifName); printf("<b>Motif Score"); if (hitCount > 1) { printf("#%d", i + 1); + #ifdef SHOW_MAX_SCORE printf(":</b> %.2f (%s max: %.2f) at %s on <b>%c</font></b> strand<br>", hit->score, cluster->name, maxScore, posLink, (int)hit->strand[0]); + #else + printf(":</b> %.2f at %s on <b>%c</font></b> strand<br>", + hit->score, posLink, (int)hit->strand[0]); + #endif } else { + #ifdef SHOW_MAX_SCORE printf(":</b> %.2f (%s max: %.2f)<br>\n", hit->score, cluster->name, maxScore); + #else + printf(":</b> %.2f<br>\n", hit->score); + #endif printf("<b>Motif Position:</b> %s<br>\n", posLink); printf("<b>Motif Strand:</b> %c<br>\n", (int)hit->strand[0]); } } } - if (seqs != NULL) { motifMultipleHitsSection(seqs, hitCount, motif); } +} + +void doFactorSource(struct sqlConnection *conn, struct trackDb *tdb, char *item, int start) +/* Display detailed info about a cluster of TFBS peaks from other tracks. */ +{ +int rowOffset = hOffsetPastBin(database, seqName, tdb->table); +char **row; +struct sqlResult *sr; +char query[256]; + +sqlSafef(query, sizeof(query), + "select * from %s where name = '%s' and chrom = '%s' and chromStart = %d", + tdb->table, item, seqName, start); +sr = sqlGetResult(conn, query); +row = sqlNextRow(sr); +struct factorSource *cluster = NULL; +if (row != NULL) + cluster = factorSourceLoad(row + rowOffset); +sqlFreeResult(&sr); + +if (cluster == NULL) + errAbort("Error loading cluster from track %s", tdb->track); + +char *sourceTable = trackDbRequiredSetting(tdb, "sourceTable"); + +char *factorLink = cluster->name; +char *vocab = trackDbSetting(tdb, "controlledVocabulary"); +if (vocab != NULL) + { + char *file = cloneFirstWord(vocab); + factorLink = controlledVocabLink(file, "term", factorLink, factorLink, factorLink, ""); + } +printf("<B>Factor:</B> %s<BR>\n", factorLink); +printf("<B>Cluster Score (out of 1000):</B> %d<BR>\n", cluster->score); +printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL); + +doClusterMotifDetails(conn, tdb, cluster); /* Get list of tracks we'll look through for input. */ char *inputTrackTable = trackDbRequiredSetting(tdb, "inputTrackTable"); sqlSafef(query, sizeof(query), "select tableName from %s where factor='%s' order by source", inputTrackTable, cluster->name); /* Next do the lists of hits and misses. We have the hits from the non-zero signals in * cluster->expScores. We need to figure out the sources actually assayed though * some other way. We'll do this by one of two techniques. */ char *inputTableFieldDisplay = trackDbSetting(tdb, "inputTableFieldDisplay"); if (inputTableFieldDisplay != NULL) { struct slName *fieldList = stringToSlNames(inputTableFieldDisplay); char *vocab = trackDbSetting(tdb, "controlledVocabulary");