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.

186 lines
5.7 KiB

import os
import os.path
from neuron import h
import pylibrary.Utility as U
from ..util import PlotHelpers as PH
import numpy as np
import scipy
import scipy.integrate
import scipy.stats
try:
import pyqtgraph as pg
HAVE_PG = True
except ImportError:
HAVE_PG = False
from ..util.stim import make_pulse
# import matplotlib as MP # must call first... before pylag/pyplot or backends
# MP.use('Qt4Agg')
# import matplotlib.gridspec as GS
# import mpl_toolkits.axes_grid1.inset_locator as INSETS
# import mpl_toolkits.axes_grid1.anchored_artists as ANCHOR
# stdFont = 'Arial'
# import matplotlib.pyplot as pylab
# pylab.rcParams['interactive'] = False
# pylab.rcParams['mathtext.default'] = 'sf'
## next setting allows pdf font to be readable in Adobe Illustrator
# pylab.rcParams['pdf.fonttype'] = 42
# pylab.rcParams['figure.facecolor'] = 'white'
def run_democlamp(cell, dend, vsteps=[-60, -70, -60], tsteps=[10, 50, 100]):
"""
Does some stuff.
"""
f1 = pylab.figure(1)
gs = GS.GridSpec(2, 2, width_ratios=[1, 1], height_ratios=[1, 1])
# note numbering for insets goes from 1 (upper right) to 4 (lower right)
# counterclockwise
pA = f1.add_subplot(gs[0])
pAi = INSETS.inset_axes(pA, width="66%", height="40%", loc=2)
pB = f1.add_subplot(gs[1])
pBi = INSETS.inset_axes(pB, width="66%", height="40%", loc=4)
pC = f1.add_subplot(gs[2])
pCi = INSETS.inset_axes(pC, width="66%", height="40%", loc=2)
pD = f1.add_subplot(gs[3])
pDi = INSETS.inset_axes(pD, width="66%", height="40%", loc=1)
# h.topology()
Ld = 0.5
Ld2 = 1.0
VClamp = h.SEClamp(0.5, cell)
VClamp.dur1 = tsteps[0]
VClamp.amp1 = vsteps[0]
VClamp.dur2 = tsteps[1]
VClamp.amp2 = vsteps[1]
VClamp.dur3 = tsteps[2]
VClamp.amp3 = vsteps[2]
Rs0 = 10.0
VClamp.rs = Rs0
compensation = [0.0, 70.0, 95.0]
cms = [cell.cm * (100.0 - c) / 100.0 for c in compensation]
vrec = h.iStim(Ld, sec=dend[0])
vrec.delay = 0
vrec.dur = 1e9 # these actually do not matter...
vrec.iMax = 0.0
vrec2 = h.iStim(Ld2, sec=dend[0])
vrec2.delay = 0
vrec2.dur = 1e9 # these actually do not matter...
vrec2.iMax = 0.0
stim = {}
stim["NP"] = 1
stim["Sfreq"] = 20 # stimulus frequency
stim["delay"] = tsteps[0]
stim["dur"] = tsteps[1]
stim["amp"] = vsteps[1]
stim["PT"] = 0.0
stim["hold"] = vsteps[0]
# (secmd, maxt, tstims) = make_pulse(stim)
tend = 79.5
linetype = ["-", "-", "-"]
linethick = [0.5, 0.75, 1.25]
linecolor = [[0.66, 0.66, 0.66], [0.4, 0.4, 0.3], "k"]
n = 0
vcmds = [-70, -20]
vplots = [(pA, pAi, pC, pCi), (pB, pBi, pD, pDi)]
for m, VX in enumerate(vcmds):
stim["amp"] = VX
pl = vplots[m]
print(m, VX)
(secmd, maxt, tstims) = make_pulse(stim)
for n, rsc in enumerate(compensation):
vec = {}
for var in ["VCmd", "i_inj", "time", "Vsoma", "Vdend", "Vdend2", "VCmdR"]:
vec[var] = h.Vector()
VClamp.rs = Rs0 * (100.0 - rsc) / 100.0
cell.cm = cms[n]
# print VClamp.rs, cell.cm, VClamp.rs*cell.cm
vec["VCmd"] = h.Vector(secmd)
vec["Vsoma"].record(cell(0.5)._ref_v, sec=cell)
vec["Vdend"].record(dend[0](Ld)._ref_v, sec=dend[0])
vec["time"].record(h._ref_t)
vec["i_inj"].record(VClamp._ref_i, sec=cell)
vec["VCmdR"].record(VClamp._ref_vc, sec=cell)
VClamp.amp2 = VX
# vec['VCmd'].play(VClamp.amp2, h.dt, 0, sec=cell)
h.tstop = tend
h.init()
h.finitialize(-60)
h.run()
vc = np.asarray(vec["Vsoma"])
tc = np.asarray(vec["time"])
# now plot the data, raw and as insets
for k in [0, 1]:
pl[k].plot(
vec["time"],
vec["i_inj"],
color=linecolor[n],
linestyle=linetype[n],
linewidth=linethick[n],
)
yl = pl[k].get_ylim()
if k == 0:
pass
# pl[k].set_ylim([1.5*yl[0], -1.5*yl[1]])
else:
pass
for k in [2, 3]:
pl[k].plot(
vec["time"],
vec["Vsoma"],
color=linecolor[n],
linestyle=linetype[n],
linewidth=linethick[n],
)
pl[k].plot(
vec["time"],
vec["VCmdR"],
color=linecolor[n],
linestyle="--",
linewidth=1,
dashes=(1, 1),
)
pl[k].plot(
vec["time"],
vec["Vdend"],
color=linecolor[n],
linestyle=linetype[n],
linewidth=linethick[n],
dashes=(3, 3),
)
if VX < vsteps[0]:
pl[k].set_ylim([-72, -40])
else:
pl[k].set_ylim([-62, VX + 30])
ptx = 10.8
pBi.set_xlim([9.8, ptx])
pAi.set_xlim([9.8, ptx])
PH.setX(pAi, pCi)
PH.setX(pBi, pDi)
pD.set_ylim([-65, 10])
# PH.setY(pC, pCi) # match Y limits
PH.cleanAxes([pA, pAi, pB, pBi, pC, pCi, pD, pDi])
PH.formatTicks([pA, pB, pC, pD], axis="x", fmt="%d")
PH.formatTicks([pC, pD], axis="y", fmt="%d")
PH.calbar(pAi, [ptx - 1, 0, 0.2, 2.0])
PH.calbar(pCi, [ptx - 1, -50.0, 0.2, 10])
PH.calbar(pBi, [ptx - 1, 0, 0.2, 10])
PH.calbar(pDi, [ptx - 1, -50.0, 0.2, 20])
pylab.draw()
pylab.show()