Source code for liger_iris_drp_resources.instrument_modes

import re
import numpy as np
import os
import astropy.table

from .filters import load_filters_summary

__all__ = [
    'make_liger_modes_table',
    'make_iris_modes_table'
]

gratings_lenslet = [
    'Z4000', 'Y4000', 'J4000', 'H4000', 'K4000', 'YJ4000', 'HK4000',
    'Z8000', 'Y8000', 'J8000', 'H8000', 'K8000', 'K8000a', 'K8000b',
    'H10000', 'K10000'
]

gratings_slicer = [
    'Z4000', 'Y4000', 'J4000', 'H4000', 'K4000', 'YJ4000', 'HK4000',
    'Z8000', 'Y8000', 'J8000', 'H8000', 'K8000a', 'K8000b'
]

modes = ['IMG', 'IFS']
ifs_modes = ['SLICER', 'LENSLET']

def get_fov(size, plate_scale, decimals=2):
    return (
        np.round(size[0] * plate_scale / 1000, decimals=decimals),
        np.round(size[1] * plate_scale / 1000, decimals=decimals)
    )

COLUMNS = {
    'MODE': 'U10',
    'IFS_MODE': 'U10',
    'GRATING': 'U10',
    'PLATE_SCALE': 'f4',
    'FILTER': 'U20',
    'FOV': object,
    'NUM_SPATIAL_ELEMENTS': object,
    'SPECTRAL_RESOLUTION': object,
    'WAVEMIN': 'f4',
    'WAVECEN': 'f4',
    'WAVEMAX': 'f4',
    'BANDWIDTH': 'f4',
}

def make_empty_table():
    t = astropy.table.Table()
    for k, dt in COLUMNS.items():
        t[k] = np.array([], dtype=dt)
    return t

[docs] def make_liger_modes_table(): # Filter summary fd = load_filters_summary() # NOTE: YN4 is missing from filter_info.dat file but is on the TMT ETC # NOTE: KN4.5 is missing from filter_info.dat file but is on the TMT ETC filter_names_imager = [ 'Zbb', 'Ybb', 'Jbb', 'Hbb', 'Kbb', 'Z', 'Y', 'J', 'H', 'Ks', 'K', 'ZN1', 'ZN2', 'ZN3', 'ZN4', 'YN1', 'YN2', 'YN3', #'YN4', 'JN1', 'JN2', 'JN3', 'JN4', 'HN1', 'HN2', 'HN3', 'HN4', 'HN5', 'KN1', 'KN2', 'KN3', 'KN4', 'KN5', 'CaIIw', 'PaBetaw', 'FeIIw', 'Br_Gammaw', 'COw', 'HeI', 'Jcont', 'PaBeta', 'Hcont', 'FeII', 'H2one', 'Kcont', 'Br_Gamma', 'H2two', 'CO' ] # NOTE: YN4 is missing from filter_info.dat file but is on the TMT ETC # NOTE: KN4.5 is missing from filter_info.dat file but is on the TMT ETC filter_names_ifs = [ 'Zbb', 'Ybb', 'Jbb', 'Hbb', 'Kbb', 'Z', 'Y', 'J', 'H', 'Ks', 'K', 'ZN1', 'ZN2', 'ZN3', 'ZN4', 'YN1', 'YN2', 'YN3', # 'YN4', 'JN1', 'JN2', 'JN3', 'JN4', 'HN1', 'HN2', 'HN3', 'HN4', 'HN5', 'KN1', 'KN2', 'KN3', 'KN4', 'KN5', ] # Pixels detector_size_imager = (2048, 2048) # mas plate_scale_imager = 10 plate_scales_lenslet = [14, 31] plate_scales_slicer = [75, 150] # arcsec fov_imager = ( np.round(detector_size_imager[0] * plate_scale_imager / 1000, decimals=2), np.round(detector_size_imager[1] * plate_scale_imager / 1000, decimals=2) ) ################################ #### IMAGER modes for Liger #### ################################ rows = [] for filt in filter_names_imager: rows.append({ 'MODE' : 'IMG', 'IFS_MODE' : 'None', 'GRATING' : 'None', 'PLATE_SCALE' : plate_scale_imager, 'FILTER' : filt, 'FOV' : fov_imager, 'NUM_SPATIAL_ELEMENTS' : detector_size_imager, 'SPECTRAL_RESOLUTION' : 'None', 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) modes_imager = make_empty_table() for row in rows: modes_imager.add_row(row) ################################# #### LENSLET modes for Liger #### ################################# rows = [] for grating in gratings_lenslet: resolution = float(re.search(r'\d+\.?\d*', grating).group()) band = grating[0] if resolution == 10000: filts = [filt for filt in filter_names_ifs if filt.startswith(band) and 'bb' in filt] else: filts = [filt for filt in filter_names_ifs if filt.startswith(band)] for filt in filts: for plate_scale in plate_scales_lenslet: if resolution == 4000: size = (16, 128) if 'bb' in filt else (112, 128) elif resolution == 8000: size = (16, 128) elif resolution == 1000: size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : grating, 'PLATE_SCALE' : plate_scale, 'FILTER' : filt, 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : resolution, 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) ## Add YJ, HK mode for LENSLET #16 x 128 #44 x 88 # YJ LENSLET SCALE = 14 mas plate_scale = 14 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # YJ LENSLET SCALE = 31 mas plate_scale = 31 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # HK LENSLET SCALE = 14 mas plate_scale = 14 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) # HK LENSLET SCALE = 31 mas plate_scale = 31 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) modes_lenslet = make_empty_table() for row in rows: modes_lenslet.add_row(row) ################################ #### SLICER modes for Liger #### ################################ rows = [] for grating in gratings_slicer: resolution = float(re.search(r'\d+\.?\d*', grating).group()) band = grating[0] filts = [filt for filt in filter_names_ifs if filt.startswith(band)] for filt in filts: for plate_scale in plate_scales_slicer: if resolution == 4000: size = (44, 45) if 'bb' in filt else (88, 45) elif resolution == 8000: size = (44, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : grating, 'PLATE_SCALE' : plate_scale, 'FILTER' : filt, 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : resolution, 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) # YJ SLICER SCALE = 45 mas plate_scale = 45 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # YJ SLICER SCALE = 88 mas plate_scale = 88 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # HK SLICER SCALE = 45 mas plate_scale = 45 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) # HK SLICER SCALE = 88 mas plate_scale = 88 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) modes_slicer = make_empty_table() for row in rows: modes_slicer.add_row(row) modes_all = astropy.table.vstack((modes_imager, modes_lenslet, modes_slicer)) return modes_all
[docs] def make_iris_modes_table(): # Filter summary fd = load_filters_summary() filter_names_imager = [ 'Zbb', 'Ybb', 'Jbb', 'Hbb', 'Kbb', 'Z', 'Y', 'J', 'H', 'Ks', 'K', 'ZN1', 'ZN2', 'ZN3', 'ZN4', 'YN1', 'YN2', 'YN3', 'YN4', 'JN1', 'JN2', 'JN3', 'JN4', 'HN1', 'HN2', 'HN3', 'HN4', 'HN5', 'KN1', 'KN2', 'KN3', 'KN4', 'KN5', 'CaIIw', 'PaBetaw', 'FeIIw', 'Br_Gammaw', 'COw', 'HeI', 'Jcont', 'PaBeta', 'Hcont', 'FeII', 'H2one', 'Kcont', 'Br_Gamma', 'H2two', 'CO' ] filter_names_ifs = [ 'Zbb', 'Ybb', 'Jbb', 'Hbb', 'Kbb', 'Z', 'Y', 'J', 'H', 'Ks', 'K', 'ZN1', 'ZN2', 'ZN3', 'ZN4', 'YN1', 'YN2', 'YN3', 'YN4', 'JN1', 'JN2', 'JN3', 'JN4', 'HN1', 'HN2', 'HN3', 'HN4', 'HN5', #'KN1', 'KN2', 'KN3', 'KN4', 'KpN45', 'KN5', 'KN1', 'KN2', 'KN3', 'KN4', 'KN5', ] # Pixels detector_size_imager = (4096, 4096) # mas plate_scale_imager = 4 plate_scales_lenslet = [4, 9] plate_scales_slicer = [25, 50] # arcsec fov_imager = ( np.round(detector_size_imager[0] * plate_scale_imager / 1000, decimals=2), np.round(detector_size_imager[1] * plate_scale_imager / 1000, decimals=2) ) ############################### #### IMAGER modes for IRIS #### ############################### rows = [] for filt in filter_names_imager: rows.append({ 'MODE' : 'IMG', 'IFS_MODE' : 'None', 'GRATING' : 'None', 'PLATE_SCALE' : plate_scale_imager, 'FILTER' : filt, 'FOV' : fov_imager, 'NUM_SPATIAL_ELEMENTS' : detector_size_imager, 'SPECTRAL_RESOLUTION' : 'None', 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) modes_imager = make_empty_table() for row in rows: modes_imager.add_row(row) ################################ #### LENSLET modes for IRIS #### ################################ rows = [] for grating in gratings_lenslet: resolution = float(re.search(r'\d+\.?\d*', grating).group()) band = grating[0] if resolution == 10000: filts = [filt for filt in filter_names_ifs if filt.startswith(band) and 'bb' in filt] else: filts = [filt for filt in filter_names_ifs if filt.startswith(band)] if grating == 'K8000a': filts = ['KN1', 'KN2', 'KN3', 'Kbb'] if grating == 'K8000b': #filts = ['KN4', 'KN4.5', 'KN5', 'Kbb'] filts = ['KN4', 'KN5', 'Kbb'] for filt in filts: for plate_scale in plate_scales_lenslet: if resolution == 4000: size = (16, 128) if 'bb' in filt else (112, 128) elif resolution == 8000: size = (16, 128) elif resolution == 10000: size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : grating, 'PLATE_SCALE' : plate_scale, 'FILTER' : filt, 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : resolution, 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) ## Add YJ, HK mode for LENSLET #16 x 128 #44 x 88 # YJ LENSLET SCALE = 4 mas plate_scale = 4 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # YJ LENSLET SCALE = 9 mas plate_scale = 9 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # HK LENSLET SCALE = 4 mas plate_scale = 4 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) # HK LENSLET SCALE = 9 mas plate_scale = 9 size = (16, 128) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'LENSLET', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) modes_lenslet = make_empty_table() for row in rows: modes_lenslet.add_row(row) ############################### #### SLICER modes for IRIS #### ############################### rows = [] for grating in gratings_slicer: resolution = float(re.search(r'\d+\.?\d*', grating).group()) band = grating[0] filts = [filt for filt in filter_names_ifs if filt.startswith(band)] for filt in filts: for plate_scale in plate_scales_slicer: if resolution == 4000: size = (44, 45) if 'bb' in filt else (88, 45) elif resolution == 8000: size = (44, 45) fov = ( np.round(size[0] * plate_scale / 1000, decimals=2), np.round(size[1] * plate_scale / 1000, decimals=2) ) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : grating, 'PLATE_SCALE' : plate_scale, 'FILTER' : filt, 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : resolution, 'WAVEMIN' : fd[filt]['wavemin'], 'WAVECEN' : fd[filt]['wavecenter'], 'WAVEMAX' : fd[filt]['wavemax'], 'BANDWIDTH' : fd[filt]['bandwidth'] }) # YJ SLICER SCALE = 25 mas plate_scale = 25 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # YJ SLICER SCALE = 50 mas plate_scale = 50 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'YJ4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'YJ', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 0.925, 'WAVECEN' : 1.1325, 'WAVEMAX' : 1.34, 'BANDWIDTH' : 1.34 - 0.925 }) # HK SLICER SCALE = 25 mas plate_scale = 25 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) # HK SLICER SCALE = 50 mas plate_scale = 50 size = (88, 45) fov = get_fov(size, plate_scale) rows.append({ 'MODE' : 'IFS', 'IFS_MODE' : 'SLICER', 'GRATING' : 'HK4000', 'PLATE_SCALE' : plate_scale, 'FILTER' : 'HK', 'FOV' : fov, 'NUM_SPATIAL_ELEMENTS' : size, 'SPECTRAL_RESOLUTION' : 4000, 'WAVEMIN' : 1.572, 'WAVECEN' : 1.992, 'WAVEMAX' : 2.412, 'BANDWIDTH' : 2.412 - 1.572 }) modes_slicer = make_empty_table() for row in rows: modes_slicer.add_row(row) modes_all = astropy.table.vstack((modes_imager, modes_lenslet, modes_slicer)) return modes_all