|
1
|
|
|
"""This module contains a function to determine the peaks in the specified dataset, |
|
2
|
|
|
based on the y values (or current values). The function takes in the specified |
|
3
|
|
|
y column of the dataframe and outputs a list consisting of the index values of |
|
4
|
|
|
the peaks. This module calls the peakutils and numpy packages along with the |
|
5
|
|
|
'main.py' file in the master branch.""" |
|
6
|
|
|
|
|
7
|
|
|
import peakutils |
|
8
|
|
|
import numpy as np |
|
9
|
|
|
import core |
|
10
|
|
|
|
|
11
|
|
|
|
|
12
|
|
View Code Duplication |
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
|
|
|
|