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;