You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.6 KiB
228 lines
5.6 KiB
2 years ago
|
import os, pickle, pprint
|
||
|
import numpy as np
|
||
|
import neuron
|
||
|
|
||
|
import cnmodel
|
||
|
import cnmodel.cells as cells
|
||
|
from cnmodel.util import UserTester, reset
|
||
|
from cnmodel.protocols import IVCurve
|
||
|
|
||
|
"""
|
||
|
Cell-type tests
|
||
|
"""
|
||
|
|
||
|
|
||
|
def test_bushy():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Bushy.create(species="guineapig", modelType="II")
|
||
|
CellTester("bushy_guineapig-typeII", cell)
|
||
|
|
||
|
|
||
|
def test_bushy21():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Bushy.create(species="guineapig", modelType="II-I")
|
||
|
CellTester("bushy_guineapig-typeII-I", cell)
|
||
|
|
||
|
|
||
|
def test_bushy_mouse():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Bushy.create(species="mouse", modelType="II")
|
||
|
CellTester("bushy-mouse-typeII", cell)
|
||
|
|
||
|
|
||
|
def test_tstellate():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.TStellate.create(species="guineapig", modelType="I-c")
|
||
|
CellTester("tstellate_guineapig-typeI-c", cell)
|
||
|
|
||
|
|
||
|
def test_tstellate_mouse():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.TStellate.create(species="mouse", modelType="I-c")
|
||
|
CellTester("tstellate_mouse-typeI-c", cell)
|
||
|
|
||
|
|
||
|
def test_tstellatet():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.TStellate.create(species="guineapig", modelType="I-t")
|
||
|
CellTester("tstellate_guineapig-typeI-t", cell)
|
||
|
|
||
|
|
||
|
# not implemented yet
|
||
|
# def test_tstellatet_mouse():
|
||
|
# reset(raiseError=False)
|
||
|
# cell = cells.TStellate.create(species='mouse', modelType='I-t')
|
||
|
# CellTester('tstellate_mouse-typeI-t', cell)
|
||
|
|
||
|
|
||
|
def test_dstellate():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.DStellate.create(species="guineapig", modelType="I-II")
|
||
|
CellTester("dstellate_guineapig-typeI-II", cell)
|
||
|
|
||
|
|
||
|
def test_dstellate_mouse():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.DStellate.create(species="mouse", modelType="I-II")
|
||
|
CellTester("dstellate_mouse-typeI-II", cell)
|
||
|
|
||
|
|
||
|
def test_octopus():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Octopus.create(species="guineapig", modelType="II-o")
|
||
|
CellTester("octopus_guineapig-typeII-o", cell)
|
||
|
|
||
|
|
||
|
def test_pyramidal():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Pyramidal.create(species="rat", modelType="I")
|
||
|
CellTester("pyramidal_rat_I", cell)
|
||
|
|
||
|
|
||
|
def test_tuberculoventral():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Tuberculoventral.create(species="mouse", modelType="TVmouse")
|
||
|
CellTester("tuberculoventral_mouse_I", cell)
|
||
|
|
||
|
|
||
|
def test_cartwheel():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.Cartwheel.create(species="mouse", modelType="I")
|
||
|
CellTester("cartwheel_rat_I", cell)
|
||
|
|
||
|
|
||
|
def test_sgc_basal_middle():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.SGC.create(species="mouse", modelType="bm")
|
||
|
CellTester("SGC_rat_bm", cell)
|
||
|
|
||
|
|
||
|
def test_sgc_apical():
|
||
|
reset(raiseError=False)
|
||
|
cell = cells.SGC.create(species="mouse", modelType="a")
|
||
|
CellTester("SGC_rat_a", cell)
|
||
|
|
||
|
|
||
|
#
|
||
|
# Supporting functions
|
||
|
#
|
||
|
|
||
|
|
||
|
class CellTester(UserTester):
|
||
|
data_dir = "cell_data"
|
||
|
|
||
|
def run_test(self, cell):
|
||
|
# run I/V test on cell
|
||
|
V0 = cell.find_i0(showinfo=True)
|
||
|
rmrintau = cell.compute_rmrintau(auto_initialize=False, vrange=None)
|
||
|
iv = IVCurve()
|
||
|
self.iv = iv
|
||
|
iv.run(cell.i_test_range, cell)
|
||
|
if self.audit:
|
||
|
iv.show(cell)
|
||
|
|
||
|
info = dict(
|
||
|
temp=iv.temp,
|
||
|
icmd=iv.current_cmd,
|
||
|
spikes=iv.spike_times(),
|
||
|
rmp=iv.rest_vm(),
|
||
|
rm_taum=iv.input_resistance_tau(),
|
||
|
vpeak=iv.peak_vm(),
|
||
|
vss=iv.steady_vm(),
|
||
|
rmrintau=rmrintau,
|
||
|
)
|
||
|
return info
|
||
|
|
||
|
def assert_test_info(self, *args, **kwds):
|
||
|
try:
|
||
|
super(CellTester, self).assert_test_info(*args, **kwds)
|
||
|
finally:
|
||
|
if hasattr(self, "iv") and hasattr(self.iv, "win"):
|
||
|
self.iv.win.hide()
|
||
|
|
||
|
|
||
|
# def result_file(key):
|
||
|
# """
|
||
|
# Return a file name to be used for storing / retrieving test results
|
||
|
# given *key*.
|
||
|
# """
|
||
|
# path = os.path.dirname(__file__)
|
||
|
# return os.path.join(path, 'cell_data', key + '.pk')
|
||
|
|
||
|
# def load_cell_info(key):
|
||
|
# """
|
||
|
# Load prior test results for *key*.
|
||
|
# If there are no prior results, return None.
|
||
|
# """
|
||
|
# fn = result_file(key)
|
||
|
# if os.path.isfile(fn):
|
||
|
# return pickle.load(open(fn, 'rb'))
|
||
|
# return None
|
||
|
|
||
|
# def save_cell_info(info, key):
|
||
|
# """
|
||
|
# Store test results for *key*.
|
||
|
# """
|
||
|
# fn = result_file(key)
|
||
|
# dirname = os.path.dirname(fn)
|
||
|
# if not os.path.isdir(dirname):
|
||
|
# os.mkdir(dirname)
|
||
|
# pickle.dump(info, open(fn, 'wb'))
|
||
|
|
||
|
|
||
|
# The following is superseeded by the built in unit tests.
|
||
|
# def CellTester(key):
|
||
|
# """
|
||
|
# Test *cell* and raise exception if the results do not match prior
|
||
|
# data.
|
||
|
# """
|
||
|
# audit = cnmodel.AUDIT_TESTS
|
||
|
|
||
|
## run I/V test on cell
|
||
|
# iv = IVCurve()
|
||
|
# iv.run(cell.i_test_range, cell)
|
||
|
# iv.show(cell)
|
||
|
|
||
|
# try:
|
||
|
# info = dict(
|
||
|
# icmd=iv.current_cmd,
|
||
|
# spikes=iv.spike_times(),
|
||
|
# rmp=iv.rest_vm(),
|
||
|
# rm=iv.input_resistance(),
|
||
|
# vpeak=iv.peak_vm(),
|
||
|
# vss=iv.steady_vm(),
|
||
|
# )
|
||
|
|
||
|
# expect = load_cell_info(key)
|
||
|
|
||
|
# if expect is not None:
|
||
|
|
||
|
## Check test structures are the same
|
||
|
# assert len(info) == len(expect)
|
||
|
# for k in info:
|
||
|
# assert k in expect
|
||
|
|
||
|
## Check data matches
|
||
|
# for k in info:
|
||
|
# if isinstance(info[k], list):
|
||
|
# assert len(info[k]) == len(expect[k])
|
||
|
# for i in range(len(info[k])):
|
||
|
# assert np.allclose(info[k][i], expect[k][i])
|
||
|
# else:
|
||
|
# assert np.allclose(info[k], expect[k])
|
||
|
# else:
|
||
|
# if not audit:
|
||
|
# raise Exception("No prior test results for cell type '%s'. "
|
||
|
# "Run test.py --audit store new test data." % key)
|
||
|
|
||
|
# print "\n=== New test results for %s: ===\n" % key
|
||
|
# pprint.pprint(info)
|
||
|
# print "Store new test results? [y/n]",
|
||
|
# yn = raw_input()
|
||
|
# if yn.lower().startswith('y'):
|
||
|
# save_cell_info(info, key)
|
||
|
# else:
|
||
|
# raise Exception("Rejected test results for '%s'" % key)
|
||
|
# finally:
|
||
|
# iv.win.hide()
|