Source code for pypeit.scripts.view_fits

"""
This script enables the viewing of a raw FITS file

.. include common links, assuming primary doc root is up one directory
.. include:: ../include/links.rst
"""

from IPython import embed

from pypeit.scripts import scriptbase
from pypeit import utils


[docs]class ViewFits(scriptbase.ScriptBase):
[docs] @classmethod def get_parser(cls, width=None): from pypeit.spectrographs import available_spectrographs parser = super().get_parser(description='View FITS files with ginga', width=width) parser.add_argument('spectrograph', type=str, help='A valid spectrograph identifier: {0}'.format( ', '.join(available_spectrographs))) parser.add_argument('file', type=str, default=None, help='FITS file') parser.add_argument('--list', default=False, action='store_true', help='List the extensions only?') parser.add_argument('--proc', default=False, action='store_true', help='Process the image (i.e. orient, overscan subtract, multiply by ' 'gain) using pypeit.images.buildimage.') parser.add_argument('--bkg_file', type=str, default=None, help='FITS file to be subtracted from the image in file.' '--proc must be set in order for this option to work.') parser.add_argument('--exten', type=int, default=None, help='Show a FITS extension in the raw file. Note --proc and --mosaic ' 'will not work with this option.') parser.add_argument('--det', type=str, default='1', nargs='*', help='Detector(s) to show. If more than one, the list of detectors, i.e. --det 4 8 ' 'to show detectors 4 and 8. This combination must be one of the allowed ' 'mosaics hard-coded for the selected ' 'spectrograph. Using "mosaic" for gemini_gmos, keck_deimos, or ' 'keck_lris will show the mosaic of all detectors.') parser.add_argument('--chname', type=str, default='Image', help='Name of Ginga tab') parser.add_argument('--showmask', default=False, help='Overplot masked pixels', action='store_true') parser.add_argument('--embed', default=False, action='store_true', help='Upon completion embed in ipython shell') return parser
[docs] @staticmethod def main(args): from pypeit import msgs from pypeit.display import display from pypeit.spectrographs import util from pypeit import io from pypeit.images import buildimage # List only? if args.list: hdu = io.fits_open(args.file) print(hdu.info()) return # Setup for PYPIT imports msgs.reset(verbosity=2) if args.proc and args.exten is not None: msgs.error('You cannot specify --proc and --exten, since --exten shows the raw image') if args.exten is not None and args.det == 'mosaic': msgs.error('You cannot specify --exten and --det mosaic, since --mosaic displays ' 'multiple extensions by definition') if args.exten is not None: hdu = io.fits_open(args.file) img = hdu[args.exten].data hdu.close() else: spectrograph = util.load_spectrograph(args.spectrograph) bad_read_message = 'Unable to construct image due to a read or image processing ' \ 'error. Use case interpreted from command-line inputs requires ' \ 'a raw image, not an output image product from pypeit. To show ' \ 'a pypeit output image, specify the extension using --exten. ' \ 'Use --list to show the extension names.' if 'mosaic' in args.det: mosaic = True _det = spectrograph.default_mosaic if _det is None: msgs.error(f'{args.spectrograph} does not have a known mosaic') else: try: _det = tuple(int(d) for d in args.det) except: msgs.error(f'Could not convert detector input to integer.') mosaic = len(_det) > 1 if not mosaic: _det = _det[0] if args.proc: # Use the biasframe processing parameters because processing # these frames is independent of any other frames (ie., does not # perform bias subtraction or flat-fielding) par = spectrograph.default_pypeit_par()['calibrations']['biasframe'] try: Img = buildimage.buildimage_fromlist(spectrograph, _det, par, [args.file], mosaic=mosaic) except Exception as e: msgs.error(bad_read_message + f' Original exception -- {type(e).__name__}: {str(e)}') if args.bkg_file is not None: try: bkgImg = buildimage.buildimage_fromlist(spectrograph, _det, par, [args.bkg_file], mosaic=mosaic) except Exception as e: msgs.error(bad_read_message + f' Original exception -- {type(e).__name__}: {str(e)}') Img = Img.sub(bkgImg) img = Img.image else: try: img = spectrograph.get_rawimage(args.file, _det)[1] except Exception as e: msgs.error(bad_read_message + f' Original exception -- {type(e).__name__}: {str(e)}') display.connect_to_ginga(raise_err=True, allow_new=True) display.show_image(img, chname=args.chname) if args.showmask: if not args.proc: msgs.info("You need to use --proc with --showmask to show the mask. Ignoring your argument") else: viewer, ch_mask = display.show_image(Img.bpm, chname="BPM") if args.embed: embed(header=utils.embed_header())