| @@ 12-65 (lines=54) @@ | ||
| 9 | import core |
|
| 10 | ||
| 11 | ||
| 12 | def peak_detection_fxn(data_y): |
|
| 13 | """The function takes an input of the column containing the y variables in the dataframe, |
|
| 14 | associated with the current. The function calls the split function, which splits the |
|
| 15 | column into two arrays, one of the positive and one of the negative values. |
|
| 16 | This is because cyclic voltammetry delivers negative peaks, but the peakutils function works |
|
| 17 | better with positive peaks. The function also runs on the middle 80% of data to eliminate |
|
| 18 | unnecessary noise and messy values associated with pseudo-peaks.The vectors are then imported |
|
| 19 | into the peakutils.indexes function to determine the significant peak for each array. |
|
| 20 | The values are stored in a list, with the first index corresponding to the top peak and the |
|
| 21 | second corresponding to the bottom peak. |
|
| 22 | Parameters |
|
| 23 | ______________ |
|
| 24 | y column: must be a column from a pandas dataframe |
|
| 25 | Returns |
|
| 26 | _____________ |
|
| 27 | A list with the index of the peaks from the top curve and bottom curve. |
|
| 28 | """ |
|
| 29 | ||
| 30 | # initialize storage list |
|
| 31 | index_list = [] |
|
| 32 | ||
| 33 | # split data into above and below the baseline |
|
| 34 | col_y1, col_y2 = core.split(data_y) |
|
| 35 | ||
| 36 | # detemine length of data and what 10% of the data is |
|
| 37 | len_y = len(col_y1) |
|
| 38 | ten_percent = int(np.around(0.1*len_y)) |
|
| 39 | ||
| 40 | # adjust both input columns to be the middle 80% of data |
|
| 41 | # (take of the first and last 10% of data) |
|
| 42 | # this avoid detecting peaks from electrolysis |
|
| 43 | # (from water splitting and not the molecule itself, |
|
| 44 | # which can form random "peaks") |
|
| 45 | mod_col_y2 = col_y2[ten_percent:len_y-ten_percent] |
|
| 46 | mod_col_y1 = col_y1[ten_percent:len_y-ten_percent] |
|
| 47 | ||
| 48 | # run peakutils package to detect the peaks for both top and bottom |
|
| 49 | peak_top = peakutils.indexes(mod_col_y2, thres=0.99, min_dist=20) |
|
| 50 | peak_bottom = peakutils.indexes(abs(mod_col_y1), thres=0.99, min_dist=20) |
|
| 51 | ||
| 52 | # detemine length of both halves of data |
|
| 53 | len_top = len(peak_top) |
|
| 54 | len_bot = len(peak_bottom) |
|
| 55 | ||
| 56 | # append the values to the storage list |
|
| 57 | # manipulate values by adding the ten_percent value back |
|
| 58 | # (as the indecies have moved) |
|
| 59 | # to detect the actual peaks and not the modified values |
|
| 60 | index_list.append(peak_top[int(len_top/2)]+ten_percent) |
|
| 61 | index_list.append(peak_bottom[int(len_bot/2)]+ten_percent) |
|
| 62 | ||
| 63 | # return storage list |
|
| 64 | # first value is the top, second value is the bottom |
|
| 65 | return index_list |
|
| 66 | ||
| @@ 12-65 (lines=54) @@ | ||
| 9 | import main |
|
| 10 | ||
| 11 | ||
| 12 | def peak_detection_fxn(data_y): |
|
| 13 | """The function takes an input of the column containing the y variables in the dataframe, |
|
| 14 | associated with the current. The function calls the split function, which splits the |
|
| 15 | column into two arrays, one of the positive and one of the negative values. |
|
| 16 | This is because cyclic voltammetry delivers negative peaks, but the peakutils function works |
|
| 17 | better with positive peaks. The function also runs on the middle 80% of data to eliminate |
|
| 18 | unnecessary noise and messy values associated with pseudo-peaks.The vectors are then imported |
|
| 19 | into the peakutils.indexes function to determine the significant peak for each array. |
|
| 20 | The values are stored in a list, with the first index corresponding to the top peak and the |
|
| 21 | second corresponding to the bottom peak. |
|
| 22 | Parameters |
|
| 23 | ______________ |
|
| 24 | y column: must be a column from a pandas dataframe |
|
| 25 | Returns |
|
| 26 | _____________ |
|
| 27 | A list with the index of the peaks from the top curve and bottom curve. |
|
| 28 | """ |
|
| 29 | ||
| 30 | # initialize storage list |
|
| 31 | index_list = [] |
|
| 32 | ||
| 33 | # split data into above and below the baseline |
|
| 34 | col_y1, col_y2 = main.split(data_y) |
|
| 35 | ||
| 36 | # detemine length of data and what 10% of the data is |
|
| 37 | len_y = len(col_y1) |
|
| 38 | ten_percent = int(np.around(0.1*len_y)) |
|
| 39 | ||
| 40 | # adjust both input columns to be the middle 80% of data |
|
| 41 | # (take of the first and last 10% of data) |
|
| 42 | # this avoid detecting peaks from electrolysis |
|
| 43 | # (from water splitting and not the molecule itself, |
|
| 44 | # which can form random "peaks") |
|
| 45 | mod_col_y2 = col_y2[ten_percent:len_y-ten_percent] |
|
| 46 | mod_col_y1 = col_y1[ten_percent:len_y-ten_percent] |
|
| 47 | ||
| 48 | # run peakutils package to detect the peaks for both top and bottom |
|
| 49 | peak_top = peakutils.indexes(mod_col_y2, thres=0.99, min_dist=20) |
|
| 50 | peak_bottom = peakutils.indexes(abs(mod_col_y1), thres=0.99, min_dist=20) |
|
| 51 | ||
| 52 | # detemine length of both halves of data |
|
| 53 | len_top = len(peak_top) |
|
| 54 | len_bot = len(peak_bottom) |
|
| 55 | ||
| 56 | # append the values to the storage list |
|
| 57 | # manipulate values by adding the ten_percent value back |
|
| 58 | # (as the indecies have moved) |
|
| 59 | # to detect the actual peaks and not the modified values |
|
| 60 | index_list.append(peak_top[int(len_top/2)]+ten_percent) |
|
| 61 | index_list.append(peak_bottom[int(len_bot/2)]+ten_percent) |
|
| 62 | ||
| 63 | # return storage list |
|
| 64 | # first value is the top, second value is the bottom |
|
| 65 | return index_list |
|