Changeset 408

Show
Ignore:
Timestamp:
07/16/09 11:50:11 (3 years ago)
Author:
pierre
Message:

Start to change all the NeuroTools object to use a more general concept of the interval instead of t_start, t_stop. Will help a lot the analyze of the data when objects have several trials or stimulus presented during a single run.

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

Legend:

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

    r401 r408  
    2222    """ 
    2323     
    24     def __init__(self, start_times, end_times) : 
     24    def __init__(self, sub_intervals): 
    2525        """ 
    2626        Constructor of the Interval object. 
    2727 
    2828        """ 
    29         if HAVE_INTERVAL: 
    30             self.start_times = start_times 
    31             self.end_times   = end_times 
    32             # write the intervals to an interval object (pyinterval) 
    33             test = isinstance(start_times, int) or isinstance(start_times, float) 
    34             if test: 
    35                 start_times = [start_times] 
    36             test = isinstance(end_times, int) or isinstance(end_times, float) 
    37             if test: 
    38                 end_times = [end_times] 
    39             if len(start_times) != len(end_times) : 
    40                 raise Exception("There sould be an equal number of starts and stops") 
    41             self.interval_data = interval(*numpy.transpose(numpy.array([start_times,end_times]))) 
    42         else: 
    43             test = isinstance(start_times, int) or isinstance(start_times, float) 
    44             assert test, "Interval package not present, start_times should be a number !" 
    45             test = isinstance(end_times, int) or isinstance(end_times, float) 
    46             assert test, "Interval package not present, end_times should be a number !" 
    47             self.start_times = start_times 
    48             self.end_times   = end_times 
     29        if not type(sub_intervals) is list: 
     30            sub_intervals = list((sub_intervals,)) 
     31         
     32        self._check_interval(sub_intervals) 
     33        self.sub_intervals = sub_intervals 
     34        self.start_times   = numpy.array(self.sub_intervals)[:,0] 
     35        self.end_times     = numpy.array(self.sub_intervals)[:,1] 
     36 
     37        if HAVE_INTERVAL: 
     38            self.interval_data = interval(*numpy.transpose(numpy.array([self.start_times, self.end_times]))) 
     39 
     40    def _check_interval(self, sub_intervals): 
     41        if not HAVE_INTERVAL: 
     42            assert len(sub_intervals) == 1, "Interval package not present, interval must be (t_start, t_stop) !" 
     43        for item in sub_intervals: 
     44            assert (len(item) == 2), "Intervals must be a list of tuple (t_start, t_stop) !" 
     45            assert item[1] > item[0], "Intervals must have tuple with t_start < t_stop !" 
    4946 
    5047    def intersect(self, itv) : 
    51         self.interval_data = self.interval_data & itv.interval_data 
     48        result = Interval(self.sub_intervals) 
     49        result.interval_data = result.interval_data & itv.interval_data 
     50        return result 
    5251 
    5352    def union(self, itv) : 
    54         self.interval_data = self.interval_data | itv.interval_data 
    55  
     53        if HAVE_INTERVAL: 
     54            result = Interval(self.sub_intervals) 
     55            result.interval_data = result.interval_data & itv.interval_data 
     56            result.interval_data = result.interval_data | itv.interval_data 
     57        else: 
     58            result = Interval(self.sub_intervals) 
     59            result.start_times   = min(result.start_times, spiketrain.start_times) 
     60            result.end_times     = max(result.end_times, spiketrain.end_times) 
     61        return result 
     62     
    5663    def __str__(self): 
    5764        return str(self.interval_data) 
     
    6067        return shape(self.interval_data)[0] 
    6168     
     69    def __iter__(self): 
     70        return iter(self.sub_intervals) 
     71     
    6272    def __getslice__(self, i, j): 
    6373        """ 
     
    90100        """ 
    91101        return Interval(self.start_times, self.end_times, self.t_start, self.t_stop) 
     102 
     103 
     104    def offset_start(self, shift, from_stop=False) : 
     105        """ 
     106        Shift all stop times of the interval by shift (ms). If from_start is 
     107        true, use start times as the reference to compute the new stop times   
     108        """ 
     109        interval_array = numpy.array(self.interval_data) 
     110 
     111        if from_stop == False : 
     112            if (interval_array[:,0] + shift > interval_array[:,1]).any() : 
     113                raise Exception("the shift is too big to preserve start/stop temporal order") 
     114            interval_array[:,0] += shift 
     115        else : 
     116            if shift > 0 : 
     117                raise Exception("the shift should be negative to preserve start/stop temporal order") 
     118            interval_array[:,0] = interval_array[:,1] + shift 
     119 
     120        self.interval_data = interval(*interval_array) 
     121 
     122 
     123    def offset_stop(self, shift, from_start=False) : 
     124        """ 
     125        Shift all stop times of the interval by shift (ms). If from_start is 
     126        true, use start times as the reference to compute the new stop times   
     127        """ 
     128        interval_array = numpy.array(self.interval_data) 
     129 
     130        if from_start == False : 
     131            if (interval_array[:,1] + shift < interval_array[:,0]).any() : 
     132                raise Exception("the shift is too big to preserve start/stop temporal order") 
     133            interval_array[:,1] += shift 
     134        else : 
     135            if shift < 0 : 
     136                raise Exception("the shift should be positive to preserve start/stop temporal order") 
     137            interval_array[:,1] = interval_array[:,0] + shift 
     138 
     139        self.interval_data = interval(*interval_array) 
     140 
     141    def offset_full(self, shift) : 
     142        """ 
     143        Shift the whole interval by 'shift' ms 
     144        """ 
     145        self.interval_data += shift 
     146 
     147 
     148 
     149 
     150 
     151 
     152 
     153 
     154 
     155 
     156 
     157 
     158 
     159 
     160 
    92161 
    93162    def offset(self, start=None, end=None) : 
     
    144213        return numpy.extract(spikes_selector, times) 
    145214 
     215    def is_equal(self, itv) : 
     216        return self.sub_intervals == itv.sub_intervals 
    146217 
    147218 
  • branches/interval/src/signals/spikes.py

    r406 r408  
    4949 
    5050newnum = check_numpy_version() 
    51  
     51INTERVAL_WARNING = "WARNING: t_start, t_stop are deprecated ! Use a syntax like interval=(t_start, t_stop) instead" 
    5252 
    5353class SpikeTrain(object): 
     
    7676    ## Constructor and key methods to manipulate the SpikeTrain objects  ## 
    7777    ####################################################################### 
    78     def __init__(self, spike_times, t_start=None, t_stop=None): 
     78    def __init__(self, spike_times, interval=None): 
    7979        """ 
    8080        Constructor of the SpikeTrain object 
     
    8383            SpikeTrain 
    8484        """ 
    85  
    86         self.t_start     = t_start 
    87         self.t_stop      = t_stop 
    88         self.spike_times = numpy.array(spike_times, numpy.float32) 
    89  
    90         # If t_start is not None, we resize the spike_train keeping only 
    91         # the spikes with t >= t_start 
    92         if self.t_start is not None: 
    93             self.spike_times = numpy.extract((self.spike_times >= self.t_start), self.spike_times) 
    94  
    95         # If t_stop is not None, we resize the spike_train keeping only 
    96         # the spikes with t <= t_stop 
    97         if self.t_stop is not None: 
    98             self.spike_times = numpy.extract((self.spike_times <= self.t_stop), self.spike_times) 
     85        if interval is not None: 
     86            self.interval = interval 
     87        else: 
     88            try: 
     89                t_start = min(spike_times) 
     90            except Exception: 
     91                print "Error in guessing t_start (first spike), spikes may be empty !" 
     92                t_start = 0 
     93            try: 
     94                t_stop  = max(spike_times) 
     95            except Exception: 
     96                print "Error in guessing t_stop (last spike), spikes may be empty !" 
     97                t_stop = 0.1 
     98            self.interval = Interval((t_start, t_stop)) 
     99 
     100        self.spike_times = self.interval.slice_times(numpy.array(spike_times, numpy.float32)) 
    99101 
    100102        # We sort the spike_times. May be slower, but is necessary by the way for quite a  
     
    107109        # 1 element  : t_start = time, t_stop = time + 0.1 
    108110        # several    : t_start = min(time), t_stop = max(time) 
    109          
    110         size = len(self.spike_times) 
    111         if size == 0: 
    112             if self.t_start is None:  
    113                 self.t_start = 0 
    114             if self.t_stop is None: 
    115                 self.t_stop  = 0.1 
    116         elif size == 1: # spike list may be empty 
    117             if self.t_start is None: 
    118                 self.t_start = self.spike_times[0] 
    119             if self.t_stop is None: 
    120                 self.t_stop = self.spike_times[0] + 0.1 
    121         elif size > 1: 
    122             if self.t_start is None: 
    123                 self.t_start = numpy.min(self.spike_times) 
    124             if numpy.any(self.spike_times < self.t_start): 
    125                 raise ValueError("Spike times must not be less than t_start") 
    126             if self.t_stop is None: 
    127                 self.t_stop = numpy.max(self.spike_times) 
    128             if numpy.any(self.spike_times > self.t_stop): 
    129                 raise ValueError("Spike times must not be greater than t_stop") 
    130  
    131         if self.t_start >= self.t_stop : 
    132             raise Exception("Incompatible time interval : t_start = %s, t_stop = %s" % (self.t_start, self.t_stop)) 
    133         if self.t_start < 0: 
    134             raise ValueError("t_start must not be negative") 
    135         if numpy.any(self.spike_times < 0): 
    136             raise ValueError("Spike times must not be negative") 
     111 
     112 
    137113 
    138114    def __str__(self): 
     
    152128        Return the time parameters of the SpikeTrain (t_start, t_stop) 
    153129        """ 
    154         return (self.t_start, self.t_stop) 
     130        return (self.interval.t_start(), self.interval.t_stop()) 
    155131     
    156132    def is_equal(self, spktrain): 
     
    165141            time_parameters() 
    166142        """ 
    167         test = (self.time_parameters() == spktrain.time_parameters()) 
     143        test = (self.interval.is_equal(spktrain.interval)) 
    168144        return numpy.all(self.spike_times == spktrain.spike_times) and test 
    169145     
     
    172148        Return a copy of the SpikeTrain object 
    173149        """ 
    174         return SpikeTrain(self.spike_times, self.t_start, self.t_stop) 
     150        return SpikeTrain(self.spike_times, interval=self.interval) 
    175151 
    176152 
     
    179155        Return the duration of the SpikeTrain 
    180156        """ 
    181         return self.t_stop - self.t_start 
     157        return self.interval.total_duration() 
    182158     
    183159     
     
    202178        self.spike_times = numpy.insert(self.spike_times, self.spike_times.searchsorted(spiketrain.spike_times), \ 
    203179                                        spiketrain.spike_times) 
    204         self.t_start     = min(self.t_start, spiketrain.t_start) 
    205         self.t_stop      = max(self.t_stop, spiketrain.t_stop) 
     180        self.interval = self.interval.union(spiketrain.interval) 
    206181 
    207182    def format(self, relative=False, quantized=False): 
     
    244219        """ 
    245220         
    246         return SpikeTrain(self.spike_times+jitter*(numpy.random.normal(loc=0.0,scale=1.0,size=self.spike_times.shape[0])),t_start=self.t_start,t_stop=self.t_stop) 
     221        spk = self.spike_times+jitter*(numpy.random.normal(loc=0.0,scale=1.0,size=self.spike_times.shape[0])) 
     222        return SpikeTrain(spk, interval=self.interval) 
    247223         
    248224 
     
    266242        return numpy.diff(self.spike_times) 
    267243 
    268     def mean_rate(self, t_start=None, t_stop=None): 
     244    def mean_rate(self, interval=None): 
    269245        """  
    270246        Returns the mean firing rate between t_start and t_stop, in Hz 
    271247         
    272248        Inputs: 
    273             t_start - in ms. If not defined, the one of the SpikeTrain object is used 
    274             t_stop  - in ms. If not defined, the one of the SpikeTrain object is used 
     249            interval - An interval object 
    275250         
    276251        Examples: 
     
    278253                34.2 
    279254        """ 
    280         if (t_start == None) & (t_stop == None): 
    281             t_start = self.t_start 
    282             t_stop  = self.t_stop 
    283             idx     = self.spike_times 
    284         else: 
    285             if t_start == None:  
    286                 t_start = self.t_start 
    287             else: 
    288                 t_start = max(self.t_start, t_start) 
    289             if t_stop == None:  
    290                 t_stop=self.t_stop 
    291             else: 
    292                 t_stop = min(self.t_stop, t_stop) 
    293             idx = numpy.where((self.spike_times >= t_start) & (self.spike_times <= t_stop))[0] 
    294         return 1000.*len(idx)/(t_stop-t_start) 
     255        if interval: 
     256            new_interval = interval.intersect(self.interval) 
     257            idx          = new_interval.slice_times(self.spike_times) 
     258        else: 
     259            idx          = self.spike_times 
     260            new_interval = self.interval 
     261        return 1000.*len(idx)/new_interval.total_duration() 
    295262 
    296263    def cv_isi(self): 
     
    396363        """ 
    397364        if newnum: 
    398             axis = numpy.arange(self.t_start, self.t_stop+time_bin, time_bin) 
    399         else: 
    400             axis = numpy.arange(self.t_start, self.t_stop, time_bin) 
     365            axis = numpy.arange(self.interval.t_start(), self.interval.t_stop()+time_bin, time_bin) 
     366        else: 
     367            axis = numpy.arange(self.interval.t_start(), self.interval.t_stop(), time_bin) 
    401368        return axis 
    402369 
    403     def raster_plot(self, t_start=None, t_stop=None, interval=None, display=True, kwargs={}): 
     370    def raster_plot(self, interval=None, display=True, kwargs={}): 
    404371        """ 
    405372        Generate a raster plot with the SpikeTrain in a subwindow of interest, 
     
    407374         
    408375        Inputs: 
    409             t_start - in ms. If not defined, the one of the SpikeTrain object is used 
    410             t_stop  - in ms. If not defined, the one of the SpikeTrain object is used 
     376            interval - An interval object 
    411377            display - if True, a new figure is created. Could also be a subplot 
    412378            kwargs  - dictionary contening extra parameters that will be sent to the plot  
     
    420386            SpikeList.raster_plot 
    421387        """ 
    422         if t_start is None: t_start = self.t_start 
    423         if t_stop is None:  t_stop = self.t_stop 
    424388         
    425389        if interval is None: 
    426             interval = Interval(t_start, t_stop) 
     390            interval = self.interval 
    427391         
    428392        spikes  = interval.slice_times(self.spike_times) 
     
    454418                120.,  130.,  140.] 
    455419        """ 
    456         self.t_start += offset 
    457         self.t_stop  += offset 
     420        self.interval.offset_full(offset) 
    458421        self.spike_times += offset 
    459422 
     
    474437                100 
    475438        """ 
    476         spikes = numpy.extract((self.spike_times >= t_start) & (self.spike_times <= t_stop), self.spike_times) 
    477         return SpikeTrain(spikes, t_start, t_stop) 
     439        interval = Interval((t_start, t_stop))  
     440        return SpikeTrain.interval_slice(interval) 
    478441 
    479442    def interval_slice(self, interval): 
     
    492455                100 
    493456        """ 
    494         times           = interval.slice_times(self.spike_times) 
    495         t_start, t_stop = interval.time_parameters() 
    496         return SpikeTrain(times, t_start, t_stop) 
     457        times = interval.slice_times(self.spike_times) 
     458        return SpikeTrain(times, interval=interval) 
    497459         
    498460 
     
    534496        is substracted to spike_times, t_start and t_stop 
    535497        """ 
    536         if self.t_start != 0: 
    537             self.spike_times -= self.t_start 
    538             self.t_stop      -= self.t_start 
    539             self.t_start      = 0.0 
     498        padding = -self.interval.t_start() 
     499        if padding != 0: 
     500            self.spike_times += padding 
     501            self.interval.offset_full(padding) 
    540502 
    541503    def distance_victorpurpura(self, spktrain, cost=0.5): 
     
    586548            VictorPurpuraDistance 
    587549        """ 
    588         N              = (self.t_stop-self.t_start)/dt 
     550         
     551        N              = (self.interval.t_stop()-self.interval.t_start())/dt 
    589552        vec_1          = numpy.zeros(N, numpy.float32) 
    590553        vec_2          = numpy.zeros(N, numpy.float32) 
     
    730693        hist       = self.time_histogram(time_bin, normalized=False) 
    731694        freq_spect = analysis.simple_frequency_spectrum(hist) 
    732         freq_bin   = 1000.0/self.duration() # Hz 
     695        freq_bin   = 1000.0/self.interval.total_duration() # Hz 
    733696        freq_axis  = numpy.arange(len(freq_spect)) * freq_bin     
    734697        return freq_spect, freq_axis     
     
    746709        freq_spect = self.frequency_spectrum(time_bin)[0] 
    747710        F0 = freq_spect[0] 
    748         freq_bin = 1000.0/self.duration() 
     711        freq_bin = 1000.0/self.interval.total_duration() 
    749712        try: 
    750713            F1 = freq_spect[int(round(f_stim/freq_bin))] 
     
    783746    ## Constructor and key methods to manipulate the SpikeList objects   ## 
    784747    ####################################################################### 
    785     def __init__(self, spikes, id_list, t_start=None, t_stop=None, dims=None): 
     748    def __init__(self, spikes, id_list, interval=None, dims=None): 
    786749        """ 
    787750        Constructor of the SpikeList object 
     
    790753            SpikeList, load_spikelist 
    791754        """ 
    792         self.t_start     = t_start 
    793         self.t_stop      = t_stop 
     755        #if t_start or t_stop: 
     756             
     757        self.interval    = interval 
    794758        self.dimensions  = dims 
    795759        self.spiketrains = {} 
     
    808772            spikes = spikes[idx] 
    809773            logging.debug("sorted spikes[:10,:] = %s" % str(spikes[:10,:])) 
    810          
    811774            break_points = numpy.where(numpy.diff(spikes[:, 0]) > 0)[0] + 1 
    812775            break_points = numpy.concatenate(([0], break_points)) 
     
    815778                id = spikes[break_points[idx], 0] 
    816779                if id in id_list: 
    817                     self.spiketrains[id] = SpikeTrain(spikes[break_points[idx]:break_points[idx+1], 1], self.t_start, self.t_stop) 
    818          
    819         if len(self) > 0 and (self.t_start is None or self.t_stop is None): 
     780                    self.spiketrains[id] = SpikeTrain(spikes[break_points[idx]:break_points[idx+1], 1], interval=self.interval) 
     781         
     782        if len(self) > 0 and (self.interval is None): 
    820783            self.__calc_startstop() 
    821784 
     
    847810        """ 
    848811        if len(self) > 0: 
    849             if self.t_start is None: 
    850                 start_times = numpy.array([self.spiketrains[idx].t_start for idx in self.id_list()], numpy.float32) 
    851                 self.t_start = numpy.min(start_times) 
    852                 logging.debug("Warning, t_start is infered from the data : %f" %self.t_start) 
     812            if self.interval is None: 
     813                start_times = numpy.array([self.spiketrains[idx].interval.t_start() for idx in self.id_list()], numpy.float32) 
     814                t_start = numpy.min(start_times) 
     815                logging.debug("Warning, t_start is infered from the data : %f" %t_start) 
     816 
     817                stop_times = numpy.array([self.spiketrains[idx].interval.t_stop() for idx in self.id_list()], numpy.float32) 
     818                t_stop  = numpy.max(stop_times) 
     819                logging.debug("Warning, t_stop  is infered from the data : %f" %t_stop) 
     820 
    853821                for id in self.spiketrains.keys(): 
    854                     self.spiketrains[id].t_start = self.t_start 
    855             if self.t_stop is None: 
    856                 stop_times = numpy.array([self.spiketrains[idx].t_stop for idx in self.id_list()], numpy.float32) 
    857                 self.t_stop  = numpy.max(stop_times) 
    858                 logging.debug("Warning, t_stop  is infered from the data : %f" %self.t_stop) 
    859                 for id in self.spiketrains.keys(): 
    860                     self.spiketrains[id].t_stop = self.t_stop 
     822                    self.spiketrains[id].interval = Interval((t_start, t_stop)) 
    861823        else: 
    862824            raise Exception("No SpikeTrains") 
     
    952914            raise Exception("id %d already present in SpikeList. Use __setitem__ (spk[id]=...) instead()" %id) 
    953915        else: 
    954             self.spiketrains[id] = spktrain.time_slice(self.t_start, self.t_stop) 
     916            self.spiketrains[id] = spktrain.interval_slice(self.interval) 
    955917             
    956918    def time_parameters(self): 
     
    958920        Return the time parameters of the SpikeList (t_start, t_stop) 
    959921        """ 
    960         return (self.t_start, self.t_stop) 
     922        return (self.interval.t_start(), self.interval.t_stop()) 
    961923 
    962924    def time_axis(self, time_bin): 
     
    971933        """ 
    972934        if newnum: 
    973             axis = numpy.arange(self.t_start, self.t_stop+time_bin, time_bin) 
    974         else: 
    975             axis = numpy.arange(self.t_start, self.t_stop, time_bin) 
     935            axis = numpy.arange(self.interval.t_start(), self.interval.t_stop() + time_bin, time_bin) 
     936        else: 
     937            axis = numpy.arange(self.interval.t_start(), self.interval.t_stop(), time_bin) 
    976938        return axis 
    977939 
     
    993955        # We check that Spike Lists have similar time_axis 
    994956        for sl in spklists: 
    995             if not sl.time_parameters() == self.time_parameters(): 
     957            if not sl.interval.is_equal(self.interval): 
    996958                raise Exception("Spike Lists should have similar time_axis") 
    997959        for sl in spklists: 
     
    10431005        missing_ids = id_list.difference(set(self.id_list())) 
    10441006        for id in missing_ids: 
    1045             self.append(id, SpikeTrain([],self.t_start, self.t_stop)) 
     1007            self.append(id, SpikeTrain([],self.interval)) 
    10461008         
    10471009     
     
    10661028            time_slice, interval_slice 
    10671029        """ 
    1068         new_SpkList = SpikeList([], [], self.t_start, self.t_stop, self.dimensions) 
     1030        new_SpkList = SpikeList([], [], self.interval, self.dimensions) 
    10691031        id_list = self.__sub_id_list(id_list) 
    10701032        for id in id_list: 
     
    10861048            id_slice, interval_slice 
    10871049        """ 
    1088         new_SpkList = SpikeList([], [], t_start, t_stop, self.dimensions) 
    1089         for id in self.id_list(): 
    1090             new_SpkList.append(id, self.spiketrains[id].time_slice(t_start, t_stop)) 
    1091         new_SpkList.__calc_startstop() 
    1092         return new_SpkList 
     1050        interval = Interval((t_start, t_stop)) 
     1051        return self.interval_slice(interval) 
     1052         
    10931053         
    10941054    def interval_slice(self, interval): 
     
    11031063            id_slice, time_slice 
    11041064        """ 
    1105         t_start, t_stop = interval.time_parameters() 
    1106         new_SpkList = SpikeList([], [], t_start, t_stop, self.dimensions) 
     1065        new_SpkList = SpikeList([], [], interval, self.dimensions) 
    11071066        for id in self.id_list(): 
    11081067            new_SpkList.append(id, self.spiketrains[id].interval_slice(interval)) 
     
    11241083                1050 
    11251084        """ 
    1126         self.t_start += offset 
    1127         self.t_stop  += offset 
     1085        self.interval.offset_full(offset) 
    11281086        for id in self.id_list(): 
    11291087            self.spiketrains[id].time_offset(offset) 
     
    11561114        Get the time of the first real spike in the SpikeList 
    11571115        """ 
    1158         first_spike = self.t_stop 
     1116        first_spike = self.interval.t_stop() 
    11591117        is_empty    = True 
    11601118        for id in self.id_list(): 
     
    11721130        Get the time of the last real spike in the SpikeList 
    11731131        """ 
    1174         last_spike = self.t_start 
     1132        last_spike = self.interval.t_start() 
    11751133        is_empty    = True 
    11761134        for id in self.id_list(): 
     
    14581416             
    14591417 
    1460     def mean_rate(self, t_start=None, t_stop=None): 
     1418    def mean_rate(self, interval=None): 
    14611419        """ 
    14621420        Return the mean firing rate averaged accross all SpikeTrains between t_start and t_stop. 
    14631421         
    14641422        Inputs: 
    1465             t_start - begining of the selected area to compute mean_rate, in ms 
    1466             t_stop  - end of the selected area to compute mean_rate, in ms 
     1423            interval - An interval object 
    14671424         
    14681425        If t_start or t_stop are not defined, those of the SpikeList are used 
     
    14781435 
    14791436 
    1480     def mean_rate_std(self, t_start=None, t_stop=None): 
     1437    def mean_rate_std(self, interval=None): 
    14811438        """ 
    14821439        Standard deviation of the firing rates accross all SpikeTrains  
     
    14841441 
    14851442        Inputs: 
    1486             t_start - begining of the selected area to compute std(mean_rate), in ms 
    1487             t_stop  - end of the selected area to compute std(mean_rate), in ms 
     1443            interval - An interval object 
    14881444         
    14891445        If t_start or t_stop are not defined, those of the SpikeList are used 
     
    14961452            mean_rate, mean_rates 
    14971453        """ 
    1498         return numpy.std(self.mean_rates(t_start, t_stop)) 
    1499  
    1500  
    1501     def mean_rates(self, t_start=None, t_stop=None): 
     1454        return numpy.std(self.mean_rates(interval)) 
     1455 
     1456 
     1457    def mean_rates(self, interval=None): 
    15021458        """  
    15031459        Returns a vector of the size of id_list giving the mean firing rate for each neuron 
    15041460 
    15051461        Inputs: 
    1506             t_start - begining of the selected area to compute std(mean_rate), in ms 
    1507             t_stop  - end of the selected area to compute std(mean_rate), in ms 
     1462            interval - An interval object 
    15081463         
    15091464        If t_start or t_stop are not defined, those of the SpikeList are used 
     
    15141469        rates = [] 
    15151470        for id in self.id_list(): 
    1516             rates.append(self.spiketrains[id].mean_rate(t_start, t_stop)) 
     1471            rates.append(self.spiketrains[id].mean_rate(interval)) 
    15171472        return rates 
    15181473     
     
    20321987 
    20331988 
    2034     def raster_plot(self, id_list=None, t_start=None, t_stop=None, display=True, kwargs={}): 
     1989    def raster_plot(self, id_list=None, interval=None, display=True, kwargs={}): 
    20351990        """ 
    20361991        Generate a raster plot for the SpikeList in a subwindow of interest, 
     
    20602015            spk = self.id_slice(id_list) 
    20612016 
    2062         if t_start is None: t_start = spk.t_start 
    2063         if t_stop is None:  t_stop  = spk.t_stop 
    2064         if t_start != spk.t_start or t_stop != spk.t_stop: 
    2065             spk = spk.time_slice(t_start, t_stop) 
     2017        if interval is None: 
     2018            interval = spk.interval 
     2019 
     2020        if not interval.is_equal(spk.interval): 
     2021            spk = spk.interval_slice(interval) 
    20662022 
    20672023        if not subplot or not HAVE_PYLAB: