function varargout = JOVE_GUI2(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @JOVE_GUI2_OpeningFcn, ... 'gui_OutputFcn', @JOVE_GUI2_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function JOVE_GUI2_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; addpath(genpath(fullfile(pwd,'Utilities'))); handles.Header = []; handles.FuncFile = ''; handles.Data = []; handles.Atlas = ''; handles.AtlasName = ''; handles.iy = []; handles.GM = []; handles.TC = []; handles.TC2 = []; handles.TR = realmax; handles.W = realmax; handles.ScrubT = realmax; handles.IsFuncLoaded = 0; handles.IsAtlasLoaded = 0; handles.IsWarpLoaded = 0; handles.IsMotLoaded = 0; handles.IsHeaderLoaded = 0; handles.SN = ''; handles.Mot = []; handles.FD = []; handles.CodeBook = []; % Update handles structure guidata(hObject, handles); % --- Outputs from this function are returned to the command line. function varargout = JOVE_GUI2_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- Executes on button press in DataButton. function DataButton_Callback(hObject, eventdata, handles) % Selection of all the fMRI files [filename1,pathname1]=uigetfile({'*.*','All Files'},... 'Select fMRI files (NIFTI)...','MultiSelect','off'); % If the user has indeed entered files if ~isequal(filename1,0) || ~isequal(pathname1,0) load((fullfile(pathname1, filename1))); assignin('base','ISFC_VX', ISFC_VX); handles.Data = ISFC_VX; handles.GM = zeros(size(handles.Data,1),1); handles.GM(~isnan(handles.Data(:,1))) = 1; handles.GM = logical(handles.GM); % Confirms that functional data has been loaded handles.IsFuncLoaded = 1; end if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) handles.TC = JOVE_AtlasData(handles.Data,handles.GM,handles.Atlas,handles.iy,handles.FuncFile); end guidata(hObject,handles); % --- Executes on button press in AtlasButton. function AtlasButton_Callback(hObject, eventdata, handles) % Selection of the file [filename2,pathname2]=uigetfile({'*.*','All Files'},... 'Select structural files...','MultiSelect','off'); % If the user has indeed entered files if ~isequal(filename2,0) || ~isequal(pathname2,0) % The atlas is warped at the right resolution handles.Atlas = fullfile(pathname2, filename2); handles.AtlasName = filename2; tmp = spm_read_vols(spm_vol(handles.Atlas)); tmp = tmp(:); [handles.CodeBook] = CreateCodeBook(handles.Atlas,1:max(tmp),realmax); handles.IsAtlasLoaded = 1; end if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) handles.TC = JOVE_AtlasData(handles.Data,handles.GM,handles.Atlas,handles.iy,handles.FuncFile); end guidata(hObject,handles); % --- Executes on button press in WarpButton. function WarpButton_Callback(hObject, eventdata, handles) % Selection of the file [filename3,pathname3]=uigetfile({'*.*','All Files'},... 'Select structural files...','MultiSelect','off'); % If the user has indeed entered files if ~isequal(filename3,0) || ~isequal(pathname3,0) handles.iy = fullfile(pathname3,filename3); handles.IsWarpLoaded = 1; end if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) handles.TC = JOVE_AtlasData(handles.Data,handles.GM,handles.Atlas,handles.iy,handles.FuncFile); end guidata(hObject,handles); function MotionButton_Callback(hObject, eventdata, handles) % Selection of the file [filename4,pathname4]=uigetfile({'*.*','All Files'},... 'Select motion file...','MultiSelect','off'); if ~isequal(filename4,0) || ~isequal(pathname4,0) handles.Mot = textread(fullfile(pathname4,filename4)); handles.Mot = handles.Mot(:,1:6); handles.IsMotLoaded = 1; end if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) handles.TC = JOVE_AtlasData(handles.Data,handles.GM,handles.Atlas,handles.iy,handles.FuncFile); end guidata(hObject,handles); % --- Executes on button press in PlotButton. function PlotButton_Callback(hObject, eventdata, handles) if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) % Scrubbing % Converts the rotational components into [mm] handlesMot(:,4:6) = 50*handles.Mot(:,4:6); % Computes FD handles.FD = sum(abs([0 0 0 0 0 0; diff(handles.Mot)]),2); set(handles.ScrubTextPerc,'String',[num2str(100*sum(handles.FD > handles.ScrubT)/length(handles.FD)),' [%] scrubbed']); % Scrubbing according to chosen scheme switch get(handles.ScrubbingPopup,'Value'); % No scrubbing at all case 1 Scrub_mask_final = logical(zeros(size(handles.FD))); % Only the implicated frames are scrubbed case 2 Scrub_mask_final = logical(handles.FD > handles.ScrubT); % also one frame afterwards scrubbed case 3 Scrub_mask = logical(handles.FD > handles.ScrubT); tmp = circshift(Scrub_mask,[1 0]); tmp(1) = 0; Scrub_mask_final = Scrub_mask | tmp; case 4 Scrub_mask = logical(handles.FD > handles.ScrubT); tmp = circshift(Scrub_mask,[1 0]); tmp(1) = 0; Scrub_mask_final = Scrub_mask | tmp; tmp = circshift(Scrub_mask,[-1 0]); tmp(end) = 0; Scrub_mask_final = Scrub_mask_final | tmp; case 5 Scrub_mask = logical(handles.FD > handles.ScrubT); tmp = circshift(Scrub_mask,[1 0]); tmp(1) = 0; Scrub_mask_final = Scrub_mask | tmp; tmp = circshift(Scrub_mask,[-1 0]); tmp(end) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[2 0]); tmp(1) = 0; tmp(2) = 0; Scrub_mask_final = Scrub_mask_final | tmp; case 6 Scrub_mask = logical(handles.FD > handles.ScrubT); tmp = circshift(Scrub_mask,[1 0]); tmp(1) = 0; Scrub_mask_final = Scrub_mask | tmp; tmp = circshift(Scrub_mask,[-1 0]); tmp(end) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[2 0]); tmp(1) = 0; tmp(2) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[-2 0]); tmp(end) = 0; tmp(end-1) = 0; Scrub_mask_final = Scrub_mask_final | tmp; case 7 Scrub_mask = logical(handles.FD > handles.ScrubT); tmp = circshift(Scrub_mask,[1 0]); tmp(1) = 0; Scrub_mask_final = Scrub_mask | tmp; tmp = circshift(Scrub_mask,[-1 0]); tmp(end) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[2 0]); tmp(1) = 0; tmp(2) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[-2 0]); tmp(end) = 0; tmp(end-1) = 0; Scrub_mask_final = Scrub_mask_final | tmp; tmp = circshift(Scrub_mask,[3 0]); tmp(1) = 0; tmp(2) = 0; tmp(3) = 0; Scrub_mask_final = Scrub_mask_final | tmp; otherwise end if sum(Scrub_mask_final) > 0 % Finds the values at the time points that we know are not % corrupted TCon = handles.TC(:,find(~Scrub_mask_final)); TCon(isnan(TCon)) = 0; % tinter is all the time points tinter = 1:length(Scrub_mask_final); % torig is the time points that we know torig = tinter(find(~Scrub_mask_final)); % We interpolate all time point values using the info that we % know (TCon at torig) handles.TC2 = interp1(torig,TCon',tinter,'spline')'; end handles.TC2 = handles.TC; % We want to keep the 'NaN's that we had because they are used to % remove bad regional time courses later on handles.TC2(isnan(handles.TC)) = NaN; handles.TC2 = real(y_IdealFilter(handles.TC2', handles.TR, [1/(handles.W*handles.TR) 0]))'; % Randomly picks 10 time courses for plotting n_ROI = size(handles.TC2,1); IDX = randperm(n_ROI); % Plots first graph handles.StartPlot = JOVE_PlotAtlasTC(handles.StartPlot,handles.TC-repmat(mean(handles.TC,2),1,size(handles.TC2,2)),IDX(1:6),'Atlas',handles.W,[],handles.TR); % Plots second graph handles.EndPlot = JOVE_PlotAtlasTC(handles.EndPlot,handles.TC2,IDX(1:6),'Atlas',handles.W,[],handles.TR); end guidata(hObject,handles); function TRText_Callback(hObject, eventdata, handles) % If the TR takes a reasonable value, then we validate it if (~isempty(str2double(get(hObject,'String')))) && ... (str2double(get(hObject,'String')) > 0) handles.TR = str2double(get(hObject,'String')); set(hObject,'BackgroundColor', [0.4 0.6 0.4]); else set(hObject,'BackgroundColor', [0.93 0.84 0.84]); end guidata(hObject,handles); % --- Executes during object creation, after setting all properties. function TRText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter TR...'); set(hObject,'FontAngle','italic'); function TRText_ButtonDownFcn(hObject,eventdata,handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject, handles); % --- Executes on selection change in ScrubbingPopup. function ScrubbingPopup_CreateFcn(hObject, eventdata, handles) Scrubbing_Types = {'None','0|0','0|1','1|1','1|2','2|2','2|3'}; set(hObject,'String',Scrubbing_Types); guidata(hObject,handles); % --- Executes during object creation, after setting all properties. function ScrubbingPopup_Callback(hObject, eventdata, handles) guidata(hObject,handles); function ScrubText_Callback(hObject, eventdata, handles) % If the high-pass takes a reasonable value, then we validate it if (~isempty(str2double(get(hObject,'String')))) && ... (str2double(get(hObject,'String')) > 0) handles.ScrubT = str2double(get(hObject,'String')); set(hObject,'BackgroundColor', [0.4 0.6 0.4]); else set(hObject,'BackgroundColor', [0.93 0.84 0.84]); end guidata(hObject,handles); function ScrubText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter scrubbing threshold...'); set(hObject,'FontAngle','italic'); function ScrubText_ButtonDownFcn(hObject,eventdata,handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject, handles); function WindowText_Callback(hObject, eventdata, handles) % If the high-pass takes a reasonable value, then we validate it if (~isempty(str2double(get(hObject,'String')))) && ... (str2double(get(hObject,'String')) > 1) && ... (str2double(get(hObject,'String')) < size(handles.Data,2)) handles.W = str2double(get(hObject,'String')); set(hObject,'BackgroundColor', [0.4 0.6 0.4]); else set(hObject,'BackgroundColor', [0.93 0.84 0.84]); end guidata(hObject,handles); function WindowText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter window size...'); set(hObject,'FontAngle','italic'); function WindowText_ButtonDownFcn(hObject,eventdata,handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); function SaveButton_Callback(hObject, eventdata, handles) ToSave = handles.TC2; CodeBook = handles.CodeBook; save(handles.SN,'ToSave'); save('CodeBook','CodeBook'); guidata(hObject,handles); function SaveText_Callback(hObject, eventdata, handles) if (~isempty(get(hObject,'String'))) set(hObject,'BackgroundColor', [0.4 0.6 0.4]); handles.SN = get(hObject,'String'); else set(hObject,'BackgroundColor', [0.93 0.84 0.84]); end guidata(hObject,handles); function SaveText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter save name...'); set(hObject,'FontAngle','italic'); function SaveText_ButtonDownFcn(hObject, eventdata, handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); function ClearButton_Callback(hObject, eventdata, handles) handles.FuncFile = ''; handles.Header = []; handles.Data = []; handles.Atlas = ''; handles.AtlasName = ''; handles.iy = []; handles.GM = []; handles.TC = []; handles.TC2 = []; handles.TR = realmax; handles.W = realmax; handles.ScrubT = realmax; handles.IsFuncLoaded = 0; handles.IsAtlasLoaded = 0; handles.IsWarpLoaded = 0; handles.IsMotLoaded = 0; handles.IsHeaderLoaded = 0; handles.SN = ''; handles.Mot = []; handles.FD = []; cla(handles.StartPlot); cla(handles.EndPlot); SaveText_CreateFcn(handles.SaveText,eventdata,handles); TRText_CreateFcn(handles.TRText,eventdata,handles); ScrubText_CreateFcn(handles.ScrubText,eventdata,handles); WindowText_CreateFcn(handles.WindowText,eventdata,handles); set(handles.TRText,'Enable','off'); set(handles.ScrubText,'Enable','off'); set(handles.WindowText,'Enable','off'); set(handles.SaveText,'Enable','off'); set(handles.TRText,'BackgroundColor',240/255*[1 1 1]); set(handles.ScrubText,'BackgroundColor',240/255*[1 1 1]); set(handles.WindowText,'BackgroundColor',240/255*[1 1 1]); set(handles.SaveText,'BackgroundColor',240/255*[1 1 1]); set(handles.ScrubbingPopup,'Value',1); set(handles.ScrubTextPerc,'String','- [%] scrubbed'); % Update handles structure guidata(hObject, handles); function HeaderButton_Callback(hObject, eventdata, handles) % Selection of all the fMRI files [filename0,pathname0]=uigetfile({'*.*','All Files'},... 'Select fMRI files (NIFTI)...','MultiSelect','off'); % If the user has indeed entered files if ~isequal(filename0,0) || ~isequal(pathname0,0) handles.FuncFile = fullfile(pathname0,filename0); handles.Header = spm_vol(handles.FuncFile); % Confirms that functional data has been loaded handles.IsHeaderLoaded = 1; end if JOVE_IsAllLoaded(handles.IsFuncLoaded,handles.IsAtlasLoaded,handles.IsWarpLoaded,handles.IsMotLoaded,handles.IsHeaderLoaded) handles.TC = JOVE_AtlasData(handles.Data,handles.GM,handles.Atlas,handles.iy,handles.FuncFile); end guidata(hObject,handles);