示例#1
0
    def test_source_inside(self):
        sensors = [self.sensor_0, self.sensor_6]

        # _source_inside -> True
        source = swprocess.Source(x=3, y=0, z=0)
        array = swprocess.Array1D(sensors, source)
        self.assertTrue(array._source_inside)

        # _source_inside -> False
        source = swprocess.Source(x=-10, y=0, z=0)
        array = swprocess.Array1D(sensors, source)
        self.assertFalse(array._source_inside)
示例#2
0
    def test_flip_required(self):
        sensors = [self.sensor_0, self.sensor_1]

        # _flip_required -> True
        source = swprocess.Source(x=3, y=0, z=0)
        array = swprocess.Array1D(sensors, source)
        self.assertTrue(array._flip_required)

        # _flip_required -> False
        source = swprocess.Source(x=-5, y=0, z=0)
        array = swprocess.Array1D(sensors, source)
        self.assertFalse(array._flip_required)
示例#3
0
    def test_from_array1ds(self):
        # Define source.
        source = swprocess.Source(x=-5, y=0, z=0)

        # Create signal array.
        s_sensors = []
        for n in range(5):
            amp = 5 * np.random.random(100)
            s_sensors.append(
                swprocess.Sensor1C(amp, dt=0.01, x=2 * n, y=0, z=0))
        signal = swprocess.Array1D(s_sensors, source)

        # Create noise array.
        n_sensors = []
        for n in range(5):
            amp = np.random.random(100)
            n_sensors.append(
                swprocess.Sensor1C(amp, dt=0.01, x=2 * n, y=0, z=0))
        noise = swprocess.Array1D(n_sensors, source)

        # Calculate SNR
        fmin, fmax = 5, 50
        snr = swprocess.snr.SignaltoNoiseRatio.from_array1ds(signal,
                                                             noise,
                                                             fmin=fmin,
                                                             fmax=fmax)
        expected = np.arange(fmin, fmax + signal[0].df, signal[0].df)
        returned = snr.frequencies
        self.assertArrayAlmostEqual(expected, returned)

        # Fail due to unequal samples
        noise.trim(0, 0.25)
        self.assertRaises(IndexError,
                          swprocess.snr.SignaltoNoiseRatio.from_array1ds,
                          signal,
                          noise,
                          fmin=fmin,
                          fmax=fmax)

        # Pass after padding
        snr = swprocess.snr.SignaltoNoiseRatio.from_array1ds(
            signal,
            noise,
            fmin=fmin,
            fmax=fmax,
            pad_snr=True,
            df_snr=signal[0].df)
        expected = np.arange(fmin, fmax + signal[0].df, signal[0].df)
        returned = snr.frequencies
        self.assertArrayAlmostEqual(expected, returned)
示例#4
0
    def test_eq(self):
        source_0 = swprocess.Source(0, 0, 0)
        source_1 = swprocess.Source(1, 0, 0)
        array_a = swprocess.Array1D([self.sensor_0, self.sensor_1], source_0)
        array_b = "array1d"
        array_c = swprocess.Array1D([self.sensor_0], source_0)
        array_d = swprocess.Array1D([self.sensor_0, self.sensor_1], source_1)
        array_e = swprocess.Array1D([self.sensor_5, self.sensor_6], source_0)
        array_f = swprocess.Array1D([self.sensor_0, self.sensor_1], source_0)

        self.assertFalse(array_a == array_b)
        self.assertFalse(array_a == array_c)
        self.assertFalse(array_a == array_d)
        self.assertFalse(array_a == array_e)
        self.assertFalse(array_a != array_f)
示例#5
0
    def test_init(self):
        # Basic
        source = swprocess.Source(x=-5, y=0, z=0)
        sensors = [self.sensor_0, self.sensor_1]
        array = swprocess.Array1D(sensors=sensors, source=source)
        self.assertEqual(array.source, source)
        self.assertListEqual(array.sensors, sensors)

        # Bad: Invalid sensors
        self.assertRaises(ValueError,
                          swprocess.Array1D,
                          sensors=[self.sensor_5, self.sensor_5],
                          source=source)

        # Bad: Incompatable sensors
        sensor_bad = swprocess.Sensor1C(amplitude=[1, 2, 3, 4],
                                        dt=1,
                                        x=7,
                                        y=0,
                                        z=0,
                                        nstacks=1,
                                        delay=0)
        self.assertRaises(ValueError,
                          swprocess.Array1D,
                          sensors=[self.sensor_5, sensor_bad],
                          source=source)
示例#6
0
    def test_to_and_from_su(self):
        spacing = 2
        sensors = []
        nsamples = 1000
        time = np.arange(0, 1, 1 / nsamples)
        for n in range(24):
            sensor = swprocess.Sensor1C(amplitude=np.sin(2 * np.pi * n * time),
                                        dt=1 / nsamples,
                                        x=spacing * n,
                                        y=0,
                                        z=0,
                                        nstacks=1,
                                        delay=0)
            sensors.append(sensor)
        source = swprocess.Source(x=-10, y=0, z=0)

        expected = swprocess.Array1D(sensors, source)

        # To and from : SU
        fname = "to_file.su"
        expected.to_file(fname)
        returned = swprocess.Array1D.from_files(fname)
        self.assertEqual(expected, returned)
        os.remove(fname)

        # Bad : format
        self.assertRaises(ValueError, expected.to_file, fname, ftype="seg2")
示例#7
0
    def test_auto_pick_first_arrivals(self):
        s1 = swprocess.Sensor1C(np.concatenate(
            (np.zeros(100), np.array([0.1, 0, 0]), np.zeros(100))),
                                dt=1,
                                x=1,
                                y=0,
                                z=0)
        s2 = swprocess.Sensor1C(np.concatenate(
            (np.zeros(100), np.array([0, 0.2, 0]), np.zeros(100))),
                                dt=1,
                                x=2,
                                y=0,
                                z=0)
        source = swprocess.Source(0, 0, 0)
        array = swprocess.Array1D([s1, s2], source)

        # algorithm = "threshold"
        position, times = array.auto_pick_first_arrivals(algorithm="threshold")
        self.assertListEqual(array.position(), position)
        self.assertListEqual([100, 101], times)

        # algorithm = "bad"
        self.assertRaises(NotImplementedError,
                          array.auto_pick_first_arrivals,
                          algorithm="bad")
示例#8
0
    def test_plot(self):
        # Basic case (near-side, 2m spacing)
        fname = self.wghs_path + "1.dat"
        swprocess.Array1D.from_files(fname).plot()

        # Non-linear spacing
        sensors = [
            swprocess.Sensor1C(
                [1, 2, 3],
                dt=1,
                x=x,
                y=0,
                z=0,
            ) for x in [0, 1, 3]
        ]
        source = swprocess.Source(x=-5, y=0, z=0)
        array = swprocess.Array1D(sensors=sensors, source=source)
        array.plot()

        # Basic case (far-side, 2m spacing)
        fname = self.wghs_path + "20.dat"
        swprocess.Array1D.from_files(fname).plot()

        plt.show(block=False)
        plt.close("all")
示例#9
0
    def test_timeseriesmatrix(self):
        source = swprocess.Source(x=-5, y=0, z=0)
        sensors = [self.sensor_0, self.sensor_1, self.sensor_5, self.sensor_6]
        array = swprocess.Array1D(sensors=sensors, source=source)
        base = np.array([[-.1] * 9 + [-0.11] + [-.1] * 9,
                         [0.2] * 9 + [+0.25] + [0.2] * 9,
                         [1.0] * 9 + [+1.05] + [1.0] * 9,
                         [2.0] * 9 + [+2.02] + [2.0] * 9])

        # detrend=False, normalize="none"
        expected = base
        returned = array.timeseriesmatrix(detrend=False, normalize="none")
        self.assertArrayEqual(expected, returned)

        # detrend=False, normalize="each"
        expected = base / np.array([0.11, 0.25, 1.05, 2.02]).reshape(4, 1)
        returned = array.timeseriesmatrix(detrend=False, normalize="each")
        self.assertArrayEqual(expected, returned)

        # detrend=False, normalize="all"
        expected = base / 2.02
        returned = array.timeseriesmatrix(detrend=False, normalize="all")
        self.assertArrayEqual(expected, returned)

        # detrend=True, normalize="none"
        expected = base - np.array([-.1, 0.2, 1, 2]).reshape(4, 1)
        returned = array.timeseriesmatrix(detrend=True, normalize="none")
        self.assertArrayAlmostEqual(expected, returned, places=2)
示例#10
0
    def test_from_array1d(self):
        source = swprocess.Source(1, 0, 0)

        # Non-normalized
        sensors = [self.sensor_1, self.sensor_5]
        expected = swprocess.Array1D(sensors, source)
        returned = swprocess.Array1D.from_array1d(expected)
        self.assertEqual(expected, returned)
示例#11
0
    def test_offsets(self):
        source = swprocess.Source(x=-5, y=0, z=0)
        sensors = [self.sensor_1, self.sensor_5, self.sensor_6]
        array = swprocess.Array1D(sensors=sensors, source=source)

        # simple
        returned = array.offsets
        expected = [5 + 1, 5 + 5, 5 + 6]
        self.assertListEqual(expected, returned)
示例#12
0
 def dummy_array(amp, dt, nstacks, delay, nsensors, spacing, source_x):
     """Make simple dummy array from timeseries for testing."""
     sensors = []
     for i in range(nsensors):
         sensor = swprocess.Sensor1C(amp,
                                     dt,
                                     x=i * spacing,
                                     y=0,
                                     z=0,
                                     nstacks=nstacks,
                                     delay=delay)
         sensors.append(sensor)
     source = swprocess.Source(x=source_x, y=0, z=0)
     return swprocess.Array1D(sensors=sensors, source=source)
示例#13
0
    def test_position(self):
        source = swprocess.Source(x=-5, y=0, z=0)
        sensors = [self.sensor_1, self.sensor_5, self.sensor_6]
        array = swprocess.Array1D(sensors=sensors, source=source)

        # normalize=False
        returned = array.position(normalize=False)
        expected = [1, 5, 6]
        self.assertListEqual(expected, returned)

        # normalize=True
        returned = array.position(normalize=True)
        expected = [0, 4, 5]
        self.assertListEqual(expected, returned)
示例#14
0
    def test_from_array(self):
        class SubEmpty(swprocess.wavefieldtransforms.EmptyWavefieldTransform):

            @classmethod
            def _create_vector(cls, *args, **kwargs):
                cls._create_vector_args = args
                cls._create_vector_kwargs = kwargs

        sensors = [swprocess.Sensor1C([0]*100, 0.01, 2*n, 0, 0)
                   for n in range(5)]
        source = swprocess.Source(-5, 0, 0)
        array = swprocess.Array1D(sensors, source)
        settings = dict(fmin=5, fmax=50, vmin=75,
                        vmax=300, nvel=30, vspace="lin")
        empty = SubEmpty.from_array(array, settings)

        self.assertArrayEqual(np.arange(5., 50+1, 1), empty.frequencies)
        expected = (settings["vmin"], settings["vmax"], settings["nvel"], settings["vspace"])
        returned = empty._create_vector_args
        self.assertTupleEqual(expected, returned)
        self.assertDictEqual({}, empty._create_vector_kwargs)
示例#15
0
    def test_spacing(self):
        # constant spacing
        for spacing in [1, 2, 5.5]:
            array = self.dummy_array(amp=[0, 0, 0],
                                     dt=1,
                                     nstacks=1,
                                     delay=0,
                                     nsensors=3,
                                     spacing=spacing,
                                     source_x=-5)
            self.assertEqual(spacing, array.spacing)

        # non-constant spacing
        source = swprocess.Source(x=-10, y=0, z=0)
        sensors = [self.sensor_0, self.sensor_5, self.sensor_6]
        array = swprocess.Array1D(sensors=sensors, source=source)
        try:
            array.spacing
        except ValueError:
            raised_error = True
        else:
            raised_error = False
        finally:
            self.assertTrue(raised_error)