As described in Section 15, an NDF may optionally contain a component called QUALITY. If this component exists, it will be an array with the same bounds as the main DATA array. Each element in the QUALITY array can be used to store several flags that are associated with the corresponding element in the DATA array. These flags may be used to indicate that the DATA value holds some specified property. For instance, one of the flags may be used to indicate if the corresponding DATA values are saturated, another may be used to indicate if the DATA value lies within a background area, and so on.
You are free to use the flags in whatever way seems most suited to the particular process being
performed. You can set (or reset) any of the flags within any sub-region of the NDF using application
SETQUAL. Each of the flags is referred to by a Quality Name specified by the user. Names that reflect
the nature of the quality should be used, e.g. the quality name
SATURATED could be used to flag
saturated data values. These quality names get stored within the NDF and can be used to refer to the
quality flag when running later applications. The terminology adopted here is that an element of the
DATA array ‘holds’ the quality
SATURATED (for instance) if the flag that is associated with
the quality name
SATURATED is set for the corresponding element within the QUALITY
The number of quality names that can be stored within an NDF is limited, and therefore it may become necessary to remove quality names that are no longer needed to make room for new ones. The applications SHOWQUAL and REMQUAL allow you to do this. SHOWQUAL displays a list of the quality names currently defined within an NDF, and REMQUAL removes specified quality names from an NDF.
Some applications have a Parameter QEXP, which may be used to specify that the application is only
to use data values that hold a specified selection of qualities. As an example, when running
QUALTOBAD you could (for instance) specify a value of
BACKGROUND for the QEXP parameter. This
means that only those data values for which the flag associated with the quality name
set, are to be set bad. The quality name
BACKGROUND must previously have been defined and assigned
to the appropriate data values using application SETQUAL.
The specification of the data values to be used by an application can be more complex than this, and
can depend on several qualities combined together using ‘Boolean’ operators. For instance, assigning
.NOT. (SOURCE_A .OR. SOURCE_B) would cause the application to use only those data
values that hold neither of the qualities
SOURCE_B. These sort of strings are known as
Quality names are names by which the user refers to particular flags stored in the QUALITY
component of the NDF. They must not be longer than 15 characters. Leading blanks are ignored, and
they are always stored in upper case, even if they are supplied by the user in lower case. Embedded
blanks are considered to be significant. Quality names must not contain any fullstops (
and there are three reserved names that cannot be used; these are
Quality names may be combined together using Boolean operators into complex quality expressions.
The quality expression is evaluated at each element within the NDF by substituting a value of true or
false for each quality name used in the expression, depending on whether or not that element holds
the specified quality. Elements are used if the quality expression evaluates to a true value.
Boolean operators are delimited on each side by a period (e.g.
.AND. ). The operands on
which these operators act must be either a quality name (which must be defined within the
NDF), or one of the Boolean constants
.FALSE. Parentheses can be used to nest
Quality expressions can be up to 254 characters long, and must not contain more than 40 symbols (Boolean operators, constants, or quality names). Some attempts are made to simplify a quality expression to reduce the run time needed to evaluate the expression for every data value.
The precedence of the Boolean operators decreases in the following order;
.EQV. (the final two have equal precedence). In an expression such as
( A .XOR. B .EQV. C .XOR. D
) in which all operators have equal precedence, the evaluation proceeds from left to right, i.e. the
expression is evaluated as
( ( ( A .XOR. B ) .EQV. C ) .XOR. D ). If there is any doubt about the
order in which an expression will be evaluated, parentheses should be used to ensure the required
order of evaluation.
(.NOT.A) is true only if A is false.
(A.AND.B) is true only if A and B are both true.
(A.OR.B) is true if either (or both) of A or B are true.
(A.XOR.B) is true if either A is true and B is false, or A is false and B is
(A.EQV.B) is true if either A is true and B is true, or A is false and B is