Spaces:
Sleeping
Sleeping
Update the new electrode mapping & Plot text label. - 1213
Browse files- app.py +47 -15
- data-processing.ipynb +0 -0
- emg-data-processing.ipynb +0 -0
- test-new/0-New_Task-recording-0.csv +0 -0
- test-new/time_marker.csv +13 -0
app.py
CHANGED
|
@@ -50,11 +50,37 @@ def emg_plot(event_index, event_plot_name, left_std_ratio, left_delta_t, right_s
|
|
| 50 |
# Add horizontal and vertical lines to create quadrants
|
| 51 |
plt.axhline(y=0, color='black', linestyle='--')
|
| 52 |
plt.axvline(x=0, color='black', linestyle='--')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
|
| 54 |
# Add title and axis labels
|
| 55 |
plt.title(f'Muscle Coordination Analysis - {event_index}:{event_plot_name}', fontsize=14)
|
| 56 |
-
plt.xlabel('Std Ratio > 3', fontsize=12)
|
| 57 |
-
plt.ylabel('Delta T > 0', fontsize=12)
|
| 58 |
|
| 59 |
# Remove axis numbers and labels
|
| 60 |
ax.set_xticks([])
|
|
@@ -63,7 +89,7 @@ def emg_plot(event_index, event_plot_name, left_std_ratio, left_delta_t, right_s
|
|
| 63 |
ax.set_yticklabels([])
|
| 64 |
|
| 65 |
# Set plot legend with color
|
| 66 |
-
plt.legend(['Left', 'Right'], loc='upper left', fontsize=10)
|
| 67 |
|
| 68 |
# Set the limits of the plot
|
| 69 |
plt.xlim(-10, 10)
|
|
@@ -103,8 +129,8 @@ def main():
|
|
| 103 |
|
| 104 |
# Load test data button
|
| 105 |
if st.button('Load Test Data', type="primary"):
|
| 106 |
-
st.session_state.emg_data = pd.read_csv('test-
|
| 107 |
-
st.session_state.time_marker = pd.read_csv('test-
|
| 108 |
st.success("Test data loaded successfully!")
|
| 109 |
st.session_state.data_isready = True
|
| 110 |
|
|
@@ -129,11 +155,11 @@ def main():
|
|
| 129 |
# Reset emg data index with Channels
|
| 130 |
emg_data = st.session_state.emg_data.set_index('Channels')
|
| 131 |
# Get signal data from difference of emg_data
|
| 132 |
-
signal_left_lateral = emg_data['
|
| 133 |
-
signal_left_medial = emg_data['
|
| 134 |
|
| 135 |
-
signal_right_lateral = emg_data['
|
| 136 |
-
signal_right_medial = emg_data['
|
| 137 |
|
| 138 |
# RMS caculation : Define the moving average window size
|
| 139 |
N = 25
|
|
@@ -149,13 +175,13 @@ def main():
|
|
| 149 |
signal_right_medial_RMS = moving_rms(signal_right_medial, N)
|
| 150 |
|
| 151 |
# Time Marker Processing
|
| 152 |
-
time_marker = st.session_state.time_marker[['0-New_Task-recording_time(us)', '
|
| 153 |
time_marker = time_marker.rename(columns={'0-New_Task-recording_time(us)': 'event_time'})
|
| 154 |
|
| 155 |
# Select column value with odd/even index
|
| 156 |
event_start_times = time_marker.loc[0::2]['event_time'].values.astype(int)
|
| 157 |
event_end_times = time_marker.loc[1::2]['event_time'].values.astype(int)
|
| 158 |
-
event_names = time_marker.loc[0::2]['
|
| 159 |
|
| 160 |
# Get signal basic 10s std
|
| 161 |
signal_left_lateral_basics_10s_std = signal_left_lateral_RMS.loc[: 10000000].std()
|
|
@@ -173,11 +199,17 @@ def main():
|
|
| 173 |
st.write(f"Start time: {float(event_start_time)/1000000: .3f} sec, End time: {float(event_end_time)/1000000: .3f} sec")
|
| 174 |
|
| 175 |
# Get event signal data with event time duration
|
| 176 |
-
|
| 177 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 178 |
|
| 179 |
-
|
| 180 |
-
event_signal_RM = signal_right_medial_RMS.
|
| 181 |
|
| 182 |
# Calculate std ratio
|
| 183 |
left_event_std = event_signal_LL.std()
|
|
|
|
| 50 |
# Add horizontal and vertical lines to create quadrants
|
| 51 |
plt.axhline(y=0, color='black', linestyle='--')
|
| 52 |
plt.axvline(x=0, color='black', linestyle='--')
|
| 53 |
+
|
| 54 |
+
# Add quadrant labels
|
| 55 |
+
# Add styled text labels with colored box
|
| 56 |
+
def add_styled_text(x, y, text, va='bottom'):
|
| 57 |
+
# Create text box style
|
| 58 |
+
bbox_props = dict(
|
| 59 |
+
boxstyle='round,pad=0.5',
|
| 60 |
+
fc='#1f77b4', # 背景顏色(白色)
|
| 61 |
+
ec='#1f77b4', # 邊框顏色(藍色)
|
| 62 |
+
alpha=0.7, # 背景透明度
|
| 63 |
+
lw=1.5 # 邊框寬度
|
| 64 |
+
)
|
| 65 |
+
|
| 66 |
+
plt.text(x, y, text,
|
| 67 |
+
horizontalalignment='center',
|
| 68 |
+
verticalalignment=va,
|
| 69 |
+
bbox=bbox_props,
|
| 70 |
+
color='white',
|
| 71 |
+
fontweight='semibold',
|
| 72 |
+
fontsize=9)
|
| 73 |
+
|
| 74 |
+
# Add styled quadrant labels
|
| 75 |
+
add_styled_text(4, 0.5, "Exertion + / Coordination -", 'bottom')
|
| 76 |
+
add_styled_text(-4, 0.5, "Exertion - / Coordination -", 'bottom')
|
| 77 |
+
add_styled_text(-4, -0.5, "Exertion - / Coordination +", 'top')
|
| 78 |
+
add_styled_text(4, -0.5, "Exertion + / Coordination +", 'top')
|
| 79 |
|
| 80 |
# Add title and axis labels
|
| 81 |
plt.title(f'Muscle Coordination Analysis - {event_index}:{event_plot_name}', fontsize=14)
|
| 82 |
+
plt.xlabel('Exertion (Std Ratio > 3)', fontsize=12, fontweight='semibold')
|
| 83 |
+
plt.ylabel('Coordination (Delta T > 0)', fontsize=12, fontweight='semibold')
|
| 84 |
|
| 85 |
# Remove axis numbers and labels
|
| 86 |
ax.set_xticks([])
|
|
|
|
| 89 |
ax.set_yticklabels([])
|
| 90 |
|
| 91 |
# Set plot legend with color
|
| 92 |
+
plt.legend(['Left Swallowing Muscle', 'Right Swallowing Muscle'], loc='upper left', fontsize=10)
|
| 93 |
|
| 94 |
# Set the limits of the plot
|
| 95 |
plt.xlim(-10, 10)
|
|
|
|
| 129 |
|
| 130 |
# Load test data button
|
| 131 |
if st.button('Load Test Data', type="primary"):
|
| 132 |
+
st.session_state.emg_data = pd.read_csv('test-new/0-New_Task-recording-0.csv', skiprows=[0,1,3,4])
|
| 133 |
+
st.session_state.time_marker = pd.read_csv('test-new/time_marker.csv')
|
| 134 |
st.success("Test data loaded successfully!")
|
| 135 |
st.session_state.data_isready = True
|
| 136 |
|
|
|
|
| 155 |
# Reset emg data index with Channels
|
| 156 |
emg_data = st.session_state.emg_data.set_index('Channels')
|
| 157 |
# Get signal data from difference of emg_data
|
| 158 |
+
signal_left_lateral = emg_data['17'] - emg_data['18']
|
| 159 |
+
signal_left_medial = emg_data['19'] - emg_data['20']
|
| 160 |
|
| 161 |
+
signal_right_lateral = emg_data['23'] - emg_data['24']
|
| 162 |
+
signal_right_medial = emg_data['21'] - emg_data['22']
|
| 163 |
|
| 164 |
# RMS caculation : Define the moving average window size
|
| 165 |
N = 25
|
|
|
|
| 175 |
signal_right_medial_RMS = moving_rms(signal_right_medial, N)
|
| 176 |
|
| 177 |
# Time Marker Processing
|
| 178 |
+
time_marker = st.session_state.time_marker[['0-New_Task-recording_time(us)', 'description', 'tag']]
|
| 179 |
time_marker = time_marker.rename(columns={'0-New_Task-recording_time(us)': 'event_time'})
|
| 180 |
|
| 181 |
# Select column value with odd/even index
|
| 182 |
event_start_times = time_marker.loc[0::2]['event_time'].values.astype(int)
|
| 183 |
event_end_times = time_marker.loc[1::2]['event_time'].values.astype(int)
|
| 184 |
+
event_names = time_marker.loc[0::2]['description'].values
|
| 185 |
|
| 186 |
# Get signal basic 10s std
|
| 187 |
signal_left_lateral_basics_10s_std = signal_left_lateral_RMS.loc[: 10000000].std()
|
|
|
|
| 199 |
st.write(f"Start time: {float(event_start_time)/1000000: .3f} sec, End time: {float(event_end_time)/1000000: .3f} sec")
|
| 200 |
|
| 201 |
# Get event signal data with event time duration
|
| 202 |
+
mask_LL = (signal_left_lateral_RMS.index >= event_start_time) & (signal_left_lateral_RMS.index <= event_end_time)
|
| 203 |
+
event_signal_LL = signal_left_lateral_RMS.iloc[mask_LL]
|
| 204 |
+
|
| 205 |
+
mask_LM = (signal_left_medial_RMS.index >= event_start_time) & (signal_left_medial_RMS.index <= event_end_time)
|
| 206 |
+
event_signal_LM = signal_left_medial_RMS.iloc[mask_LM]
|
| 207 |
+
|
| 208 |
+
mask_RL = (signal_right_lateral_RMS.index >= event_start_time) & (signal_right_lateral_RMS.index <= event_end_time)
|
| 209 |
+
event_signal_RL = signal_right_lateral_RMS.iloc[mask_RL]
|
| 210 |
|
| 211 |
+
mask_RM = (signal_right_medial_RMS.index >= event_start_time) & (signal_right_medial_RMS.index <= event_end_time)
|
| 212 |
+
event_signal_RM = signal_right_medial_RMS.iloc[mask_RM]
|
| 213 |
|
| 214 |
# Calculate std ratio
|
| 215 |
left_event_std = event_signal_LL.std()
|
data-processing.ipynb
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
emg-data-processing.ipynb
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
test-new/0-New_Task-recording-0.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
test-new/time_marker.csv
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Abs_time(us),0-New_Task-recording_time(us),topic,type,name,uuid,signal,description,color,order,tag
|
| 2 |
+
1733899760533486.0,78357902.0,keyboard/c,keyboard,Keyboard,260efabb-3944-448b-88b4-1eef7de020dd,c,Cough,#baeea0,0,start
|
| 3 |
+
1733899761846583.0,79670999.0,keyboard/c,keyboard,Keyboard,60fe4089-f190-4a34-9b49-7b6392f2dcb9,c,Cough,#baeea0,0,end
|
| 4 |
+
1733899763403073.0,81227489.0,keyboard/b,keyboard,Keyboard,cb091860-8a06-460d-927d-c2006fa0d764,b,Bite,#fae2a3,1,start
|
| 5 |
+
1733899764640907.0,82465323.0,keyboard/b,keyboard,Keyboard,72c6fbd9-8c83-48de-a89e-426636805944,b,Bite,#fae2a3,1,end
|
| 6 |
+
1733899766415311.0,84239727.0,keyboard/s,keyboard,Keyboard,8fa85742-77ec-475c-a6dc-0fd4a986c943,s,Swallow,#fab6b6,2,start
|
| 7 |
+
1733899767609930.0,85434346.0,keyboard/s,keyboard,Keyboard,8005446f-862c-446b-bc7e-7c428efc1f7a,s,Swallow,#fab6b6,2,end
|
| 8 |
+
1733899768804131.0,86628547.0,keyboard/s,keyboard,Keyboard,8fa85742-77ec-475c-a6dc-0fd4a986c943,s,Swallow,#fab6b6,3,start
|
| 9 |
+
1733899770127418.0,87951834.0,keyboard/s,keyboard,Keyboard,8005446f-862c-446b-bc7e-7c428efc1f7a,s,Swallow,#fab6b6,3,end
|
| 10 |
+
1733899771849409.0,89673825.0,keyboard/s,keyboard,Keyboard,8fa85742-77ec-475c-a6dc-0fd4a986c943,s,Swallow,#fab6b6,4,start
|
| 11 |
+
1733899773334247.0,91158663.0,keyboard/s,keyboard,Keyboard,8005446f-862c-446b-bc7e-7c428efc1f7a,s,Swallow,#fab6b6,4,end
|
| 12 |
+
1733899774433363.0,92257779.0,keyboard/c,keyboard,Keyboard,260efabb-3944-448b-88b4-1eef7de020dd,c,Cough,#baeea0,5,start
|
| 13 |
+
1733899775890252.0,93714668.0,keyboard/c,keyboard,Keyboard,60fe4089-f190-4a34-9b49-7b6392f2dcb9,c,Cough,#baeea0,5,end
|