KBB rsEEG FFT - LeoLedesma237/LeoWebsite GitHub Wiki

Overview

This script is pretty complex but pretty easy to use.

  • Part 1: Setting working and saving directories
  • Part 2: Obtaining the names of rsEEG files that need to be FFT
  • Part 3: Running FFT and saving output

This script is specifically for rsEEG files that have 'Open' in the name. To make it applicable for closed rsEEG files that have 'Closed' in the name, you can change 'Open' to 'Closed' in the contains function in Part 2.

Part 1: Setting working and saving directories

  • Indicate the pathway where the clean rsEEG files are located
  • Indicate the pathway that you want to save the output of FFT on these files
% Load in EEGLAB
cd('C:\Users\lledesma.TIMES\Documents\MATLAB\eeglab2022.0')
eeglab

% 1. Set the folder path to record the names of all the files that are done
% with preprocessing
folder = 'Z:\Leo\KBB_EEG_Pilot\Cleaned rsEEG data\';
files = dir(folder);

% 2. Pick pathway where you want to save the FFT data
save_pathway = 'Z:\Leo\KBB_EEG_Pilot\FFT rsEEG data\';

Part 2: Obtain the names of rsEEG files that need to be FFT

% % % % % % REMAINING CODE IS AUTOMATIC % % % % % % % % 
% % % % % % Part 1: Reading in all the files in specified folder % % % % %
files = dir(folder);

% Create a for loop that keeps only real files present from the folder
AllFileNames = {};
for i = 1:length(files)
    if files(i).isdir == 0 % check if the file is not a directory
        AllFileNames{end+1} = files(i).name;
    end
end

%Use the startsWith function to find the location of where the .eeg files
eegIndx = endsWith(AllFileNames, '.set');

%Use the location of the .eeg files to extract them and save only them
eegFiles = AllFileNames(eegIndx);

% Only Eyes Open files
eegIndx = contains(eegFiles, 'Open');
eegFiles = eegFiles(eegIndx);

% Remove redundancies
% Only unprocessed files will be ran by the for loop below
Already_Processed_Files = dir(save_pathway);

% Create a for loop that keeps only real files present from the folder
All_Processed_Files = {};
for i = 1:length(Already_Processed_Files)
    if Already_Processed_Files(i).isdir == 0 % check if the file is not a directory
        All_Processed_Files{end+1} = Already_Processed_Files(i).name;
    end
end


% Removes the already processed files from the vector that will be input into the for loop 
for i = 1:length(eegFiles)
    for j = 1:length(All_Processed_Files)
        if strcmp(eegFiles{i}, All_Processed_Files{j})
            eegFiles{i} = [];
            break
        end
    end
end


% Remove empty cells from the vector
eegFiles = eegFiles(~cellfun('isempty',eegFiles));

% Problematic EEG files
filesToRemove = {'example 1', % Error using extractfield
                 'example 2',
                  };


% Removes the remove files from the rsEEG files vector
for i = 1:length(eegFiles)
    for j = 1:length(filesToRemove)
        if strcmp(eegFiles{i}, filesToRemove{j})
            eegFiles{i} = [];
            break
        end
    end
end

% Remove empty cells from rsEEG files vector
eegFiles = eegFiles(~cellfun('isempty',eegFiles));

Part 3: Run FFT and save the output

This complex code takes each cleaned rsEEG file and outputs an excel file that contains the power for each frequency for each channel. Everything is saved automatically.

for iii = 1:length(eegFiles) 
    Current_eegFile = eegFiles{iii} %MUST BE SQUIGGLY LINE FOR SEGMENTATION TO WORK!!!!
        
    %Import data - change the name of the ID
    EEG = pop_loadset('filename',Current_eegFile,'filepath',folder);
    [ALLEEG, EEG, CURRENTSET] = eeg_store( ALLEEG, EEG, 0 );
    
    % Resample data to 250 Hz
    EEG = pop_resample( EEG, 250);
    [ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 8,'gui','off'); 

    % Segmentation
    EEG = eeg_regepochs(EEG, [4], [-2 2]);
    [ALLEEG EEG CURRENTSET] = pop_newset(ALLEEG, EEG, 7,'setname','ID#_Segmented','gui','off');

    % Prerequisites
    srate = EEG.srate; % sampling rate (Hz) - ideally it is 250Hz
    duration = round(abs(EEG.xmin - EEG.xmax)); % signal duration (seconds) - ideally 4 seconds
    N = srate*duration; % total number of samples/data per segment (2nd column in matrix)
    
    % Save data into object
    data = EEG.data; % (Channels x Data x Segments )
    data = double(data); % (Channels x Data x Segments)
   
    
    % FFT - every segment of each channel/aka FFT the whole data (like a grid)
    Channel_Length = length(data(:,1,1)); 
    FFT_segments_redundant = zeros(size(data)); % An empty array
    
    for ii = 1:Channel_Length
        FFT_segments_redundant(ii,:,:) = fft(data(ii,:,:)); % FFT the data
    end
    
    abs_segments_redundant = abs(FFT_segments_redundant); % Take the absolute value
    
    % Frequency (Hz) - one segment; use this for the name
    Frequency_Hz_num = srate*(0:N/2-1)/N; % Creates labels for Hz range, which is half of the sampling rate
    cellFrequency_Hz = num2cell(Frequency_Hz_num);
    
    for i = 1:length(cellFrequency_Hz)
        cellFrequency_Hz{i} = ['x' num2str(cellFrequency_Hz{i})];
    end
    
    
    % Convert Magnitude to Power for all segments
    abs_segments = abs_segments_redundant(:,1:N/2,:); % Cut data-points by half (Redundant)
    Amplitude_segments = (abs_segments)/(N/2); % Divide data points by 2
    
    % Combine data into one segment
    Amplitude = zeros(length(Amplitude_segments(:,1,1)),length(Amplitude_segments(1,:,1))); % Empty array
    
    Segment_Length = size(Amplitude_segments(1,1,:)); 
    
    if length(Segment_Length) > 2 % Works on data that has more than one segment
    
        Segment_Length = Segment_Length(3);
        
        for ii = 1:Segment_Length
            Amplitude = Amplitude + Amplitude_segments(:,:,ii)/Segment_Length;
        end
        
        % Add Frequency_Hz labels to data
        Amp_cell = num2cell(Amplitude);
        Frequency_Hz_Amplitude = [cellFrequency_Hz; Amp_cell];
        
        % Remove columns outside 1 - 45 Hz [CHANGED TO 0.5 HZ to 45 HZ]
        Amplitude_1_45_Hz = Frequency_Hz_Amplitude(:,3:181,:);
        
        % Adding Channel Names
        % Extracting names of the channels
        
        
        % Add if statement to remove aux channels
        Channel_name_before_transposition = extractfield(EEG.chanlocs,'labels');
        
            if length(Channel_name_before_transposition) > 62
                EEG = pop_select( EEG, 'nochannel',{'Aux1','Aux2'});
            
                Channel_name_before_transposition = extractfield(EEG.chanlocs,'labels');
                Channel_name = Channel_name_before_transposition';
                Channel_lable = {'Channels'};
                Channel_name = vertcat(Channel_lable, Channel_name);
            
                % Remove bottom two rows of Amplitude (ones associated with Aux)
                Amplitude_1_45_Hz(end-1:end,:) = [];
            
                % Add Channel name to Amplitude
                Final_data = [Channel_name Amplitude_1_45_Hz];
                
                % Set working directory to save FFT data
                cd(save_pathway);
                
                % Save the data
                ID_string = eegFiles{iii};
                file.csv = strcat(ID_string,'.csv');
                
                writecell(Final_data, file.csv)
        
            else
            
                Channel_name = Channel_name_before_transposition';
                Channel_lable = {'Channels'};
                Channel_name = vertcat(Channel_lable, Channel_name);
                
                % Add Channel name to Amplitude
                Final_data = [Channel_name Amplitude_1_45_Hz];
                
                % Set working directory to save FFT data
                cd(save_pathway);
                
                % Save the data
                ID_string = eegFiles{iii};
                file.csv = strcat(ID_string,'.csv');
                
                writecell(Final_data, file.csv)
        
            end
     
    elseif length(Segment_Length) > 1 % Works on data that ONLY has one segment
    
        Segment_Length = size(Amplitude_segments(1,1,:)); 
        Segment_Length = Segment_Length(2);
    
        for ii = 1:Segment_Length
            Amplitude = Amplitude + Amplitude_segments(:,:,ii)/Segment_Length;
        end
        
        % Add Frequency_Hz labels to data
        Amp_cell = num2cell(Amplitude);
        Frequency_Hz_Amplitude = [cellFrequency_Hz; Amp_cell];
        
        % Remove columns outside 1 - 45 Hz
        Amplitude_1_45_Hz = Frequency_Hz_Amplitude(:,5:181,:);
        
        % Adding Channel Names
        % Extracting names of the channels
        
        
        % Add if statement to remove aux channels
        Channel_name_before_transposition = extractfield(EEG.chanlocs,'labels');
        
        if length(Channel_name_before_transposition) > 62
            EEG = pop_select( EEG, 'nochannel',{'Aux1','Aux2'});
        
            Channel_name_before_transposition = extractfield(EEG.chanlocs,'labels');
            Channel_name = Channel_name_before_transposition';
            Channel_lable = {'Channels'};
            Channel_name = vertcat(Channel_lable, Channel_name);
        
            % Remove bottom two rows of Amplitude (ones associated with Aux)
            Amplitude_1_45_Hz(end-1:end,:) = [];
        
            % Add Channel name to Amplitude
            Final_data = [Channel_name Amplitude_1_45_Hz];
            
            % Set working directory to save FFT data
            cd(save_pathway);
            
            % Save the data
            ID_string = eegFiles{iii};
            file.csv = strcat(ID_string,'.csv');
            
            writecell(Final_data, file.csv)
        
        else
        
            Channel_name = Channel_name_before_transposition';
            Channel_lable = {'Channels'};
            Channel_name = vertcat(Channel_lable, Channel_name);
            
            % Add Channel name to Amplitude
            Final_data = [Channel_name Amplitude_1_45_Hz];
            
            % Set working directory to save FFT data
            cd(save_pathway);
            
            % Save the data
            ID_string = eegFiles{iii};
            file.csv = strcat(ID_string,'.csv');
            
            writecell(Final_data, file.csv)
        
        end
    
    
    end
end