def create_integration_model(input_model, integ_info): """Creates an CubeModel from the computed arrays from ramp_fit. Parameters ---------- input_model: RampModel Input RampModel for which the output CubeModel is created. integ_info: tuple The ramp fitting arrays needed for the CubeModel for each integration. Returns ------- int_model: CubeModel The output CubeModel to be returned from the ramp fit step. """ data, dq, var_poisson, var_rnoise, int_times, err = integ_info int_model = datamodels.CubeModel( data=np.zeros(data.shape, dtype=np.float32), dq=np.zeros(data.shape, dtype=np.uint32), var_poisson=np.zeros(data.shape, dtype=np.float32), var_rnoise=np.zeros(data.shape, dtype=np.float32), err=np.zeros(data.shape, dtype=np.float32)) int_model.int_times = None int_model.update(input_model) # ... and add all keys from input int_model.data = data int_model.dq = dq int_model.var_poisson = var_poisson int_model.var_rnoise = var_rnoise int_model.err = err int_model.int_times = int_times return int_model
def test_tso_phot_4(): global shape, xcenter, ycenter value = 17. background = 0.8 radius = 5. radius_inner = 8. radius_outer = 11. data = mk_data_array(shape, value, background, xcenter, ycenter, radius) datamodel = datamodels.CubeModel(data) set_meta(datamodel, sub64p=False) int_times = include_int_times(datamodel) # Modify the column of integration numbers so that they extend outside # the range of integration numbers in the science data. This shouldn't # happen, i.e. this is to test an edge case. int_start = datamodel.meta.exposure.integration_start datamodel.int_times['integration_number'] += (2 * int_start) catalog = tso_aperture_photometry(datamodel, xcenter, ycenter, radius + 1., radius_inner, radius_outer) int_times = np.array([ 58704.62853, 58704.628655, 58704.62878, 58704.62890, 58704.6290, 58704.6291511, 58704.629275 ]) assert np.allclose(catalog['MJD'], int_times, rtol=1.e-8)
def test_tso_phot_2(): # pupil = 'WLP8' and subarray = 'SUB64P' shape = (7, 64, 64) xcenter = 31. ycenter = 31. value = 17. background = 0.8 radius = 50. radius_inner = None radius_outer = None data = mk_data_array(shape, value, background, xcenter, ycenter, radius) datamodel = datamodels.CubeModel(data) set_meta(datamodel, sub64p=True) catalog = tso_aperture_photometry(datamodel, xcenter, ycenter, radius, radius_inner, radius_outer) assert catalog.meta['instrument'] == datamodel.meta.instrument.name assert catalog.meta['filter'] == datamodel.meta.instrument.filter assert catalog.meta['subarray'] == datamodel.meta.subarray.name assert catalog.meta['pupil'] == datamodel.meta.instrument.pupil assert math.isclose(catalog.meta['xcenter'], xcenter, abs_tol=0.01) assert math.isclose(catalog.meta['ycenter'], ycenter, abs_tol=0.01) assert np.allclose(catalog['aperture_sum'], (value + background) * shape[-1] * shape[-2], rtol=1.e-6) assert np.allclose(catalog['aperture_sum_err'], 0., atol=1.e-7)
def test_wcs_bbox_from_shape_3d(): model = datamodels.CubeModel((3, 32, 2048)) bb = wcs_bbox_from_shape(model.data.shape) assert bb == ((-0.5, 2047.5), (-0.5, 31.5)) model = datamodels.IFUCubeModel((750, 45, 50)) bb = wcs_bbox_from_shape(model.data.shape) assert bb == ((-0.5, 49.5), (-0.5, 44.5))
def test_multi_integration_input(resample_class): cube = datamodels.CubeModel((5, 100, 100)) cube.meta.instrument.name = 'MIRI' cube.meta.observation.date = '2018-09-07' cube.meta.observation.time = '10:32:20.181' # Resample can't handle cubes, so it should fail with pytest.raises(RuntimeError): resample_class().call(cube)
def test_ami_analyze_calints_fail(): """Make sure ami_analyze fails if input is CubeModel (_calints)""" model = datamodels.CubeModel((25, 19, 19)) model.meta.instrument.name = "NIRISS" model.meta.instrument.filter = "F277W" model.meta.observation.date = "2019-01-01" model.meta.observation.time = "00:00:00" with pytest.raises(RuntimeError): AmiAnalyzeStep.call(model)
def test_align_models(): """ Test of align_models() in imageregistration.py """ temp = np.arange((15), dtype=np.float32) temp = temp.reshape((3, 5)) targ = np.zeros((3, 3, 5)) targ[:] = temp targ[0, 1, 1] += 0.3 targ[0, 2, 1] += 0.7 targ[0, 0, 3] -= 0.5 targ[0, 1, 2] -= 1.3 targ[1, 0, 1] += 0.7 targ[1, 2, 1] += 0.2 targ[1, 2, 3] += 0.8 targ[1, 2, 2] -= 1.8 targ[2, 1, 1] += 0.9 targ[2, 2, 2] -= 0.5 targ[2, 1, 0] += 0.8 targ[2, 1, 2] += 0.8 ref = targ.copy() ref[1, 2, 3] -= 5. ref[2, 0, 3] -= 1.6 mask = ref[0, :, :] mask = ref[0, :, :] * 0 + 1 mask[1, 1] = 0 mask[1, 2] = 0 targ_mod = datamodels.CubeModel(data=targ) mask_mod = datamodels.ImageModel(data=mask) ref_mod = datamodels.CubeModel(data=ref) am_results = imageregistration.align_models(ref_mod, targ_mod, mask_mod) results_sub = am_results.data[:3, :2, 2, :3] truth_results_sub = np.array([[[10., 11.7, 12.], [10.036278, 11.138131, 10.180669]], [[10.053974, 11.1953335, 11.993213], [10.36224, 10.805556, 10.274276]], [[9.988604, 11.33026, 11.968155], [10.024722, 10.971058, 10.108071]]]) npt.assert_allclose(results_sub, truth_results_sub, atol=1E-6)
def test_klip(): """ Test of klip() in klip.py """ target_model_data = np.array( [[[0.84456396, 0.75297576, 0.79752606, 1.2884853], [0.98718196, 0.83042985, 0.76917756, 0.9760479], [1.4539411, 1.1395805, 0.9635729, 0.92798233]], [[0.84456396, 0.75297576, 0.79752606, 1.2884853], [0.98718196, 0.83042985, 0.76917756, 0.9760479], [1.4539411, 1.1395805, 0.9635729, 0.92798233]]], dtype=np.float32) target_model = datamodels.CubeModel(data=target_model_data) refs_model_data = np.array( [[[[0.8174741, 0.74938107, 0.73527235, 1.3193785], [1.0032778, 0.8247719, 0.78944355, 0.99227476], [1.4609907, 1.1605016, 0.9564753, 0.9186427]], [[0.86789674, 0.7998908, 0.8557136, 1.2926395], [0.97756547, 0.7788742, 0.75892323, 0.9819151], [1.495664, 1.1455023, 1.002115, 0.92159164]], [[0.84426856, 0.7719569, 0.8088021, 1.2781427], [0.98734635, 0.8125992, 0.77424014, 0.9934157], [1.419994, 1.1546139, 0.961317, 0.95088667]]], [[[0.8174741, 0.74938107, 0.73527235, 1.3193785], [1.0032778, 0.8247719, 0.78944355, 0.99227476], [1.4609907, 1.1605016, 0.9564753, 0.9186427]], [[0.86789674, 0.7998908, 0.8557136, 1.2926395], [0.97756547, 0.7788742, 0.75892323, 0.9819151], [1.495664, 1.1455023, 1.002115, 0.92159164]], [[0.84426856, 0.7719569, 0.8088021, 1.2781427], [0.98734635, 0.8125992, 0.77424014, 0.9934157], [1.419994, 1.1546139, 0.961317, 0.95088667]]]], dtype=np.float32) refs_model = datamodels.QuadModel(data=refs_model_data) # Call the KLIP routine truncate = 50 psf_sub, psf_fit = klip.klip(target_model, refs_model, truncate) truth_psf_sub_data = np.array( [[[0.00677787, -0.01639403, 0.00753349, -0.00190761], [-0.00016282, 0.02299659, -0.00647708, -0.00992276], [0.00798155, -0.00867007, -0.00287747, 0.00112234]], [[0.00677787, -0.01639403, 0.00753349, -0.00190761], [-0.00016282, 0.02299659, -0.00647708, -0.00992276], [0.00798155, -0.00867007, -0.00287747, 0.00112234]]]) # psf_fit is cuurrently not used in the code, co not compared here npt.assert_allclose(psf_sub.data, truth_psf_sub_data, atol=1E-6)
def test_tso_phot_5(): global shape, xcenter, ycenter value = 17. background = 0.8 radius = 5. radius_inner = 8. radius_outer = 11. data = mk_data_array(shape, value, background, xcenter, ycenter, radius) datamodel = datamodels.CubeModel(data) set_meta(datamodel, sub64p=False) datamodel.meta.bunit_data = 'MJy' # unexpected data unit with pytest.raises(ValueError): tso_aperture_photometry(datamodel, xcenter, ycenter, radius + 1., radius_inner, radius_outer)
def _generate_data(): """Generate data of each type of input for master background step""" image = datamodels.ImageModel((10, 10)) image.meta.instrument.name = 'MIRI' image.meta.instrument.detector = 'MIRIMAGE' image.meta.exposure.type = 'MIR_LRS-FIXEDSLIT' image.meta.observation.date = '2018-01-01' image.meta.observation.time = '00:00:00' image.meta.subarray.xstart = 1 image.meta.subarray.ystart = 1 image.meta.wcsinfo.v2_ref = 0 image.meta.wcsinfo.v3_ref = 0 image.meta.wcsinfo.roll_ref = 0 image.meta.wcsinfo.ra_ref = 0 image.meta.wcsinfo.dec_ref = 0 image = AssignWcsStep.call(image) # hdulist = create_nirspec_fs_file(grating="G140M", filter="F100LP") # hdulist[1].data = np.zeros((2048, 2048)) # fs = datamodels.ImageModel(hdulist) # fs = AssignWcsStep.call(fs) # multislit = Extract2dStep.call(fs) # hdulist = create_nirspec_ifu_file("OPAQUE", "G140M") # hdulist[1].data = np.zeros((2048, 2048)) # ifu_image = datamodels.IFUImageModel(hdulist) # ifu_image = AssignWcsStep.call(ifu_image) container = datamodels.ModelContainer([image]) cube = datamodels.CubeModel((2, 10, 10)) # Return the data and a status dependent on whether the step can process it return [ (image, 'COMPLETE'), # (multislit, 'COMPLETE'), # (ifu_image, 'COMPLETE'), (container, 'COMPLETE'), (cube, 'SKIPPED'), ]
def test_tso_phot_3(): global shape, xcenter, ycenter value = 17. background = 0.8 radius = 5. radius_inner = 8. radius_outer = 11. data = mk_data_array(shape, value, background, xcenter, ycenter, radius) datamodel = datamodels.CubeModel(data) set_meta(datamodel, sub64p=False) int_times = include_int_times(datamodel) catalog = tso_aperture_photometry(datamodel, xcenter, ycenter, radius + 1., radius_inner, radius_outer) offset = datamodel.meta.exposure.integration_start - 1 slc = slice(offset, offset + shape[0]) assert np.allclose(catalog['MJD'], int_times[slc], atol=1.e-8)
def test_tso_phot_1(): global shape, xcenter, ycenter # pupil = 'CLEAR' and subarray = 'FULL' value = 17. background = 0.8 radius = 5. radius_inner = 8. radius_outer = 11. data = mk_data_array(shape, value, background, xcenter, ycenter, radius) datamodel = datamodels.CubeModel(data) set_meta(datamodel, sub64p=False) # Use a larger radius than was used for creating the data. catalog = tso_aperture_photometry(datamodel, xcenter, ycenter, radius + 1., radius_inner, radius_outer) assert catalog.meta['instrument'] == datamodel.meta.instrument.name assert catalog.meta['filter'] == datamodel.meta.instrument.filter assert catalog.meta['subarray'] == datamodel.meta.subarray.name assert catalog.meta['detector'] == datamodel.meta.instrument.detector assert catalog.meta['channel'] == datamodel.meta.instrument.channel assert catalog.meta['target_name'] == datamodel.meta.target.catalog_name assert math.isclose(catalog.meta['xcenter'], xcenter, abs_tol=0.01) assert math.isclose(catalog.meta['ycenter'], ycenter, abs_tol=0.01) assert np.allclose(catalog['aperture_sum'], 1263.4778, rtol=1.e-7) assert np.allclose(catalog['aperture_sum_err'], 0., atol=1.e-7) assert np.allclose(catalog['net_aperture_sum'], 1173., rtol=1.e-7) assert np.allclose(catalog['annulus_sum'], 143.256627, rtol=1.e-7) assert np.allclose(catalog['annulus_sum_err'], 0., atol=1.e-7) assert np.allclose(catalog['annulus_mean'], background, rtol=1.e-7) assert np.allclose(catalog['annulus_mean'], 0.8, rtol=1.e-6) assert np.allclose(catalog['annulus_mean_err'], 0., rtol=1.e-7) assert np.allclose(catalog['net_aperture_sum'], 1173., rtol=1.e-7) assert np.allclose(catalog['net_aperture_sum_err'], 0., atol=1.e-7)
def test_transform_bbox_from_shape_3d(): model = datamodels.CubeModel((3, 32, 2048)) bb = transform_bbox_from_shape(model.data.shape) assert bb == ((-0.5, 31.5), (-0.5, 2047.5))