function varargout = JOVE_GUI4(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @JOVE_GUI4_OpeningFcn, ... 'gui_OutputFcn', @JOVE_GUI4_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_GUI4_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; addpath(genpath(fullfile(pwd,'Utilities'))); handles.NullType = 'Normal'; handles.IsISFCDataLoaded = 0; handles.IsNullLoaded = 0; handles.IsCodeBookLoaded = 0; handles.W = realmax; handles.TR = 1; handles.IsTREntered = 0; handles.IsWEntered = 0; handles.ISFC_Data = {}; handles.Null_Data = {}; handles.Alpha = 0.01; handles.NullThresh = {}; handles.SignMat = []; handles.IDX= []; handles.t_start = 0; handles.t_end = realmax; handles.range = [-1,1]; handles.SaveName = 'DefaultName'; guidata(hObject, handles); function varargout = JOVE_GUI4_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; %% Loading the ISFC data to threshold function DataButton_Callback(hObject, eventdata, handles) % Selection of all the fMRI files [filename1,pathname1]=uigetfile({'*.*','All Files'},... 'Select ISFC files...','MultiSelect','on'); % If the user has indeed entered files if ~isequal(filename1,0) || ~isequal(pathname1,0) if ~ischar(filename1) % The files are loaded sequentially: File{t} contains the path % towards the t-th frame for f = 1:length(filename1) load((fullfile(pathname1, filename1{f}))); assignin('base','ISFC_Final', ISFC_Final); handles.ISFC_Data = [handles.ISFC_Data,ISFC_Final]; end else load((fullfile(pathname1, filename1))); assignin('base','ISFC_Final', ISFC_Final); handles.ISFC_Data = ISFC_Final; end handles.IsISFCDataLoaded = 1; % If we have entered all required fields, we prepare the slider to % lie within the t_start/t_end interval if handles.IsTREntered && handles.IsWEntered && handles.IsISFCDataLoaded handles.t_start = (handles.TR*handles.W)-1; handles.t_end = (size(handles.ISFC_Data{1},2)-1)*handles.TR + handles.t_start; set(handles.Slider,'Value',handles.t_start); set(handles.Slider,'Min',handles.t_start); set(handles.Slider,'Max',handles.t_end); end end guidata(hObject,handles); %% Loading of the null data function NullButton_Callback(hObject, eventdata, handles) % Selection of all the fMRI files [filename2,pathname2]=uigetfile({'*.*','All Files'},... 'Select null ISFC files...','MultiSelect','on'); % If the user has indeed entered files if ~isequal(filename2,0) || ~isequal(pathname2,0) if ~ischar(filename2) % The files are loaded sequentially: File{t} contains the path % towards the t-th frame for f = 1:length(filename2) load((fullfile(pathname2, filename2{f}))); assignin('base','ISFC_Final', ISFC_Final); handles.Null_Data = [handles.Null_Data,ISFC_Final]; end else load((fullfile(pathname2, filename2))); assignin('base','ISFC_Final', ISFC_Final); handles.Null_Data = ISFC_Final; end handles.IsNullLoaded = 1; end guidata(hObject,handles); %% Entry of the percentile value at which to threshold function PercentileText_Callback(hObject, eventdata, handles) if (~isempty(str2double(get(hObject,'String')))) && ... (str2double(get(hObject,'String')) > 0) && ... (str2double(get(hObject,'String')) < 100) handles.Alpha = 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 PercentileText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter alpha value...'); set(hObject,'FontAngle','italic'); guidata(hObject,handles); function PercentileText_ButtonDownFcn(hObject, eventdata, handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); %% Plotting button function PlotButton_Callback(hObject, eventdata, handles) if handles.IsISFCDataLoaded && handles.IsNullLoaded % Computes excursions (size conn x n_swtp x subj) [SignMat,NullThresh] = JOVE_FindExcursions(handles.ISFC_Data,handles.Null_Data,handles.Alpha,handles.NullType); handles.SignMat = SignMat; handles.NullThresh = NullThresh; % Sorts the time courses, so that we display first the ones with the % largest excursion values (absolute) [tmp,IDX] = sort(squeeze(sum(abs(mean(handles.SignMat,3)),2)),'descend'); handles.IDX = IDX(~isnan(tmp)); tmp = handles.ISFC_Data{1}(handles.IDX,:); tmp = tmp(:); handles.range = [-max(abs(tmp)),max(abs(tmp))]; % Plots the ISFC data as well as the associated thresholds [handles.ISFCPlot] = JOVE_PlotAtlasTC(handles.ISFCPlot,handles.ISFC_Data{1},handles.IDX(1:3),'ISFC',handles.W,handles.Step,handles.TR); tmp_CM = cbrewer('qual','Set1',3); for i = 1:3 plot([handles.t_start,handles.t_end],[handles.NullThresh{1}(handles.IDX(i),1),handles.NullThresh{1}(handles.IDX(i),1)],'Parent',handles.ISFCPlot,'Color',tmp_CM(i,:)); plot([handles.t_start,handles.t_end],[handles.NullThresh{1}(handles.IDX(i),2),handles.NullThresh{1}(handles.IDX(i),2)],'Parent',handles.ISFCPlot,'Color',tmp_CM(i,:)); end handles.Line1 = plot([handles.t_start handles.t_start],[-1 1],'color',[0 0 0],'Parent',handles.ISFCPlot); % Plots the excursion time courses for i = 1:3 tmp_vec = zeros(size(handles.ISFC_Data{1},1),1); tmp_vec(handles.IDX(i)) = 1; tmp_mat = jVecToUpperTriMat(tmp_vec,(1+sqrt(1+4*2*size(handles.SignMat,1)))/2); JOVE_Plot_Conn_TimeCourse(handles.ExcPlot,handles.SignMat,find(sum(tmp_mat,2)==1),find(sum(tmp_mat,1)==1),handles.W,handles.TR,tmp_CM(i,:),tmp_CM(i,:)); end handles.Line2 = plot([handles.t_start handles.t_start],[-1 1],'color',[0 0 0],'Parent',handles.ExcPlot); if handles.IsCodeBookLoaded == 1 curtime = floor((get(handles.Slider,'Value')-handles.t_start)/(handles.Step*handles.TR)) + 1; Spatial_OI = mean(squeeze(handles.SignMat(:,curtime,:)),2); tmp_MAT = jVecToUpperTriMat(Spatial_OI,(1+sqrt(1+4*2*size(handles.SignMat,1)))/2)+jVecToUpperTriMat(Spatial_OI,(1+sqrt(1+4*2*size(handles.SignMat,1)))/2)'; tmp_DEG = sum(abs(tmp_MAT),1)/2; Factor_plots = 2*max(tmp_DEG); PlotBrainGraph_Kmeans_withtitle(handles.BrainPlot,tmp_MAT,tmp_DEG,handles.CodeBook,0.2,... Factor_plots,Factor_plots,2,1,'hot','spring',1,0.5,[-1 1],... 'W10_Alpha001','W10_Alpha001'); end end guidata(hObject,handles); %% Slider controls function Slider_Callback(hObject, eventdata, handles) handles.Line1.XData = [get(hObject,'Value'), get(hObject,'Value')]; handles.Line2.XData = [get(hObject,'Value'), get(hObject,'Value')]; if handles.IsCodeBookLoaded == 1 curtime = floor((get(hObject,'Value')-handles.t_start)/(handles.Step*handles.TR)) + 1; Spatial_OI = mean(squeeze(handles.SignMat(:,curtime,:)),2); tmp_MAT = jVecToUpperTriMat(Spatial_OI,(1+sqrt(1+4*2*size(handles.SignMat,1)))/2)+jVecToUpperTriMat(Spatial_OI,(1+sqrt(1+4*2*size(handles.SignMat,1)))/2)'; tmp_DEG = sum(abs(tmp_MAT),1)/2; Factor_plots = 2*max(tmp_DEG); cla(handles.BrainPlot); PlotBrainGraph_Kmeans_withtitle(handles.BrainPlot,tmp_MAT,tmp_DEG,handles.CodeBook,0.2,... Factor_plots,Factor_plots,2,1,'hot','spring',1,0.5,[-1 1],... 'W10_Alpha001','W10_Alpha001'); end guidata(hObject, handles); function Slider_CreateFcn(hObject, eventdata, handles) if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor',[.9 .9 .9]); end guidata(hObject, handles); %% Save button function SaveButton_Callback(hObject, eventdata, handles) SM = handles.SignMat; save(handles.SaveName,'SM'); guidata(hObject,handles); %% Clear button function ClearButton_Callback(hObject, eventdata, handles) handles.NullType = 'Normal'; handles.IsISFCDataLoaded = 0; handles.IsNullLoaded = 0; handles.IsMovieLoaded = 0; handles.W = realmax; handles.TR = 1; handles.IsTREntered = 0; handles.IsWEntered = 0; handles.ISFC_Data = {}; handles.Null_Data = {}; handles.Alpha = 0.05; handles.NullThresh = {}; handles.SignMat = []; handles.IDX= []; handles.t_start = 0; handles.t_end = realmax; handles.range = [-1,1]; handles.SaveName = 'DefaultName'; cla(handles.ISFCPlot); cla(handles.ExcPlot); cla(handles.BrainPlot); set(handles.Slider,'Value',0); set(handles.Slider,'Min',0); set(handles.Slider,'Max',1); set(handles.WindowText,'Enable','off'); set(handles.WindowText,'BackgroundColor',240/255*[1 1 1]); WindowText_CreateFcn(handles.WindowText, eventdata, handles); set(handles.TRText,'Enable','off'); set(handles.TRText,'BackgroundColor',240/255*[1 1 1]); TRText_CreateFcn(handles.TRText, eventdata, handles); set(handles.StepText,'Enable','off'); set(handles.StepText,'BackgroundColor',240/255*[1 1 1]); StepText_CreateFcn(handles.StepText, eventdata, handles); set(handles.SaveText,'Enable','off'); set(handles.SaveText,'BackgroundColor',240/255*[1 1 1]); SaveText_CreateFcn(handles.SaveText, eventdata, handles); set(handles.PercentileText,'Enable','off'); set(handles.PercentileText,'BackgroundColor',240/255*[1 1 1]); PercentileText_CreateFcn(handles.PercentileText, eventdata, handles); guidata(hObject,handles); %% Window text entry 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.ISFC_Data{1},2)) handles.W = str2double(get(hObject,'String')); set(hObject,'BackgroundColor', [0.4 0.6 0.4]); handles.IsWEntered = 1; if handles.IsTREntered && handles.IsWEntered && handles.IsISFCDataLoaded handles.t_start = (handles.TR*handles.W)-1; handles.t_end = (size(handles.ISFC_Data{1},2)-1)*handles.TR + handles.t_start; set(handles.Slider,'Value',handles.t_start); set(handles.Slider,'Min',handles.t_start); set(handles.Slider,'Max',handles.t_end); end 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'); guidata(hObject,handles); function WindowText_ButtonDownFcn(hObject, eventdata, handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); %% Loading of codebook function MovieButton_Callback(hObject, eventdata, handles) % Selection of all the fMRI files [filename3,pathname3]=uigetfile({'*.*','All Files'},... 'Select null ISFC files...','MultiSelect','off'); % If the user has indeed entered files if ~isequal(filename3,0) || ~isequal(pathname3,0) load((fullfile(pathname3, filename3))); assignin('base','CodeBook', CodeBook); handles.CodeBook = CodeBook; handles.IsCodeBookLoaded = 1; end guidata(hObject,handles); %% TR text entry function TRText_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.TR = str2double(get(hObject,'String')); set(hObject,'BackgroundColor', [0.4 0.6 0.4]); handles.IsTREntered = 1; if handles.IsTREntered && handles.IsWEntered && handles.IsISFCDataLoaded handles.t_start = (handles.TR*handles.W)-1; handles.t_end = (size(handles.ISFC_Data{1},2)-1)*handles.TR + handles.t_start; set(handles.Slider,'Value',handles.t_start); set(handles.Slider,'Min',handles.t_start); set(handles.Slider,'Max',handles.t_end); end else set(hObject,'BackgroundColor', [0.93 0.84 0.84]); end guidata(hObject,handles); function TRText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter TR...'); set(hObject,'FontAngle','italic'); guidata(hObject,handles); function TRText_ButtonDownFcn(hObject, eventdata, handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); %% Step text entry function StepText_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) handles.Step = 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 StepText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter step size...'); set(hObject,'FontAngle','italic'); guidata(hObject,handles); function StepText_ButtonDownFcn(hObject,eventdata,handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles); %% Save text entry function SaveText_Callback(hObject, eventdata, handles) % If the high-pass takes a reasonable value, then we validate it if (~isempty(get(hObject,'String'))) handles.SaveName = 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 SaveText_CreateFcn(hObject, eventdata, handles) set(hObject,'String','Enter save name...'); set(hObject,'FontAngle','italic'); guidata(hObject,handles); function SaveText_ButtonDownFcn(hObject, eventdata, handles) set(hObject,'Enable','on'); set(hObject,'String',''); set(hObject,'FontAngle','normal'); uicontrol(hObject); guidata(hObject,handles);