# -*- coding: utf-8 -*-
#
# test_mc_neuron.py
#
# This file is part of NEST.
#
# Copyright (C) 2004 The NEST Initiative
#
# NEST is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# NEST is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with NEST. If not, see <http://www.gnu.org/licenses/>.
import unittest
import nest
import numpy as np
HAVE_GSL = nest.sli_func("statusdict/have_gsl ::")
[docs]@unittest.skipIf(not HAVE_GSL, 'GSL is not available')
class TestMCNeuron(unittest.TestCase):
# neuron parameter
V_th = -60.0 # threshold potential
V_reset = -65.0 # reset potential
t_ref = 10.0 # refractory period
g_sp = 5.0 # somato-proximal coupling conductance
soma = {'g_L': 12.0} # somatic leak conductance
tau_syn_ex = 1.0 # proximal excitatory synaptic time constants
tau_syn_in = 5.0 # proximal inhibitory synaptic time constants
proximal = {'tau_syn_ex': tau_syn_ex, 'tau_syn_in': tau_syn_in}
distal = {'C_m': 90.0} # distal capacitance
# paramter for recording time of compartements
rec_dic_dc_soma = {'start': 250.0, 'stop': 300.0, 'amplitude': 50.0}
rec_dic_dc_proximal = {'start': 150.0, 'stop': 200.0, 'amplitude': -50.0}
rec_dic_dc_distal = {'start': 50.0, 'stop': 100.0, 'amplitude': 100.0}
rec_sp_soma_ex = [600.0, 620.0] # soma excitatory
rec_sp_soma_in = [610.0, 630.0] # soma inhibitory
rec_sp_prox_ex = [500.0, 520.0] # proximal excitatory
rec_sp_prox_in = [510.0, 530.0] # proximal inhibitory
rec_sp_dist_ex = [400.0, 420.0] # distal excitatory
rec_sp_dist_in = [410.0, 430.0] # distal inhibitory
# simulation time
t0 = 700 # simulation time of initial simulation
t_stim = 300 # simulation time of with stimulation of soma
# strength of instrinsic current in soma
I_e = 150.0
# test data
Vm_soma_test = np.asarray([-70.00033871, -70.00033626, -70.00033383,
-70.00033141, -70.00032901, -70.00032662,
-70.00032426, -70.00032191, -70.00031957,
-70.00031725, -70.00030162, -70.00021189,
-69.99998874, -69.99958683, -69.99897263,
-69.99812256, -69.99702137, -69.99566068,
-69.99403779, -69.99215463])
Vm_prox_test = np.asarray([-70.00041394, -70.00041065, -70.00040738,
-70.00040414, -70.00040093, -70.00039774,
-70.00039457, -70.00039143, -70.00038832,
-70.00038523, -69.98857137, -69.95638129,
-69.90815375, -69.84758846, -69.77782368,
-69.70150641, -69.62085572, -69.53771917,
-69.45362308, -69.36981694])
Vm_dist_test = np.asarray([-70.0003797, -70.00037554, -70.00037143,
-70.00036737, -70.00036335, -70.00035938,
-70.00035545, -70.00035157, -70.00034773,
-70.00034393, -70.00033573, -70.00030289,
-70.00022565, -70.00008895, -69.99988167,
-69.99959601, -69.99922696, -69.9987718,
-69.9982297, -69.99760137])
gex_soma_test = np.zeros(20)
gex_prox_test = np.array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0.24596033, 0.44510821, 0.60412585,
0.72884756, 0.82436068, 0.89509487,
0.94490122, 0.97712226, 0.99465388,
1.00000005])
gex_dist_test = np.zeros(20)
# position of test data
I0, I1 = 5000, 5020
[docs] def setUp(self):
nest.ResetKernel()
nest.SetDefaults('iaf_cond_alpha_mc',
{'V_th': self.V_th,
'V_reset': self.V_reset,
't_ref': self.t_ref,
'g_sp': self.g_sp,
'soma': self.soma,
'proximal': self.proximal,
'distal': self.distal
})
[docs] def setUpNodes(self):
self.n = nest.Create('iaf_cond_alpha_mc')
rqs = nest.GetDefaults('iaf_cond_alpha_mc')['recordables']
self.mm = nest.Create('multimeter', params={'record_from': rqs,
'interval': 0.1})
self.cgs = nest.Create('dc_generator', 3)
nest.SetStatus(self.cgs, [self.rec_dic_dc_soma,
self.rec_dic_dc_proximal,
self.rec_dic_dc_distal])
self.sgs = nest.Create('spike_generator', 6)
nest.SetStatus(self.sgs, [{'spike_times': self.rec_sp_soma_ex},
{'spike_times': self.rec_sp_soma_in},
{'spike_times': self.rec_sp_prox_ex},
{'spike_times': self.rec_sp_prox_in},
{'spike_times': self.rec_sp_dist_ex},
{'spike_times': self.rec_sp_dist_in}])
[docs] def setUpNetwork(self):
syns = nest.GetDefaults('iaf_cond_alpha_mc')['receptor_types']
label = ['soma_curr', 'proximal_curr', 'distal_curr', 'soma_exc',
'soma_inh', 'proximal_exc', 'proximal_inh', 'distal_exc',
'distal_inh']
nest.Connect(self.mm, self.n)
for i, l in enumerate(label[:3]):
nest.Connect([self.cgs[i]], self.n,
syn_spec={'receptor_type': syns[l]})
for i, l in enumerate(label[3:]):
nest.Connect([self.sgs[i]], self.n,
syn_spec={'receptor_type': syns[l]})
[docs] def testNeuron(self):
self.setUpNodes()
self.setUpNetwork()
nest.Simulate(self.t0)
nest.SetStatus(self.n, {'soma': {'I_e': self.I_e}})
nest.Simulate(self.t_stim)
rec = nest.GetStatus(self.mm)[0]['events']
# test membrane potential recorded in the soma
self.assertTrue(np.allclose(rec['V_m.s'][self.I0:self.I1],
self.Vm_soma_test))
# test membrane potential in the proximal compartment
self.assertTrue(np.allclose(rec['V_m.p'][self.I0:self.I1],
self.Vm_prox_test))
# test membrane potential in the distal compartment
self.assertTrue(np.allclose(rec['V_m.d'][self.I0:self.I1],
self.Vm_dist_test))
# test conductance recorded in the soma
self.assertTrue(np.allclose(rec['g_ex.s'][self.I0:self.I1],
self.gex_soma_test))
# test conductance in the proximal compartment
self.assertTrue(np.allclose(rec['g_ex.p'][self.I0:self.I1],
self.gex_prox_test))
# test conductance in the distal compartment
self.assertTrue(np.allclose(rec['g_ex.d'][self.I0:self.I1],
self.gex_dist_test))
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(TestMCNeuron)
unittest.TextTestRunner(verbosity=2).run(suite)