src/hg/hgTracks/searchTracks.c 1.3

1.3 2010/05/26 20:36:39 larrym
get cell types/antibodies from cv.ra; this is temporary code (will convert to using metaDb in the near future)
Index: src/hg/hgTracks/searchTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/searchTracks.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -B -U 4 -r1.2 -r1.3
--- src/hg/hgTracks/searchTracks.c	11 May 2010 01:43:28 -0000	1.2
+++ src/hg/hgTracks/searchTracks.c	26 May 2010 20:36:39 -0000	1.3
@@ -13,8 +13,9 @@
 #include "hgTracks.h"
 #include "versionInfo.h"
 #include "web.h"
 #include "cds.h"
+#include "ra.h"
 
 static int gCmpGroup(const void *va, const void *vb)
 /* Compare groups based on label. */
 {
@@ -86,8 +87,63 @@
      (sameString(op, "contains") && containsStringNoCase(setting, val) != NULL));
 return retVal;
 }
 
+// XXXX got this code from hgEncodeVocab.c; it should be moved into a library (kent/src/hg/lib/encode.c?)
+
+static char *cv_file()
+{
+static char filePath[PATH_LEN];
+safef(filePath, sizeof(filePath), "%s/encode/cv.ra", hCgiRoot());
+if(!fileExists(filePath))
+    errAbort("Error: can't locate cv.ra; %s doesn't exist\n", filePath);
+return filePath;
+}
+
+static int termCmp(const void *va, const void *vb)
+/* Compare controlled vocab based on term value */
+{
+const struct hash *a = *((struct hash **)va);
+const struct hash *b = *((struct hash **)vb);
+char *termA = hashMustFindVal((struct hash *)a, "term");
+char *termB = hashMustFindVal((struct hash *)b, "term");
+return (strcasecmp(termA, termB));
+}
+
+static int getTermList(struct hash *cvHash, char ***terms, char *type)
+{
+// Pull out all term fields from ra entries with given type
+// Returns count of items found and items via the terms argument.
+
+struct hashCookie hc;
+struct hashEl *hEl;
+struct slList *termList = NULL;
+struct hash *ra;
+int i, count = 0;
+char **retval;
+
+hc = hashFirst(cvHash);
+while ((hEl = hashNext(&hc)) != NULL)
+    {
+    ra = (struct hash *) hEl->val;
+    if(sameString(hashMustFindVal(ra, "type"), type))
+        {
+        slAddTail(&termList, ra);
+        count++;
+        }
+    }
+slSort(&termList, termCmp);
+retval = needMem(sizeof(char *) * (count + 1));
+retval[0] = cloneString("Any");
+for(i=0; termList != NULL;termList = termList->next, i++)
+    {
+    ra = (struct hash *) termList;
+    retval[i+1] = cloneString(hashMustFindVal(ra, "term"));
+    }
+*terms = retval;
+return count + 1;
+}
+
 void doSearchTracks(struct group *groupList)
 {
 struct group *group;
 char *ops[] = {"is", "contains"};
@@ -106,8 +162,13 @@
 char *groupSearch = cartOptionalString(cart, "hgt.groupSearch");
 char *metaName = cartOptionalString(cart, "hgt.metaName");
 char *metaOp = cartOptionalString(cart, "hgt.metaOp");
 char *metaSearch = cartOptionalString(cart, "hgt.metaSearch");
+char *antibodySearch = cartOptionalString(cart, "hgt.antibodySearch");
+char *cellSearch = cartOptionalString(cart, "hgt.cellSearch");
+char **terms;
+int len;
+struct hash *cvHash = raReadAll(cv_file(), "term");
 
 // struct track *trackList = 
 getTrackList(&groupList, -2);
 slSort(&groupList, gCmpGroup);
@@ -137,11 +198,22 @@
 hPrintf("</td>\n<td><input type='text' name='hgt.descSearch' value='%s'></td></tr>\n", descSearch == NULL ? "" : descSearch);
 
 hPrintf("<tr><td>and</td>\n");
 hPrintf("<td><b>Group</b></td><td>is</td>\n<td>\n");
-
 cgiMakeDropListFull("hgt.groupSearch", labels, groups, numGroups, groupSearch, NULL);
+hPrintf("</td></tr>\n");
+
+
+hPrintf("<tr><td>and</td>\n");
+hPrintf("<td><b>Antibody</b></td><td>is</td>\n<td>\n");
+len = getTermList(cvHash, &terms, "Antibody");
+cgiMakeDropListFull("hgt.antibodySearch", terms, terms, len, antibodySearch, NULL);
+hPrintf("</td></tr>\n");
 
+hPrintf("<tr><td>and</td>\n");
+hPrintf("<td><b>Cell Line</b></td><td>is</td>\n<td>\n");
+len = getTermList(cvHash, &terms, "Cell Line");
+cgiMakeDropListFull("hgt.cellSearch", terms, terms, len, cellSearch, NULL);
 hPrintf("</td></tr>\n");
 
 hPrintf("<tr><td>and</td><td>\n");
 cgiMakeDropListFull("hgt.metaName", metaNames, metaValues, ArraySize(metaNames), metaName, NULL);
@@ -167,9 +239,17 @@
 if(metaSearch != NULL && !strlen(metaSearch))
     {
     metaSearch = NULL;
     }
-if((nameSearch != NULL && strlen(nameSearch)) || descSearch != NULL || groupSearch != NULL || metaSearch != NULL)
+if(antibodySearch != NULL && sameString(antibodySearch, "Any"))
+    {
+    antibodySearch = NULL;
+    }
+if(cellSearch != NULL && sameString(cellSearch, "Any"))
+    {
+    cellSearch = NULL;
+    }
+if((nameSearch != NULL && strlen(nameSearch)) || descSearch != NULL || groupSearch != NULL || metaSearch != NULL || antibodySearch != NULL || cellSearch != NULL)
     {
     for (group = groupList; group != NULL; group = group->next)
         {
         if(groupSearch == NULL || !strcmp(group->name, groupSearch))
@@ -181,8 +261,10 @@
                     {
                     struct track *track = tr->track;
                     if((isEmpty(nameSearch) || isNameMatch(track, nameSearch, nameOp)) && 
                        (isEmpty(descSearch) || isDescriptionMatch(track, descSearch, descOp)) &&
+                       (isEmpty(antibodySearch) || isMetaMatch(track, "antibody", "is", antibodySearch)) &&
+                       (isEmpty(cellSearch) || isMetaMatch(track, "cell", "is", cellSearch)) &&
                        (isEmpty(metaName) || isEmpty(metaSearch) || isMetaMatch(track, metaName, metaOp, metaSearch)))
                         {
                         tracksFound++;
                         if(tracks == NULL)
@@ -197,8 +279,10 @@
                             {
 //                            fprintf(stderr, "search track: %s\n", subTrack->shortLabel);
                             if((isEmpty(nameSearch) || isNameMatch(subTrack, nameSearch, nameOp)) &&
                                (isEmpty(descSearch) || isDescriptionMatch(subTrack, descSearch, descOp)) &&
+                               (isEmpty(antibodySearch) || isMetaMatch(subTrack, "antibody", "is", antibodySearch)) &&
+                               (isEmpty(cellSearch) || isMetaMatch(subTrack, "cell", "is", cellSearch)) &&
                                (isEmpty(metaName) || isEmpty(metaSearch) || isMetaMatch(subTrack, metaName, metaOp, metaSearch)))
                                 {
                                 // XXXX to parent hash. - use tdb->parent instead.
                                 hashAdd(parents, subTrack->track, track);
@@ -220,8 +304,9 @@
         {
         hPrintf("<p>%d tracks found:</p>\n", tracksFound);
         hPrintf("<form action='%s' name='SearchTracks' method='post'>\n\n", hgTracksName());
         hButton("submit", "save");
+        hButtonWithOnClick("hgt.ignoreme", "show all", "show all found tracks", "alert('show all not yet implemented'); return false;");
         hPrintf("<table>\n");
         hPrintf("<tr bgcolor='#666666'><td><b>Name</b></td><td><b>Description</b></td><td><b>Group</b></td><td><br /></td></tr>\n");
         struct slRef *ptr;
         while((ptr = slPopHead(&tracks)))
@@ -229,9 +314,9 @@
             struct track *track = (struct track *) ptr->val;
             // trackDbOutput(track->tdb, stderr, ',', '\n');
             hPrintf("<tr bgcolor='#EEEEEE'>\n");
             hPrintf("<td>%s</td>\n", track->shortLabel);
-            hPrintf("<td>%s</td>\n", track->longLabel);
+            hPrintf("<td><a target='_top' href='%s'>%s</a></td>\n", trackUrl(track->mapName, NULL), track->longLabel);
             // How do we get subtrack's parent?
             struct track *parent = NULL;
             if(hashLookup(parents, track->track) != NULL)
                 parent = (struct track *) hashLookup(parents, track->track)->val;