| Getting Started | Documentation | Glish | Learn More | Programming | Contact Us |
| Version 1.9 Build 1556 |
|
A boolean mask associated with an image indicates whether a pixel is good (mask value True) or bad (mask value False). If the mask value is bad, then the image pixel is not used for computation (e.g. when finding the mean of the image).
An image can have zero (all pixels are good) or more masks. One mask
can be designated as the default mask. By default it will be applied to
the image (from Glish, designation of the default mask is handled by the
maskhandler function
of the Image tool).
When using LEL, the basic behaviour is that the default mask is used.
However, by qualifying the image name with a suffix string, it is
possible to specify that no mask or another mask should be used. The suffix
is a colon followed by the word nomask or the name of the
alternative mask.
myimage.data myimage.data:nomask 'myimage.data:othermask'
The first example uses the default mask (if the image has one).
The second example uses no mask (thus all pixels are designated good)
and the third example uses mask othermask.
Note that if the image name is enclosed in quotes, the mask name
should be enclosed too. It means that a colon cannot be part of
an image name.
It is also possible to use a mask from another image like
myimage.data:nomask[myotherimage::othermask]This syntax is explained in the section describing regions
We have seen in the previous section that lattices (in this case images) can have an associated mask. These masks are stored with the image - they are persistent.
It is also possible to create transient masks when a LEL expression is
executed (dawn, usually). This is done with the operator []
and a boolean expression. For example,
sum( lat1[lat1<5 && lat1>10] )creates a mask for lat1 indicating that only its elements fulfilling the boolean condition should be taken into account in the sum function. Note that the mask is local to that part of the expression. So in the expression
sum( lat1[lat1<5 && lat1>10] ) + sum(lat1)the second sum function takes all elements into account. Masking can also be applied to more complex expressions and it is recursive.
(lat1+lat2)[lat3<lat4] sum( lat1[lat1<5][lat1>10] ) (lat1 + lat2[lat3<lat4]) [lat1<5]The first example applies the mask generated by the [] operator to the expression lat1+lat2. The second example shows the recursion (which ANDs the masks). It is effectively a (slower) implementation of the first example in this subsection. In the last example, the expression inside the parentheses is only evaluated where the condition [lat1<5] is true and the resulting expression has a mask associated with it.
Please note that it is possible to select pixels on an axis by means of the function INDEXIN (or by the INDEXi IN expression) as shown in the previous section about miscellaneous functions.
As explained in the previous subsections, lattices can have a mask.
Examples are a mask of good pixels in an image,
a mask created using a boolean condition
and the operator [],
or a mask defining a region within its bounding
box.
A pixel is bad when the image has a mask and when the
mask value for that pixel is False. Functions like
max ignore the bad pixels.
Note that in a MeasurementSet a False mask value indicates a good
visibility. Alas this is a historically grown distinction in
radio-astronomy.
Image masks are combined and propagated throughout an
expression. E.g. when
two lattices are added, the mask of the result is formed by and-ing the
masks of the two lattices. That is, the resultant mask is True where the
mask of lattice one is true AND the mask of lattice 2 is True. Otherwise,
the resultant mask is False.
In general the mask of a subexpression is formed by and-ing the masks
of the operands. This is true for e.g. +, *, atan2, etc..
However, there are a few special cases:
sum( lat1[lat2<5] )the sum function will only sum those elements for which the mask of lat1 and lat2 is valid and for which the condition is true.
lat1[lat1<0 && lat2>0]Let us say both lat1 and lat2 have masks. The operand lat1<0 is true if the mask of lat1 is true and the operand evaluates to true, otherwise it is false. Apply the same rule to the operand lat2 > 0. The AND operator gives true if the left and right operands are both true. If the left operand is false, the right operand is no longer relevant. It is, in fact, 3-valued logic with the values true, false, and undefined.
Thus, the full expression generates a lattice with a mask.
The mask is true when the condition in the [] operator
is true, and false otherwise. The values of the output lattice are only
defined where its mask is true.
Consider the following more or less equivalent examples:
value(image1)[mask(image2)] image1:nomask[mask(image2)] image1:nomask[image2::mask0]The first two use the default mask of image2 as the mask for image1.
It is possible that the entire mask of a subexpression is false. For example,
if the mean of such a subexpression is taken, the result is
undefined. This is fully supported by LEL, because a scalar value also
has a mask associated with it. One can see a masked-off scalar as a
lattice with an all false mask. Hence an operation involving an
undefined scalar results in an undefined scalar. The following
functions act as described below on fully masked-off lattices:
You should also be aware that if you remove a mask from an image,
the values of the image that were previously masked bad
may have values that are meaningless.