예제 #1
0
 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)
예제 #2
0
 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()
예제 #3
0
 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()
예제 #4
0
 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()
예제 #5
0
 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()
예제 #6
0
 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()
예제 #7
0
 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()
예제 #8
0
 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
예제 #10
0
 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()