model of DCN pyramidal neuron
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.

120 lines
3.1 KiB

"""
Create presynaptic and postsynaptic neurons, automatically connect them with
a synapse, stimulate the presynaptic cell, and analyze the resulting PSCs
in the postsynaptic cell.
"""
import faulthandler
faulthandler.enable()
import os, pickle, pprint
import numpy as np
import neuron
import cnmodel
import cnmodel.cells as cells
from cnmodel.util import UserTester
from cnmodel.protocols import SynapseTest
from cnmodel.util import reset
#
# Synapse tests
#
def test_sgc_bushy():
SynapseTester("sgc", "bushy")
def test_sgc_tstellate():
SynapseTester("sgc", "tstellate")
def test_sgc_tstellate2(): # again to test RNG stability
SynapseTester("sgc", "tstellate")
def test_sgc_dstellate():
SynapseTester("sgc", "dstellate")
def test_dstellate_bushy():
SynapseTester("dstellate", "bushy")
def test_dstellate_tstellate():
SynapseTester("dstellate", "tstellate")
def test_dstellate_dstellate():
SynapseTester("dstellate", "dstellate")
#
# Supporting functions
#
convergence = {
"sgc": {"bushy": 3, "tstellate": 6, "dstellate": 10, "dstellate_eager": 10},
"dstellate": {"bushy": 10, "tstellate": 15, "dstellate": 5},
}
def make_cell(typ):
if typ == "sgc":
cell = cells.SGC.create()
elif typ == "tstellate":
cell = cells.TStellate.create(debug=True, ttx=False)
elif (
typ == "dstellate"
): # Type I-II Rothman model, similiar excitability (Xie/Manis, unpublished)
cell = cells.DStellate.create(model="RM03", debug=True, ttx=False)
elif typ == "dstellate_eager": # From Eager et al.
cell = cells.DStellate.create(model="Eager", debug=True, ttx=False)
elif typ == "bushy":
cell = cells.Bushy.create(debug=True, ttx=False)
else:
raise ValueError("Unknown cell type '%s'" % typ)
return cell
class SynapseTester(UserTester):
def __init__(self, pre, post):
self.st = None
UserTester.__init__(self, "%s_%s" % (pre, post), pre, post)
def run_test(self, pre, post):
# Make sure no objects are left over from previous tests
reset(raiseError=False)
# seed random generator using the name of this test
seed = "%s_%s" % (pre, post)
pre_cell = make_cell(pre)
post_cell = make_cell(post)
n_term = convergence.get(pre, {}).get(post, None)
if n_term is None:
n_term = 1
st = SynapseTest()
st.run(pre_cell.soma, post_cell.soma, n_term, seed=seed)
if self.audit:
st.show_result()
info = dict(
rel_events=st.release_events(),
rel_timings=st.release_timings(),
open_prob=st.open_probability(),
event_analysis=st.analyze_events(),
)
self.st = st
# import weakref
# global last_syn
# last_syn = weakref.ref(st.synapses[0].terminal.relsi)
return info
def assert_test_info(self, *args, **kwds):
try:
super(SynapseTester, self).assert_test_info(*args, **kwds)
finally:
if self.st is not None:
self.st.hide()