Source code for bmtk.simulator.bionet.modules.seclamp

import numpy as np
from neuron import h

from bmtk.simulator.bionet.modules.sim_module import SimulatorMod
from bmtk.simulator.bionet.io_tools import io
from bmtk.simulator.core.modules import iclamp


[docs] class SEClamp(SimulatorMod): def __init__(self, input_type, **mod_args): # Select location to place iclamp, if not specified use the center of the soma self._section_name = mod_args.get('section_name', 'soma') self._section_index = mod_args.get('section_index', 0) self._section_dist = mod_args.get('section_dist', 0.5) self._rs = mod_args.get('resistance', 1.0) self._vc = mod_args.get('vc', 0.0) self._delay = mod_args['delay'] self._amp = mod_args['amp'] self._duration = mod_args['duration'] self._ton = self._delay self._toff = self._delay + self._duration # Check f section_index is a range (ie. "section_index": [500.0, 1000.0]) self._ranged_index = isinstance(self._section_index, (list, tuple)) # SEClamp objects need to be saved in memory otherwise NRN will try to garbage collect them # prematurly self._seclamp = None self._node_set = mod_args.get('node_set', 'all')
[docs] def initialize(self, sim): select_gids = list(sim.net.get_node_set(self._node_set).gids()) gids_on_rank = list(set(select_gids) & set(select_gids)) for gid in gids_on_rank: cell = sim.net.get_cell_gid(gid) if self._ranged_index: hobj_sec = self._find_section(cell) else: hobj_sec = getattr(cell.hobj, self._section_name)[self._section_index](self._section_dist) self._seclamp = self.create_clamp(hobj_sec)
[docs] def step(self, sim, tstep): if self._ton <= sim.dt*tstep <= self._toff: self._seclamp.rs = self._rs # print(sim.dt*tstep) else: self._seclamp.rs = 10.0e20
[docs] def create_clamp(self, hobj): stim = h.SEClamp(hobj) stim.dur1 = self._delay stim.dur2 = self._duration stim.dur3 = 0.0 stim.amp1 = 0.0 stim.amp2 = self._amp stim.amp3 = 0.0 stim.vc = self._vc return stim