Changeset 427

Show
Ignore:
Timestamp:
08/25/09 14:31:39 (3 years ago)
Author:
pierre
Message:

Now all the tests are passed, more or less, with the Intervals. So backward compatibility is ensured :-)

Location:
branches/interval
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • branches/interval/src/io.py

    r401 r427  
    195195        p = self.__check_params(params) 
    196196        from NeuroTools.signals import spikes 
    197         return spikes.SpikeList(self.get_data(), p['id_list'], p['t_start'], p['t_stop'], p['dims']) 
     197        return spikes.SpikeList(self.get_data(), p['id_list'], t_start=p['t_start'], t_stop=p['t_stop'], dims=p['dims']) 
    198198 
    199199    def read_analogs(self, type, params): 
  • branches/interval/src/signals/intervals.py

    r422 r427  
    102102        Return a copy of the SpikeTrain object 
    103103        """ 
    104         return Interval(self.start_times, self.end_times, self.t_start, self.t_stop) 
     104        return Interval(self.sub_intervals) 
    105105 
    106106    def offset_start(self, shift, from_stop=False, colapse=False) : 
  • branches/interval/src/signals/spikes.py

    r426 r427  
    2525""" 
    2626 
    27 import os, re, numpy 
    28 import copy 
    29 import logging 
     27import os, re, numpy, copy, logging 
    3028from NeuroTools import check_dependency, check_numpy_version, analysis 
    3129from NeuroTools.io import * 
     
    9795            raise ValueError("spikes time stamps should be *positive* *numbers*") 
    9896 
    99         self.interval = self.extract_intervals_from_SpikeTrain_arguments(t_start, t_stop, interval) 
    100         self.update_t_start_and_t_stop() 
     97        self.interval = self.create_intervals(t_start, t_stop, interval) 
     98        self.init_times() 
    10199         
    102100        if not (self.t_start >= 0) and (self.t_stop >= 0) : 
     
    110108 
    111109 
    112     def extract_intervals_from_SpikeTrain_arguments(self, t_start=None, t_stop=None, interval=None) : 
     110    def create_intervals(self, t_start=None, t_stop=None, interval=None) : 
    113111        if interval is not None: 
    114112            # interval is fully defined by the user 
    115             if interval.__class__.__name__ == 'Interval' : 
    116                 interval_out = interval 
     113            if type(interval) == Interval: 
     114                interval_out = interval.copy() 
    117115            else : 
    118116                interval_out = Interval(interval)  
    119         else:  
    120             if t_start == None and t_stop == None : 
     117        else: 
     118            if t_start is None and t_stop is None : 
    121119                try: 
    122120                    t_start = numpy.min(self.spike_times) 
    123121                except Exception: 
    124                     print "Error in guessing t_start (first spike), spikes may be empty !" 
     122                    print "SpikeList error in guessing t_start (first spike), spikes may be empty !" 
    125123                    t_start = 0 
    126124                try: 
    127125                    t_stop  = numpy.max(self.spike_times) 
    128126                except Exception: 
    129                     print "Error in guessing t_stop (last spike), spikes may be empty !" 
     127                    print "SpikeList error in guessing t_stop (last spike), spikes may be empty !" 
    130128                    t_stop = t_start+0.1 
    131129                interval_out = Interval([[t_start, t_stop]]) 
    132             else : 
    133                 if t_start == None : 
     130            elif t_start is None and t_stop is not None: 
     131                try: 
     132                    t_start  = numpy.min(self.spike_times) 
     133                except Exception: 
     134                    print "SpikeList error in guessing t_start (first spike), spikes may be empty !" 
     135                    t_start = 0 
     136                interval_out = Interval([[t_start, t_stop]]) 
     137            elif t_start is not None and t_stop is not None: 
     138                interval_out = Interval([[t_start, t_stop]]) 
     139            elif t_start is not None and t_stop is None: 
     140                if type(t_start) == float or type(t_start) == int: 
    134141                    try: 
    135                         t_start  = numpy.min(self.spike_times) 
     142                        t_stop  = numpy.max(self.spike_times) 
    136143                    except Exception: 
    137                         print "Error in guessing t_stop (last spike), spikes may be empty !" 
    138                         t_start = 0 
    139                     interval_out = Interval([[t_start, t_stop]]) 
    140                 if t_stop == None : 
    141                     if t_start.__class__.__name__ == 'float' or t_start.__class__.__name__ == 'int' : 
    142                         try: 
    143                             t_stop  = numpy.max(self.spike_times) 
    144                         except Exception: 
    145                             print "Error in guessing t_stop (last spike), spikes may be empty !" 
    146                             t_stop = t_start+0.1 
    147                         interval_out = Interval([[t_start, t_stop]])  
    148                     else : 
    149                         if t_start.__class__.__name__ == 'Interval' : 
    150                             interval_out = t_start 
    151                         else : 
    152                             interval_out = Interval(t_start) 
    153                 if not (t_start == None or t_stop == None) : 
    154                     interval_out = Interval([[t_start, t_stop]]) 
     144                        print "SpikeList error in guessing t_stop (last spike), spikes may be empty !" 
     145                        t_stop = t_start+0.1 
     146                    interval_out = Interval([[t_start, t_stop]])  
     147                else : 
     148                    if type(t_start) == Interval: 
     149                        interval_out = t_start.copy() 
     150                    else : 
     151                        interval_out = Interval(t_start) 
    155152        return interval_out 
    156153 
     
    173170        return (self.interval.t_start(), self.interval.t_stop()) 
    174171 
    175     def update_t_start_and_t_stop(self): 
     172    def init_times(self): 
    176173        """ 
    177174        Update the t_start and t_stop constant to reflect the current t_start() and t_stop() methods 
    178175        """ 
    179176        self.t_start = self.interval.t_start() 
    180         self.t_stop = self.interval.t_stop() 
     177        self.t_stop  = self.interval.t_stop() 
    181178     
    182179    def is_equal(self, spktrain): 
     
    229226                                        spiketrain.spike_times) 
    230227        self.interval = self.interval.union(spiketrain.interval) 
    231         self.update_t_start_and_t_stop() 
     228        self.init_times() 
    232229 
    233230    def format(self, relative=False, quantized=False): 
     
    304301                34.2 
    305302        """ 
    306         if not (t_start==None and t_stop==None and interval==None) : 
    307             rate_interval = self.extract_intervals_from_SpikeTrain_arguments(t_start, t_stop, interval) 
    308             rate_interval = rate_interval.intersect(self.interval) 
    309             idx           = rate_interval.slice_times(self.spike_times) 
    310         else : 
    311             idx           = self.spike_times 
    312             rate_interval = self.interval 
    313  
    314         return 1000.*len(idx)/rate_interval.total_duration() 
     303         
     304        interval = self.create_intervals(t_start, t_stop, interval) 
     305         
     306        if interval.is_equal(self.interval): 
     307            idx      = self.spike_times 
     308        else: 
     309            interval = interval.intersect(self.interval) 
     310            idx      = interval.slice_times(self.spike_times) 
     311        return 1000.*len(idx)/interval.total_duration() 
    315312 
    316313    def cv_isi(self, t_start=None, t_stop=None, interval=None): 
     
    416413        """ 
    417414        if newnum: 
    418             axis = numpy.arange(self.interval.t_start(), self.interval.t_stop()+time_bin, time_bin) 
    419         else: 
    420             axis = numpy.arange(self.interval.t_start(), self.interval.t_stop(), time_bin) 
     415            axis = numpy.arange(self.t_start, self.t_stop+time_bin, time_bin) 
     416        else: 
     417            axis = numpy.arange(self.t_start, self.t_stop, time_bin) 
    421418        return axis 
    422419 
     
    440437        """ 
    441438         
    442         raster_interval = extract_intervals_from_SpikeTrain_arguments(t_start, t_stop, interval) 
     439        raster_interval = self.create_intervals(t_start, t_stop, interval) 
    443440 
    444441        if not raster_interval.is_equal(self.interval): 
     
    476473        self.interval.offset_full(offset) 
    477474        self.spike_times += offset 
    478         self.update_t_start_and_t_stop() 
     475        self.init_times() 
    479476 
    480477 
     
    496493        """ 
    497494        interval = Interval((t_start, t_stop))  
    498         sliced = self.interval_slice(interval) 
    499         sliced.update_t_start_and_t_stop() 
    500         return sliced 
     495        return self.interval_slice(interval) 
    501496 
    502497    def interval_slice(self, interval): 
     
    841836            break_points = numpy.concatenate((break_points, [N])) 
    842837 
    843             # even if a spikeTrain is empty, add ID to the cell list 
    844             for id in id_list: 
    845                 self.spiketrains[id] = SpikeTrain([]) 
    846838            # if there are spikes corresponding to an ID, add it 
    847839            for idx in xrange(len(break_points)-1): 
     
    850842                    self.spiketrains[id] = SpikeTrain(spikes[break_points[idx]:break_points[idx+1], 1]) 
    851843         
    852         self.interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval) 
     844        self.interval = self.create_intervals(t_start, t_stop, interval) 
    853845         
    854846        if len(self) > 0: 
    855847            for id in self.spiketrains.keys(): 
    856                 self.spiketrains[id].interval = self.interval 
    857                 self.spiketrains[id].update_t_start_and_t_stop() 
    858  
    859         self.update_t_start_and_t_stop() 
     848                self.spiketrains[id] = self.spiketrains[id].interval_slice(self.interval) 
     849                self.spiketrains[id].init_times() 
     850         
     851        self.init_times() 
     852        self.complete(id_list) 
    860853 
    861854    def id_list(self): 
     
    868861                [0,1,2,3,....,9999] 
    869862        """ 
    870         return numpy.array(self.spiketrains.keys(), int) 
     863        return numpy.sort(numpy.array(self.spiketrains.keys(), int)) 
    871864 
    872865    def copy(self): 
     
    875868        """ 
    876869 
    877         spklist = SpikeList([], [], self.interval, self.dimensions) 
     870        spklist = SpikeList([], [], None, None, self.interval, self.dimensions) 
    878871        for id in self.id_list(): 
    879872            spklist.append(float(id), self.spiketrains[float(id)]) 
    880873        return spklist 
    881874 
    882     def extract_intervals_from_SpikeList_arguments(self, t_start, t_stop, interval) :  
     875    def create_intervals(self, t_start, t_stop, interval) :  
    883876        if interval is not None: 
    884877            # interval is fully defined by the user 
    885             if interval.__class__.__name__ == 'Interval' : 
    886                 interval_out = interval 
     878            if type(interval) == Interval: 
     879                interval_out = interval.copy() 
    887880            else : 
    888881                interval_out = Interval(interval)  
    889882        else:  
    890             if t_start == None and t_stop == None : 
     883            if t_start is None and t_stop is None : 
    891884                try: 
    892                     start_times = numpy.array([self.spiketrains[idx].t_start for idx in self.id_list()], numpy.float32) 
    893                     t_start     = numpy.min(start_times) 
     885                    start_times = numpy.array([self.spiketrains[idx].t_start for idx in self.id_list()]) 
     886                    t_start     = numpy.min(start_times) 
    894887                    logging.debug("Warning, t_start is infered from the data : %f" %t_start) 
    895888                except Exception: 
    896                     print "Error in guessing t_start (first spike), spikes may be empty !" 
     889                    print "SpikeList error in guessing t_start (first spike), spikes may be empty !" 
    897890                    t_start = 0 
    898891                try: 
    899                     stop_times = numpy.array([self.spiketrains[idx].t_stop for idx in self.id_list()], numpy.float32) 
     892                    stop_times = numpy.array([self.spiketrains[idx].t_stop for idx in self.id_list()]) 
    900893                    t_stop  = numpy.max(stop_times) 
    901894                    logging.debug("Warning, t_stop  is infered from the data : %f" %t_stop)      
    902895                except Exception: 
    903896                    t_stop = t_start + 0.1 
    904                     print "Error in guessing t_stop (last spike), spikes may be empty !" 
     897                    print "SpikeList error in guessing t_stop (last spike), spikes may be empty !" 
    905898                interval_out = Interval([[t_start, t_stop]]) 
    906             else : 
    907                 if t_start == None : 
     899            elif t_start is None and t_stop is not None: 
     900                try: 
     901                    start_times = numpy.array([self.spiketrains[idx].t_start for idx in self.id_list()]) 
     902                    t_start = numpy.min(start_times) 
     903                    logging.debug("Warning, t_start is infered from the data : %f" %t_start) 
     904                except Exception: 
     905                    print "SpikeList error in guessing t_start (first spike), spikes may be empty !" 
     906                    t_start = 0 
     907                interval_out = Interval([[t_start, t_stop]]) 
     908            elif t_start is not None and t_stop is not None: 
     909                interval_out = Interval([[t_start, t_stop]]) 
     910            elif t_start is not None and t_stop is None: 
     911                if type(t_start) == float or type(t_start) == int : 
    908912                    try: 
    909                         start_times = numpy.array([self.spiketrains[idx].t_start for idx in self.id_list()], numpy.float32) 
    910                         t_start = numpy.min(start_times) 
    911                         logging.debug("Warning, t_start is infered from the data : %f" %t_start) 
     913                        stop_times = numpy.array([self.spiketrains[idx].t_stop for idx in self.id_list()]) 
     914                        t_stop  = numpy.max(stop_times) 
     915                        logging.debug("Warning, t_stop  is infered from the data : %f" %t_stop)  
    912916                    except Exception: 
    913                         print "Error in guessing t_stop (last spike), spikes may be empty !" 
    914                         t_start = 0 
    915                     interval_out = Interval([[t_start, t_stop]]) 
    916                 if t_stop == None : 
    917                     if t_start.__class__.__name__ == 'float' or t_start.__class__.__name__ == 'int' : 
    918                         try: 
    919                             stop_times = numpy.array([self.spiketrains[idx].t_stop for idx in self.id_list()], numpy.float64) 
    920                             t_stop  = numpy.max(stop_times) 
    921                             logging.debug("Warning, t_stop  is infered from the data : %f" %t_stop)      
    922                         except Exception: 
    923                             print "Error in guessing t_stop (last spike), spikes may be empty !" 
    924                             t_stop = t_start+0.1 
    925                         interval_out = Interval([[t_start, t_stop]])  
     917                        print "SpikeList error in guessing t_stop (last spike), spikes may be empty !" 
     918                        t_stop = t_start+0.1 
     919                    interval_out = Interval([[t_start, t_stop]])  
     920                else : 
     921                    if type(t_start) == Interval : 
     922                        interval_out = t_start.copy() 
    926923                    else : 
    927                         if t_start.__class__.__name__ == 'Interval' : 
    928                             interval_out = t_start 
    929                         else : 
    930                             interval_out = Interval(t_start) 
    931                 if not (t_start == None or t_stop == None) : 
    932                     interval_out = Interval([[t_start, t_stop]]) 
     924                        interval_out = Interval(t_start) 
    933925        return interval_out 
    934926 
    935927 
    936928    def __getitem__(self, id): 
    937         if id in self.id_list(): 
     929        if self.spiketrains.has_key(id): 
    938930            return self.spiketrains[id] 
    939931        else: 
     
    10311023        return (self.interval.t_start(), self.interval.t_stop()) 
    10321024 
    1033     def update_t_start_and_t_stop(self): 
     1025    def init_times(self): 
    10341026        """ 
    10351027        Update the t_start and t_stop constant to reflect the current t_start() and t_stop() methods 
    10361028        """ 
    10371029        self.t_start = self.interval.t_start() 
    1038         self.t_stop = self.interval.t_stop() 
     1030        self.t_stop  = self.interval.t_stop() 
    10391031 
    10401032    def time_axis(self, time_bin): 
     
    10761068            for id in sl.id_list(): 
    10771069                self.append(id, sl.spiketrains[id]) 
    1078         self.update_t_start_and_t_stop() 
     1070        self.init_times() 
    10791071 
    10801072 
     
    11031095                    spiketrain.relative_times() 
    11041096                self.append(id, spiketrain) 
    1105         self.update_t_start_and_t_stop() 
     1097        self.init_times() 
    11061098                 
    11071099     
     
    11471139            time_slice, interval_slice 
    11481140        """ 
    1149         new_SpkList = SpikeList([], [], self.interval, self.dimensions) 
     1141        new_SpkList = SpikeList([], [], None, None, self.interval, self.dimensions) 
    11501142        id_list = self.__sub_id_list(id_list) 
    11511143        for id in id_list: 
     
    11681160        """ 
    11691161        interval = Interval((t_start, t_stop)) 
    1170         sliced = self.interval_slice(interval) 
    1171         sliced.update_t_start_and_t_stop() 
     1162        sliced   = self.interval_slice(interval) 
    11721163        return sliced 
    11731164         
     
    11841175            id_slice, time_slice 
    11851176        """ 
    1186         new_SpkList = SpikeList([], [], interval, self.dimensions) 
     1177        new_SpkList = SpikeList([], [], None, None, interval, self.dimensions) 
    11871178        for id in self.id_list(): 
    11881179            new_SpkList.append(id, self.spiketrains[id].interval_slice(interval)) 
     
    12071198        for id in self.id_list(): 
    12081199            self.spiketrains[id].time_offset(offset) 
    1209         self.update_t_start_and_t_stop() 
     1200        self.init_times() 
    12101201 
    12111202    def id_offset(self, offset): 
     
    14091400             
    14101401        """ 
    1411         ids = self.id_list() 
    1412         N   = len(ids) 
     1402        ids     = self.id_list() 
     1403        N       = len(ids) 
    14131404        cvs_isi = numpy.empty(N) 
    14141405        for idx in xrange(N): 
     
    15431534         
    15441535        Inputs: 
     1536            t_start  - ?? 
     1537            t_stop   - ?? 
    15451538            interval - An interval object 
    15461539         
     
    15541547            mean_rates, mean_rate_std 
    15551548        """ 
    1556         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval) 
    1557  
    1558         return numpy.mean(self.mean_rates(interval)) 
     1549        return numpy.mean(self.mean_rates(t_start, t_stop, interval)) 
    15591550 
    15601551 
     
    15761567            mean_rate, mean_rates 
    15771568        """ 
    1578         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval) 
    1579         return numpy.std(self.mean_rates(interval)) 
     1569        return numpy.std(self.mean_rates(t_start, t_stop, interval)) 
    15801570 
    15811571 
     
    15921582            mean_rate, mean_rate_std 
    15931583        """ 
    1594         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval) 
    1595         rates = [] 
     1584        interval = self.create_intervals(t_start, t_stop, interval) 
     1585        rates    = [] 
    15961586        for id in self.id_list(): 
    15971587            rates.append(self.spiketrains[id].mean_rate(interval)) 
     
    18191809        subplot = get_display(display) 
    18201810 
    1821         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval)         
     1811        interval = self.create_intervals(t_start, t_stop, interval) 
    18221812        if not interval.is_equal(self.interval): 
    18231813            spklist = self.interval_slice(interval) 
     
    18401830                pylab.draw() 
    18411831        elif isinstance(float_positions, numpy.ndarray): 
    1842             if not len(spklist.id_list()) == len(fspike2loat_positions[0]): 
     1832            if not len(spklist.id_list()) == len(float_positions[0]): 
    18431833                raise Exception("Error, the number of flotting positions does not match the number of cells in the SpikeList") 
    18441834            rates = spklist.mean_rates() 
     
    21382128            spk = self.id_slice(id_list) 
    21392129 
    2140         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval)    
     2130        interval = self.create_intervals(t_start, t_stop, interval) 
    21412131        if not interval.is_equal(spk.interval): 
    21422132            spk = spk.interval_slice(interval) 
     2133        t_start, t_stop = spk.time_parameters() 
    21432134 
    21442135        if not subplot or not HAVE_PYLAB: 
     
    22652256        subplot = get_display(display) 
    22662257 
    2267         interval = self.extract_intervals_from_SpikeList_arguments(t_start, t_stop, interval)    
     2258        interval = self.create_intervals(t_start, t_stop, interval)    
    22682259        if not subplot or not HAVE_PYLAB: 
    22692260            print PYLAB_ERROR 
     
    23082299                    files.append(fname) 
    23092300                    t_start += time_bin 
    2310                     count += 1           
    2311             command = "mencoder 'mf://_tmp_*.png' -mf type=png:fps=%d -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o %s" %(fps,output) 
     2301                    count += 1 
     2302            print "Please wait while movie is created..." 
     2303            command = "mencoder 'mf://_tmp_*.png' -mf type=png:fps=%d -ovc lavc -lavcopts vcodec=wmv2 -oac copy -o %s >> movie.log" %(fps,output) 
    23122304            logging.debug(command) 
    23132305            os.system(command) 
     
    24832475    """ 
    24842476    spike_loader = DataHandler(user_file) 
    2485     return spike_loader.load_spikes(id_list=id_list, t_start=None, t_stop=None, dims=dims) 
     2477    return spike_loader.load_spikes(id_list=id_list, t_start=t_start, t_stop=t_stop, dims=dims) 
    24862478 
    24872479 
  • branches/interval/test/test_spikes.py

    r424 r427  
    282282    def testLastSpikeTime(self): 
    283283        assert self.spk.last_spike_time() <= self.spk.t_stop 
    284      
    285284     
    286285    def testSelect_Ids(self):