function [ vysledek] = fce_hledaniprekryvu(data, NR, metrika, minm, maxm,prah)
%VSTUPNÍ PROMĚNNÉ
% data - vstupní čtení ve formátu FASTA
% NR - zvolena numerická reprezentace: 1 - rozbalená fáze, 2 - Z-křivka,3 -kumulovaná fáze 4 - tetrahedronová reorezentace
% metrika - 1 - 'pearson' (Pearsonův korelační koeficient), 2 - 'spearman' (Spearmanův korelační koeficient)
% minm - minimalni delka prekryvu
% maxm - maximalni delka prekryvu
% prah - prah pro dosazeni prekryvu (min. 0.7)
% VÝSTUPNÍ PROMĚNNÁ
%- tabulka s vysledky

% PRIKLAD: fce_hledaniprekryvu('50-cteni-delka-100-chybovost 0.5 % prekryv 20.fasta', 4,'pearson', 10, 50, 0.75)

% Funkce hledá na základě zadaných parametrů překryvy mezi čteními, která
% jsou načtená z formátu fasta. Pro hledání překryvů se používá zvolená
% numerická reprezentace a metrika. Překryvy se hledají z obou stran čtení,
% testuje se překryv o minimální po maximální nastavené délce.
% Výstupní proměnná obsahuje pozice a délky nalezených překryvů (dále také informace o vybrané numerické reprezentaci,
% počtu srovnávaných čtení a jejich délce)
%%
%NAČTENÍ DAT
[~,sekvence]=fastaread(data);
pocet_cteni=length(sekvence);
 %% PŘEVEDENÍ DO ZVOLENÉ NUMERICKÉ REPREZENTACE
[signal,r,nazev]=prevod_NR(sekvence,NR); % koeficient r udava rozmer signalu
prah=r*prah; % minimalni pozadovane skore prekyvu
%% VYTVOŘENÍ DVOU PRACOVNÍCH SEKVENCÍ S PREKRYVEM, SROVNANI JEDNOTLIVYCH PREKRYVU
%inicializace
score_max1=0;
score_max2=0;
score_1=zeros(1,r);
score_2=zeros(1,r);
tabulka_score1=zeros(pocet_cteni);% tabulka, do které se bude ukládat nejlepší skóre překryvu pro každé čtení
tabulka_score2=zeros(pocet_cteni);% tabulka, do které se bude ukládat nejlepší skóre překryvu pro každé čtení
tabulka_delkaprekryvu1=zeros(pocet_cteni);% tabulka, do které se bude ukládat délka nejlépe vyhodnoceného překryvu pro každé čtení
tabulka_delkaprekryvu2=zeros(pocet_cteni);% tabulka, do které se bude ukládat délka nejlépe vyhodnoceného překryvu pro každé čtení
prekryv1=0;
prekryv2=0;
for k=1:pocet_cteni 
    s1=signal{1,k}; % 1. porovnávané čtení 
    delka_cteni(k)=length(s1);
    for l=1:pocet_cteni
    s2=signal{1,l}; %2.porovnávané čtení
    if k==l || l<k %neprovádim srovnání dvou stejných sekvencí, nebo sekvencí, které se již srovnávaly
        continue
    end
    l1=length(s1);
    l2=length(s2);
      for m=minm:maxm % m označuje velikost okna (překryvu), pro které počítáme metriku podobnosti mezi čteními
       % Bere se okno o velikosti m ze začátku prvního porovnávaného čtení a m okno od konce druhého porovnávaného čtení
       % pro výpočet score 1, pro výpočet score 2 okno zabírá konec prvního čtení a začátek druhého čtení
       % velikost okna se pohybuje od minimalni po maximální nastavenou hodnotu
       % v případě trojrozměrného signálu je vypočítána metrika pro každou složku a dále se pracuje se sumou všech hodnot 
            switch metrika
                case {'spearman',2}
                    for o=1:r
        score_1(o)=1-pdist2(s1(o,1:m),s2(o,l2-m+1:l2),'spearman'); %beru okno o velikosti m ze začátku první sekvence a od konce druhé sekvence
        score_2(o)=1-pdist2(s1(o,l1-m+1:l1),s2(o,1:m),'spearman'); %beru okno o velikosti m od konce první sekvence a ze začátku druhé sekvence
                    end
                case {'pearson',1}
                    for o=1:r
        score_1pom=corrcoef(s1(o,1:m),s2(o,l2-m+1:l2)); %beru okno o velikosti m ze začátku první sekvence a od konce druhé sekvence
        score_1(o)=score_1pom(1,2);
        score_2pom=corrcoef(s1(o,l1-m+1:l1),s2(o,1:m)); %beru okno o velikosti m od konce první sekvence a ze začátku druhé sekvence
        score_2(o)=score_2pom(1,2);
                    end
            end 
        score_1=sum(score_1); % v případě vícerozměrného signálu se počítá se sumou metrik
        score_2=sum(score_2);
        if score_1>=score_max1 %srovnání skóre s dosud maximálním dosaženým
        score_max1=score_1;
        prekryv1=m; %velikost překryvu
        end
        if score_2>=score_max2
        score_max2=score_2;
        prekryv2=m; 
        end                       
      end
       tabulka_score1(l,k)=score_max1; 
       tabulka_score2(l,k)=score_max2;
       tabulka_delkaprekryvu1(l,k)=prekryv1;
       tabulka_delkaprekryvu2(l,k)=prekryv2;
       score_max1=0;
       score_max2=0;
    end 
end
% Doplněni tabulek 
 tabulka_score1=tabulka_score1+tabulka_score2';
 tabulka_score2=tabulka_score1';
 tabulka_delkaprekryvu1=tabulka_delkaprekryvu1+tabulka_delkaprekryvu2';
 tabulka_delkaprekryvu2=tabulka_delkaprekryvu1';
%% VYHODNOCENI PREKRYVU 
hodnota_score1=zeros(1,pocet_cteni); %Proměnná k ukládáni nejlepšího skóre překryvu za začátku čtení
hodnota_score2=zeros(1,pocet_cteni); %Proměnná k ukládání nejlepšího skóre překryvu od konce čtení
pozice_prekryvu1=zeros(1,pocet_cteni); %Proměnná k ukládání pozice nejlepšího překryvu pro každou sekvenci
pozice_prekryvu2=zeros(1,pocet_cteni); %Proměnná k ukládání pozice nejlepšího překryvu pro každou sekvenci
pocet_prekryvu1=zeros(1,pocet_cteni); %počet nalezených prekryvů pro každou sekvenci, ukládá se ten nejdelší překryv s nejlepším skóre
pocet_prekryvu2=zeros(1,pocet_cteni); %počet nalezených překryvů pro každou sekvenci
tabulka_score1=round(tabulka_score1,3); % zaokrouhlení, pro dosažení stejného počtu desetinných míst
tabulka_score2=round(tabulka_score2,3);
delka_prekryvu1=zeros(1,pocet_cteni); 
delka_prekryvu2=zeros(1,pocet_cteni);
% Zjištění pozice maximálního překryvu, hledáme překryv s nejlepším skóre,v
% případě více shodných výsledků se detekuje ten nejdelší překryv
 for i=1:pocet_cteni
    maxval1= max(tabulka_score1(:,i));
    maxval2= max(tabulka_score2(:,i));
    hodnota_score1(i)=maxval1;
    hodnota_score2(i)=maxval2;
    idx1 = find(tabulka_score1(:,i)== maxval1);
    idx2 = find(tabulka_score2(:,i)== maxval2);
    pocet_prekryvu1(i)=length(idx1);
    pocet_prekryvu2(i)=length(idx2);
    if length(idx1)>1 && maxval1>=prah 
    [hod,poz]=max(tabulka_delkaprekryvu1(idx1,i));
    pozice_prekryvu1(i)=idx1(poz);
    delka_prekryvu1(i)=hod;
    elseif maxval1<prah
        pozice_prekryvu1(i)=0; %zadny prekryv nedetekujeme
        pocet_prekryvu1(i)=0;
    else
        pozice_prekryvu1(i)=idx1;
        delka_prekryvu1(i)=tabulka_delkaprekryvu1(idx1,i);
    end
    
    if length(idx2)>1 && maxval2>=prah
    [hod,poz]=max(tabulka_delkaprekryvu2(idx2,i));
    pozice_prekryvu2(i)=idx2(poz);
    delka_prekryvu2(i)=hod;
    elseif maxval2<prah
        pozice_prekryvu2(i)=0; %zadny prekryv nedetekujeme
        pocet_prekryvu2(i)=0;
    else
        pozice_prekryvu2(i)=idx2;
        delka_prekryvu2(i)=tabulka_delkaprekryvu2(idx2,i);
    end

 end   
%%
%ZOBRAZENÍ VÝSLEDKŮ
vysledek{1,1}= 'Název použité reprezentace';
vysledek{1,2}= nazev;
vysledek{2,1}= 'Počet čtení';
vysledek{2,2}= pocet_cteni;
vysledek{3,1}= 'Délka jednotlivých čteni';
vysledek{3,2}= delka_cteni;
vysledek{4,1}= 'Číslo čtení';
vysledek{4,2}= 1:pocet_cteni;
vysledek{5,1}= 'Pozice překrývajícího se čtení se začátkem';
vysledek{5,2}= pozice_prekryvu1;
vysledek{6,1}= 'Délka čtení';
vysledek{6,2}= delka_prekryvu1;
vysledek{7,1}= 'Pozice překrývajícího se čtení s koncem';
vysledek{7,2}= pozice_prekryvu2;
vysledek{8,1}= 'Délka čtení';
vysledek{8,2}= delka_prekryvu2;
disp(vysledek)
end
