function [pom1,pom2,diagnoza] = detekce_ischemie_testovaci_verze(pac)
% Tato funkce slouží k použití u testovacího skriptu, kdy jsou vytvořené
% detektory testovány na všech použitých signálech.
 
% Vstupem funkce je pouze číslo pacienta.

% Výstupy pom1 a pom2 jsou buď 1 nebo 0 v závislosti na pozitivní či 
% negativní detekci. První(detekce na 12ti svodech) či druhou (specifické svody) metodou.
% Výstup diagnoza je podstatný u testovacího skriptu, kde jsou zjišťovány
% správné a falešné detekce.

%% 
load('RECORDS.mat') % načtení souboru obsahující seznam pacientů a názvy signálů
cesta = 'C:\Diplomova_prace\ptbdb\'; % cesta ke složce s databází
signal = RECORDS{pac}; 
load([cesta  signal])  % načítání signálu
load([cesta signal(1:10) '\anot_' signal(12:end)]) % načítání rozměřených pozice PK, QRSz a QRSk
header = fopen([cesta signal(1:end-5) '.hea']); % otevření header souboru
val(13:15,:) = []; % odstranění ortogonálních svodů x,y,z
procenta = 20; % nastavení minimálního procentuálního 
                % zastoupení ischemických cyklů,k označení celého svodu jako ischemického 
%% úprava signálu
signal=[];
% vyhlazení trojúhelníkovým oknem
L=35;
w = triang(L);
for y = 1:12
    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       
            vek = str2double(tline(8:end)); % uložení do určené proměnné
        elseif w == 2
            pohlavi = tline(8:end); % uložení do určené proměnné
        else
            diagnoza = tline(25:end); % uložení do určené proměnné
            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ů

%% Detekce ischemie na 12svodovém záznamu EKG
matice = zeros(12,max([length(Pk),length(QRSz),length(QRSk)])-1);
            
for i = 1:12
    if strcmp(pohlavi,'male') == 1
        if i == 8 || i == 9  % ve svodech V2 a V3 je práh zvýšený na 0,2mV nebo 0,25mV dle věku
            if vek >= 40
                prah = 0.2;
            else
                prah = 0.25;
            end
        else  % v ostatních svodech nastaven práh 0,1 mV
            prah = 0.1;
        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;
        else % jinak práh 0,1 mV
            prah = 0.1;
        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))) >= (procenta/100)*length(matice((matice(1,:)~=0))) % pokud je v daném řádku (svodu) nadprahové množství detekovaných elevaci či depresi ST segmentu
        vektor(i) = 1;
    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 % pokud ischemie ve dvou nasledujících svodech, pom1 je nastaveno na 1
        pom1=1;
    end
end

%% Detekce pomocí specifických svodů


% výpočet svodů pomocí transformační 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
        
for i=1:3
    testovany=LAD_LCX_RCA(i,:);
    
    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))) >= (procenta/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;
    else
        pp(i) = 0;
    end
end

% pokud je ischemie detekována minimálně v jednom svodu, označen celý signál jako ischemický
if sum(pp)>=1
    pom2 = 1;
else
    pom2 = 0;
end