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.
151 lines
4.7 KiB
151 lines
4.7 KiB
2 years ago
|
from __future__ import print_function
|
||
|
import numpy as np
|
||
|
import pyqtgraph as pg
|
||
|
|
||
|
from neuron import h
|
||
|
|
||
|
import cnmodel.util as util
|
||
|
from .protocol import Protocol
|
||
|
from ..util import custom_init
|
||
|
from cnmodel.util import sound
|
||
|
|
||
|
|
||
|
class PopulationTest(Protocol):
|
||
|
def reset(self):
|
||
|
super(PopulationTest, self).reset()
|
||
|
|
||
|
def run(
|
||
|
self, pops, cf=16e3, temp=34.0, dt=0.025, stim="sound", simulator="cochlea"
|
||
|
):
|
||
|
"""
|
||
|
1. Connect pop1 => pop2
|
||
|
2. Instantiate a single cell in pop2
|
||
|
3. Automatically generate presynaptic cells and synapses from pop1
|
||
|
4. Stimulate presynaptic cells and record postsynaptically
|
||
|
"""
|
||
|
|
||
|
pre_pop, post_pop = pops
|
||
|
pre_pop.connect(post_pop)
|
||
|
self.pre_pop = pre_pop
|
||
|
self.post_pop = post_pop
|
||
|
|
||
|
# start with one cell, selected from the user-selected population, that has
|
||
|
# a cf close to the center CF
|
||
|
post_cell_ind = post_pop.select(1, cf=cf, create=True)[0]
|
||
|
post_cell = post_pop.get_cell(post_cell_ind)
|
||
|
post_pop.resolve_inputs(depth=1)
|
||
|
post_sec = post_cell.soma
|
||
|
self.post_cell_ind = post_cell_ind
|
||
|
self.post_cell = post_cell
|
||
|
|
||
|
pre_cell_inds = post_pop.cell_connections(post_cell_ind)[pre_pop]
|
||
|
pre_cells = [pre_pop.get_cell(i) for i in pre_cell_inds]
|
||
|
pre_secs = [cell.soma for cell in pre_cells]
|
||
|
self.pre_cells = pre_cells
|
||
|
self.pre_cell_inds = pre_cell_inds
|
||
|
self.stim = sound.TonePip(
|
||
|
rate=100e3,
|
||
|
duration=0.1,
|
||
|
f0=cf,
|
||
|
dbspl=60,
|
||
|
ramp_duration=2.5e-3,
|
||
|
pip_duration=0.05,
|
||
|
pip_start=[0.02],
|
||
|
)
|
||
|
|
||
|
##
|
||
|
## voltage clamp the target cell
|
||
|
##
|
||
|
# clampV = 40.0
|
||
|
# vccontrol = h.VClamp(0.5, sec=post_cell.soma)
|
||
|
# vccontrol.dur[0] = 10.0
|
||
|
# vccontrol.amp[0] = clampV
|
||
|
# vccontrol.dur[1] = 100.0
|
||
|
# vccontrol.amp[1] = clampV
|
||
|
# vccontrol.dur[2] = 20.0
|
||
|
# vccontrol.amp[2] = clampV
|
||
|
|
||
|
#
|
||
|
# set up stimulation of the presynaptic cells
|
||
|
#
|
||
|
self.stim_params = []
|
||
|
self.istim = []
|
||
|
for i, pre_cell in enumerate(pre_cells):
|
||
|
if stim == "sound":
|
||
|
pre_cell.set_sound_stim(self.stim, seed=i, simulator=simulator)
|
||
|
amp = 0.0
|
||
|
else:
|
||
|
amp = 3.0
|
||
|
istim = h.iStim(0.5, sec=pre_cell.soma)
|
||
|
stim = {}
|
||
|
stim["NP"] = 10
|
||
|
stim["Sfreq"] = 100.0 # stimulus frequency
|
||
|
stim["delay"] = 10.0
|
||
|
stim["dur"] = 0.5
|
||
|
stim["amp"] = amp
|
||
|
stim["PT"] = 0.0
|
||
|
stim["dt"] = dt
|
||
|
(secmd, maxt, tstims) = util.make_pulse(stim)
|
||
|
self.stim_params.append(stim)
|
||
|
|
||
|
# istim current pulse train
|
||
|
i_stim_vec = h.Vector(secmd)
|
||
|
i_stim_vec.play(istim._ref_i, dt, 0, pre_cell.soma(0.5))
|
||
|
self.istim.append((istim, i_stim_vec))
|
||
|
self["istim"] = istim._ref_i
|
||
|
|
||
|
# record presynaptic Vm
|
||
|
self["v_pre%d" % i] = pre_cell.soma(0.5)._ref_v
|
||
|
|
||
|
self["t"] = h._ref_t
|
||
|
self["v_post"] = post_cell.soma(0.5)._ref_v
|
||
|
|
||
|
#
|
||
|
# Run simulation
|
||
|
#
|
||
|
h.dt = dt
|
||
|
self.dt = dt
|
||
|
h.celsius = post_cell.status["temperature"]
|
||
|
self.temp = h.celsius
|
||
|
post_cell.cell_initialize() # proper initialization.
|
||
|
h.dt = self.dt
|
||
|
custom_init(v_init=post_cell.vm0)
|
||
|
h.t = 0.0
|
||
|
h.tstop = 200.0
|
||
|
while h.t < h.tstop:
|
||
|
h.fadvance()
|
||
|
|
||
|
def show(self):
|
||
|
print(
|
||
|
"Connected %d presynaptic cells to 1 postsynaptic cell."
|
||
|
% len(self.pre_cell_inds)
|
||
|
)
|
||
|
print("Postsynaptic CF = %0.2f" % self.post_pop.cells[self.post_cell_ind]["cf"])
|
||
|
print("Presynaptic CF = %s" % self.pre_pop.cells[self.pre_cell_inds]["cf"])
|
||
|
|
||
|
self.win = pg.GraphicsWindow()
|
||
|
self.win.resize(1000, 1000)
|
||
|
|
||
|
cmd_plot = self.win.addPlot(title="Stim")
|
||
|
try:
|
||
|
cmd_plot.plot(self["t"], self["istim"])
|
||
|
except:
|
||
|
pass
|
||
|
|
||
|
self.win.nextRow()
|
||
|
pre_plot = self.win.addPlot(title=self.pre_cells[0].type + " Vm")
|
||
|
for i in range(len(self.pre_cells)):
|
||
|
pre_plot.plot(
|
||
|
self["t"],
|
||
|
self["v_pre%d" % i],
|
||
|
pen=pg.mkPen(
|
||
|
pg.intColor(i, len(self.pre_cells)),
|
||
|
hues=len(self.pre_cells),
|
||
|
width=1.0,
|
||
|
),
|
||
|
)
|
||
|
|
||
|
self.win.nextRow()
|
||
|
post_plot = self.win.addPlot(title="Post Cell: %s" % self.post_cell.type)
|
||
|
post_plot.plot(self["t"], self["v_post"])
|