latools/processes/despiking.py
def expdecay_despike(sig, expdecay_coef, tstep, maxiter=3):
    """
    Apply exponential decay filter to remove physically impossible data based on instrumental washout.

    The filter is re-applied until no more points are removed, or maxiter is reached.

    Parameters
    ----------
    exponent : float
        Exponent used in filter
    tstep : float
        The time increment between data points.
    maxiter : int
        The maximum number of times the filter should be applied.

    Returns
    -------
    None
    """
    # determine rms noise of data
    noise = np.std(sig[:5])  # initially, calculated based on first 5 points
    # expand the selection up to 50 points, unless it dramatically increases 
    # the std (i.e. catches the 'laser on' region)
    for i in [10, 20, 30, 50]:
        inoise = np.std(sig[:i])
        if inoise < 1.5 * noise:
            noise = inoise
    rms_noise3 = 3 * noise

    i = 0
    f = True
    while (i < maxiter) and f:
        # calculate low and high possibles values based on exponential decay
        siglo = np.roll(sig * np.exp(tstep * expdecay_coef), 1)
        sighi = np.roll(sig * np.exp(-tstep * expdecay_coef), -1)

        # identify points that are outside these limits, beyond what might be explained
        # by noise in the data
        loind = (sig < siglo - rms_noise3) & (sig < np.roll(sig, -1) - rms_noise3)
        hiind = (sig > sighi + rms_noise3) & (sig > np.roll(sig, 1) + rms_noise3)

        # replace all such values with their preceding
        sig[loind] = sig[np.roll(loind, -1)]
        sig[hiind] = sig[np.roll(hiind, -1)]

        f = any(np.concatenate([loind, hiind]))
        i += 1

    return sig
def expdecay_despike(sig, expdecay_coef, tstep, maxiter=3):
    # determine rms noise of data
    noise = np.std(sig[:5])  # initially, calculated based on first 5 points
    # expand the selection up to 50 points, unless it dramatically increases 
    # the std (i.e. catches the 'laser on' region)
    for i in [10, 20, 30, 50]:
        inoise = np.std(sig[:i])
        if inoise < 1.5 * noise:
            noise = inoise
    rms_noise3 = 3 * noise

    i = 0
    f = True
    while (i < maxiter) and f:
        # calculate low and high possibles values based on exponential decay
        siglo = np.roll(sig * np.exp(tstep * expdecay_coef), 1)
        sighi = np.roll(sig * np.exp(-tstep * expdecay_coef), -1)

        # identify points that are outside these limits, beyond what might be explained
        # by noise in the data
        loind = (sig < siglo - rms_noise3) & (sig < np.roll(sig, -1) - rms_noise3)
        hiind = (sig > sighi + rms_noise3) & (sig > np.roll(sig, 1) + rms_noise3)

        # replace all such values with their preceding
        sig[loind] = sig[np.roll(loind, -1)]
        sig[hiind] = sig[np.roll(hiind, -1)]

        f = any(np.concatenate([loind, hiind]))
        i += 1

    return sig
def expdecay_despike ( sig , expdecay_coef , tstep , maxiter = 3 ) : # determine rms noise of data noise = np . std ( sig [ : 5 ] ) # initially, calculated based on first 5 points # expand the selection up to 50 points, unless it dramatically increases  # the std (i.e. catches the 'laser on' region) for i in [ 10 , 20 , 30 , 50 ] : inoise = np . std ( sig [ : i ] ) if inoise < 1.5 * noise : noise = inoise rms_noise3 = 3 * noise i = 0 f = True while ( i < maxiter ) and f : # calculate low and high possibles values based on exponential decay siglo = np . roll ( sig * np . exp ( tstep * expdecay_coef ) , 1 ) sighi = np . roll ( sig * np . exp ( - tstep * expdecay_coef ) , - 1 ) # identify points that are outside these limits, beyond what might be explained # by noise in the data loind = ( sig < siglo - rms_noise3 ) & ( sig < np . roll ( sig , - 1 ) - rms_noise3 ) hiind = ( sig > sighi + rms_noise3 ) & ( sig > np . roll ( sig , 1 ) + rms_noise3 ) # replace all such values with their preceding sig [ loind ] = sig [ np . roll ( loind , - 1 ) ] sig [ hiind ] = sig [ np . roll ( hiind , - 1 ) ] f = any ( np . concatenate ( [ loind , hiind ] ) ) i += 1 return sig
Apply exponential decay filter to remove physically impossible data based on instrumental washout.

    The filter is re-applied until no more points are removed, or maxiter is reached.

    Parameters
    ----------
    exponent : float
        Exponent used in filter
    tstep : float
        The time increment between data points.
    maxiter : int
        The maximum number of times the filter should be applied.

    Returns
    -------
    None
Apply exponential decay filter to remove physically impossible data based on instrumental washout .