function detekce_ischemie(pac,metoda)

% Funkce slouží k detekci akutní ischemie v EKG signálu pomocí dvou metod.
% První metodou je analýza deviace ST segmenut na 12svodových záznamech a
% druhá metoda je detekce ischemie pomocí specifických svodů.

% vstupem funkce je číslo pacienta (pac) od 1 do 370
% a druh metody, kterou se chce detekce ischemie provést buď 1 nebo 2
% metoda = 1 - detekce provedena pomocí metody analýzy deviace na 12svodovém záznamu 
% metoda = 2 - detekce provedena pomocí specifických svodů

% výstup funkce není, pouze dojde k vypsání diagnózy, a které svody jsou ischemické a
% zda je celý signál považován jako ischemický či nikoliv

% příklad spuštění: detekce_ischemie(20,1)

% vytvořeno ve verzi MATLAB R2011b

%% inicializace souborů které použity a jejich načtení
load('infarkt.mat') % načtení čísel signálů, kde je diagnostikován infarkt myokardu
load('zdravy.mat')  % načtení čísel signálů, které jsou od zdravých pacientů
load('RECORDS.mat') % načtení souboru obsahující seznam pacientů a názvy signálů

% vynechané signály (nerozměřené)
vynechane=[72, 73, 74, 91, 98, 99, 100, 118, 128, 130, 149, 164, 166, 181, 183,...
    192, 194, 196, 208, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,...
    242, 243, 278, 284, 291, 297, 298, 299, 300, 313, 315, 352, 362, 363, 402,...
    405, 421, 439, 533, 545, 547, 55:60, 89, 90, 92, 138, 139, 169, 170, 171,...
    172, 206, 207, 266, 267, 400, 401, 403, 404, 406, 380, 381, 382];

signaly=sort([infarction healthy]); % použité signály od zdravých a od pacientů s infarktem
signaly=setdiff(signaly,vynechane); % 370 použitých rozměřených signálů (resp. pořadí, které mají v proměnné RECORDS), vynechány ty, které nešly rozměřit

cesta = 'C:\Diplomova_prace\ptbdb\'; % cesta ke složce s databází
pacient = RECORDS{signaly(pac)};  % určení konkrétního pacienta
load([cesta  pacient]) % načítání signálu
load([cesta pacient(1:10) '\anot_' pacient(12:end)]) % načítání rozměřených pozice PK, QRSz a QRSk
header = fopen([cesta pacient(1:end-5) '.hea']); % otevření header souboru
val(13:15,:) = []; % odstranění ortogonálních svodů x,y,z
disp(['Pacient: ' pacient])
% nastavení minimálního procentuálního zastoupení ischemických cyklů,k označení celého svodu jako ischemického 
procenta1 = 50;
procenta2 = 30;
%% úprava signálu
signal=[];
% vyhlazení trojúhelníkovým oknem
L=35; % velikost okna
w = triang(L);

for y = 1:12 % vyhlazení všech 12ti svodů
    signal(y,:)=filter(w,1,val(y,:));
end

% úprava škálování
signal=signal/((L-1)/2);
% převedení do mV
signal=signal/2000;

% odstranění kolísání nulové linie
Fvz = 1000;
Fcut = [0.5 1];  % mezní frekvence propustného a nepropustného pásma
mags = [0 1];    % horní propust
devs = [0.01 0.05];
[n,Wn,beta,ftype] = kaiserord(Fcut,mags,devs,Fvz);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale'); % imp.charakteristika FIR filtru

for z = 1:12 % filtrace každého z 12ti svodů EKG
    signal(z,:)=filter(hh,1,signal(z,:));
end
signal=signal(:,(n/2+18):end); %kompenzace zpoždění

%% zjištění věku, pohlaví, diagnózy
w = 1;
slova = {'# age:' '# sex:' '# Reason for admission:'};
konec = 0;

while konec == 0;  % procházení header souboru řádek po řádku 
    tline = fgetl(header);
    ind = strfind(tline,slova{w});
    if ~isempty(ind)  % pokud nalezeno nějaké z daných slov
        if w == 1     % uložení do určené proměnné
            vek = str2double(tline(8:end));
        elseif w == 2
            pohlavi = tline(8:end);
        else
            diagnoza = tline(25:end);
            konec = 1;
        end
    w = w + 1;
    end
end
fclose('all'); % zavření otevřeného headeru
%% Uložení jednotlivých svodů do konkrétních proměnných
I=signal(1,:);
II=signal(2,:);
III=signal(3,:);
aVR=signal(4,:);
aVL=signal(5,:);
aVF=signal(6,:);
V1=signal(7,:);
V2=signal(8,:);
V3=signal(9,:);
V4=signal(10,:);
V5=signal(11,:);
V6=signal(12,:);
vsechny_svody=[aVL; I; -aVR; II; aVF; III; V1; V2; V3; V4; V5; V6];  % pořadí dle anatomicky následujících svodů

switch metoda % výběr kterou metodou bude detekce provedena
%% Detekce ischemie na 12svodovém záznamu EKG  
    case 1;
        matice = zeros(12,max([length(Pk),length(QRSz),length(QRSk)])-1); % inicializace matice k ukládání zda v daném srdečním cyklu nadprahová nebo podprahová hodnota
        pom_zobrazeni = {'aVL'; 'I'; '-aVR'; 'II'; 'aVF'; 'III'; 'V1'; 'V2'; 'V3'; 'V4'; 'V5'; 'V6'};

        for i = 1:12
            % nastavení prahu
            if strcmp(pohlavi,'male') == 1 % pokud je pacient muž
                if i == 8 || i == 9  % ve svodech V2 a V3 je práh zvýšený na 0,2 mV nebo 0,25 mV dle věku 
                    if vek >= 40
                        prah = 0.2; % mV
                    else
                        prah = 0.25; % mV
                    end
                else % v ostatních svodech nastaven práh 0,1 mV
                    prah = 0.1; % mV
                end
            else % pokud je pacient žena
                if i == 8 || i == 9   % ve svodech V2 a V3 je práh zvýšený na 0,15 mV
                    prah = 0.15; % mV
                else   % jinak práh 0,1 mV
                    prah = 0.1;  % mV
                end
            end
                
            testovany = vsechny_svody(i,:); % výběr testovaného svodu
            
            j = 1;k = 1;l = 2;index = 1;
            while j < length(Pk) % procházení jednotlivých srdečních cyklů
                if (QRSz(k) < QRSk(l)) && (QRSk(l) < Pk(j+1)) && (Pk(j) < QRSz(k)) && (Pk(j) < QRSk(l)) % pokud jsou nadetekovány všechny pozice u konkrétního srdečního cyklu
                    
                    % výběr konkrétních testovacích pozic Pk, QRSz a QRSk
                    Pk_test = Pk(j); 
                    QRSz_test = QRSz(k);
                    QRSk_test = QRSk(l);
                    
                    nulova_linie = mean(testovany(Pk_test:QRSz_test));  % výpočet nulové linie jako průměr z PR segmentu
                    J_80 = testovany(QRSk_test+80);                     % zjištění hodnoty signálu v pozici J+80 ms
            
                    if J_80 > nulova_linie+prah || J_80<nulova_linie-prah % pokud je hodnota v bodě J+80 větší nebo menší než hodnota nulové linie +/- práh
                        matice(i,index)=1;                                % pokud je detekována nadprahová hodnota do matice zápis 1
                    else
                        matice(i,index)=-1;  % pokud není detekována nadprahová hodnota do matice zápis -1
                    end
                        
                    % zvětšení indexů u pozic Pk, QRSz a QRSk (posun k dalšímu srdečnímu cyklu)    
                    j = j+1; 
                    k = k+1;
                    l = l+1;
                    index = index+1;
            
                else
                    if (Pk(j) > QRSz(k)) || (Pk(j) > QRSk(l)) == 1 % pokud chybí detekovaná vlna P (např. při extrasystole)
                        % posunutí indexů QRSz a QRSk
                        k=k+1; 
                        l=l+1;
                        index = index+1; % zvětšení indexu, aby byl přeskočen sloupec v proměnná matice 
                    end
                end   
            end
            
            testovany=[];
            
            % zjištění, zda bude určitý svod stanoven jako ischemický
            if length(matice((matice(i,:)==1))) >= (procenta1/100)*length(matice((matice(1,:)~=0))) % pokud je v daném řádku (svodu) nadprahové množství detekovaných elevaci či depresi ST
                vektor(i) = 1; 
                disp( ['Ve svodu ' pom_zobrazeni{i} ' je detekována nadprahová deviace ST segmentu'])
            else
                vektor(i) = 0;
            end
        end
        
        % zda je ischemie detekována ve dvou po sobě anatomicky následujících svodech
        pom1=0;
        for i=1:11
            if vektor(i)==1 && vektor(i+1)==1
                pom1=1;
            end
        end
        % vypsání výsledku detekce na signálu
        if pom1==0   
            disp('V signálu není ischemie detekována')
            disp(['Diagnóza: ' diagnoza])
        else
            disp('Daný signál je označen jako ischemický')
            disp(['Diagnóza: ' diagnoza])
        end
%% Detekce pomocí specifických svodů
    case 2
        % vytvořená transformačí matice
        transformacni_matice=[-0.428618265083426, -0.0669050141174272, -0.0734378330306220, -0.143094485586649,  1.48060093721257, -0.490334125219240, 0.247323102441385,  0.0193142089662600;...
                               0.277675447096514,  0.193296964873364,  -0.228475875628798,  -0.540747965303788, -0.394064413816093, 0.138789268734097, 0.206890610126268, -0.0504111835540158;...
                               0.321181849870953,  0.943714241647396,  -0.399407484785731,   0.198115938362536, -0.986306882814887, 1.03470166693494, -0.417795491452091, -0.318727700739043];

        svody=[II;III;V1;V2;V3;V4;V5;V6]; % použíté svody
        LAD_LCX_RCA=transformacni_matice*svody; % výpočet svodů pomocí transformační matice

        matice=[];
        matice = zeros(3,max([length(Pk),length(QRSz),length(QRSk)])-1); % inicializace matice k ukládání zda v daném srdečním cyklu nadprahová nebo podprahová hodnota
        pom_zobrazeni1={'LAD'; 'LCx'; 'RCA'};
        
        for i=1:3
            testovany=LAD_LCX_RCA(i,:); % výběr testovaného svodu
    
            % nastavení prahu
            if strcmp(pohlavi,'male') == 1  % pokud je pacient muž
                if i == 1 % u svodu LAD nastaven prah 0,21 mV 
                    prah = 0.21;
                else % u ostatních 0,105 mV
                    prah = 0.105;
                end
            else   % pokud je pacient žena
                if i == 1 % u svodu LAD nastaven prah 0,16 mV 
                    prah = 0.16;
                else % u ostatních 0,1 mV
                    prah = 0.1;
                end
            end
            
            j = 1;k = 1;l = 2;index = 1;
            while j < length(Pk) % procházení jednotlivých srdečních cyklů
                if (QRSz(k) < QRSk(l)) && (QRSk(l) < Pk(j+1)) && (Pk(j) < QRSz(k)) && (Pk(j) < QRSk(l))% pokud jsou nadetekovány všechny pozice u konkrétního srdečního cyklu
                    
                    % výběr konkrétních testovacích pozic Pk, QRSz a QRSk
                    Pk_test = Pk(j);
                    QRSz_test = QRSz(k);
                    QRSk_test = QRSk(l);
                    
                    nulova_linie = mean(testovany(Pk_test:QRSz_test));   % výpočet nulové linie jako průměr z PR segmentu
                    J_80 = testovany(QRSk_test+80);                      % zjištění hodnoty signálu v bodě J+80 ms
                    
                    if J_80 > nulova_linie+prah || J_80<nulova_linie-prah % pokud je hodnota v bodě J+80 větší nebo menší než hodnota nulové linie +/- práh
                        matice(i,index)=1;              % pokud je detekována nadprahová hodnota, do matice zápis 1
                    else
                        matice(i,index)=-1;              % pokud není detekována nadprahová hodnota do matice zápis -1
                    end 
                    
                    % zvětšení indexů u pozic Pk, QRSz a QRSk (posun k dalšímu srdečnímu cyklu)
                    j = j+1;
                    k = k+1;
                    l = l+1;
                    index = index+1;
                else
                    if (Pk(j) > QRSz(k)) || (Pk(j) > QRSk(l)) == 1 % pokud chybí detekovaná vlna P (např. při extrasystole)
                        % posunutí indexů QRSz a QRSk
                        k=k+1;
                        l=l+1;
                        index = index+1;
                    end
                end
            end
            
            testovany=[];
            
            % zjištění, zda bude určitý svod stanoven jako ischemický
            if length(matice((matice(i,:)==1))) >= (procenta2/100)*length(matice((matice(1,:)~=0))) % pokud je v daném řádku (svodu) nadprahové množství detekovaných elevaci či depresi ST segmentu
                pp(i) = 1;
                disp( ['Ve svodu ' pom_zobrazeni1{i} ' je detekována nadprahová deviace ST segmentu'])
            else
                pp(i) = 0;
            end
        end
       
        if sum(pp)>=1 % pokud je ischemie detekována minimálně v jednom svodu, označen celý signál jako ischemický
            disp('Daný signál je označen jako ischemický')
            disp(['Diagnóza: ' diagnoza])
        else
            disp('V signálu není ischemie detekována')
            disp(['Diagnóza: ' diagnoza])
        end
end