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.
111 lines
3.0 KiB
111 lines
3.0 KiB
# -*- encoding: utf-8 -*- |
|
from neuron import h |
|
import pyqtgraph as pg |
|
|
|
import cnmodel.util as util |
|
from .protocol import Protocol |
|
from .. import cells |
|
|
|
|
|
class SimpleSynapseTest(Protocol): |
|
def reset(self): |
|
super(SimpleSynapseTest, self).reset() |
|
|
|
def run( |
|
self, |
|
pre_sec, |
|
post_sec, |
|
temp=34.0, |
|
dt=0.025, |
|
vclamp=-65.0, |
|
iterations=1, |
|
tstop=200.0, |
|
stim_params=None, |
|
**kwds |
|
): |
|
""" |
|
""" |
|
Protocol.run(self, **kwds) |
|
|
|
pre_cell = cells.cell_from_section(pre_sec) |
|
post_cell = cells.cell_from_section(post_sec) |
|
synapse = pre_cell.connect(post_cell, type="simple") |
|
|
|
self.synapse = synapse |
|
self.pre_sec = synapse.terminal.section |
|
self.post_sec = synapse.psd.section |
|
self.pre_cell = pre_cell |
|
self.post_cell = post_cell |
|
|
|
# |
|
# voltage clamp the target cell |
|
# |
|
vccontrol = h.VClamp(0.5, sec=post_cell.soma) |
|
vccontrol.dur[0] = tstop |
|
vccontrol.amp[0] = vclamp |
|
# vccontrol.dur[1] = 100.0 |
|
# vccontrol.amp[1] = clampV |
|
# vccontrol.dur[2] = 20.0 |
|
# vccontrol.amp[2] = clampV |
|
|
|
# |
|
# set up stimulation of the presynaptic axon/terminal |
|
# |
|
|
|
istim = h.iStim(0.5, sec=pre_cell.soma) |
|
stim = { |
|
"NP": 10, |
|
"Sfreq": 100.0, |
|
"delay": 10.0, |
|
"dur": 0.5, |
|
"amp": 10.0, |
|
"PT": 0.0, |
|
"dt": dt, |
|
} |
|
if stim_params is not None: |
|
stim.update(stim_params) |
|
(secmd, maxt, tstims) = util.make_pulse(stim) |
|
self.stim = stim |
|
|
|
if tstop is None: |
|
tstop = len(secmd) * dt |
|
|
|
istim.delay = 0 |
|
istim.dur = 1e9 # these actually do not matter... |
|
istim.iMax = 0.0 |
|
|
|
# istim current pulse train |
|
i_stim_vec = h.Vector(secmd) |
|
i_stim_vec.play(istim._ref_i, dt, 0) |
|
|
|
# |
|
# Run simulation |
|
# |
|
h.tstop = tstop # duration of a run |
|
h.celsius = temp |
|
h.dt = dt |
|
self.temp = temp |
|
self.dt = dt |
|
for nrep in list(range(iterations)): # could do multiple runs.... |
|
self.reset() |
|
self["v_pre"] = pre_cell.soma(0.5)._ref_v |
|
self["t"] = h._ref_t |
|
self["v_soma"] = post_cell.soma(0.5)._ref_v |
|
self["i_soma"] = vccontrol._ref_i |
|
util.custom_init() |
|
h.run() |
|
|
|
def show(self): |
|
self.win = pg.GraphicsWindow() |
|
self.win.resize(800, 800) |
|
t = self["t"] |
|
|
|
p1 = self.win.addPlot(title=self.pre_cell.status["name"]) |
|
p1.setLabels(left="V pre (mV)", bottom="Time (ms)") |
|
p1.plot(t, self["v_pre"]) |
|
|
|
self.win.nextRow() |
|
p2 = self.win.addPlot(title=self.post_cell.status["name"]) |
|
p2.plot(t[1:], self["i_soma"][1:], pen=pg.mkPen("w", width=2)) |
|
p2.setLabels(left="I post (nA)", bottom="Time (ms)") |
|
p2.setXLink(p1)
|
|
|