src/hg/lib/bed.c 1.63

1.63 2009/03/18 01:34:07 kent
Adding bedFilter family of functions.
Index: src/hg/lib/bed.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/bed.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -b -B -U 4 -r1.62 -r1.63
--- src/hg/lib/bed.c	16 Mar 2009 18:23:06 -0000	1.62
+++ src/hg/lib/bed.c	18 Mar 2009 01:34:07 -0000	1.63
@@ -945,9 +945,9 @@
 return bedListOut;
 }
 
 
-static boolean filterChar(char value, enum charFilterType cft,
+boolean bedFilterChar(char value, enum charFilterType cft,
 			  char *filterValues, boolean invert)
 /* Return TRUE if value passes the filter. */
 {
 char thisVal;
@@ -974,10 +974,9 @@
     }
 return(FALSE ^ invert);
 }
 
-static boolean filterString(char *value, enum stringFilterType sft,
-			    char **filterValues, boolean invert)
+boolean bedFilterString(char *value, enum stringFilterType sft, char **filterValues, boolean invert)
 /* Return TRUE if value passes the filter. */
 {
 char *thisVal;
 
@@ -1010,10 +1009,93 @@
     }
 return(FALSE ^ invert);
 }
 
-static boolean filterInt(int value, enum numericFilterType nft,
-			 int *filterValues)
+boolean bedFilterInt(int value, enum numericFilterType nft, int *filterValues)
+/* Return TRUE if value passes the filter. */
+/* This could probably be turned into a macro if performance is bad. */
+{
+if (filterValues == NULL)
+    return(TRUE);
+switch (nft)
+    {
+    case (nftIgnore):
+	return(TRUE);
+	break;
+    case (nftLessThan):
+	return(value < *filterValues);
+	break;
+    case (nftLTE):
+	return(value <= *filterValues);
+	break;
+    case (nftEqual):
+	return(value == *filterValues);
+	break;
+    case (nftNotEqual):
+	return(value != *filterValues);
+	break;
+    case (nftGTE):
+	return(value >= *filterValues);
+	break;
+    case (nftGreaterThan):
+	return(value > *filterValues);
+	break;
+    case (nftInRange):
+	return((value >= *filterValues) && (value < *(filterValues+1)));
+	break;
+    case (nftNotInRange):
+	return(! ((value >= *filterValues) && (value < *(filterValues+1))));
+	break;
+    default:
+	errAbort("illegal numericFilterType: %d", nft);
+	break;
+    }
+return(FALSE);
+}
+
+boolean bedFilterDouble(double value, enum numericFilterType nft, double *filterValues)
+/* Return TRUE if value passes the filter. */
+/* This could probably be turned into a macro if performance is bad. */
+{
+if (filterValues == NULL)
+    return(TRUE);
+switch (nft)
+    {
+    case (nftIgnore):
+	return(TRUE);
+	break;
+    case (nftLessThan):
+	return(value < *filterValues);
+	break;
+    case (nftLTE):
+	return(value <= *filterValues);
+	break;
+    case (nftEqual):
+	return(value == *filterValues);
+	break;
+    case (nftNotEqual):
+	return(value != *filterValues);
+	break;
+    case (nftGTE):
+	return(value >= *filterValues);
+	break;
+    case (nftGreaterThan):
+	return(value > *filterValues);
+	break;
+    case (nftInRange):
+	return((value >= *filterValues) && (value < *(filterValues+1)));
+	break;
+    case (nftNotInRange):
+	return(! ((value >= *filterValues) && (value < *(filterValues+1))));
+	break;
+    default:
+	errAbort("illegal numericFilterType: %d", nft);
+	break;
+    }
+return(FALSE);
+}
+
+boolean bedFilterLong(long long value, enum numericFilterType nft, long long *filterValues)
 /* Return TRUE if value passes the filter. */
 /* This could probably be turned into a macro if performance is bad. */
 {
 if (filterValues == NULL)
@@ -1059,42 +1141,42 @@
 {
 int cmpValues[2];
 if (bf == NULL)
     return TRUE;
-if (!filterString(bed->chrom, bf->chromFilter, bf->chromVals, bf->chromInvert))
+if (!bedFilterString(bed->chrom, bf->chromFilter, bf->chromVals, bf->chromInvert))
     return FALSE;
-if (!filterInt(bed->chromStart, bf->chromStartFilter, bf->chromStartVals))
+if (!bedFilterInt(bed->chromStart, bf->chromStartFilter, bf->chromStartVals))
     return FALSE;
-if (!filterInt(bed->chromEnd, bf->chromEndFilter, bf->chromEndVals))
+if (!bedFilterInt(bed->chromEnd, bf->chromEndFilter, bf->chromEndVals))
     return FALSE;
-if (!filterString(bed->name, bf->nameFilter, bf->nameVals, bf->nameInvert))
+if (!bedFilterString(bed->name, bf->nameFilter, bf->nameVals, bf->nameInvert))
     return FALSE;
-if (!filterInt(bed->score, bf->scoreFilter, bf->scoreVals))
+if (!bedFilterInt(bed->score, bf->scoreFilter, bf->scoreVals))
     return FALSE;
-if (!filterChar(bed->strand[0], bf->strandFilter, bf->strandVals,
+if (!bedFilterChar(bed->strand[0], bf->strandFilter, bf->strandVals,
 		    bf->strandInvert))
     return FALSE;
-if (!filterInt(bed->thickStart, bf->thickStartFilter,
+if (!bedFilterInt(bed->thickStart, bf->thickStartFilter,
 		    bf->thickStartVals))
     return FALSE;
-if (!filterInt(bed->thickEnd, bf->thickEndFilter,
+if (!bedFilterInt(bed->thickEnd, bf->thickEndFilter,
 		    bf->thickEndVals))
     return FALSE;
-if (!filterInt(bed->blockCount, bf->blockCountFilter,
+if (!bedFilterInt(bed->blockCount, bf->blockCountFilter,
 		    bf->blockCountVals))
     return FALSE;
-if (!filterInt((bed->chromEnd - bed->chromStart),
+if (!bedFilterInt((bed->chromEnd - bed->chromStart),
 		    bf->chromLengthFilter, bf->chromLengthVals))
     return FALSE;
-if (!filterInt((bed->thickEnd - bed->thickStart),
+if (!bedFilterInt((bed->thickEnd - bed->thickStart),
 		    bf->thickLengthFilter, bf->thickLengthVals))
     return FALSE;
 cmpValues[0] = cmpValues[1] = bed->thickStart;
-if (!filterInt(bed->chromStart, bf->compareStartsFilter,
+if (!bedFilterInt(bed->chromStart, bf->compareStartsFilter,
 		    cmpValues))
     return FALSE;
 cmpValues[0] = cmpValues[1] = bed->thickEnd;
-if (!filterInt(bed->chromEnd, bf->compareEndsFilter, cmpValues))
+if (!bedFilterInt(bed->chromEnd, bf->compareEndsFilter, cmpValues))
     return FALSE;
 return TRUE;
 }