def test_msa_configuration_multiple_returns(): """ Test the get_open_msa_slits function. """ # Test 4: One row is skipped, should be acceptable. msa_meta_id = 16 msaconfl = get_file_path('msa_configuration.fits') dither_position = 1 slitlet_info = nirspec.get_open_msa_slits(msaconfl, msa_meta_id, dither_position, slit_y_range=[-.5, .5]) ref_slit1 = trmodels.Slit(59, 8651, 1, 256, 24, -2.85, 5.15, 4, 1, '11x1011', '95065_1', '2122', 0.13000000000000003, -0.31716078999999997, -0.18092266) ref_slit2 = trmodels.Slit(60, 11573, 1, 258, 32, -2.85, 4, 4, 2, '11x111', '95065_2', '172', 0.70000000000000007, -0.31716078999999997, -0.18092266) _compare_slits(slitlet_info[0], ref_slit1) _compare_slits(slitlet_info[1], ref_slit2)
def test_msa_configuration_all_background(): """ Test the get_open_msa_slits function. """ # Test 3: No non-background, not acceptable. msa_meta_id = 14 msaconfl = get_file_path('msa_configuration.fits') dither_position = 1 slitlet_info = nirspec.get_open_msa_slits(msaconfl, msa_meta_id, dither_position, slit_y_range=[-.5, .5]) ref_slit = trmodels.Slit(57, 8646, 1, 251, 24, -2.85, .55, 4, 0, '11x', 'background_57', 'bkg_57', 0, -0.5, -0.5) _compare_slits(slitlet_info[0], ref_slit)
def test_msa_configuration_row_skipped(): """ Test the get_open_msa_slits function. """ # Test 4: One row is skipped, should be acceptable. msa_meta_id = 15 msaconfl = get_file_path('msa_configuration.fits') dither_position = 1 slitlet_info = nirspec.get_open_msa_slits(msaconfl, msa_meta_id, dither_position, slit_y_range=[-.5, .5]) ref_slit = trmodels.Slit(58, 8646, 1, 251, 24, -2.85, 5.15, 4, 1, '11x1011', '95065_1', '2122', 0.130, -0.31716078999999997, -0.18092266) _compare_slits(slitlet_info[0], ref_slit)
def test_msa_configuration_normal(): """ Test the get_open_msa_slits function. """ # Test 1: Reasonably normal as well msa_meta_id = 12 msaconfl = get_file_path('msa_configuration.fits') dither_position = 1 slitlet_info = nirspec.get_open_msa_slits(msaconfl, msa_meta_id, dither_position, slit_y_range=[-.5, .5]) ref_slit = trmodels.Slit(55, 9376, 1, 251, 26, -5.15, 0.55, 4, 1, '1111x', '95065_1', '2122', 0.13, -0.31716078999999997, -0.18092266) _compare_slits(slitlet_info[0], ref_slit)
def test_functional_fs_msa(mode): # """ # Compare Nirspec instrument model with IDT model for FS and MSA. # """ if mode == 'fs': model_file = 'fixed_slits_functional_ESA_v4_20180618.txt' hdul = create_nirspec_fs_file(grating='G395H', filter='F290LP') im = datamodels.ImageModel(hdul) refs = create_reference_files(im) pipeline = nirspec.create_pipeline(im, refs, slit_y_range=[-0.55, 0.55]) w = wcs.WCS(pipeline) im.meta.wcs = w # Use slit S200A1 slit_wcs = nirspec.nrs_wcs_set_input(im, 'S200A1') if mode == 'msa': model_file = 'msa_functional_ESA_v2_20180620.txt' hdul = create_nirspec_mos_file(grating='G395H', filt='F290LP') im = datamodels.ImageModel(hdul) refs = create_reference_files(im) slit = trmodels.Slit(name=1, shutter_id=4699, xcen=319, ycen=13, ymin=-0.55000000000000004, ymax=0.55000000000000004, quadrant=3, source_id=1, shutter_state='x', source_name='lamp', source_alias='foo', stellarity=100.0, source_xpos=-0.5, source_ypos=0.5) open_slits = [slit] pipeline = nirspec.slitlets_wcs(im, refs, open_slits) w = wcs.WCS(pipeline) im.meta.wcs = w slit_wcs = nirspec.nrs_wcs_set_input(im, 1) ins_file = get_file_path(model_file) ins_tab = table.Table.read(ins_file, format='ascii') # Setup the test slitx = [0] * 5 slity = [-.5, -.25, 0, .25, .5] lam = np.array([2.9, 3.39, 3.88, 4.37, 5]) * 10**-6 # Slit to MSA absolute slit2msa = slit_wcs.get_transform('slit_frame', 'msa_frame') msax, msay, _ = slit2msa(slitx, slity, lam) assert_allclose(slitx, ins_tab['xslitpos']) assert_allclose(slity, ins_tab['yslitpos']) assert_allclose(msax, ins_tab['xmsapos']) assert_allclose(msay, ins_tab['ymaspos']) # Coordinates at Collimator exit # Applies the Collimator forward transform to MSa absolute coordinates with datamodels.open(refs['collimator']) as col: colx, coly = col.model.inverse(msax, msay) assert_allclose(colx, ins_tab['xcoll']) assert_allclose(coly, ins_tab['ycoll']) # After applying direcitonal cosines dircos = trmodels.Unitless2DirCos() xcolDircosi, ycolDircosi, z = dircos(colx, coly) assert_allclose(xcolDircosi, ins_tab['xcolDirCosi']) assert_allclose(ycolDircosi, ins_tab['ycolDirCosi']) # MSA to GWA entrance # This runs the Collimator forward, Unitless to Directional cosine, and # 3D Rotation. It uses the corrected GWA tilt value with datamodels.DisperserModel(refs['disperser']) as disp: disperser = nirspec.correct_tilt(disp, im.meta.instrument.gwa_xtilt, im.meta.instrument.gwa_ytilt) collimator2gwa = nirspec.collimator_to_gwa(refs, disperser) x_gwa_in, y_gwa_in, z_gwa_in = collimator2gwa(msax, msay) assert_allclose(x_gwa_in, ins_tab['xdispIn']) assert_allclose(y_gwa_in, ins_tab['ydispIn']) # Slit to GWA out slit2gwa = slit_wcs.get_transform('slit_frame', 'gwa') x_gwa_out, y_gwa_out, z_gwa_out = slit2gwa(slitx, slity, lam) assert_allclose(x_gwa_out, ins_tab['xdispLaw']) assert_allclose(y_gwa_out, ins_tab['ydispLaw']) # CAMERA entrance (assuming direction is from sky to detector) angles = [ disperser['theta_x'], disperser['theta_y'], disperser['theta_z'], disperser['tilt_y'] ] rotation = trmodels.Rotation3DToGWA(angles, axes_order="xyzy", name='rotation') dircos2unitless = trmodels.DirCos2Unitless() gwa2cam = rotation.inverse | dircos2unitless x_camera_entrance, y_camera_entrance = gwa2cam(x_gwa_out, y_gwa_out, z_gwa_out) assert_allclose(x_camera_entrance, ins_tab['xcamCosi']) assert_allclose(y_camera_entrance, ins_tab['ycamCosi']) # at FPA with datamodels.CameraModel(refs['camera']) as camera: x_fpa, y_fpa = camera.model.inverse(x_camera_entrance, y_camera_entrance) assert_allclose(x_fpa, ins_tab['xfpapos']) assert_allclose(y_fpa, ins_tab['yfpapos']) # at SCA These are 0-based , the IDT results are 1-based slit2sca = slit_wcs.get_transform('slit_frame', 'sca') x_sca_nrs1, y_sca_nrs1 = slit2sca(slitx, slity, lam) # At NRS2 with datamodels.FPAModel(refs['fpa']) as fpa: x_sca_nrs2, y_sca_nrs2 = fpa.nrs2_model.inverse(x_fpa, y_fpa) # expect 1 pix difference wvlns_on_nrs1 = slice(2) wvlns_on_nrs2 = slice(2, 4) assert_allclose(x_sca_nrs1[wvlns_on_nrs1] + 1, ins_tab['i'][wvlns_on_nrs1]) assert_allclose(y_sca_nrs1[wvlns_on_nrs1] + 1, ins_tab['j'][wvlns_on_nrs1]) assert_allclose(x_sca_nrs2[wvlns_on_nrs2] + 1, ins_tab['i'][wvlns_on_nrs2]) assert_allclose(y_sca_nrs2[wvlns_on_nrs2] + 1, ins_tab['j'][wvlns_on_nrs2]) # at oteip slit2oteip = slit_wcs.get_transform('slit_frame', 'oteip') x_oteip, y_oteip, _ = slit2oteip(slitx, slity, lam) assert_allclose(x_oteip, ins_tab['xOTEIP']) assert_allclose(y_oteip, ins_tab['yOTEIP']) # at v2, v3 [in arcsec] slit2v23 = slit_wcs.get_transform('slit_frame', 'v2v3') v2, v3, _ = slit2v23(slitx, slity, lam) v2 /= 3600 v3 /= 3600 assert_allclose(v2, ins_tab['xV2V3']) assert_allclose(v3, ins_tab['yV2V3'])