|
| 1 | +import mne |
| 2 | +import io |
| 3 | +import numpy as np |
| 4 | +import scipy.io |
| 5 | +import pandas as pd |
| 6 | +from glob import glob |
| 7 | +import datetime |
| 8 | +import time |
| 9 | +import h5py |
| 10 | + |
| 11 | +session = "s2_r1" |
| 12 | +laplacian = False |
| 13 | + |
| 14 | +dataset_path = "/home/data/NDClab/datasets/thrive-dataset/" |
| 15 | +analysis_path = "/home/data/NDClab/analyses/thrive-theta-ddm/" |
| 16 | + |
| 17 | +outputHeader = [ |
| 18 | + 'id', |
| 19 | + 'ERN_soc', 'CRN_soc', 'ERN_nonsoc', 'CRN_nonsoc', |
| 20 | + 'ERN_min_CRN_diff_soc', 'ERN_min_CRN_diff_nonsoc', |
| 21 | + # 'PE_error_soc', 'PE_corr_soc', 'PE_error_nonsoc', 'PE_corr_nonsoc', |
| 22 | + # 'PE_err_min_corr_diff_soc', 'PE_err_min_corr_diff_nonsoc' |
| 23 | +] |
| 24 | + |
| 25 | +output_data = pd.DataFrame() |
| 26 | + |
| 27 | +clustCell= [ |
| 28 | + [i-1 for i in [1, 2, 33, 34]], |
| 29 | + # [i-1 for i in [17, 49, 50, 19, 18]], |
| 30 | +] |
| 31 | + |
| 32 | +timeCell = [ |
| 33 | + [0, 100], # ERN cluster |
| 34 | + # [300, 500], # PE cluster |
| 35 | +] |
| 36 | + |
| 37 | +if laplacian: |
| 38 | + path_to_mat = glob(f"{analysis_path}/derivatives/preprocessed/erp_check/{session}/thrive_Resp_erps_csd_min_6t_*2025*.mat")[0] |
| 39 | +else: |
| 40 | + path_to_mat = glob(f"{analysis_path}/derivatives/preprocessed/erp_check/{session}/thrive_Resp_erps_min_6t_*2025*.mat")[0] |
| 41 | + #path_to_mat = glob(f"{analysis_path}/derivatives/preprocessed/erp_check/{session}/thrive_Resp_erps_min_6t_02_11_2025_15_17_33.mat")[0] |
| 42 | + |
| 43 | +path_to_eeg = glob(f"{dataset_path}/derivatives/preprocessed/sub-3000001/{session}/eeg/sub-3000001_all_eeg_processed_data_{session}_e1.set")[0] |
| 44 | + |
| 45 | +mat = scipy.io.loadmat(path_to_mat) |
| 46 | +allData = mat['erpDat_data'] |
| 47 | + |
| 48 | +# take IDs from EEG (all people > 6 trials) |
| 49 | +sub_from_eeg = [int(mat["erpDat_subIds"][i].item()[0]) for i in range(len(mat["erpDat_subIds"]))] |
| 50 | + |
| 51 | +EEG = mne.io.read_epochs_eeglab(path_to_eeg, verbose=False) |
| 52 | + |
| 53 | +EEG_times = EEG.times * 1000 |
| 54 | +startTime = -400 |
| 55 | +endTime = -200 |
| 56 | + |
| 57 | +startIdx = np.argmin(np.abs(EEG_times-startTime)) # get start index for baseline |
| 58 | +endIdx = np.argmin(np.abs(EEG_times-endTime)) # get end index for baseline |
| 59 | + |
| 60 | +allBase = np.squeeze(np.mean(allData[:, :, :, startIdx:endIdx+1], 3)) |
| 61 | +allBase = np.mean(allData[:, :, :, startIdx:endIdx+1], 3) |
| 62 | +newData = np.zeros_like(allData) |
| 63 | + |
| 64 | +for i in range(allData.shape[3]): |
| 65 | + newData[:, :, :, i] = allData[:, :, :, i] - allBase # baseline correction |
| 66 | + |
| 67 | +# %round EEG.times to nearest whole ms to make easier to work with |
| 68 | +# EEG.times = round(EEG.times); |
| 69 | + |
| 70 | +output_data[outputHeader[0]] = sub_from_eeg |
| 71 | + |
| 72 | +# initialize index var at 1 because i=0 is the column for subject ids |
| 73 | +i = 1 |
| 74 | +for comp in range(len(clustCell)): |
| 75 | + |
| 76 | + cluster= clustCell[comp] |
| 77 | + times = timeCell[comp] |
| 78 | + |
| 79 | + compStartTime = times[0] # in ms |
| 80 | + compEndTime = times[1] # in ms |
| 81 | + |
| 82 | + compStartIdx = np.argmin(np.abs(EEG_times-compStartTime)) |
| 83 | + compEndIdx = np.argmin(np.abs(EEG_times-compEndTime)) |
| 84 | + |
| 85 | + s_resp_incon_error_avgTime = np.mean(newData[:, 0:1, :, compStartIdx:compEndIdx+1], 3) |
| 86 | + s_resp_incon_corr_avgTime = np.mean(newData[:, 1:2, :, compStartIdx:compEndIdx+1], 3) |
| 87 | + ns_resp_incon_error_avgTime = np.mean(newData[:, 2:3, :, compStartIdx:compEndIdx+1], 3) |
| 88 | + ns_resp_incon_corr_avgTime = np.mean(newData[:, 3:4, :, compStartIdx:compEndIdx+1], 3) |
| 89 | + |
| 90 | + # average cluster of interest |
| 91 | + s_resp_incon_error_avgTimeClust = np.mean(s_resp_incon_error_avgTime[:, :, cluster], 2) |
| 92 | + s_resp_incon_corr_avgTimeClust = np.mean(s_resp_incon_corr_avgTime[:, :, cluster], 2) |
| 93 | + ns_resp_incon_error_avgTimeClust = np.mean(ns_resp_incon_error_avgTime[:, :, cluster], 2) |
| 94 | + ns_resp_incon_corr_avgTimeClust = np.mean(ns_resp_incon_corr_avgTime[:, :, cluster], 2) |
| 95 | + |
| 96 | + # compute difference scores |
| 97 | + s_resp_incon_error_avgTimeClust_diff = s_resp_incon_error_avgTimeClust - s_resp_incon_corr_avgTimeClust |
| 98 | + ns_resp_incon_error_avgTimeClust_diff = ns_resp_incon_error_avgTimeClust - ns_resp_incon_corr_avgTimeClust |
| 99 | + |
| 100 | + output_data[outputHeader[i]] = s_resp_incon_error_avgTimeClust |
| 101 | + output_data[outputHeader[i+1]] = s_resp_incon_corr_avgTimeClust |
| 102 | + output_data[outputHeader[i+2]] = ns_resp_incon_error_avgTimeClust |
| 103 | + output_data[outputHeader[i+3]] = ns_resp_incon_corr_avgTimeClust |
| 104 | + output_data[outputHeader[i+4]] = s_resp_incon_error_avgTimeClust_diff |
| 105 | + output_data[outputHeader[i+5]] = ns_resp_incon_error_avgTimeClust_diff |
| 106 | + i+=6 |
| 107 | + |
| 108 | +output_data |
| 109 | +output_data = output_data.iloc[:, :5] |
| 110 | +if laplacian: |
| 111 | + output_data.columns = [i + "_laplacian" if i != "id" else i for i in output_data.columns] |
| 112 | +output_data = output_data.rename({"id": "sub"}, axis=1) |
| 113 | + |
| 114 | +if laplacian: |
| 115 | + output_data.to_csv("{analysis_path}/derivatives/csv/{session}/thrive_erp_laplacian.csv", index=False) |
| 116 | +else: |
| 117 | + output_data.to_csv(f"{analysis_path}/derivatives/csv/{session}/thrive_erp.csv", index=False) |
0 commit comments