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.
399 lines
14 KiB
399 lines
14 KiB
2 years ago
|
from __future__ import print_function
|
||
|
import numpy as np
|
||
|
from neuron import h
|
||
|
|
||
|
from .psd import PSD
|
||
|
|
||
|
|
||
|
class GlyPSD(PSD):
|
||
|
"""Glycinergic PSD
|
||
|
|
||
|
This creates postsynaptoc glycinergic receptors. Receptors are connected to the XMTR range
|
||
|
variable of the terminal release mechanisms.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
section : Section
|
||
|
The postsynaptic section in which to insert the receptor mechanism.
|
||
|
terminal : Terminal
|
||
|
The presynaptic Terminal instance
|
||
|
params : dict, default=None
|
||
|
Dictionary of kinetic parameters to override {'KV', 'KU', 'XMax'}
|
||
|
gmax : float, default=1000.
|
||
|
maximal conductance unless overridden by values used in psdType
|
||
|
psdType : str, default='glyfast'
|
||
|
Kinetic model of receptors: possiblities are:
|
||
|
glyfast, glyslow, glyGC, glya5, or glyexp, as defined in the mechanisms.
|
||
|
message : str, default: None
|
||
|
placeholder for a message to be printed out when testing.
|
||
|
debug: bool, default=False
|
||
|
enable printing of internal debugging messages.
|
||
|
gvar : float, default=0
|
||
|
coefficient of variation of the amplitudes for each of the release zones.
|
||
|
eRev : float, default=-70
|
||
|
"Reversal" potential, or Nernst potential for ions through the receptor channel.
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
|
||
|
"""
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
section,
|
||
|
terminal,
|
||
|
params=None,
|
||
|
gmax=1000.0,
|
||
|
psdType="glyfast",
|
||
|
message=None,
|
||
|
debug=False,
|
||
|
gvar=0,
|
||
|
eRev=-70,
|
||
|
loc=0.5,
|
||
|
):
|
||
|
|
||
|
PSD.__init__(self, section, terminal)
|
||
|
pre_sec = terminal.section
|
||
|
post_sec = section
|
||
|
|
||
|
from .. import cells
|
||
|
|
||
|
params = {} if params is None else params
|
||
|
|
||
|
self.pre_cell = cells.cell_from_section(pre_sec)
|
||
|
self.post_cell = cells.cell_from_section(post_sec)
|
||
|
|
||
|
self.psdType = psdType
|
||
|
self.gmax = gmax
|
||
|
glyslowPoMax = (
|
||
|
0.162297
|
||
|
) # thse were measured from the kinetic models in Synapses.py, as peak open P for the glycine receptors
|
||
|
glyfastPoMax = 0.038475 # also later verified, same numbers...
|
||
|
if self.psdType == "glyfast":
|
||
|
gmax /= (
|
||
|
glyfastPoMax
|
||
|
) # normalized to maximum open probability for this receptor
|
||
|
if self.psdType == "glyslow":
|
||
|
gmax /= glyslowPoMax # normalized to max open prob for the slow receptor.
|
||
|
|
||
|
# print "Stochastic syn: j = %d of n_fibers = %d n_rzones = %d\n" % (j, n_fibers, n_rzones)
|
||
|
relzone = terminal.relsite
|
||
|
n_rzones = terminal.n_rzones
|
||
|
|
||
|
#
|
||
|
# Create cleft mechanisms
|
||
|
#
|
||
|
clefts = []
|
||
|
for k in range(0, n_rzones):
|
||
|
cl = h.cleftXmtr(loc, sec=post_sec)
|
||
|
clefts.append(cl)
|
||
|
|
||
|
# and then make a set of postsynaptic receptor mechanisms
|
||
|
if self.psdType == "glyslow":
|
||
|
(psd, par) = self.template_Gly_PSD_State_Gly6S(
|
||
|
nReceptors=n_rzones, psdtype=self.psdType
|
||
|
)
|
||
|
elif self.psdType == "glyfast":
|
||
|
(psd, par) = self.template_Gly_PSD_State_PL(
|
||
|
nReceptors=n_rzones, psdtype=self.psdType
|
||
|
)
|
||
|
elif self.psdType == "glyGC":
|
||
|
(psd, par) = self.template_Gly_PSD_State_GC(
|
||
|
nReceptors=n_rzones, psdtype=self.psdType
|
||
|
)
|
||
|
elif self.psdType == "glya5":
|
||
|
(psd, par) = self.template_Gly_PSD_State_Glya5(
|
||
|
nReceptors=n_rzones, psdtype=self.psdType
|
||
|
)
|
||
|
elif self.psdType == "glyexp":
|
||
|
(psd, par) = self.template_Gly_PSD_exp(
|
||
|
nReceptors=n_rzones, psdtype=self.psdType
|
||
|
)
|
||
|
else:
|
||
|
print("**PSDTYPE IS NOT RECOGNIZED: [%s]\n" % (self.psdType))
|
||
|
exit()
|
||
|
if debug:
|
||
|
print("pre_sec: ", pre_sec)
|
||
|
|
||
|
# Connect terminal to psd (or cleft)
|
||
|
self._cleft_netcons = []
|
||
|
for k in range(0, n_rzones):
|
||
|
pre_sec.push()
|
||
|
netcon = h.NetCon(relzone._ref_XMTR[k], clefts[k], 0.1, 0.0, 1.0)
|
||
|
self._cleft_netcons.append(netcon)
|
||
|
h.pop_section()
|
||
|
|
||
|
# set cleft transmitter kinetic parameters
|
||
|
for pname, pval in params.items():
|
||
|
setattr(clefts[k], pname, pval)
|
||
|
|
||
|
h.setpointer(
|
||
|
clefts[k]._ref_CXmtr, "XMTR", psd[k]
|
||
|
) # connect transmitter release to the PSD
|
||
|
|
||
|
v = 1.0 + gvar * np.random.standard_normal()
|
||
|
psd[k].gmax = (
|
||
|
gmax * v
|
||
|
) # add a little variability - gvar is CV of amplitudes
|
||
|
# print 'GLY psd %s %d gmax=%f' % (self.psdType, k, gmax)
|
||
|
psd[k].Erev = eRev # set the reversal potential
|
||
|
|
||
|
par = list(par)
|
||
|
|
||
|
if message is not None:
|
||
|
print(message)
|
||
|
|
||
|
self.all_psd = psd
|
||
|
self.clefts = clefts
|
||
|
self.par = par
|
||
|
|
||
|
# the following templates are a bit more complicated.
|
||
|
# The parameter names as defined in the model are returned
|
||
|
# but also those that are involved in the forward binding reactions are
|
||
|
# listed separately - this is to allow us to run curve fits that adjust
|
||
|
# only a subset of the parameters a time - e.g., the rising phase, then
|
||
|
# the falling phase with the rising phase fixed.
|
||
|
# the dictionary selection is made by selectpars in glycine_fit.py.
|
||
|
#
|
||
|
|
||
|
def template_Gly_PSD_exp(
|
||
|
self, debug=False, nReceptors=2, cellname=None, message=None, loc=0.5
|
||
|
):
|
||
|
"""
|
||
|
Template to build simple glycinergic exp-style PSD
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
nReceptors : int, default=2
|
||
|
number of sites to implement
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
|
||
|
Unused parameters:
|
||
|
cellname, debug, message.
|
||
|
|
||
|
"""
|
||
|
|
||
|
sec = self.section
|
||
|
psd = []
|
||
|
sec.push()
|
||
|
for k in range(0, nReceptors):
|
||
|
psd.append(h.GLY2(loc, sec))
|
||
|
h.pop_section()
|
||
|
par = ["alpha", "beta"]
|
||
|
p = []
|
||
|
for n in par:
|
||
|
p.append(eval("psd[0]." + n)) # get default values from the mod file
|
||
|
return (psd, par, p)
|
||
|
|
||
|
def template_Gly_PSD_State_Glya5(
|
||
|
self, debug=False, nReceptors=2, psdtype=None, message=None, loc=0.5
|
||
|
):
|
||
|
"""
|
||
|
Template to build PSD using state model of glycine receptors, model glya5.mod
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
nReceptors : int, default=2
|
||
|
number of sites to implement
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
|
||
|
Unused parameters:
|
||
|
cellname, debug, message, psdtype.
|
||
|
|
||
|
"""
|
||
|
sec = self.section
|
||
|
psd = []
|
||
|
sec.push()
|
||
|
for k in range(0, nReceptors):
|
||
|
psd.append(h.GLYa5(loc, sec))
|
||
|
h.pop_section()
|
||
|
par = {
|
||
|
"kf1": ("r", psd[0].kf1), # retreive values in the MOD file
|
||
|
"kf2": ("r", psd[0].kf2),
|
||
|
"kb1": ("r", psd[0].kb1),
|
||
|
"kb2": ("r", psd[0].kb2),
|
||
|
"a1": ("f", psd[0].a1),
|
||
|
"b1": ("f", psd[0].b1),
|
||
|
"a2": ("f", psd[0].a2),
|
||
|
"b2": ("f", psd[0].b2),
|
||
|
}
|
||
|
return (psd, par)
|
||
|
|
||
|
def template_Gly_PSD_State_Gly6S(
|
||
|
self, debug=False, nReceptors=2, psdtype=None, message=None, loc=0.5
|
||
|
):
|
||
|
"""
|
||
|
Template to build PSD using state model of glycine receptors, model gly6s.mod
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
nReceptors : int, default=2
|
||
|
number of sites to implement
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
psdtype : str, default=None
|
||
|
resets the psd type to have slow kinetics if 'glyslow'. Any other string
|
||
|
defaults to kinetics in the mod file.
|
||
|
|
||
|
Unused parameters:
|
||
|
cellname, debug, message.
|
||
|
|
||
|
"""
|
||
|
sec = self.section
|
||
|
psd = []
|
||
|
sec.push()
|
||
|
for k in range(0, nReceptors):
|
||
|
psd.append(
|
||
|
h.Gly6S(loc, sec)
|
||
|
) # simple using Trussell model 6 states with desens
|
||
|
if debug:
|
||
|
print("Gly6S psdtype: ", psdtype)
|
||
|
if (
|
||
|
psdtype == "glyslow"
|
||
|
): # fit on 8 March 2010, error = 0.164, max open: 0.155
|
||
|
psd[-1].Rd = 1.177999
|
||
|
psd[-1].Rr = 0.000005
|
||
|
psd[-1].Rb = 0.009403
|
||
|
psd[-1].Ru2 = 0.000086
|
||
|
psd[-1].Ro1 = 0.187858
|
||
|
psd[-1].Ro2 = 1.064426
|
||
|
psd[-1].Ru1 = 0.028696
|
||
|
psd[-1].Rc1 = 0.103625
|
||
|
psd[-1].Rc2 = 1.730578
|
||
|
h.pop_section()
|
||
|
par = {
|
||
|
"Rb": ("n", psd[0].Rb), # retrive values in the MOD file
|
||
|
"Ru1": ("r", psd[0].Ru1),
|
||
|
"Ru2": ("r", psd[0].Ru2),
|
||
|
"Rd": ("f", psd[0].Rd),
|
||
|
"Rr": ("f", psd[0].Rr),
|
||
|
"Ro1": ("f", psd[0].Ro1),
|
||
|
"Ro2": ("r", psd[0].Ro2),
|
||
|
"Rc1": ("f", psd[0].Rc1),
|
||
|
"Rc2": ("r", psd[0].Rc2),
|
||
|
}
|
||
|
return (psd, par)
|
||
|
|
||
|
def template_Gly_PSD_State_PL(
|
||
|
self,
|
||
|
debug=False,
|
||
|
nReceptors=2,
|
||
|
cellname=None,
|
||
|
psdtype=None,
|
||
|
message=None,
|
||
|
loc=0.5,
|
||
|
):
|
||
|
"""
|
||
|
Template to build PSD using state model of glycine receptors, model glypl.mod
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
nReceptors : int, default=2
|
||
|
number of sites to implement
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
psdtype : str, default=None
|
||
|
resets the psd type to have slow kinetics if 'glyslow'.
|
||
|
'glyfast' forces fast kinetics.
|
||
|
Any other string defaults to the default kinetics in the mod file.
|
||
|
|
||
|
Unused parameters:
|
||
|
cellname, debug, message,.
|
||
|
|
||
|
"""
|
||
|
sec = self.section
|
||
|
psd = []
|
||
|
sec.push()
|
||
|
for k in range(0, nReceptors):
|
||
|
psd.append(h.GLYaPL(loc, sec)) # simple dextesche glycine receptors
|
||
|
if debug:
|
||
|
print("PL psdtype: ", psdtype)
|
||
|
if psdtype == "glyslow":
|
||
|
psd[-1].a1 = 0.000451
|
||
|
psd[-1].a2 = 0.220
|
||
|
psd[-1].b1 = 13.27
|
||
|
psd[-1].b2 = 6.845
|
||
|
psd[-1].kon = 0.00555
|
||
|
psd[-1].koff = 2.256
|
||
|
psd[-1].r = 1.060
|
||
|
psd[-1].d = 55.03
|
||
|
if (
|
||
|
psdtype == "glyfast"
|
||
|
): # fit from 3/5/2010. error = 0.174 maxopen = 0.0385
|
||
|
psd[-1].a1 = 1.000476
|
||
|
psd[-1].a2 = 0.137903
|
||
|
psd[-1].b1 = 1.700306
|
||
|
psd[-1].koff = 13.143132
|
||
|
psd[-1].kon = 0.038634
|
||
|
psd[-1].r = 0.842504
|
||
|
psd[-1].b2 = 8.051435
|
||
|
psd[-1].d = 12.821820
|
||
|
h.pop_section()
|
||
|
par = {
|
||
|
"kon": ("r", psd[0].kon), # retrive values in the MOD file
|
||
|
"koff": ("r", psd[0].koff),
|
||
|
"a1": ("r", psd[0].a1),
|
||
|
"b1": ("r", psd[0].b1),
|
||
|
"a2": ("f", psd[0].a2),
|
||
|
"b2": ("f", psd[0].b2),
|
||
|
"r": ("f", psd[0].r),
|
||
|
"d": ("f", psd[0].d),
|
||
|
}
|
||
|
return (psd, par)
|
||
|
|
||
|
def template_Gly_PSD_State_GC(
|
||
|
self, debug=False, nReceptors=2, psdtype=None, message=None, loc=0.5
|
||
|
):
|
||
|
"""
|
||
|
Template to build PSD using state model of glycine receptors, model glyaGC.mod
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
nReceptors : int, default=2
|
||
|
number of sites to implement
|
||
|
loc : float, default=0.5
|
||
|
Position on the postsynaptic section to insert the mechanism, from [0..1].
|
||
|
psdtype : str, default=None
|
||
|
resets the psd type to have slow kinetics if 'glyslow'. Any other string
|
||
|
defaults to predefined kinetics in the mod file.
|
||
|
|
||
|
Unused parameters:
|
||
|
cellname, debug, message, psdtype.
|
||
|
|
||
|
"""
|
||
|
sec = self.section
|
||
|
psd = []
|
||
|
sec.push()
|
||
|
for k in range(0, nReceptors):
|
||
|
psd.append(h.GLYaGC(loc, sec)) # simple Dextesche glycine receptors
|
||
|
if psdtype == "glyslow":
|
||
|
psd[-1].k1 = 12.81 # (/uM /ms) : binding
|
||
|
psd[-1].km1 = 0.0087 # (/ms) : unbinding
|
||
|
psd[-1].a1 = 0.0195 # (/ms) : opening
|
||
|
psd[-1].b1 = 1.138 # (/ms) : closing
|
||
|
psd[-1].r1 = 6.13 # (/ms) : desense 1
|
||
|
psd[-1].d1 = 0.000462 # (/ms) : return from d1
|
||
|
psd[-1].r2 = 0.731 # (/ms) : return from deep state
|
||
|
psd[-1].d2 = 1.65 # (/ms) : going to deep state
|
||
|
psd[-1].r3 = 3.83 # (/ms) : return from deep state
|
||
|
psd[-1].d3 = 1.806 # (/ms) : going to deep state
|
||
|
psd[-1].rd = 1.04 # (/ms)
|
||
|
psd[-1].dd = 1.004 # (/ms)
|
||
|
h.pop_section()
|
||
|
par = {
|
||
|
"k1": ("r", psd[0].k1), # retrive values in the MOD file
|
||
|
"km1": ("r", psd[0].km1),
|
||
|
"a1": ("r", psd[0].a1),
|
||
|
"b1": ("r", psd[0].b1),
|
||
|
"r1": ("f", psd[0].r1),
|
||
|
"d1": ("f", psd[0].d1),
|
||
|
"r2": ("f", psd[0].r2),
|
||
|
"d2": ("f", psd[0].d2),
|
||
|
"r3": ("f", psd[0].r3),
|
||
|
"d3": ("f", psd[0].d3),
|
||
|
"rd": ("f", psd[0].rd),
|
||
|
"dd": ("f", psd[0].dd),
|
||
|
}
|
||
|
return (psd, par)
|