def test_wrong_input_dimensions(self): s = hs.signals.Signal2D(np.ones((2, 10, 10))) with pytest.raises(ValueError): pst._get_corner_values(s) s = hs.signals.Signal2D(np.ones((2, 2, 10, 10))) with pytest.raises(ValueError): pst._get_corner_values(s)
def test_different_corner_values_non_square(self): s = hs.signals.Signal2D(np.zeros((200, 100))) s.data[:10, :5] = 10 s.data[-10:, :5] = 20 s.data[:10, -5:] = 30 s.data[-10:, -5:] = 40 corner_values = pst._get_corner_values(s) assert (corner_values[2] == (10, 20, 30, 40)).all() corner_values = pst._get_corner_values(s, corner_size=0.1) assert (corner_values[2] == (2.5, 5.0, 7.5, 10.0)).all()
def test_crop_square(self): s = hs.signals.Signal2D(np.zeros((200, 200))).isig[50:150, 50:150] corner_values = pst._get_corner_values(s) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (52.0, 52, 0.0)).all() assert (corner_bl == (52.0, 147.0, 0.0)).all() assert (corner_tr == (147.0, 52.0, 0.0)).all() assert (corner_br == (147.0, 147.0, 0.0)).all()
def test_corner_size_parameters(self): s = hs.signals.Signal2D(np.zeros((101, 101))) corner_values = pst._get_corner_values(s, corner_size=0.1) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (5.0, 5.0, 0.0)).all() assert (corner_bl == (5.0, 95.0, 0.0)).all() assert (corner_tr == (95.0, 5.0, 0.0)).all() assert (corner_br == (95.0, 95.0, 0.0)).all()
def test_non_square_shape(self): s = hs.signals.Signal2D(np.zeros((201, 101))) corner_values = pst._get_corner_values(s) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (2.5, 5.0, 0.0)).all() assert (corner_bl == (2.5, 195.0, 0.0)).all() assert (corner_tr == (97.5, 5.0, 0.0)).all() assert (corner_br == (97.5, 195.0, 0.0)).all()
def test_scale(self): s = hs.signals.Signal2D(np.zeros((101, 101))) s.axes_manager[0].scale = 0.5 s.axes_manager[1].scale = 2 corner_values = pst._get_corner_values(s) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (1.25, 5.0, 0.0)).all() assert (corner_bl == (1.25, 195.0, 0.0)).all() assert (corner_tr == (48.75, 5.0, 0.0)).all() assert (corner_br == (48.75, 195.0, 0.0)).all()
def test_offset(self): s = hs.signals.Signal2D(np.zeros((101, 101))) s.axes_manager[0].offset = 10 s.axes_manager[1].offset = -10 corner_values = pst._get_corner_values(s) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (12.5, -7.5, 0.0)).all() assert (corner_bl == (12.5, 87.5, 0.0)).all() assert (corner_tr == (107.5, -7.5, 0.0)).all() assert (corner_br == (107.5, 87.5, 0.0)).all()
def test_simple(self): s = hs.signals.Signal2D(np.zeros((101, 101))) corner_values = pst._get_corner_values(s) assert corner_values.shape == (3, 4) # tl: top left, bl: bottom right, tr: top right, br: bottom right corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (2.5, 2.5, 0.0)).all() assert (corner_bl == (2.5, 97.5, 0.0)).all() assert (corner_tr == (97.5, 2.5, 0.0)).all() assert (corner_br == (97.5, 97.5, 0.0)).all()
def correct_ramp(self, corner_size=0.05, only_offset=False, out=None): """ Subtracts a plane from the signal, useful for removing the effects of d-scan in a STEM beam shift dataset. The plane is calculated by fitting a plane to the corner values of the signal. This will only work well when the property one wants to measure is zero in these corners. Parameters ---------- corner_size : number, optional The size of the corners, as a percentage of the image's axis. If corner_size is 0.05 (5%), and the image is 500 x 1000, the size of the corners will be (500*0.05) x (1000*0.05) = 25 x 50. Default 0.05 only_offset : bool, optional If True, will subtract a "flat" plane, i.e. it will subtract the mean value of the corners. Default False out : optional, DPCSignal2D signal Returns ------- corrected_signal : Signal2D Examples -------- >>> s = pxm.dummy_data.get_square_dpc_signal(add_ramp=True) >>> s_corr = s.correct_ramp() >>> s_corr.plot() Only correct offset >>> s_corr = s.correct_ramp(only_offset=True) >>> s_corr.plot() """ if out is None: output = self.deepcopy() else: output = out for i, s in enumerate(self): if only_offset: corners = pst._get_corner_values(s, corner_size=corner_size)[2] ramp = corners.mean() else: ramp = pst._fit_ramp_to_image(s, corner_size=0.05) output.data[i, :, :] -= ramp if out is None: return output
def test_crop_square_values(self): s = hs.signals.Signal2D(np.zeros((200, 200))) s.data[50:60, 50:60] = 10 s.data[140:150, 50:60] = 20 s.data[50:60, 140:150] = 30 s.data[140:150, 140:150] = 40 s = s.isig[50:150, 50:150] corner_values = pst._get_corner_values(s) corner_tl, corner_bl = corner_values[:, 0], corner_values[:, 1] corner_tr, corner_br = corner_values[:, 2], corner_values[:, 3] assert (corner_tl == (52.0, 52, 10.0)).all() assert (corner_bl == (52.0, 147.0, 20.0)).all() assert (corner_tr == (147.0, 52.0, 30.0)).all() assert (corner_br == (147.0, 147.0, 40.0)).all()