def find_peaks(self, min_peak_height=0.3, min_peak_distance=0.05, max_num_peaks=None, exclude_lt_edge=0.0, exclude_rt_edge=0.0): """Find the peaks (maximums) of the profile using a simple maximum value search. Returns ------- peak_vals : numpy.array, numpy.array The peak values and the peak indices. See Also -------- common_functions.peak_detect : Further parameter info """ peak_vals, peak_idxs = peak_detect(self.y_values, self.x_values, min_peak_height, min_peak_distance, max_num_peaks, exclude_lt_edge, exclude_rt_edge) self.peaks = [Point(value=peak_val, idx=peak_idx) for peak_idx, peak_val in zip(peak_idxs, peak_vals)] return self._return_extrema_val_as_list('peak'), self._return_extrema_idx_as_list('peak')
def find_valleys(self, min_peak_height=0.3, min_peak_distance=10, max_num_peaks=None, exclude_lt_edge=0.0, exclude_rt_edge=0.0): """Find the valleys (minimums) of the profile using a simple minimum value search. Returns ------- numpy.array, numpy.array Two arrays are returned: The valley values and the valley indices. See Also -------- common_functions.peak_detect : Further parameter info """ valley_vals, valley_idxs = peak_detect(self.y_values, self.x_values, min_peak_height, min_peak_distance, max_num_peaks, exclude_lt_edge, exclude_rt_edge, find_min_instead=True) self.valleys = [Point(value=valley_val, idx=valley_idx) for valley_idx, valley_val in zip(valley_idxs, valley_vals)] return self._return_extrema_val_as_list('valley'), self._return_extrema_idx_as_list('valley')
def _get_initial_peak(self, initial_peak, exclusion_region=0.1): """Determine an initial peak to use as a rough guideline. Parameters ---------- exclusion_region : float The ratio of the profile to exclude from either side of the profile when searching for the initial peak. Must be between 0 and 1. """ # if not passed, get one by peak searching. if initial_peak is None: while True: _, initial_peak_arr = peak_detect(self.y_values, self.x_values, max_num_peaks=1, exclude_lt_edge=exclusion_region, exclude_rt_edge=exclusion_region) try: initial_peak = initial_peak_arr[0] break except IndexError: exclusion_region -= 0.01 if exclusion_region < 0: raise ValueError("A reasonable initial peak was not found in the profile. Ensure peak is not at profile edge") # otherwise use the one passed. else: while True: # ensure peak is within the x_data region and not near an edge peak_near_left_edge = initial_peak < self.x_values[int(exclusion_region * len(self.x_values))] peak_near_right_edge = initial_peak > self.x_values[int((1-exclusion_region) * len(self.x_values))] if peak_near_left_edge or peak_near_right_edge: exclusion_region -= 0.01 else: break if exclusion_region < 0: raise IndexError("Initial peak that was passed was not reasonably within the profile x_data range") initial_peak = np.where(self.x_values == initial_peak)[0] return int(initial_peak)