예제 #1
0
파일: cells.py 프로젝트: agravier/pynn
class VectorSpikeSource(hclass(h.VecStim)):

    parameter_names = ('spike_times', )

    def __init__(self, spike_times=[]):
        self.spike_times = spike_times
        self.source = self
        self.source_section = None

    def _set_spike_times(self, spike_times):
        try:
            self._spike_times = h.Vector(spike_times)
        except RuntimeError:
            raise errors.InvalidParameterValueError(
                "spike_times must be an array of floats")
        self.play(self._spike_times)

    def _get_spike_times(self):
        return self._spike_times

    spike_times = property(fget=_get_spike_times, fset=_set_spike_times)

    def record(self, active):
        """
        Since spike_times are specified by user, recording is meaningless, but
        we need to provide a stub for consistency with other models.
        """
        pass
예제 #2
0
class RandomSpikeSource(hclass(h.NetStimFD)):

    parameter_names = ('start', '_interval', 'duration')

    def __init__(self, start=0, _interval=1e12, duration=0):
        self.start = start
        self.interval = _interval
        self.duration = duration
        self.noise = 1
        self.spike_times = h.Vector(0)
        self.source = self
        self.rec = h.NetCon(self, None)
        self.switch = h.NetCon(None, self)
        self.source_section = None
        # should allow user to set specific seeds somewhere, e.g. in setup()
        self.seed(state.mpi_rank + state.native_rng_baseseed)

    def __new__(cls, *arg, **kwargs):
        return super().__new__(cls, *arg, **kwargs)

    def _set_interval(self, value):
        self.switch.weight[0] = -1
        self.switch.event(h.t + 1e-12, 0)
        self.interval = value
        self.switch.weight[0] = 1
        self.switch.event(h.t + 2e-12, 1)

    def _get_interval(self):
        return self.interval

    _interval = property(fget=_get_interval, fset=_set_interval)
예제 #3
0
class RandomSpikeSource(hclass(h.NetStimFD)):
    
    parameter_names = ('start', '_interval', 'duration')
    
    def __init__(self, start=0, _interval=1e12, duration=0):
        self.start = start
        self.interval = _interval
        self.duration = duration
        self.noise = 1
        self.spike_times = h.Vector(0)
        self.source = self
        self.switch = h.NetCon(None, self)

    def _set_interval(self, value):
        self.switch.weight[0] = -1
        self.switch.event(h.t+1e-12, 0)
        self.interval = value
        self.switch.weight[0] = 1
        self.switch.event(h.t+2e-12, 1)
    def _get_interval(self):
        return self.interval
    _interval = property(fget=_get_interval, fset=_set_interval)

    def record(self, active):
        if active:
            self.rec = h.NetCon(self, None)
            self.rec.record(self.spike_times)
예제 #4
0
파일: cells.py 프로젝트: sbrich/PyNN
class VectorSpikeSource(hclass(h.VecStim)):

    parameter_names = ('spike_times', )

    def __init__(self, spike_times=[]):
        self.spike_times = spike_times
        self.source = self
        self.source_section = None
        self.rec = None

    def _set_spike_times(self, spike_times):
        # spike_times should be a Sequence object
        try:
            self._spike_times = h.Vector(spike_times.value)
        except (RuntimeError, AttributeError):
            raise errors.InvalidParameterValueError(
                "spike_times must be an array of floats")
        if numpy.any(spike_times.value[:-1] > spike_times.value[1:]):
            raise errors.InvalidParameterValueError(
                "Spike times given to SpikeSourceArray must be in increasing order"
            )
        self.play(self._spike_times)

    def _get_spike_times(self):
        return self._spike_times

    spike_times = property(fget=_get_spike_times, fset=_set_spike_times)

    def clear_past_spikes(self):
        """If previous recordings are cleared, need to remove spikes from before the current time."""
        end = self._spike_times.indwhere(">", h.t)
        if end > 0:
            self._spike_times.remove(0, end - 1)  # range is inclusive
예제 #5
0
    class A1(neuron.hclass(neuron.h.A)):
        def __new__(cls, arg):
            return super().__new__(cls, arg)

        def __init__(self, arg):
            self.bp = self.baseattr("p")

        def p(self):
            self.bp()
            return self.x
예제 #6
0
class VectorSpikeSource(hclass(h.VecStim)):

    parameter_names = ('spike_times', )

    def __init__(self, spike_times=[]):
        self.recording = False
        self.spike_times = spike_times
        self.source = self
        self.source_section = None
        self.rec = None
        self._recorded_spikes = np.array([])

    def __new__(cls, *arg, **kwargs):
        return super().__new__(cls, *arg, **kwargs)

    def _set_spike_times(self, spike_times):
        # spike_times should be a Sequence object
        try:
            self._spike_times = h.Vector(spike_times.value)
        except (RuntimeError, AttributeError):
            raise errors.InvalidParameterValueError(
                "spike_times must be an array of floats")
        if np.any(spike_times.value[:-1] > spike_times.value[1:]):
            raise errors.InvalidParameterValueError(
                "Spike times given to SpikeSourceArray must be in increasing order"
            )
        self.play(self._spike_times)
        if self.recording:
            self._recorded_spikes = np.hstack(
                (self._recorded_spikes, spike_times.value))

    def _get_spike_times(self):
        return self._spike_times.as_numpy()

    spike_times = property(fget=_get_spike_times, fset=_set_spike_times)

    @property
    def recording(self):
        return self._recording

    @recording.setter
    def recording(self, value):
        self._recording = value
        if value:
            # when we turn recording on, the cell may already have had its spike times assigned
            self._recorded_spikes = np.hstack(
                (self._recorded_spikes, self.spike_times))

    def get_recorded_spike_times(self):
        return self._recorded_spikes

    def clear_past_spikes(self):
        """If previous recordings are cleared, need to remove spikes from before the current time."""
        self._recorded_spikes = self._recorded_spikes[
            self._recorded_spikes > h.t]
예제 #7
0
파일: cells.py 프로젝트: sbrich/PyNN
class RandomPoissonRefractorySpikeSource(hclass(h.PoissonStimRefractory)):

    parameter_names = ('rate', 'tau_refrac', 'start', 'duration')

    def __init__(self, rate=1, tau_refrac=0.0, start=0, duration=0):
        self.rate = rate
        self.tau_refrac = tau_refrac
        self.start = start
        self.duration = duration
        self.spike_times = h.Vector(0)
        self.source = self
        self.rec = h.NetCon(self, None)
        self.source_section = None
        self.seed(state.mpi_rank + state.native_rng_baseseed)
예제 #8
0
파일: cells.py 프로젝트: sbrich/PyNN
class RandomGammaSpikeSource(hclass(h.GammaStim)):

    parameter_names = ('alpha', 'beta', 'start', 'duration')

    def __init__(self, alpha=1, beta=0.1, start=0, duration=0):
        self.alpha = alpha
        self.beta = beta
        self.start = start
        self.duration = duration
        self.spike_times = h.Vector(0)
        self.source = self
        self.rec = h.NetCon(self, None)
        self.switch = h.NetCon(None, self)
        self.source_section = None
        self.seed(state.mpi_rank + state.native_rng_baseseed)
예제 #9
0
파일: cells.py 프로젝트: muffgaga/PyNN
class VectorSpikeSource(hclass(h.VecStim)):

    parameter_names = ('spike_times',)

    def __init__(self, spike_times=[]):
        self.spike_times = spike_times
        self.source = self
        self.source_section = None
        self.rec = None

    def _set_spike_times(self, spike_times):
        # spike_times should be a Sequence object
        try:
            self._spike_times = h.Vector(spike_times.value)
        except (RuntimeError, AttributeError):
            raise errors.InvalidParameterValueError("spike_times must be an array of floats")
        self.play(self._spike_times)

    def _get_spike_times(self):
        return self._spike_times

    spike_times = property(fget=_get_spike_times,
                           fset=_set_spike_times)
예제 #10
0
class B(neuron.hclass(h.A)):
    x = 0  # overrides h.A.x

    def __init__(self):
        self.x = 2