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) # 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)