829 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			829 lines
		
	
	
		
			47 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import List
 | |
| from numpy.core.arrayprint import IntegerFormat
 | |
| from numpy.lib import math
 | |
| import pandas as pd
 | |
| from pathlib import Path
 | |
| import numpy as np
 | |
| from pandas.core.frame import DataFrame
 | |
| import sys
 | |
| sys.path.insert(0, '/Users/Markus/Prosjekter git/Slovakia 2021/python_speech_features/python_speech_features')
 | |
| from python_speech_features.python_speech_features import mfcc
 | |
| import json
 | |
| 
 | |
| 
 | |
| # Global variables for MFCC
 | |
| MFCC_STEPSIZE = 0.5     # Seconds
 | |
| MFCC_WINDOWSIZE = 2     # Seconds
 | |
| NR_COEFFICIENTS = 13    # Number of coefficients
 | |
| NR_MEL_BINS = 40     # Number of mel-filter-bins 
 | |
| 
 | |
| class Data_container:
 | |
|     
 | |
|     # Initiates personal data container for each subject. Dict for each session with keys 'left' and 'right',
 | |
|     # and values equal to lists of EMG data indexed 0-7
 | |
|     # NB! More sessions has to be added here in the future   
 | |
|     def __init__(self, subject_nr:int, subject_name:str):
 | |
|         self.subject_nr = subject_nr
 | |
|         self.subject_name = subject_name
 | |
|         self.data_dict_round1 = {'left': [None]*8, 'right': [None]*8}
 | |
|         self.data_dict_round2 = {'left': [None]*8, 'right': [None]*8}
 | |
|         self.data_dict_round3 = {'left': [None]*8, 'right': [None]*8}
 | |
|         self.data_dict_round4 = {'left': [None]*8, 'right': [None]*8}
 | |
|         self.dict_list =   [self.data_dict_round1, 
 | |
|                             self.data_dict_round2, 
 | |
|                             self.data_dict_round3, 
 | |
|                             self.data_dict_round4
 | |
|                             ]
 | |
| 
 | |
| 
 | |
| class CSV_handler:
 | |
| 
 | |
|     # Initiates object to store all datapoints in the experiment
 | |
|     def __init__(self):
 | |
|         self.working_dir = str(Path.cwd()) 
 | |
|         self.data_container_dict = {}   # Dict with keys equal subject numbers and values equal to its respective datacontainer
 | |
|         self.data_type = None   # String describing which type of data is stored in the object
 | |
| 
 | |
|     # Makes dataframe from the csv files in the working directory
 | |
|     # Input: filename of a csv-file
 | |
|     # Output: DataFrame
 | |
|     def make_df(self, filename):
 | |
|         filepath = self.working_dir + str(filename)
 | |
|         df = pd.read_csv(filepath)
 | |
|         return df
 | |
| 
 | |
|     # Extracts out the timestamp and the selected emg signal into a new dataframe
 | |
|     # Input: filename of a csv-file, EMG nr 
 | |
|     # Output: DataFrame(timestamp/EMG)
 | |
|     def get_time_emg_table(self, filename:str, emg_nr:int):
 | |
|         tot_data_frame = self.make_df(filename)
 | |
|         emg_str = 'emg' + str(emg_nr)
 | |
|         filtered_df = tot_data_frame[["timestamp", emg_str]]
 | |
|         return filtered_df
 | |
|     
 | |
|     # Takes in a df and stores the information in a Data_container object
 | |
|     # Input: filename of a csv-file, EMG nr, left/right arm, subject's data_container, session nr 
 | |
|     # Output: None -> stores EMG data in data container
 | |
|     def store_df_in_container(self, filename:str, emg_nr:int, which_arm:str, data_container:Data_container, session:int):
 | |
|         df = self.get_time_emg_table(filename, emg_nr+1)
 | |
| 
 | |
|         if df.isnull().values.any():
 | |
|             print('NaN in: subject', data_container.subject_nr, 'arm:', which_arm, 'session:', session, 'emg nr:', emg_nr)
 | |
| 
 | |
|         # Places the data correctly:
 | |
|         if session == 1:
 | |
|             if which_arm == 'left':
 | |
|                 data_container.data_dict_round1['left'][emg_nr] = df    # Zero indexed emg_nr in the dict
 | |
|             else:
 | |
|                 data_container.data_dict_round1['right'][emg_nr] = df
 | |
|         elif session == 2:
 | |
|             if which_arm == 'left':
 | |
|                 data_container.data_dict_round2['left'][emg_nr] = df
 | |
|             else:
 | |
|                 data_container.data_dict_round2['right'][emg_nr] = df
 | |
|         elif session == 3:
 | |
|             if which_arm == 'left':
 | |
|                 data_container.data_dict_round3['left'][emg_nr] = df
 | |
|             else:
 | |
|                 data_container.data_dict_round3['right'][emg_nr] = df
 | |
|         elif session == 4:
 | |
|             if which_arm == 'left':
 | |
|                 data_container.data_dict_round4['left'][emg_nr] = df
 | |
|             else:
 | |
|                 data_container.data_dict_round4['right'][emg_nr] = df
 | |
|         else:
 | |
|             raise IndexError('Not a valid index')
 | |
|     
 | |
|     # Links the data container for a subject to the csv_handler object
 | |
|     # Input: the subject's data_container
 | |
|     # Output: None -> places the data container correctly in the CSV_handler data_container_dict
 | |
|     def link_container_to_handler(self, data_container:Data_container):
 | |
|         # Links the retrieved data with the subjects data_container
 | |
|         subject_nr = data_container.subject_nr
 | |
|         self.data_container_dict[subject_nr] = data_container
 | |
| 
 | |
|     # Retrieves df via the data_dict in the CSV_handler object  
 | |
|     # Input: Experiment detailes
 | |
|     # Output: DataFrame
 | |
|     def get_df_from_data_dict(self, subject_nr, which_arm, session, emg_nr):
 | |
|         container:Data_container = self.data_container_dict.get(subject_nr)
 | |
|         df = container.dict_list[session - 1].get(which_arm)[emg_nr - 1]
 | |
|         return df
 | |
| 
 | |
|     # Loads the data from the csv files into the storing system of the CSV_handler object
 | |
|     # Input: None(CSV_handler)
 | |
|     # Output: None -> load and stores data
 | |
|     def load_hard_PP_emg_data(self):
 | |
| 
 | |
|         # CSV data from subject 1
 | |
|         file1_subject1_left = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1810/myoLeftEmg.csv"
 | |
|         file2_subject1_left = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1830/myoLeftEmg.csv"
 | |
|         file3_subject1_left = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1845/myoLeftEmg.csv"
 | |
|         file4_subject1_left = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1855/myoLeftEmg.csv"
 | |
|         subject1_left_files = [file1_subject1_left, file2_subject1_left, file3_subject1_left, file4_subject1_left]
 | |
|         file1_subject1_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1810/myoRightEmg.csv"
 | |
|         file2_subject1_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1830/myoRightEmg.csv"
 | |
|         file3_subject1_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1845/myoRightEmg.csv"
 | |
|         file4_subject1_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMarek_20201207_1855/myoRightEmg.csv"
 | |
|         subject1_right_files = [file1_subject1_rigth, file2_subject1_rigth, file3_subject1_rigth, file4_subject1_rigth]
 | |
| 
 | |
|         # CSV data from subject 2
 | |
|         file1_subject2_left = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2010/myoLeftEmg.csv"
 | |
|         file2_subject2_left = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2025/myoLeftEmg.csv"
 | |
|         file3_subject2_left = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2035/myoLeftEmg.csv"
 | |
|         file4_subject2_left = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2045/myoLeftEmg.csv"
 | |
|         subject2_left_files = [file1_subject2_left, file2_subject2_left, file3_subject2_left, file4_subject2_left]
 | |
|         file1_subject2_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2010/myoRightEmg.csv"
 | |
|         file2_subject2_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2025/myoRightEmg.csv"
 | |
|         file3_subject2_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2035/myoRightEmg.csv"
 | |
|         file4_subject2_rigth = "/Exp20201205_2myo_hardTypePP/HaluskaMaros_20201205_2045/myoRightEmg.csv"
 | |
|         subject2_right_files = [file1_subject2_rigth, file2_subject2_rigth, file3_subject2_rigth, file4_subject2_rigth]
 | |
| 
 | |
|         # CSV data from subject 3
 | |
|         file1_subject3_left = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1700/myoLeftEmg.csv"
 | |
|         file2_subject3_left = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1715/myoLeftEmg.csv"
 | |
|         file3_subject3_left = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1725/myoLeftEmg.csv"
 | |
|         file4_subject3_left = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1735/myoLeftEmg.csv"
 | |
|         subject3_left_files = [file1_subject3_left, file2_subject3_left, file3_subject3_left, file4_subject3_left]
 | |
|         file1_subject3_rigth = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1700/myoRightEmg.csv"
 | |
|         file2_subject3_rigth = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1715/myoRightEmg.csv"
 | |
|         file3_subject3_rigth = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1725/myoRightEmg.csv"
 | |
|         file4_subject3_rigth = "/Exp20201205_2myo_hardTypePP/HaluskovaBeata_20201205_1735/myoRightEmg.csv"
 | |
|         subject3_right_files = [file1_subject3_rigth, file2_subject3_rigth, file3_subject3_rigth, file4_subject3_rigth]
 | |
| 
 | |
|         # CSV data from subject 4
 | |
|         file1_subject4_left = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1900/myoLeftEmg.csv"
 | |
|         file2_subject4_left = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1915/myoLeftEmg.csv"
 | |
|         file3_subject4_left = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1925/myoLeftEmg.csv"
 | |
|         file4_subject4_left = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1935/myoLeftEmg.csv"
 | |
|         subject4_left_files = [file1_subject4_left, file2_subject4_left, file3_subject4_left, file4_subject4_left]
 | |
|         file1_subject4_rigth = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1900/myoRightEmg.csv"
 | |
|         file2_subject4_rigth = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1915/myoRightEmg.csv"
 | |
|         file3_subject4_rigth = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1925/myoRightEmg.csv"
 | |
|         file4_subject4_rigth = "/Exp20201205_2myo_hardTypePP/KelisekDavid_20201209_1935/myoRightEmg.csv"
 | |
|         subject4_right_files = [file1_subject4_rigth, file2_subject4_rigth, file3_subject4_rigth, file4_subject4_rigth]
 | |
| 
 | |
| 
 | |
|         # CSV data from subject 5
 | |
|         file1_subject5_left = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2030/myoLeftEmg.csv"
 | |
|         file2_subject5_left = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2040/myoLeftEmg.csv"
 | |
|         file3_subject5_left = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2050/myoLeftEmg.csv"
 | |
|         file4_subject5_left = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2100/myoLeftEmg.csv"
 | |
|         subject5_left_files = [file1_subject5_left, file2_subject5_left, file3_subject5_left, file4_subject5_left]
 | |
|         file1_subject5_rigth = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2030/myoRightEmg.csv"
 | |
|         file2_subject5_rigth = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2040/myoRightEmg.csv"
 | |
|         file3_subject5_rigth = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2050/myoRightEmg.csv"
 | |
|         file4_subject5_rigth = "/Exp20201205_2myo_hardTypePP/KelisekRichard_20201209_2100/myoRightEmg.csv"
 | |
|         subject5_right_files = [file1_subject5_rigth, file2_subject5_rigth, file3_subject5_rigth, file4_subject5_rigth]
 | |
| 
 | |
|         left_list = [subject1_left_files, subject2_left_files, subject3_left_files, subject4_left_files, subject5_left_files]
 | |
|         right_list = [subject1_right_files, subject2_right_files, subject3_right_files, subject4_right_files, subject5_right_files]
 | |
| 
 | |
| 
 | |
|         subject1_data_container = Data_container(1, 'HaluskaMarek')
 | |
|         subject2_data_container = Data_container(2, 'HaluskaMaros')
 | |
|         subject3_data_container = Data_container(3, 'HaluskovaBeata')
 | |
|         subject4_data_container = Data_container(4, 'KelisekDavid')
 | |
|         subject5_data_container = Data_container(5, 'KelisekRichard')
 | |
|         subject_data_container_list = [subject1_data_container, subject2_data_container, subject3_data_container, 
 | |
|                                         subject4_data_container, subject5_data_container]
 | |
|     
 | |
|         for subject_nr in range(5):
 | |
|             data_container = subject_data_container_list[subject_nr]
 | |
|             # left variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = left_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'left', data_container, round+1)
 | |
|             # right variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = right_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'right', data_container, round+1)
 | |
|             # Links the stored data in the data_container to the Handler
 | |
|             self.link_container_to_handler(data_container)
 | |
|         self.data_type = 'hardPP'
 | |
|         return self.data_container_dict
 | |
|     def load_soft_PP_emg_data(self):
 | |
| 
 | |
|         # CSV data from subject 1
 | |
|         file1_subject1_left = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1910/myoLeftEmg.csv"
 | |
|         file2_subject1_left = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1920/myoLeftEmg.csv"
 | |
|         file3_subject1_left = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1935/myoLeftEmg.csv"
 | |
|         file4_subject1_left = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1945/myoLeftEmg.csv"
 | |
|         subject1_left_files = [file1_subject1_left, file2_subject1_left, file3_subject1_left, file4_subject1_left]
 | |
|         file1_subject1_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1910/myoRightEmg.csv"
 | |
|         file2_subject1_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1920/myoRightEmg.csv"
 | |
|         file3_subject1_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1935/myoRightEmg.csv"
 | |
|         file4_subject1_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMarek_20201207_1945/myoRightEmg.csv"
 | |
|         subject1_right_files = [file1_subject1_rigth, file2_subject1_rigth, file3_subject1_rigth, file4_subject1_rigth]
 | |
| 
 | |
|         # CSV data from subject 2
 | |
|         file1_subject2_left = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2055/myoLeftEmg.csv"
 | |
|         file2_subject2_left = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2110/myoLeftEmg.csv"
 | |
|         file3_subject2_left = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2125/myoLeftEmg.csv"
 | |
|         file4_subject2_left = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2145/myoLeftEmg.csv"
 | |
|         subject2_left_files = [file1_subject2_left, file2_subject2_left, file3_subject2_left, file4_subject2_left]
 | |
|         file1_subject2_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2055/myoRightEmg.csv"
 | |
|         file2_subject2_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2110/myoRightEmg.csv"
 | |
|         file3_subject2_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2125/myoRightEmg.csv"
 | |
|         file4_subject2_rigth = "/Exp20201205_2myo_softTypePP/HaluskaMaros_20201205_2145/myoRightEmg.csv"
 | |
|         subject2_right_files = [file1_subject2_rigth, file2_subject2_rigth, file3_subject2_rigth, file4_subject2_rigth]
 | |
| 
 | |
|         # CSV data from subject 3
 | |
|         file1_subject3_left = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1745/myoLeftEmg.csv"
 | |
|         file2_subject3_left = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1755/myoLeftEmg.csv"
 | |
|         file3_subject3_left = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1810/myoLeftEmg.csv"
 | |
|         file4_subject3_left = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1825/myoLeftEmg.csv"
 | |
|         subject3_left_files = [file1_subject3_left, file2_subject3_left, file3_subject3_left, file4_subject3_left]
 | |
|         file1_subject3_rigth = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1745/myoRightEmg.csv"
 | |
|         file2_subject3_rigth = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1755/myoRightEmg.csv"
 | |
|         file3_subject3_rigth = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1810/myoRightEmg.csv"
 | |
|         file4_subject3_rigth = "/Exp20201205_2myo_softTypePP/HaluskovaBeata_20201205_1825/myoRightEmg.csv"
 | |
|         subject3_right_files = [file1_subject3_rigth, file2_subject3_rigth, file3_subject3_rigth, file4_subject3_rigth]
 | |
| 
 | |
|         # CSV data from subject 4
 | |
|         file1_subject4_left = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_1945/myoLeftEmg.csv"
 | |
|         file2_subject4_left = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_1955/myoLeftEmg.csv"
 | |
|         file3_subject4_left = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_2010/myoLeftEmg.csv"
 | |
|         file4_subject4_left = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_2025/myoLeftEmg.csv"
 | |
|         subject4_left_files = [file1_subject4_left, file2_subject4_left, file3_subject4_left, file4_subject4_left]
 | |
|         file1_subject4_rigth = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_1945/myoRightEmg.csv"
 | |
|         file2_subject4_rigth = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_1955/myoRightEmg.csv"
 | |
|         file3_subject4_rigth = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_2010/myoRightEmg.csv"
 | |
|         file4_subject4_rigth = "/Exp20201205_2myo_softTypePP/KelisekDavid_20201209_2025/myoRightEmg.csv"
 | |
|         subject4_right_files = [file1_subject4_rigth, file2_subject4_rigth, file3_subject4_rigth, file4_subject4_rigth]
 | |
| 
 | |
| 
 | |
|         # CSV data from subject 5
 | |
|         file1_subject5_left = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2110/myoLeftEmg.csv"
 | |
|         file2_subject5_left = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2120/myoLeftEmg.csv"
 | |
|         file3_subject5_left = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2130/myoLeftEmg.csv"
 | |
|         file4_subject5_left = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2140/myoLeftEmg.csv"
 | |
|         subject5_left_files = [file1_subject5_left, file2_subject5_left, file3_subject5_left, file4_subject5_left]
 | |
|         file1_subject5_rigth = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2110/myoRightEmg.csv"
 | |
|         file2_subject5_rigth = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2120/myoRightEmg.csv"
 | |
|         file3_subject5_rigth = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2130/myoRightEmg.csv"
 | |
|         file4_subject5_rigth = "/Exp20201205_2myo_softTypePP/KelisekRichard_20201209_2140/myoRightEmg.csv"
 | |
|         subject5_right_files = [file1_subject5_rigth, file2_subject5_rigth, file3_subject5_rigth, file4_subject5_rigth]
 | |
| 
 | |
|         left_list = [subject1_left_files, subject2_left_files, subject3_left_files, subject4_left_files, subject5_left_files]
 | |
|         right_list = [subject1_right_files, subject2_right_files, subject3_right_files, subject4_right_files, subject5_right_files]
 | |
| 
 | |
| 
 | |
|         subject1_data_container = Data_container(1, 'HaluskaMarek')
 | |
|         subject2_data_container = Data_container(2, 'HaluskaMaros')
 | |
|         subject3_data_container = Data_container(3, 'HaluskovaBeata')
 | |
|         subject4_data_container = Data_container(4, 'KelisekDavid')
 | |
|         subject5_data_container = Data_container(5, 'KelisekRichard')
 | |
|         subject_data_container_list = [subject1_data_container, subject2_data_container, subject3_data_container, 
 | |
|                                         subject4_data_container, subject5_data_container]
 | |
|     
 | |
|         for subject_nr in range(5):
 | |
|             data_container = subject_data_container_list[subject_nr]
 | |
|             # left variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = left_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'left', data_container, round+1)
 | |
|             # right variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = right_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'right', data_container, round+1)
 | |
|             # Links the stored data in the data_container to the Handler
 | |
|             self.link_container_to_handler(data_container)
 | |
|         self.data_type = 'softPP'
 | |
|         return self.data_container_dict
 | |
|     def load_hard_original_emg_data(self):
 | |
| 
 | |
|          # CSV data from subject 1
 | |
|         file1_subject1_left = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1810/myoLeftEmg.csv"
 | |
|         file2_subject1_left = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1830/myoLeftEmg.csv"
 | |
|         file3_subject1_left = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1845/myoLeftEmg.csv"
 | |
|         file4_subject1_left = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1855/myoLeftEmg.csv"
 | |
|         subject1_left_files = [file1_subject1_left, file2_subject1_left, file3_subject1_left, file4_subject1_left]
 | |
|         file1_subject1_rigth = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1810/myoRightEmg.csv"
 | |
|         file2_subject1_rigth = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1830/myoRightEmg.csv"
 | |
|         file3_subject1_rigth = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1845/myoRightEmg.csv"
 | |
|         file4_subject1_rigth = "/Exp20201205_2myo_hardType/HaluskaMarek_20201207_1855/myoRightEmg.csv"
 | |
|         subject1_right_files = [file1_subject1_rigth, file2_subject1_rigth, file3_subject1_rigth, file4_subject1_rigth]
 | |
| 
 | |
|         # CSV data from subject 2
 | |
|         file1_subject2_left = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2010/myoLeftEmg.csv"
 | |
|         file2_subject2_left = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2025/myoLeftEmg.csv"
 | |
|         file3_subject2_left = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2035/myoLeftEmg.csv"
 | |
|         file4_subject2_left = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2045/myoLeftEmg.csv"
 | |
|         subject2_left_files = [file1_subject2_left, file2_subject2_left, file3_subject2_left, file4_subject2_left]
 | |
|         file1_subject2_rigth = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2010/myoRightEmg.csv"
 | |
|         file2_subject2_rigth = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2025/myoRightEmg.csv"
 | |
|         file3_subject2_rigth = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2035/myoRightEmg.csv"
 | |
|         file4_subject2_rigth = "/Exp20201205_2myo_hardType/HaluskaMaros_20201205_2045/myoRightEmg.csv"
 | |
|         subject2_right_files = [file1_subject2_rigth, file2_subject2_rigth, file3_subject2_rigth, file4_subject2_rigth]
 | |
| 
 | |
|         # CSV data from subject 3
 | |
|         file1_subject3_left = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1700/myoLeftEmg.csv"
 | |
|         file2_subject3_left = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1715/myoLeftEmg.csv"
 | |
|         file3_subject3_left = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1725/myoLeftEmg.csv"
 | |
|         file4_subject3_left = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1735/myoLeftEmg.csv"
 | |
|         subject3_left_files = [file1_subject3_left, file2_subject3_left, file3_subject3_left, file4_subject3_left]
 | |
|         file1_subject3_rigth = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1700/myoRightEmg.csv"
 | |
|         file2_subject3_rigth = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1715/myoRightEmg.csv"
 | |
|         file3_subject3_rigth = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1725/myoRightEmg.csv"
 | |
|         file4_subject3_rigth = "/Exp20201205_2myo_hardType/HaluskovaBeata_20201205_1735/myoRightEmg.csv"
 | |
|         subject3_right_files = [file1_subject3_rigth, file2_subject3_rigth, file3_subject3_rigth, file4_subject3_rigth]
 | |
| 
 | |
|         # CSV data from subject 4
 | |
|         file1_subject4_left = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1900/myoLeftEmg.csv"
 | |
|         file2_subject4_left = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1915/myoLeftEmg.csv"
 | |
|         file3_subject4_left = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1925/myoLeftEmg.csv"
 | |
|         file4_subject4_left = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1935/myoLeftEmg.csv"
 | |
|         subject4_left_files = [file1_subject4_left, file2_subject4_left, file3_subject4_left, file4_subject4_left]
 | |
|         file1_subject4_rigth = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1900/myoRightEmg.csv"
 | |
|         file2_subject4_rigth = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1915/myoRightEmg.csv"
 | |
|         file3_subject4_rigth = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1925/myoRightEmg.csv"
 | |
|         file4_subject4_rigth = "/Exp20201205_2myo_hardType/KelisekDavid_20201209_1935/myoRightEmg.csv"
 | |
|         subject4_right_files = [file1_subject4_rigth, file2_subject4_rigth, file3_subject4_rigth, file4_subject4_rigth]
 | |
| 
 | |
| 
 | |
|         # CSV data from subject 5
 | |
|         file1_subject5_left = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2030/myoLeftEmg.csv"
 | |
|         file2_subject5_left = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2040/myoLeftEmg.csv"
 | |
|         file3_subject5_left = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2050/myoLeftEmg.csv"
 | |
|         file4_subject5_left = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2100/myoLeftEmg.csv"
 | |
|         subject5_left_files = [file1_subject5_left, file2_subject5_left, file3_subject5_left, file4_subject5_left]
 | |
|         file1_subject5_rigth = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2030/myoRightEmg.csv"
 | |
|         file2_subject5_rigth = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2040/myoRightEmg.csv"
 | |
|         file3_subject5_rigth = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2050/myoRightEmg.csv"
 | |
|         file4_subject5_rigth = "/Exp20201205_2myo_hardType/KelisekRichard_20201209_2100/myoRightEmg.csv"
 | |
|         subject5_right_files = [file1_subject5_rigth, file2_subject5_rigth, file3_subject5_rigth, file4_subject5_rigth]
 | |
| 
 | |
|         left_list = [subject1_left_files, subject2_left_files, subject3_left_files, subject4_left_files, subject5_left_files]
 | |
|         right_list = [subject1_right_files, subject2_right_files, subject3_right_files, subject4_right_files, subject5_right_files]
 | |
| 
 | |
| 
 | |
|         subject1_data_container = Data_container(1, 'HaluskaMarek')
 | |
|         subject2_data_container = Data_container(2, 'HaluskaMaros')
 | |
|         subject3_data_container = Data_container(3, 'HaluskovaBeata')
 | |
|         subject4_data_container = Data_container(4, 'KelisekDavid')
 | |
|         subject5_data_container = Data_container(5, 'KelisekRichard')
 | |
|         subject_data_container_list = [subject1_data_container, subject2_data_container, subject3_data_container, 
 | |
|                                         subject4_data_container, subject5_data_container]
 | |
|     
 | |
|         for subject_nr in range(5):
 | |
|             data_container = subject_data_container_list[subject_nr]
 | |
|             # left variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = left_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'left', data_container, round+1)
 | |
|             # right variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = right_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'right', data_container, round+1)
 | |
|             # Links the stored data in the data_container to the Handler
 | |
|             self.link_container_to_handler(data_container)
 | |
|         self.data_type = 'hard'
 | |
|         return self.data_container_dict
 | |
|     def load_soft_original_emg_data(self):
 | |
| 
 | |
|         # CSV data from subject 1
 | |
|         file1_subject1_left = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1910/myoLeftEmg.csv"
 | |
|         file2_subject1_left = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1920/myoLeftEmg.csv"
 | |
|         file3_subject1_left = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1935/myoLeftEmg.csv"
 | |
|         file4_subject1_left = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1945/myoLeftEmg.csv"
 | |
|         subject1_left_files = [file1_subject1_left, file2_subject1_left, file3_subject1_left, file4_subject1_left]
 | |
|         file1_subject1_rigth = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1910/myoRightEmg.csv"
 | |
|         file2_subject1_rigth = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1920/myoRightEmg.csv"
 | |
|         file3_subject1_rigth = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1935/myoRightEmg.csv"
 | |
|         file4_subject1_rigth = "/Exp20201205_2myo_softType/HaluskaMarek_20201207_1945/myoRightEmg.csv"
 | |
|         subject1_right_files = [file1_subject1_rigth, file2_subject1_rigth, file3_subject1_rigth, file4_subject1_rigth]
 | |
| 
 | |
|         # CSV data from subject 2
 | |
|         file1_subject2_left = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2055/myoLeftEmg.csv"
 | |
|         file2_subject2_left = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2110/myoLeftEmg.csv"
 | |
|         file3_subject2_left = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2125/myoLeftEmg.csv"
 | |
|         file4_subject2_left = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2145/myoLeftEmg.csv"
 | |
|         subject2_left_files = [file1_subject2_left, file2_subject2_left, file3_subject2_left, file4_subject2_left]
 | |
|         file1_subject2_rigth = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2055/myoRightEmg.csv"
 | |
|         file2_subject2_rigth = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2110/myoRightEmg.csv"
 | |
|         file3_subject2_rigth = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2125/myoRightEmg.csv"
 | |
|         file4_subject2_rigth = "/Exp20201205_2myo_softType/HaluskaMaros_20201205_2145/myoRightEmg.csv"
 | |
|         subject2_right_files = [file1_subject2_rigth, file2_subject2_rigth, file3_subject2_rigth, file4_subject2_rigth]
 | |
| 
 | |
|         # CSV data from subject 3
 | |
|         file1_subject3_left = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1745/myoLeftEmg.csv"
 | |
|         file2_subject3_left = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1755/myoLeftEmg.csv"
 | |
|         file3_subject3_left = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1810/myoLeftEmg.csv"
 | |
|         file4_subject3_left = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1825/myoLeftEmg.csv"
 | |
|         subject3_left_files = [file1_subject3_left, file2_subject3_left, file3_subject3_left, file4_subject3_left]
 | |
|         file1_subject3_rigth = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1745/myoRightEmg.csv"
 | |
|         file2_subject3_rigth = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1755/myoRightEmg.csv"
 | |
|         file3_subject3_rigth = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1810/myoRightEmg.csv"
 | |
|         file4_subject3_rigth = "/Exp20201205_2myo_softType/HaluskovaBeata_20201205_1825/myoRightEmg.csv"
 | |
|         subject3_right_files = [file1_subject3_rigth, file2_subject3_rigth, file3_subject3_rigth, file4_subject3_rigth]
 | |
| 
 | |
|         # CSV data from subject 4
 | |
|         file1_subject4_left = "/Exp20201205_2myo_softType/KelisekDavid_20201209_1945/myoLeftEmg.csv"
 | |
|         file2_subject4_left = "/Exp20201205_2myo_softType/KelisekDavid_20201209_1955/myoLeftEmg.csv"
 | |
|         file3_subject4_left = "/Exp20201205_2myo_softType/KelisekDavid_20201209_2010/myoLeftEmg.csv"
 | |
|         file4_subject4_left = "/Exp20201205_2myo_softType/KelisekDavid_20201209_2025/myoLeftEmg.csv"
 | |
|         subject4_left_files = [file1_subject4_left, file2_subject4_left, file3_subject4_left, file4_subject4_left]
 | |
|         file1_subject4_rigth = "/Exp20201205_2myo_softType/KelisekDavid_20201209_1945/myoRightEmg.csv"
 | |
|         file2_subject4_rigth = "/Exp20201205_2myo_softType/KelisekDavid_20201209_1955/myoRightEmg.csv"
 | |
|         file3_subject4_rigth = "/Exp20201205_2myo_softType/KelisekDavid_20201209_2010/myoRightEmg.csv"
 | |
|         file4_subject4_rigth = "/Exp20201205_2myo_softType/KelisekDavid_20201209_2025/myoRightEmg.csv"
 | |
|         subject4_right_files = [file1_subject4_rigth, file2_subject4_rigth, file3_subject4_rigth, file4_subject4_rigth]
 | |
| 
 | |
| 
 | |
|         # CSV data from subject 5
 | |
|         file1_subject5_left = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2110/myoLeftEmg.csv"
 | |
|         file2_subject5_left = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2120/myoLeftEmg.csv"
 | |
|         file3_subject5_left = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2130/myoLeftEmg.csv"
 | |
|         file4_subject5_left = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2140/myoLeftEmg.csv"
 | |
|         subject5_left_files = [file1_subject5_left, file2_subject5_left, file3_subject5_left, file4_subject5_left]
 | |
|         file1_subject5_rigth = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2110/myoRightEmg.csv"
 | |
|         file2_subject5_rigth = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2120/myoRightEmg.csv"
 | |
|         file3_subject5_rigth = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2130/myoRightEmg.csv"
 | |
|         file4_subject5_rigth = "/Exp20201205_2myo_softType/KelisekRichard_20201209_2140/myoRightEmg.csv"
 | |
|         subject5_right_files = [file1_subject5_rigth, file2_subject5_rigth, file3_subject5_rigth, file4_subject5_rigth]
 | |
| 
 | |
|         left_list = [subject1_left_files, subject2_left_files, subject3_left_files, subject4_left_files, subject5_left_files]
 | |
|         right_list = [subject1_right_files, subject2_right_files, subject3_right_files, subject4_right_files, subject5_right_files]
 | |
| 
 | |
| 
 | |
|         subject1_data_container = Data_container(1, 'HaluskaMarek')
 | |
|         subject2_data_container = Data_container(2, 'HaluskaMaros')
 | |
|         subject3_data_container = Data_container(3, 'HaluskovaBeata')
 | |
|         subject4_data_container = Data_container(4, 'KelisekDavid')
 | |
|         subject5_data_container = Data_container(5, 'KelisekRichard')
 | |
|         subject_data_container_list = [subject1_data_container, subject2_data_container, subject3_data_container, 
 | |
|                                         subject4_data_container, subject5_data_container]
 | |
|     
 | |
|         for subject_nr in range(5):
 | |
|             data_container = subject_data_container_list[subject_nr]
 | |
|             # left variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = left_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'left', data_container, round+1)
 | |
|             # right variant proccessed here
 | |
|             for round in range(4):
 | |
|                 for emg_nr in range(8):
 | |
|                     filename = right_list[subject_nr][round]
 | |
|                     self.store_df_in_container(filename, emg_nr, 'right', data_container, round+1)
 | |
|             # Links the stored data in the data_container to the Handler
 | |
|             self.link_container_to_handler(data_container)
 | |
|         self.data_type = 'soft'
 | |
|         return self.data_container_dict
 | |
| 
 | |
|     # Loads data the to the CSV_handler(general load func). Choose data_type: hard, hardPP, soft og softPP as str. 
 | |
|     # Input: String(datatype you want)
 | |
|     # Output: None -> load and stores data
 | |
|     def load_data(self, data_type):
 | |
|         if data_type == 'hard': 
 | |
|             self.load_hard_original_emg_data()
 | |
|         elif data_type == 'hardPP':
 | |
|             self.load_hard_PP_emg_data()
 | |
|         elif data_type == 'soft':
 | |
|             self.load_soft_original_emg_data()
 | |
|         elif data_type == 'softPP':
 | |
|             self.load_soft_PP_emg_data()
 | |
|         else:
 | |
|             raise Exception('Wrong input')
 | |
| 
 | |
|     # Retrieved data. Send in loaded csv_handler and data detailes you want. 
 | |
|     # Input: Experiment detailes
 | |
|     # Output: DataFrame,  samplerate:int
 | |
|     def get_data(self, subject_nr, which_arm, session, emg_nr):
 | |
|         data_frame = self.get_df_from_data_dict(subject_nr, which_arm, session, emg_nr)
 | |
|         samplerate = get_samplerate(data_frame)
 | |
|         return data_frame, samplerate
 | |
| 
 | |
|     # NOT IMPLEMENTED
 | |
|     def get_keyboard_data(self, filename:str, pres_or_release:str='pressed'):
 | |
|         filepath = self.working_dir + str(filename)
 | |
|         df = pd.read_csv(filepath)
 | |
|         if pres_or_release == 'pressed':
 | |
|             df = df[(df['event'] == 'KeyPressed') and (df['event'] == 'KeyPressed')]
 | |
|         else: pass
 | |
|         pass
 | |
| 
 | |
| 
 | |
| class NN_handler:
 | |
| 
 | |
|     # Paths for data storage in json to later use in Neural_Network_Analysis.py
 | |
|     JSON_PATH_REG = "reg_data.json"
 | |
|     JSON_PATH_MFCC = "mfcc_data.json"
 | |
| 
 | |
|     # Class to manipulate data from the CSV_handler and store it for further analysis
 | |
|     # NB! More subject needs to be added manually 
 | |
|     def __init__(self, csv_handler:CSV_handler) -> None:
 | |
|         self.csv_handler = csv_handler
 | |
|         # Should med 4 sessions * split nr of samples per person. Each sample is structured like this: [sample_df, samplerate]
 | |
|         self.reg_samples_per_subject = {1: [],  
 | |
|                                         2: [], 
 | |
|                                         3: [],
 | |
|                                         4: [],
 | |
|                                         5: []
 | |
|                                         }
 | |
|         # Should med 4 sessions * (~150, 208) of mfcc samples per person. One [DataFrame, session_length_list] per subject
 | |
|         self.mfcc_samples_per_subject = {1: [],  
 | |
|                                          2: [], 
 | |
|                                          3: [],
 | |
|                                          4: [],
 | |
|                                          5: []
 | |
|                                          }
 | |
| 
 | |
|     # GET method for reg_samples_dict
 | |
|     def get_reg_samples_dict(self) -> dict:
 | |
|         return self.reg_samples_per_subject
 | |
| 
 | |
|     # GET method for mfcc_samples_dict  
 | |
|     def get_mfcc_samples_dict(self) -> dict:
 | |
|         return self.mfcc_samples_per_subject
 | |
| 
 | |
|     # Retrieves all EMG data from one subject and one session, and makes a list of the DataFrames
 | |
|     # Input: Subject nr, Session nr (norm, not 0-indexed)
 | |
|     # Output: List(df_1, ..., df_16)
 | |
|     def get_emg_list(self, subject_nr, session_nr) -> list:
 | |
|         list_of_emgs = []
 | |
|         df, _ = self.csv_handler.get_data(subject_nr, 'left', session_nr, 1)
 | |
|         list_of_emgs.append(df)
 | |
|         for emg_nr in range(7):
 | |
|             df, _ = self.csv_handler.get_data(subject_nr, 'left', session_nr, emg_nr+2)
 | |
|             list_of_emgs.append(DataFrame(df[get_emg_str(emg_nr+2)]))
 | |
|         for emg_nr in range(8):
 | |
|             df, _ = self.csv_handler.get_data(subject_nr, 'right', session_nr, emg_nr+1)
 | |
|             list_of_emgs.append(DataFrame(df[get_emg_str(emg_nr+1)]))
 | |
|         
 | |
|         return list_of_emgs     # list of emg data 
 | |
| 
 | |
|     # Creates one Dataframe of all EMG data(one session, one subject). One column for each EMG array
 | |
|     # Input: List(emg1, ..., emg16)
 | |
|     # Output: DataFrame(shape[1]=16)
 | |
|     def make_subj_sample(self, list_of_emgs_):
 | |
|         # Test and fix if the left/right EMGs have different size
 | |
|         list_of_emgs = []
 | |
|         length_left_emgs = int(len(list_of_emgs_[0].index))
 | |
|         length_right_emgs = int(len(list_of_emgs_[-1].index))
 | |
|         if length_left_emgs < length_right_emgs: 
 | |
|             for i in range(16):
 | |
|                 new_emg_df = list_of_emgs_[i].head(length_left_emgs)
 | |
|                 list_of_emgs.append(new_emg_df)
 | |
|         elif length_right_emgs < length_left_emgs:
 | |
|             for i in range(16):
 | |
|                 new_emg_df = list_of_emgs_[i].head(length_right_emgs)
 | |
|                 list_of_emgs.append(new_emg_df)
 | |
|         else:
 | |
|             list_of_emgs = list_of_emgs_
 | |
|         
 | |
|         tot_session_df_list = []
 | |
|         for i in range(8):
 | |
|             df = list_of_emgs[i]
 | |
|             tot_session_df_list.append(df)
 | |
|         for i in range(1, 9):
 | |
|             emg_str_old = get_emg_str(i)
 | |
|             emg_str_new = get_emg_str(8+i)
 | |
|             df = list_of_emgs[7+i].rename(columns={emg_str_old: emg_str_new})
 | |
|             tot_session_df_list.append(df)
 | |
|         tot_session_df = pd.concat(tot_session_df_list, axis=1, ignore_index=True)
 | |
| 
 | |
|         return tot_session_df
 | |
|     
 | |
|     # Takes in all EMG session Dataframe and merges the EMG data into one column, creating one signal 
 | |
|     # Input: DataFrame(shape[1]=16, EMG data)
 | |
|     # Output: DataFrame(signal), samplerate of it
 | |
|     def reshape_session_df_to_signal(self, df:DataFrame):
 | |
|             main_df = df[['timestamp', 1]].rename(columns={1: 'emg'})
 | |
|             for i in range(2, 17):
 | |
|                 adding_df = df[['timestamp', i]].rename(columns={i: 'emg'})
 | |
|                 main_df = pd.concat([main_df, adding_df], ignore_index=True)
 | |
|             samplerate = get_samplerate(main_df)
 | |
|             return main_df, samplerate
 | |
| 
 | |
|     # Stores split, merged signals in the NN-handler's reg_samples_per_subject
 | |
|     # Input: Split_nr:int(how many times to split this merged signal)
 | |
|     # Output: None -> stores in NN_handler
 | |
|     def store_samples(self, split_nr) -> None:
 | |
|         for subject_nr in range(5):
 | |
|             subj_samples = []
 | |
|             for session_nr in range(4):
 | |
|                 list_of_emg = self.get_emg_list(subject_nr+1, session_nr+1)
 | |
|                 tot_session_df = self.make_subj_sample(list_of_emg)
 | |
| 
 | |
|                 # TESTING FOR NAN
 | |
|                 if tot_session_df.isnull().values.any():
 | |
|                     print('NaN in: subject', subject_nr+1, 'session:', session_nr+1, 'where? HERE')
 | |
| 
 | |
|                 samples = np.array_split(tot_session_df.to_numpy(), split_nr)
 | |
|                 for array in samples:
 | |
|                     df = DataFrame(array).rename(columns={0:'timestamp'})
 | |
|                     df_finished, samplerate = self.reshape_session_df_to_signal(df)
 | |
|                     subj_samples.append([df_finished, samplerate])
 | |
|             
 | |
|             self.reg_samples_per_subject[subject_nr+1] = subj_samples
 | |
| 
 | |
|     # Takes in all EMG session Dataframe and creates DataFrame of MFCC samples
 | |
|     # Input: DataFrame(shape[1]=16, EMG data)
 | |
|     # Output: DataFrame(merged MFCC data, shape: (n, 13*16)), length of session datapoints
 | |
|     def make_mfcc_df_from_session_df(self, session_df):
 | |
|         session_df.rename(columns={0:'timestamp'}, inplace=True)
 | |
|         samplerate = get_samplerate(session_df)
 | |
|         attach_func = lambda list_1, list_2: list_1.extend(list_2)
 | |
| 
 | |
|         signal = session_df[1]
 | |
|         mfcc_0 = mfcc_custom(signal, samplerate, MFCC_WINDOWSIZE, MFCC_STEPSIZE, NR_COEFFICIENTS, NR_MEL_BINS)
 | |
|         df = DataFrame(mfcc_0).dropna()
 | |
|         df['combined'] = df.values.tolist()
 | |
|         result_df = df['combined']
 | |
| 
 | |
|         for i in range(2, 17):
 | |
|             signal_i = session_df[i]
 | |
|             mfcc_i = mfcc_custom(signal_i, samplerate, MFCC_WINDOWSIZE, MFCC_STEPSIZE, NR_COEFFICIENTS, NR_MEL_BINS)
 | |
|             mfcc_i = DataFrame(mfcc_i).dropna()
 | |
|             mfcc_i['combined'] = mfcc_i.values.tolist()
 | |
|             df = result_df.combine(mfcc_i['combined'], attach_func)
 | |
|         
 | |
|         session_length = (len(result_df.index)) # Add the length of session data points
 | |
| 
 | |
|         return result_df, session_length
 | |
| 
 | |
|     # Merges MFCC data from all sessions and stores the sample data in 
 | |
|     # the NN_handler's mfcc_samples_per_subject dict
 | |
|     # Input: None(NN_handler)
 | |
|     # Output: None -> stores in NN_handler [samples, session_length_list] for each subject
 | |
|     def store_mfcc_samples(self) -> None:
 | |
|         for subject_nr in range(5):
 | |
|             subj_samples = []
 | |
|             session_length_list = []
 | |
|             for session_nr in range(4):
 | |
|                 list_of_emg = self.get_emg_list(subject_nr+1, session_nr+1)
 | |
|                 tot_session_df = self.make_subj_sample(list_of_emg)
 | |
|             
 | |
|                 # TESTING FOR NAN
 | |
|                 if tot_session_df.isnull().values.any():
 | |
|                     print('NaN in: subject', subject_nr+1, 'session:', session_nr+1, 'where? HERE')
 | |
|                 
 | |
|                 mfcc_df_i, session_length = self.make_mfcc_df_from_session_df(tot_session_df)
 | |
|                 subj_samples.append(mfcc_df_i)
 | |
|                 session_length_list.append(session_length)            
 | |
|             
 | |
|             result_df = pd.concat(subj_samples, axis=0, ignore_index=True)
 | |
|             self.mfcc_samples_per_subject[subject_nr+1] = [result_df, session_length_list]
 | |
| 
 | |
| 
 | |
|     # Makes MFCC data from reg_samples_per_subject and stores it in a json file
 | |
|     # Input: Path to the json file
 | |
|     # Output: None -> stores in json
 | |
|     def save_json_reg(self, json_path=JSON_PATH_REG):
 | |
|         
 | |
|         # Dictionary to store mapping, labels, and MFCCs
 | |
|         data = {
 | |
|             "mapping": [],
 | |
|             "labels": [],
 | |
|             "mfcc": []
 | |
|         }
 | |
| 
 | |
|         raw_data_dict = self.get_reg_samples_dict()
 | |
|     
 | |
|         # Loop through all subjects to get samples
 | |
|         mfcc_list = []
 | |
|         mfcc_frame_list = []
 | |
| 
 | |
|         for key, value in raw_data_dict.items():
 | |
| 
 | |
| 
 | |
|             # save subject label in the mapping
 | |
|             subject_label = 'Subject ' + str(key)
 | |
|             data["mapping"].append(subject_label)
 | |
|             print("\nProcessing: {}".format(subject_label))
 | |
| 
 | |
|             # process all samples per subject
 | |
|             for i, (sample) in enumerate(value):
 | |
| 
 | |
|                 # load signal from sample
 | |
|                 signal, sample_rate = sample[0], sample[1]
 | |
|                 signal = signal['emg'].to_numpy()
 | |
|                 test_df_for_bugs(signal, key, i)
 | |
|                 #print(sample_rate)
 | |
| 
 | |
|                 # extract mfcc
 | |
|                 mfcc = mfcc_custom(signal, sample_rate, MFCC_WINDOWSIZE, MFCC_STEPSIZE, NR_COEFFICIENTS, NR_MEL_BINS)
 | |
|                 
 | |
|                 mfcc_list.append(mfcc.tolist())
 | |
|                 mfcc_frame_list.append(mfcc.shape[0])
 | |
| 
 | |
|                 #data["mfcc"].append(mfcc.tolist())
 | |
|                 data["labels"].append(key-1)
 | |
|                 print("sample:{} is done".format(i+1))
 | |
| 
 | |
|         minimum = min(mfcc_frame_list)
 | |
| 
 | |
|         for mfcc_data in mfcc_list:
 | |
| 
 | |
|             data["mfcc"].append(mfcc_data[:minimum])
 | |
|             print(np.array(mfcc_data[:minimum]).shape)
 | |
| 
 | |
|         # save MFCCs to json file
 | |
|         with open(json_path, "w") as fp:
 | |
|             json.dump(data, fp, indent=4)
 | |
| 
 | |
|     # Stores MFCC data from mfcc_samples_per_subject in a json file
 | |
|     # Input: Path to the json file
 | |
|     # Output: None -> stores in json
 | |
|     def save_json_mfcc(self, json_path=JSON_PATH_MFCC):
 | |
|             
 | |
|             # dictionary to store mapping, labels, and MFCCs
 | |
|             data = {
 | |
|                 "mapping": [],
 | |
|                 "labels": [],
 | |
|                 "mfcc": [],
 | |
| 
 | |
|                 "session_lengths": []
 | |
|             }
 | |
| 
 | |
|             raw_data_dict = self.get_mfcc_samples_dict()
 | |
|         
 | |
|             # loop through all subjects to get samples
 | |
|             for key, value in raw_data_dict.items():
 | |
|                 
 | |
|                 # save subject label in the mapping
 | |
|                 subject_label = 'Subject ' + str(key)
 | |
|                 print("\nProcessing: {}".format(subject_label))
 | |
|                 data["mapping"].append(subject_label)       # Subject label
 | |
|                 data["session_lengths"].append(value[1])   # List[subject][session_length_list]
 | |
| 
 | |
|                 # process all samples per subject
 | |
|                 for i, sample in enumerate(value[0]):
 | |
| 
 | |
|                     data["labels"].append(key-1)    # Subject nr
 | |
|                     data["mfcc"].append(sample[0])  # MFCC sample on same index
 | |
|                      
 | |
|                     print("sample:{} is done".format(i+1))
 | |
|                     #print(np.array(mfcc_data).shape)
 | |
| 
 | |
|             # save MFCCs to json file
 | |
|             with open(json_path, "w") as fp:
 | |
|                 json.dump(data, fp, indent=4)
 | |
| 
 | |
| 
 | |
| # HELP FUNCTIONS: ------------------------------------------------------------------------: 
 | |
| 
 | |
| # Help: gets the str from emg nr
 | |
| def get_emg_str(emg_nr):
 | |
|     return 'emg' + str(emg_nr)
 | |
| 
 | |
| # Help: gets the min/max of a df
 | |
| def get_min_max_timestamp(df:DataFrame):
 | |
|     #min = int(np.floor(df['timestamp'].min()))
 | |
|     min = df['timestamp'].min()
 | |
|     max = df['timestamp'].max()
 | |
|     return min, max
 | |
| 
 | |
| # Help: returns df_time_emg
 | |
| def make_df_from_xandy(x, y, emg_nr):
 | |
|     dict = {'timestamp': x, get_emg_str(emg_nr): y}
 | |
|     df = DataFrame(dict)
 | |
|     #print(df)
 | |
|     return df
 | |
| 
 | |
| # Help: returns the samplerate of a df
 | |
| def get_samplerate(df:DataFrame):
 | |
|     min, max = get_min_max_timestamp(df)
 | |
|     if max > 60 and min < 60:
 | |
|         seconds = max - 60 - min
 | |
|     else:
 | |
|         seconds = max - min
 | |
|     samples = len(df.index)
 | |
|     samplerate = samples / seconds
 | |
|     return int(samplerate)
 | |
| 
 | |
| # Help: takes in a df and outputs np arrays for x and y values
 | |
| def get_xory_from_df(x_or_y, df:DataFrame):
 | |
|     swither = {
 | |
|         'x': df.iloc[:,0].to_numpy(),
 | |
|         'y': df.iloc[:,1].to_numpy()
 | |
|     }
 | |
|     return swither.get(x_or_y, 0)
 | |
| 
 | |
| # Help: slightly modified mfcc with inputs like below. Returns N (x_values from original df) and mfcc_y_values 
 | |
| def mfcc_custom(signal, samplerate, windowsize=MFCC_WINDOWSIZE, 
 | |
|                                             stepsize=MFCC_STEPSIZE, 
 | |
|                                             nr_coefficients=NR_COEFFICIENTS, 
 | |
|                                             nr_mel_filters=NR_MEL_BINS):
 | |
|         
 | |
|     return mfcc(signal, samplerate, windowsize, stepsize, nr_coefficients, nr_mel_filters)
 | |
| 
 | |
| # Help: test for unregularities in DataFrame obj
 | |
| def test_df_for_bugs(signal, key, placement_index):
 | |
|     df = DataFrame(signal)
 | |
|     if df.isnull().values.any():
 | |
|         print('NaN in subject', key, 'in sample', placement_index)
 | |
|     if df.shape[1] != (1):
 | |
|         print('Shape:', df.shape[1], 'at subject', key, 'in sample', placement_index)
 | |
| 
 | |
| 
 | |
| 
 |