Table filtering allows a program to select rows from an table (e.g., X-ray event list) to process by checking each row against one or more expressions involving the elements in the table. When a table is filtered, only valid rows satisfying these expressions are passed through for processing. Typically, filter specifications are specified using bracket notation appended to the filename of the data being processed:
foo.fits[pha==1&&pi==2]It is also possible to put region specification inside a file and then pass the filename in bracket notation:
foo.fits[@my.reg]
When row filters are passed in bracket notation in this manner, the filtering is set up automatically when the file is opened and all processing occurs through the filter. Programs also can use the filter library API to open filters explicitly. Table filtering can be performed on columns of data in a FITS binary table or a raw event file. Table filtering is accomplished by means of table filter specifications. An table filter specification consists of one or more filter expressions Filter specifications also can contain comments and local/global processing directives.
# comment until end of line # include the following file in the table descriptor @file # each row expression contains shapes separated by operators [filter_expression1], [filter_expression2], ... [filter_expression], [filter_expression], ... # the special row# keyword allows a range of rows to be processed row#=m:nA single filter expression consists of an arithmetic, logical, or other expression generally involving one or more column values from a table. For example, if energy and pha are columns in a table, then the following are valid expressions:
pha>1 energy == pha pha>1 && energy<=2 max(pha,energy)>=2.5Comparison values can be integers or floats. Integer comparison values can be specified in decimal, octal (using '0' as prefix), hex (using '0x' as prefix) or binary (using '0b' as prefix). Thus, the following all specify the same comparison test of a status mask:
(status & 15) == 8 # decimal (status & 017) == 010 # octal (status & 0xf) == 0x8 # hex (status & 0b1111) == 0b1000 # binary
The special keyword row# allows you to process a range of rows. When row# is specified, the filter code skips to the designated row and only processes the specified number of rows. The "*" character can be utilized as the high limit value to denote processing of the remaining rows. Thus:
row#=100:109processes 10 rows, starting with row 100 (counting from 1), while:
row#=100:*specifies that all but the first 99 rows are to be processed.
Table filtering is more easily described by means of examples. Consider data containing the following table structure:
Tables can be filtered on these columns using IRAF/QPOE range syntax or any valid C syntax. The following examples illustrate the possibilities:
Currently, integer range list limits cannot be specified in binary notation (use decimal, hex, or octal instead). Please contact us if this is a problem.
As mentioned previously, multiple filter expressions can be specified in a filter descriptor, separated by commas, new-lines, or semi-colons. When such a separator is used, the boolean AND operator is automatically generated in its place.
Note that the behavior of separators is different for filter expressions and region expressions. The former uses AND as the operator, while the latter user OR. See Combining Region and Table Filters for more information about these conventions and how they can be combined.
The filter syntax supports comparison between a column value and a header parameter value of a FITS binary tables (raw event files have no such header). The header parameters can be taken from the binary table header or the primary header. For example, assuming there is a header value MEAN_PHA in one of these headers, you can select photons having exactly this value using:
It also is possible to specify C math functions as part of the filter syntax. When the filter parser recognizes a function call, it automatically includes the math.h and links in the C math library. Thus, it is possible to filter rows by expressions such as these:
In addition to the region filtering described in the Spatial Region Filtering document, we have implemented special spatial region filtering for rows by allowing filtering to occur on any column. That is, each of the standard region shape specifications comes in two forms: the first is the same as the standard IRAF/PROS region specification:
With the standard specification, filtering is applied to the columns that are being used to bin the data, i.e., to the columns pointed to by the bincols= switch or the FITS_BINCOLS or EVENTS_BINCOLS environment variables.
The second form has two additional argument that specify which columns to use as the "X" and "Y" columns:
Any table column can be specified as the X and Y arguments. For example, if the EVENT table above is binned on X and Y, you can specify a filter for all rows within a circular region of the detector coordinates DX=400, DY=350 using:
Note that we also support the Chandra region syntax for specifying alternate columns for filtering:
The special @filename directive specifies an include file containing filter expressions. This file is processed as part of the overall filter descriptor:
foo.fits[pha==1,@foo]