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;