def my_raster_plot(self, id_list=None, t_start=None, t_stop=None, display=True, kwargs={}, reduce=1, id_start=0): """ Generate a raster plot for the SpikeList in a subwindow of interest, defined by id_list, t_start and t_stop. Inputs: id_list - can be a integer (and then N cells are randomly selected) or a list of ids. If None, we use all the ids of the SpikeList t_start - in ms. If not defined, the one of the SpikeList object is used t_stop - in ms. If not defined, the one of the SpikeList object is used kwargs - dictionary contening extra parameters that will be sent to the plot function Examples: >> z = subplot(221) >> spikelist.raster_plot(display=z, kwargs={'color':'r'}) See also SpikeTrain.raster_plot """ subplot = get_display(display) if id_list == None: id_list = self.id_list spk = self else: spk = self.id_slice(id_list) if t_start is None: t_start = spk.t_start if t_stop is None: t_stop = spk.t_stop if t_start != spk.t_start or t_stop != spk.t_stop: spk = spk.time_slice(t_start, t_stop) ids, spike_times = spk.convert(format="[ids, times]") idx = numpy.where((spike_times >= t_start) & (spike_times <= t_stop))[0] new_id_list=numpy.arange(len(id_list))+id_start ids_map = dict(zip(id_list, new_id_list)) new_ids=[ids_map[id] for id in ids] if len(spike_times) > 0: subplot.plot(spike_times[::reduce], new_ids[::reduce], ',', **kwargs) xlabel = "Time (ms)" ylabel = "Neuron #" set_labels(subplot, xlabel, ylabel) min_id = numpy.min(new_id_list) max_id = numpy.max(new_id_list) length = t_stop - t_start set_axis_limits(subplot, t_start-0.05*length, t_stop+0.05*length, min_id-2, max_id+2) pylab.draw()
def runTest(self): f = plotting.get_display(True) x = range(10) pylab.plot(x) plotting.set_axis_limits(pylab, 0., 123., -123., 456.) # set up a SimpleMultiplot with arbitrary values self.nrows = 1 self.ncolumns = 1 title = 'testMultiplot' xlabel = 'testXlabel' ylabel = 'testYlabel' scaling = ('linear','log') self.smt = plotting.SimpleMultiplot(nrows=self.nrows, ncolumns=self.ncolumns, title=title, xlabel=xlabel, ylabel=ylabel, scaling=scaling) plotting.set_axis_limits(self.smt.panel(0), 0., 123., -123., 456.)
def runTest(self): f = plotting.get_display(True) x = range(10) pylab.plot(x) plotting.set_axis_limits(pylab, 0., 123., -123., 456.) # set up a SimpleMultiplot with arbitrary values self.nrows = 1 self.ncolumns = 1 title = 'testMultiplot' xlabel = 'testXlabel' ylabel = 'testYlabel' scaling = ('linear', 'log') self.smt = plotting.SimpleMultiplot(nrows=self.nrows, ncolumns=self.ncolumns, title=title, xlabel=xlabel, ylabel=ylabel, scaling=scaling) plotting.set_axis_limits(self.smt.panel(0), 0., 123., -123., 456.)
def event_triggered_average(self, events, average = True, t_min = 0, t_max = 100, display = False, with_time = False, kwargs={}): """ Return the spike triggered averaged of an analog signal according to selected events, on a time window t_spikes - tmin, t_spikes + tmax Can return either the averaged waveform (average = True), or an array of all the waveforms triggered by all the spikes. Inputs: events - Can be a SpikeTrain object (and events will be the spikes) or just a list of times average - If True, return a single vector of the averaged waveform. If False, return an array of all the waveforms. t_min - Time (>0) to average the signal before an event, in ms (default 0) t_max - Time (>0) to average the signal after an event, in ms (default 100) display - if True, a new figure is created. Could also be a subplot. kwargs - dictionary contening extra parameters that will be sent to the plot function Examples: >> vm.event_triggered_average(spktrain, average=False, t_min = 50, t_max = 150) >> vm.event_triggered_average(spktrain, average=True) >> vm.event_triggered_average(range(0,1000,10), average=False, display=True) """ if isinstance(events, SpikeTrain): events = events.spike_times ylabel = "Spike Triggered Average" else: assert numpy.iterable(events), "events should be a SpikeTrain object or an iterable object" ylabel = "Event Triggered Average" assert (t_min >= 0) and (t_max >= 0), "t_min and t_max should be greater than 0" assert len(events) > 0, "events should not be empty and should contained at least one element" time_axis = numpy.linspace(-t_min, t_max, (t_min+t_max)/self.dt) N = len(time_axis) Nspikes = 0. subplot = get_display(display) if average: result = numpy.zeros(N, float) else: result = [] # recalculate everything into timesteps, is more stable against rounding errors # and subsequent cutouts with different sizes events = numpy.floor(numpy.array(events)/self.dt) t_min_l = numpy.floor(t_min/self.dt) t_max_l = numpy.floor(t_max/self.dt) t_start = numpy.floor(self.t_start/self.dt) t_stop = numpy.floor(self.t_stop/self.dt) for spike in events: if ((spike-t_min_l) >= t_start) and ((spike+t_max_l) < t_stop): spike = spike - t_start if average: result += self.signal[(spike-t_min_l):(spike+t_max_l)] else: result.append(self.signal[(spike-t_min_l):(spike+t_max_l)]) Nspikes += 1 if average: result = result/Nspikes else: result = numpy.array(result) if not subplot or not HAVE_PYLAB: if with_time: return result, time_axis else: return result else: xlabel = "Time (ms)" set_labels(subplot, xlabel, ylabel) if average: subplot.plot(time_axis, result, **kwargs) else: for idx in xrange(len(result)): subplot.plot(time_axis, result[idx,:], c='0.5', **kwargs) subplot.hold(1) result = numpy.sum(result, axis=0)/Nspikes subplot.plot(time_axis, result, c='k', **kwargs) xmin, xmax, ymin, ymax = subplot.axis() subplot.plot([0,0],[ymin, ymax], c='r') set_axis_limits(subplot, -t_min, t_max, ymin, ymax) pylab.draw()
def event_triggered_average(self, events, average=True, t_min=0, t_max=100, display=False, with_time=False, kwargs={}): """ Return the spike triggered averaged of an analog signal according to selected events, on a time window t_spikes - tmin, t_spikes + tmax Can return either the averaged waveform (average = True), or an array of all the waveforms triggered by all the spikes. Inputs: events - Can be a SpikeTrain object (and events will be the spikes) or just a list of times average - If True, return a single vector of the averaged waveform. If False, return an array of all the waveforms. t_min - Time (>0) to average the signal before an event, in ms (default 0) t_max - Time (>0) to average the signal after an event, in ms (default 100) display - if True, a new figure is created. Could also be a subplot. kwargs - dictionary contening extra parameters that will be sent to the plot function Examples: >> vm.event_triggered_average(spktrain, average=False, t_min = 50, t_max = 150) >> vm.event_triggered_average(spktrain, average=True) >> vm.event_triggered_average(range(0,1000,10), average=False, display=True) """ if isinstance(events, SpikeTrain): events = events.spike_times ylabel = "Spike Triggered Average" else: assert numpy.iterable( events ), "events should be a SpikeTrain object or an iterable object" ylabel = "Event Triggered Average" assert (t_min >= 0) and (t_max >= 0), "t_min and t_max should be greater than 0" assert len( events ) > 0, "events should not be empty and should contained at least one element" time_axis = numpy.linspace(-t_min, t_max, (t_min + t_max) / self.dt) N = len(time_axis) Nspikes = 0. subplot = get_display(display) if average: result = numpy.zeros(N, float) else: result = [] # recalculate everything into timesteps, is more stable against rounding errors # and subsequent cutouts with different sizes events = numpy.floor(numpy.array(events) / self.dt) t_min_l = numpy.floor(t_min / self.dt) t_max_l = numpy.floor(t_max / self.dt) t_start = numpy.floor(self.t_start / self.dt) t_stop = numpy.floor(self.t_stop / self.dt) for spike in events: if ((spike - t_min_l) >= t_start) and ((spike + t_max_l) < t_stop): spike = spike - t_start if average: result += self.signal[(spike - t_min_l):(spike + t_max_l)] else: result.append(self.signal[(spike - t_min_l):(spike + t_max_l)]) Nspikes += 1 if average: result = result / Nspikes else: result = numpy.array(result) if not subplot or not HAVE_PYLAB: if with_time: return result, time_axis else: return result else: xlabel = "Time (ms)" set_labels(subplot, xlabel, ylabel) if average: subplot.plot(time_axis, result, **kwargs) else: for idx in xrange(len(result)): subplot.plot(time_axis, result[idx, :], c='0.5', **kwargs) subplot.hold(1) result = numpy.sum(result, axis=0) / Nspikes subplot.plot(time_axis, result, c='k', **kwargs) xmin, xmax, ymin, ymax = subplot.axis() subplot.plot([0, 0], [ymin, ymax], c='r') set_axis_limits(subplot, -t_min, t_max, ymin, ymax) pylab.draw()