def test_scale_motion(self):
     data = np.array([1, 3, 7, -2, -10, 0])
     gm = GM(data, unit='g', dt=0.1)
     gm_scaled_1 = gm.scale_motion(factor=2.0)  # scale by 2.0
     gm_scaled_2 = gm.scale_motion(target_PGA_in_g=5.0)  # scale by 0.5
     self.assertTrue(np.allclose(gm.accel[:, 1] * 2, gm_scaled_1.accel[:, 1]))
     self.assertTrue(np.allclose(gm.accel[:, 1] * 0.5, gm_scaled_2.accel[:, 1]))
    def test_amplify_by_tf(self):
        #---------- Case 1: An artificial transfer function -------------------
        gm = GM('./files/sample_accel.txt', unit='gal')
        ratio_benchmark = 2.76
        freq = np.arange(0.01, 50, step=0.01)
        tf = ratio_benchmark * np.ones_like(freq)
        transfer_function = Frequency_Spectrum(np.column_stack((freq, tf)))
        new_gm = gm.amplify_by_tf(transfer_function, show_fig=False)
        ratio = new_gm.accel[:, 1] / gm.accel[:, 1]
        self.assertTrue(np.allclose(ratio, ratio_benchmark))

        #---------- Case 2: A transfer function from a Vs profile -------------
        vs_prof = Vs_Profile('./files/profile_FKSH14.txt')
        tf_RO, tf_BH, _ = vs_prof.get_transfer_function()
        gm_with_tf_RO = gm.amplify_by_tf(tf_RO)
        gm_with_tf_BH = gm.amplify_by_tf(tf_BH)

        gm_with_tf_RO_ = gm.amplify(vs_prof, boundary='elastic')
        gm_with_tf_BH_ = gm.amplify(vs_prof, boundary='rigid')

        # Assert that `amplify_by_tf()` and `amplify()` can generate
        # nearly identical results
        self.assertTrue(
            self.nearly_identical(gm_with_tf_RO.accel, gm_with_tf_RO_.accel))
        self.assertTrue(
            self.nearly_identical(gm_with_tf_BH.accel, gm_with_tf_BH_.accel))
 def test_integration__artificial_example(self):
     gm = GM(_join(f_dir, 'two_column_data_example.txt'), unit='m/s/s')
     v_bench = np.array([[0.1000, 0.1000],  # from MATLAB
                         [0.2000, 0.3000],
                         [0.3000, 0.6000],
                         [0.4000, 1.0000],
                         [0.5000, 1.5000],
                         [0.6000, 1.7000],
                         [0.7000, 2.0000],
                         [0.8000, 2.4000],
                         [0.9000, 2.9000],
                         [1.0000, 3.5000],
                         [1.1000, 3.8000],
                         [1.2000, 4.2000],
                         [1.3000, 4.7000],
                         [1.4000, 5.3000],
                         [1.5000, 6.0000]])
     u_bench = np.array([[0.1000, 0.0100],  # from MATLAB
                         [0.2000, 0.0400],
                         [0.3000, 0.1000],
                         [0.4000, 0.2000],
                         [0.5000, 0.3500],
                         [0.6000, 0.5200],
                         [0.7000, 0.7200],
                         [0.8000, 0.9600],
                         [0.9000, 1.2500],
                         [1.0000, 1.6000],
                         [1.1000, 1.9800],
                         [1.2000, 2.4000],
                         [1.3000, 2.8700],
                         [1.4000, 3.4000],
                         [1.5000, 4.0000]])
     self.assertTrue(np.allclose(gm.veloc, v_bench))
     self.assertTrue(np.allclose(gm.displ, u_bench))
 def test_amplify_by_tf__case_1_an_artificial_transfer_function(self):
     gm = GM(_join(f_dir, 'sample_accel.txt'), unit='gal')
     ratio_benchmark = 2.76
     freq = np.arange(0.01, 50, step=0.01)
     tf = ratio_benchmark * np.ones_like(freq)
     transfer_function = Frequency_Spectrum(np.column_stack((freq, tf)))
     new_gm = gm.amplify_by_tf(transfer_function, show_fig=False)
     ratio = new_gm.accel[:, 1] / gm.accel[:, 1]
     self.assertTrue(np.allclose(ratio, ratio_benchmark))
 def test_unit_convert(self):
     data = np.array([1, 3, 7, -2, -10, 0])
     gm = GM(data, unit='m', dt=0.1)
     accel = gm.accel[:, 1]
     accel_in_m = gm._unit_convert(unit='m/s/s')[:, 1]
     accel_in_gal = gm._unit_convert(unit='gal')[:, 1]
     accel_in_g = gm._unit_convert(unit='g')[:, 1]
     self.assertTrue(np.allclose(accel_in_m, accel))
     self.assertTrue(np.allclose(accel_in_gal, accel * 100))
     self.assertTrue(np.allclose(accel_in_g, accel / 9.81))
 def test_filters(self):
     gm = GM('./files/sample_accel.txt', unit='m')
     hp = gm.highpass(cutoff_freq=1.0, show_fig=True)
     lp = gm.lowpass(cutoff_freq=1.0, show_fig=True)
     bp = gm.bandpass(cutoff_freq=[0.5, 8], show_fig=True)
     bs = gm.bandstop(cutoff_freq=[0.5, 8], show_fig=True)
     self.assertTrue(isinstance(hp, GM))
     self.assertTrue(isinstance(lp, GM))
     self.assertTrue(isinstance(bp, GM))
     self.assertTrue(isinstance(bs, GM))
    def test_fourier_transform(self):
        gm = GM(_join(f_dir, 'two_column_data_example.txt'), unit='m/s/s')
        freq, spec = gm.get_Fourier_spectrum(real_val=False).raw_data.T

        freq_bench = [0.6667, 1.3333, 2.0000, 2.6667, 3.3333, 4.0000, 4.6667,
                      5.3333]
        FS_bench = [60.0000 + 0.0000j, -1.5000 + 7.0569j, -1.5000 + 3.3691j,
                    -7.5000 +10.3229j, -1.5000 + 1.3506j, -1.5000 + 0.8660j,
                    -7.5000 + 2.4369j, -1.5000 + 0.1577j]
        self.assertTrue(np.allclose(freq, freq_bench, atol=0.0001, rtol=0.0))
        self.assertTrue(np.allclose(spec, FS_bench, atol=0.0001, rtol=0.0))
 def test_integration__real_world_example(self):
     # Note: In this test, the result by cumulative trapezoidal numerical
     #       integration is used as the benchmark. Since it is infeasible to
     #       achieve perfect "alignment" between the two time histories,
     #       we check the correlation coefficient instead of element-wise
     #       check.
     veloc_ = np.genfromtxt(_join(f_dir, 'sample_accel.txt'))
     gm = GM(veloc_, unit='m/s', motion_type='veloc')
     displ = gm.displ[:, 1]
     displ_cumtrapz = np.append(0, sp.integrate.cumtrapz(veloc_[:, 1], dx=gm.dt))
     r = np.corrcoef(displ_cumtrapz, displ)[1, 1]  # cross-correlation
     self.assertTrue(r >= 0.999)
    def test_plot(self):
        filename = _join(f_dir, 'sample_accel.txt')
        gm = GM(filename, unit='m')

        fig, axes = gm.plot()  # automatically generate fig/ax objects
        self.assertTrue(isinstance(axes, tuple))
        self.assertEqual(len(axes), 3)
        self.assertEqual(axes[0].title.get_text(), os.path.split(filename)[1])

        fig2 = plt.figure(figsize=(8, 8))
        fig2_, axes = gm.plot(fig=fig2)  # feed an external figure object
        self.assertTrue(np.allclose(fig2_.get_size_inches(), (8, 8)))
    def test_loading_data__two_columns_from_file(self):
        # Two columns from file
        gm = GM(_join(f_dir, 'sample_accel.txt'), unit='gal')

        PGA_benchmark = 294.30  # unit: cm/s/s
        PGV_benchmark = 31.46   # unit: cm/s
        PGD_benchmark = 38.77   # unit: cm
        tol = 1e-2

        self.assertAlmostEqual(gm.pga_in_gal, PGA_benchmark, delta=tol)
        self.assertAlmostEqual(gm.pgv_in_cm_s, PGV_benchmark, delta=tol)
        self.assertAlmostEqual(gm.pgd_in_cm, PGD_benchmark, delta=tol)
        self.assertAlmostEqual(gm.peak_Arias_Intensity, 1.524, delta=tol)
        self.assertAlmostEqual(gm.rms_accel, 0.4645, delta=tol)
    def test_amplify_by_tf__case_2_a_transfer_function_from_a_Vs_profile(self):
        gm = GM(_join(f_dir, 'sample_accel.txt'), unit='gal')
        vs_prof = Vs_Profile(_join(f_dir, 'profile_FKSH14.txt'))
        tf_RO, tf_BH, _ = vs_prof.get_transfer_function()
        gm_with_tf_RO = gm.amplify_by_tf(tf_RO)
        gm_with_tf_BH = gm.amplify_by_tf(tf_BH)

        gm_with_tf_RO_ = gm.amplify(vs_prof, boundary='elastic')
        gm_with_tf_BH_ = gm.amplify(vs_prof, boundary='rigid')

        # Assert that `amplify_by_tf()` and `amplify()` can generate
        # nearly identical results
        self.assertTrue(self.nearly_identical(gm_with_tf_RO.accel,
                                              gm_with_tf_RO_.accel))
        self.assertTrue(self.nearly_identical(gm_with_tf_BH.accel,
                                              gm_with_tf_BH_.accel))
    def test_deconvolution(self):
        '''
        Test that `deconvolve()` and `amplify()` are reverse
        operations to each other.
        '''
        gm = GM(_join(f_dir, 'sample_accel.txt'), unit='m')
        vs_prof = Vs_Profile(_join(f_dir, 'profile_FKSH14.txt'))

        for boundary in ['elastic', 'rigid']:
            deconv_motion = gm.deconvolve(vs_prof, boundary=boundary)
            output_motion = deconv_motion.amplify(vs_prof, boundary=boundary)
            self.assertTrue(self.nearly_identical(gm.accel, output_motion.accel))

            amplified_motion = gm.amplify(vs_prof, boundary=boundary)
            output_motion = amplified_motion.deconvolve(vs_prof, boundary=boundary)
            self.assertTrue(self.nearly_identical(gm.accel, output_motion.accel))
    def test_loading_data(self):
        # Two columns from file
        gm = GM('./files/sample_accel.txt', unit='gal')

        PGA_benchmark = 294.30  # unit: cm/s/s
        PGV_benchmark = 31.46  # unit: cm/s
        PGD_benchmark = 38.77  # unit: cm
        tol = 1e-2

        self.assertAlmostEqual(gm.pga_in_gal, PGA_benchmark, delta=tol)
        self.assertAlmostEqual(gm.pgv_in_cm_s, PGV_benchmark, delta=tol)
        self.assertAlmostEqual(gm.pgd_in_cm, PGD_benchmark, delta=tol)
        self.assertAlmostEqual(gm.peak_Arias_Intensity, 1.524, delta=tol)
        self.assertAlmostEqual(gm.rms_accel, 0.4645, delta=tol)

        # Two columns from numpy array
        gm = GM(np.array([[0.1, 0.2, 0.3, 0.4], [1, 2, 3, 4]]).T, unit='m/s/s')
        self.assertAlmostEqual(gm.pga, 4)

        # One column from file
        gm = GM('./files/one_column_data_example.txt', unit='g', dt=0.2)
        self.assertAlmostEqual(gm.pga_in_g, 12.0)

        # One column from numpy array
        gm = GM(np.array([1, 2, 3, 4, 5]), unit='gal', dt=0.1)
        self.assertAlmostEqual(gm.pga_in_gal, 5.0)

        # One column without specifying dt
        error_msg = 'is needed for one-column `data`.'
        with self.assertRaises(ValueError, msg=error_msg):
            gm = GM(np.array([1, 2, 3, 4, 5]), unit='gal')

        # Test invalid unit names
        with self.assertRaises(ValueError, msg='Invalid `unit` name.'):
            GM(np.array([1, 2, 3, 4, 5]), unit='test', dt=0.1)
        with self.assertRaises(ValueError, msg="use '/s/s' instead of 's^2'"):
            GM(np.array([1, 2, 3, 4, 5]), unit='m/s^2', dt=0.1)
 def test_baseline_correction(self):
     gm = GM('./files/sample_accel.txt', unit='m/s/s')
     corrected = gm.baseline_correct(show_fig=True)
     self.assertTrue(isinstance(corrected, GM))
 def test_differentiation(self):
     veloc = np.array([[.1, .2, .3, .4, .5, .6], [1, 3, 7, -1, -3, 5]]).T
     gm = GM(veloc, unit='m', motion_type='veloc')
     accel_benchmark = np.array([[.1, .2, .3, .4, .5, .6],
                                 [0, 20, 40, -80, -20, 80]]).T
     self.assertTrue(np.allclose(gm.accel, accel_benchmark))
 def test_loading_data__test_invalid_unit_names(self):
     # Test invalid unit names
     with self.assertRaisesRegex(ValueError, 'Invalid `unit` name.'):
         GM(np.array([1, 2, 3, 4, 5]), unit='test', dt=0.1)
     with self.assertRaisesRegex(ValueError, r"use '/s/s' instead of 's\^2'"):
         GM(np.array([1, 2, 3, 4, 5]), unit='m/s^2', dt=0.1)
 def test_loading_data__one_column_without_specifying_dt(self):
     # One column without specifying dt
     error_msg = 'is needed for one-column `data`.'
     with self.assertRaisesRegex(ValueError, error_msg):
         gm = GM(np.array([1, 2, 3, 4, 5]), unit='gal')
 def test_loading_data__one_column_from_numpy_array(self):
     # One column from numpy array
     gm = GM(np.array([1, 2, 3, 4, 5]), unit='gal', dt=0.1)
     self.assertAlmostEqual(gm.pga_in_gal, 5.0)
 def test_loading_data__one_column_from_file(self):
     # One column from file
     gm = GM(_join(f_dir, 'one_column_data_example.txt'), unit='g', dt=0.2)
     self.assertAlmostEqual(gm.pga_in_g, 12.0)
 def test_loading_data__two_columns_from_numpy_array(self):
     # Two columns from numpy array
     gm = GM(np.array([[0.1, 0.2, 0.3, 0.4], [1, 2, 3, 4]]).T, unit='m/s/s')
     self.assertAlmostEqual(gm.pga, 4)
    def test_integration_and_differentiation(self):
        '''
        Test that converting among acceleration/velocity/displacement is
        correct.
        '''
        #------- Test differentiation -------
        veloc = np.array([[.1, .2, .3, .4, .5, .6], [1, 3, 7, -1, -3, 5]]).T
        gm = GM(veloc, unit='m', motion_type='veloc')
        accel_benchmark = np.array([[.1, .2, .3, .4, .5, .6],
                                    [0, 20, 40, -80, -20, 80]]).T
        self.assertTrue(np.allclose(gm.accel, accel_benchmark))

        #------- Test integartion (artificial example) ----------
        gm = GM('./files/two_column_data_example.txt', unit='m/s/s')
        v_bench = np.array([
            [0.1000, 0.1000],  # from MATLAB
            [0.2000, 0.3000],
            [0.3000, 0.6000],
            [0.4000, 1.0000],
            [0.5000, 1.5000],
            [0.6000, 1.7000],
            [0.7000, 2.0000],
            [0.8000, 2.4000],
            [0.9000, 2.9000],
            [1.0000, 3.5000],
            [1.1000, 3.8000],
            [1.2000, 4.2000],
            [1.3000, 4.7000],
            [1.4000, 5.3000],
            [1.5000, 6.0000]
        ])
        u_bench = np.array([
            [0.1000, 0.0100],  # from MATLAB
            [0.2000, 0.0400],
            [0.3000, 0.1000],
            [0.4000, 0.2000],
            [0.5000, 0.3500],
            [0.6000, 0.5200],
            [0.7000, 0.7200],
            [0.8000, 0.9600],
            [0.9000, 1.2500],
            [1.0000, 1.6000],
            [1.1000, 1.9800],
            [1.2000, 2.4000],
            [1.3000, 2.8700],
            [1.4000, 3.4000],
            [1.5000, 4.0000]
        ])
        self.assertTrue(np.allclose(gm.veloc, v_bench))
        self.assertTrue(np.allclose(gm.displ, u_bench))

        #------- Test integration (real-world example) -------
        # Note: In this test, the result by cumulative trapezoidal numerical
        #       integration is used as the benchmark. Since it is infeasible to
        #       achieve perfect "alignment" between the two time histories,
        #       we check the correlation coefficient instead of element-wise
        #       check.
        veloc_ = np.genfromtxt('./files/sample_accel.txt')
        gm = GM(veloc_, unit='m/s', motion_type='veloc')
        displ = gm.displ[:, 1]
        displ_cumtrapz = np.append(
            0, sp.integrate.cumtrapz(veloc_[:, 1], dx=gm.dt))
        r = np.corrcoef(displ_cumtrapz, displ)[1, 1]  # cross-correlation
        self.assertTrue(r >= 0.999)
 def test_baseline_correction(self):
     gm = GM(_join(f_dir, 'sample_accel.txt'), unit='m/s/s')
     corrected = gm.baseline_correct(show_fig=True)
     self.assertTrue(isinstance(corrected, GM))
 def test_low_pass_filter(self):
     gm = GM(_join(f_dir, 'sample_accel.txt'), unit='m')
     lp = gm.lowpass(cutoff_freq=1.0, show_fig=True)
     self.assertTrue(isinstance(lp, GM))
 def test_amplify_via_profile(self):
     gm = GM(_join(f_dir, 'sample_accel.txt'), unit='m')
     vs_prof = Vs_Profile(_join(f_dir, 'profile_FKSH14.txt'))
     output_motion = gm.amplify(vs_prof, boundary='elastic')
     self.assertTrue(isinstance(output_motion, GM))
 def test_band_stop_filter(self):
     gm = GM(_join(f_dir, 'sample_accel.txt'), unit='m')
     bs = gm.bandstop(cutoff_freq=[0.5, 8], show_fig=True)
     self.assertTrue(isinstance(bs, GM))