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.

211 lines
6.5 KiB

"""
Test synaptic connections between two different cell types.
usage: test_synapses.py [-h] [-t {simple,multisite}] [-c]
{sgc,tstellate,dstellate,tuberculoventral}
{bushy,tstellate,dstellate,octopus,tuberculoventral,pyramidal}
Compute AN only PSTH in postsynaptic cell
positional arguments:
{sgc,tstellate,dstellate,tuberculoventral}
Select presynaptic cell type
{bushy,tstellate,dstellate,octopus,tuberculoventral,pyramidal}
Select postsynaptic cell type
optional arguments:
-h, --help show this help message and exit
-t {simple,multisite}, --type {simple,multisite}
Set synapse type (simple, multisite)
-c, --convergence Use convergence = 1 for comparision between simple and
multi, instead of default table
This script:
1. Creates single pre- and postsynaptic cells
2. Creates multiple synaptic terminals between the two cells.
(the convergence is hard-coded below).
3. Stimulates the presynaptic cell by current injection.
4. Records and analyzes the resulting post-synaptic events.
This is used mainly to check that the strength, kinetics, and dynamics of
each synapse type is working as expected. A higher-level approach is
demonstrated in test_populations.py, in which the presynaptic cells are
automatically generated using expected patterns of connectivity.
"""
import argparse
import pyqtgraph as pg
from cnmodel.protocols import SynapseTest
from cnmodel import cells
from cnmodel.synapses import Synapse
import sys
def runtest():
parser = argparse.ArgumentParser(
description="Compute AN only PSTH in postsynaptic cell"
)
parser.add_argument(
type=str,
dest="precell",
default="sgc",
choices=["sgc", "tstellate", "dstellate", "tuberculoventral"],
help="Select presynaptic cell type",
)
parser.add_argument(
type=str,
dest="postcell",
default="bushy",
choices=[
"bushy",
"tstellate",
"dstellate",
"octopus",
"tuberculoventral",
"pyramidal",
],
help="Select postsynaptic cell type",
)
parser.add_argument(
"-t",
"--type",
type=str,
dest="syntype",
default="multisite",
choices=["simple", "multisite"],
help="Set synapse type (simple, multisite)",
)
parser.add_argument(
"-c",
"--convergence",
action="store_true",
dest="convergence",
help="Use convergence = 1 for comparision between simple and multi, instead of default table",
)
args = parser.parse_args()
precell = args.precell
postcell = args.postcell
synapseType = args.syntype
use_conv_table = args.convergence
# These must be se3t to 1 to match data in original tables. Otherwise, it would be better
# to use the original tables.
if not use_conv_table:
convergence = {
"sgc": {
"bushy": 1,
"tstellate": 1,
"dstellate": 1,
"dstellate_eager": 10,
"octopus": 10,
"tuberculoventral": 1,
"pyramidal": 1,
"cartwheel": 0,
},
"dstellate": {"bushy": 10, "tstellate": 15, "dstellate": 5},
}
else:
convergence = {
"sgc": {
"bushy": 1,
"tstellate": 1,
"dstellate": 1,
"dstellate_eager": 1,
"octopus": 1,
"tuberculoventral": 1,
"pyramidal": 1,
"cartwheel": 0,
},
"dstellate": {
"bushy": 1,
"tstellate": 1,
"dstellate": 0,
"tuberculoventral": 1,
"pyramidal": 1,
"cartwheel": 0,
},
"tuberculoventral": {
"bushy": 1,
"tstellate": 1,
"dstellate": 0,
"tuberculoventral": 1,
"pyramidal": 1,
"cartwheel": 0,
},
}
c = []
for cellType in [precell, postcell]:
if cellType == "sgc":
cell = cells.SGC.create()
elif cellType == "tstellate":
cell = cells.TStellate.create(debug=True, ttx=False)
elif (
cellType == "dstellate"
): # Type I-II Rothman model, similiar excitability (Xie/Manis, unpublished)
cell = cells.DStellate.create(model="RM03", debug=True, ttx=False)
elif cellType == "dstellate_eager": # From Eager et al.
cell = cells.DStellate.create(model="Eager", debug=True, ttx=False)
elif cellType == "bushy":
cell = cells.Bushy.create(debug=True, ttx=True)
elif cellType == "tuberculoventral":
cell = cells.Tuberculoventral.create(debug=True, ttx=True)
elif cellType == "pyramidal":
cell = cells.Pyramidal.create(debug=True, ttx=True)
elif cellType == "octopus":
cell = cells.Octopus.create(debug=True, ttx=True)
else:
raise ValueError("Unknown cell type '%s'" % cellType)
c.append(cell)
preCell, postCell = c
if not use_conv_table:
nTerminals = convergence.get(precell, {}).get(postcell, None)
else:
nTerminals = 1
# print("Warning: Unknown convergence for %s => %s, assuming %d" % (precell, postcell, nTerminals))
if [precell, postcell] == ["sgc", "bushy"]:
niter = 5
else:
niter = 20
# syntype = 'multisite'
# if len(sys.argv) > 3:
# syntype = sys.argv[3]
# assert(syntype in ['simple', 'multisite'])
if synapseType == "simple":
niter = 1
st = SynapseTest()
st.run(
preCell.soma,
postCell.soma,
nTerminals,
vclamp=-65.0,
iterations=niter,
synapsetype=synapseType,
)
st.show_result()
st.plots["VPre"].setYRange(-70.0, 10.0)
st.plots["EPSC"].setYRange(-2.0, 0.5)
st.plots["latency2080"].setYRange(0.0, 1.0)
st.plots["halfwidth"].setYRange(0.0, 1.0)
st.plots["RT"].setYRange(0.0, 0.2)
st.plots["latency"].setYRange(0.0, 1.0)
st.plots["latency_distribution"].setYRange(0.0, 1.0)
return st # need to keep st alive in memory
if __name__ == "__main__":
st = runtest()
if sys.flags.interactive == 0:
pg.QtGui.QApplication.exec_()