%% Bakalářská práce
% Autor: Karolína Němečková
% Téma: Třídění EKG cyklů pomoci shlukové analýzy

clc; clear all; close all;

load('signaly.mat') %Načtení dat 

pvc_detekce = readfis('fuzzy_rozhodovaci_system.fis'); %Načtení fuzzy systému

%% Příprava dat
ANOTACE = UKAZKA_ANOTACE;
pozice_QRS = UKAZKA(:,2);
puvodni_data = UKAZKA(:,1);
vysledek = zeros(size(ANOTACE,1),2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

barva = [1 0 0;0 1 0;0 0 1;1 1 0;1 0 1;0 1 1;0 0 0;1 0.5 0.95];
f1 = figure('Position',[100,100,1000,600]);
fvz = 500;
osaX = 1/fvz:1/fvz:10;



% Vložení funkce pro odstranění těch záznamů u kterých je tepová frekvence pod 30 - chybná detekce QRS
[anAR,p_QRS,data] = odstraneni_maloQRS(ANOTACE,pozice_QRS,puvodni_data);


for i = 1:numel(p_QRS)
    pom = data{i};
    QRS = p_QRS{i};
    RR = zjisteni_RR(QRS,fvz);
    anot = anAR(i,:);
        
    % Funkce obsahující výběr svodu, rozdělení na segmenty a shlukování na základě korelace:
   [signal,signalFF,cyklyKOR,OUTput,OUTclear,QRSnew] = vyber_svodu(pom,QRS,fvz,RR);
    
    
    % Výroba reference, vučí které se budou signály porovnávat při výběu příznaků
    pozice_normalnich_a_ABSV = find(OUTclear==0);
    if isempty(pozice_normalnich_a_ABSV)
        %je to zašuměný signál
        referencni_signal_kratky = sum(cyklyKOR,1)/numel(pozice_normalnich_a_ABSV);
        referencni_signal_dlouhy = sum(signalFF,1)/numel(pozice_normalnich_a_ABSV);
    else
        referencni_signal_kratky = sum(cyklyKOR(pozice_normalnich_a_ABSV,:),1)/numel(pozice_normalnich_a_ABSV);
        referencni_signal_dlouhy = sum(signalFF(pozice_normalnich_a_ABSV,:),1)/numel(pozice_normalnich_a_ABSV);
    end
        
 
        % HOdnoty pro zobrazování
        QRSu = QRS./fvz;
        maxOsa = max(signal)/1000+0.5;  
        minOsa = min(signal)/1000-0.5; 
        % Zobrazení shluků po protním shlukování
        figure(f1)
        subplot 211
        plot(osaX,signal/1000,'LineWidth',1.5)
        ylim([minOsa maxOsa])
        title('Shluky po prvotním shlukování','FontSize',16)
        hold on 
        for k = 1:numel(OUTput')
            line([QRSu(k), QRSu(k)]',[minOsa maxOsa],'Color',barva(OUTput(k)',:),'LineStyle','--','LineWidth',1.5)
        end
        hold off
        xlabel('Čas [s]','FontSize',14)
        ylabel('Napětí [mV]','FontSize',14)

        p = unique(OUTput);


        %% Detekce PVC
        % Označení segmentů, které pokračují do dalšího zpracování
        pozice2ndCLUSTER = find(OUTclear~=1 & OUTclear~=0); 

        if ~isempty(pozice2ndCLUSTER)
           vf = vyber_priznaku(signalFF, cyklyKOR, OUTclear, referencni_signal_dlouhy, RR)';

           OUTput = secondCLUSTERfuzzy(OUTclear, vf,pvc_detekce);
        %    OUTput = secondCLUSTER(OUTput, OUTclear, vf); %výstup je finální roztřídění
        %    0...zbytek
        %    1...ABSV
        %    2...PVC  

           OUTput(OUTput==0) = 2;
        end

        % Zobrazení po detekci PVC
        subplot 212
        plot(osaX,signal/1000,'LineWidth',1.5)
        ylim([minOsa maxOsa])
        title('Shluky po úpravě pomoci fuzzy systému','FontSize',16)
        hold on 
        for k = 1:numel(OUTput')
            line([QRSu(k), QRSu(k)]',[minOsa maxOsa],'Color',barva(OUTput(k)',:),'LineStyle','--','LineWidth',1.5)
        end
        hold off
        xlabel('Čas [s]','FontSize',14)
        ylabel('Napětí [mV]','FontSize',14)

        pause(3)
        %% Tvorba souhrného výsledku
        if sum(OUTput(OUTput==1))
            vysledek(i,1) = 1;  
        end
        if sum(OUTput(OUTput==3))
            vysledek(i,2) = 1; 
        end     
        vysledek(i,3) = anot(1,8);  
        vysledek(i,4) = anot(1,9);  
end
VYSLEDEK = array2table(vysledek,'VariableNames',{'Přítomnost PAC','Přítomnost PVC',...
            'Anotace: Přítomnost PAC','Anotace: Přítomnost PVC'});
        % Falešně positivní PAC jsou v tomto případězpůsobené přítomností
        % atriální fibrilace.
disp(VYSLEDEK)