61e5c823d922898c2774dd7de5231b85d61f306f
kent
  Sat Mar 19 10:24:06 2011 -0700
Adding link to antibody page for factor in TFBS details.  Adding cell letter abbreviation column.
diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c
index 3f8eaae..eb1ff69 100644
--- src/hg/hgc/peakClusters.c
+++ src/hg/hgc/peakClusters.c
@@ -48,36 +48,38 @@
 char *val = findGroupTagVal(tdb, tag);
 if (val == NULL)
     errAbort("Couldn't find %s in subGroups tag of %s", tag, tdb->track);
 return val;
 }
 
 char *findGroupLabel(struct trackDb *tdb, char *group)
 /* Given name of group, ruffle through all subGroupN tags, looking for one that
  * matches group */
 {
 char *groupId = mustFindGroupTagVal(tdb, group);
 return compositeGroupLabel(tdb, group, groupId);
 }
 
 static void printClusterTableHeader(struct slName *otherCols, 
-	boolean withDescription, boolean withSignal)
+	boolean withAbbreviation, boolean withDescription, boolean withSignal)
 /* Print out header fields table of tracks in cluster */
 {
 webPrintLabelCell("#");
 if (withSignal)
     webPrintLabelCell("signal");
+if (withAbbreviation)
+    webPrintLabelCell("abr");
 struct slName *col;
 for (col = otherCols; col != NULL; col = col->next)
     webPrintLabelCell(col->name);
 if (withDescription)
     webPrintLabelCell("description");
 }
 
 static void printTableInfo(struct trackDb *tdb, struct trackDb *clusterTdb,
     struct slName *displayGroupList)
 /* Print out info on table. */
 {
 struct slName *displayGroup;
 for (displayGroup = displayGroupList; displayGroup != NULL; displayGroup = displayGroup->next)
     {
     char *label = findGroupLabel(tdb, displayGroup->name);
@@ -135,102 +137,107 @@
 else
     {
     if (peakList)
 	showOnePeakOrMiss(tdb, clusterTdb, peakList, displayGroupList, pRowIx);
     }
 sqlFreeResult(&sr);
 return result;
 }
 
 static void printClusterTableHits(struct bed *cluster, struct sqlConnection *conn,
 	char *sourceTable, char *inputTrackTable, 
 	struct slName *fieldList, boolean invert, char *vocab)
 /* Put out a lines in an html table that shows assayed sources that have hits in this
  * cluster, or if invert is set, that have misses. */
 {
+char *vocabFile = NULL;
+if (vocab)
+    vocabFile = cloneFirstWord(vocab);
 /* Make the monster SQL query to get all assays*/
 struct dyString *query = dyStringNew(0);
-dyStringPrintf(query, "select %s.id", sourceTable);
+dyStringPrintf(query, "select %s.id,%s.name", sourceTable, sourceTable);
 struct slName *field;
 for (field = fieldList; field != NULL; field = field->next)
     dyStringPrintf(query, ",%s.%s", inputTrackTable, field->name);
 dyStringPrintf(query, " from %s,%s ", inputTrackTable, sourceTable);
 dyStringPrintf(query, " where %s.source = %s.description", inputTrackTable, sourceTable);
 dyStringPrintf(query, " and factor='%s' order by %s.source", cluster->name, inputTrackTable);
 
 int displayNo = 0;
 int fieldCount = slCount(fieldList);
 struct sqlResult *sr = sqlGetResult(conn, query->string);
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
     int sourceId = sqlUnsigned(row[0]);
     double signal = cluster->expScores[sourceId];
     boolean hit = (signal > 0);
     if (hit ^ invert)
         {
 	printf("</TR><TR>\n");
 	webPrintIntCell(++displayNo);
 	if (!invert)
 	    webPrintDoubleCell(signal);
+	webPrintLinkCell(row[1]);
 	int i;
 	for (i=0; i<fieldCount; ++i)
 	    {
-	    char *fieldVal = row[i+1];
+	    char *fieldVal = row[i+2];
 	    if (vocab)
 	        {
-		char *file = cloneFirstWord(vocab);
-		char *link = controlledVocabLink(file, "term", fieldVal, fieldVal, fieldVal, "");
+		char *link = controlledVocabLink(vocabFile, "term", 
+			fieldVal, fieldVal, fieldVal, "");
 		webPrintLinkCell(link);
 		}
 	    else
 		webPrintLinkCell(fieldVal);
 	    }
 	}
     }
 sqlFreeResult(&sr);
+freez(&vocabFile);
 dyStringFree(&query);
 }
 
 
 static struct slName *findMatchingSubtracks(struct trackDb *tdb)
 /* Find subtracks that match inputTracks tags. */
 {
 /* Just list look up tableName in inputTrackTable and return the list. */
 char *inputTrackTable = trackDbRequiredSetting(tdb, "inputTrackTable");
 struct sqlConnection *conn = hAllocConn(database);
 char query[256];
 safef(query, sizeof(query), "select tableName from %s order by source", inputTrackTable);
 struct slName *matchTrackList = sqlQuickList(conn, query);
 hFreeConn(&conn);
 return matchTrackList;
 }
 
 
 void doPeakClusterListItemsAssayed()
 /* Put up a page that shows all experiments associated with a cluster track. */
 {
 struct trackDb *clusterTdb = tdbForTableArg();
 struct slName *matchTrackList = findMatchingSubtracks(clusterTdb);
 struct slName *matchTrack;
 
 cartWebStart(cart, database, "List of items assayed in %s", clusterTdb->shortLabel);
 
 char *inputTracksSubgroupDisplay = trackDbRequiredSetting(clusterTdb, "inputTracksSubgroupDisplay");
 struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay);
 webPrintLinkTableStart();
-printClusterTableHeader(displayGroupList, TRUE, FALSE);
+printClusterTableHeader(displayGroupList, FALSE, TRUE, FALSE);
 int rowIx = 0;
 for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next)
     {
     struct trackDb *tdb = hashFindVal(trackHash, matchTrack->name);
     showOnePeakOrMiss(tdb, clusterTdb, NULL, displayGroupList, &rowIx);
     }
 webPrintLinkTableEnd();
 cartWebEnd();
 }
 
 void doPeakClusters(struct trackDb *tdb, char *item)
 /* Display detailed info about a cluster of peaks from other tracks. */
 {
 int start = cartInt(cart, "o");
 char *table = tdb->table;
@@ -257,31 +264,31 @@
     char *inputTracksSubgroupDisplay = trackDbRequiredSetting(tdb, "inputTracksSubgroupDisplay");
     struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay);
 
     /* Get list of tracks that match criteria. */
     struct slName *matchTrackList = findMatchingSubtracks(tdb);
     struct slName *matchTrack;
 
     /* Print out some information about the cluster overall. */
     printf("<B>Items in Cluster:</B> %s of %d<BR>\n", cluster->name, slCount(matchTrackList));
     printf("<B>Cluster Score (out of 1000):</B> %d<BR>\n", cluster->score);
     printPos(cluster->chrom, cluster->chromStart, cluster->chromEnd, NULL, TRUE, NULL);
 
     /* In a new section put up list of hits. */
     webNewSection("List of Items in Cluster");
     webPrintLinkTableStart();
-    printClusterTableHeader(displayGroupList, TRUE, TRUE);
+    printClusterTableHeader(displayGroupList, FALSE, TRUE, TRUE);
     int rowIx = 0;
     for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next)
         {
 	showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList,
 		FALSE, &rowIx);
 	}
     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);
 cartWebEnd();
@@ -343,31 +350,38 @@
         sr = hRangeQuery(conn, "wgEncodeRegTfbsClusteredMotifs", cluster->chrom, cluster->chromStart,
                          cluster->chromEnd, where, &rowOffset);
         while ((row = sqlNextRow(sr)) != NULL)
             {
             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);
         }
     
-    printf("<B>Factor:</B> %s<BR>\n", cluster->name);
+    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));
         for (hit = hits, i = 0; hit != NULL; hit = hit->next, i++)
             {
             char query[256];
             float maxScore = -1;
 
             safef(query, sizeof(query), "select max(score) from %s where name = '%s'", "wgEncodeRegTfbsClusteredMotifs", item);
             sr = sqlGetResult(conn, query);
             if ((row = sqlNextRow(sr)) != NULL)
                 {
@@ -402,67 +416,67 @@
      * cluster->expScores.  We need to figure out the sources actually assayed though
      * some other way.  We'll do this by one of two techniques.
      * If the inputTracksSubgroupDisplay is set, we'll try and figure out what was
      * assayed by looking at the subgroup stuff in trackDb, which works if everythings
      * part of a composite.  If not, we'll use the inputTrackTable. */
     /* Get list of subgroups to display */
     char *inputTracksSubgroupDisplay = trackDbSetting(tdb, "inputTracksSubgroupDisplay");
     char *inputTableFieldDisplay = trackDbSetting(tdb, "inputTableFieldDisplay");
     if (inputTracksSubgroupDisplay != NULL)
 	{
 	struct slName *displayGroupList = stringToSlNames(inputTracksSubgroupDisplay);
 
 	/* In a new section put up list of hits. */
 	webNewSection("List of %s Items in Cluster", cluster->name);
 	webPrintLinkTableStart();
-	printClusterTableHeader(displayGroupList, TRUE, TRUE);
+	printClusterTableHeader(displayGroupList, FALSE, TRUE, TRUE);
 	int rowIx = 0;
 	for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next)
 	    {
 	    showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList,
 		    FALSE, &rowIx);
 	    }
 	webPrintLinkTableEnd();
 
 
 	webNewSection("List of cells assayed with %s but without hits in cluster", cluster->name);
 	webPrintLinkTableStart();
-	printClusterTableHeader(displayGroupList, TRUE, FALSE);
+	printClusterTableHeader(displayGroupList, FALSE, TRUE, FALSE);
 	rowIx = 0;
 	for (matchTrack = matchTrackList; matchTrack != NULL; matchTrack = matchTrack->next)
 	    {
 	    showMatchingTrack(matchTrack->name, cluster, conn, tdb, displayGroupList,
 		    TRUE, &rowIx);
 	    }
 	webPrintLinkTableEnd();
 	}
     else if (inputTableFieldDisplay != NULL)
         {
 	struct slName *fieldList = stringToSlNames(inputTableFieldDisplay);
 	char *vocab = trackDbSetting(tdb, "controlledVocabulary");
 
 	/* In a new section put up list of hits. */
 	webNewSection("List of %s Items in Cluster", cluster->name);
 	webPrintLinkTableStart();
-	printClusterTableHeader(fieldList, FALSE, TRUE);
+	printClusterTableHeader(fieldList, TRUE, FALSE, TRUE);
 	printClusterTableHits(cluster, conn, sourceTable, 
 		inputTrackTable, fieldList, FALSE, vocab);
 	webPrintLinkTableEnd();
 
 	webNewSection("List of cells assayed with %s but without hits in cluster", cluster->name);
 	webPrintLinkTableStart();
-	printClusterTableHeader(fieldList, FALSE, FALSE);
+	printClusterTableHeader(fieldList, TRUE, FALSE, FALSE);
 	printClusterTableHits(cluster, conn, sourceTable, 
 		inputTrackTable, fieldList, TRUE, vocab);
 	webPrintLinkTableEnd();
 	}
     else
         {
 	errAbort("Missing required trackDb setting %s or %s for track %s",
 	    "inputTracksSubgroupDisplay", "inputTableFieldDisplay", tdb->track);
 		
 	}
 
     webNewSection("Table of abbreviations for cells");
     hPrintAbbreviationTable(conn, sourceTable, "Cell Type");
 
     webNewSection("Track Description");