768bdbd3b55a16d81a6dade060ecd0419c7be14f
kate
  Thu Jun 13 13:30:23 2013 -0700
Ad position links for motifs within cluster. refs #9092
diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c
index 06acf50..3e4de89 100644
--- src/hg/hgc/peakClusters.c
+++ src/hg/hgc/peakClusters.c
@@ -403,54 +403,62 @@
     
     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);
     if (motif != NULL && hits != NULL)
         {
         struct bed6FloatScore *hit = NULL;
         int i;
         seqs = needMem(sizeof(struct dnaSeq *) * slCount(hits));
+        char posLink[1024];
         for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++)
             {
             char query[256];
             float maxScore = -1;
 
             sqlSafef(query, sizeof(query), 
 	    	"select max(score) from %s where name = '%s'", 
 		"wgEncodeRegTfbsClusteredMotifs", item);
             sr = sqlGetResult(conn, query);
             if ((row = sqlNextRow(sr)) != NULL)
                 {
                 if(!isEmpty(row[0]))
                     {
                     maxScore = sqlFloat(row[0]);
                     }
                 }
             sqlFreeResult(&sr);
 
             struct dnaSeq *seq = hDnaFromSeq(database, 
 	    	seqName, hit->chromStart, hit->chromEnd, dnaLower);
             if(hit->strand[0] == '-')
                 reverseComplement(seq->dna, seq->size);
             seqs[i] = seq;
-            printf("<B>Motif Score #%d:</B>  %.2f (max: %.2f)<BR>\n", i + 1, hit->score, maxScore);
+
+            // 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 Score #%d:</b>  %.2f (max: %.2f) at %s<br>", i + 1, 
+                        hit->score, maxScore, posLink);
             }
         }
     printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL);
 
     if(seqs != NULL)
         {
         motifMultipleHitsSection(seqs, slCount(hits), motif);
         }
 
     /* 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);