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.
119 lines
3.1 KiB
119 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()
|
|
|