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.

147 lines
4.7 KiB

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)