d6ca123aefad1ef858ed599214d6fc32496cc348
kate
  Wed Aug 21 09:33:04 2013 -0700
Special handling of antibody target ('factor') CV links.  As a single factor may have multiple antibodies, show all for the factor.  Response to QA question 6, note 52.  refs #100097
diff --git src/hg/hgc/peakClusters.c src/hg/hgc/peakClusters.c
index b2aa75f..9eb22e5 100644
--- src/hg/hgc/peakClusters.c
+++ src/hg/hgc/peakClusters.c
@@ -194,30 +194,39 @@
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
     printf("</TR><TR>\n");
     webPrintIntCell(++displayNo);
     printControlledVocabFields(row+1, fieldCount, fieldList, vocabFile, vocabHash);
     printMetadataForTable(row[0]);
     }
 
 
 sqlFreeResult(&sr);
 freez(&vocabFile);
 dyStringFree(&query);
 }
 
+static char *factorSourceVocabLink(char *vocabFile, char *fieldName, char *fieldVal)
+/* Add link to show controlled vocabulary entry for term.
+ * Handles 'target' (factor) which is a special case, derived from Antibody entries */
+{
+char *vocabType = (sameString(fieldName, "target") || sameString(fieldName, "factor")) ?
+                    "target" : "term";
+return controlledVocabLink(vocabFile, vocabType, fieldVal, fieldVal, fieldVal, "");
+}
+
 static void printFactorSourceTableHits(struct factorSource *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);
 sqlDyStringPrintf(query, "select %s.id,%s.name,%s.tableName", sourceTable, sourceTable, 
@@ -243,38 +252,40 @@
         {
         if (cluster->expNums[i] == sourceId)
             {
             hit = TRUE;
             signal = cluster->expScores[i];
             break;
             }
         }
     if (hit ^ invert)
         {
 	printf("</TR><TR>\n");
 	webPrintIntCell(++displayNo);
 	if (!invert)
 	    webPrintDoubleCell(signal);
 	webPrintLinkCell(row[1]);
-	int i;
-	for (i=0; i<fieldCount; ++i)
+	int i = 0;
+        // find position of CV metadata in field list
+        int offset = 3;
+        struct slName *field = fieldList;
+	for (i=0; i<fieldCount && field != NULL; ++i, field = field->next)
 	    {
-	    char *fieldVal = row[i+3];
+	    char *fieldVal = row[i+offset];
 	    if (vocab)
 	        {
-		char *link = controlledVocabLink(vocabFile, "term", 
-			fieldVal, fieldVal, fieldVal, "");
+                char *link = cloneString(factorSourceVocabLink(vocabFile, field->name, fieldVal));
 		webPrintLinkCell(link);
 		}
 	    else
 		webPrintLinkCell(fieldVal);
 	    }
 	printMetadataForTable(row[2]);
 	}
     }
 sqlFreeResult(&sr);
 freez(&vocabFile);
 dyStringFree(&query);
 }
 
 void doPeakClusterListItemsAssayed()
 /* Put up a page that shows all experiments associated with a cluster track. */