Changeset 431
- Timestamp:
- 08/26/09 15:10:23 (3 years ago)
- Location:
- branches/interval/src/signals
- Files:
-
- 3 modified
-
analogs.py (modified) (13 diffs)
-
intervals.py (modified) (6 diffs)
-
spikes.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/interval/src/signals/analogs.py
r430 r431 31 31 """ 32 32 33 import os, re, numpy 33 import os, re, numpy, copy 34 34 from NeuroTools import check_dependency, check_numpy_version, analysis 35 35 from NeuroTools.io import * … … 78 78 def __init__(self, signal, dt, t_start=0, t_stop=None, interval=None): 79 79 #logging.debug("Creating AnalogSignal. len(signal)=%d, dt=%g, t_start=%g, t_stop=%s" % (len(signal), dt, t_start, t_stop)) 80 self.signal = signal81 self.dt = float(dt)80 self.signal = signal 81 self.dt = float(dt) 82 82 self.interval = self.create_intervals(t_start, t_stop, interval) 83 83 self.init_times() … … 88 88 if self.t_start >= self.t_stop: 89 89 raise Exception("Incompatible time interval for the creation of the AnalogSignal. t_start=%s, t_stop=%s" % (self.t_start, self.t_stop)) 90 91 self.times = self.interval.time_axis() 92 idx = self.interval.idx_slice_times(self.times) 93 self.signal = self.signal[idx] 90 94 91 95 def create_intervals(self, t_start=None, t_stop=None, interval=None): … … 95 99 # interval is fully defined by the user 96 100 if type(interval) == Interval: 97 interval_out = interval.copy()101 interval_out = interval.copy() 98 102 else : 99 interval_out = Interval(interval) 103 interval_out = Interval(interval) 100 104 else: 101 105 if t_start is None and t_stop is None : … … 116 120 else : 117 121 interval_out = Interval(t_start) 122 118 123 return interval_out 119 124 … … 135 140 Return the duration of the SpikeTrain 136 141 """ 137 return self. t_stop - self.t_start142 return self.interval.total_duration() 138 143 139 144 def __str__(self): … … 156 161 Return a copy of the AnalogSignal object 157 162 """ 158 return AnalogSignal(self.signal, self.dt, self.t_start, self.t_stop)163 return copy.deepcopy(self) 159 164 160 165 def time_axis(self, normalized=False): … … 169 174 norm = 0. 170 175 171 time_pavement = numpy.arange(self.t_start -norm, self.t_stop-norm, self.dt)172 return SpikeTrain(time_pavement, interval=self.interval).spike_times176 time_pavement = numpy.arange(self.t_start, self.t_stop, self.dt) - norm 177 return self.interval.slice_times(time_pavement) 173 178 174 179 def time_offset(self, offset): … … 239 244 assert t_stop <= self.t_stop 240 245 assert t_stop > t_start 241 242 t = self.time_axis() 243 i_start = int((t_start-self.t_start)/self.dt) 244 i_stop = int((t_stop-self.t_start)/self.dt) 245 signal = self.signal[i_start:i_stop] 246 247 return AnalogSignal(signal, self.dt, t_start, t_stop) 246 interval = Interval((t_start, t_stop)) 247 return self.interval_slice(interval) 248 248 249 249 def interval_slice(self, interval): … … 261 261 time_slice 262 262 """ 263 signal_list = [] 264 265 if type(interval) is not Interval : 266 interval = Interval(interval) 267 268 for itv in interval.interval_data : 269 signal_list.append(self.signal[(itv[0]-self.t_start)/self.dt:(itv[1]-self.t_start)/self.dt]) 270 271 return AnalogSignal(signal_list, self.dt, interval) 272 273 def threshold_detection(self, threshold=None, format=None,sign='above'): 263 interval = interval.intersect(self.interval) 264 idx = interval.idx_slice_times(self.times) 265 return AnalogSignal(self.signal[idx], self.dt, interval=interval) 266 267 def threshold_detection(self, threshold=None, format=None, sign='above'): 274 268 """ 275 269 Returns the times when the analog signal crosses a threshold. … … 353 347 # recalculate everything into timesteps, is more stable against rounding errors 354 348 # and subsequent cutouts with different sizes 355 events = numpy.floor(numpy.array(events)/self.dt) 356 t_min_l = numpy.floor(t_min/self.dt) 357 t_max_l = numpy.floor(t_max/self.dt) 358 t_start = numpy.floor(self.t_start/self.dt) 359 t_stop = numpy.floor(self.t_stop/self.dt) 360 361 for spike in events: 362 if ((spike-t_min_l) >= t_start) and ((spike+t_max_l) < t_stop): 363 spike = spike - t_start 364 if average: 365 result += self.signal[(spike-t_min_l):(spike+t_max_l)] 366 else: 367 result.append(self.signal[(spike-t_min_l):(spike+t_max_l)]) 368 Nspikes += 1 349 t_min_l = numpy.floor(t_min/self.dt) 350 t_max_l = numpy.floor(t_max/self.dt) 351 result = numpy.zeros((t_min_l+t_max_l), numpy.float32) 352 events_interval = copy.copy(self.interval) 353 events_interval.offset_start(t_min, colapse=True) 354 events_interval.offset_stop(-t_max, colapse=True) 355 events = events_interval.slice_times(events) 356 assert len(events) > 0, "the PSTH windows [event-t_min, event+t_max] should be included within the spike train interval" 357 for ev in events: 358 ev = numpy.floor((ev - self.interval.t_start())/self.dt) 359 if average: 360 result += self.signal[(spike-t_min_l):(spike+t_max_l)] 361 else: 362 result.append(self.signal[(spike-t_min_l):(spike+t_max_l)]) 363 Nspikes += 1 369 364 if average: 370 365 result = result/Nspikes … … 415 410 assert (t_min >= 0) and (t_max >= 0), "t_min and t_max should be greater than 0" 416 411 assert len(events) > 0, "events should not be empty and should contained at least one element" 417 412 events_interval = copy.copy(self.interval) 413 events_interval.offset_start(t_min, colapse=True) 414 events_interval.offset_stop(-t_max, colapse=True) 415 events = events_interval.slice_times(events) 416 assert len(events) > 0, "the PSTH windows [event-t_min, event+t_max] should be included within the spike train interval" 418 417 result = {} 419 for index, spike in enumerate(events): 420 if ((spike-t_min) >= self.t_start) and ((spike+t_max) < self.t_stop): 421 spike = spike - self.t_start 422 t_start_new = (spike-t_min) 423 t_stop_new = (spike+t_max) 424 result[index] = self.time_slice(t_start_new, t_stop_new) 418 for index, ev in enumerate(events): 419 t_start_new = (ev-t_min) 420 t_stop_new = (ev+t_max) 421 result[index] = self.time_slice(t_start_new, t_stop_new) 425 422 return result 426 427 423 424 425 428 426 class AnalogSignalList(object): 429 427 """ … … 537 535 if len(self) > 0: 538 536 errmsgs = [] 539 print numpy.shape(val.signal)540 537 val = val.interval_slice(self.interval) 541 print numpy.shape(val.signal)542 538 if not val.interval.is_equal(self.interval) : 543 539 raise Exception("the provided signal doesn't cover the AnalogSignalList interval") -
branches/interval/src/signals/intervals.py
r427 r431 5 5 from interval import * 6 6 7 import numpy 7 import numpy, copy 8 8 9 9 class Interval(object): … … 50 50 def __iter__(self): 51 51 return iter(self.sub_intervals) 52 53 def __contains__(self, other): 54 return numpy.all(numpy.any(x.inf <= y.inf and y.sup <= x.sup for x in self.interval_data) for y in other) 52 55 53 56 def __getslice__(self, i, j): … … 102 105 Return a copy of the SpikeTrain object 103 106 """ 104 return Interval(self.sub_intervals)107 return copy.deepcopy(self) 105 108 106 109 def offset_start(self, shift, from_stop=False, colapse=False) : … … 163 166 164 167 def slice_times(self, times) : 165 if times.__class__.__name__ == 'SpikeTrain' :166 times = numpy.array(times.spike_times)167 else :168 times = numpy.array(times)169 168 spikes_selector = numpy.zeros(len(times), dtype=numpy.bool) 169 times = numpy.array(times) 170 170 if HAVE_INTERVAL: 171 171 for itv in self.interval_data : … … 174 174 spikes_selector = (times >= self.t_start()) & (times <= self.t_stop()) 175 175 return numpy.extract(spikes_selector, times) 176 177 def time_axis(self, dt=0.1): 178 result = numpy.array([], float) 179 if HAVE_INTERVAL: 180 for itv in self.interval_data : 181 result = numpy.concatenate((result, numpy.arange(itv[0],itv[1],dt))) 182 else: 183 return numpy.arange(self.t_start(),self.t_stop(),dt) 184 return result 176 185 177 186 def idx_slice_times(self, times): 178 187 spikes_selector = numpy.zeros(len(times), dtype=numpy.bool) 179 188 if HAVE_INTERVAL: 180 for itv in self.interval_data :181 spikes_selector = spikes_selector + (times > itv[0])*(times <=itv[1])189 for itv in self.interval_data: 190 spikes_selector = spikes_selector + (times >= itv[0])*(times < itv[1]) 182 191 else: 183 192 spikes_selector = (times >= self.t_start()) & (times <= self.t_stop()) … … 186 195 def is_equal(self, itv) : 187 196 return self.sub_intervals == itv.sub_intervals 188 189 197 190 198 def intersect(self, itv) : -
branches/interval/src/signals/spikes.py
r430 r431 197 197 Return a copy of the SpikeTrain object 198 198 """ 199 return SpikeTrain(self.spike_times, interval=self.interval)199 return copy.deepcopy(self) 200 200 201 201 … … 869 869 """ 870 870 871 spklist = SpikeList([], [], None, None, self.interval, self.dimensions) 872 for id in self.id_list(): 873 spklist.append(float(id), self.spiketrains[float(id)]) 874 return spklist 871 copy.deepcopy(self) 875 872 876 873 def create_intervals(self, t_start=None, t_stop=None, interval=None):
