function clustering
% MYGUI Brief description of GUI.
%       Comments displayed at the command line in response 
%       to the help command.

% (Leave a blank line following the help.)

figure_clustering = figure('Visible','off',...
    'MenuBar','none',...
    'Toolbar','none',...
    'Name','Clusteing',...
    'Position',[500,500,800,600]);

MenuFile = uimenu(... %Menu File
                  'Parent',figure_clustering,...
                  'Label','Soubor',...
                  'HandleVisibility','callback');

PrintmenuItem = uimenu(...       % Print menu item
                        'Parent',MenuFile,...
                        'Label','Tisk',...
                        'HandleVisibility','callback', ...
                        'Callback', @PrintMenuitemCallback);
CloseenuItem = uimenu(...       % Print menu item
                        'Parent',MenuFile,...
                        'Label','Konec',...
                        'Separator','on',...
                        'HandleVisibility','callback', ...
                        'Callback', @push_konec_Callback);
AnamnezaItem = uimenu(...       % Print menu item
                        'Parent',figure_clustering,...
                        'Label','Pacientska data',...
                        'Separator','on',...
                        'Enable','off',...
                        'HandleVisibility','callback', ...
                        'Callback', @push_Pacientska_data_Callback);                   
                    
panel_vstup = uipanel('Parent',figure_clustering,...
    'Title','Volba vstupu a zobrazení',...
    'Units','pixels',...
    'Position',[30 30 200 150]);
                    
    pop_up_vstup = uicontrol(panel_vstup,...
        'Style','PopUpMenu',...
        'String',{'AF-a. femoralis','AP-a. poplitea',...
        'ATP-a. tibialis posterior','LEG-AF+AP+ATP'},...
        'Value',1,...
        'Position',[10 110 180 20],...
        'HandleVisibility','callback', ...
        'CallBack',@pop_up_vstup_Callback);  
 
    % button group
panel_zobrazeni = uibuttongroup('visible','off',...
        'Units','pixels',...
        'Pos',[40 60 180 65]);
    % Create three radio buttons in the button group.
    radio_2D = uicontrol('Parent',panel_zobrazeni,...
        'Style','Radio',...
        'String','Zobrazení pomocí 2 HK',...
        'Pos',[5 40 160 15],...
        'Value',1,...
        'HandleVisibility','off');
    radio_3D = uicontrol('Parent',panel_zobrazeni,...
        'Style','RadioButton',...
        'String','Zobrazení pomocí 3 HK',...
        'Position',[5 5 160 15],...
        'HandleVisibility','off');
% Initialize button groupu 
set(panel_zobrazeni,'SelectionChangeFcn',@select_radio);
set(panel_zobrazeni,'SelectedObject',radio_2D); 
set(panel_zobrazeni,'Visible','on');

panel_tlacitka = uipanel('Parent',figure_clustering,...
    'Title','Ovládací prvky',...
    'Units','pixels',...
    'Position',[250 30 200 150]);

    push_clustering = uicontrol(panel_tlacitka,...
        'Style','PushButton',...
        'String','Clustering',...
        'Enable','on',...
        'Position',[40 80 120 40],...
        'CallBack',{@push_clustering_CallBack});

    push_konec = uicontrol(panel_tlacitka,...
        'Style','PushButton',...
        'String','Konec',...
        'Position',[40 15 120 40],...
        'Callback',{@push_konec_Callback});

panel_vysledky = uipanel('Parent',figure_clustering,...
    'Title','Výsledky klasifikace',...
    'Units','pixels',...
    'Position',[470 30 300 150]);

    spravne_txt = uicontrol(panel_vysledky,'Style','Text',...
        'String','Počet správných klasifikací',...
        'Position',[30 100 150 15],...
        'HorizontalAlignment','Left');
    nespravne_txt = uicontrol(panel_vysledky,'Style','Text',...
        'String','Počet nesprávných klasifikací',...
        'HorizontalAlignment','Left',...
        'Position',[30 80 150 15]);
    chybovost_txt = uicontrol(panel_vysledky,'Style','Text',...
        'String','Chybovost',...
        'HorizontalAlignment','Left',...
        'Position',[30 60 150 15]);
    senzitivita_txt = uicontrol(panel_vysledky,'Style','Text',...
        'String','Senzitivita',...
        'HorizontalAlignment','Left',...
        'Position',[30 40 150 15]);
    specificita_txt = uicontrol(panel_vysledky,'Style','Text',...
        'String','Specificita',...
        'HorizontalAlignment','Left',...
        'Position',[30 20 150 15]);
    % Textove hlasky
    spravne_num = uicontrol(panel_vysledky,'Style','Text',...
        'String','0',...
        'HorizontalAlignment','Right',...
        'Position',[230 100 40 15]);
    nespravne_num = uicontrol(panel_vysledky,'Style','Text',...
        'String','0',...
        'HorizontalAlignment','Right',...
        'Position',[230 80 40 15]);
    chybovost_num = uicontrol(panel_vysledky,'Style','Text',...
        'String','0%',...
        'HorizontalAlignment','Right',...
        'Position',[230 60 40 15]);
    senzitivita_num = uicontrol(panel_vysledky,'Style','Text',...
        'String','0%',...
        'HorizontalAlignment','Right',...
        'Position',[230 40 40 15]);
    specificita_num = uicontrol(panel_vysledky,'Style','Text',...
        'String','0%',...
        'HorizontalAlignment','Right',...
        'Position',[230 20 40 15]);
% grafy
axes_tren = axes('parent',figure_clustering,...
    'Units','pixels', ...
    'HandleVisibility','callback', ...
    'Position',[80 250 300 300]);
axes_test = axes('parent',figure_clustering,...
    'Units','pixels', ...
    'HandleVisibility','callback', ...
    'Position',[460 250 300 300]);


%% Pocatecni inicializace dat
% Assign the GUI a name to appear in the window title.
set(figure_clustering,'NumberTitle','off','Name','Clustering');
% Move the GUI to the center of the screen.
movegui(figure_clustering,'center');
% Make the GUI visible.
set([figure_clustering,push_clustering,panel_zobrazeni,radio_2D,radio_3D,...
    push_konec,spravne_txt,nespravne_txt,chybovost_txt,senzitivita_txt,...
    specificita_txt,spravne_num,nespravne_num,chybovost_num,...
    senzitivita_num,specificita_num,axes_tren,axes_test,...
    pop_up_vstup,panel_vstup,panel_tlacitka,panel_vysledky],'Units','normalized');

%Set GUI Color
% defaultBackground = get(0,'defaultUicontrolBackgroundColor');
defaultBackground = [.8 .8 .8];
set(figure_clustering,'Color',defaultBackground);

set(figure_clustering,'Visible','on');
global misto trenovaci testovaci;
TREN_MAT = load(fullfile('data matlab','TREN_MAT_AVG.mat'));
TEST_MAT = load(fullfile('data matlab','TEST_MAT_AVG.mat'));
trenovaci = TREN_MAT.trenovaci;
testovaci = TEST_MAT.testovaci; clear ('TREN_MAT','TEST_MAT');
handles.misto = 'a. femoralis';
handles.test_vstup = testovaci.test_AF;
handles.tren_vstup = trenovaci.tren_AF;
handles.ID_tren = trenovaci.ID_tren_AF;
handles.ID_test = testovaci.ID_test_AF;
handles.provedena_klasifikace = 0;
misto = handles.misto;

%% Pop-up vybrani vstupu
function pop_up_vstup_Callback(hObject, eventdata)
n=get(hObject,'Value');
switch n
    case 1 %AF 
        handles.misto = 'a. femoralis';
        handles.test_vstup = testovaci.test_AF;
        handles.tren_vstup = trenovaci.tren_AF;
        handles.ID_tren = trenovaci.ID_tren_AF;
        handles.ID_test = testovaci.ID_test_AF;
        handles.provedena_klasifikace = 0;
    case 2 %AP
        handles.misto = 'a. poplitea';
        handles.test_vstup = testovaci.test_AP;
        handles.tren_vstup = trenovaci.tren_AP;
        handles.ID_tren = trenovaci.ID_tren_AP;
        handles.ID_test = testovaci.ID_test_AP;
        handles.provedena_klasifikace = 0;
    case 3 %ATP
        handles.misto =  'a. tibialis posterior';
        handles.test_vstup = testovaci.test_ATP;
        handles.tren_vstup = trenovaci.tren_ATP;
        handles.ID_tren = trenovaci.ID_tren_ATP;
        handles.ID_test = testovaci.ID_test_ATP;
        handles.provedena_klasifikace = 0;
    case 4 %AF+AP+ATP
        handles.misto =  'AF+AP+ATP';
        handles.test_vstup = testovaci.test_LEG;
        handles.tren_vstup = trenovaci.tren_LEG;
        handles.ID_tren = trenovaci.ID_tren_LEG;
        handles.ID_test = testovaci.ID_test_LEG;
        handles.provedena_klasifikace = 0;
end
set(push_clustering,'Enable','on'); 
set(AnamnezaItem,'Enable','off');
misto = handles.misto;
end

%% Clustering
function push_clustering_CallBack(hObject, eventdata)
global ID_tren ID_test IDX test_vstup tren_vstup;

test_vstup = handles.test_vstup;
tren_vstup = handles.tren_vstup;
ID_tren = handles.ID_tren;
ID_test = handles.ID_test;

%     [IDX(:,misto_n),C]=kmeans(vstup,3,'distance','cityblock','start',start(misto_n+2*(misto_n-1):3*misto_n,1:3,:),...
%         'emptyaction','drop','replicates',size(start,3));
%     [IDX(:,misto_n)] = classify(vstup,tren,zarazeni_train,'linear'); %diaglinear 25,20,20 WO 31,20,19
IDX = knnclassify(test_vstup,tren_vstup,ID_tren(:,end), 1,...
'euclidean','nearest'); %13,10,11 chyba !!!
%     IDX(:,misto_n) = clusterdata(vstup,'distance','chebychev','linkage','weighted',...
%         'maxclust',3,'criterion','distance');
handles.IDX = IDX;
% Zobrazeni trenovaci mnoziny 2D a (3D)
new = get(get(panel_zobrazeni,'SelectedObject'),'String');      
switch new
    case 'Zobrazení pomocí 2 HK'
        axes(axes_tren);
        vstup_o = tren_vstup(ID_tren(:,size(ID_tren,2))==1,:); % kolečka
        plot(vstup_o(:,1),vstup_o(:,2),'ob');
        hold on;
        vstup_x = tren_vstup(ID_tren(:,size(ID_tren,2))==2,:); % kříky
        plot(vstup_x(:,1),vstup_x(:,2),'xm');
        vstup_v = tren_vstup(ID_tren(:,size(ID_tren,2))==3,:); % trojuhelnicky
        plot(vstup_v(:,1),vstup_v(:,2),'vk');
        
        hold off; grid on;
        legend('Zdraví','Stenózy','S uzávěry');
        set(legend,'Units','normalized','Orientation','horizontal',...
        'Position',[0.375 0.32 0.3 0.02]);
        xlabel('Prvni HK'); ylabel('Druha HK');        
        title(['Zobrazeni tren. mnoziny - ',handles.misto]);
        
        % Zobrazeni testovaci mnoziny
        axes(axes_test);
        vstup_or = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX==1,:); % správně klasifikovaná kolecka zelene
        plot(vstup_or(:,1),vstup_or(:,2),'go');
        hold on;
        vstup_xr = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX==2,:); % správně klasifikované krizky zelene
        plot(vstup_xr(:,1),vstup_xr(:,2),'gx');
        vstup_vr = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX==3,:); % správně klasifikované trojuhelnicky zelene
        plot(vstup_vr(:,1),vstup_vr(:,2),'gv');

        vstup_ow = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX~=1,:); % patně klasifikovaná kolečka cervene
        plot(vstup_ow(:,1),vstup_ow(:,2),'ro');
        vstup_xw = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX~=2,:); % patně klasifikované kříky cervene
        plot(vstup_xw(:,1),vstup_xw(:,2),'rx');
        vstup_vw = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX~=3,:); % správně klasifikované trojuhelnicky zelene
        plot(vstup_vw(:,1),vstup_vw(:,2),'rv');
        
        grid on; hold off; rotate3d off;
        xlabel('Prvni HK');
        ylabel('Druha HK');        
        title(['Klasifikace test. mnoziny - ',handles.misto]);
        
    case 'Zobrazení pomocí 3 HK'
        axes(axes_tren);
        vstup_o = tren_vstup(ID_tren(:,size(ID_tren,2))==1,:); % kolečka
        plot3(vstup_o(:,1),vstup_o(:,2),vstup_o(:,3),'ob');
        hold on;
        vstup_x = tren_vstup(ID_tren(:,size(ID_tren,2))==2,:); % kříky
        plot3(vstup_x(:,1),vstup_x(:,2),vstup_x(:,3),'xm');
        vstup_v = tren_vstup(ID_tren(:,size(ID_tren,2))==3,:); % trojuhelnicky
        plot3(vstup_v(:,1),vstup_v(:,2),vstup_v(:,3),'vk');
        
        xlabel('První HK'); ylabel('Druhá HK'); zlabel('Tretí HK')  ;         
        hold off; grid on;
        legend('Zdraví','Stenózy','S uzávěry');
        set(legend,'Units','normalized','Orientation','horizontal','Position',[0.375 0.32 0.3 0.02]);
        title(['Zobrazeni tren. mnoziny - ',handles.misto]);
        
        % Zobrazeni testovaci mnoziny
        axes(axes_test);
        vstup_or = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX==1,:); % správně klasifikovaná kolecka zelene
        plot3(vstup_or(:,1),vstup_or(:,2),vstup_or(:,3),'go');
        hold on;
        vstup_xr = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX==2,:); % správně klasifikované krizky zelene
        plot3(vstup_xr(:,1),vstup_xr(:,2),vstup_xr(:,3),'gx');
        vstup_vr = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX==3,:); % správně klasifikované trojuhelnicky zelene
        plot3(vstup_vr(:,1),vstup_vr(:,2),vstup_vr(:,3),'gv');

        vstup_ow = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX~=1,:); % patně klasifikovaná kolečka cervene
        plot3(vstup_ow(:,1),vstup_ow(:,2),vstup_ow(:,3),'ro');
        vstup_xw = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX~=2,:); % patně klasifikované kříky cervene
        plot3(vstup_xw(:,1),vstup_xw(:,2),vstup_xw(:,3),'rx');
        vstup_vw = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX~=3,:); % správně klasifikované trojuhelnicky zelene
        plot3(vstup_vw(:,1),vstup_vw(:,2),vstup_vw(:,3),'rv');
        
        grid on; hold off; rotate3d on;
        xlabel('První HK'); ylabel('Druhá HK'); zlabel('Tretí HK')  ;       
        title(['Klasifikace test. mnoziny - ',handles.misto]);    
end

mistakes = sum(IDX~=ID_test(:,size(ID_test,2)));

set(spravne_num,'String',num2str(size(ID_test,1)-mistakes)); % správné klasifikace
set(nespravne_num,'String',num2str(mistakes)); % chyby
set(chybovost_num,'String',[num2str(fix(10000*mistakes/size(ID_test,1))/100),'%']); % chybovost se zaokrouhlením na 2 des. místa

%Urceni senzitvity a specificity
TP = sum(ID_test(:,size(ID_test,2))==3&IDX==3);
TN = sum(ID_test(:,size(ID_test,2))==1&IDX==1);
FP = sum(ID_test(:,size(ID_test,2))==2&IDX==3)+sum(ID_test(:,size(ID_test,2))==1&IDX==3);
FN = sum(ID_test(:,size(ID_test,2))==2&IDX==1)+sum(ID_test(:,size(ID_test,2))==3&IDX==1);

senzitivita = TP/(TP+FN);
specificita = TN/(TN+FP);
set(senzitivita_num,'String',[num2str(fix(10000*senzitivita)/100),'%']); % senzitivita
set(specificita_num,'String',[num2str(fix(10000*specificita)/100),'%']); % specificita

handles.provedena_klasifikace = 1;
set(AnamnezaItem,'Enable','on');
guidata(hObject,handles);
end

%% Fce zobrazeni po selectu radiobuttonu
function select_radio(hObject,eventdata)
new = get(get(hObject,'SelectedObject'),'String');  
if handles.provedena_klasifikace
    test_vstup = handles.test_vstup;
    tren_vstup = handles.tren_vstup;
    ID_tren = handles.ID_tren;
    ID_test = handles.ID_test;
    IDX = handles.IDX;
    switch new
        case 'Zobrazení pomocí 2 HK'
            axes(axes_tren);
            vstup_o = tren_vstup(ID_tren(:,size(ID_tren,2))==1,:); % kolečka
            plot(vstup_o(:,1),vstup_o(:,2),'ob');
            hold on;
            vstup_x = tren_vstup(ID_tren(:,size(ID_tren,2))==2,:); % kříky
            plot(vstup_x(:,1),vstup_x(:,2),'xm');
            vstup_v = tren_vstup(ID_tren(:,size(ID_tren,2))==3,:); % trojuhelnicky
            plot(vstup_v(:,1),vstup_v(:,2),'vk');
        
            legend('Zdraví','Stenózy','S uzávěry');
            set(legend,'Units','normalized','Orientation','horizontal',...
            'Position',[0.375 0.32 0.3 0.02]);

            xlabel('Prvni HK'); ylabel('Druha HK');        
            hold off; grid on;
            title(['Zobrazeni tren. mnoziny - ',handles.misto]);
        % Zobrazeni testovaci mnoziny
            axes(axes_test);
            vstup_or = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX==1,:); % správně klasifikovaná kolecka zelene
            plot(vstup_or(:,1),vstup_or(:,2),'go');
            hold on;
            vstup_xr = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX==2,:); % správně klasifikované krizky zelene
            plot(vstup_xr(:,1),vstup_xr(:,2),'gx');
            vstup_vr = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX==3,:); % správně klasifikované trojuhelnicky zelene
            plot(vstup_vr(:,1),vstup_vr(:,2),'gv');

            vstup_ow = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX~=1,:); % patně klasifikovaná kolečka cervene
            plot(vstup_ow(:,1),vstup_ow(:,2),'ro');
            vstup_xw = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX~=2,:); % patně klasifikované kříky cervene
            plot(vstup_xw(:,1),vstup_xw(:,2),'rx');
            vstup_vw = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX~=3,:); % správně klasifikované trojuhelnicky zelene
            plot(vstup_vw(:,1),vstup_vw(:,2),'rv');
            
            grid on; hold off; rotate3d off;
            xlabel('Prvni HK'); ylabel('Druha HK');        
            title(['Klasifikace test. mnoziny - ',handles.misto]);
        case 'Zobrazení pomocí 3 HK'
            axes(axes_tren);
            vstup_o = tren_vstup(ID_tren(:,size(ID_tren,2))==1,:); % kolečka
            plot3(vstup_o(:,1),vstup_o(:,2),vstup_o(:,3),'ob');
            hold on;
            vstup_x = tren_vstup(ID_tren(:,size(ID_tren,2))==2,:); % kříky
            plot3(vstup_x(:,1),vstup_x(:,2),vstup_x(:,3),'xm');
            vstup_v = tren_vstup(ID_tren(:,size(ID_tren,2))==3,:); % trojuhelnicky
            plot3(vstup_v(:,1),vstup_v(:,2),vstup_v(:,3),'vk');
        
            legend('Zdraví','Stenózy','S uzávěry');
            set(legend,'Units','normalized','Orientation','horizontal',...
            'Position',[0.375 0.32 0.3 0.02]);

            xlabel('První HK'); ylabel('Druhá HK'); zlabel('Tretí HK')  ;         
            hold off; grid on;
            title(['Zobrazeni tren. mnoziny - ',handles.misto]);
        % Zobrazeni testovaci mnoziny
            axes(axes_test);
            vstup_or = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX==1,:); % správně klasifikovaná kolecka zelene
            plot3(vstup_or(:,1),vstup_or(:,2),vstup_or(:,3),'go');
            hold on;
            vstup_xr = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX==2,:); % správně klasifikované krizky zelene
            plot3(vstup_xr(:,1),vstup_xr(:,2),vstup_xr(:,3),'gx');
            vstup_vr = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX==3,:); % správně klasifikované trojuhelnicky zelene
            plot3(vstup_vr(:,1),vstup_vr(:,2),vstup_vr(:,3),'gv');

            vstup_ow = test_vstup(ID_test(:,size(ID_tren,2))==1&IDX~=1,:); % patně klasifikovaná kolečka cervene
            plot3(vstup_ow(:,1),vstup_ow(:,2),vstup_ow(:,3),'ro');
            vstup_xw = test_vstup(ID_test(:,size(ID_tren,2))==2&IDX~=2,:); % patně klasifikované kříky cervene
            plot3(vstup_xw(:,1),vstup_xw(:,2),vstup_xw(:,3),'rx');
            vstup_vw = test_vstup(ID_test(:,size(ID_tren,2))==3&IDX~=3,:); % správně klasifikované trojuhelnicky zelene
            plot3(vstup_vw(:,1),vstup_vw(:,2),vstup_vw(:,3),'rv');
            
            grid on; hold off; rotate3d on;
            xlabel('První HK'); ylabel('Druhá HK'); zlabel('Tretí HK')  ;       
            title(['Klasifikace test. mnoziny - ',handles.misto]);    
    end
guidata(hObject,handles);
end
    
end

%% Tisk prostredi GUI
function PrintMenuitemCallback(hObject, eventdata)
    % Callback function run when the Print menu item is selected    
        printdlg(figure_clustering);
end
%% Spusteni programu anamneza pacientska data
function push_Pacientska_data_Callback(hObject, eventdata)
    % Callback function run when the Print menu item is selected    
        run Anamneza ;
end

%% Ukonceni programu
function push_konec_Callback(hObject, eventdata)
    selection = questdlg('Opravdu si prejete ukoncit program?',...
                         'Ukonceni programu',...
                         'Yes','No','Yes');
    switch selection,
       case 'Yes',
         close('Clustering'); clear all; close all; clc;
       case 'No'
         return
    end
end

% konecny end figure GUI
end