Source code for admit.util.peakfinder.FindPeaksCWT
""" .. _findpeaks:
    FindPeaksCWT --- Peak finding with continuous wavelet transforms.
    -----------------------------------------------------------------
    This module defines a wrapper class for the scipy.signal.find_peaks_cwt
    method.
"""
import types
import numpy as np
try:
  from scipy.signal import find_peaks_cwt
except:
  print "WARNING: No scipy; FindPeaksCWT utility cannot function."
[docs]class FindPeaksCWT(object):
    """ FindPeaksCWT
        Parameters
        ----------
        spec : List or numpy array
            The spectrum to be analyzed.
        x : List or numpy array, optional
            The x co-ordinates for the spectrum.
            Default = None.
        kwarg : Dict
            Any additional arguments, see the Attributes list for a complete
            listing.
        Attributes
        ----------
        spec : numpy array
            The spectrum to be analyzed.
        x : numpy array
            The x co-ordinates of the spectrum.
        widths : sequence
            1-D array of widths to use for calculating the CWT matrix. In general, this range should
            cover the expected width of peaks of interest.
        wavelet : callable, optional
            Should take a single variable and return a 1-D array to convolve with vector. Should be
            normalized to unit area.
            Default: None (ricker wavelet).
        max_distances : ndarray, optional
            At each row, a ridge line is only connected if the relative max at row[n] is within
            max_distances[n] from the relative max at row[n+1].
            Default: widths/4.
        gap_thresh : float, optional
            If a relative maximum is not found within max_distances, there will be a gap. A ridge
            line is discontinued if there are more than gap_thresh points without connecting a new
            relative maximum.
            Default: 5.
        min_length : int, optional
            Minimum length a ridge line needs to be acceptable.
            Default: cwt.shape[0] / 4, ie 1/4-th the number of widths.
        min_snr : float, optional
            Minimum SNR ratio. Default 1. The signal is the value of the cwt matrix at the shortest
            length scale (cwt[0, loc]), the noise is the noise_perc-th percentile of datapoints
            contained within a window of `window_size` around cwt[0, loc].
            Default: 3.
        noise_perc : float, optional
            When calculating the noise floor, percentile of data points examined below which to
            consider noise. Calculated using stats.scoreatpercentile.
            Default: 10.
    """
    widths = np.array([5,10,15,20,25,30])
    wavelet = None
    max_distances = None
    gap_thresh = 5.
    min_length = None
    min_snr = 3.
    noise_perc = 10.
    def __init__(self,spec,x=None,**kwargs):
        if type(spec) == types.ListType:
            self.spec = np.array(spec,dtype=float)
        else:
            self.spec = spec.astype(float)
        if x == None:
            self.x = np.arange(float(spec.shape[0]))
        else:
            if type(x) == types.ListType:
                self.spec = np.array(x,dtype=float)
            else:
                self.x = x.astype(float)
        for k,v, in kwargs.iteritems():
            # ingore any attributes we don't have
            if hasattr(self,k):
                setattr(self,k,v)
[docs]    def find(self):
        """ Method to find any peaks in the spectrum. A baseline will be subtracted first if requested.
            Parameters
            ----------
            None
            Returns
            -------
            numpy array of floats
                containing the locations of the peaks
        """
        # since some of the argument default values are calculated on the fly the full list needs to be built
        arglist = ["widths","wavelet","max_distances","gap_thresh","min_length","min_snr","noise_perc"]
        args = {}
        for arg in arglist:
            if getattr(self,arg) != None:
                args[arg] = getattr(self,arg)
        return find_peaks_cwt(self.spec, **args)