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.
147 lines
4.7 KiB
147 lines
4.7 KiB
2 years ago
|
import numpy as np
|
||
|
from neuron import h
|
||
|
|
||
|
from .psd import PSD
|
||
|
|
||
|
|
||
|
class GluPSD(PSD):
|
||
|
"""
|
||
|
Glutamatergic PSD with ionotropic AMPA / NMDA receptors
|
||
|
|
||
|
This creates a set of postsynaptoc NMDA and AMPA receptors, one pair
|
||
|
per terminal release site. Receptors are connected to the XMTR range
|
||
|
variable of the terminal release mechanisms.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
section : Section instance
|
||
|
The postsynaptic section into which the receptor mechanisms should be
|
||
|
attached
|
||
|
terminal : Terminal instance
|
||
|
The presynaptic terminal that provides input to the receptor XMTR
|
||
|
variables.
|
||
|
ampa_gmax : float
|
||
|
Maximum conductance of AMPARs
|
||
|
nmda_gmax : float
|
||
|
Maximum conductance of NMDARs
|
||
|
gvar : float
|
||
|
Coefficient of variation for randomly adjusting ampa_gmax and nmda_gmax.
|
||
|
Note that ampa and nmda maximum conductances will be scaled together,
|
||
|
but the scale values will be selected randomly for each pair of
|
||
|
receptor mechanisms.
|
||
|
eRev : float
|
||
|
Reversal potential to use for both receptor types.
|
||
|
ampa_params : dict
|
||
|
Dictionary containing kinetic parameters for AMPA mechanism. Suggested
|
||
|
keys are Ro1, Ro2, Rc1, Rc2, and PA.
|
||
|
|
||
|
Notes
|
||
|
-----
|
||
|
|
||
|
*ampa_gmax* and *nmda_gmax* should be provided as the maximum *measured*
|
||
|
conductances; these will be automatically corrected for the maximum open
|
||
|
probability of the receptor mechanisms.
|
||
|
|
||
|
GluPSD does not include a cleft mechanism because AMPATRUSSELL implements
|
||
|
its own cleft and NMDA_Kampa is slow enough that a cleft would have
|
||
|
insignificant effect.
|
||
|
|
||
|
"""
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
section,
|
||
|
terminal,
|
||
|
ampa_gmax,
|
||
|
nmda_gmax,
|
||
|
gvar=0,
|
||
|
eRev=0,
|
||
|
nmda_vshift=0,
|
||
|
ampa_params=None,
|
||
|
loc=0.5,
|
||
|
):
|
||
|
PSD.__init__(self, section, terminal)
|
||
|
# print('\033[0;33;40m ^^^^^ GVAR = %.4f ^^^^^\033[0;37;40m ' % gvar)
|
||
|
ampa_params = {} if ampa_params is None else ampa_params
|
||
|
|
||
|
# and then make a set of postsynaptic receptor mechanisms
|
||
|
ampa_psd = []
|
||
|
nmda_psd = []
|
||
|
relsite = terminal.relsite
|
||
|
self.section.push()
|
||
|
for i in range(0, terminal.n_rzones):
|
||
|
# create mechanisms
|
||
|
ampa = h.AMPATRUSSELL(
|
||
|
loc, self.section
|
||
|
) # raman/trussell AMPA with rectification
|
||
|
nmda = h.NMDA_Kampa(loc, self.section) # Kampa state model NMDA receptors
|
||
|
|
||
|
# Connect terminal to psd
|
||
|
h.setpointer(relsite._ref_XMTR[i], "XMTR", ampa)
|
||
|
h.setpointer(relsite._ref_XMTR[i], "XMTR", nmda)
|
||
|
|
||
|
# Set any extra ampa parameters provided by the caller
|
||
|
# (Ro1, Ro2, Rc1, Rc2, PA, ...)
|
||
|
for k, v in ampa_params.items():
|
||
|
setattr(ampa, k, v)
|
||
|
|
||
|
# add a little variability - gvar is CV of amplitudes
|
||
|
v = 1.0 + gvar * np.random.standard_normal()
|
||
|
|
||
|
# set gmax and eRev for each postsynaptic receptor mechanism
|
||
|
ampa.gmax = ampa_gmax * v
|
||
|
ampa.Erev = eRev
|
||
|
nmda.gmax = nmda_gmax * v
|
||
|
nmda.Erev = eRev
|
||
|
nmda.vshift = nmda_vshift
|
||
|
|
||
|
ampa_psd.append(ampa)
|
||
|
nmda_psd.append(nmda)
|
||
|
|
||
|
h.pop_section()
|
||
|
|
||
|
self.ampa_psd = ampa_psd
|
||
|
self.nmda_psd = nmda_psd
|
||
|
self.all_psd = nmda_psd + ampa_psd
|
||
|
|
||
|
@property
|
||
|
def n_psd(self):
|
||
|
"""The number of postsynaptic densities represented by this object.
|
||
|
"""
|
||
|
return len(self.ampa_psd)
|
||
|
|
||
|
def record(self, *args):
|
||
|
"""Create a new set of vectors to record parameters for each release
|
||
|
site.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
\*args :
|
||
|
Allowed parameters are 'i' (current), 'g' (conductance), and 'Open' (open probability).
|
||
|
|
||
|
"""
|
||
|
self.vectors = {"ampa": [], "nmda": []}
|
||
|
for receptor in self.vectors:
|
||
|
for mech in getattr(self, receptor + "_psd"):
|
||
|
vec = {}
|
||
|
for var in args:
|
||
|
vec[var] = h.Vector()
|
||
|
vec[var].record(getattr(mech, "_ref_" + var))
|
||
|
self.vectors[receptor].append(vec)
|
||
|
|
||
|
def get_vector(self, receptor, var, i=0):
|
||
|
"""Return an array from a previously recorded vector.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
receptor : str
|
||
|
May be 'ampa' or 'nmda'
|
||
|
var : str
|
||
|
Allowed parameters are 'i' (current), 'g' (conductance), and 'Open' (open probability).
|
||
|
i : int, default=0
|
||
|
The integer index of the psd (if this is a multi-site synapse)
|
||
|
|
||
|
"""
|
||
|
v = self.vectors[receptor][i][var]
|
||
|
return np.array(v)
|