示例#1
0
    def test_relcal_using_dict(self):
        """
        Tests using paz dictionary instead of a gse2 file.
        """
        st1 = read(os.path.join(self.path, 'ref_STS2'))
        st2 = read(os.path.join(self.path, 'ref_unknown'))
        calfile = os.path.join(self.path, 'STS2_simp.cal')
        calpaz = dict()
        calpaz['poles'] = [-0.03677 + 0.03703j, -0.03677 - 0.03703j]
        calpaz['zeros'] = [0 + 0j, 0 - 0j]
        calpaz['sensitivity'] = 1500

        # stream
        freq, amp, phase = rel_calib_stack(st1,
                                           st2,
                                           calfile,
                                           20,
                                           smooth=10,
                                           save_data=False)
        # traces
        freq2, amp2, phase2 = rel_calib_stack(st1,
                                              st2,
                                              calpaz,
                                              20,
                                              smooth=10,
                                              save_data=False)
        np.testing.assert_array_almost_equal(freq, freq2, decimal=4)
        np.testing.assert_array_almost_equal(amp, amp2, decimal=4)
        np.testing.assert_array_almost_equal(phase, phase2, decimal=4)
示例#2
0
    def test_relcal_different_overlaps(self):
        """
        Tests using different window overlap percentages.

        Regression test for bug #1821.
        """
        st1 = read(os.path.join(self.path, 'ref_STS2'))
        st2 = read(os.path.join(self.path, 'ref_unknown'))
        calfile = os.path.join(self.path, 'STS2_simp.cal')

        def median_amplitude_plateau(freq, amp):
            # resulting response is pretty much flat in this frequency range
            return np.median(amp[(freq >= 0.3) & (freq <= 3)])

        # correct results using default overlap fraction of 0.5
        freq, amp, phase = rel_calib_stack(
            st1, st2, calfile, 20, smooth=10, overlap_frac=0.5,
            save_data=False)
        amp_expected = median_amplitude_plateau(freq, amp)
        for overlap in np.linspace(0.1, 0.9, 5):
            freq2, amp2, phase2 = rel_calib_stack(
                st1, st2, calfile, 20, smooth=10, overlap_frac=overlap,
                save_data=False)
            amp_got = median_amplitude_plateau(freq2, amp2)
            percentual_difference = abs(
                (amp_expected - amp_got) / amp_expected)
            # make sure results are close for any overlap choice
            self.assertTrue(percentual_difference < 0.01)
示例#3
0
 def test_relcalUsingTraces(self):
     """
     Tests using traces instead of stream objects as input parameters.
     """
     st1 = read(os.path.join(self.path, "ref_STS2"))
     st2 = read(os.path.join(self.path, "ref_unknown"))
     calfile = os.path.join(self.path, "STS2_simp.cal")
     # stream
     freq, amp, phase = rel_calib_stack(st1, st2, calfile, 20, smooth=10, save_data=False)
     # traces
     freq2, amp2, phase2 = rel_calib_stack(st1[0], st2[0], calfile, 20, smooth=10, save_data=False)
     np.testing.assert_array_almost_equal(freq, freq2, decimal=4)
     np.testing.assert_array_almost_equal(amp, amp2, decimal=4)
     np.testing.assert_array_almost_equal(phase, phase2, decimal=4)
示例#4
0
 def test_relcal_using_traces(self):
     """
     Tests using traces instead of stream objects as input parameters.
     """
     st1 = read(os.path.join(self.path, 'ref_STS2'))
     st2 = read(os.path.join(self.path, 'ref_unknown'))
     calfile = os.path.join(self.path, 'STS2_simp.cal')
     # stream
     freq, amp, phase = rel_calib_stack(st1, st2, calfile, 20, smooth=10,
                                        save_data=False)
     # traces
     freq2, amp2, phase2 = rel_calib_stack(st1[0], st2[0], calfile, 20,
                                           smooth=10, save_data=False)
     np.testing.assert_array_almost_equal(freq, freq2, decimal=4)
     np.testing.assert_array_almost_equal(amp, amp2, decimal=4)
     np.testing.assert_array_almost_equal(phase, phase2, decimal=4)
示例#5
0
    def test_relcal_using_dict(self):
        """
        Tests using paz dictionary instead of a gse2 file.
        """
        st1 = read(os.path.join(self.path, 'ref_STS2'))
        st2 = read(os.path.join(self.path, 'ref_unknown'))
        calfile = os.path.join(self.path, 'STS2_simp.cal')
        calpaz = dict()
        calpaz['poles'] = [-0.03677 + 0.03703j, -0.03677 - 0.03703j]
        calpaz['zeros'] = [0 + 0j, 0 - 0j]
        calpaz['sensitivity'] = 1500

        # stream
        freq, amp, phase = rel_calib_stack(st1, st2, calfile, 20, smooth=10,
                                           save_data=False)
        # traces
        freq2, amp2, phase2 = rel_calib_stack(st1, st2, calpaz, 20,
                                              smooth=10, save_data=False)
        np.testing.assert_array_almost_equal(freq, freq2, decimal=4)
        np.testing.assert_array_almost_equal(amp, amp2, decimal=4)
        np.testing.assert_array_almost_equal(phase, phase2, decimal=4)
示例#6
0
    def test_relcal_sts2_vs_unknown(self):
        """
        Test relative calibration of unknown instrument vs STS2 in the same
        time range. Window length is set to 20 s, smoothing rate to 10.
        """
        st1 = read(os.path.join(self.path, 'ref_STS2'))
        st2 = read(os.path.join(self.path, 'ref_unknown'))
        calfile = os.path.join(self.path, 'STS2_simp.cal')

        with TemporaryWorkingDirectory():
            freq, amp, phase = rel_calib_stack(st1,
                                               st2,
                                               calfile,
                                               20,
                                               smooth=10,
                                               save_data=True)
            self.assertTrue(os.path.isfile("0438.EHZ.20.resp"))
            self.assertTrue(os.path.isfile("STS2.refResp"))
            freq_, amp_, phase_ = np.loadtxt("0438.EHZ.20.resp", unpack=True)
            self.assertTrue(np.allclose(freq, freq_, rtol=1e-8, atol=1e-8))
            self.assertTrue(np.allclose(amp, amp_, rtol=1e-8, atol=1e-8))
            self.assertTrue(np.allclose(phase, phase_, rtol=1e-8, atol=1e-8))

        # read in the reference responses
        un_resp = np.loadtxt(os.path.join(self.path, 'unknown.resp'))
        kn_resp = np.loadtxt(os.path.join(self.path, 'STS2.refResp'))

        # bug resolved with 2f9876d, arctan was used which maps to
        # [-pi/2, pi/2]. arctan2 or np.angle shall be used instead
        # correct the test data by hand
        un_resp[:, 2] = np.unwrap(un_resp[:, 2] * 2) / 2
        if False:
            import matplotlib.pyplot as plt
            plt.plot(freq, un_resp[:, 2], 'b', label='reference', alpha=.8)
            plt.plot(freq, phase, 'r', label='new', alpha=.8)
            plt.xlim(-10, None)
            plt.legend()
            plt.show()

        # test if freq, amp and phase match the reference values
        np.testing.assert_array_almost_equal(freq, un_resp[:, 0], decimal=4)
        np.testing.assert_array_almost_equal(freq, kn_resp[:, 0], decimal=4)
        np.testing.assert_array_almost_equal(amp, un_resp[:, 1], decimal=4)
        # TODO: unknown why the first frequency mismatches so much
        np.testing.assert_array_almost_equal(phase[1:],
                                             un_resp[1:, 2],
                                             decimal=4)
示例#7
0
    def test_relcal_sts2_vs_unknown(self):
        """
        Test relative calibration of unknown instrument vs STS2 in the same
        time range. Window length is set to 20 s, smoothing rate to 10.
        """
        st1 = read(os.path.join(self.path, 'ref_STS2'))
        st2 = read(os.path.join(self.path, 'ref_unknown'))
        calfile = os.path.join(self.path, 'STS2_simp.cal')

        with TemporaryWorkingDirectory():
            freq, amp, phase = rel_calib_stack(st1, st2, calfile, 20,
                                               smooth=10, save_data=True)
            self.assertTrue(os.path.isfile("0438.EHZ.20.resp"))
            self.assertTrue(os.path.isfile("STS2.refResp"))
            freq_, amp_, phase_ = np.loadtxt("0438.EHZ.20.resp", unpack=True)
            self.assertTrue(np.allclose(freq, freq_, rtol=1e-8, atol=1e-8))
            self.assertTrue(np.allclose(amp, amp_, rtol=1e-8, atol=1e-8))
            self.assertTrue(np.allclose(phase, phase_, rtol=1e-8, atol=1e-8))

        # read in the reference responses
        un_resp = np.loadtxt(os.path.join(self.path, 'unknown.resp'))
        kn_resp = np.loadtxt(os.path.join(self.path, 'STS2.refResp'))

        # bug resolved with 2f9876d, arctan was used which maps to
        # [-pi/2, pi/2]. arctan2 or np.angle shall be used instead
        # correct the test data by hand
        un_resp[:, 2] = np.unwrap(un_resp[:, 2] * 2) / 2
        if False:
            import matplotlib.pyplot as plt
            plt.plot(freq, un_resp[:, 2], 'b', label='reference', alpha=.8)
            plt.plot(freq, phase, 'r', label='new', alpha=.8)
            plt.xlim(-10, None)
            plt.legend()
            plt.show()

        # test if freq, amp and phase match the reference values
        np.testing.assert_array_almost_equal(freq, un_resp[:, 0],
                                             decimal=4)
        np.testing.assert_array_almost_equal(freq, kn_resp[:, 0],
                                             decimal=4)
        np.testing.assert_array_almost_equal(amp, un_resp[:, 1],
                                             decimal=4)
        # TODO: unknown why the first frequency mismatches so much
        np.testing.assert_array_almost_equal(phase[1:], un_resp[1:, 2],
                                             decimal=4)