Changeset 432

Show
Ignore:
Timestamp:
08/26/09 15:38:17 (3 years ago)
Author:
pierre
Message:

Should be ok, all tests are passed. The Interval implementation is alsmost finished, up to date, and ensure backward compatibility. It will be tested for some time locally in order to see if bugs could still be found, and then it should be merged in the trunk.

Location:
branches/interval/src/signals
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • branches/interval/src/signals/analogs.py

    r431 r432  
    3131""" 
    3232 
    33 import os, re, numpy, copy 
     33import os, re, numpy, copy, logging 
    3434from NeuroTools import check_dependency, check_numpy_version, analysis 
    3535from NeuroTools.io import * 
     
    349349        t_min_l  = numpy.floor(t_min/self.dt) 
    350350        t_max_l  = numpy.floor(t_max/self.dt) 
    351         result   = numpy.zeros((t_min_l+t_max_l), numpy.float32) 
     351         
    352352        events_interval = copy.copy(self.interval) 
    353353        events_interval.offset_start(t_min, colapse=True) 
     
    355355        events = events_interval.slice_times(events) 
    356356        assert len(events) > 0, "the PSTH windows [event-t_min, event+t_max] should be included within the spike train interval" 
     357         
     358        if average: 
     359            result = numpy.zeros((t_min_l+t_max_l), numpy.float32) 
     360        else: 
     361            result = [] 
     362         
    357363        for ev in events: 
    358364            ev = numpy.floor((ev - self.interval.t_start())/self.dt) 
    359365            if average: 
    360                 result += self.signal[(spike-t_min_l):(spike+t_max_l)] 
     366                result += self.signal[(ev-t_min_l):(ev+t_max_l)] 
    361367            else: 
    362                 result.append(self.signal[(spike-t_min_l):(spike+t_max_l)]) 
     368                result.append(self.signal[(ev-t_min_l):(ev+t_max_l)]) 
    363369            Nspikes += 1 
    364370        if average: 
     
    449455        self.analog_signals = {} 
    450456         
    451         signals = numpy.array(signals)         
     457        signals = numpy.array(signals) 
    452458        for id in id_list: 
    453459            signal = signals[[signals[:,0] == id]][:,1] 
     
    455461            if len(signal) > 0: 
    456462                self.analog_signals[id] = AnalogSignal(signal, self.dt) 
    457         self.interval = self.create_intervals(t_start, t_stop, interval) 
     463 
     464        self.interval = self.create_intervals(t_start, t_stop, interval) 
    458465        self.init_times() 
     466         
    459467        if len(self) > 0: 
    460468            for id in self.id_list(): 
     
    462470                self.analog_signals[id].init_times() 
    463471        self.init_times() 
    464  
    465         #if len(self.id_list()) == 0 : 
    466             #logging.warning("id_list is empty") 
    467             #self.signal_length = 0 
     472        self.times  = self.interval.time_axis() 
    468473                     
    469474    def create_intervals(self, t_start=None, t_stop=None, interval=None): 
     
    483488        else: 
    484489            if t_start is None and t_stop is None : 
    485                 print "AnalogSignal interval derived from dt" 
     490                logging.info("AnalogSignal interval derived from dt") 
    486491                interval_out = Interval([[0,max([len(signal),1])*self.dt]]) 
    487492            elif t_start is None and t_stop is not None: 
     
    489494            elif t_start is not None and t_stop is not None: 
    490495                if (t_stop - t_start)/self.dt != len(signal): 
    491                     print 't_start/t_stop and dt are not consistent with len(signal)' 
     496                    logging.info("t_start/t_stop and dt are not consistent with len(signal)") 
    492497                interval_out = Interval([[t_start, t_stop]]) 
    493498            elif t_start is not None and t_stop is None: 
     
    520525        """ 
    521526        # Maybe not optimal, should be optimized 
    522         aslist = AnalogSignalList([], [], self.dt, self.t_start, self.t_stop, self.dimensions) 
    523         for id in self.id_list(): 
    524             aslist.append(id, self.analog_signals[id]) 
    525         return aslist 
     527        return copy.deepcopy(self) 
    526528     
    527529    def __getitem__(self, id): 
     
    542544            self.interval = self.create_intervals(t_start=None, t_stop=None, interval=val.interval) 
    543545            self.t_start = val.t_start 
    544             self.t_stop = val.t_stop 
     546            self.t_stop  = val.t_stop 
    545547        self.analog_signals[i] = val 
    546548 
     
    585587        self.init_times() 
    586588        time_pavement = numpy.arange(self.t_start, self.t_stop, self.dt) 
    587         return SpikeTrain(time_pavement, interval=self.interval).spike_times 
     589        return self.interval.slice_times(time_pavement) 
    588590 
    589591    def id_offset(self, offset): 
     
    623625        """ 
    624626        id_list = self.__sub_id_list(id_list) 
    625         new_AnalogSignalList = AnalogSignalList([], [], self.dt, self.t_start, self.t_stop, self.dimensions) 
     627        new_AnalogSignalList = AnalogSignalList([], [], self.dt, self.t_start, self.t_stop, self.interval, self.dimensions) 
    626628 
    627629        for id in id_list: 
     
    773775            std 
    774776        """ 
    775         result = [] 
    776         for i in range(len(self.interval)) : 
    777             result.append(numpy.zeros(int((self.interval[i][1] - self.interval[i][0])/self.dt),float)) 
    778             for id in self.id_list(): 
    779                 result[i] += self.analog_signals[id].signal[i] 
    780         return numpy.array(result)/len(self) 
     777        result = numpy.zeros(len(self.times), float) 
     778        for id in self.id_list(): 
     779            result += self.analog_signals[id].signal 
     780        result /= len(self) 
     781        return AnalogSignal(numpy.array(result), dt=self.dt, interval=self.interval) 
    781782     
    782783    def std(self): 
     
    792793            mean 
    793794        """ 
    794         result = [] 
    795         for i in range(len(self.interval)) : 
    796             result.append(numpy.zeros((int((self.interval[i][1] - self.interval[i][0])/self.dt),len(self.id_list())),float)) 
    797            
    798             for j in range(len(self.id_list())): 
    799                 result[i][j,:] = self.analog_signals[j].signal[i] 
    800         return [numpy.std(result[i], axis=0) for i in range(len(self.interval))] 
     795        mu     = self.mean() 
     796        result = numpy.zeros(len(self.times), float) 
     797        for id in self.id_list(): 
     798            result += (self.analog_signals[id].signal - mu.signal)**2 
     799        result = numpy.sqrt(result)/len(self) 
     800        return AnalogSignal(numpy.array(result), dt=self.dt, interval=self.interval) 
     801 
    801802 
    802803    def event_triggered_average(self, eventdict, events_ids = None, analogsignal_ids = None, average = True, t_min = 0, t_max = 100, ylim = None, display = False, mode = 'same', kwargs={}): 
     
    985986 
    986987 
    987 def load_conductancelist(user_file, id_list=None, dt=None, t_start=None, t_stop=None, dims=None): 
     988def load_conductancelist(user_file, id_list=None, dt=None, t_start=None, t_stop=None, interval=None, dims=None): 
    988989    """ 
    989990    Returns TWO ConductanceList objects from a file. One for the excitatory and the other for 
     
    10161017 
    10171018 
    1018 def load_vmlist(user_file, id_list=None, dt=None, t_start=0, t_stop=None, dims=None): 
     1019def load_vmlist(user_file, id_list=None, dt=None, t_start=0, t_stop=None, interval=None, dims=None): 
    10191020    """ 
    10201021    Returns a VmList object from a file. If the file has been generated by PyNN,  
     
    10421043 
    10431044 
    1044 def load_currentlist(user_file, id_list=None, dt=None, t_start=None, t_stop=None, dims=None): 
     1045def load_currentlist(user_file, id_list=None, dt=None, t_start=None, t_stop=None, interval=None, dims=None): 
    10451046    """ 
    10461047    Returns a CurrentList object from a file. If the file has been generated by PyNN,  
  • branches/interval/src/signals/intervals.py

    r431 r432  
    4646 
    4747    def __len__(self): 
    48         return shape(self.interval_data)[0] 
     48        return numpy.shape(self.interval_data)[0] 
    4949     
    5050    def __iter__(self):