def set_maximums_and_minimums(self):
        x, y, z = zip(*self.plot)
        self.x = numpy.array(x)
        self.y = numpy.array(y)

        self.base = peakutils.baseline(self.y, 2)
        self.indices = peakutils.indexes(numpy.subtract(self.y,self.base), thres=0.3, min_dist=10)

        self.polar_side_maximums = []
        for i in range(len(self.indices)):
            self.polar_side_maximums.append(self.plot[self.indices[i]])

        # invert plot to find minimums
        radius_range = self.y.max()-self.y.min()
        inverted_y_plot = []
        for i in range(len(self.y)):
            difference_from_range = radius_range - self.y[i]
            inverted_y_plot.append(difference_from_range + self.y.min())

        self.inverted_y_plot = numpy.array(inverted_y_plot)

        self.min_base = peakutils.baseline(self.inverted_y_plot, 2)
        self.min_indices = peakutils.indexes(numpy.subtract(self.inverted_y_plot,self.min_base), thres=0.3, min_dist=10)

        self.polar_side_minimums = []
        for i in range(len(self.min_indices)):
            self.polar_side_minimums.append(self.plot[self.min_indices[i]])
Esempio n. 2
0
def get_peaks(bundle, ionname, mindist=1):
    """Calculates location of peaks and troughs in g(r)s.
    :Arguments:
        *bundle*
            bundle of sims
        *ionname*
            name of ion of interest
        *mindist*
            minimum distance between peaks and troughs; default = 1
    :Returns:
        *m*
            midpoints of bins
        *density*
            density histogram values
        *peaks*
            indexes of peak locations
        *mins*
            indexes of minimum locations
    """
    frames = []
    for s in bundle:
        for iondata in s['coordination/' + ionname.upper() + '/'].data:
            frames.append(s['coordination/' + ionname.upper() + '/'].data[iondata])
    m, density = coordination.gee(frames, binnumber=200)
    x = int(round(mindist / (m[1] - m[0])))
    peaks = peakutils.indexes(density, thres=.1, min_dist=x)
    mins = peakutils.indexes(-density, thres=.1, min_dist=x)
    return m, density, peaks, mins
Esempio n. 3
0
def find_raw_peaks(data, params, offset, expected_peak_number=0):
    """
    params.min_dist
    params.norm_thres
    params.min_rfu
    params.max_peak_number
    """
    #print("expected:", expected_peak_number)
    # cut and pad data to overcome peaks at the end of array
    obs_data = np.append(data[offset:], [0,0,0])
    if False: #expected_peak_number:
        min_dist = params.min_dist
        indices = []
        norm_threshold = params.norm_thres
        expected_peak_number = expected_peak_number * 1.8
        while len(indices) <= expected_peak_number and norm_threshold > 1e-7:
            indices = indexes( obs_data, norm_threshold, min_dist)
            print(len(indices), norm_threshold)
            norm_threshold *= 0.5
    elif False:
        indices = indexes( obs_data, params.norm_thres, params.min_dist)

    indices = indexes( obs_data, 1e-7, params.min_dist)
    cverr(5, '## indices: %s' % str(indices))
    cverr(3, '## raw indices: %d' % len(indices))

    if len(indices) == 0:
        return []

    # normalize indices
    if offset > 0:
        indices = indices + offset

    # filter peaks by minimum rfu, and by maximum peak number after sorted by rfu
    peaks = [Peak(int(i), int(data[i])) for i in indices
             if data[i] >= params.min_rfu and params.min_rtime < i]
    #peaks = sorted( peaks, key = lambda x: x.rfu )[:params.max_peak_number * 2]

    #import pprint; pprint.pprint(peaks)
    #print('======')

    if expected_peak_number:
        peaks.sort( key = lambda x: x.rfu, reverse = True )
        peaks = peaks[: round(expected_peak_number * 2)]
        peaks.sort( key = lambda x: x.rtime )

    cverr(3, '## peak above min rfu: %d' % len(peaks))

    return peaks
Esempio n. 4
0
def select_curve_by_threshold(
    signal_data: pd.Series,
    threshold: float, delta_x: int
) -> [pd.Series]:
    """

    """
    Δx = delta_x

    indexes = peakutils.indexes(signal_data, thres=0.5, min_dist=30)
    curves = []

    for ind_axle in indexes:
        i_start = ind_axle - Δx
        i_end = ind_axle + Δx

        p_start = Δx
        while i_start >= p_start:
            i_start -= 1
            if signal_data.iloc[i_start] <= threshold:
                break

        p_end = signal_data.size - Δx
        while i_end <= p_end:
            i_end += 1
            if signal_data.iloc[i_end] <= threshold:
                break
        curves.append(signal_data.iloc[i_start - Δx:i_end + Δx])

    return curves
def find_activity_intervals(C, Npeaks=5, tB=-3, tA=10, thres=0.3):
    # todo todocument
    import peakutils
    K, T = np.shape(C)
    L = []
    for i in range(K):
        if np.sum(np.abs(np.diff(C[i, :]))) == 0:
            L.append([])
            print('empyty component at:' + str(i))
            continue
        indexes = peakutils.indexes(C[i, :], thres=thres)
        srt_ind = indexes[np.argsort(C[i, indexes])][::-1]
        srt_ind = srt_ind[:Npeaks]
        L.append(srt_ind)

    LOC = []
    for i in range(K):
        if len(L[i]) > 0:
            interval = np.kron(L[i], np.ones(int(np.round(tA - tB)), dtype=int)) + \
                np.kron(np.ones(len(L[i]), dtype=int), np.arange(tB, tA))
            interval[interval < 0] = 0
            interval[interval > T - 1] = T - 1
            LOC.append(np.array(list(set(interval))))
        else:
            LOC.append(None)

    return LOC
def peak_finder(spectrum, energy):
    '''
    PEAK_FINDER will search for peaks within a certain range determined by the
    Energy given. It takes a Spectra file and an Energy value as input. The
    energy range to look in is given by the Full-Width-Half-Maximum (FWHM).
    If more than one peak is found in the given range, the peak with the
    highest amount of counts will be used.
    '''
    e0 = spectrum.energy_cal[0]
    eslope = spectrum.energy_cal[1]
    energy_axis = e0 + eslope*spectrum.channel

    peak_energy = []
    # rough estimate of fwhm.
    fwhm = 0.05*energy**0.5
    fwhm_range = 1

    # peak search area
    start_region = np.flatnonzero(energy_axis > energy - fwhm_range * fwhm)[0]
    end_region = np.flatnonzero(energy_axis > energy + fwhm_range * fwhm)[0]
    y = spectrum.data[start_region:end_region]
    indexes = peakutils.indexes(y, thres=0.5, min_dist=4)
    tallest_peak = []
    if indexes.size == 0:
        peak_energy.append(int((end_region - start_region) / 2) + start_region)
    else:
        for i in range(indexes.size):
            spot = spectrum.data[indexes[i]+start_region]
            tallest_peak.append(spot)
        indexes = indexes[np.argmax(tallest_peak)]
        peak_energy.append(int(indexes+start_region))
    peak_energy = float(energy_axis[peak_energy])
    return(peak_energy)
def detect_start_end_times(pattern_wav, recording_wav, sr, overlap):
    """Find matches for the start/end pattern within the recorded audio"""

    # Compute the STFT of the recordings
    specgram1 = numpy.array(stft.spectrogram(pattern_wav, overlap=overlap))
    specgram2 = numpy.array(stft.spectrogram(recording_wav, overlap=overlap))

    # Restrict the spectrum to the frequency band occupied by the start/end pattern
    pattern = abs(specgram1[7:16,:])
    recording = abs(specgram2[7:16,:])

    # Search for matches of the pattern in the input recording and return a confidence score
    # for each time position of the input recording
    confidence = match_template(recording, pattern)

    # Search for peaks in the confidence score, and choose the two highest peaks
    # Minimum distance between consecutive peaks is set to 1 second
    peaks = peakutils.indexes(confidence[0], thres=0, min_dist=seconds_to_samples(1, overlap, sr))
    peaks = sorted(peaks, key=lambda p: -confidence[0,p])[:2]

    #TODO: throw errors instead of printing, if necessary
    if len(peaks) < 1:
        print "Could not detect a starting beep!"
    elif len(peaks) < 2:
        print "Could only detect one starting beep!"
    else:
        start, end = sorted(peaks)
        print "Initial beep detected at " + "%.3f" % samples_to_seconds(start, overlap, sr) + " seconds."
        print "Final beep detected at " + "%.3f" % samples_to_seconds(end, overlap, sr) + " seconds."
    return samples_to_seconds(start, overlap, sr), samples_to_seconds(end, overlap, sr)
def generate_standard_curve(file, ladder):

	#Finds peaks in ladder lane and calculates STD curve.
	#This can then be used to calculate the molecular weight of samples


	x= pandas.read_csv(file, delim_whitespace=True)
	x = x.ix[1:]
	np_array = np.array(x["Y"])
	base = peakutils.baseline(np_array,2)
	indexes = peakutils.indexes(np_array,thres=0.1, min_dist=25) #Adjust these if peak calling fails for ladder lane!


	#plt.plot(np_array)
	#plt.show()

	print indexes

	if len(indexes) == len(ladder): #If we have found the wrong number of peaks

		max_STD =  len(np_array)
		rf = indexes/len(np_array)
		ladder = np.array(ladder)
		ladder = np.log(ladder) #gets logs for log(molecular weights) vs distance linear regression.
		
		slope, intercept, r_value, pvalue, std_err = stats.linregress(rf,ladder) #Do some linear regression to get line statistics

		return [slope, intercept, r_value, max_STD]

	else:

		return "Error"
Esempio n. 9
0
def checkerboard_matrix_filtering(similarity_matrix, kernel_width, kernel_type="default", thresh=0.25):

    """
    Moving the checkerboard matrix over the main diagonal of the similarity matrix one sample at a time.

    :param kernel_type:
    :param thresh:
    :param similarity_matrix:
    :param kernel_width: the size of one quarter of the checkerboard matrix
    :return: peaks and convolution values
    """

    checkerboard_matrix = get_checkerboard_matrix(kernel_width, kernel_type)

    # The values calculated in this step are starting from the 'kernel_width' position and ending
    # at length - kernel_width
    d = []
    for i in range(0, similarity_matrix.shape[0] - 2 * kernel_width):
        base = similarity_matrix[i:i + kernel_width * 2, i:i + kernel_width * 2]
        d.append(np.sum(np.multiply(base, checkerboard_matrix)))

    # The missing values from 0 to kernel_width are calculated here
    top_left_d = []
    for i in range(0, kernel_width):
        base = similarity_matrix[0:i + kernel_width, 0:i + kernel_width]
        top_left_d.append(np.sum(np.multiply(base, checkerboard_matrix[kernel_width - i:, kernel_width - i:])))

    # The missing kernel_width values at the bottom right are set to 0
    convolution_values = top_left_d + d + [0 for i in range(0, kernel_width)]

    # peaks = find_peaks_cwt(convolution_values, np.arange(1, peak_range))
    peaks = peakutils.indexes(convolution_values, thres=thresh)

    peaks = [0] + list(peaks) + [len(convolution_values)-1]
    return peaks, convolution_values
def find_activity_intervals(C, Npeaks=5, tB=-5, tA=25, thres=0.3):

    import peakutils

    K, T = np.shape(C)
    L = []
    for i in range(K):
        indexes = peakutils.indexes(C[i, :], thres=thres)
        srt_ind = indexes[np.argsort(C[i, indexes])][::-1]
        srt_ind = srt_ind[:Npeaks]
        L.append(srt_ind)

    LOC = []
    for i in range(K):
        if len(L[i]) > 0:
            interval = np.kron(L[i], np.ones(tA - tB, dtype=int)) + np.kron(
                np.ones(len(L[i]), dtype=int), np.arange(tB, tA)
            )
            interval[interval < 0] = 0
            interval[interval > T - 1] = T - 1
            LOC.append(np.array(list(set(interval))))
        else:
            LOC.append(None)

    return LOC
def get_peaks(file, thres_num, minimum, max_STD):

	#This function finds the peaks in data given to it.
    #Only used on sample lanes not ladder lane.
    #Variables thres_num and minimum cam be adjusted if neccecary.

	x= pandas.read_csv(file, delim_whitespace=True)

	x = x.ix[1:] #First row in bad so remove

	np_array = np.array(x["Y"])

	plt.plot(np_array)
	plt.show()

	base = peakutils.baseline(np_array,2) #remove baseline to get better peak calling

	indexes = peakutils.indexes(np_array,thres=thres_num, min_dist=minimum) # find peaks


	#print indexes

	rf = indexes/max_STD

	return rf
Esempio n. 12
0
def get_simple_vals(eda_array):
    """Takes in an array of eda values, returns a list containing one value for the mean, one for the sum, and one for the peak frequency."""
    if len(eda_array)==0:
        return [0,0,0]
    eda_array = np.array(eda_array)
    x = np.linspace(1, len(eda_array), num=len(eda_array))
    y = eda_array
    # normalize with log
    # and blur with gaussian
    y = filters.gaussian_filter(y, 30)
    indexes = peakutils.indexes(y, thres=np.mean(y), min_dist=10)
   
    
    # print("indexes......")
    # print("length:" + str(len(indexes)))
    # print(indexes)
    # #print(x[indexes])
    # #print(y[indexes])

    if len(indexes) == 0:
        return [0,0,0]
    timestamp = datetime.datetime.now()
    print(timestamp)
    mean_ppa = sum(y)/len(y)
    sum_ppa = sum(y)
    freq = len(indexes)

    the_features = [mean_ppa, sum_ppa, freq]

    return the_features
Esempio n. 13
0
def detect_weel_times(LSsn, decimation = 8):
    """
    Return the passby times of the train axes
    
    param:
    ------
    LSsn: Signal
        LS signal
    decimation: int pow of 2
        decimate and filter the signal
    
    return:
    ------
    - tPeaks: np.array
        passby times of the train axes
    """
    s = LSsn.decimate(decimation)
    y = np.array(s)
    t = s.times()
    # define the minimal possible distance in time between two axes
    maxSpeed = 200/3.6
    axleDistance = 1.5
    dt = axleDistance/maxSpeed
    # minimal distance in frames
    min_dist =  int(np.round(dt * s.fs))
    # use peaksUtils module for detecting maxima
    indexes = peakutils.indexes(y, thres = 0.05, min_dist = min_dist)
    tPeaks = peakutils.interpolate(t, y, ind=indexes)
    print('Minimal time interval between maxima is: ', dt,',which is equvalent to ', min_dist,' samples')
    return tPeaks
Esempio n. 14
0
    def test_octave_findpeaks_equal_matlab_findpeaks_minpeakheight_minpeakdistance(self):
        """ Check that Octave findpeaks mimics well the original MatLab findpeaks, with minpeakheight and minpeakdistance filter. """
        # Find peaks on this vector.
        vector = [
            0.199196234460946, 0.150971091401259, 0.066830193587158, -0.007815333052105, -0.044616654524390, -0.055795361348227, -0.076137152400651, -0.118170367279712, -0.163440493736020, -0.190516609994619, -0.176483713717207, -0.126265512667095,
            -0.085683530051180, -0.070626701579825, -0.056650272247038, -0.018164912522573, 0.042641790158567, 0.084300842806316, 0.091380642181674, 0.086612641403415, 0.076804338682254, 0.065114059315175, 0.061730123648466, 0.062054559470569,
            0.037808369894233, -0.007903466706924, -0.022105492056923, 0.022875099403569, 0.100256509561853, 0.161610966145234, 0.188078783724511, 0.179791428716887, 0.127483188979423, 0.037101235419981, -0.061551863605861, -0.134872789642774,
            -0.170882136762535, -0.180232519836007, -0.193873842670550, -0.220596208762850, -0.217710728542538, -0.154566709841264, -0.052288376793704, 0.024309953763214, 0.036995233638215, 0.027385387267975, 0.034756425571608, 0.044538621477845,
            0.048179094187324, 0.062762787751685, 0.093756722731978, 0.128746079656537, 0.140220257694886, 0.107177963642096, 0.064168137422344, 0.049034449543362, 0.043561872239351, 0.037112836659310, 0.049484512152412, 0.075511915362878,
            0.082621740035262, 0.059833540054286, 0.025160333364946, -0.011362411779154, -0.059885473889260, -0.116916348401991, -0.160033412094328, -0.186277401172449, -0.227970985597943, -0.293012110994312, -0.316846014874940, -0.235793951154457,
            -0.071213154358508, 0.087635348114046, 0.166528547043995, 0.156622093806762, 0.114536824444267, 0.098795472321648, 0.106794539180316, 0.123935062619566, 0.138240918685253, 0.120041711787775, 0.065711290699853, -0.020477124669418,
            -0.121124845572754, -0.163652703975820, -0.088146112206319, 0.062253992836015, 0.185115302006708, 0.251310089224804, 0.275507327595166, 0.240646546675415, 0.144130827133559, 0.028378284476590, -0.050543164088393, -0.082379193202235,
            -0.108933261445066, -0.149993661967355, -0.188079227296676, -0.184552832746794
        ]
        # Set to 0 the negative values
        # so they don't interfe in peak search,
        # as Octave findpeaks don't ignore negative values by default
        # (in fact it can search for local minima with the DoubleSided mode).
        # v = np.array(vector)
        # for i in range(0, len(v)):
        #     if v[i] < 0:
        #         v[i] = 0

        # 'MinPeakHeight', 0.05, 'MinPeakDistance', 10, 'MinPeakWidth', 0
        loc = peakutils.indexes(np.array(vector), thres=0.15, min_dist=10)
        print(loc)
        self.assertEqual(
            loc.tolist(),
            [19-1, 31-1, 53-1, 75-1, 91-1])
def get_frequences(rr,time_axis):
    # -- Normalize non-normal peaks
    rr_peak_index = peakutils.indexes(rr,thres=0.1, min_dist=5) # get non-normal peaks
    time_nn, rr_nn = [], []

    # find non-normal's neighbours
    for i in range(len(rr)):
        if i in rr_peak_index:
            # try-except for boundary instances
            try:
                time_nn.append(time_axis[i-1])
                rr_nn.append(rr[i-1])
            except:
                pass
            try:
                time_nn.append(time_axis[i+1])
                rr_nn.append(rr[i+1])
            except:
                pass

    # interpolate non-normal peaks
    interpolate_nn = interpolate.interp1d(time_nn,rr_nn)
    nn_rr = interpolate_nn([element for i,element in enumerate(time_axis) if i in rr_peak_index])
    for i in range(len(nn_rr)):
        rr[rr_peak_index[i]] = nn_rr[i]

    # -- Prepare RR
    time_grid = np.arange(np.min(time_axis),np.max(time_axis),0.25) # time grid with freq step 1/INTERPOLATION_FREQ

    # interpolate data
    interpolate_rr = interpolate.interp1d(time_axis, rr, kind='cubic')
    interpolated_rr = interpolate_rr(time_grid)

    # remove linear trend along axis from data
    detrend_rr = interpolated_rr - np.mean(interpolated_rr)

    # use Tukey window for smoothing curves
    # window = signal.tukey(len(detrend_rr),alpha=0.25)
    import tukey
    window = tukey.tukey(len(detrend_rr),alpha=0.25)
    detrend_rr = (window*detrend_rr)/1000

    # -- Obtaing spectrum
    spectr = (np.absolute(np.fft.fft(detrend_rr,2048))) # zero padding to 2 ^ 11
    spectr = spectr[0:len(spectr)/2] # use only positive section

    freqs = np.linspace(start=0, stop=INTERPOLATION_FREQ/2, num=len(spectr), endpoint=True) # frequence space

    # plot
    # plt.plot(freqs[:len(spectr)/4],spectr[:len(spectr)/4])
    # plt.show()

    # -- Return TP, LF, HF and LF/HF
    LF = get_spectrum_power(spectr, freqs, LF_MIN, LF_MAX)
    HF = get_spectrum_power(spectr, freqs, HF_MIN, HF_MAX)
    TP = get_spectrum_power(spectr, freqs, 0., HF_MAX)

    return(TP,LF,HF,LF/HF)
Esempio n. 16
0
def calibration_check(spectrum):
    '''
    calibration_check will search for certain peaks that are expected to occur
    in every measured spectra. The energies it searches for are based on peaks
    that occur in background radiation. Once these peaks are found, it
    compares the energy of that peak to the actual energy the peak should be
    at. This check is based on expected detector resolution and if the energy
    deviates to far from the expected value (if beyond half a FWHM), then
    calibration_check sends a message indicating a fix is needed. Only Spectra
    are taken as input.
    '''
    E0 = spectrum.energy_cal[0]
    Eslope = spectrum.energy_cal[1]
    energy_axis = E0 + Eslope*spectrum.channel

    peak_channel = []
    found_energy = []
    offsets = []
    skip = 0
    fix = 0
    for energy in energy_list:
        # rough estimate of fwhm.
        fwhm = 0.05*energy**0.5
        energy_range = 0.015*energy

        # peak gross area

        start_region = np.flatnonzero(energy_axis > energy - energy_range)[0]

        end_region = np.flatnonzero(energy_axis > energy + energy_range)[0]
        y = spectrum.data[start_region:end_region]
        indexes = peakutils.indexes(y, thres=0.5, min_dist=4)
        tallest_peak = []
        if indexes.size == 0:
            print('peak not found')
            offsets.append(np.nan)
            skip += 1
        else:
            for i in range(indexes.size):
                spot = spectrum.data[indexes[i]+start_region]
                tallest_peak.append(spot)
            indexes = indexes[np.argmax(tallest_peak)]
            peak_channel.append(int(indexes+start_region))
            found_energy.append(energy)
            difference = abs((energy -
                              float(energy_axis[int(indexes+start_region)])))
            offsets.append(difference)
            if difference > 0.5*fwhm:
                fix += 1
    if skip > 4:
        message = 'error'
    elif fix >= 4:
        message = 'fix'
    else:
        message = 'fine'
    offsets.append(message)
    return(peak_channel, found_energy, message, offsets)
    def find_peak_indexes(self):
        indexes = peakutils.indexes(self.intensity, thres=self.threshold,
                                    min_dist=self.min_distance)

        self.centroid_indexes = indexes[
            np.where(self.intensity[indexes] > self.min_val)]

        self.centroids = self.wavelength[self.centroid_indexes]
        self.amplitudes = self.intensity[self.centroid_indexes]
        self.sigmas = np.ones(len(self.wavelength[self.centroid_indexes]))
Esempio n. 18
0
    def process_frames(self, data):
        data = data[0]
        # filter to smooth noise
        data = savgol_filter(data, 51, 3)
        PeakIndex = pe.indexes(data, thres=self.parameters['thresh'],
                               min_dist=self.parameters['min_distance'])

        PeakIndexOut = np.zeros(data.shape)
        PeakIndexOut[PeakIndex] = 1
        return PeakIndexOut
def peak_finder_pro(measurement):
    E0 = measurement.energy_cal[0]
    Eslope = measurement.energy_cal[1]
    energy_axis = E0 + Eslope*measurement.channel
    increment = 25
    counts = measurement.data
    peaks_found = []
    plop = []
    start = 0
    end = start + increment
    count = 0
    for energy in energy_axis:
        count += 1
        if end >= len(measurement.channel):
            break
        else:
            count_total = sum(counts[start:end])
            average_range = count_total / (len(counts[start:end]))
            average_ends = (counts[start] + counts[end]) / 2
            threshold = 1.1 * average_ends
            if average_range > threshold:
                counts_range = counts[start:end]
                middle = int((start + end) / 2)
                average_fwhm = 0.05 * energy_axis[middle]**0.5
                average_fwhm_dist = int(average_fwhm / Eslope)
                indexes = p.indexes(np.log(counts_range),
                                    thres=0.1, min_dist=average_fwhm_dist)
                for index in indexes:
                    plop.append(index+start)
                    uncertainty = average_range**0.5
                    significance = ((counts[start+index]-average_range) /
                                    uncertainty)
                    if significance > 4:
                        peaks_found.append(index + start)
                    else:
                        pass
                start += 25
                end = start + increment
            else:
                start += 1
                end = start + increment
    return peaks_found
    print(peaks_found)
    print(count)
    print(len(peaks_found))
    plt.figure()
    plt.title('Filtered Peaks')
    plt.plot(measurement.channel, np.log(counts))
    plt.plot(measurement.channel[peaks_found],
             np.log(counts[peaks_found]), 'ro')
    plt.figure()
    plt.title('All Peaks')
    plt.plot(measurement.channel, np.log(counts))
    plt.plot(measurement.channel[plop], np.log(counts[plop]), 'bo')
    plt.show()
def compute_segments_from_predictions(predictions, beat_times):
    """
    Computes the segment times from a prediction curve and the beat times
    using peak picking.
    """
    predictions = np.squeeze(predictions)
    predictions = post_processing(predictions)
    peak_loc = peakutils.indexes(predictions, min_dist=8, thres=0.05)
    segment_times = beat_times[peak_loc]

    return segment_times
Esempio n. 21
0
def echo_start_index(sample):
	MIN_DIST = 500
	THRESHOLD = 0.2
	indices = peakutils.indexes(
		sample,
		min_dist=MIN_DIST,
		thres=THRESHOLD
	)
	[p0,p1] = indices[0:2]
	constrained = moving_average(np.abs(sample[p0:p1]), 101)
	return np.where(constrained == min(constrained))[0][0]
Esempio n. 22
0
def do_plot1d_peakutil():
    plot.cla()
    y=specdata[1]
    plot.plot(x,y)
    plot.xlim([startfreq*1e-6,stopfreq*1e-6])
    plot.title('Spectrum',fontsize=30)
    plot.ylabel("Amplitude(dB)",fontsize=30)
    plot.xlabel("Frequency(MHz)",fontsize=30)
    indexes=peakutils.indexes(y+80,thres=0.3,min_dist=100)
    pplot(x,y,indexes)
    plot.show(False)
    plot.pause(0.001)
Esempio n. 23
0
 def _calculateSpikeEventtimes(data, dt):
     """
     returns for an trace all spike events
     :param data:
     :return:
     """
     #import pylab as pl
     if len(data) < 1:
         return []
     idxs = pu.indexes(np.array(data), thres=0.1, min_dist=100)
     timeEvents = idxs * dt
     return timeEvents
    def find_peak_and_frequency(self, power_max, xf_max):
        """
        Peak detection with the PeakUtils library
        :param power_max: ndarray - maximum power spectrum
        :param xf_max: ndarray - frequency parts in an equally interval
        :return: peak: ndarray - a pair of power and frequency
        """

        indexes = peakutils.indexes(power_max, thres=0.9, min_dist=30)
        peak = np.hstack((xf_max[indexes], power_max[indexes]))

        return peak
Esempio n. 25
0
    def test_peaks(self):
        y = load('noise')[:, 1]
        filtered = scipy.signal.savgol_filter(y, 21, 1)
        n_peaks = 8

        idx = peakutils.indexes(filtered, thres=0.08, min_dist=50)

        for p in range(idx.size, 1):
            self.assertGreater(idx[p], 0)
            self.assertLess(idx[p], idx.size - 1)
            self.assertGreater(idx[p], idx[p - 1])

        self.assertEqual(idx.size, n_peaks)
Esempio n. 26
0
def fast_find_peaks(ys, xs, **kw):
    try:
        from peakutils import indexes
    except ImportError:
        from pyface.message_dialog import warning
        warning(None, 'PeakUtils required to identify and label peaks.\n\n'
                      'Please install PeakUtils. From commandline use "pip install peakutils"')
        return [], []

    ys, xs = asarray(ys), asarray(xs)
    indexes = indexes(ys, **kw)
    peaks_x = interpolate(xs, ys, ind=indexes)
    return peaks_x, ys[indexes]
Esempio n. 27
0
def interpolate(x, y, ind=None, width=10, func=None):
    """
    modified from peakutils to handle edge peaks

    Tries to enhance the resolution of the peak detection by using
    Gaussian fitting, centroid computation or an arbitrary function on the
    neighborhood of each previously detected peak index.

    Parameters
    ----------
    x : ndarray
        Data on the x dimension.
    y : ndarray
        Data on the y dimension.
    ind : ndarray
        Indexes of the previously detected peaks. If None, indexes() will be
        called with the default parameters.
    width : int
        Number of points (before and after) each peak index to pass to *func*
        in order to encrease the resolution in *x*.
    func : function(x,y)
        Function that will be called to detect an unique peak in the x,y data.

    Returns
    -------
    ndarray :
        Array with the adjusted peak positions (in *x*)
    """

    out = []
    try:
        if func is None:
            from peakutils import gaussian_fit
            func = gaussian_fit

        if ind is None:
            from peakutils import indexes
            ind = indexes(y)

        for slice_ in (slice(max(0, i - width), min(i + width, y.shape[0])) for i in ind):
            try:
                fit = func(x[slice_], y[slice_])
                out.append(fit)
            except Exception:
                pass
    except ImportError:
        from pyface.message_dialog import warning
        warning(None, 'PeakUtils required to identify and label peaks.\n\n'
                      'Please install PeakUtils. From commandline use "pip install peakutils"')

    return array(out)
Esempio n. 28
0
 def find_peaks(self, data):
     """
     Description: find index of peaks from data sequence
     Input: a data sequence to calculate
     Output: index list of peaks
     """
     '''
     ======================== *** Not fine-tuned *** ========================
     ======================== *** Need to find suitable method *** ========================
     '''
     threshold = 0.3
     min_dist = 2
     indexes = peakutils.indexes(np.asarray(data), threshold, min_dist)
     return indexes
Esempio n. 29
0
    def _track_points(self, search_indices, direction):
        """
        The actual point tracking routine.
        Should only be run via the start_tracking function.
        Calls itself recursively and walks along one branch in both directions,
        starting from given start_coords and detects peaks or dips in a given span.
        For the next call, the search_indices are shifted depending on the distance
        between the last found points.
        Recursion stops as soon as the boundary of the dataset is reached in both directions.
        Detected points are added to the hidden _points_x and _points_y arrays.
        """
        
        # Test if still in data
        if (search_indices[0]<0 or search_indices[0]>=len(self.xdata) or
            search_indices[1]-self.span/2<0 or search_indices[1]+self.span/2>=len(self.ydata)):
            print "Reached boundary of dataset"
            return
        
        search_data = self._sig * self.data[int(search_indices[0]), int(search_indices[1]-self.span/2) : int(search_indices[1]+self.span/2)]

        indexes_found = peakutils.indexes(search_data, thres=self._thres, min_dist=self._min_dist)

        # add found peaks to arrays, and repeat recursively with shifted search_indices
        if indexes_found.size>=1:
            y_new = search_indices[1] - int(self.span/2) + indexes_found[0]
            self._points_y = np.append(self._points_y,y_new)
            self._points_x = np.append(self._points_x,search_indices[0])
            
            # If more than one peak found, print it and take the first one
            if indexes_found.size>1:
                print "Found more than one peak in trace " + str(search_indices[0])
                print "First found peak added"
                
        # If no peak found, print it and continue with next current trace        
        else:
            print "No peak found in trace " + str(search_indices[0])
            # Add distance between two last found peaks to shift
            if len(self._points_y) >= 2:
                y_new = self._points_y[-1] + (self._points_y[-1] - self._points_y[-2])
            else:
                y_new = search_indices[1]
             
        # shift search intervall (if not the first point) and search in shifted intervall
        if direction==0:
            self._track_points([search_indices[0]+1,search_indices[1]], direction=1)
            self._track_points([search_indices[0]-1,search_indices[1]], direction=-1)
        else:
            search_indices[1] = search_indices[1] + (y_new - search_indices[1])
            self._track_points([search_indices[0]+direction,search_indices[1]], direction=direction)
Esempio n. 30
0
 def test_octave_findpeaks_equal_matlab_findpeaks_minpeakheight_3(self):
     """ Check that Octave findpeaks mimics well the original MatLab findpeaks, with minpeakheight filter. """
     # Find peaks on this vector.
     vector = [
         0.000000000000002, 4.304968393969253, 2.524429995956715,
         1.362350996472030, 8.651011827706597, 5.355103964053995,
         4.166135802128525, 7.111434648523146, 41.368426443580518,
         13.753049599045664, 11.652130301046128
     ]
     # 'MinPeakHeight', 22
     loc = peakutils.indexes(vector)
     print(loc)
     self.assertEqual(
         loc.tolist(),
         [9-1])
            else:
                br_phase_at_peak = np.nan
                br_rate_at_peak = np.nan

            data_loaded['br_phase_at_peak'].append(br_phase_at_peak)
            data_loaded['br_rate_at_peak'].append(br_rate_at_peak)

            ## Perform the peak_detection (Vertical)
            thresholdV = 3 * np.std(
                clipV[(ib - 100):ib]
            )  #Set the threshold as standard deviation movement 100ms before stim
            prior_meanV = np.mean(
                clipV[(ib - 100):ib])  #Mean position 100ms before stim

            indices = peakutils.indexes(clipV, thres=thresholdV, min_dist=10)
            if len(indices) == 0 or max(indices) < ib:
                max_deflectionV = np.nan
                max_deflection_timeV = np.nan
            else:
                first_peakV = indices[np.where(indices > ib)[0][0]]
                max_deflectionV = clipV[first_peakV] - prior_meanV
                max_deflection_timeV = first_peakV - ib

            data_loaded['max_deflection_V'].append(max_deflectionV)
            data_loaded['max_deflection_timeV'].append(max_deflection_timeV)

    #%%
    df = pd.DataFrame(data=data_loaded)
    df['stim_power'] = df['stim_duration'] * df['stim_current'] * 2.1 / 1000
    df = df.round({'stim_power': 1, 'stim_current': 0})
Esempio n. 32
0
 def getFFT(self, signal, fs):
     x, y = self.calcFFT(signal, fs)
     indexes = peakutils.indexes(y, thres=0.2, min_dist=100)
     print("Os picos detectados são: ")
     print(indexes)
     return indexes
Esempio n. 33
0
smoothed_saturations = smooth(
    saturations, SMOOTHING_LEN * SAMPLING_FREQ * 2 // STFT_SEG_LEN)

freq_perc = np.exp(
    np.linspace(np.log(LOW_FREQUENCY), np.log(HIGH_FREQUENCY), freqs.size))
volumes_perc = interp1d(log_freqs[1:],
                        volumes[1:, :],
                        fill_value='extrapolate',
                        kind='quadratic',
                        axis=0)(np.log(freq_perc))
normalized_volumes_perc = zscore(volumes_perc, axis=1)
saturations_perc = normalized_volumes_perc.sum(axis=0)
smoothed_saturations_perc = smooth(
    saturations_perc, SMOOTHING_LEN * SAMPLING_FREQ * 2 // STFT_SEG_LEN)

indexes = peakutils.indexes(smooth(
    np.gradient(smoothed_saturations_perc),
    SMOOTHING_LEN * 10 * SAMPLING_FREQ * 2 // STFT_SEG_LEN),
                            min_dist=100)

# plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=100)
# plt.title('STFT Magnitude')
# plt.ylabel('Frequency [Hz]')
# plt.xlabel('Time [sec]')
# plt.show()

# backend.play_sound(file)

# while True:
#     print(backend.get_position())
#     time.sleep(.1)
Esempio n. 34
0
def signal_movement(signal, speed_rate, bins_size):
    '''
    set the number of the peaks as the indicator of speed
    '''
    speed = len(pku.indexes((signal, speed_rate, bins_size / 20)))
    return speed
Esempio n. 35
0
cols = ['x', 'y']
for fname in os.listdir(path_dir):
    print(fname)
    file_path = (os.path.join(path_dir, fname))
    df = pd.read_csv(file_path,
                     sep='\t',
                     header=4,
                     engine='python',
                     names=cols)
    df.sort_values(by='x', ascending=True, inplace=True)
    df.drop_duplicates(inplace=True)
    df['y_invert'] = df['y'].mean() - df.y
    #    df.plot('x','y_invert')
    base = peakutils.baseline(df.y_invert, 2)
    indexes = peakutils.indexes(df.y_invert - base,
                                thres=0.00001,
                                min_dist=200)
    #    print(indexes)
    #    pplot(df.x,df.y_invert, indexes)
    for i in indexes:
        if i[(i < 100) & (i > 5)]:
            peak_x = i
            x2, y2 = df.x, df.y_invert
            skewness = stats.skew(y2)
            tck = interpolate.splrep(
                x2, y2, s=.00000001
            )  # s =m-sqrt(2m) where m= #datapts and s is smoothness factor
            x_ = np.arange(np.min(x2), np.max(x2), 0.003)
            y_ = interpolate.splev(x_, tck, der=0)

            HM = (np.max(y_) - np.min(y_)) / 2
Esempio n. 36
0
import numpy as np
import peakutils
import matplotlib.pyplot as plt

t, T7, T8 = np.genfromtxt('dynamisch200.txt', unpack=True)

indexesmax = peakutils.indexes(T7, thres=0.02 / max(T7), min_dist=50)
indexesmin = peakutils.indexes(-T7, thres=0.02 / max(-T7), min_dist=50)

plt.plot(t, T7, 'b-', label='Messwerte')
plt.plot(indexesmax, T7[indexesmax], 'rx')
plt.plot(indexesmin, T7[indexesmin], 'rx')
#plt.show()

print(indexesmax)
print(indexesmin)
Esempio n. 37
0
zero = np.ones(400) * -0.5

one_t = np.arange(400) / Fs
one = np.ones(400) * 0.5

preamble_t = np.arange(800 * 4) / Fs
preamble = np.concatenate((zero, zero, zero, one, one, one, zero, one))

bit_t = np.arange(800) / Fs
bit = np.concatenate((one, zero))

mask_t = np.arange(800 * 44) / Fs
mask_l = 800 * 44

scan = np.convolve(data, preamble[::-1], mode='same') / 800
ind = peakutils.indexes(scan, thres=0.75, min_dist=2000)
ind = ind + 2 * 800

data_grid = []

for start in ind:
    sample = data[start:start + mask_l]
    deriv = np.diff(sample)
    plt.plot(mask_t[1:] + time[start], deriv)
    maxes = peakutils.indexes(deriv, thres=0.75, min_dist=250)
    mins = peakutils.indexes(-deriv, thres=0.75, min_dist=250)
    maxes = list(maxes)
    mins = list(mins)
    bits = str()
    t = 300
    while (t < mask_l):
 def __pt_indexes(self, pt_signal):
     return pu.indexes(pt_signal,
                       thres=IDX_THRESHOLD,
                       min_dist=self.window_size)
Esempio n. 39
0
def cwesr_fit(x,
              y,
              filenum=0,
              gauss=False,
              gamp=dgamp,
              gwidth=dgwidth,
              gctr=2870,
              d_gsplit=20,
              min_width=4,
              max_width=15,
              max_counts=3e5,
              max_ctr=2875,
              max_splitting=200):

    dlen = len(y)
    b, a = signal.butter(1, 0.4, btype='lowpass')
    yfilt = signal.filtfilt(b, a, y)
    indexes = peakutils.indexes(np.max(yfilt) - yfilt, thres=0.45, min_dist=2)
    sm1 = []
    sm2 = []
    mintab = np.transpose([x[indexes], y[indexes]])

    for i in range(0, len(mintab)):
        if mintab[i][0] < 2873:
            sm1.append(mintab[i])
        else:
            sm2.append(mintab[i])
    sm1s = sorted(sm1, key=lambda x: x[1])
    sm2s = sorted(sm2, key=lambda x: x[1])

    dmax = np.max(y)
    dmin = np.min(y)
    amp = dmax - dmin

    ystart = np.mean(np.append(y[0:3], y[-3:]))

    if len(sm1s) >= 1 and len(sm2s) >= 1:
        fc1 = sm1s[0][0]
        fc2 = sm2s[0][0]
        gsplit = np.abs(fc2 - fc1)
        # gctr = (fc2+fc1)/2
        gamp = ystart - sm1s[0][1]
    elif len(sm1s) == 0 and len(sm2s) == 1:
        gsplit = 0
        gamp = (ystart - sm2s[0][1]) / 2
        gctr = sm2s[0][0]
    # elif len(sm1s) == 0 and len(sm2s) >= 2:
    # 	fc1 = sm2s[0][0]
    # 	fc2 = sm2s[1][0]
    # 	gsplit = np.abs(fc2-fc1)
    # 	gamp = (ystart-sm2s[0][1])
    # 	gctr = (fc2+fc1)/2
    elif len(sm1s) == 1 and len(sm2s) == 0:
        gsplit = 0
        gamp = (ystart - sm1s[0][1]) / 2
        gctr = sm1s[0][0]
    # elif len(sm1s) >= 2 and len(sm2s) == 0:
    # 	fc1 = sm1s[0][0]
    # 	fc2 = sm1s[1][0]
    # 	gsplit = np.abs(fc2-fc1)
    # 	gamp = (ystart-sm1s[0][1])
    # 	gctr = (fc2+fc1)/2
    else:
        gsplit = d_gsplit
        gamp = ystart - dmin

    lbounds2 = [
        0, 2865, -max_splitting, amp / 8, min_width, amp / 8, min_width
    ]
    ubounds2 = [
        max_counts, max_ctr, max_splitting, 4 * amp, max_width, 4 * amp,
        max_width
    ]
    guess = [ystart, gctr, gsplit, gamp, gwidth, gamp, gwidth]

    try:
        if (gauss):
            popt, pcov = curve_fit(fit_gaussian,
                                   x,
                                   y,
                                   p0=guess,
                                   bounds=(lbounds2, ubounds2))
        else:
            popt, pcov = curve_fit(fit_lorentzian,
                                   x,
                                   y,
                                   p0=guess,
                                   bounds=(lbounds2, ubounds2))
    except:
        popt = [0, 0, 1e3, 1, 1, 1, 1]
        pcov = np.zeros((7, 7))
        print('fit fail on file ' + str(filenum))

    if (gauss):
        fit = fit_gaussian(x, *popt)
        fitg = fit_gaussian(x, *guess)
    else:
        fit = fit_lorentzian(x, *popt)
        fitg = fit_lorentzian(x, *guess)

    return popt, pcov, fit, fitg
Esempio n. 40
0
ROI = img[:, :, 2]
#ROI = cv2.equalizeHist(ROI)
#print('plotting')
avg = -ROI.mean(axis=0)
avg = avg + 200
baseline_vals = peakutils.baseline(avg)

_, ax = plt.subplots(2, 1)

ax[0].plot(avg)
ax[0].plot(baseline_vals)
ax[0].set_ylabel('8-bit Value')
ax[0].grid(True)

cleanDat = avg - baseline_vals
indices = peakutils.indexes(cleanDat, thres=0.5, min_dist=30)
peaks = cleanDat[indices]

ax[1].plot(indices, peaks, 'x')
ax[1].plot(cleanDat)
ax[1].set_xlabel('pixel Index')
ax[1].set_ylabel('8-bit Value')
ax[1].grid(True)

#  print('finished plotting')
plt.savefig(imagePath + '/raw_data.jpg')
plt.close()
#  print('found {} peaks'.format(len(indices)))

if len(indices) == 2:
    print('matched')
def ajustar_erf(datos, graficar=False, debug=True):
    '''
	Dado un diccionario con el formato {dacVal:cuentas}, ajusta una erf a la bajada de 1SPE y devuelve los parametros del ajuste.
	El mismo, lo hace mediante la siguiente rutina:
	1) Realiza un smooth de los datos mediante el metodo Savitzky Golay, y deriva el resultado.
	Sobre este, aplica la funcion findpeaks para encontrar el maximo (y por lo tanto,
	el punto de inflexion de los datos originales). Ademas, calcula un ancho aproximado de esta bajada
	2) A partir del punto del maximo y del ancho calculados, recorta los datos originales (sin smooth)
	a los que le ajusta una funcion error
	FYI: El punto de inflexion de erfunc se alcanza en x=c
	'''
    x_data = list(datos.keys())
    y_data = list(datos.values())

    #plt.semilogy(x_data,y_data)
    #plt.show()

    #Antes de comenzar el paso 1, recortamos los ultimos datos, para evitar tener ceros
    #La razon, es que el cuentapicos trabaja en escala logaritmica (para hacer mas facil la busqueda de picos)
    x_data = [i for i in x_data if y_data[x_data.index(i)] > 0]
    y_data = [i for i in y_data if i > 0]
    if len(y_data) < 20:
        print("Unicamente hay linea de base")
        return False

    #Comenzamos con el paso 1
    y = savitzky_golay(-np.log(np.asarray(y_data)),
                       window_size=7,
                       order=2,
                       deriv=1)
    #Buscamos picos dentro del smooth
    indices = peakutils.indexes(y, min_dist=len(y_data) // 25, thres=0.4)
    #Filtramos los picos hallados
    indicesf = []
    for l in indices:
        if y[l] > 0.2 * max(y):
            indicesf.append(l)

    #Vamos a necesitar tambien buscar el valor de DAC10 de la linea de base. Para ello, me fijo cuando y cae por debajo de la mitad
    bajada_base = y_data.index(max(y_data))
    subida_base = y_data.index(max(y_data))
    thres = 0.2 * max(y_data)
    try:
        while y_data[subida_base] > thres:
            subida_base += 1
        while y_data[bajada_base] > thres:
            bajada_base -= 1
    except:
        print("Error al buscar ancho linea de base")
        if debug:
            plt.semilogy(x_data, y_data)
            plt.show()
        return False
    indice10_linea_de_base = (x_data[subida_base] + x_data[bajada_base]) / 2

    #Buscamos el ancho de la bajada de 1SPE. La razon por la cual busco el ancho en torno al primer pico, es que el primero,
    #corresponde a la 'bajada' del rectangulo del ruido

    ##Busco los de inflexion contiguos al pico, correspondientes al doblamiento en el Plateua
    indicesl = peakutils.indexes(-y, min_dist=len(y_data) // 25, thres=0.1)
    try:
        for j in range(0, len(indicesl)):
            if indicesl[j] < indicesf[1] and indicesl[j + 1] > indicesf[1]:
                cotasup = indicesl[j + 1]
                cotainf = indicesl[j]
                break
    except:
        print("Error al buscar ancho linea de base")
        if debug:
            plt.semilogy(x_data, y_data)
            plt.show()
            plt.plot(x_data, -y)
            plt.plot([x_data[j] for j in indicesl],
                     [-y_data[j] for j in indicesl])
            plt.show()
        return False

    #Una vez hallados los anchos, los abrimos un poco mas
    cotainf = cotainf - 4
    cotasup = cotasup + 4
    #Encontramos algunos casos donde el tamaño de la meseta entre ruido y 1SPE era muy pequeña, lo que hacia que la
    #deteccion de anchos sea erronea. Por ello, imponemos los siguientes limites:
    if cotainf <= indicesf[0] + 3:
        cotainf = indicesf[0] + 3

    if graficar:
        trazas = []
        trazas.append(
            go.Scatter(x=x_data,
                       y=y_data,
                       line=dict(color=('rgb(204, 0, 0)')),
                       name='Cuentas'))
        trazas.append(
            go.Scatter(x=[x_data[j] for j in indicesf],
                       y=[y_data[j] for j in indicesf],
                       mode='markers',
                       marker=dict(size=8,
                                   color='rgb(200,100,0)',
                                   symbol='cross'),
                       name='Picos'))
        trazas.append(
            go.Scatter(x=[x_data[j] for j in [bajada_base, subida_base]],
                       y=[y_data[j] for j in [bajada_base, subida_base]],
                       mode='markers',
                       marker=dict(size=8,
                                   color='rgb(250,250,250)',
                                   symbol='cross'),
                       name='Exteremos linea de base'))
        trazas.append(
            go.Scatter(x=[x_data[cotainf], x_data[cotasup]],
                       y=[y_data[cotainf], y_data[cotasup]],
                       mode='markers',
                       marker=dict(size=8,
                                   color='rgb(0,0,255)',
                                   symbol='cross'),
                       name='Limites de ajuste'))

    #Recortamos los datos en funcion a lo hallado anteriormente. Unicamente nos interesa el punto de 1SPE, no el resto de la escalera
    x_data = x_data[cotainf:cotasup + 1]
    y_data = y_data[cotainf:cotasup + 1]

    #Inicializamos valores de ajute de acuerdo a sugerencia hallada en https://mathematica.stackexchange.com/a/42166
    p0 = [
        -(max(y_data) - min(y_data)) / 2, 2 / len(x_data),
        np.mean(x_data), (max(y_data) - min(y_data)) / 2
    ]

    #Fiteamos una erf. La razon del with es para que el fiteo levante un error, si tiene problemas para ajustar
    with warnings.catch_warnings():
        warnings.simplefilter("error", OptimizeWarning)
        try:
            params, extras = curve_fit(erfunc,
                                       x_data,
                                       y_data,
                                       p0,
                                       ftol=1.49012e-14,
                                       xtol=1.49012e-14,
                                       maxfev=10**8)
            #Es bueno el fiteo? Calculemos r^2
            residuals = y_data - erfunc(x_data, *params)
            ss_res = np.sum(residuals**2)
            r_squared = 1 - ss_res / np.sum((y_data - np.mean(y_data))**2)
            if r_squared < 0.95:
                print("Fiteo malo")
                print(r_squared)
                if debug:
                    plt.semilogy(x_data, y_data)
                    plt.semilogy(x_data, erfunc(x_data, *params))
                    plt.show()
                return False
        except OptimizeWarning:
            print("Error en fiteo")
            return False

    if graficar:
        y_adj = []
        for x in x_data:
            y_adj.append(erfunc(x, *params))
        trazas.append(
            go.Scatter(x=x_data,
                       y=y_adj,
                       line=dict(color=('rgb(0, 250, 0)')),
                       name='Ajuste erf'))
        return params, extras, trazas, indice10_linea_de_base
    else:
        return params, extras, indice10_linea_de_base
    dataY = signal.detrend(dataY)
    Y = np.fft.fft(np.asarray(dataY)) / n  # fft computing and normalization
    Y = np.fft.fftshift(Y)
    '''PLOTS'''
    fig = plt.figure(figsize=(12, 8))
    ax = fig.gca()
    plt.plot(frq, abs(Y))  # plotting the spectrum
    tic = Fs / 2
    ax.set_xlim([-tic, tic])
    #plt.xticks(np.arange(-tic,tic,1),fontsize=30)
    plt.yticks(fontsize=22)
    plt.xlabel('Frequency (Hz)', fontsize=34)
    plt.ylabel('Abs(FFT)', fontsize=34)
    plt.tight_layout()

    indexes = peakutils.indexes(abs(Y), thres=0.4)
    [
        plt.plot(frq[indexes[i]],
                 abs(Y)[indexes[i]], 'ro') for i in range(len(indexes))
    ]

    fig.savefig(savepath + '\\FFT.png', dpi=500)
    fig.savefig(savepath + '\\FFT.svg', format='svg', dpi=1200)

    with open(savepath + '\\FFT_freq.txt', 'w') as f:
        f.write('Frequency (Hz)\tAbs(FFT)\n')
        for i in indexes:
            f.write('%.2f\t%.6f\n' % (frq[i], abs(Y)[i]))

    with open(savepath + '\\FFT.txt', 'w') as f:
        f.write('Frequency (Hz)\tAbs(FFT)\n')
Esempio n. 43
0
def get_mean_peak(fid_filename, make_plot=False):
    if not os.path.isfile(fid_filename):
        return None

    pd_data = pd.read_csv(fid_filename)
    # data = milk_data.iloc[:, 10]

    data = pd_data['fidelity'].tolist()

    # print((len(data)-1)/20000*1000)
    cb = np.array(data)
    # print(cb)
    cb_2 = 1 - cb

    indices = peakutils.indexes(cb, thres=thres_up / max(cb), min_dist=1)

    indices_2 = peakutils.indexes(cb_2,
                                  thres=thres_down / max(cb_2),
                                  min_dist=1)
    # print(indices_2)
    ind = {}

    HIGH = []
    LOW = []

    for i in indices:
        ind[i] = 'max'
        HIGH.append(i)

    for i in indices_2:
        ind[i] = 'min'
        LOW.append(i)

    keys = sorted(ind.keys())

    PL_width = []
    PL_height = []
    PL_hw = []

    # print(LOW)
    # print(HIGH)
    # print(ind)
    # print(keys)

    for i in range(0, len(LOW) - 1):
        # print(LOW[i], LOW[i+1])

        MAX = 0
        MAX_H = data[LOW[i]]

        for m in keys:
            if (m > LOW[i] and m < LOW[i + 1] and ind[m] == 'max'):
                if (data[m] > MAX_H):
                    # print("\t", m)
                    MAX = m
                    MAX_H = data[m]
                    # if(data[MAX])
                # MAX = max(m, MAX)
            if (m > LOW[i + 1]):
                break

        if MAX > 0:
            w = abs(LOW[i] - LOW[i + 1]) / 20000 * 1000
            # print("\t\t", LOW[i], LOW[i+1], data[LOW[i]], data[LOW[i+1]])
            h = MAX_H

            PL_width.append(w)
            PL_height.append(h)
            PL_hw.append(h / w)

            # print(MAX)

        #     # print(ind[LOW[i]])
        #     print(ind[m], end='')
        # print()
        # print(indices_2[i], indices_2[i+1])
        # for j in range(1, len(HIGH) - 1):

    # exit(1)
    # for i in range(1, len(keys) - 1):
    #     if ind[keys[i - 1]] == 'min' and ind[keys[i]] == 'max' and ind[keys[i + 1]] == 'min':
    #         w = abs(keys[i - 1] - keys[i + 1])
    #         h = data[keys[i]]

    #         PL_width.append(w)
    #         PL_height.append(h)
    #         PL_hw.append(h / w)

    # print(keys[i], w)

    # print(np.mean(PL_width))
    # print(PL_width)

    if make_plot:
        trace = go.Scatter(x=[j for j in range(len(data))],
                           y=data,
                           mode='lines',
                           name='Original Plot')

        trace2 = go.Scatter(
            x=indices,
            y=[data[j] for j in indices],
            mode='markers',
            marker=dict(
                size=8,
                color='rgb(255,0,0)',
                # symbol='cross'
            ),
            name='Detected Peaks')

        trace3 = go.Scatter(x=indices_2,
                            y=[data[j] for j in indices_2],
                            mode='markers',
                            marker=dict(size=8,
                                        color='rgb(0,255,0)',
                                        symbol='cross'),
                            name='Detected Peaks')

        data = [trace, trace2, trace3]

        plotly.offline.plot(data, filename=fid_filename + '.html')

    return {
        'width': np.mean(PL_width),
        'height': np.mean(PL_height),
        'rel': 1 / np.mean(PL_hw)
    }
Esempio n. 44
0
 def test_list_peaks(self):
     out = peakutils.indexes([1, 2, 1, 3, 5, 7, 4, 1], thres=0, min_dist=1)
     expected = numpy.array([1, 5])
     assert_array_almost_equal(out, expected)
Esempio n. 45
0
def get_bouts_in_file(file_path, hparams, loaded_p=None):
    # path of the wav_file
    # h_params from the rosa spectrogram plus the parameters:
    #     'read_wav_fun': load_couple, # function for loading the wav_like_stream (has to returns fs, ndarray)
    #     'min_segment': 30, # Minimum length of supra_threshold to consider a 'syllable'
    #     'min_silence': 200, # Minmum distance between groups of syllables to consider separate bouts
    #     'bout_lim': 200, # same as min_dinscance !!! Clean that out!
    #     'min_bout': 250, # min bout duration
    #     'peak_thresh_rms': 2.5, # threshold (rms) for peak acceptance,
    #     'thresh_rms': 1 # threshold for detection of syllables

    # Decide and see if it CAN load the power

    s_f, wav_i = hparams['read_wav_fun'](file_path, mmap=False)
    #logger.debug('s_f {}'.format(s_f))

    # Get the bouts. If loaded_p is none, it will copute it
    the_bouts, the_p, all_p, all_syl = get_the_bouts(wav_i,
                                                     hparams,
                                                     loaded_p=loaded_p)

    if the_bouts.size > 0:
        step_ms = hparams['frame_shift_ms']
        pk_dist = hparams['min_segment']
        bout_pd = pd.DataFrame(the_bouts * step_ms,
                               columns=['start_ms', 'end_ms'])
        bout_pd['start_sample'] = bout_pd['start_ms'] * (s_f // 1000)
        bout_pd['end_sample'] = bout_pd['end_ms'] * (s_f // 1000)

        bout_pd['p_step'] = the_p
        # the extrema over the file
        bout_pd['rms_p'] = st.rms(all_p)
        bout_pd['peak_p'] = bout_pd['p_step'].apply(np.max)
        # check whether the peak power is larger than hparams['peak_thresh_rms'] times the rms through the file
        bout_pd['bout_check'] = bout_pd.apply(lambda row: \
                                              (row['peak_p'] > hparams['peak_thresh_rms'] * row['rms_p']),
                                              axis=1)
        bout_pd['file'] = file_path
        bout_pd['len_ms'] = bout_pd.apply(
            lambda r: r['end_ms'] - r['start_ms'], axis=1)

        syl_pd = pd.DataFrame(all_syl * step_ms,
                              columns=['start_ms', 'end_ms'])
        bout_pd['syl_in'] = bout_pd.apply(lambda r: \
                                          syl_pd[(syl_pd['start_ms'] >= r['start_ms']) & \
                                                 (syl_pd['start_ms'] <= r['end_ms'])].values,
                                          axis=1)
        bout_pd['n_syl'] = bout_pd['syl_in'].apply(len)
        # get all the peaks larger than the threshold(peak_thresh_rms * rms)
        bout_pd['peaks_p'] = bout_pd.apply(lambda r: peakutils.indexes(
            r['p_step'],
            thres=hparams['peak_thresh_rms'] * r['rms_p'] / r['p_step'].max(),
            min_dist=pk_dist // step_ms),
                                           axis=1)
        bout_pd['n_peaks'] = bout_pd['peaks_p'].apply(len)
        bout_pd['l_p_ratio'] = bout_pd.apply(
            lambda r: np.nan
            if r['n_peaks'] == 0 else r['len_ms'] / (r['n_peaks']),
            axis=1)

    else:
        bout_pd = pd.DataFrame()
    return bout_pd, wav_i, all_p
Esempio n. 46
0
def get_peak_ratio(file_name,
                   lambda_1,
                   lambda_2,
                   file_name_2=None,
                   acq_time_1=None,
                   acq_time_2=None):

    if (file_name_2 is not None):
        wavelenght_1, intensity_1 = np.genfromtxt(file_name, unpack=True)
        intensity_1 = intensity_1 / acq_time_1

        peakind = peakutils.indexes(intensity_1, thres=0.1, min_dist=0.5)
        x_fit_1 = np.zeros(21)
        y_fit_1 = np.zeros(21)

        for i in range(0, 21):
            x_fit_1[i] = wavelenght_1[peakind[np.abs(wavelenght_1[peakind] -
                                                     lambda_1).argmin()] + i -
                                      10]
            y_fit_1[i] = intensity_1[peakind[np.abs(wavelenght_1[peakind] -
                                                    lambda_1).argmin()] + i -
                                     10]
        I1, x1, s1 = peakutils.peak.gaussian_fit(x_fit_1,
                                                 y_fit_1,
                                                 center_only=False)

        wavelenght_2, intensity_2 = np.genfromtxt(file_name_2, unpack=True)
        intensity_2 = intensity_2 / acq_time_2

        peakind = peakutils.indexes(intensity_2, thres=0.1, min_dist=0.5)
        x_fit_2 = np.zeros(21)
        y_fit_2 = np.zeros(21)

        for i in range(0, 21):
            x_fit_2[i] = wavelenght_2[peakind[np.abs(wavelenght_2[peakind] -
                                                     lambda_2).argmin()] + i -
                                      10]
            y_fit_2[i] = intensity_2[peakind[np.abs(wavelenght_2[peakind] -
                                                    lambda_2).argmin()] + i -
                                     10]
        I2, x2, s2 = peakutils.peak.gaussian_fit(x_fit_2,
                                                 y_fit_2,
                                                 center_only=False)

    else:
        wavelenght, intensity = np.genfromtxt(file_name, unpack=True)

        peakind = peakutils.indexes(intensity, thres=0.1, min_dist=0.5)

        x_fit = np.zeros(21)
        y_fit = np.zeros(21)

        for i in range(0, 21):
            x_fit[i] = wavelenght[peakind[np.abs(wavelenght[peakind] -
                                                 lambda_1).argmin()] + i - 10]
            y_fit[i] = intensity[peakind[np.abs(wavelenght[peakind] -
                                                lambda_1).argmin()] + i - 10]
        I1, x1, s1 = peakutils.peak.gaussian_fit(x_fit,
                                                 y_fit,
                                                 center_only=False)

        for i in range(0, 21):
            x_fit[i] = wavelenght[peakind[np.abs(wavelenght[peakind] -
                                                 lambda_2).argmin()] + i - 10]
            y_fit[i] = intensity[peakind[np.abs(wavelenght[peakind] -
                                                lambda_2).argmin()] + i - 10]
        I2, x2, s2 = peakutils.peak.gaussian_fit(x_fit,
                                                 y_fit,
                                                 center_only=False)

    ratio = I1 / I2
    ratio_err = ratio * (s1 / I1 + s2 / I2)

    return ratio
def detect_peaks(fourier_df,
                 signal_df,
                 true_df=None,
                 t0=None,
                 t1=None,
                 min_thresh=1900,
                 max_thresh=500000,
                 min_dist=13,
                 key_len=60,
                 back_prop=.3,
                 figsz=(18, 10),
                 to_add=None,
                 signal=None,
                 save_dir=None):
    '''
        Detect Peaks in the fourier_df 

            fourier_df : Dataframe containing transformed fourier signal 

            t0 : The start time to analyze 

            t1 : The end time to analyze 

            min_thresh : The minimum threshold to include as a key press 

            max_thresh : The maximium threshold value to include as a key press 

            min_dist : The minimum distanec allowed between two peaks 

            key_len : The fixed length of a key press in milliseconds 

            back_prop : The key_len of a key press is started at back_prop * key_len 
                and ends at back_prop * (1-key_len)

            figsz : The size of the plot

            to_add : If not None, is a list of indices to add as peaks 

    '''
    if t0 and t1:
        print('time range: %.2fs - %.2fs' % (t0, t1))

    # number of milliseconds for a key stroke
    key_len_in_sec = key_len / 1000.

    # Copy over dataframes
    sfourier_df = fourier_df.copy()
    ssignal_df = signal_df.copy()

    # Restrict to timeperiod
    if t0:
        sfourier_df = sfourier_df[sfourier_df.index >= t0]
        ssignal_df = ssignal_df[ssignal_df.index >= t0]
    if t1:
        sfourier_df = sfourier_df[sfourier_df.index <= t1]
        ssignal_df = ssignal_df[ssignal_df.index <= t1]

    if signal:
        signal.emit()

    # Finds the index of the closest value in an array
    def find_nearest(array, value):
        idx = (np.abs(array - value)).argmin()
        return idx

    # Plot with peaks detected
    fig = plt.figure(figsize=figsz)
    ax = plt.subplot(131)
    ax2 = plt.subplot(132)
    ax3 = plt.subplot(133)

    # The fourier signal
    sig = sfourier_df['signal'].values

    # Get indexes withing thresholds
    indexes = peakutils.indexes(sig,
                                min_dist=min_dist,
                                thres=min_thresh / float(sig.max()))
    indexes = indexes[(sig[indexes] <= max_thresh)]

    if signal:
        signal.emit()

    # Add on additional indices if specified
    if to_add and len(to_add) > 0:
        vals = sfourier_df.index.values
        indexes = np.append(indexes,
                            [find_nearest(vals, item) for item in to_add])

    # Add on column to indicate if time point is a peak
    sfourier_df['is_peak'] = False
    sfourier_df.ix[sfourier_df.index[indexes], 'is_peak'] = True

    if signal:
        signal.emit()

    # Create dataframe of peaks
    peaks = sfourier_df[sfourier_df['is_peak']].copy()
    del peaks['is_peak']
    peaks.index.name = 'peak time'
    peaks = peaks.reset_index()

    peaks['start time'] = peaks['peak time'] - back_prop * key_len_in_sec
    peaks['end time'] = peaks['peak time'] + (1 - back_prop) * key_len_in_sec

    print('Number of Keys detected:', len(indexes))
    if signal:
        signal.emit()

    if true_df is not None:
        diff = determine_difference(true_df, peaks)
        fourier_df_ma = pd.rolling_max(fourier_df['signal'],
                                       20,
                                       center=True,
                                       min_periods=1)

    # Plot the entire signal with peaks
    sfourier_df['signal'].plot(ax=ax)
    if len(indexes) > 0:
        sfourier_df['signal'].iloc[indexes].plot(style='*', ax=ax, title='all')
    ax.axhline(y=min_thresh, linewidth=1, c='r')

    if true_df is not None:

        true_peaks = true_df['peak time'] + diff
        if t0:
            true_peaks = true_peaks[true_peaks >= t0]
        if t1:
            true_peaks = true_peaks[true_peaks <= t1]

        vals = fourier_df.index.values
        inds = np.array(
            [find_nearest(vals, item) for item in true_peaks.values])

        plt_vals = fourier_df_ma.ix[vals[inds]]
        ax.scatter(true_peaks.values, plt_vals, marker='*', c='r', zorder=100)
        ax2.scatter(true_peaks.values, plt_vals, marker='*', c='r', zorder=100)

    # Plot the entire signal zoomed in  on the threshold
    sfourier_df['signal'].plot(ax=ax2)
    if len(indexes) > 0:
        sfourier_df['signal'].iloc[indexes].plot(style='*',
                                                 ax=ax2,
                                                 title='zoomed')
    ax2.axhline(y=min_thresh, linewidth=1, c='r')

    # Change the threshold
    mx = np.max([min_thresh * 1.1, sfourier_df['signal'].max() * .15])
    ax2.set_ylim((0, mx))

    if signal:
        signal.emit()

    # Plot a shortened time period
    if not t0:
        t0 = 0.0
    t1 = t0 + 10.

    if t0:
        fourier_df = fourier_df[fourier_df.index >= t0]
        signal_df = signal_df[signal_df.index >= t0]
    if t1:
        fourier_df = fourier_df[fourier_df.index <= t1]
        signal_df = signal_df[signal_df.index <= t1]

    if signal:
        signal.emit()

    # Get signal during shortened period
    sig = fourier_df['signal'].values

    # Get indexes withing thresholds
    indexes = peakutils.indexes(sig,
                                min_dist=min_dist,
                                thres=min_thresh / float(sig.max()))
    indexes = indexes[(sig[indexes] <= max_thresh)]

    # Plot first 10 seconds of clip
    fourier_df['signal'].plot(ax=ax3)
    if len(indexes) > 0:
        fourier_df['signal'].iloc[indexes].plot(style='*',
                                                ax=ax3,
                                                title='zoomed beginning')
    ax3.axhline(y=min_thresh, linewidth=1, c='r')
    ax3.set_ylim((0, mx))

    if true_df is not None:
        true_peaks = true_df['peak time'] + diff
        if t0:
            true_peaks = true_peaks[true_peaks >= t0]
        if t1:
            true_peaks = true_peaks[true_peaks <= t1]

        vals = fourier_df.index.values
        inds = np.array(
            [find_nearest(vals, item) for item in true_peaks.values])

        plt_vals = fourier_df_ma.ix[vals[inds]]
        ax3.scatter(true_peaks.values, plt_vals, marker='*', c='r', zorder=100)

    if signal:
        signal.emit()

    if save_dir:

        fname = os.path.join(save_dir, 'peaks.png')
        fig.savefig(fname)

        fname = os.path.join(save_dir, 'FigureObject.peaks.pickle')
        pickle.dump(fig, open(fname, 'wb'))

    return sfourier_df, ssignal_df, peaks
Esempio n. 48
0
            distance_btwn_presses[-1] = nTRs - 1
        song_bounds.append([distance_btwn_presses]) 
        # replace zeros with ones where presses occurred and store vector in song specific button press time holder
        subj_press_vector[distance_btwn_presses] = 1
        songPressTimes = np.concatenate([songPressTimes,subj_press_vector],axis=0)
    bounds.append(song_bounds)
    allPressTimes.append(np.reshape(songPressTimes,(len(subjs),int(nTRs))))

all_songs_indexes = []

for i in range(len(durs)):
    combined = np.zeros((durs[i],1))
    for t in np.arange(0,len(combined)):
        combined[t] = sum([min(abs(x[0]-(t+1)))<=3 for x in bounds[i]])
    combined = combined.reshape((durs[i]))
    indexes = peakutils.indexes(combined,thres=0.5, min_dist=5)
    all_songs_indexes.append([indexes])

# compute subject specific bound average across songs
subj_bounds = np.zeros((len(subjs),len(durs)))

for s in range(len(subjs)):
    for i in range(len(durs)):
        subj_bounds[s,i] = len(bounds[i][s][0])

subj_bounds_mean = np.mean(subj_bounds,axis=1)
mean_of_mean_bounds = np.mean(subj_bounds_mean)
std_of_mean_bounds = np.std(subj_bounds_mean)

# plot peaks for each song
for i in range(len(all_songs_indexes)):
def find_peak(amplitude):

    peak_indicies = pu.indexes(amplitude, thres=.2)

    return max(peak_indicies)
def main():

    # declare um objeto da classe da sua biblioteca de apoio (cedida)
    signal = sig.signalMeu()
    # declare uma variavel com a frequencia de amostragem, sendo 44100
    freqDeAmostragem = 44100
    # voce importou a bilioteca sounddevice como, por exemplo, sd. entao
    # os seguintes parametros devem ser setados:

    sd.default.samplerate = freqDeAmostragem  # taxa de amostragem
    sd.default.channels = 2  # voce pode ter que alterar isso dependendo da sua placa
    duration = 5  # tempo em segundos que ira aquisitar o sinal acustico captado pelo mic

    # faca um printo na tela dizendo que a captacao comecará em n segundos. e entao
    # use um time.sleep para a espera
    for i in range(6):
        print('A captação começará em ', i, ' segundos.         \r')
        time.sleep(1)

    # faca um print informando que a gravacao foi inicializada
    print("A gravação foi inicializada.")

    # declare uma variavel "duracao" com a duracao em segundos da gravacao. poucos segundos ...
    start = time.time()
    # calcule o numero de amostras "numAmostras" que serao feitas (numero de aquisicoes)
    numAmostras = duration * freqDeAmostragem
    audio = sd.rec(int(numAmostras), freqDeAmostragem, channels=1)
    sd.wait()
    end = time.time()
    print("...     FIM")
    dt = end - start
    print("Durou: ", dt, " segundos")

    # analise sua variavel "audio". pode ser um vetor com 1 ou 2 colunas, lista ..
    print("Audio recebido: ", audio)

    # grave uma variavel com apenas a parte que interessa (dados)
    audio_graf = []
    for i in range(len(audio)):
        audio_graf.append(audio[i][0])
    # use a funcao linspace e crie o vetor tempo. Um instante correspondente a cada amostra!
    t = np.linspace(0.0, dt, len(audio_graf))

    # plot do gravico  áudio vs tempo!

    # Calcula e exibe o Fourier do sinal audio. como saida tem-se a amplitude e as frequencias
    xf, yf = signal.calcFFT(audio_graf, freqDeAmostragem)
    # xf, yf = signal.calcFFT(y, fs)
    fig, axs = plt.subplots(2, 1)
    axs[0].plot(t, audio_graf)
    axs[0].set_xlabel('time')
    axs[0].set_ylabel('Tone Recived')
    axs[0].grid(True)

    # esta funcao analisa o fourier e encontra os picos
    # voce deve aprender a usa-la. ha como ajustar a sensibilidade, ou seja, o que é um pico?
    # voce deve tambem evitar que dois picos proximos sejam identificados, pois pequenas variacoes na
    # frequencia do sinal podem gerar mais de um pico, e na verdade tempos apenas 1.
    # probpeaks = []
    # print(len(probpeaks))
    # for i in range(len(yf)):
    #     if yf[i]<1800 and yf[i]>600:
    #         probpeaks.append(yf[i])
    # probpeaks = np.array(probpeaks)
    # print(probpeaks)
    index = peakutils.indexes(yf, thres=0.2, min_dist=30)
    pplot(xf, yf, index)
    axs[1].set_ylabel('Fourier/Peaks')
    axs[1].grid(True)

    # for x,y in index:

    #     label = "{:.2f}".format(y)

    #     plt.annotate(label, # this is the text
    #                 (x,y), # this is the point to label
    #                 textcoords="offset points", # how to position the text
    #                 xytext=(0,10), # distance from text to points (x,y)
    #                 ha='center') # horizontal alignment can be left, right or center

    fig.tight_layout()
    plt.show()
    # print(index)
    value = xf[index]
    print(value)

    if value[0] <= 710:
        if value[1] <= 1250:
            print("1")
        elif value[1] <= 1390:
            print("2")
        elif value[1] <= 1490:
            print("3")
        else:
            print("A")
    elif value[0] <= 790:
        if value[1] <= 1250:
            print("4")
        elif value[1] <= 1390:
            print("5")
        elif value[1] <= 1490:
            print("6")
        else:
            print("B")
    elif value[0] <= 890:
        if value[1] <= 1250:
            print("7")
        elif value[1] <= 1390:
            print("8")
        elif value[1] <= 1490:
            print("9")
        else:
            print("C")
    else:
        if value[1] <= 1250:
            print("X")
        elif value[1] <= 1390:
            print("0")
        elif value[1] <= 1490:
            print("#")
        else:
            print("D")
    def estimate_cycle_lenght(self, buff):
        autoCorr = self.autocorr(buff)
        autoCorr = self.smooth(autoCorr, 1)
        # normalize
        autoCorr = autoCorr / np.max(autoCorr)

        detectedPeaksNum = 0
        threshold = 0.9
        indexes = []

        lteuDetected = False
        ontime = 0
        dc = 0
        cycleLength = 0

        while detectedPeaksNum < 3:
            indexes = peakutils.indexes(autoCorr, thres=threshold, min_dist=40)
            detectedPeaksNum = len(indexes)
            threshold = threshold - 0.1
            if threshold < 0.3:
                # no pattern discovered
                # print("---No LTE-U detected")
                return [lteuDetected, cycleLength, ontime, dc]

        diff = np.diff(indexes, axis=0)
        avg = np.mean(diff)
        ravg = self.my_round(avg, 10)
        cycleLength = np.uint(ravg * self.samplingInterval)
        lteuDetected = True

        # check different DC to find max corr
        singleSampleNum = cycleLength / self.samplingInterval
        # 4 cycles
        sampleNum = 4 * singleSampleNum
        lteuCycle = np.zeros(np.int(sampleNum), dtype=np.float)
        maxCorr = 0.0

        samples = buff[1000:].astype(np.float)

        for i in range(np.int(cycleLength + 1)):
            lteuCycle.fill(-0.5)

            ss = np.int(0)
            ee = np.int(ss + i / self.samplingInterval)
            lteuCycle[ss:ee] = 0.5

            ss = np.int(1 * cycleLength / self.samplingInterval)
            ee = np.int(ss + i / self.samplingInterval)
            lteuCycle[ss:ee] = 0.5

            ss = np.int(2 * cycleLength / self.samplingInterval)
            ee = np.int(ss + i / self.samplingInterval)
            lteuCycle[ss:ee] = 0.5

            ss = np.int(3 * cycleLength / self.samplingInterval)
            ee = np.int(ss + i / self.samplingInterval)
            lteuCycle[ss:ee] = 0.5

            corr = np.correlate(lteuCycle, samples, mode='same')
            myMaxCorr = np.max(corr)

            if myMaxCorr > maxCorr:
                maxCorr = myMaxCorr
                ontime = i
                dc = ontime / cycleLength

        if ontime <= 3:
            # print("---No LTE-U detected")
            lteuDetected = False
            cycleLength = 0
            ontime = 0
            dc = 0
            return [lteuDetected, cycleLength, ontime, dc]

        if dc <= 0.05:
            # print("---No LTE-U detected")
            lteuDetected = False
            cycleLength = 0
            ontime = 0
            dc = 0
            return [lteuDetected, cycleLength, ontime, dc]

        lteuCycle.fill(-0.5)
        ss = np.int(0)
        ee = np.int(ss + ontime / self.samplingInterval)
        lteuCycle[ss:ee] = 0.5

        ss = np.int(1 * cycleLength / self.samplingInterval)
        ee = np.int(ss + ontime / self.samplingInterval)
        lteuCycle[ss:ee] = 0.5

        ss = np.int(2 * cycleLength / self.samplingInterval)
        ee = np.int(ss + ontime / self.samplingInterval)
        lteuCycle[ss:ee] = 0.5

        ss = np.int(3 * cycleLength / self.samplingInterval)
        ee = np.int(ss + ontime / self.samplingInterval)
        lteuCycle[ss:ee] = 0.5

        maxPossibleCorr = np.correlate(lteuCycle, lteuCycle, mode='same')
        maxPossibleCorr = np.max(maxPossibleCorr)

        maxCorr = np.correlate(lteuCycle, samples, mode='same')
        maxCorr = np.max(maxCorr)

        if maxCorr <= 0.5 * maxPossibleCorr:
            # print("---No LTE-U detected")
            lteuDetected = False
            cycleLength = 0
            ontime = 0
            dc = 0
            return [lteuDetected, cycleLength, ontime, dc]

        # print("---Detected LTE-U Cycle Length [ms]: ", cycleLength)
        # print("---Detected on-time: ", ontime)
        # print("---Detected DC: ", dc)

        return [lteuDetected, cycleLength, ontime, dc]
### LVP ###
in_lvp = []
minlvp, maxlvp = split(lvp, 20)
#lvp_thres =0.5 * (np.max(lvp)- np.min(lvp))+np.min(lvp)
lvp_thres = 0.5 * (
    maxlvp - minlvp) + minlvp  #Conservative min threshold for peak height
print(lvp_thres)
for i in range(3600):
    #peakutils detects peaks using derivatives. So peaks at the ends of the signal cannot be identified. Hence the
    #signal is divided as 0-1001, 1000-2001, 2000-3001, etc. Signal is divided and checked as there are fluctuations
    #and a global min and max cannot set accurate thresholds for peak detection.
    if i != 0:
        lvp_sm = lvp[1000 * i - 1:1000 * (i + 1) + 1]
        #Peaks are found using two criteria: 1. Greater than half of the mid in the sequence, 2. Higher than absolute
        #threshold. Only the peaks fulfilling both criteria are valid peaks
        in_lvp_sm = peakutils.indexes(lvp_sm, thres=0.5, min_dist=200)
        in_lvp_abs = peakutils.indexes(lvp_sm,
                                       thres=lvp_thres,
                                       min_dist=200,
                                       thres_abs=True)
        in_lvp_sm = list(set(in_lvp_sm) & set(in_lvp_abs))
        in_lvp_sm.sort(
        )  #set operations can mess up the order, so sorting is required
        in_lvp_sm_adj = [element + i * 1000 - 1 for element in in_lvp_sm
                         ]  # Setting the absolute peak locations
    else:
        lvp_sm = lvp[1000 * i:1000 * (i + 1) + 1]
        in_lvp_sm = peakutils.indexes(lvp_sm, thres=0.5, min_dist=200)
        in_lvp_abs = peakutils.indexes(lvp_sm,
                                       thres=lvp_thres,
                                       min_dist=200,
def main():

    params = get_params()

    files = glob.glob('%s/*_results.pickle' % directory)

    templates = [
        os.path.basename(filename).replace('_results.pickle', '')
        for filename in files
    ]
    data = []
    for template in templates:
        print 'template', template

        parameters = pickle.load(
            open(os.path.join(directory, '%s_parameters.pickle' % template)))
        results = pickle.load(
            open(os.path.join(directory, '%s_results.pickle' % template)))
        gap = parameters['undulator_gap_encoder_position']
        if gap > 23:
            continue
        #if abs(gap-8.3) > 0.1:
        #continue
        diode = results['calibrated_diode']['observations']
        diode = np.array(diode)

        diode_chronos = diode[:, 0]
        diode_current = diode[:, 1]

        actuator = results['actuator']['observations']
        actuator = np.array(actuator)

        actuator_chronos = actuator[:, 0]
        actuator_position = actuator[:, 1]

        fast_shutter = results['fast_shutter']['observations']
        fast_shutter = np.array(fast_shutter)

        fast_shutter_chronos = fast_shutter[:, 0]
        fast_shutter_state = fast_shutter[:, 1]

        start_end_indices = peakutils.indexes(
            np.abs(np.gradient(fast_shutter_state)))

        start_chronos, end_chronos = fast_shutter_chronos[start_end_indices]

        #dark_current = np.vstack([diode_current[diode_chronos < start_chronos - fast_shutter_chronos_uncertainty], diode_current[diode_chronos > end_chronos + fast_shutter_chronos_uncertainty]]).mean()
        print diode_current.shape
        print diode_chronos.shape
        dark_current = diode_current[diode_chronos < start_chronos -
                                     fast_shutter_chronos_uncertainty].mean()
        diode_current -= dark_current

        actuator_scan_indices = np.logical_and(
            actuator_chronos >
            start_chronos + fast_shutter_chronos_uncertainty * 5,
            actuator_chronos <
            end_chronos - fast_shutter_chronos_uncertainty * 5)
        actuator_scan_chronos = actuator_chronos[actuator_scan_indices]
        actuator_scan_position = actuator_position[actuator_scan_indices]

        position_chronos_fit = np.polyfit(actuator_scan_chronos,
                                          actuator_scan_position, 1)

        position_linear_predictor = np.poly1d(position_chronos_fit)

        diode_scan_indices = np.logical_and(
            diode_chronos >
            start_chronos + fast_shutter_chronos_uncertainty * 5,
            diode_chronos < end_chronos - fast_shutter_chronos_uncertainty * 5)
        diode_scan_chronos = diode_chronos[diode_scan_indices]
        diode_scan_current = diode_current[diode_scan_indices]

        thetas = position_linear_predictor(diode_scan_chronos)
        energies = get_energy_from_theta(thetas, units_energy=eV)

        flux = get_flux(diode_scan_current, energies, params)

        if energies[0] > energies[-1]:
            energies = energies[::-1]
            flux = flux[::-1]

        filtered_flux = medfilt(flux, 5)
        peaks = peakutils.indexes(filtered_flux, min_dist=55, thres=0.012)
        #peaks = peakutils.indexes(flux, min_dist=1, thres=0.02)

        harmonics = np.arange(1, 21)

        theoretic_harmonic_energies = undulator_peak_energy(gap,
                                                            harmonics,
                                                            detune=False)
        print 'theory'
        print theoretic_harmonic_energies
        print 'detected peaks'
        print energies[peaks][::-1]

        print 'distance_matrix'
        thr = [(t, 0) for t in theoretic_harmonic_energies]
        ep = [(e, 0) for e in energies[peaks][::-1]]
        fluxes = flux[peaks][::-1]

        print 'theory'
        print thr
        print 'detected peaks'
        print ep
        dm = distance_matrix(thr, ep)
        print dm.shape
        print np.arange(1, 21)
        print dm.argmin(axis=1)
        print dm.min(axis=1)
        minimums = dm.argmin(axis=0)
        print minimums
        print dm.min(axis=1)

        matches = np.where(dm < 210)

        print 'ep with criteria'
        ep2 = energies[peaks][::-1]
        ep_matched = ep2[matches[1]]
        print 'harmonics with criteria'
        thr_matched = theoretic_harmonic_energies[matches[0]]
        fluxes_matched = fluxes[matches[1]]

        #peak_half_width = 45.

        #from scipy.ndimage import center_of_mass
        #for l, e in enumerate(ep_matched):
        #print 'starting peak position refinement, l, e', l, e
        #shift = peak_half_width
        #k = 0
        #while shift >= 5:
        #k+=1
        #indices = np.logical_and(energies<e+peak_half_width, energies>e-peak_half_width)
        #less_then = np.logical_and(energies<e, energies>e-peak_half_width)
        #more_then = np.logical_and(energies>e, energies<e-peak_half_width)
        #print 'sum(indices) initial', sum(indices)
        #if sum(less_then) > sum(more_then):
        #diff = sum(less_then) - sum(more_then)
        #print 'diff', diff
        #valid = np.where(indices == True)[0]
        #print 'valid', valid
        #indices[valid[:diff]] = False
        #elif sum(less_then) < sum(more_then):
        #diff = -sum(less_then) + sum(more_then)
        #print 'diff', diff
        #valid = np.where(indices == True)[0]
        #print 'valid', valid
        #indices[valid[-diff:]] = False

        #print 'sum(indices)', sum(indices)
        #xp = energies[indices]
        #print 'energies', xp
        #fp = flux[indices]
        #print 'fluxes', fp
        #x = np.linspace(xp[0], xp[-1], 101)
        #f = np.interp(x, xp, fp)
        #com = center_of_mass(f)
        #print 'com', com
        #new_e = x[int(round(com[0]))]
        #print new_e
        #shift = e - new_e
        #print 'k, shift', k, shift
        #e = new_e
        #print 'new_e', new_e
        #ep_matched[l] = new_e
        #print

        matched = np.array(
            zip(matches[0] + 1, thr_matched, ep_matched,
                np.abs(thr_matched - ep_matched), fluxes_matched))
        print matched

        #pylab.vlines(undulator_peak_energy(gap, np.arange(1, 21), detune=True), 0, 1.1*flux.max(), color='cyan', label='theoretic harmonic peak positions')
        #pylab.vlines(theoretic_harmonic_energies, 0, 1.1*flux.max(), color='magenta', label='theoretic harmonic positions')
        pylab.figure()
        for k, thr, ep, diff, flx in matched:
            data.append([gap, int(k), ep, flx])
            pylab.annotate(s='%d' % k,
                           xy=(ep, flx),
                           xytext=(ep + 150, 1.1 * flx),
                           arrowprops=dict(arrowstyle='->',
                                           connectionstyle="arc3"))

        pylab.plot(energies, flux, label='flux')
        #pylab.plot(energies, filtered_flux, label='filtered_flux')
        #pylab.plot(energies[peaks], flux[peaks], 'rx', mew=2, label='peaks')
        pylab.plot(matched[:, 2],
                   matched[:, -1],
                   'rx',
                   mew=2,
                   label='harmonics')
        pylab.xlabel('energy [eV]')
        pylab.ylabel('flux [ph/s]')
        pylab.legend()
        pylab.title('Energy scan, %s mm, undulator U24 Proxima 2A, SOLEIL' %
                    template.replace('_', ' '))

    f = open('data_2017-09-06.pickle', 'w')
    pickle.dump(np.array(data), f)
    f.close()

    pylab.show()
Esempio n. 54
0
def main():

    #declare um objeto da classe da sua biblioteca de apoio (cedida)    
    #declare uma variavel com a frequencia de amostragem, sendo 44100
    signal = signalMeu()
    freqDeAmostragem = 44100
    
    #voce importou a bilioteca sounddevice como, por exemplo, sd. entao
    # os seguintes parametros devem ser setados:
    
    sd.default.samplerate = freqDeAmostragem  #taxa de amostragem
    sd.default.channels = 1  #voce pode ter que alterar isso dependendo da sua placa
    duration = 2 #tempo em segundos que ira aquisitar o sinal acustico captado pelo mic


    # faca um print na tela dizendo que a captacao comecará em n segundos. e entao 
    n = 1
    print("A captaçao comecara em {} segundos ".format(n))
    time.sleep(n)
    #use um time.sleep para a espera
    #faca um print informando que a gravacao foi inicializada
    print("A gravaçao foi inicializada")
   
    #declare uma variavel "duracao" com a duracao em segundos da gravacao. poucos segundos ... 
    numAmostras =  freqDeAmostragem * duration
    #calcule o numero de amostras "numAmostras" que serao feitas (numero de aquisicoes)
   
    audio = sd.rec(int(numAmostras), freqDeAmostragem, channels=1)
    sd.wait()
    print("...     FIM")
    
    
    #analise sua variavel "audio". pode ser um vetor com 1 ou 2 colunas, lista ...
    #grave uma variavel com apenas a parte que interessa (dados)
    dados = []
    for e in audio[:,0]:
        dados.append(e)
        
    # use a funcao linspace e crie o vetor tempo. Um instante correspondente a cada amostra!

    t = np.linspace(0,duration,int(numAmostras))

    #plot do gravico  áudio vs tempo!
    plt.plot(dados,t)
    plt.grid()
    plt.title('audio vs tempo')
    plt.show()
   
    
    ## Calcula e exibe o Fourier do sinal audio. como saida tem-se a amplitude e as frequencias

    xf, yf = signal.calcFFT(dados, freqDeAmostragem)
    plt.figure("F(y)")
    plt.plot(xf,yf)
    plt.grid()
    plt.title('Fourier audio')
    plt.show()
    

    #esta funcao analisa o fourier e encontra os picos
    #voce deve aprender a usa-la. ha como ajustar a sensibilidade, ou seja, o que é um pico?
    #voce deve tambem evitar que dois picos proximos sejam identificados, pois pequenas variacoes na
    #frequencia do sinal podem gerar mais de um pico, e na verdade tempos apenas 1.
   
    #index = peakutils.indexes(,,)
    #printe os picos encontrados! 
    index = peakutils.indexes(yf, thres=0.1, min_dist=50)
    picos = [xf[i] for i in index if xf[i] > 600 and xf[i] < 1800]
    maxi = max(picos, key=int)
    minn = min(picos, key=int)
    delta = 10
    print("Picos : {}  ".format(picos))

    tabela_DTMF = {"1":[1209, 697], "2":[1336, 697], "3":[1477, 697], "A":[1633, 697],
         "4":[1209, 770], "5":[1336, 770], "6":[1477, 770], "B":[1633, 770],
         "7":[1209, 852], "8":[1336, 852], "9":[1477, 852], "C":[1633, 852],
         "X":[1209, 941], "0":[1336, 941], "#":[1477, 941], "D":[1633, 941]}

    if 1209 + delta >= maxi >= 1209 - delta :
        if 697 + delta >= minn >= 697 - delta:     
            print("A tecla encontrada foi a : 1  ")  

    if 1336 + delta >= maxi >= 1336 - delta:
        if 697 + delta >= minn >= 697 - delta:   
            print("A tecla encontrada foi a : 2  ")  

    if 1477 + delta >=  maxi >= 1477 - delta:
        if 697 + delta >= minn >= 697 - delta :   
            print("A tecla encontrada foi a : 3  ")  


    if 1633 + delta >= maxi >= 1633 - delta:
        if 697 + delta >= minn >= 697 - delta :   
            print("A tecla encontrada foi a : A  ")  

    if 1209 + delta >= maxi >= 1209 - delta :
        if 770 + delta >= minn >= 770 - delta :   
            print("A tecla encontrada foi a : 4  ")  

    if 1336 + delta >= maxi >= 1336 - delta :
        if 770 + delta >= minn >= 770 - delta:   
            print("A tecla encontrada foi a : 5  ")    

    if 1477 + delta >= maxi >= 1477 - delta: 
        if 770 + delta >= minn >= 770 - delta:   
            print("A tecla encontrada foi a : 6  ")    

    if 1633 + delta >= maxi >= 1633 - delta:
        if 770 + delta >= minn >= 770 - delta :   
            print("A tecla encontrada foi a : B  ")    

    if 1209 + delta >= maxi >= 1209 - delta:
        if 852 + delta >= minn >= 852 - delta :   
            print("A tecla encontrada foi a : 7  ")

    if 1336 + delta >= maxi >= 1336 - delta:
        if 852 + delta >= minn >= 852 - delta :   
            print("A tecla encontrada foi a : 8  ")

    if 1477 + delta >= maxi >= 1477 - delta :
        if 852 + delta >= minn >= 852 - delta :   
            print("A tecla encontrada foi a : 9  ")    
    if 1633 + delta >= maxi >= 1633 - delta :
        if 852 + delta >= minn >= 852 - delta :   
            print("A tecla encontrada foi a : C  ")    

    
    if 1209 + delta  >= maxi >= 1209 - delta :
        if 941 + delta >= minn >= 941 - delta  :   
            print("A tecla encontrada foi a : X  ")  
    if 1336 + delta  >= maxi >= 1336 - delta:
        if 941 + delta >= minn >= 941 - delta :   
            print("A tecla encontrada foi a : 0  ")        
    if 1477 + delta  >= maxi >= 1477 - delta:
        if 941 + delta >= minn >= 941 - delta  :   
            print("A tecla encontrada foi a : #  ")    
    if 1633 + delta >= maxi >= 1633 - delta:
        if 941 + delta >= minn >= 941 - delta  :   
            print("A tecla encontrada foi a : D  ")    
Esempio n. 55
0
""" peak detector with threshold """

import numpy as np
import matplotlib.dates as mdates
import pandas as pd
from datetime import datetime
import peakutils
from peakutils.plot import plot as pplot
from matplotlib import pyplot

headers = ['ts', 'x', 'y', 'z', 'm']
df = pd.read_csv('bammo_accel.csv', names=headers)

headers = ['ts', 'x', 'y', 'z', 'm']

df['ts'] = df['ts'].map(
    lambda x: datetime.strptime(str(x), '%Y-%m-%d %H:%M:%S.%f'))

x = df['ts']
y = df['m']
indexes = peakutils.indexes(y, thres=0.75, min_dist=30)
xpeak = str(x[indexes]).split()[1] + " " + str(x[indexes]).split()[2]
ypeak = str(y[indexes]).split()[1]

pyplot.figure(figsize=(10, 6))
pplot(x, y, indexes)
pyplot.title("Peak at " + xpeak + " " + ypeak + " Gs " + "max=" + str(y.max()))
pyplot.show()
Esempio n. 56
0
def gaussianFits(fileName, fobs, outLoc, SN):

    data = loadData(fileName, fobs, outLoc)
    x = data.wave[1349:]  #could also write as hAregion[:,0]
    y = data.subSpec[1349:]
    width = 3.0  #know this from experience
    amphB = 0
    ampOIII = 0
    ampOI = 0
    amphA = 0
    ampNII = 0
    ampNII0 = 0
    ampSIIa = 0
    ampSIIb = 0
    xGuessSIIb = 6735

    #may need to make noise smarter soon - this is a test!!
    #NEED TO MAKE NOISE MUCH SMARTER
    noiseX = x[1450:1460]
    noiseY = y[1450:1460]

    noise = np.abs(3 * integrate.simps(noiseY, noiseX))

    #trying to fix the problem with the gaussian fits using peak utils indexes
    #automating guessing heights
    peaks = indexes(
        y, thres=0.3,
        min_dist=4.0)  #these values are somewhat arbitrary right now
    numPeaks1 = 0
    peak1 = [0]
    peakIndices1 = [0]
    numPeaks2 = 0
    peak2 = [0]
    peakIndices2 = [0]
    peakX = x[peaks]
    peakY = y[peaks]
    #buffer = 0
    newRange = len(peakY)
    negRange = len(peakY)
    for height in peakY:
        if height > newRange:
            break
        if peakY[height] < 0:
            np.delete(peakY, height)
            np.delete(peakX, height)
            newRange = newRange - 1
    print(peakX)

    hBisClear = False
    OIIIisClear = False
    OIisClear = False
    hAisClear = False
    NIIisClear = False
    SIIisClear = False
    tooNoisy = False

    Halpha = 0
    NII = 0
    Hbeta = 0
    OIII = 0
    SII = 0
    OI = 0
    doublePeak = 0
    hBnum = 0
    hBsens = []

    for i in range(len(peakX)):
        """if peakX[i] > 6550 and peakX[i] < 6780: #H-alpha, NII, and SII
            numPeaks2 = numPeaks2 + 1
            peak2.append(peakX[i])
            peakIndices2.append(i)"""
        if peakX[i] > 6557 and peakX[i] < 6567:
            numPeaks2 = numPeaks2 + 1
            peak2.append(peakX[i])
            peakIndices2.append(i)
            hAisClear = True
            amphA = peakY[i]
        if peakX[i] > 6577 and peakX[i] < 6587:
            numPeaks2 = numPeaks2 + 1
            peak2.append(peakX[i])
            peakIndices2.append(i)
            NIIisClear = True
            ampNII = peakY[i]
        if peakX[i] > 6710 and peakX[i] < 6740:
            doublePeak = doublePeak + 1
            numPeaks2 = numPeaks2 + 1
            peak2.append(peakX[i])
            peakIndices2.append(i)
            SIIisClear = True
            """if doublePeak==1:
                ampSIIa = peakY[i]
            elif doublePeak==2:
                ampSIIb = peakY[i]
                if np.abs(peakX[i] - xGuessSIIb) >= 2:
                    xGuessSIIb = peakX[i]"""
        if peakX[i] > 6713 and peakX[i] < 6722:
            ampSIIa = peakY[i]
            print('SIIa (' + str(peakX[i]) + ', ' + str(peakY[i]) + ')')
        if peakX[i] > 6727 and peakX[i] < 6733:
            ampSIIb = peakY[i]
            print('SIIb (' + str(peakX[i]) + ', ' + str(peakY[i]) + ')')
        if peakX[i] > 6577 and peakX[i] < 6587:
            numPeaks2 = numPeaks2 + 1
            peak2.append(peakX[i])
            peakIndices2.append(i)
            NIIisClear = True
            ampNII = peakY[i]
        if peakX[i] > 4850 and peakX[i] < 4870:  #H-beta
            numPeaks1 = numPeaks1 + 1
            hBnum = hBnum + 1
            peak1.append(peakX[i])
            peakIndices1.append(i)
            hBisClear = True
            if hBnum >= 1:
                hBsens.append(peakY[i])
                amphB = np.amax(hBsens)
            #amphB = peakY[i]
        if peakX[i] > 5000 and peakX[i] < 5015:  #OIII
            numPeaks1 = numPeaks1 + 1
            peak1.append(peakX[i])
            peakIndices1.append(i)
            OIIIisClear = True
            ampOIII = peakY[i]
        if peakX[i] > 6295 and peakX[i] < 6305:  #OI
            numPeaks1 = numPeaks1 + 1
            peak1.append(peakX[i])
            peakIndices1.append(i)
            OIisClear = True
            ampOI = peakY[i]
    peak2.remove(0)
    peak1.remove(0)
    peakIndices2.remove(0)
    peakIndices1.remove(0)
    print("numPeaks2 = " + str(numPeaks2))
    print("numPeaks1 = " + str(numPeaks1))

    print(peak2)
    print(peak1)

    #note: OI is usually so small, indexes probably won't pick it up
    tooNoisy = False
    """if numPeaks2==5:
        ampNII0 = peakY[peakIndices2[0]]
        amphA = peakY[peakIndices2[1]]
        ampNII = peakY[peakIndices2[2]]
        ampSIIa = peakY[peakIndices2[3]]
        ampSIIb = peakY[peakIndices2[4]]
    elif numPeaks2==4:
        ampNII0 = noise #placeholder because you need to do a triple gaussian fit 
        amphA = peakY[peakIndices2[0]]
        ampNII = peakY[peakIndices2[1]]
        ampSIIa = peakY[peakIndices2[2]]
        ampSIIb = peakY[peakIndices2[3]]
    if numPeaks2 < 3 or numPeaks2 > 9:
        tooNoisy = True
        print("too few peaks detected, check this spectra by hand")
    elif numPeaks2 > 25:
        tooNoisy = True
        print("too many peaks detected, check this spectra by hand")"""
    """if numPeaks1==2:
        amphB = peakY[peakIndices1[0]]
        ampOIII = peakY[peakIndices1[1]]
        ampOI = noise #this is just a place holder for now, means that .indexes couldn't find a peak at OI
    elif numPeaks1==3: #note! need to take care of uncertainties 
        amphB = peakY[peakIndices1[0]]
        ampOIII = peakY[peakIndices1[1]]
        ampOI = peakY[peakIndices1[2]]"""
    if numPeaks1 < 1:  #NOT LESS THAN TWO (gets rid of cases where H-b is visible but not O3, which happens a lot)
        #tooNoisy = True
        print("too few peaks detected, check this spectra by hand")
    #if hAisClear==False: tooNoisy = True
    #if SN < 13: tooNoisy = True
    #if hBisClear==False and OIIIisClear==False: tooNoisy = True

    if tooNoisy == False:
        guesshB = [amphB, 4865, width]
        guessOIII = [ampOIII, 5007, width]
        guessOI = [ampOI, 6300, width]
        guesshA = [amphA, 6563, width]
        guessNII = [ampNII, 6583, width]
        guessSIIa = [ampSIIa, 6716, width]  #6716
        guessSIIb = [ampSIIb, 6731, width]  #6731

        #guesshB = [4.35, 4864, 1]
        #guessOIII = [15, 5007, 3]
        #guessOI = [5, 6300, 3]
        #guesshA = [10, 6563, 3]
        #guessNII = [5, 6583, 3]
        #ampNII0 = 4
        #width = 3
        #guessSIIa = [3.1, 6716, 3] #6716
        #guessSIIb = [2.1, 6735, 1]
        #4.4 and 3.6

        #using the least square function to optimize the paramters for the gaussian fit(the params for the func() function)

        #singular-peak gaussian fits
        optimhB, flag = sp.leastsq(errfunc, guesshB, args=(x, y))
        optimOIII, flag = sp.leastsq(errfunc, guessOIII, args=(x, y))
        optimOI, flag = sp.leastsq(errfunc, guessOI, args=(x, y))

        #multi-peak gaussian fits
        guessSII = [
            guessSIIa[0], guessSIIa[1], guessSIIa[2], guessSIIb[0],
            guessSIIb[1], guessSIIb[2]
        ]
        #guessSII = [35, 6716, 3, 30, 6736, 3]
        optimSII, flag = sp.leastsq(doubleErrFunc, guessSII, args=(x, y))
        ySII = double_gaussian(x, optimSII[0], optimSII[1], optimSII[2],
                               optimSII[3], optimSII[4], optimSII[5])

        #writing H-alpha and NII as a double gaussian rn, un comment when done
        guesshANII = [
            ampNII0, 6548, width, guesshA[0], guesshA[1], guesshA[2],
            guessNII[0], guessNII[1], guessNII[2]
        ]
        guesshANII = [
            4.3, 6551, 1.0, guesshA[0], guesshA[1], guesshA[2], guessNII[0],
            guessNII[1], guessNII[2]
        ]

        optimhANII, flag = sp.leastsq(tripleErrFunc, guesshANII, args=(x, y))
        yhANII = triple_gaussian(x, optimhANII[0], optimhANII[1],
                                 optimhANII[2], optimhANII[3], optimhANII[4],
                                 optimhANII[5], optimhANII[6], optimhANII[7],
                                 optimhANII[8])
        """guesshANII2 = [guesshA[0], guesshA[1], guesshA[2], guessNII[0], guessNII[1], guessNII[2]]
        guesshANII2 = [38.9, 6565, 7, 13.7, 6586, 3]
        optimhANII, flag = sp.leastsq(doubleErrFunc, guesshANII2, args=(x, y))
        yhANII2 = double_gaussian(x, optimhANII[0], optimhANII[1], optimhANII[2], optimhANII[3], optimhANII[4], optimhANII[5])"""

        optimhA, flag = sp.leastsq(errfunc, guesshA, args=(x, y))
        optimNII, flag = sp.leastsq(errfunc, guessNII, args=(x, y))

        #now, calculating y-values and extracting each individual peak from multi-peak fit
        yNII0 = func(x, optimhANII[0], optimhANII[1], optimhANII[2])
        yhA = func(x, optimhANII[3], optimhANII[4], optimhANII[5])
        yNII = func(x, optimhANII[6], optimhANII[7], optimhANII[8])

        #yhA = func(x, optimhANII[0], optimhANII[1], optimhANII[2])
        #yNII = func(x, optimhANII[3], optimhANII[4], optimhANII[5])

        ySIIa = func(x, optimSII[0], optimSII[1], optimSII[2])
        ySIIb = func(x, optimSII[3], optimSII[4], optimSII[5])

        #calculating y values for a gaussian fit using new input paramters optimized above
        yhB = func(x, optimhB[0], optimhB[1], optimhB[2])
        yOIII = func(x, optimOIII[0], optimOIII[1], optimOIII[2])
        yOI = func(x, optimOI[0], optimOI[1], optimOI[2])
        """#comment below out after this run
        yhA = func(x, optimhA[0], optimhA[1], optimhA[2])
        yNII = func(x, optimNII[0], optimNII[1], optimNII[2])"""

        Hbeta = integrate.simps(yhB, x)
        OIII = integrate.simps(yOIII, x)
        OI = integrate.simps(yOI, x)
        Halpha = integrate.simps(yhA, x)
        NII = integrate.simps(yNII, x)
        #SII = integrate.simps(ySIIa, x) + integrate.simps(ySIIb, x) #not sure which of these two it is (are they different?)
        SII = integrate.simps(ySII, x)

        Halpha = integrate.simps(y[1705:1725], x[1705:1725])
        NII = integrate.simps(y[1725:1742], x[1725:1742])
        #SII = integrate.simps(y[3208:3238], x[3208:3238])

        #temporary measure!

        if Hbeta < 0: hBisClear = False
        if OIII < 0: OIIIisClear = False
        if OI < 0: OIisClear = False
        if Halpha < 0: hAisClear = False
        if NII < 0: NIIisClear = False
        if SII < 0: SIIisClear = False

        f = plt.figure(2, figsize=(16, 5))
        plt.clf()
        plt.xlim(4700, 7000)
        plt.grid()
        plt.tight_layout()
        plt.title('Gaussian Fit')

        plt.grid(c='k', linestyle='-', linewidth=1.0, alpha=0.25)
        plt.plot(x, y, c='k', linewidth=0.5)

        plt.plot(x, yhB, c='c', linewidth=0.75)
        plt.plot(x, yOIII, c='y', linewidth=0.75)
        plt.plot(x, yOI, c='m', linewidth=0.75)
        plt.plot(x, yhANII, c='b', lw=0.75)
        #plt.plot(x, yhANII2, c='b', lw=0.75)
        plt.plot(x, yhA, c='g', lw=0.75)
        plt.plot(x, yNII0, c='y', lw=0.75)
        plt.plot(x, yNII, c='g', lw=0.75)
        plt.plot(x, ySII, c='b', lw=0.75)
        plt.plot(x, ySIIa, c='r', lw=0.75)
        plt.plot(x, ySIIb, c='r', lw=0.75)

        f.savefig(outLoc + 'gaussian_fit.png', bbox_inches='tight')
        f.show()
        f.savefig(outLoc + 'gaussian_fit.png', bbox_inches='tight')
        raw_input()

    elif tooNoisy == True:
        print(
            "spectrum is too noisy to analyze automatically, please check by hand"
        )

    elineFluxes = namedtuple(
        'EmLines',
        'hAlpha NII hBeta OIII SII OI noise hAisClear NIIisClear hBisClear OIIIisClear SIIisClear OIisClear tooNoisy'
    )
    emLines = elineFluxes(Halpha, NII, Hbeta, OIII, SII, OI, noise, hAisClear,
                          NIIisClear, hBisClear, OIIIisClear, SIIisClear,
                          OIisClear, tooNoisy)
    return emLines  #potential problem here! maybe it has to return something no matter what!
Esempio n. 57
0
def peak_find(tseries_df,
              temp,
              ion_names,
              peak_threshold=0.05,
              min_dist=50,
              smth=False):
    """
    This function takes a pandas DataFrame containing desorption time series, along with a time series of Figaero
        heater temperatures. For each series (i.e., column in the DataFrame), the maximum value is found. For this,
        peakutils package is used. To ensure that a global maximum is found, parameters [peak_threshold] and [min_dist]
        may need to be optimized. However, the default values of 0.05 and 50 have been tested on desorption time series
        from several experiments, and no problems have been detected as of yet. Smaller min_dist may be needed to
        capture secondary TMax (TMax2) values.

    :param tseries_df: (DataFrame) pandas DataFrame with time series organized as the columns. Index should be
    :param temp: (float/int) Figaero desorption temperatures as recorded by EyeOn data, or other temperature logger.
    :param ion_names: (string) String names of ions to correspond to the time series in tseries_df (same order)
    :param peak_threshold: (float) Normalized peak threshold from 0. - 1.0.  Should be careful when using this in
            this DataFrame oriented function.  If some peaks are not found on some time series, it will not return
            the correct size dataframe and will throw an error because of passed-implied shape exception. Default value
            of 0.05 (or 5%) has been tested with figaero data from multiple experiments with no errors detected.
    :param min_dist: (int) The minimum distance of points between two peaks that will be identified. This is sensitive
            to the index resolution (e.g., time or temperature) of the input data in [tseries_df].
    :param smth: (bool) If true, time series are smoothed before finding the max values in the time series. NOT
            RECOMMENDED if the time series have already been smoothed before.
    :return: df_tmax: a pandas DataFrame of 5 columns with Tmax1, MaxSig1, Tmax2, MaxSig2, DubFlag (double peak flag)
    """
    # Check types of passed arguments to prevent errors during subsequent processing
    _check.check_dfs(values=[tseries_df])
    _check.check_num_equal(
        val1=tseries_df.shape[0],
        val2=len(temp))  # Number of datapoints must be equal
    _check.check_string(values=ion_names)
    _check.check_threshold(values=[peak_threshold],
                           thresh=1.0000001,
                           how='under')
    _check.check_threshold(values=[peak_threshold], thresh=0.0, how='over')
    _check.check_int(values=[min_dist])
    _check.check_bool(values=[smth])

    for i in range(0, len(tseries_df.columns)):
        # Process each ion's time series sequentially
        ion_tseries = tseries_df.values[:, i]

        if smth:
            ion_tseries = smooth(ion_tseries, window='hamming', window_len=11)

        # Find indices of peaks using peakutils.indexes (see code in libs/site-packages/peakutils).
        max_indices = peakutils.indexes(ion_tseries,
                                        thres=peak_threshold,
                                        min_dist=min_dist)
        # 2. The first two most prominent peaks are used to capture the major thermal behavior of the thermograms.
        dub_flag = 0
        npeaks = len(max_indices)
        # print('# of peaks for %s:' % tseries_df.columns[i], npeaks)                    # Debug line/optional output
        if npeaks == 0:
            # Optional output
            # print('No peaks above threshold found for ion %s. Assigning NaN to Tmax values.' % tseries_df.columns[i])
            if i == 0:
                TMax1 = []
                TMax2 = []
                MaxSig1 = []
                MaxSig2 = []
                DubFlag = []
                # give nan values to first ion since there are no peaks detected
            TMax1.append(np.nan)
            MaxSig1.append(np.nan)
            TMax2.append(np.nan)
            MaxSig2.append(np.nan)
            DubFlag.append(-1)
            # print('TMax1 for 0 peak ion now = ', TMax1[i])
        else:
            for j in max_indices:
                # print('j in max indices at count %.0f:' % dub_flag, j)        # debug line
                if i == 0:
                    if dub_flag == 0:
                        # Create Tmax/Tseries on very first pass (First element in max_indices for first ion)
                        TMax1 = [np.nan]
                        TMax2 = [np.nan]
                        MaxSig1 = [np.nan]
                        MaxSig2 = [np.nan]
                        DubFlag = [np.nan]
                        # Assign very first value
                        TMax1[i] = temp[j]
                        MaxSig1[i] = ion_tseries[j]
                        # print('first Tmax/SigMax assigned for ion', ion_names[i])
                        # print('Tmax =', TMax1, 'and MaxSig1 =', MaxSig1, '\n')
                        if npeaks == 1:
                            TMax2[i] = np.nan
                            TMax2[i] = np.nan
                            DubFlag[i] = 0
                    elif dub_flag == 1:
                        TMax2[i] = temp[j]
                        MaxSig2[i] = ion_tseries[j]
                        DubFlag[i] = 1
                    else:
                        pass
                    dub_flag += 1
                else:
                    if dub_flag == 0:
                        TMax1.append(temp[j])
                        MaxSig1.append(ion_tseries[j])
                        if npeaks == 1:
                            TMax2.append(np.nan)
                            MaxSig2.append(np.nan)
                            DubFlag.append(0)
                    elif dub_flag == 1:
                        TMax2.append(temp[j])
                        MaxSig2.append(ion_tseries[j])
                        DubFlag.append(1)
                    else:
                        pass
                    dub_flag += 1
    df_tmax = pd.DataFrame(data={
        'TMax1': TMax1,
        'MaxSig1': MaxSig1,
        'TMax2': TMax2,
        'MaxSig2': MaxSig2,
        'DubFlag': DubFlag
    },
                           index=tseries_df.columns.values)
    df_tmax.index.name = "Molecule"

    return df_tmax
Esempio n. 58
0
    temp = []
    # for all channel of sensor
    for channel in n_channel_data_near_leak:
        denoised_signal = dwt_smoothing(x=channel, wavelet=dwt_wavelet, level=dwt_smooth_level)
        temp.append(denoised_signal)
    n_channel_data_near_leak = np.array(temp)


# PEAK DETECTION AND ROI -----------------------------------------------------------------------------------------------

time_start = time.time()

# detect peak by segments, to avoid affects by super peaks
peak_ch0, peak_ch1, peak_ch2, peak_ch3 = [], [], [], []
for seg, count in zip(n_channel_split, [0, 1]):
    peak_ch0.append([(x + (count*2500000)) for x in peakutils.indexes(seg[0], thres=0.5, min_dist=1500)])
    peak_ch1.append([(x + (count*2500000)) for x in peakutils.indexes(seg[1], thres=0.6, min_dist=5000)])
    peak_ch2.append([(x + (count*2500000)) for x in peakutils.indexes(seg[2], thres=0.6, min_dist=5000)])
    peak_ch3.append([(x + (count*2500000)) for x in peakutils.indexes(seg[3], thres=0.5, min_dist=1500)])

# convert list of list into single list
peak_ch0 = [i for sublist in peak_ch0 for i in sublist]
peak_ch1 = [i for sublist in peak_ch1 for i in sublist]
peak_ch2 = [i for sublist in peak_ch2 for i in sublist]
peak_ch3 = [i for sublist in peak_ch3 for i in sublist]
peak_list = [peak_ch0, peak_ch1, peak_ch2, peak_ch3]

# USING peakutils
# peak_list = []
# time_start = time.time()
# # channel 0
Esempio n. 59
0
 def test_near_peaks2(self):
     out = peakutils.indexes(self.near, thres=0, min_dist=1)
     expected = numpy.array([1, 3, 5, 7, 9])
     assert_array_almost_equal(out, expected)
Esempio n. 60
0
plt.show()

# What is the standard deviation of the noise
stdnoise = np.std(betterinoise)

#betteri_rect = np.absolute(betteri)
#plt.plot(s,betteri_rect)
#plt.show()

smoothi = signal.hilbert(betteri)
plt.figure(figsize=(10, 6))  #zoom in
plt.plot(s, smoothi, label='smoothened')

#Find the peaks using the peakutils library functions
indexes = peakutils.indexes(betteri,
                            thres=6 * stdnoise,
                            min_dist=100,
                            thres_abs=True)  #set 4*STD as an ABSOLUTE min

# Find peaks(max).
peak_indexes = signal.argrelextrema(betteri, np.greater)
peak_indexes = peak_indexes[0]

# Find valleys(min).
valley_indexes = signal.argrelextrema(betteri, np.less)
valley_indexes = valley_indexes[0]

#the plot with detected peaks
plt.figure(figsize=(10, 6))  #zoom in
pplot(s, betteri, indexes)
plt.title('Peak Identification')