Changeset 317

Show
Ignore:
Timestamp:
11/11/08 11:16:35 (2 months ago)
Author:
pierre
Message:

Fix a bug in cv_kl method and cv_isi, if ids are not between 0 and N. Add also a similar syntax to cv_kl, i.e one can remove the NaN value by setting True the float_only flag

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/signals.py

    r315 r317  
    312312            return numpy.nan 
    313313 
    314  
    315  
    316314    def cv_kl(self, bins=100): 
    317315        """ 
     
    326324            http://incm.cnrs-mrs.fr/LaurentPerrinet/Publications/Voges08fens 
    327325         
    328          
    329         Examples: 
    330             >> spklist.cv_kl() 
     326        Inputs: 
     327            bins - the number of bins used to gather the ISI 
     328         
     329        Examples: 
     330            >> spklist.cv_kl(100) 
    331331                0.98 
    332332         
     
    336336        """ 
    337337        isi = self.isi() / 1000. 
    338         if newnum: 
    339             proba_isi, xaxis = numpy.histogram(isi, bins=bins, normed=True, new=True) 
    340             #xaxis = xaxis[:len(xaxis)-1] 
    341         else: 
    342             proba_isi, xaxis = numpy.histogram(isi, bins=bins, normed=True) 
    343  
    344         proba_isi /= numpy.sum(proba_isi) 
    345         bin_size = xaxis[1]-xaxis[0] 
    346  
    347         # differential entropy: http://en.wikipedia.org/wiki/Differential_entropy 
    348         KL = - numpy.sum(proba_isi * numpy.log(proba_isi+1e-16)) + numpy.log(bin_size) 
    349         KL -= -numpy.log(self.mean_rate()) + 1. 
    350         CVkl=numpy.exp(-KL) 
    351          
    352         return CVkl 
     338        if len(isi) == 0: 
     339            logging.debug("Warning, a CV can't be computed because there are not enough spikes") 
     340            return numpy.nan 
     341        else: 
     342            if newnum: 
     343                proba_isi, xaxis = numpy.histogram(isi, bins=bins, normed=True, new=True) 
     344                #xaxis = xaxis[:len(xaxis)-1] 
     345            else: 
     346                proba_isi, xaxis = numpy.histogram(isi, bins=bins, normed=True) 
     347            proba_isi /= numpy.sum(proba_isi) 
     348            bin_size = xaxis[1]-xaxis[0] 
     349            # differential entropy: http://en.wikipedia.org/wiki/Differential_entropy 
     350            KL = - numpy.sum(proba_isi * numpy.log(proba_isi+1e-16)) + numpy.log(bin_size) 
     351            KL -= -numpy.log(self.mean_rate()) + 1. 
     352            CVkl=numpy.exp(-KL) 
     353            return CVkl 
    353354     
    354355 
     
    11861187             
    11871188        """ 
    1188         cvs_isi = numpy.empty(len(self.id_list())) 
    1189         for id in self.id_list(): 
    1190             cvs_isi[id] = self.spiketrains[id].cv_isi() 
     1189        ids = self.id_list() 
     1190        N   = len(ids) 
     1191        cvs_isi = numpy.empty(N) 
     1192        for idx in xrange(N): 
     1193            cvs_isi[idx] = self.spiketrains[ids[idx]].cv_isi() 
    11911194 
    11921195        if float_only: 
     
    11951198 
    11961199 
    1197     def cv_kl(self, bins = 50): 
     1200    def cv_kl(self, bins = 50, float_only=False): 
    11981201        """ 
    11991202        Return the list of all the CV coefficients for each SpikeTrains object 
    12001203        within the SpikeList. 
    12011204         
     1205        Inputs: 
     1206            bins       - The number of bins used to gathered the ISI 
     1207            float_only - False by default. If true, NaN values are automatically 
     1208                         removed 
     1209         
     1210        Examples: 
     1211            >> spklit.cv_kl(50) 
     1212                [0.4, Nan, 0.9, nan] 
     1213            >> spklist.cv_kl(50, True) 
     1214                [0.4, 0.9] 
     1215 
    12021216        See also: 
    12031217            cv_isi_hist, cv_local, cv_isi, SpikeTrain.cv_kl 
    12041218             
    12051219        """ 
    1206         cvs_kl = numpy.empty(len(self.id_list())) 
    1207         for id in self.id_list(): 
    1208             cvs_kl[id] = self.spiketrains[id].cv_kl(bins = bins) 
     1220        ids = self.id_list() 
     1221        N = len(ids) 
     1222        cvs_kl = numpy.empty(N) 
     1223        for idx in xrange(N): 
     1224            cvs_kl[idx] = self.spiketrains[ids[idx]].cv_kl(bins = bins) 
     1225   
     1226        if float_only: 
     1227            cvs_kl = numpy.extract(numpy.logical_not(numpy.isnan(cvs_kl)),cvs_kl) 
    12091228        return cvs_kl 
    12101229 
     
    12271246            cv_isi, cv_local, cv_kl 
    12281247        """ 
    1229         isi = self.cv_isi(float_only=True) 
     1248        cvs = self.cv_isi(float_only=True) 
    12301249        if newnum: 
    12311250            values, xaxis = numpy.histogram(cvs, bins=bins, normed=True, new=newnum)