LSST Applications
21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
|
afw
There is no universally-adopted standard on how the bits in a mask are to be interpreted, and accordingly the LSST code tries to be flexible.
The mapping name --> bitmask
is defined by a dictionary in the Mask class (e.g. EDGE -> 4 -> 2^4 == 0x10
).
When Mask is created, the dictionary is initialised with a number of useful values; a convenience function is provided to list them:
(where we slipped in a convenient function showMask
to show masks in name-order)
You can add more mask planes:
That last example was a little misleading; I could just as well have written Mask.addMaskPlane("RHL")
as addMaskPlane
is a class static function — it adds the named mask plane to all masks. I can remove a mask plane just as easily with Mask.removeMaskPlane("RHL")
:
(note that getMaskPlaneDict
is not static; we needed to create an object to be able to call it).
Unfortunately we have a problem; we set the beloved RHL
bit in msk
, but now it's gone. The resolution is that each mask remembers the version of the mask dictionary that was current when it was created, so:
If you want to get rid of msk's
RHL
bit, use msk.removeAndClearMaskPlane("RHL")
or msk.removeAndClearMaskPlane("RHL", True)
if you want to drop RHL
from the default mask too. This does two things: It clears any RHL
bits that are set in the Mask (it isn't static, so it can do that), and it removes RHL
from the Mask's dictionary.
It's clear that you can make things inconsistent if you try:
But you can't actually do much harm:
The version numbers aren't actually compared directly, rather a hash of the contents is computed, so:
(We removed the errant planes from msk
, then re-added the ones that are already defined in the default dictionary)
Adding planes has no such difficulties, so they are added to all pre-existing dictionaries that don't have conflicts:
However, as expected,
will raise an exception.
What did I mean by, "conflicts"? Here's an example:
Note that msk
hasn't acquired a P3
plane as plane 1
is already in use.