def test__masked_front_edge_from_layout(): layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[(1, 4)]) mask = ac.Mask1DLine.masked_front_edge_from_layout( layout=layout, settings=ac.SettingsMask1DLine(front_edge_pixels=(0, 2)), pixel_scales=0.1, ) assert type(mask) == ac.Mask1DLine assert (mask == np.array([False, True, True, False, False])).all() layout = ac.Layout1DLine(shape_1d=(9, ), region_list=[(1, 4), (6, 9)]) mask = ac.Mask1DLine.masked_front_edge_from_layout( layout=layout, settings=ac.SettingsMask1DLine(front_edge_pixels=(1, 3)), pixel_scales=0.1, ) assert type(mask) == ac.Mask1DLine assert (mask == np.array( [False, False, True, True, False, False, False, True, True])).all()
def test__array_1d_of_trails_from(): layout = ac.Layout1DLine(shape_1d=(4, ), region_list=[(0, 2)], prescan=(0, 1), overscan=(0, 1)) array = ac.Array1D.manual_native(array=[0.0, 1.0, 2.0, 3.0], pixel_scales=1.0) array_extracted = layout.array_1d_of_trails_from(array=array) assert (array_extracted == np.array([0.0, 0.0, 2.0, 3.0])).all() layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[(0, 2)], prescan=(2, 3), overscan=(3, 4)) array_extracted = layout.array_1d_of_trails_from(array=array) assert (array_extracted == np.array([0.0, 0.0, 0.0, 0.0])).all() layout = ac.Layout1DLine(shape_1d=(4, ), region_list=[(0, 1), (2, 3)], prescan=(2, 3), overscan=(2, 3)) array_extracted = layout.array_1d_of_trails_from(array=array) assert (array_extracted.native == np.array([0.0, 1.0, 0.0, 3.0])).all()
def test__trail_size_to_array_edge(): layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[ac.Region1D(region=(0, 3))]) assert layout.trail_size_to_array_edge == 2 layout = ac.Layout1DLine(shape_1d=(7, ), region_list=[ac.Region1D(region=(0, 3))]) assert layout.trail_size_to_array_edge == 4 layout = ac.Layout1DLine( shape_1d=(15, ), region_list=[ ac.Region1D(region=(0, 2)), ac.Region1D(region=(5, 8)), ac.Region1D(region=(11, 14)), ], ) assert layout.trail_size_to_array_edge == 1 layout = ac.Layout1DLine( shape_1d=(20, ), region_list=[ ac.Region1D(region=(0, 2)), ac.Region1D(region=(5, 8)), ac.Region1D(region=(11, 14)), ], ) assert layout.trail_size_to_array_edge == 6
def test__from_post_cti_data(self, clocker_1d, traps_x2, ccd): layout = ac.Layout1DLine(shape_1d=(5,), region_list=[(0, 5)]) simulator = ac.SimulatorDatasetLine( pixel_scales=1.0, normalization=10.0, read_noise=4.0, add_poisson_noise=False, noise_seed=1, ) dataset_line = simulator.from_layout( layout=layout, clocker=clocker_1d, trap_list=traps_x2, ccd=ccd ) pre_cti_data = simulator.pre_cti_data_from( layout=layout, pixel_scales=1.0 ).native post_cti_data = clocker_1d.add_cti( data=pre_cti_data, trap_list=traps_x2, ccd=ccd ) dataset_line_via_post_cti_data = simulator.from_post_cti_data( post_cti_data=post_cti_data, pre_cti_data=pre_cti_data.native, layout=layout ) assert (dataset_line.data == dataset_line_via_post_cti_data.data).all() assert ( dataset_line.noise_map == dataset_line_via_post_cti_data.noise_map ).all() assert ( dataset_line.pre_cti_data == dataset_line_via_post_cti_data.pre_cti_data ).all()
def test__array_1d_of_non_regions_from(): layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[(0, 3)]) array = ac.Array1D.manual_native(array=[0.0, 1.0, 2.0, 3.0], pixel_scales=1.0) array_extracted = layout.array_1d_of_non_regions_from(array=array) assert (array_extracted == np.array([0.0, 0.0, 0.0, 3.0])).all() layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[(0, 1), (3, 4)]) array_extracted = layout.array_1d_of_non_regions_from(array=array) assert (array_extracted == np.array([0.0, 1.0, 2.0, 0.0])).all()
def test__array_1d_of_edges_and_epers_from(array): layout = ac.Layout1DLine(shape_1d=(10, ), region_list=[(0, 4)]) extracted_array = layout.array_1d_of_edges_and_epers_from( array=array, fpr_pixels=(0, 2), trails_pixels=(0, 2)) assert (extracted_array == np.array( [0.0, 1.0, 0.0, 0.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0])).all() layout = ac.Layout1DLine(shape_1d=(10, ), region_list=[(0, 1), (3, 4)]) extracted_array = layout.array_1d_of_edges_and_epers_from( array=array, fpr_pixels=(0, 1), trails_pixels=(0, 1)) assert (extracted_array == np.array( [0.0, 1.0, 0.0, 3.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0])).all()
def test__pre_cti_data_from(self): simulator = ac.SimulatorDatasetLine(normalization=10.0, pixel_scales=1.0) layout = ac.Layout1DLine(shape_1d=(3,), region_list=[(0, 2)]) pre_cti_data = simulator.pre_cti_data_from(layout=layout, pixel_scales=1.0) print(pre_cti_data) assert (pre_cti_data.native == np.array([10.0, 10.0, 0.0])).all()
def test__masked_front_edges_and_epers_from_layout(): unmasked = ac.Mask1DLine.unmasked(shape_slim=(5, ), pixel_scales=1.0) layout = ac.Layout1DLine(shape_1d=(5, ), region_list=[(1, 3)]) mask = ac.Mask1DLine.masked_fprs_and_epers_from( mask=unmasked, layout=layout, settings=ac.SettingsMask1DLine(front_edge_pixels=(1, 2), trails_pixels=(0, 1)), pixel_scales=0.1, ) assert (mask == np.array([False, False, True, True, False])).all()
def test__no_instrumental_effects_input__only_cti_simulated( self, clocker_1d, traps_x2, ccd ): layout = ac.Layout1DLine(shape_1d=(5,), region_list=[(0, 5)]) simulator = ac.SimulatorDatasetLine( pixel_scales=1.0, normalization=10.0, add_poisson_noise=False ) dataset_line = simulator.from_layout( layout=layout, clocker=clocker_1d, trap_list=traps_x2, ccd=ccd ) assert dataset_line.data == pytest.approx( np.array([9.43, 9.43, 9.43, 9.43, 9.43]), 1e-1 ) assert dataset_line.layout == layout
def test__include_read_noise__is_added_after_cti(self, clocker_1d, traps_x2, ccd): layout = ac.Layout1DLine(shape_1d=(5,), region_list=[(0, 5)]) simulator = ac.SimulatorDatasetLine( pixel_scales=1.0, normalization=10.0, read_noise=1.0, add_poisson_noise=False, noise_seed=1, ) dataset_line = simulator.from_layout( layout=layout, clocker=clocker_1d, trap_list=traps_x2, ccd=ccd ) # Use seed to give us a known read noises map we'll test_autocti for assert dataset_line.data == pytest.approx( np.array([11.05513, 9.36790, 9.47129, 8.92700, 10.8654]), 1e-2 ) assert dataset_line.layout == layout
def test__from_fits__load_pre_cti_data_data_from_the_layout_ci_and_data(self): create_fits(fits_path=fits_path) layout_ci = ac.Layout1DLine(shape_1d=(7,), region_list=[(0, 7)]) imaging = ac.DatasetLine.from_fits( pixel_scales=1.0, layout=layout_ci, data_path=path.join(fits_path, "3_ones.fits"), data_hdu=0, noise_map_path=path.join(fits_path, "3_twos.fits"), noise_map_hdu=0, pre_cti_data_path=path.join(fits_path, "3_threes.fits"), pre_cti_data_hdu=0, ) assert (imaging.data.native == np.ones((7,))).all() assert (imaging.noise_map.native == 2.0 * np.ones((7,))).all() assert (imaging.pre_cti_data.native == 3.0 * np.ones((7,))).all() assert imaging.layout == layout_ci clean_fits(fits_path=fits_path)
__Normalizations__ We require the normalization of the charge in every cti line dataset, as the names of the files are tagged with this. """ normalization_list = [100, 5000, 25000, 84700] """ __Layout__ We use the regions and normalization_list above to create the `Layout1DLine` of every cti-line we fit. This is used for visualizing the model-fit. """ layout_list = [ ac.Layout1DLine( shape_1d=shape_native, region_list=region_1d_list, normalization=normalization, prescan=prescan, overscan=overscan, ) for normalization in normalization_list ] """ __Dataset__ We now load every cti-line dataset, including a noise-map and pre-CTI line containing the data before read-out and therefore without CTI. This uses a`DatasetLine` object. """ dataset_line_list = [ ac.DatasetLine.from_fits( data_path=path.join(dataset_path, f"data_{layout.normalization}.fits"), noise_map_path=path.join(dataset_path, f"noise_map_{layout.normalization}.fits"),
# Test noise noise = np.ones_like(post_cti) * 0.01 # Conversion value for HST ACS pixel_scale = 0.05 # Convert to AutoCTI objects post_cti = ac.Array1D.manual_native(array=post_cti, pixel_scales=pixel_scale) noise = ac.Array1D.manual_native(array=noise, pixel_scales=pixel_scale) pre_cti = ac.Array1D.manual_native(array=pre_cti, pixel_scales=pixel_scale) shape_native = (length, 1) region_1d_list = [(warm_index, warm_index + 1)] normalization = np.sum(pre_cti) layout = ac.Layout1DLine(shape_1d=shape_native, region_list=region_1d_list, normalization=normalization) dataset_line = ac.DatasetLine(data=post_cti, noise_map=noise, pre_cti_data=pre_cti, layout=layout) # Set up fitting CTI model clocker = ac.Clocker1D(express=express) trap_0 = af.Model(ac.TrapInstantCapture) trap_0.density = af.UniformPrior(lower_limit=0.0, upper_limit=20.0) trap_0.release_timescale = af.UniformPrior(lower_limit=0.0, upper_limit=10.0) trap_0.fractional_volume_none_exposed = 0.0 trap_0.fractional_volume_full_exposed = 0.0