diff --git "a/data-processing.ipynb" "b/data-processing.ipynb"
new file mode 100644--- /dev/null
+++ "b/data-processing.ipynb"
@@ -0,0 +1,1145 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "2.0.3\n"
+ ]
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "print(pd.__version__)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# loading emg data & time marker from test-1 folder\n",
+ "emg_data_path = 'test-1/0-New_Task-recording-0.csv'\n",
+ "time_marker_path = 'test-1/time_marker.csv'\n",
+ "\n",
+ "emg_data = pd.read_csv(emg_data_path, skiprows=[0,1,3,4])\n",
+ "time_marker = pd.read_csv(time_marker_path)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### EMG data Processing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " 1 | \n",
+ " 2 | \n",
+ " 3 | \n",
+ " 4 | \n",
+ " 5 | \n",
+ " 6 | \n",
+ " 7 | \n",
+ " 8 | \n",
+ " 9 | \n",
+ " 10 | \n",
+ " ... | \n",
+ " 13 | \n",
+ " 14 | \n",
+ " 15 | \n",
+ " 16 | \n",
+ " 17 | \n",
+ " 18 | \n",
+ " 19 | \n",
+ " 20 | \n",
+ " 21 | \n",
+ " 22 | \n",
+ "
\n",
+ " \n",
+ " Channels | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 24 | \n",
+ " 18 | \n",
+ " 28 | \n",
+ " -12 | \n",
+ " 17 | \n",
+ " 29 | \n",
+ " -14 | \n",
+ " 2 | \n",
+ " 42 | \n",
+ " -16 | \n",
+ " ... | \n",
+ " -2 | \n",
+ " 42 | \n",
+ " 76 | \n",
+ " -48 | \n",
+ " 1 | \n",
+ " -145 | \n",
+ " 33 | \n",
+ " 60 | \n",
+ " -97 | \n",
+ " -87 | \n",
+ "
\n",
+ " \n",
+ " 2202 | \n",
+ " 51 | \n",
+ " 7 | \n",
+ " 81 | \n",
+ " -47 | \n",
+ " 3 | \n",
+ " 63 | \n",
+ " 47 | \n",
+ " -31 | \n",
+ " 22 | \n",
+ " -24 | \n",
+ " ... | \n",
+ " -13 | \n",
+ " 9 | \n",
+ " 117 | \n",
+ " 4 | \n",
+ " 34 | \n",
+ " -156 | \n",
+ " 81 | \n",
+ " 13 | \n",
+ " -172 | \n",
+ " -93 | \n",
+ "
\n",
+ " \n",
+ " 4404 | \n",
+ " 56 | \n",
+ " -2 | \n",
+ " 86 | \n",
+ " -53 | \n",
+ " -21 | \n",
+ " 39 | \n",
+ " 56 | \n",
+ " -45 | \n",
+ " 0 | \n",
+ " -27 | \n",
+ " ... | \n",
+ " -35 | \n",
+ " -11 | \n",
+ " 119 | \n",
+ " 14 | \n",
+ " 20 | \n",
+ " -188 | \n",
+ " 52 | \n",
+ " -78 | \n",
+ " -219 | \n",
+ " -121 | \n",
+ "
\n",
+ " \n",
+ " 6606 | \n",
+ " 35 | \n",
+ " 0 | \n",
+ " 55 | \n",
+ " -46 | \n",
+ " -7 | \n",
+ " 5 | \n",
+ " 25 | \n",
+ " -39 | \n",
+ " 6 | \n",
+ " -16 | \n",
+ " ... | \n",
+ " -42 | \n",
+ " -26 | \n",
+ " 84 | \n",
+ " -14 | \n",
+ " -13 | \n",
+ " -195 | \n",
+ " 21 | \n",
+ " -39 | \n",
+ " -218 | \n",
+ " -114 | \n",
+ "
\n",
+ " \n",
+ " 8808 | \n",
+ " 3 | \n",
+ " 29 | \n",
+ " 23 | \n",
+ " -46 | \n",
+ " -7 | \n",
+ " -21 | \n",
+ " -36 | \n",
+ " -1 | \n",
+ " 8 | \n",
+ " -19 | \n",
+ " ... | \n",
+ " -36 | \n",
+ " -9 | \n",
+ " 70 | \n",
+ " -18 | \n",
+ " 0 | \n",
+ " -182 | \n",
+ " -19 | \n",
+ " -25 | \n",
+ " -150 | \n",
+ " -104 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 92534528 | \n",
+ " 397 | \n",
+ " -1928 | \n",
+ " -91 | \n",
+ " -7 | \n",
+ " -5 | \n",
+ " 319 | \n",
+ " 54 | \n",
+ " -893 | \n",
+ " 135 | \n",
+ " -639 | \n",
+ " ... | \n",
+ " 254 | \n",
+ " 70 | \n",
+ " 119 | \n",
+ " 20 | \n",
+ " 209 | \n",
+ " 203 | \n",
+ " 200 | \n",
+ " -2388 | \n",
+ " -217 | \n",
+ " 134 | \n",
+ "
\n",
+ " \n",
+ " 92536730 | \n",
+ " 354 | \n",
+ " -1996 | \n",
+ " -121 | \n",
+ " -183 | \n",
+ " 7 | \n",
+ " 262 | \n",
+ " 15 | \n",
+ " -1008 | \n",
+ " 111 | \n",
+ " -611 | \n",
+ " ... | \n",
+ " 248 | \n",
+ " 67 | \n",
+ " 90 | \n",
+ " -21 | \n",
+ " 172 | \n",
+ " 125 | \n",
+ " 144 | \n",
+ " -2357 | \n",
+ " -487 | \n",
+ " 112 | \n",
+ "
\n",
+ " \n",
+ " 92538932 | \n",
+ " 282 | \n",
+ " -2043 | \n",
+ " -184 | \n",
+ " -336 | \n",
+ " 2 | \n",
+ " 184 | \n",
+ " -75 | \n",
+ " -1088 | \n",
+ " 1 | \n",
+ " -573 | \n",
+ " ... | \n",
+ " 218 | \n",
+ " 30 | \n",
+ " 46 | \n",
+ " -62 | \n",
+ " 132 | \n",
+ " 186 | \n",
+ " 102 | \n",
+ " -2320 | \n",
+ " -598 | \n",
+ " 16 | \n",
+ "
\n",
+ " \n",
+ " 92541134 | \n",
+ " 217 | \n",
+ " -2065 | \n",
+ " -212 | \n",
+ " -461 | \n",
+ " -5 | \n",
+ " 161 | \n",
+ " -97 | \n",
+ " -1148 | \n",
+ " -58 | \n",
+ " -540 | \n",
+ " ... | \n",
+ " 85 | \n",
+ " -27 | \n",
+ " -67 | \n",
+ " -145 | \n",
+ " 27 | \n",
+ " 204 | \n",
+ " 22 | \n",
+ " -2275 | \n",
+ " -701 | \n",
+ " -12 | \n",
+ "
\n",
+ " \n",
+ " 92543336 | \n",
+ " 153 | \n",
+ " -2087 | \n",
+ " -240 | \n",
+ " -587 | \n",
+ " -12 | \n",
+ " 139 | \n",
+ " -120 | \n",
+ " -1209 | \n",
+ " -117 | \n",
+ " -507 | \n",
+ " ... | \n",
+ " -48 | \n",
+ " -84 | \n",
+ " -180 | \n",
+ " -228 | \n",
+ " -78 | \n",
+ " 222 | \n",
+ " -57 | \n",
+ " -2230 | \n",
+ " -805 | \n",
+ " -41 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
41854 rows × 22 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " 1 2 3 4 5 6 7 8 9 10 ... 13 14 \\\n",
+ "Channels ... \n",
+ "0 24 18 28 -12 17 29 -14 2 42 -16 ... -2 42 \n",
+ "2202 51 7 81 -47 3 63 47 -31 22 -24 ... -13 9 \n",
+ "4404 56 -2 86 -53 -21 39 56 -45 0 -27 ... -35 -11 \n",
+ "6606 35 0 55 -46 -7 5 25 -39 6 -16 ... -42 -26 \n",
+ "8808 3 29 23 -46 -7 -21 -36 -1 8 -19 ... -36 -9 \n",
+ "... ... ... ... ... .. ... ... ... ... ... ... ... .. \n",
+ "92534528 397 -1928 -91 -7 -5 319 54 -893 135 -639 ... 254 70 \n",
+ "92536730 354 -1996 -121 -183 7 262 15 -1008 111 -611 ... 248 67 \n",
+ "92538932 282 -2043 -184 -336 2 184 -75 -1088 1 -573 ... 218 30 \n",
+ "92541134 217 -2065 -212 -461 -5 161 -97 -1148 -58 -540 ... 85 -27 \n",
+ "92543336 153 -2087 -240 -587 -12 139 -120 -1209 -117 -507 ... -48 -84 \n",
+ "\n",
+ " 15 16 17 18 19 20 21 22 \n",
+ "Channels \n",
+ "0 76 -48 1 -145 33 60 -97 -87 \n",
+ "2202 117 4 34 -156 81 13 -172 -93 \n",
+ "4404 119 14 20 -188 52 -78 -219 -121 \n",
+ "6606 84 -14 -13 -195 21 -39 -218 -114 \n",
+ "8808 70 -18 0 -182 -19 -25 -150 -104 \n",
+ "... ... ... ... ... ... ... ... ... \n",
+ "92534528 119 20 209 203 200 -2388 -217 134 \n",
+ "92536730 90 -21 172 125 144 -2357 -487 112 \n",
+ "92538932 46 -62 132 186 102 -2320 -598 16 \n",
+ "92541134 -67 -145 27 204 22 -2275 -701 -12 \n",
+ "92543336 -180 -228 -78 222 -57 -2230 -805 -41 \n",
+ "\n",
+ "[41854 rows x 22 columns]"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Reset emg data index with Channels\n",
+ "emg_data = emg_data.set_index('Channels')\n",
+ "emg_data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Index: 41854 entries, 0 to 92543336\n",
+ "Data columns (total 22 columns):\n",
+ " # Column Non-Null Count Dtype\n",
+ "--- ------ -------------- -----\n",
+ " 0 1 41854 non-null int64\n",
+ " 1 2 41854 non-null int64\n",
+ " 2 3 41854 non-null int64\n",
+ " 3 4 41854 non-null int64\n",
+ " 4 5 41854 non-null int64\n",
+ " 5 6 41854 non-null int64\n",
+ " 6 7 41854 non-null int64\n",
+ " 7 8 41854 non-null int64\n",
+ " 8 9 41854 non-null int64\n",
+ " 9 10 41854 non-null int64\n",
+ " 10 11 41854 non-null int64\n",
+ " 11 12 41854 non-null int64\n",
+ " 12 13 41854 non-null int64\n",
+ " 13 14 41854 non-null int64\n",
+ " 14 15 41854 non-null int64\n",
+ " 15 16 41854 non-null int64\n",
+ " 16 17 41854 non-null int64\n",
+ " 17 18 41854 non-null int64\n",
+ " 18 19 41854 non-null int64\n",
+ " 19 20 41854 non-null int64\n",
+ " 20 21 41854 non-null int64\n",
+ " 21 22 41854 non-null int64\n",
+ "dtypes: int64(22)\n",
+ "memory usage: 7.3 MB\n"
+ ]
+ }
+ ],
+ "source": [
+ "emg_data.info()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Get signal data from difference of emg_data\n",
+ "signal_left_lateral = emg_data['21'] - emg_data['3']\n",
+ "signal_left_medial = emg_data['22'] - emg_data['2']\n",
+ "\n",
+ "signal_right_lateral = emg_data['16'] - emg_data['6']\n",
+ "signal_right_medial = emg_data['17'] - emg_data['5']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Mean of RMS Signal 1: 442.605, Std Dev of RMS Signal 1: 628.329\n",
+ "Mean of RMS Signal 2: 366.791, Std Dev of RMS Signal 2: 681.991\n",
+ "Mean of RMS Signal 3: 135.842, Std Dev of RMS Signal 3: 212.442\n",
+ "Mean of RMS Signal 4: 206.513, Std Dev of RMS Signal 4: 403.897\n"
+ ]
+ }
+ ],
+ "source": [
+ "# RMS caculation\n",
+ "\n",
+ "# Define the moving average window size\n",
+ "N = 25\n",
+ "\n",
+ "# Function to calculate moving RMS\n",
+ "def moving_rms(signal, window_size):\n",
+ " rms = np.sqrt(pd.Series(signal).rolling(window=window_size).mean()**2)\n",
+ " rms.index = signal.index # Ensure the index matches the original signal\n",
+ " return rms\n",
+ "\n",
+ "# Calculate moving RMS for each channel\n",
+ "signal_left_lateral_RMS = moving_rms(signal_left_lateral, N)\n",
+ "signal_left_medial_RMS = moving_rms(signal_left_medial, N)\n",
+ "signal_right_lateral_RMS = moving_rms(signal_right_lateral, N)\n",
+ "signal_right_medial_RMS = moving_rms(signal_right_medial, N)\n",
+ "\n",
+ "# Calculate mean and standard deviation of the RMS signals\n",
+ "mean_ch1_rms = np.mean(signal_left_lateral_RMS)\n",
+ "std_ch1_rms = np.std(signal_left_lateral_RMS)\n",
+ "\n",
+ "mean_ch2_rms = np.mean(signal_left_medial_RMS)\n",
+ "std_ch2_rms = np.std(signal_left_medial_RMS)\n",
+ "\n",
+ "mean_ch3_rms = np.mean(signal_right_lateral_RMS)\n",
+ "std_ch3_rms = np.std(signal_right_lateral_RMS)\n",
+ "\n",
+ "mean_ch4_rms = np.mean(signal_right_medial_RMS)\n",
+ "std_ch4_rms = np.std(signal_right_medial_RMS)\n",
+ "\n",
+ "# Print mean and standard deviation values\n",
+ "print(f'Mean of RMS Signal 1: {mean_ch1_rms: .3f}, Std Dev of RMS Signal 1: {std_ch1_rms: .3f}')\n",
+ "print(f'Mean of RMS Signal 2: {mean_ch2_rms: .3f}, Std Dev of RMS Signal 2: {std_ch2_rms: .3f}')\n",
+ "print(f'Mean of RMS Signal 3: {mean_ch3_rms: .3f}, Std Dev of RMS Signal 3: {std_ch3_rms: .3f}')\n",
+ "print(f'Mean of RMS Signal 4: {mean_ch4_rms: .3f}, Std Dev of RMS Signal 4: {std_ch4_rms: .3f}')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Channels\n",
+ "0 NaN\n",
+ "2202 NaN\n",
+ "4404 NaN\n",
+ "6606 NaN\n",
+ "8808 NaN\n",
+ "11010 NaN\n",
+ "13212 NaN\n",
+ "15414 NaN\n",
+ "17616 NaN\n",
+ "19818 NaN\n",
+ "22020 NaN\n",
+ "24222 NaN\n",
+ "26424 NaN\n",
+ "28626 NaN\n",
+ "30828 NaN\n",
+ "33030 NaN\n",
+ "35232 NaN\n",
+ "37434 NaN\n",
+ "39636 NaN\n",
+ "41838 NaN\n",
+ "44040 NaN\n",
+ "46242 NaN\n",
+ "48444 NaN\n",
+ "50646 NaN\n",
+ "52848 254.96\n",
+ "55050 259.68\n",
+ "57252 261.56\n",
+ "59454 256.00\n",
+ "61656 248.76\n",
+ "63858 243.28\n",
+ "dtype: float64"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "signal_left_lateral_RMS.head(30)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "131.65497112394493"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.mean(signal_left_lateral_RMS.loc[:10000000])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "101.73584628144596"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.std(signal_left_lateral_RMS.loc[:10000000])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "101.7471471252777"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "signal_left_lateral_RMS.loc[:10000000].std()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Time Marker Processing"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " event_time | \n",
+ " name | \n",
+ " tag | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 32030195.0 | \n",
+ " bite | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 56294235.0 | \n",
+ " bite | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 60284534.0 | \n",
+ " swallow | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 62478843.0 | \n",
+ " swallow | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 67892676.0 | \n",
+ " swallow | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " 69216432.0 | \n",
+ " swallow | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " 71896644.0 | \n",
+ " swallow | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " 73034917.0 | \n",
+ " swallow | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " 77098837.0 | \n",
+ " cough | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " 79341557.0 | \n",
+ " cough | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " 82717865.0 | \n",
+ " cough | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " 83992269.0 | \n",
+ " cough | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " 86344529.0 | \n",
+ " cough | \n",
+ " start | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " 88152623.0 | \n",
+ " cough | \n",
+ " end | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " event_time name tag\n",
+ "0 32030195.0 bite start\n",
+ "1 56294235.0 bite end\n",
+ "2 60284534.0 swallow start\n",
+ "3 62478843.0 swallow end\n",
+ "4 67892676.0 swallow start\n",
+ "5 69216432.0 swallow end\n",
+ "6 71896644.0 swallow start\n",
+ "7 73034917.0 swallow end\n",
+ "8 77098837.0 cough start\n",
+ "9 79341557.0 cough end\n",
+ "10 82717865.0 cough start\n",
+ "11 83992269.0 cough end\n",
+ "12 86344529.0 cough start\n",
+ "13 88152623.0 cough end"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "time_marker = pd.read_csv(time_marker_path)\n",
+ "time_marker = time_marker[['0-New_Task-recording_time(us)', 'name', 'tag']]\n",
+ "time_marker = time_marker.rename(columns={'0-New_Task-recording_time(us)': 'event_time'})\n",
+ "time_marker"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Select column value with odd/even index\n",
+ "event_start_times = time_marker.loc[0::2]['event_time'].values.astype(int)\n",
+ "event_end_times = time_marker.loc[1::2]['event_time'].values.astype(int)\n",
+ "event_names = time_marker.loc[0::2]['name'].values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "signal LL basic 10s std : 101.747\n",
+ "signal RL basic 10s std : 14.723\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Get signal basic 10s std\n",
+ "signal_left_lateral_basics_10s_std = signal_left_lateral_RMS.loc[: 10000000].std()\n",
+ "print(f\"signal LL basic 10s std : {signal_left_lateral_basics_10s_std: .3f}\")\n",
+ "\n",
+ "signal_right_lateral_basics_10s_std = signal_right_lateral_RMS.loc[: 10000000].std()\n",
+ "print(f\"signal RL basic 10s std : {signal_right_lateral_basics_10s_std: .3f}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "def emg_plot(event_index, event_plot_name, left_std_ratio, left_delta_t, right_std_ratio, right_delta_t):\n",
+ " \"\"\"\n",
+ " Plots a 2D quadrant chart for EMG signal analysis with colored squares indicating the quadrant.\n",
+ "\n",
+ " Parameters:\n",
+ " std (float): Standard deviation value of the EMG signal.\n",
+ " delta_t (float): Delta T value of the EMG signal.\n",
+ " \"\"\"\n",
+ " # Create a new figure\n",
+ " fig, ax = plt.subplots(figsize=(8, 8))\n",
+ "\n",
+ " # Determine the quadrant and plot the colored square\n",
+ " if left_std_ratio > 3 and left_delta_t > 0:\n",
+ " # First quadrant\n",
+ " ax.add_patch(plt.Rectangle((2, 2), 6, 6, color='blue', alpha=0.5))\n",
+ " elif left_std_ratio <= 3 and left_delta_t > 0:\n",
+ " # Second quadrant\n",
+ " ax.add_patch(plt.Rectangle((-8, 2), 6, 6, color='blue', alpha=0.5))\n",
+ " elif left_std_ratio <= 3 and left_delta_t <= 0:\n",
+ " # Third quadrant\n",
+ " ax.add_patch(plt.Rectangle((-8, -8), 6, 6, color='blue', alpha=0.5))\n",
+ " elif left_std_ratio > 3 and left_delta_t <= 0:\n",
+ " # Fourth quadrant\n",
+ " ax.add_patch(plt.Rectangle((2, -8), 6, 6, color='blue', alpha=0.5))\n",
+ " \n",
+ " # Determine the quadrant and plot the colored square\n",
+ " if right_std_ratio > 3 and right_delta_t > 0:\n",
+ " # First quadrant\n",
+ " ax.add_patch(plt.Rectangle((1.5, 1.5), 6, 6, color='green', alpha=0.5))\n",
+ " elif right_std_ratio <= 3 and right_delta_t > 0:\n",
+ " # Second quadrant\n",
+ " ax.add_patch(plt.Rectangle((-8.5, 1.5), 6, 6, color='green', alpha=0.5))\n",
+ " elif right_std_ratio <= 3 and right_delta_t <= 0:\n",
+ " # Third quadrant\n",
+ " ax.add_patch(plt.Rectangle((-8.5, -8.5), 6, 6, color='green', alpha=0.5))\n",
+ " elif right_std_ratio > 3 and right_delta_t <= 0:\n",
+ " # Fourth quadrant\n",
+ " ax.add_patch(plt.Rectangle((1.5, -8.5), 6, 6, color='green', alpha=0.5))\n",
+ "\n",
+ " # Add horizontal and vertical lines to create quadrants\n",
+ " plt.axhline(y=0, color='black', linestyle='--')\n",
+ " plt.axvline(x=0, color='black', linestyle='--')\n",
+ "\n",
+ " # Add title and axis labels\n",
+ " plt.title(f'Muscle Coordination Analysis - {event_index}:{event_plot_name}', fontsize=14)\n",
+ " plt.xlabel('Std Ratio > 3', fontsize=12)\n",
+ " plt.ylabel('Delta T > 0', fontsize=12)\n",
+ "\n",
+ " # Remove axis numbers and labels\n",
+ " ax.set_xticks([])\n",
+ " ax.set_yticks([])\n",
+ " ax.set_xticklabels([])\n",
+ " ax.set_yticklabels([])\n",
+ " \n",
+ " # Set plot legend with color\n",
+ " plt.legend(['Left', 'Right'], loc='upper left', fontsize=10)\n",
+ "\n",
+ " # Set the limits of the plot\n",
+ " plt.xlim(-10, 10)\n",
+ " plt.ylim(-10, 10)\n",
+ "\n",
+ " # Display the plot\n",
+ " plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Event 1: bite\n",
+ "Start time: 32.030 sec, End time: 56.294 sec\n",
+ "left std ratio: 6.765, right std ratio: 18.278\n",
+ "LM_max_index: 51.882, LL_max_index: 51.882, left delta t: 0.000\n",
+ "RM_max_index: 51.900, RL_max_index: 52.496, right delta t: -0.596\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAKnCAYAAAA4Id0/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABODklEQVR4nO3deXgUVd728buT7qTTnUUgICCQoCKyqWBYRCSJGxhUXNiVISAjjqio4P4o8viCDq84og6OgyzKAAIqoICgj4LLDEJQQJFNEUR2gpBAOnvq/YM3/RCykKQqqST9/VxXLsuq012/bprmzjlV5zgMwzAEAAAAVFKQ3QUAAACgdiNQAgAAwBQCJQAAAEwhUAIAAMAUAiUAAABMIVACAADAFAIlAAAATCFQAgAAwBQCJQAAAEwhUAIWWbNmjRwOh55//nm7S6kVSnu/YmNjFRsba0tNpUlOTpbD4dCePXvsLqXGmj17thwOh2bPnl3l56qrf9eef/55ORwOrVmzptyPcTgcSkhIqLKagPIiUMJ2e/bskcPhkMPh0AUXXKD8/PwS2/3444/+dpdeemk1V1lz+Hw+TZ06VYmJiWrYsKFcLpfq16+vHj166KWXXtLRo0ftLrHWqc4wZLUvvvjC//di2bJldpcTkF5//XUNHz5cl112mZxOZ4VDodX4BQh2cNpdAFDI6XTqwIEDWrVqlZKSkoodnzFjhpxOp/Ly8myormbYvHmz+vbtq99++00xMTG69dZbdf755ys9PV3ffvutnnrqKb344os6cOCAvF6v3eVWyueff253CcW8+OKLevLJJ3XBBRfYXUoxM2fOlHS6p2rGjBm6+eabba6o6nXp0kXbtm1TdHS03aVIkh566CFJUpMmTdSwYUMdOnSo2s69bds2eTyeajsfUBoCJWqM7t27a/PmzZo5c2axQJmTk6O5c+cqKSlJH330kU0V2mvfvn268cYblZqaqilTpmjMmDEKDg4u0mbjxo164IEHlJuba1OV5l100UV2l1BMkyZN1KRJE7vLKObEiRP68MMP1aVLF7ndbi1btkyHDx/W+eefb3dpVcrj8dSoUYply5bpyiuvVOPGjXXffffprbfeqrZz16T3AYGNIW/UGGFhYRo4cKA+/vhjpaamFjn20UcfKTU1VcOHDy/xsWUN8ZR2XdIHH3yg+Ph4NWrUSG63W82bN1fv3r21ZMmSYs/xww8/6O6771azZs0UGhqqJk2aqHfv3vr444/L9dqOHDmiRx55RBdffLFCQ0MVHR2tO++8U1u2bCnX4yXpmWee0ZEjR/T000/r0UcfLRYmJaljx4768ssvFRkZWWT/smXLlJiYqKioKIWFhemKK67Qq6++WurlBeVtX3i5QnJysrZv36477rhD0dHRRf4sMjMz9eSTT6p58+Zyu91q3769pk+fXurrLOkayjP/DBcuXKhOnTopLCxMTZo00UMPPaTMzMwi7XNycvT666+rV69eat68uUJDQ9WoUSPdcccd2rhxY5G2ycnJ/s/V8OHD/cPHDoejSJvSPl/vvPOOunXrpvDwcIWHh6tbt2565513irU787q/77//Xr169VJERISioqJ0++23V2p4ct68ecrMzNTQoUP1pz/9SXl5eXr33XdLbHvma5g2bZratGkjt9utmJgYTZgwQQUFBUXap6Wl6a9//avi4+PVtGlThYSEqGnTpvrTn/6kXbt2nbO2kydPKiIiQu3atSvxeH5+vpo2baqGDRsqJydHkpSVlaUpU6bo8ssvV1RUlMLDw3XRRRdp8ODB+vHHH/2PLe0ayp9//lnDhw9Xy5Yt5Xa7FR0drU6dOmns2LHnrNeMPn36qHHjxpY+5/Tp09WuXTu53W61aNFCTz31lLKysoq1O/saytjYWP/nr2XLlv7P8tnXWe7evVsjR45UixYt/N9pycnJ+u233yx9HQgcBErUKCNGjPD3Rp5p5syZatSokWXDeW+++ab69eunn3/+WbfffrseffRRXX/99fr999+LBcrFixerS5cuWrhwobp27aqxY8eqT58+2r9/v2bMmHHOc+3atUtXXnmlpk6dqosvvlgPPvigkpKStHLlSnXr1k3r1q0753P4fD699957CgsL07hx48ps63Q6FRT0v3+1p06dqltuuUU//PCDhgwZotGjRyszM1OPPPKIBgwYIMMwijy+ou0l6ZdfflG3bt10+PBhDRs2TMnJyQoJCVFBQYFuvfVW/fWvf1W9evU0ZswYdevWTY888oimTJlyztd9tr///e8aMWKE2rRpo7/85S+qV6+eXn/9dY0cObJIuz/++EMPP/ywsrOzlZSUpEceeUQJCQlasWKFunfvrpSUFH/b2267TX379pUk9e3bV+PHj/f/nMsjjzyi5ORk7du3T/fcc49Gjhyp/fv3Kzk5WY8++miJj9mwYYOuueYaOZ1OjRo1SnFxcVqyZImuv/76EgNDWWbMmCGXy6VBgwapf//+CgsLO+dn8rHHHtP48ePVrVs3jRo1StLpwP7ss88Wabdt2zY999xzCgsL0+23366HH35YcXFxmjdvnrp06XLO4BEREaHBgwdr69at+s9//lPs+PLly3Xw4EENGzZMISEhkqRhw4b5P9/Dhw/X6NGj1aVLF61evVrfffddmec7cOCAunTporlz5+qKK67Qww8/rEGDBqlhw4Z6/fXXy3xsdSv8Bam0m4qmTJmiRx99VFdddZXGjBmjqKgovfTSS7rttttK/Pt3pocffliXX365JGnMmDH+z3JycrK/zbp169SxY0e98847iouL05gxY3TNNddo7ty56tKli3799VerXioCiQHYbPfu3YYko1evXoZhGEa7du2Myy67zH983759RnBwsDF27FjDMAxDktG6desizzFs2DBDkrF79+5izz9+/HhDkrF69Wr/vk6dOhkhISHGkSNHirVPTU31bx8+fNgIDw83vF6v8f333xdr+/vvv/u3V69ebUgyxo8fX6RN9+7dDafTaXz66adF9u/YscOIiIgwOnToUOx5z7ZmzRpDktGjR49ztj3Trl27DKfTaTRq1MjYu3evf392drYRHx9vSDLmzJlT6faFf3aSjGeffbbY+WfNmmVIMnr37m3k5eX59//www9GSEhIie9XTEyMERMTU2Rf4Z9hVFSUsX37dv9+n89nXHLJJYbD4TD279/v35+VlWXs27evWD1btmwxwsPDjeuvv77EOmfNmlXsMYZR8ufrq6++MiQZbdq0MU6cOOHff+LECePSSy81JBlff/21f3/h50OS8d577xV5/qFDhxqSjPnz55d4/pJs3LjRkGTceuut/n2DBw82JBnffPNNqa+hZcuWxoEDB/z7jx49apx33nlGRESEkZ2dXeR1HDt2rNjzfPHFF0ZQUJAxcuTIIvtLeg9TUlIMScbw4cOLPc+tt95qSDK2bdvmP5/D4TDi4uKKfFYMwzDy8vKM48eP+/+/pL9rr732miHJmDp1arFzHT16tNi+qjJq1Khi3zdnK/w8n/3ZL9zvdruNLVu2+Pfn5uYaN9xwgyHJePfdd4s8RpIRHx9fZF9Z34c5OTlGbGysERERYWzatKnIsa+//toIDg42br755nK9VuBM9FCixhk+fLh++OEHf4/E7NmzlZ+frxEjRlh6HpfLJZfLVWx/gwYN/NvvvPOOTp06pbFjx6pjx47F2jZr1qzMc2zcuFH/+c9/NGzYMN1www1Fjl1yySX685//rB9//PGcQ9+FF/mf63xnmzt3rvLy8jR27Fg1b97cvz8kJEQvvfSSJBW5s7mi7Qs1btxY//Vf/1Vsf+Hw68SJE4sM0Xfo0EFDhw6t0GuRTve4tG7d2v//YWFhGjx4sAzDKNKDFRoaWuINNO3atVNiYqK++uor09eZFr4Pzz//vKKiovz7o6Ki/L2bJb1XPXv21MCBA4vsK/xsn9lzei6FPZFnvo9/+tOfihwrybPPPlvketDo6Gj17dtXJ0+e1I4dO4q8jvr16xd7fGJiotq1a6f/+Z//OWeNcXFx6tSpkxYuXKiTJ0/69x86dEgrVqxQjx49/NcAOhwOGYah0NDQYpdzBAcH67zzzjvn+aTTn4mz1ZSbdwo98MAD2rZtmx544IESjw8dOrTIpQJOp1OTJk2SpBIvp6iIZcuWac+ePXr88cf9PZmFevToob59+2rFihVKT083dR4EHm7KQY0zdOhQPfXUU5o5c6auvPJKzZ49W127dlXbtm0tO8eAAQP05JNPqn379ho0aJASEhLUo0ePYv9orV+/XpJ04403Vuo83377raTT/4CWNLy1fft2/3/bt29fqXOUpfB6wZLmqevWrZvCwsK0adOmSrcvdPnll/uHLc+0efNmeTwederUqdixa665plyXDJyppOcpDNknTpwosn/Tpk2aPHmyvvnmGx06dKhYgExNTTV1o01Z71XhvpLeq4q8htJkZ2dr7ty5Ou+883TLLbf4999www1q0qSJFi5cqNdee03h4eGmzr9mzRq9+uqrWrdunVJTU4vMsFDSn3dJRo0apVGjRmn+/Pm69957JZ0O2nl5eUUuVYiMjFTv3r21cuVKderUSf369dM111yjrl27lutcN998s5588kmNHj1an332mXr37q0ePXrokksuKVedmzZtKna5S2xsbJGhYqtER0eXGXKvueaaYvvi4uJK/ftXEYXfSdu3by/xO+nQoUMqKCjQzp07FRcXZ+pcCCwEStQ4jRo1UlJSkubPn69bb71Vv/zyyzmvG6yoxx9/XA0aNNA//vEPvfLK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eFnB/q677tJjjz2mOXPm6MUXXyxxNoNzefDBB/Xggw+qY8eO6tevn/Ly8vTZZ5/JMAxdfvnlFb5sYNSoUf5rKEvqndy/f7+6du2qdu3aqVOnTrrgggt07NgxLV26VLm5uXr88cfLfP65c+dq2rRpSkhI0MUXX6zIyEht3bpVK1asUHR0tOWzRJzppZde8t9gV9jz99JLL/l/wR05cqR69Ojhb//GG29owoQJGj9+fIk3xlx//fXq1q2bBg0apPr162vFihXasmWLevXqVa6/f9dee61efvlljRo1Sv3795fX61WLFi00ZMgQhYaG6v3339dNN92k+Ph4XXfddf4bAvfu3auvv/5aDRo08L8eoNzsnLMIMIzi81Cei0qYh9IwDOPXX381+vbta0RERBher9e47rrrjJSUlBLnoZw2bZpx6623GjExMYbb7TYaNGhgdO3a1XjrrbeM3NzcYs+9ceNGY8CAAcb5559vuFwuo0mTJsZNN91kLFu2zN+mtHkoDcMw/vjjD+O//uu/jPbt2xthYWFGeHi40apVK2PIkCHGhx9+WK7XXSgjI8N49dVXjfj4eCM6OtpwOp3GeeedZ1x11VXG//k//6fIPJqFli5dasTHxxsRERFGaGio0aFDB2PKlCklvtaKtC/8sxs2bFiZ9T7++OPGBRdcYISGhhpt27Y13nrrrVLfr7LmoSxpbr/S5pB8//33jU6dOhkej8eIjo42BgwYYOzatavUOfqWL19udO7c2QgLC/PPF1morHn9Zs6caXTu3NnweDyGx+MxOnfubMycObNYu7I+H+V5Hw3DMFauXGlIMq677roy2xmGYdx5552GJOODDz4452so6f0tKCgw/vGPfxjt2rUz3G630bhxY+Oee+4xDh8+7J+T9Eznmsvz5MmThsvlMjwej5GWllbs+PHjx43nn3/e6Nmzp9GkSRMjJCTEaNq0qdG7d29j1apVRdqW9F5+++23xqhRo4z27dsb5513nhEWFma0atXKeOihh4rMqVoVCt+P0n7Ofk/ONQ/l6tWrjbfeesto27atERoaajRr1sx48sknDZ/PV+zcKmEeSsMwjMmTJxutWrUyXC5XiW327dtnjBkzxmjVqpURGhpqREZGGm3atDFGjhxpfP755ybfEQQih2GcY9p9AABMWr9+vbp27arhw4dr5syZdpcDwGJcQwkA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",
+ "text/plain": [
+ "