%% Detekce QRS komplexu 
function [Qpoz,Qhod,Rpoz,Rhod,Spoz,Shod,Jpoz,stredy,Tpoz]=rdet(ekg,atr)
%% vyber dat z atr
if length(atr)>10
    delka=length(atr);
    cinzk=1; %cinitel zkraceni atr o nepotrebna data
    for i=1:delka
        if atr(i,1)>12 || atr(i,1)==5 %atr(i,1)==13 || atr(i,1)==14 || atr(i,1)==18 
            %dsa(cinzk,:)=atr(i,:); %kontrolni vypis vyclenenych prvku   
            atr(i:delka-1,:)=atr(i+1:delka,:);
            cinzk=cinzk+1;
        end
    end
    test=isempty(find(atr(:,1)>12,1));
    if test==0
        for i=1:delka
            if atr(i,1)>12 
                atr(i:delka-1,:)=atr(i+1:delka,:);
                cinzk=cinzk+1;
            end
        end
    end
cinzk=cinzk-1;
atr=atr(1:delka-cinzk,:);
pozice=int32(atr(:,3));
pozice=double(pozice);
delka=find(pozice>length(ekg),1);
    if isempty(delka)==1
        delka=length(pozice);
        pozice=pozice(1:delka);
    else
        pozice=pozice(1:delka-1);
    end
end
r=1;    
pr=500;
a=40;
if length(atr)>10 % nalazeni klicovych bodu podle pozic v atr
    r=2;
    pr=find(atr(:,1)==1,2)'; %najde prvna dva radne prubehy
    prp=[pozice(pr(:,1)) pozice(pr(:,2))];
    Rhod(:,1)=max(ekg(prp(1)-30:prp(1)+30));
    Rpoz(:,1)=(find(ekg(prp(1)-30:prp(1)+30)==Rhod(:,1),1))+prp(1)-31;
    Rhod(:,2)=max(ekg(prp(2)-30:prp(2)+30));
    Rpoz(:,2)=(find(ekg(prp(2)-30:prp(2)+30)==Rhod(:,2),1))+prp(2)-31;
    stredy(:,1)=fix(Rpoz(:,1)+(Rpoz(:,2)-Rpoz(:,1))/2);
    delky(:,1)=Rpoz(:,2)-Rpoz(:,1);
    for i=pr(2):length(pozice)-1
        if pozice(i+1)<(Rpoz(r)+delky(r-1)+30) && pozice(i+1)>(Rpoz(r)+delky(r-1)-40)%existuje atr v oblasti predpokladane R
            Rhod(:,r+1)=max(ekg(pozice(i+1)-40:pozice(i+1)+30));%najde pozici R vlny
            Rpoz(:,r+1)=(find(ekg(pozice(i+1)-40:pozice(i+1)+30)==Rhod(:,r+1),1))+pozice(i+1)-31;
            stredy(:,r)=fix(Rpoz(r)+(Rpoz(r+1)-Rpoz(r))/2);
            delky(:,r)=Rpoz(r+1)-Rpoz(r);
        else % nenalezena atr v predpokladane pozici, hledá se v celem EKG cyklu
            e=find(pozice>Rpoz(r)+100,1);%zjisti se, zda je v danem rozsahu atr pozice
            if pozice(e)<(Rpoz(r)+3*fix(sum(delky(r-2:r-1)/2)))% pokud projde nalezena atr v rozsahu EKG cyklu
                %if (max(ekg(pozice(e)-30:pozice(e)+30)))>(0.5*Rhod(r)) % je nebo není R vlna
                    Rhod(:,r+1)=max(ekg(pozice(e)-30:pozice(e)+30));%najde pozici R vlny
                    Rpoz(:,r+1)=find(ekg(pozice(e)-30:pozice(e)+30)==Rhod(:,r+1),1)+pozice(i+1)-31;
                    stredy(:,r)=fix(Rpoz(r)+(Rpoz(r+1)-Rpoz(r))/2);
                    delky(:,r)=Rpoz(r+1)-Rpoz(r);
%                 else
%                 r=r-1; %neprobehlo nalezeni R vlny
%                 end
            else % nenalezena atr, hledá se v predpokladane pozici
                %pozice(i+2:length(pozice)+1)=pozice(i+1:length(pozice));
                r=r-1; 
%                 if max(ekg(Rpoz(r)+fix(sum(delky(r-5:r-1)/5)))-30:Rpoz(r)+delky(r-1)+30))>0.8*Rhod(r)
%                     Rhod(:,r+1)=max(ekg(Rpoz(r)+delky(r-1)-30:Rpoz(r)+delky(r-1)+30));%najde pozici R vlny
%                     Rpoz(:,r+1)=(find(ekg(Rpoz(r)+delky(r-1)-30:Rpoz(r)+delky(r-1)+30)==Rhod(:,r+1),1))+pozice(i+1)-31;
%                     stredy(:,r)=fix(Rpoz(r)+(Rpoz(r)-Rpoz(r+1))/2);
%                     delky(:,r)=Rpoz(r+1)-Rpoz(r);          
%                 else
%                 r=r-1;    
%                 end
            end
        end
        r=r+1;
    end
    %Rpoz=Rpoz-1;
%     dd=find(pozice>length(ekg),1);
%     for i=2:(dd-1)
%         mmax=max(ekg(pozice(i)-10:pozice(i)+20));
%         Rpoz(:,i-1)=(find(ekg(pozice(i)-10:pozice(i)+20)==mmax))+pozice(i)-1;        
%     end
%     
%     Rhod(1,:)=ekg(Rpoz(:,:));
Qpoz=0;Qhod=0;Spoz=0;Shod=0;Jpoz=0;Tpoz=0;
end
if length(atr)<10
  coef=cwt(ekg,4,'mexh');
  poc=50; % odstranení falesne detekce
  str=0.5*max(coef(1:500));
  mx(1)=0;
  for i=1:ceil(length(ekg)/250)+ceil(length(ekg)/2500)%length(ekg)
    if poc+451<length(ekg) % osetreni konecne delky %data jsou dostatecne dlouha
        if isempty(find(coef(poc:poc+451)>str,1))==1 %nelze najít  vrchol (po velkem je maly)
            maxx=max(coef(poc:poc+(1.3*(Rpoz(i-1)-Rpoz(i-2)))));%maximum v coef
            mx(i+1)=find(coef(poc:poc+(1.3*(Rpoz(i-1)-Rpoz(i-2))))==maxx,1)+poc;%pozice maxima
        else
            mx(i+1)=find(coef(poc:poc+451)>str,1)+poc+2;
        end
        Rhod(:,i)=max(ekg(mx(i+1)-10:mx(i+1)+10));
        Rpoz(:,i)=find(ekg(mx(i+1)-10:mx(i+1)+10)==Rhod(:,i))+mx(i+1)-11;
        poc=Rpoz(:,i)+100;
        str=0.4*max(coef(Rpoz(:,i)-5:Rpoz(:,i)+5)); %zmena prahu po kazdeq QRS
    else % nalezeni dat pro kratky usek dat nebo jeho posledi QRS komplex
        if max(coef(poc:end))>str %&& length(coef)<1000 && length(Rpoz)<2
            mx(i+1)=find(coef(poc:end)>str,1)+poc;
            Rhod(:,i)=max(ekg(mx(i+1)-10:mx(i+1)+10));
            Rpoz(:,i)=find(ekg(mx(i+1)-10:mx(i+1)+10)==Rhod(:,i))+mx(i+1)-11;   
        end
    end
  end

pocetR=length(Rpoz);
Rpoz=int32(Rpoz);
Rpoz=double(Rpoz);
%% Nalezení stredu mezi R vlnami
if exist('stredy','var')==0 || length(atr)==1
    for i=1:(pocetR-1)
        stredy(:,i)=fix(Rpoz(i)+(Rpoz(i+1)-Rpoz(i))/2); %najde stred mezi dvojicemi R vln
    end
end
%% Nalezení Q, S(zacatku a minima) a J
der=diff(ekg); %prvni derivace signalu pro hledani J bodu

for i=1:(pocetR)       
    Qp=0;   % hodnoty pro zamezení opakovaného zápisu
    Sp=0;
    Jp=0;
    %Nalezení Q vlny 
    for j=1:70
        if Qp==0
                if ekg(Rpoz(i)-j-1)>ekg(Rpoz(i)-j)
                Qhod(:,i)=ekg(Rpoz(i)-j);
                Qpoz(:,i)=Rpoz(i)-j;
                Qp=1;
            end
        end
   end
   %nalezeni S vlny
   for j=1:70
     if Sp==0
       if ekg(Rpoz(i)+j+1)>ekg(Rpoz(i)+j) %&& ekg(Rpoz(i)+j)<ekg(Rpoz(i))-0.5
         Shod(:,i)=ekg(Rpoz(i)+j);
         Spoz(:,i)=Rpoz(i)+j;
         Sp=1;
       end
     end
   end
   % nalezeni bodu J
   for k=1:20
    if Jp==0;
%       if length(Spoz)>4 && (der((Spoz(:,i))+k)*der((Spoz(:,i))+k+1))<0
%          if k==1
%          plot(1:length(der),ekg(1:1:length(der)),1:length(der),der);
%          hold on 
%          line([Spoz(i) Spoz(i)],[2.5 3],'Color','r');
%          line([Rpoz(i) Rpoz(i)],[2.5 3],'Color','r');
%          pause      
%          close all
%          end
       if (der((Spoz(:,i))+k)*der((Spoz(:,i))+k+1))<0
        Jpoz(:,i)=Spoz(i)+k+1;
        Jp=1;
       else
        Jpoz(:,i)=Spoz(i)+8;
       end
    end
   end 
end
%% nalezeni polohy maxima T vlny
for i=1:length(stredy)
    if (stredy(i)-Spoz(i))>1
        m=max(ekg(Spoz(i)+30:stredy(i)));
        aa=ekg(Spoz(i)+15:stredy(i));
        ind=find(aa==m);
        Tpoz(i)=Spoz(i)+ind-1+15;
    else
        Tpoz(i)=0;
    end
end
end
%konec programu


