123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- # -*- coding: utf-8 -*-
- """
- Unit tests for the kCSD methods
- This was written by :
- Chaitanya Chintaluri,
- Laboratory of Neuroinformatics,
- Nencki Institute of Exprimental Biology, Warsaw.
- :license: Modified BSD, see LICENSE.txt for details.
- """
- import unittest
- import neo
- import numpy as np
- import quantities as pq
- from elephant import current_source_density as CSD
- import elephant.current_source_density_src.utility_functions as utils
- class KCSD1D_TestCase(unittest.TestCase):
- def setUp(self):
- self.ele_pos = utils.generate_electrodes(dim=1).reshape(5, 1)
- self.csd_profile = utils.gauss_1d_dipole
- pots = CSD.generate_lfp(self.csd_profile, self.ele_pos)
- self.pots = np.reshape(pots, (-1, 1))
- self.test_method = 'KCSD1D'
- self.test_params = {'h': 50.}
- temp_signals = []
- for ii in range(len(self.pots)):
- temp_signals.append(self.pots[ii])
- self.an_sigs = neo.AnalogSignal(temp_signals * pq.mV,
- sampling_rate=1000 * pq.Hz)
- chidx = neo.ChannelIndex(range(len(self.pots)))
- chidx.analogsignals.append(self.an_sigs)
- chidx.coordinates = self.ele_pos * pq.mm
- chidx.create_relationship()
- def test_kcsd1d_estimate(self, cv_params={}):
- self.test_params.update(cv_params)
- result = CSD.estimate_csd(self.an_sigs, method=self.test_method,
- **self.test_params)
- self.assertEqual(result.t_start, 0.0 * pq.s)
- self.assertEqual(result.sampling_rate, 1000 * pq.Hz)
- self.assertEqual(result.times, [0.] * pq.s)
- self.assertEqual(len(result.annotations.keys()), 1)
- true_csd = self.csd_profile(result.annotations['x_coords'])
- rms = np.linalg.norm(np.array(result[0, :]) - true_csd)
- rms /= np.linalg.norm(true_csd)
- self.assertLess(rms, 0.5, msg='RMS between trueCSD and estimate > 0.5')
- def test_valid_inputs(self):
- self.test_method = 'InvalidMethodName'
- self.assertRaises(ValueError, self.test_kcsd1d_estimate)
- self.test_method = 'KCSD1D'
- self.test_params = {'src_type': 22}
- self.assertRaises(KeyError, self.test_kcsd1d_estimate)
- self.test_method = 'KCSD1D'
- self.test_params = {'InvalidKwarg': 21}
- self.assertRaises(TypeError, self.test_kcsd1d_estimate)
- cv_params = {'InvalidCVArg': np.array((0.1, 0.25, 0.5))}
- self.assertRaises(TypeError, self.test_kcsd1d_estimate, cv_params)
- class KCSD2D_TestCase(unittest.TestCase):
- def setUp(self):
- xx_ele, yy_ele = utils.generate_electrodes(dim=2, res=9,
- xlims=[0.05, 0.95],
- ylims=[0.05, 0.95])
- self.ele_pos = np.vstack((xx_ele, yy_ele)).T
- self.csd_profile = utils.large_source_2D
- pots = CSD.generate_lfp(self.csd_profile, xx_ele, yy_ele, res=100)
- self.pots = np.reshape(pots, (-1, 1))
- self.test_method = 'KCSD2D'
- self.test_params = {'gdx': 0.25, 'gdy': 0.25, 'R_init': 0.08,
- 'h': 50., 'xmin': 0., 'xmax': 1.,
- 'ymin': 0., 'ymax': 1.}
- temp_signals = []
- for ii in range(len(self.pots)):
- temp_signals.append(self.pots[ii])
- self.an_sigs = neo.AnalogSignal(temp_signals * pq.mV,
- sampling_rate=1000 * pq.Hz)
- chidx = neo.ChannelIndex(range(len(self.pots)))
- chidx.analogsignals.append(self.an_sigs)
- chidx.coordinates = self.ele_pos * pq.mm
- chidx.create_relationship()
- def test_kcsd2d_estimate(self, cv_params={}):
- self.test_params.update(cv_params)
- result = CSD.estimate_csd(self.an_sigs, method=self.test_method,
- **self.test_params)
- self.assertEqual(result.t_start, 0.0 * pq.s)
- self.assertEqual(result.sampling_rate, 1000 * pq.Hz)
- self.assertEqual(result.times, [0.] * pq.s)
- self.assertEqual(len(result.annotations.keys()), 2)
- true_csd = self.csd_profile(result.annotations['x_coords'],
- result.annotations['y_coords'])
- rms = np.linalg.norm(np.array(result[0, :]) - true_csd)
- rms /= np.linalg.norm(true_csd)
- self.assertLess(rms, 0.5, msg='RMS ' + str(rms) +
- 'between trueCSD and estimate > 0.5')
- def test_moi_estimate(self):
- result = CSD.estimate_csd(self.an_sigs, method='MoIKCSD',
- MoI_iters=10, lambd=0.0,
- gdx=0.2, gdy=0.2)
- self.assertEqual(result.t_start, 0.0 * pq.s)
- self.assertEqual(result.sampling_rate, 1000 * pq.Hz)
- self.assertEqual(result.times, [0.] * pq.s)
- self.assertEqual(len(result.annotations.keys()), 2)
- def test_valid_inputs(self):
- self.test_method = 'InvalidMethodName'
- self.assertRaises(ValueError, self.test_kcsd2d_estimate)
- self.test_method = 'KCSD2D'
- self.test_params = {'src_type': 22}
- self.assertRaises(KeyError, self.test_kcsd2d_estimate)
- self.test_params = {'InvalidKwarg': 21}
- self.assertRaises(TypeError, self.test_kcsd2d_estimate)
- cv_params = {'InvalidCVArg': np.array((0.1, 0.25, 0.5))}
- self.assertRaises(TypeError, self.test_kcsd2d_estimate, cv_params)
- class KCSD3D_TestCase(unittest.TestCase):
- def setUp(self):
- xx_ele, yy_ele, zz_ele = utils.generate_electrodes(dim=3, res=5,
- xlims=[0.15, 0.85],
- ylims=[0.15, 0.85],
- zlims=[0.15, 0.85])
- self.ele_pos = np.vstack((xx_ele, yy_ele, zz_ele)).T
- self.csd_profile = utils.gauss_3d_dipole
- pots = CSD.generate_lfp(self.csd_profile, xx_ele, yy_ele, zz_ele)
- self.pots = np.reshape(pots, (-1, 1))
- self.test_method = 'KCSD3D'
- self.test_params = {'gdx': 0.05, 'gdy': 0.05, 'gdz': 0.05,
- 'lambd': 5.10896977451e-19, 'src_type': 'step',
- 'R_init': 0.31, 'xmin': 0., 'xmax': 1., 'ymin': 0.,
- 'ymax': 1., 'zmin': 0., 'zmax': 1.}
- temp_signals = []
- for ii in range(len(self.pots)):
- temp_signals.append(self.pots[ii])
- self.an_sigs = neo.AnalogSignal(temp_signals * pq.mV,
- sampling_rate=1000 * pq.Hz)
- chidx = neo.ChannelIndex(range(len(self.pots)))
- chidx.analogsignals.append(self.an_sigs)
- chidx.coordinates = self.ele_pos * pq.mm
- chidx.create_relationship()
- def test_kcsd3d_estimate(self, cv_params={}):
- self.test_params.update(cv_params)
- result = CSD.estimate_csd(self.an_sigs, method=self.test_method,
- **self.test_params)
- self.assertEqual(result.t_start, 0.0 * pq.s)
- self.assertEqual(result.sampling_rate, 1000 * pq.Hz)
- self.assertEqual(result.times, [0.] * pq.s)
- self.assertEqual(len(result.annotations.keys()), 3)
- true_csd = self.csd_profile(result.annotations['x_coords'],
- result.annotations['y_coords'],
- result.annotations['z_coords'])
- rms = np.linalg.norm(np.array(result[0, :]) - true_csd)
- rms /= np.linalg.norm(true_csd)
- self.assertLess(rms, 0.5, msg='RMS ' + str(rms) +
- ' between trueCSD and estimate > 0.5')
- def test_valid_inputs(self):
- self.test_method = 'InvalidMethodName'
- self.assertRaises(ValueError, self.test_kcsd3d_estimate)
- self.test_method = 'KCSD3D'
- self.test_params = {'src_type': 22}
- self.assertRaises(KeyError, self.test_kcsd3d_estimate)
- self.test_params = {'InvalidKwarg': 21}
- self.assertRaises(TypeError, self.test_kcsd3d_estimate)
- cv_params = {'InvalidCVArg': np.array((0.1, 0.25, 0.5))}
- self.assertRaises(TypeError, self.test_kcsd3d_estimate, cv_params)
- if __name__ == '__main__':
- unittest.main()
|