e04950cc61a7af322811ef1d50013f21867c4c0b
kate
  Fri Dec 6 16:52:45 2013 -0800
Add mapping table to factorSource track (and peakCluster track details) that links factor (HGNC gene ID) to canonical motif in motif table and PWM.  refs #9092
diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c
index 3bd307f..b039b30 100644
--- src/hg/hgc/peakClusters.c
+++ src/hg/hgc/peakClusters.c
@@ -363,64 +363,72 @@
 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. */
 {
 int rowOffset = hOffsetPastBin(database, seqName, tdb->table);
 char **row;
 struct sqlResult *sr;
-char query[256];
+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");
 struct dnaMotif *motif = NULL;
 struct dnaSeq **seqs = NULL;
 struct bed6FloatScore *hits = NULL;
+char *target = item;
 
 if (motifTable != NULL && sqlTableExists(conn, motifTable))
     {
     struct sqlResult *sr;
     int rowOffset;
     char where[256];
 
-    if (motifPwmTable != NULL && sqlTableExists(conn, motifPwmTable))
-        motif = loadDnaMotif(item, motifPwmTable);
+    if (motifMapTable != NULL && sqlTableExists(conn, motifMapTable))
+        {
+        sqlSafef(query, sizeof(query),
+                "select motif from %s where target = '%s'", motifMapTable, item);
+        // TODO: perhaps sqlQuickString ?
+        target = sqlQuickQuery(conn, query, buf, sizeof(buf));
+        }
 
     #define HIGHEST_SCORING
     #ifdef HIGHEST_SCORING
-    sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", item);
+    //sqlSafefFrag(where, sizeof(where), "name = '%s' order by score desc", item);
+    sqlSafefFrag(where, sizeof(where), "name = '%s' order by score asc", target);
     #else
     sqlSafefFrag(where, sizeof(where), "name = '%s'", item);
     #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]);
@@ -432,40 +440,48 @@
     }
 
 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);
+        }
+    }
 
 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;
+
+
     sqlSafef(query, sizeof(query), 
         "select max(score) from %s where name = '%s'", motifTable, item);
     sr = sqlGetResult(conn, query);
     if ((row = sqlNextRow(sr)) != NULL)
         {
         if(!isEmpty(row[0]))
             {
             maxScore = sqlFloat(row[0]);
             }
         }
     sqlFreeResult(&sr);
 
     puts("<p></p>");
     for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++)
         {