Output Bitmasks
PypeIt uses bitmasks to flag data for various reasons. For a primer on the general use of bitmasks, see the SDSS bitmasks primer.
For the underlying bitmask utility class used by PypeIt, see Bitmasks.
Spec2D Bits
In terms of the output data, the main bitmask you will encounter is
in the Spec2D Output. The BPMMASK
extension in these files
contain the bad-pixel bitmask values accrued during the processing
and reduction of the data. The main object that manages the bitmasks
is ImageBitMask
, which defines
the following bits:
Bit Name |
Bit Number |
Decimal Value |
Description |
---|---|---|---|
BPM |
0 |
1 |
Component of the instrument-specific bad pixel mask |
CR |
1 |
2 |
Cosmic ray detected |
SATURATION |
2 |
4 |
Saturated pixel |
MINCOUNTS |
3 |
8 |
Pixel below the instrument-specific minimum counts |
OFFSLITS |
4 |
16 |
Pixel does not belong to any slit |
IS_NAN |
5 |
32 |
Pixel value is undefined |
IVAR0 |
6 |
64 |
Inverse variance is undefined |
IVAR_NAN |
7 |
128 |
Inverse variance is NaN |
EXTRACT |
8 |
256 |
Pixel masked during local skysub and extraction |
BADSCALE |
9 |
512 |
Bad image rescaling operation (e.g., flat-field value <= 0) |
STCKMASK |
10 |
1024 |
All pixels masked in image stack |
USER |
11 |
2048 |
Pixel masked by user |
Viewing and interpreting the bit mask image (python)
To access the bitmask array, we recommend using
Spec2DObj
directly:
from pathlib import Path
from pypeit.spec2dobj import Spec2DObj
f = Path('spec2d_b27-J1217p3905_KASTb_20150520T045733.560.fits').resolve()
detname = 'DET01'
spec2d = Spec2DObj.from_file(f, detname)
mask = spec2d.bpmmask
The bitmask array is held by the spec2d.bpmmask
attribute.
But you can read it directly from the spec2d file:
from astropy.io import fits
from pypeit.images.imagebitmask import ImageBitMaskArray
f = Path('spec2d_b27-J1217p3905_KASTb_20150520T045733.560.fits').resolve()
detname = 'DET01'
hdu = fits.open(f)
mask = ImageBitMaskArray.from_array(hdu[f'{detname}-BPMMASK'].data)
To show all the bit values directly:
from matplotlib import pyplot as plt
plt.imshow(mask, origin='lower', interpolation='nearest')
plt.show()
However, this isn’t necessarily as useful as creating boolean arrays that identify which pixels are flagged due to one or more reasons.
E.g., to show all pixels flagged for having cosmic rays:
plt.imshow(mask.flagged(flag='CR').astype(int), origin='lower', interpolation='nearest')
plt.show()
or as being part of the instrument-specific bad-pixel mask or not part of any slit:
plt.imshow(mask.flagged(flag=['BPM', 'OFFSLITS']).astype(int),
origin='lower', interpolation='nearest')
plt.show()
You can also use the pypeit_show_2dspec script to include an image that shows the full mask or an image that selects specific flags.
To print the human-readable reason(s) any given value is flagged:
coo = (0,0) # Tuple with the 2D coordinate of the pixel
print(mask.flagged_bits(coo))
pypeit_print_bpm
This simple executable allows you to effectively do the above via a command-line
script. The script usage can be displayed by calling the script with the
-h
option:
$ pypeit_print_bpm -h
usage: pypeit_print_bpm [-h] [--file FILE] [--det DET] bit
Print out an informative description of a bad pixel masked value. Usually, you
should run pypeit_show_2dspec --showmask first to see the bad pixel mask values.
Then, call this script with the BPM value that you want to findmore information
about.
positional arguments:
bit Bad pixel mask value to describe in plain text
options:
-h, --help show this help message and exit
--file FILE PypeIt spec2d file to use for the description(optional). If
provided, the bitmask contained in the spec2d file will be used
to describe the bad pixel mask value. If not provided, the
default pypeit bad pixel mask will be used. (default: None)
--det DET Detector name or number. If a number, the name is constructed
assuming the reduction is for a single detector. If a string, it
must match the name of the detector object (e.g., DET01 for a
detector, MSC01 for a mosaic). This is not required, and the
value is acceptable. Default is 1. (default: 1)
A typical call and its output looks like this:
% pypeit_print_bpm 23
[INFO] :: Using the default PypeIt bad pixel mask.
[INFO] :: The bad pixel mask value (23) corresponds to the following:
* BPM : Component of the instrument-specific bad pixel mask
* CR : Cosmic ray detected
* SATURATION : Saturated pixel
* OFFSLITS : Pixel does not belong to any slit
[INFO] :: Please see the following website for more information:
https://pypeit.readthedocs.io/en/release/out_masks.html