Source code for cnmodel.populations.sgc
import logging
import numpy as np
import pyqtgraph.multiprocess as mp
from .population import Population
from .. import cells
[docs]class SGC(Population):
"""A population of spiral ganglion cells.
The cell distribution is uniform from 2kHz to 64kHz, evenly divided between
spontaneous rate groups.
"""
type = 'sgc'
def __init__(self, species='mouse', model='dummy', **kwds):
# Completely fabricated cell distribution: uniform from 2kHz to 40kHz,
# evenly divided between SR groups. We only go up to 40kHz because the
# auditory periphery model does not support >40kHz.
freqs = self._get_cf_array(species)
fields = [
('cf', float),
('sr', int), # 0=low sr, 1=mid sr, 2=high sr
]
super(SGC, self).__init__(species, len(freqs), fields=fields, model=model, **kwds)
self._cells['cf'] = freqs
# evenly distribute SR groups
self._cells['sr'] = np.arange(len(freqs)) % 3
[docs] def set_seed(self, seed):
self.next_seed = seed
[docs] def create_cell(self, cell_rec):
""" Return a single new cell to be used in this population. The
*cell_rec* argument is the row from self.cells that describes the cell
to be created.
"""
return cells.SGC.create(species=self.species, cf=cell_rec['cf'],
sr=cell_rec['sr'], **self._cell_args)
[docs] def connect_pop_to_cell(self, pop, index):
# SGC does not support any inputs
assert len(self.connections) == 0
[docs] def set_sound_stim(self, stim, parallel=False):
"""Set a sound stimulus to generate spike trains for all (real) cells
in this population.
"""
real = self.real_cells()
logging.info("Assigning spike trains to %d SGC cells..", len(real))
if not parallel:
for i, ind in enumerate(real):
logging.info("Assigning spike train to SGC %d (%d/%d)", ind, i, len(real))
cell = self.get_cell(ind)
cell.set_sound_stim(stim, self.next_seed)
self.next_seed += 1
else:
seeds = range(self.next_seed, self.next_seed + len(real))
self.next_seed = seeds[-1] + 1
tasks = zip(seeds, real)
trains = [None] * len(tasks)
# generate spike trains in parallel
with mp.Parallelize(enumerate(tasks), trains=trains, progressDialog='Generating SGC spike trains..') as tasker:
for i, x in tasker:
seed, ind = x
cell = self.get_cell(ind)
train = cell.generate_spiketrain(stim, seed)
tasker.trains[i] = train
# collected all trains; now assign to cells
for i,ind in enumerate(real):
cell = self.get_cell(ind)
cell.set_spiketrain(trains[i])