function [pozice_vychylky,vychylky,polohy_Q,polohy_S,hodnoty_Q,hodnoty_S] = reprezent_vychylka(polohy_R,hodnoty_R,kolisani,data)
%REPREZENT_VYCHYLKA Vypočítá velikost reprezentativní výchylky
%   Detailed explanation goes here

vychylky = [];
polohy_Q = [];
hodnoty_Q = [];
polohy_S = [];
hodnoty_S = [];
pozice_vychylky = [];

ulozeni_polohy_R=polohy_R;
ulozeni_hodnoty_R=hodnoty_R;
ulozeni_kolisani=kolisani;

for lead=2:4
    
polohy_R=ulozeni_polohy_R;
hodnoty_R=ulozeni_hodnoty_R;
kolisani=ulozeni_kolisani;
signal = data; 
fvz = 500;                            % vzorkovaci frekvence
signal = signal(:,lead);         % vybereme svod
l = length (signal); 

size_signal = size(signal);
if size_signal(1)>=size_signal(2)       
    signal=signal';                    % transformace signálu
end


    if lead==2
        polohy_R=polohy_R.I(2:(end-1)); % pouze od 2. do předposledního R, aby byla jistota, že nalezneme i Q nebo S u toho samého komplexu
        hodnoty_R=hodnoty_R.I(2:(end-1));
        kolisani=kolisani.I;
    elseif lead==3
        polohy_R=polohy_R.III(2:(end-1));
        hodnoty_R=hodnoty_R.III(2:(end-1));
        kolisani=kolisani.III;
    else
        polohy_R=polohy_R.II(2:(end-1));
        hodnoty_R=hodnoty_R.II(2:(end-1));
        kolisani=kolisani.II;
    end
    

%--------------------------------------------------------------------------
% detekce Q 
%--------------------------------------------------------------------------
 hodnoty_Q=[];  
 polohy_Q=[];
 % for cyklus s oknem zacinajicim 25 vzorku a koncici 5 pred kazdym kmitem R
for i=1:(length(polohy_R))
   if polohy_R(i)>25
        pom1_Q=((polohy_R(i)-25):(polohy_R(i)-5)); 
        pom2_Q=(signal(pom1_Q));
        [hodnota_Q,poloha_Q] = min(pom2_Q);  
        poloha_Q = polohy_R(i)-25+poloha_Q;
        hodnoty_Q = [hodnoty_Q, hodnota_Q];
        polohy_Q = [polohy_Q, poloha_Q];   

   end
  end
 
%--------------------------------------------------------------------------
% detekce S 
%--------------------------------------------------------------------------
 hodnoty_S=[];  
 polohy_S=[];
 % for cyklus s oknem zacinajicim 5 vzorku a koncici 40 za kazdym kmitem R
for i=1:(length(polohy_R))
   if polohy_R(i)<(l+40)
        pom1_S=((polohy_R(i)+5):(polohy_R(i)+40)); 
        pom2_S=(signal(pom1_S));
        [hodnota_S,poloha_S] = min(pom2_S);        
        hodnota1_S = min(signal((polohy_R(i)+5+poloha_S-4):(polohy_R(i)+5+poloha_S+10)));      
        hodnoty_S = [hodnoty_S hodnota1_S];        % uloz hodnotu maxima
        
        for k_S=(polohy_R(i)+poloha_S-4):(polohy_R(i)+poloha_S+10)
            if signal(k_S)==hodnota1_S
                  poloha1_S=k_S;
                  break
            else
                poloha1_S=poloha_S+polohy_R(i)+5;
            end
        end
     
        polohy_S = [polohy_S, poloha1_S];
  
   end    
end


%--------------------------------------------------------------------------
%zjištění výchylek kmitů od izolinie

dR=length(polohy_R);
dQ=length(polohy_Q);
dS=length(polohy_S);

vych_R=[];
for zR=1:dR

     
     if hodnoty_R(zR)>kolisani(polohy_R(zR)) %R je kladné
         vych_R(zR)=abs(hodnoty_R(zR)-kolisani(polohy_R(zR)));
     else
         vych_R(zR)=0;
     end
     
end

vych_Q=[];
for zQ=1:dQ


    if hodnoty_Q(zQ)<kolisani(polohy_Q(zQ)) %Q je záporné
         vych_Q(zQ)=abs(hodnoty_Q(zQ)-kolisani(polohy_Q(zQ)));
    else
         vych_Q(zQ)=0;
    end
     
end

vych_S=[];
for zS=1:dS


    if hodnoty_S(zS)<kolisani(polohy_S(zS)) %S je záporné
         vych_S(zS)=abs(hodnoty_S(zS)-kolisani(polohy_S(zS)));
    else
         vych_S(zS)=0;
    end
     
end

% cyklus pro zjištění výsledké výchylky v každém QRS komplexu
minimum=min([dR dQ dS]);
vysledna_vychylka=[];
for e=1:(minimum)
    if polohy_S(e)>polohy_R(e)
        
        if polohy_Q(e)<polohy_R(e)  
    
            vysledna_vychylka(e) = vych_R(e)-vych_Q(e)-vych_S(e);
       
        end
      
    end
end

% uložení výsledků
if lead==2
    polohy_Q_I=polohy_Q;
    hodnoty_Q_I=hodnoty_Q;
    polohy_S_I=polohy_S;
    hodnoty_S_I=hodnoty_S;
    vychylky_I=vysledna_vychylka;
    pozice_vychylky_I=polohy_R;
elseif lead ==3
    vychylky_III=vysledna_vychylka;
    polohy_Q_III=polohy_Q;
    hodnoty_Q_III=hodnoty_Q;
    polohy_S_III=polohy_S;
    hodnoty_S_III=hodnoty_S;
    pozice_vychylky_III=polohy_R;
else
    vychylky_II=vysledna_vychylka;
    polohy_Q_II=polohy_Q;
    hodnoty_Q_II=hodnoty_Q;
    polohy_S_II=polohy_S;
    hodnoty_S_II=hodnoty_S;
    pozice_vychylky_II=polohy_R;
end

end

polohy_Q = struct('I',polohy_Q_I,'II',polohy_Q_II,'III',polohy_Q_III);
hodnoty_Q = struct('I',hodnoty_Q_I,'II',hodnoty_Q_II,'III',hodnoty_Q_III);
polohy_S = struct('I',polohy_S_I,'II',polohy_S_II,'III',polohy_S_III);
hodnoty_S = struct('I',hodnoty_S_I,'II',hodnoty_S_II,'III',hodnoty_S_III);

%--------------------------------------------------------------------------
%cyklus pro uložení pouze těch výchylek, které se nacházejí ve všech třech
%svodech současně
delka_I=length(vychylky_I);
delka_II=length(vychylky_II);
delka_III=length(vychylky_III);

[X,Y]=min([delka_I delka_II]); %X je maximum, Y je jeho pozice

    v=1;
    while v<=X
        if pozice_vychylky_II(v)>(pozice_vychylky_I(v)-10)&& pozice_vychylky_II(v)<(pozice_vychylky_I(v)+10)
        
        elseif pozice_vychylky_II(v)<(pozice_vychylky_I(v))
            
            pozice_vychylky_II=[pozice_vychylky_II(1:(v-1)) pozice_vychylky_II((v+1):end)];
            vychylky_II=[vychylky_II(1:(v-1)) vychylky_II((v+1):end)];
            v=v-1;
            X=X-1;
        elseif pozice_vychylky_II(v)>(pozice_vychylky_I(v)) 
        
            pozice_vychylky_I=[pozice_vychylky_I(1:(v-1)) pozice_vychylky_I((v+1):end)];
            vychylky_I=[vychylky_I(1:(v-1)) vychylky_I((v+1):end)];
            v=v-1;
            X=X-1;
       
        end
        v=v+1;
    end
 
% ošetření aby souhlasily počty výchylek ze všech svodů
delka_I=length(vychylky_I);
delka_II=length(vychylky_II);
delky=[delka_I delka_II];
[vetsi,pozice] = max(delky);
mensi = min([delka_I delka_II]);
rozdil=vetsi-mensi;
if rozdil>0
    if pozice==1
        vychylky_I=vychylky_I(1:end-rozdil);
    else
        vychylky_II=vychylky_II(1:end-rozdil);
    end
end
    
vychylky = struct('I',vychylky_I,'II',vychylky_II,'III',vychylky_III);
pozice_vychylky = struct('I',pozice_vychylky_I,'II',pozice_vychylky_II,'III',pozice_vychylky_III);


end

