function varargout = pathchooser(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @pathchooser_OpeningFcn, ...
'gui_OutputFcn', @pathchooser_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 switchEntries(lb_source, lb_dest)
content = get(lb_source, 'String');
inds = get(lb_source, 'Value');
if ~isempty(content)
old = get(lb_dest, 'String');
new = [old; content(inds)];
set(lb_dest,'Value',[]);
set(lb_dest,'String',new);
content(inds) = [];
set(lb_source,'Value',[]);
set(lb_source,'String',content);
end
function [list inds] = upEntries(list,inds)
if inds(1)>1
for i=inds
MoveDown=list(i-1);
list(i-1)=list(i);
list(i)=MoveDown;
end
inds = inds -1;
end
function [list inds] = downEntries(list,inds)
if inds(end)<size(list,1)
for i=fliplr(inds)
MoveDown=list(i+1);
list(i+1)=list(i);
list(i)=MoveDown;
end
inds = inds+1;
end
function pathchooser_OpeningFcn(hObject, eventdata, handles, varargin)
tmpdir = varargin{1};
ud.baseDir = tmpdir{:};
ud.modus = varargin{2};
set(handles.pathchooser,'UserData',ud);
ud = get(handles.pathchooser,'UserData');
ud.pattern = cellstr([repmat('class ',26,1), num2str([1:26]')]);
ud.folders = cell(1,26);
baseDir = ud.baseDir;
dirContent = dir(baseDir);
contentNames = {dirContent.name};
if strcmp(ud.modus,'dirs')
contentNames = contentNames(vertcat(dirContent.isdir));
elseif strcmp(ud.modus,'files')
pat = {'.*.(img|nii|gz)'};
content = regexp(contentNames,pat,'match');
imgIdx = ~cellfun(@isempty,content);
contentNames = vertcat(content{imgIdx});
end
set(handles.listbox4,'String', contentNames);
set(handles.pathchooser,'UserData', ud);
if size(varargin,2) > 3
ud.pattern(1:length(varargin{3})) = varargin{4};
ud.folders(1:length(varargin{3})) = varargin{3};
set(handles.pathchooser,'UserData', ud);
set(handles.slider1,'Value',length(varargin{3}));
slider1_Callback(hObject, eventdata, handles);
pulldown_c1_Callback(hObject, eventdata, handles);
pulldown_c2_Callback(hObject, eventdata, handles);
end
if size(varargin,2) ~= 3
uiwait(handles.pathchooser);
end
updateMemberCount(handles);
function varargout = pathchooser_OutputFcn(hObject, eventdata, handles)
try
ud = get(handles.pathchooser,'UserData');
baseDir = ud.baseDir;
classCount = get(handles.slider1,'Value');
subjects = {ud.folders{1:classCount}};
classNames = ud.pattern(1:classCount);
out{1} = subjects;
out{2} = classNames;
out{3} = baseDir;
out{4} = ud.modus;
out{5} = handles;
handles.output = out;
varargout{1} = handles.output;
catch
handles.output = 0;
varargout{1} = handles.output;
end
function listbox1_Callback(hObject, eventdata, handles)
function listbox4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function pushbutton1_Callback(hObject, eventdata, handles)
switchEntries(handles.listbox4, handles.listbox5);
updateUserData(handles,2);
function pushbutton2_Callback(hObject, eventdata, handles)
switchEntries(handles.listbox5, handles.listbox4);
updateUserData(handles,2);
function listbox2_Callback(hObject, eventdata, handles)
function listbox2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function listbox3_Callback(hObject, eventdata, handles)
function listbox3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function listbox4_Callback(hObject, eventdata, handles)
function listbox5_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function listbox5_Callback(hObject, eventdata, handles)
function listbox1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function pushbutton3_Callback(hObject, eventdata, handles)
switchEntries(handles.listbox3, handles.listbox4);
updateUserData(handles,1);
function pushbutton4_Callback(hObject, eventdata, handles)
switchEntries(handles.listbox4, handles.listbox3);
updateUserData(handles,1);
function pushbutton4_KeyPressFcn(hObject, eventdata, handles)
function pushbutton5_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
baseDir = ud.baseDir;
classCount = get(handles.slider1,'Value');
subjects = {ud.folders{1:classCount}};
classNames = ud.pattern(1:classCount);
out{1} = subjects;
out{2} = classNames;
out{3} = baseDir;
out{4} = ud.modus;
out{5} = handles;
if size(unique(cellfun(@(x) size(x,1),out{1})),2) > 1
answer = questdlg(['The classes are unbalanced! This means the amount', ...
' of subjects in class 1 is not equal to the amount of class2. This could ', ...
' lead to unfeasible classifications. Nevertheless it could make sense, if you', ...
' aware of this fact and you know what you are doing. Do you want to continue?'], ...
'Attention!', 'Yes', 'No','No');
if strcmp(answer,'No')
return
end
end
if ~isempty(find((cellfun(@(x) size(x,1),out{1}))==0))
helpdlg('You should choose some subjects, otherwise it will not work.','No subjects selected');
return
end
handles.output = out;
pathchooser_OutputFcn(hObject, eventdata, handles);
uiresume;
return
function pushbutton7_Callback(hObject, eventdata, handles)
funPath = mfilename('fullpath');
helpFile = [funPath(1:end - size(mfilename,2)), 'help.html'];
web(helpFile);
function pushbuttonReset_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
oldBaseDir = ud.baseDir;
baseDir = {uigetdir(oldBaseDir, 'Select New Directory')};
set(handles.listbox3,'String', []);
set(handles.listbox5,'String', []);
pathchooser_OpeningFcn(hObject, eventdata, handles, baseDir, ud.modus,'reset');
function pushbuttonQuit_Callback(hObject, eventdata, handles)
close;
return
function pathchooser_CloseRequestFcn(hObject, eventdata, handles)
delete(hObject);
function up1_Callback(hObject, eventdata, handles)
vals = get(handles.listbox3,'Value');
list = get(handles.listbox3,'String');
if ~isempty(list) && ~isempty(vals)
[list vals] = upEntries(list, vals);
set(handles.listbox3,'String',list);
set(handles.listbox3,'Value', vals);
end
updateUserData(handles,1);
function down1_Callback(hObject, eventdata, handles)
vals = get(handles.listbox3,'Value');
list = get(handles.listbox3,'String');
if ~isempty(list) && ~isempty(vals)
[list vals] = downEntries(list, vals);
set(handles.listbox3,'String',list);
set(handles.listbox3,'Value', vals);
end
updateUserData(handles,1);
function up2_Callback(hObject, eventdata, handles)
vals = get(handles.listbox5,'Value');
list = get(handles.listbox5,'String');
if ~isempty(list) && ~isempty(vals)
[list vals] = upEntries(list, vals);
set(handles.listbox5,'String',list);
set(handles.listbox5,'Value', vals);
end
updateUserData(handles,2);
function down2_Callback(hObject, eventdata, handles)
vals = get(handles.listbox5,'Value');
list = get(handles.listbox5,'String');
if ~isempty(list) && ~isempty(vals)
[list vals] = downEntries(list, vals);
set(handles.listbox5,'String',list);
set(handles.listbox5,'Value', vals);
end
updateUserData(handles,2);
function selected_Callback(hObject, eventdata, handles)
set(handles.pushbutton1,'Enable', 'off');
set(handles.pushbutton2,'Enable', 'off');
set(handles.pushbutton3,'Enable', 'off');
set(handles.pushbutton4,'Enable', 'off');
set(handles.selected,'Enable', 'off');
set(handles.pushbutton5,'Enable', 'on');
set(handles.up1,'Enable', 'on');
set(handles.up2,'Enable', 'on');
set(handles.down1,'Enable', 'on');
set(handles.down2,'Enable', 'on');
function pushbutton_xls_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
[filename, pathname, filterindex] = uigetfile({'*.xls;*.csv'}, 'Pick an Excel or CSV File');
if strcmp(filename(end-2:end),'csv')
data = textread([pathname filename],'%s','delimiter','\n');
lines = cellfun(@(x) strsplit(',',x),data,'UniformOutput',false);
classNames = vertcat(lines{1})';
cols = vertcat(lines{2:end});
for k=1:size(cols,2)
classes{k} = cols(~cellfun(@isempty,cols(:,k)),k);
end
elseif strcmp(filename(end-2:end),'xls')
[a b] = xlsread([pathname filename]);
classNames = b(1,:)';
for k=1:size(b,2)
classes{k} = b(2:end,k);
end
else
error('Unknown Fileformat');
end
ud.pattern(1:length(classNames)) = classNames;
ud.folders(1:length(classes)) = classes;
set(handles.pathchooser,'UserData', ud);
set(handles.slider1,'Value',length(classes));
slider1_Callback(hObject, eventdata, handles);
pulldown_c1_Callback(hObject, eventdata, handles);
updateUserData(handles,3);
function save_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
ccount = get(handles.slider1,'Value');
members = ud.folders(1:ccount);
[filename, pathname] = uiputfile('*.csv', 'Save Groups as csv');
fn = [pathname filename];
fid = fopen(fn,'wt');
k = repmat({''},max(cellfun(@(x) size(x,1),members))+1,length(members));
k(1,:) = ud.pattern(1:length(members))';
for counter=1:length(members)
k(2:length(members{counter})+1,counter) = members{counter};
end
try
fopen(fn,'wt');
for c=1:size(k,1)
fprintf(fid, '%s\n',[sprintf('%s,',k{c,1:end-1}),k{c,end}]);
end
fclose(fid);
catch ex
fclose(fid);
error('Could not write file');
end
function slider1_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
set(handles.edit_classCount,'String',num2str(round(get(handles.slider1,'Value'))));
set(handles.pulldown_c1,'Value',min(get(handles.slider1,'Value'),get(handles.pulldown_c1,'Value')));
set(handles.pulldown_c2,'Value',min(get(handles.slider1,'Value'),get(handles.pulldown_c2,'Value')));
set(handles.pulldown_c1,'String',ud.pattern(1:get(handles.slider1,'Value'),:));
set(handles.pulldown_c2,'String',ud.pattern(1:get(handles.slider1,'Value'),:));
pulldown_c1_Callback(hObject, eventdata, handles)
pulldown_c2_Callback(hObject, eventdata, handles)
function slider1_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
function pulldown_c2_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
currentVal = get(handles.pulldown_c2,'Value');
currentStr = ud.folders{1,currentVal};
if ~isempty(currentStr)
set(handles.listbox5, 'String',currentStr);
else
set(handles.listbox5, 'String','');
end
updateMemberCount(handles);
set(handles.listbox5, 'Value',1);
function pulldown_c2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function pulldown_c1_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
currentVal = get(handles.pulldown_c1,'Value');
currentStr = ud.folders{1,currentVal};
if ~isempty(currentStr)
set(handles.listbox3, 'String',currentStr);
else
set(handles.listbox3, 'String','');
end
updateMemberCount(handles);
set(handles.listbox3, 'Value',1);
function pulldown_c1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_classCount_Callback(hObject, eventdata, handles)
set(handles.slider1,'Value',str2num(get(handles.edit_classCount,'String')));
function edit_classCount_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function updateUserData(handles,boxNumber)
ud = get(handles.pathchooser,'UserData');
currentVal1 = get(handles.pulldown_c1,'Value');
currentVal2 = get(handles.pulldown_c2,'Value');
str1 = get(handles.listbox3, 'String');
str2 = get(handles.listbox5, 'String');
if boxNumber == 1
ud.folders{1,currentVal1} = str1;
set(handles.listbox5, 'String',ud.folders{1,currentVal2});
set(handles.listbox5,'Value',min(size(ud.folders{1,currentVal2},1),get(handles.listbox5, 'Value')));
elseif boxNumber == 2
ud.folders{1,currentVal2} = str2;
set(handles.listbox3,'Value',min(size(ud.folders{1,currentVal1},1),get(handles.listbox3, 'Value')));
set(handles.listbox3, 'String',ud.folders{1,currentVal1});
else
ud.folders{1,currentVal1} = str1;
ud.folders{1,currentVal2} = str2;
end
set(handles.pathchooser,'UserData',ud);
updateMemberCount(handles);
function updateMemberCount(handles)
try
ud = get(handles.pathchooser,'UserData');
currentVal1 = get(handles.pulldown_c1,'Value');
currentVal2 = get(handles.pulldown_c2,'Value');
subjects = ud.folders;
set(handles.text_members1,'String',[num2str(length(subjects{currentVal1})) ' members']);
set(handles.text_members2,'String',[num2str(length(subjects{currentVal2})) ' members']);
set(handles.pathchooser,'UserData',ud);
catch
msgbox({'Selection has been canceled. ';'Will leave data unchanged.'});
end
function pushbutton_rename1_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
ud.pattern = cellstr(ud.pattern);
currentVal1 = get(handles.pulldown_c1,'Value');
newName = inputdlg('Rename','Enter new Name',1,{ud.pattern{currentVal1}});
if ~isempty(newName)
ud.pattern{currentVal1} = newName{:};
set(handles.pathchooser,'UserData',ud);
slider1_Callback(hObject, eventdata, handles)
end
function pushbutton_rename2_Callback(hObject, eventdata, handles)
ud = get(handles.pathchooser,'UserData');
ud.pattern = cellstr(ud.pattern);
currentVal1 = get(handles.pulldown_c2,'Value');
newName = inputdlg('Rename','Enter new Name',1,{ud.pattern{currentVal1}});
if ~isempty(newName)
ud.pattern{currentVal1} = newName{:};
set(handles.pathchooser,'UserData',ud);
slider1_Callback(hObject, eventdata, handles)
end