src/hg/lib/wigDataStream.c 1.85

1.85 2009/03/12 20:56:40 kent
Adding wigCompareFromString and wigCompareValFilter.
Index: src/hg/lib/wigDataStream.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/wigDataStream.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -b -B -U 4 -r1.84 -r1.85
--- src/hg/lib/wigDataStream.c	3 Sep 2008 19:19:27 -0000	1.84
+++ src/hg/lib/wigDataStream.c	12 Mar 2009 20:56:40 -0000	1.85
@@ -722,8 +722,33 @@
     }
 wds->stats = NULL;
 }
 
+enum wigCompare wigCompareFromString(char *string)
+/* Given a string return corresponding cmp code. */
+{
+if (sameWord(string,"<"))
+    return wigLessThan_e;
+else if (sameWord(string,"<="))
+    return wigLessEqual_e;
+else if (sameWord(string,"="))
+    return wigEqual_e;
+else if (sameWord(string,"!="))
+    return wigNotEqual_e;
+else if (sameWord(string,">="))
+    return wigGreaterEqual_e;
+else if (sameWord(string,">"))
+    return wigGreaterThan_e;
+else if (sameWord(string,"in range"))
+    return wigInRange_e;
+else
+    {
+    errAbort("wigSetCompareFunctions: unknown constraint: '%s'", string);
+    return wigLessThan_e;
+    }
+}
+
+
 /*	the double comparison functions
  *	used to check the wiggle SQL rows which are a bucket of values
  *	between *lower and *upper.  Therefore, the value to be checked
  *	which is in wds->limit_0 (and wds->limit_1 in the case of
@@ -762,27 +787,9 @@
 static void wigSetCompareFunctions(struct wiggleDataStream *wds)
 {
 if (!wds->dataConstraint)
     return;
-
-if (sameWord(wds->dataConstraint,"<"))
-    wds->wigCmpSwitch = wigLessThan_e;
-else if (sameWord(wds->dataConstraint,"<="))
-    wds->wigCmpSwitch = wigLessEqual_e;
-else if (sameWord(wds->dataConstraint,"="))
-    wds->wigCmpSwitch = wigEqual_e;
-else if (sameWord(wds->dataConstraint,"!="))
-    wds->wigCmpSwitch = wigNotEqual_e;
-else if (sameWord(wds->dataConstraint,">="))
-    wds->wigCmpSwitch = wigGreaterEqual_e;
-else if (sameWord(wds->dataConstraint,">"))
-    wds->wigCmpSwitch = wigGreaterThan_e;
-else if (sameWord(wds->dataConstraint,"in range"))
-    wds->wigCmpSwitch = wigInRange_e;
-else
-    errAbort("wigSetCompareFunctions: unknown constraint: '%s'",
-	wds->dataConstraint);
-verbose(VERBOSE_CHR_LEVEL, "#\twigSetCompareFunctions: set to '%s'\n", wds->dataConstraint);
+wds->wigCmpSwitch = wigCompareFromString(wds->dataConstraint);
 }
 
 static void setDataConstraint(struct wiggleDataStream *wds,
 	char *dataConstraint, double lowerLimit, double upperLimit)
@@ -813,8 +820,46 @@
 wigSetCompareFunctions(wds);
 wds->useDataConstraint = TRUE;
 }
 
+boolean wigCompareValFilter(double val, enum wigCompare cmp, double ll, double ul)
+/* Return TRUE if val passes comparison filter. */
+{
+boolean takeIt = FALSE;
+switch (cmp)
+    {
+    case wigNoOp_e:
+	takeIt = TRUE;
+	break;
+    case wigInRange_e:
+	takeIt = (val < ul) &&
+	    (val >= ll);
+	break;
+    case wigLessThan_e:
+	takeIt = val < ll;
+	break;
+    case wigLessEqual_e:
+	takeIt = val <= ll;
+	break;
+    case wigEqual_e:
+	takeIt = val == ll;
+	break;
+    case wigNotEqual_e:
+	takeIt = val != ll;
+	break;
+    case wigGreaterEqual_e:
+	takeIt = val >= ll;
+	break;
+    case wigGreaterThan_e:
+	takeIt = val > ll;
+	break;
+    default:
+	errAbort("wigCmpValFilter: illegal wigCmpSwitch ? %#x", cmp);
+	break;
+    }
+return takeIt;
+}
+
 static unsigned long long getData(struct wiggleDataStream *wds, char *db,
 	char *table, int operations)
 /* getData - read and return wiggle data	*/
 {