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");