123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- # -*- coding: utf-8 -*-
- """
- Unit tests for the phase analysis module.
- :copyright: Copyright 2016 by the Elephant team, see AUTHORS.txt.
- :license: Modified BSD, see LICENSE.txt for details.
- """
- from __future__ import division, print_function
- import unittest
- from neo import SpikeTrain, AnalogSignal
- import numpy as np
- import quantities as pq
- import elephant.phase_analysis
- from numpy.ma.testutils import assert_allclose
- class SpikeTriggeredPhaseTestCase(unittest.TestCase):
- def setUp(self):
- tlen0 = 100 * pq.s
- f0 = 20. * pq.Hz
- fs0 = 1 * pq.ms
- t0 = np.arange(
- 0, tlen0.rescale(pq.s).magnitude,
- fs0.rescale(pq.s).magnitude) * pq.s
- self.anasig0 = AnalogSignal(
- np.sin(2 * np.pi * (f0 * t0).simplified.magnitude),
- units=pq.mV, t_start=0 * pq.ms, sampling_period=fs0)
- self.st0 = SpikeTrain(
- np.arange(50, tlen0.rescale(pq.ms).magnitude - 50, 50) * pq.ms,
- t_start=0 * pq.ms, t_stop=tlen0)
- self.st1 = SpikeTrain(
- [100., 100.1, 100.2, 100.3, 100.9, 101.] * pq.ms,
- t_start=0 * pq.ms, t_stop=tlen0)
- def test_perfect_locking_one_spiketrain_one_signal(self):
- phases, amps, times = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- self.st0,
- interpolate=True)
- assert_allclose(phases[0], - np.pi / 2.)
- assert_allclose(amps[0], 1, atol=0.1)
- assert_allclose(times[0].magnitude, self.st0.magnitude)
- self.assertEqual(len(phases[0]), len(self.st0))
- self.assertEqual(len(amps[0]), len(self.st0))
- self.assertEqual(len(times[0]), len(self.st0))
- def test_perfect_locking_many_spiketrains_many_signals(self):
- phases, amps, times = elephant.phase_analysis.spike_triggered_phase(
- [
- elephant.signal_processing.hilbert(self.anasig0),
- elephant.signal_processing.hilbert(self.anasig0)],
- [self.st0, self.st0],
- interpolate=True)
- assert_allclose(phases[0], -np.pi / 2.)
- assert_allclose(amps[0], 1, atol=0.1)
- assert_allclose(times[0].magnitude, self.st0.magnitude)
- self.assertEqual(len(phases[0]), len(self.st0))
- self.assertEqual(len(amps[0]), len(self.st0))
- self.assertEqual(len(times[0]), len(self.st0))
- def test_perfect_locking_one_spiketrains_many_signals(self):
- phases, amps, times = elephant.phase_analysis.spike_triggered_phase(
- [
- elephant.signal_processing.hilbert(self.anasig0),
- elephant.signal_processing.hilbert(self.anasig0)],
- [self.st0],
- interpolate=True)
- assert_allclose(phases[0], -np.pi / 2.)
- assert_allclose(amps[0], 1, atol=0.1)
- assert_allclose(times[0].magnitude, self.st0.magnitude)
- self.assertEqual(len(phases[0]), len(self.st0))
- self.assertEqual(len(amps[0]), len(self.st0))
- self.assertEqual(len(times[0]), len(self.st0))
- def test_perfect_locking_many_spiketrains_one_signal(self):
- phases, amps, times = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- [self.st0, self.st0],
- interpolate=True)
- assert_allclose(phases[0], -np.pi / 2.)
- assert_allclose(amps[0], 1, atol=0.1)
- assert_allclose(times[0].magnitude, self.st0.magnitude)
- self.assertEqual(len(phases[0]), len(self.st0))
- self.assertEqual(len(amps[0]), len(self.st0))
- self.assertEqual(len(times[0]), len(self.st0))
- def test_interpolate(self):
- phases_int, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- self.st1,
- interpolate=True)
- self.assertLess(phases_int[0][0], phases_int[0][1])
- self.assertLess(phases_int[0][1], phases_int[0][2])
- self.assertLess(phases_int[0][2], phases_int[0][3])
- self.assertLess(phases_int[0][3], phases_int[0][4])
- self.assertLess(phases_int[0][4], phases_int[0][5])
- phases_noint, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- self.st1,
- interpolate=False)
- self.assertEqual(phases_noint[0][0], phases_noint[0][1])
- self.assertEqual(phases_noint[0][1], phases_noint[0][2])
- self.assertEqual(phases_noint[0][2], phases_noint[0][3])
- self.assertEqual(phases_noint[0][3], phases_noint[0][4])
- self.assertNotEqual(phases_noint[0][4], phases_noint[0][5])
- # Verify that when using interpolation and the spike sits on the sample
- # of the Hilbert transform, this is the same result as when not using
- # interpolation with a spike slightly to the right
- self.assertEqual(phases_noint[0][2], phases_int[0][0])
- self.assertEqual(phases_noint[0][4], phases_int[0][0])
- def test_inconsistent_numbers_spiketrains_hilbert(self):
- self.assertRaises(
- ValueError, elephant.phase_analysis.spike_triggered_phase,
- [
- elephant.signal_processing.hilbert(self.anasig0),
- elephant.signal_processing.hilbert(self.anasig0)],
- [self.st0, self.st0, self.st0], False)
- self.assertRaises(
- ValueError, elephant.phase_analysis.spike_triggered_phase,
- [
- elephant.signal_processing.hilbert(self.anasig0),
- elephant.signal_processing.hilbert(self.anasig0)],
- [self.st0, self.st0, self.st0], False)
- def test_spike_earlier_than_hilbert(self):
- # This is a spike clearly outside the bounds
- st = SpikeTrain(
- [-50, 50],
- units='s', t_start=-100*pq.s, t_stop=100*pq.s)
- phases_noint, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- st,
- interpolate=False)
- self.assertEqual(len(phases_noint[0]), 1)
- # This is a spike right on the border (start of the signal is at 0s,
- # spike sits at t=0s). By definition of intervals in
- # Elephant (left borders inclusive, right borders exclusive), this
- # spike is to be considered.
- st = SpikeTrain(
- [0, 50],
- units='s', t_start=-100*pq.s, t_stop=100*pq.s)
- phases_noint, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- st,
- interpolate=False)
- self.assertEqual(len(phases_noint[0]), 2)
- def test_spike_later_than_hilbert(self):
- # This is a spike clearly outside the bounds
- st = SpikeTrain(
- [1, 250],
- units='s', t_start=-1*pq.s, t_stop=300*pq.s)
- phases_noint, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- st,
- interpolate=False)
- self.assertEqual(len(phases_noint[0]), 1)
- # This is a spike right on the border (length of the signal is 100s,
- # spike sits at t=100s). However, by definition of intervals in
- # Elephant (left borders inclusive, right borders exclusive), this
- # spike is not to be considered.
- st = SpikeTrain(
- [1, 100],
- units='s', t_start=-1*pq.s, t_stop=200*pq.s)
- phases_noint, _, _ = elephant.phase_analysis.spike_triggered_phase(
- elephant.signal_processing.hilbert(self.anasig0),
- st,
- interpolate=False)
- self.assertEqual(len(phases_noint[0]), 1)
- if __name__ == '__main__':
- unittest.main()
|