def test_nonuniform_triangle_autocorrelation(): a = 0.7 b = 3 x = np.array([0, b]) t = NonuniformLineScan(x, a * x) r, A = height_height_autocorrelation(t, distances=np.linspace(-4, 4, 101)) assert_almost_equal(A[np.abs(r) < 1e-6][0], a ** 2 * b ** 3 / 3) r3, A3 = height_height_autocorrelation(t.detrend(detrend_mode='center'), distances=[0]) s, = t.physical_sizes assert_almost_equal(A3[0], t.rms_height_from_profile() ** 2 * s) x = np.array([0, 1., 1.3, 1.7, 2.0, 2.5, 3.0]) t = NonuniformLineScan(x, a * x) r2, A2 = height_height_autocorrelation(t, distances=np.linspace(-4, 4, 101)) assert_array_almost_equal(A, A2) r, A = height_height_autocorrelation(t.detrend(detrend_mode='center'), distances=[0]) s, = t.physical_sizes assert_almost_equal(A[0], t.rms_height_from_profile() ** 2 * s)
def test_power_spectrum_from_profile(self): # # this test was added, because there were issues calling # power spectrum 1D with a window given # t = NonuniformLineScan(x=[1, 2, 3, 4], y=[2, 4, 6, 8]) q1, C1 = t.power_spectrum_from_profile(window='hann') q1, C1 = t.detrend('center').power_spectrum_from_profile(window='hann') q1, C1 = t.detrend('center').power_spectrum_from_profile() q1, C1 = t.detrend('height').power_spectrum_from_profile(window='hann') q1, C1 = t.detrend('height').power_spectrum_from_profile()
def test_nonuniform_impulse_autocorrelation(): a = 3 b = 2 x = np.array([0, a]) t = NonuniformLineScan(x, b * np.ones_like(x)) r, A = height_height_autocorrelation(t, distances=np.linspace(-4, 4, 101)) A_ref = b ** 2 * (a - np.abs(r)) A_ref[A_ref < 0] = 0 assert_array_almost_equal(A, A_ref) a = 3 b = 2 x = np.array([-a, 0, 1e-9, a - 1e-9, a, 2 * a]) y = np.zeros_like(x) y[2] = b y[3] = b t = NonuniformLineScan(x, y) r, A = height_height_autocorrelation(t, distances=np.linspace(-4, 4, 101)) A_ref = b ** 2 * (a - np.abs(r)) A_ref[A_ref < 0] = 0 assert_array_almost_equal(A, A_ref) t = t.detrend(detrend_mode='center') r, A = height_height_autocorrelation(t, distances=np.linspace(0, 10, 201)) s, = t.physical_sizes assert_almost_equal(A[0], t.rms_height_from_profile() ** 2 * s)
def test_nonuniform3(self): x = np.array((1, 2, 3, 4)) y = -2 * x surf = NonuniformLineScan(x, y) self.assertFalse(surf.is_uniform) self.assertEqual(surf.dim, 1) der = surf.derivative(n=1) assert_array_equal(der, [-2, -2, -2]) der = surf.derivative(n=2) assert_array_equal(der, [0, 0]) # # Similar with detrend which substracts mean value # surf2 = surf.detrend(detrend_mode='center') self.assertFalse(surf2.is_uniform) self.assertEqual(surf.dim, 1) der = surf2.derivative(n=1) assert_array_equal(der, [-2, -2, -2]) # # Similar with detrend which eliminates slope # surf3 = surf.detrend(detrend_mode='height') self.assertFalse(surf3.is_uniform) self.assertEqual(surf.dim, 1) der = surf3.derivative(n=1) np.testing.assert_allclose(der, [0, 0, 0], atol=1e-14) np.testing.assert_allclose(surf3.heights(), np.zeros(y.shape), atol=1e-14) p = surf3.positions_and_heights() assert_array_equal(p[0], x) np.testing.assert_allclose(p[1], np.zeros(y.shape), atol=1e-14)
def test_nonuniform_curvatures(self): radius = 400. center = 50. # generate a nonregular monotically increasing sery of x xs = np.cumsum(np.random.lognormal(size=20)) xs /= np.max(xs) xs *= 80. heights = 1 / (2 * radius) * (xs - center) ** 2 surface = NonuniformLineScan(xs, heights) detrended = surface.detrend(detrend_mode="curvature") self.assertAlmostEqual(abs(detrended.curvatures[0]), 1 / radius)
def test_nonuniform_quadratic(self): x = np.linspace(0, 10, 11) ** 1.3 a = 1.2 b = 1.8 c = 0.3 y = a + b * x + c * x * x / 2 surf = NonuniformLineScan(x, y) self.assertAlmostEqual(surf.rms_curvature_from_profile(), c) surf = surf.detrend(detrend_mode='height') self.assertAlmostEqual(surf.mean(), 0.0) surf.detrend_mode = 'curvature' self.assertAlmostEqual(surf.mean(), 0.0) self.assertAlmostEqual(surf.rms_slope_from_profile(), 0.0) self.assertAlmostEqual(surf.rms_curvature_from_profile(), 0.0)
def test_nonuniform2(self): x = np.array((1, 2, 3)) y = 2 * x surf = NonuniformLineScan(x, y) self.assertFalse(surf.is_uniform) self.assertEqual(surf.dim, 1) der = surf.derivative(n=1) assert_array_equal(der, [2, 2]) der = surf.derivative(n=2) assert_array_equal(der, [0]) surf = surf.detrend(detrend_mode='height') self.assertFalse(surf.is_uniform) self.assertEqual(surf.dim, 1) der = surf.derivative(n=1) assert_array_equal(der, [0, 0]) assert_array_equal(surf.heights(), np.zeros(y.shape)) p = surf.positions_and_heights() assert_array_equal(p[0], x) assert_array_equal(p[1], np.zeros(y.shape))