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.

151 lines
4.9 KiB

from multiprocessing import Pool
from random import randint
from cnmodel import cells
from neuron import h
from tqdm import tqdm
def run(run_input, processes):
results = []
if processes == 1:
for input in run_input:
results.append(_run_trial(input))
else:
p = Pool(processes)
for res in tqdm(p.imap_unordered(_run_trial, run_input)):
results.append(res)
return results
def add_pyramidal_cell():
pyramidal = cells.Pyramidal.create(species="rat")
pyramidal.add_dendrites()
apical_dend = pyramidal.maindend[0]
basal_dend = pyramidal.maindend[1]
return pyramidal
def add_tuberculoventral_cell():
tuberculoventral_1 = cells.Tuberculoventral.create()
tuberculoventral_2 = cells.Tuberculoventral.create()
return tuberculoventral_1, tuberculoventral_2
def add_dstellate_cell():
dstel1ate = cells.DStellateEager.create()
return dstel1ate
def _run_trial(run_input):
seed, info, run_number = run_input
"""
info is a dict
"""
pyramidal = add_pyramidal_cell()
tuberculoventral_1, tuberculoventral_2 = add_tuberculoventral_cell()
dstellate = add_dstellate_cell()
auditory_nerve_cells = []
synapses = []
inhib_synapses = []
# auditory nerve attachments
# attach to pyramidal cell
for nsgc in range(48):
auditory_nerve_cells.append(cells.DummySGC(cf=info["cf"], sr=info["sr"]))
synapses.append(auditory_nerve_cells[-1].connect(pyramidal, type="multisite"))
auditory_nerve_cells[-1].set_sound_stim(
info["stim"],
seed=seed + nsgc + randint(0, 80000),
simulator=info["simulator"],
)
# attach to tuberculoventral 1
for nsgc in range(18):
# attach to tb cell
auditory_nerve_cells.append(cells.DummySGC(cf=info["cf"], sr=info["sr"]))
synapses.append(auditory_nerve_cells[-1].connect(tuberculoventral_1, type=info["synapse_type"]))
auditory_nerve_cells[-1].set_sound_stim(
info["stim"],
seed=seed + nsgc + randint(0, 80000),
simulator=info["simulator"],
)
# attach to tuberculoventral 2
for nsgc in range(18):
# attach to tb cell
auditory_nerve_cells.append(cells.DummySGC(cf=info["cf"], sr=info["sr"]))
synapses.append(auditory_nerve_cells[-1].connect(tuberculoventral_2, type="multisite"))
auditory_nerve_cells[-1].set_sound_stim(
info["stim"],
seed=seed + nsgc + randint(0, 80000),
simulator=info["simulator"],
)
for nsgc in range(24):
# attach to dstellate cell
auditory_nerve_cells.append(cells.DummySGC(cf=info["cf"], sr=info["sr"]))
synapses.append(auditory_nerve_cells[-1].connect(dstellate, type="multisite"))
auditory_nerve_cells[-1].set_sound_stim(
info["stim"],
seed=seed + nsgc + randint(0, 80000),
simulator=info["simulator"],
)
# Connections between network cells
# for _ in range(5):
# inhib_synapses.append(cartwheel.connect(pyramidal, type="simple"))
for _ in range(21):
inhib_synapses.append(tuberculoventral_1.connect(pyramidal, type="simple"))
inhib_synapses.append(tuberculoventral_2.connect(pyramidal, type="simple"))
for _ in range(15):
inhib_synapses.append(dstellate.connect(pyramidal, type="simple"))
inhib_synapses.append(dstellate.connect(tuberculoventral_1, type='simple'))
inhib_synapses.append(dstellate.connect(tuberculoventral_2, type='simple'))
for _ in range(3):
inhib_synapses.append(dstellate.connect(dstellate, type="simple"))
stim = insert_current_clamp(pyramidal.soma)
# set up our recording vectors for each cell
Vm = h.Vector()
Vm.record(pyramidal.soma(0.5)._ref_v)
Vmtb = h.Vector()
Vmtb.record(tuberculoventral_1.soma(0.5)._ref_v)
Vmds = h.Vector()
Vmds.record(dstellate.soma(0.5)._ref_v)
rtime = h.Vector()
rtime.record(h._ref_t)
# hoc trial run
h.tstop = 1e3 * info["run_duration"] # duration of a run
h.celsius = info["temp"]
h.dt = info["dt"]
init_cells([pyramidal, tuberculoventral_1, tuberculoventral_2, dstellate])
info["init"]()
h.t = 0.0
h.run()
# dtime = time.time() - start
# print(f"Trial {run_number} completed after {dtime} secs")
return {
"time": list(rtime),
"vm": list(Vm),
"auditory_nerve_cells": [x._spiketrain.tolist() for x in auditory_nerve_cells],
"vmtb": list(Vmtb),
"vmds": list(Vmds),
}
def insert_current_clamp(sec):
"""
:param sec: to attach too
dur: ms
amp: nA
delay: ms
:return: stim needs to be put in a variable to stay alive
"""
stim = h.IClamp(0.5, sec=sec)
stim.dur = 30
stim.amp = -0.2
stim.delay = 120
return stim
def init_cells(cell: list):
for x in cell:
x.cell_initialize()