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 */
{