Source code for bmtk.simulator.pointnet.modules.iclamp
import nest
from bmtk.simulator.core.modules import iclamp
from bmtk.simulator.pointnet.io_tools import io
[docs]class IClampMod(iclamp.IClampMod):
[docs] def initialize(self, sim):
"""Creates a NEST current clamp (eg step-generator) and attaches it to the given cells."""
# Get a list of amplitude times and values, making sure values are valid for NEST and
# also turning off iclamp after "duration"
# TODO: May be faster if put the has_delays check first
amp_times = []
amp_vals = []
n_steps = len(self._amp_reader.delays)
for idx in range(n_steps):
start_time = self._amp_reader.delays[idx]
if start_time <= sim.dt:
# NEST has issues with amplitude_values that occur before the dt.
io.log_warning(
'IClamp Stimulus has onset ("delay") skipping values that occur before "dt"',
display_once=True
)
continue
# Add a time and amp value for turning on iclamp
amp_times.append(start_time)
amp_vals.append(self._amp_reader.amps[idx])
# if there is a duration, make sure to turn off iclamp (set to 0.0) at timestamp
# delay + duration
if self._amp_reader.has_delays:
duration = self._amp_reader.durations[idx]
stop_time = start_time + duration
last_element = idx + 1 == n_steps
if last_element or stop_time <= self._amp_reader.delays[idx+1]:
amp_times.append(stop_time)
amp_vals.append(0.0)
# Create iclamp/current generator
scg = nest.Create(
"step_current_generator",
params={
'amplitude_times': amp_times,
'amplitude_values': amp_vals
}
)
# attach iclamp to all the specified cells.
# TODO: Check it will work if multiple Node populations are selected!
node_set = sim.net.get_node_set(self._node_set)
nest_ids = node_set.gids()
nest.Connect(scg, list(nest_ids), syn_spec={'delay': sim.dt})