close all;
clear all;
clc;
%*************************************************************************
%*  Peter Miščík
%*  Program KompresDNA - kompresia sekvencie
%*  vstup - *.komdan, *.komdnal
%*  výstup - DNA sekvencia
%*************************************************************************
uloz = input('Zadajte názov súboru k dekompresii s príponou genbit: ','s');
uloz1 = strcat(uloz,'.komdna'); % otvorenie vstup. retazca
uloz2 = strcat(uloz,'.komdnal'); % otvorenie suboru s dlzkami
fid=fopen(uloz1,'r'); % otvorenie skomprimovanej DNA sekvencie
commat=fread(fid,'uint8');
fclose(fid);
load(uloz2,'-mat');
str=sprintf('\nPrebieha dekompresia...');
disp(str)
zvysok=dlzky(end-1:end);
if zvysok(2)~=0     % uprava vstup. retazca
    Z=dec2bin(zvysok(1),zvysok(2));
    dlzky=dlzky(1:end-2);
    commat=dec2bin(commat)';
    commat=reshape(commat,1,length(commat)*8);
    commat=strcat(commat,Z);
else
    dlzky=dlzky(1:end-2);
    commat=dec2bin(commat)';
    commat=reshape(commat,1,length(commat)*8);
end

compress='';
a=1;
i=1;
j=1;
k=0;

while i<=length(dlzky)  % rozdelenie vstupneho retazca
    popka=dlzky(i);
    odd=mod(dlzky(i),2);
    if odd==1
        for k=1:((dlzky(i)-27)/10)
            compress{a}=commat(j:j+26);
            a=a+1;
            j=j+27;
        end
    else
        compress{a}=commat(j:j+dlzky(i)-1);
        a=a+1;
        j=j+dlzky(i);
    end
i=i+1;    
end

seqi='';
alpha = 'ACGT';
code = ({'00','01','10','11'});

for i=1:length(compress) % dekodovanie retazca
    if cellfun('length',compress(i))==27
        p=seqi;
        if length(seqi)>2^14
            p=seqi(end-2^14+1:end);
        end
        if compress{i}(1)=='1'  % dekodovanie 27 bit. retazcov
            str=p(bin2dec(compress{i}(2:15)):bin2dec(compress{i}(2:15))+14);
            str=fliplr(str);
        else
            str=p(bin2dec(compress{i}(2:15)):bin2dec(compress{i}(2:15))+14);
        end
        pos=bin2dec(compress{i}(16:19));    % urcenie pozicie editacnej operacie
        alfa=decode(compress{i}(20:21));    % znak zameny
        if pos~=0
            str(pos)=alfa;
        end
        pos=bin2dec(compress{i}(22:25));
        alfa=decode(compress{i}(26:27));
        if pos~=0
            str(pos)=alfa;
        end
        seqi=strcat(seqi,str);
    else
        for j=1:2:cellfun('length',compress(i))
            idx = find(strcmp(compress{i}(j:j+1),code));
            seqi = strcat(seqi,alpha(idx));
        end
    end
end

str=sprintf('\nDekompresia je ukončena.');
disp(str)

seqtool(seqi); % vypisanie sekvencie do sequence tool 
