src/hg/hgc/encodeClick.c 1.16

1.16 2010/05/17 02:30:20 kent
Working on details pages for DNase Clusters and Txn Factor ChIP tracks.
Index: src/hg/hgc/encodeClick.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgc/encodeClick.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -b -B -U 4 -r1.15 -r1.16
--- src/hg/hgc/encodeClick.c	11 May 2010 01:43:28 -0000	1.15
+++ src/hg/hgc/encodeClick.c	17 May 2010 02:30:20 -0000	1.16
@@ -8,8 +8,60 @@
 #include "customTrack.h"
 #include "web.h"
 #include "encode/encodePeak.h"
 
+static boolean pairInList(struct slPair *pair, struct slPair *list)
+/* Return TRUE if pair is in list. */
+{
+struct slPair *el;
+for (el = list; el != NULL; el = el->next)
+    if (sameString(pair->name, el->name) && sameString(pair->val, el->val))
+        return TRUE;
+return FALSE;
+}
+
+static boolean selGroupListMatch(struct trackDb *tdb, struct slPair *selGroupList)
+/* Return TRUE if tdb has match to every item in selGroupList */
+{
+char *subGroups = trackDbSetting(tdb, "subGroups");
+if (subGroups == NULL)
+    return FALSE;
+struct slPair *groupList = slPairFromString(subGroups);
+struct slPair *selGroup;
+for (selGroup = selGroupList; selGroup != NULL; selGroup = selGroup->next)
+    {
+    if (!pairInList(selGroup, groupList))
+        return FALSE;
+    }
+return TRUE;
+}
+
+static void rAddMatching(struct trackDb *tdb, struct slPair *selGroupList, struct slName **pList)
+/* Add track and any descendents that match selGroupList to pList */
+{
+if (selGroupListMatch(tdb, selGroupList))
+    slNameAddHead(pList, tdb->track);
+struct trackDb *sub;
+for (sub = tdb->subtracks; sub != NULL; sub = sub->next)
+    rAddMatching(sub, selGroupList, pList);
+}
+
+struct slName *encodeFindMatchingSubtracks(struct slName *inTrackList, struct slPair *selGroupList)
+/* Look at a list of tracks, and their descendents for tracks with groups that match all 
+ * name/value pairs in selGroupList */
+{
+struct slName *matchList = NULL;
+struct slName *inTrack;
+for (inTrack = inTrackList; inTrack != NULL; inTrack = inTrack->next)
+    {
+    struct trackDb *tdb = hashFindVal(trackHash, inTrack->name);
+    if (tdb == NULL)
+        errAbort("Can't find track %s which is in inputTracks", inTrack->name);
+    rAddMatching(tdb,  selGroupList, &matchList);
+    }
+return matchList;
+}
+
 void doEncodePeak(struct trackDb *tdb, struct customTrack *ct)
 /*  details for encodePeak type tracks. */
 {
 struct sqlConnection *conn;