

function  [ANNourREF,fullSkelet,signalOUT,rsBest,lowLengthBestEEE,highLengthBestEEE] = eeeDetection(nSignals,sfreq,lowLengthEee1,lowLengthEee2,highLengthEee1,highLengthEee2,rsEEee1,rsEEee2)
%Funkcja pobiera:
%nSignals - tablice zawierajaca sygnaly EOG, EEG, EMG (moze wiec miec od 1 do 3 kolumn), 
%sfreq - czestotliwosc probkowania, 
%stepLn - krok wyszukiwania czasu RS
%dolnadlugosc, gornadlugosc - wartosci minimalnej i maksymalnej szerokosci
%"zalamkow" czyli przebic EKG w sygnalach EOG, EEG i EMG (ustalone na
%sztywno, wziete z najlepszego szkieletu EKG)

%Otrzymujemy:
%ANNourREF - Nowe, optymalne wg naszego bruteforca anotacje (fullSkelet po
%removeOutliers).
%fullSkelet - pelny szkielet przed usunieciem smieci
%bestSnKtory - index sygnalu, ktorego szkielet okazal sie najlepszy (output chwilowy, pomocny przy rysowaniu wykresu)
                                                                           
   
    celsOfBest2 = cell(400,6); %inicjalizacja macierzy roboczej. Jest to macierz w ktorej beda zbierane wszystkie wyniki posrednie dzialania bruteforce'a.
    counterek=1;
   
    
    stepRS=abs(rsEEee2-rsEEee1);
    stepLOW=abs(lowLengthEee2-lowLengthEee1);
    stepHIGH=abs(highLengthEee2-highLengthEee1);
    
    for eeeIndex=1:size((nSignals),2)
        

        for lowg=rsEEee1:stepRS:rsEEee2   %bruteforce poszukujacy optymalnej granicy dolnej dlugosci trwania przebicia EKG (w probkach)highg
            for lowlength=lowLengthEee1:stepLOW:lowLengthEee2 
                for highlength=highLengthEee1:stepHIGH:highLengthEee2   
                        

                        highg = 1-lowg;
                        Rvalue = QRSParameters(nSignals(:,eeeIndex),lowg,highg,lowlength,highlength,2); %pikifound - wszystkie spadki wykryte przy danym zestawie parametrow
 
                        celsOfBest2(counterek,1)={Rvalue}; %wszystkie wykryte deceleracje
                        celsOfBest2(counterek,2)={Rvalue}; %powtorka powyzszego
                        celsOfBest2(counterek,3)={eeeIndex}; %powtorka powyzszego
                        
                        celsOfBest2(counterek,4)={lowg}; %dolna granica dlugosci RS (w probkach)
                        celsOfBest2(counterek,5)={lowlength}; %powtorka powyzszego
                        celsOfBest2(counterek,6)={highlength}; %powtorka 
                        counterek=counterek+1;

                end
            end
        end
    end
    
    
    tabliceSzkieletow2=zeros(size(celsOfBest2(:,1),1),1); %inicjalizacja nowej macierzy roboczej. Beda w niej zbierane tylko dlugosci (!) gotowych szkieletow (po oczyszczeniu za pomoca removeOutliers).
    
    for iter=1:size(celsOfBest2(:,1)) %przejscie po wszystkich otrzymanych zbiorach deceleracji

        A = cell2mat(celsOfBest2(iter,1)); %zamiana formatu, aby umozliwic dalsze obliczenia

        if(isempty(A)) %gdy brak wykrytych anotacji nadajacych sie na szkielet, to dlugosc szkieletu = 0
            ANNour=[];
        else
            ANNour = removeOutliers(A(:,1),sfreq); %usuniecie smieci ze zbioru deceleracji w celu uzyskania szkieletu (tzn. "pewnych" deceleracji)
        end
        
        
      
        if(isempty(ANNour)) %gdy brak wykrytych anotacji nadajacych sie na szkielet, to dlugosc szkieletu = 0
            tabliceSzkieletow2(iter)=0;
        else
            tabliceSzkieletow2(iter)=size(ANNour,1); %wpisujemy dlugosc powstalego szkieletu

        end
        celsOfBest2(iter,1)={ANNour};      %wpisanie poprawnych szkieletow do macierzy roboczej


    end    
    
    [~,I] = max(tabliceSzkieletow2); %poszukiwanie najdluzszego (czyt. najlepszego) szkieletu
   
    
 
    lowLengthBestEEE = cell2mat(celsOfBest2(I(1,1),5));
    highLengthBestEEE = cell2mat(celsOfBest2(I(1,1),6));
    rsBest = cell2mat(celsOfBest2(I(1,1),4)); %odczytanie granicy dolnej dlugosci odcinka RS, dla ktorej otrzymalismy ostateczny, najlepszy (najdluzszy) szkielet
    signalOUT = nSignals(:,cell2mat(celsOfBest2(I(1,1),3)));
    ANNourREF = cell2mat(celsOfBest2(I(1,1),1)); %ostateczna anotacja
    fullSkelet = cell2mat(celsOfBest2(I(1,1),2)); %pelna lista deceleracji (przed removeOutliers) z ktorej powstal ostateczny szkielet
    if(~isempty(fullSkelet)) 
        fullSkelet = fullSkelet(:,1);
    end

    
	if(isempty(ANNourREF)) %Kolo ratunkowe na wypadek braku jakichkolwiek wykryc we wczesniejszych krokach.
		ANNourREF = QRSParameters(nSignals(:,1),0.1,0.9,4,10,0); %Jako ostateczna anotacje wstawiamy wszystkie deceleracje wykryte przy najbardziej liberalnych granicach.
        ANNourREF = ANNourREF(:,1);
	end
    
    if size(ANNourREF,1) < 3 %Kolo ratunkowe na wypadek super-krotkich wykrytych anotacji ostatecznych.
		ANNourREF = QRSParameters(nSignals(:,1),0.1,0.9,4,10,0); %Jako ostateczna anotacje wstawiamy wszystkie deceleracje wykryte przy najbardziej liberalnych granicach.
        ANNourREF = ANNourREF(:,1);
    end
end