% Program MeltingCurveAnalysis slouží pro analýzu spekter při denaturačních
% experimentech DNA.
% Vstup: csv soubor který uživateli posky spektrofotometr.
% Výstupem jsou termodynamické parametry a vykreslené grafy, jejichž
% hodnoty je možné exportovat jako csv.

function varargout = MeltingCurveAnalysis(varargin)

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @MeltingCurveAnalysis_OpeningFcn, ...
                   'gui_OutputFcn',  @MeltingCurveAnalysis_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end

function MeltingCurveAnalysis_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);
% Inicializace počáteční podoby gui při spuštění.
set(handles.text12,'visible','off');
set(handles.Approx2E,'visible','off');
set(handles.text1,'visible','off');
set(handles.Approx3E,'visible','off');
set(handles.uipanel3,'visible','off');
set(handles.uipanel5,'visible','off');
axes(handles.axes1);
grid on
title('Spektrum absorbancí','FontSize',11,'FontWeight','bold');
xlabel('Vlnová délka [nm]');
ylabel('Absorbance');
axes(handles.axes2);
grid on
title('Křivka tání','FontSize',11,'FontWeight','bold');
xlabel('Teplota[°C]');
ylabel('Absorbance');
axis tight
axes(handles.axes3);
title('Přeškálovaná křivka tání','FontSize',11,'FontWeight','bold');
xlabel('Teplota[°C]');
ylabel('\theta');
grid on
axis tight
zobraz_vysledky(1,'','', handles);
clear all
clc
function varargout = MeltingCurveAnalysis_OutputFcn(hObject, eventdata, handles) 

varargout{1} = handles.output;
















%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obsluha talčítka Otevři soubor. Uživatel si vybere csv soubor, který se 
% objeví v listboxu. Umožňuje multiple selection. Inicializace řetězce s
% uloženými daty pro jednotlivé grafy a jejich termodynamické parametry.

function OpenFilePB_Callback(hObject, eventdata, handles)
global cesta nazev master_str 
[nazev,cesta]= uigetfile('*.csv', 'Otevřít zdrojový csv soubor', 'MultiSelect', 'on');
if(~iscell(nazev))
    nazev = cell({nazev}); 
end
if (nazev{1} ~= 0)
for zz = 1:length(nazev);
        a = get(handles.FileListbox, 'String');
        x = [cesta nazev{zz}];
        [m n] = size(a);
        show = a;
        noadd = 0;
        for i = 1:m
            if strcmp(a{i},x)==1
                set(handles.FileListbox, 'Value',i);
                noadd = 1;
                break
            end
        end
        if noadd ~= 1
    [val sss] = size(get(handles.FileListbox, 'String'));
%      master_str{val+1}.poradi = val+1;
     master_str{val+1}.mat_x = [];
     master_str{val+1}.mat_y = [];
     master_str{val+1}.teplota = [];
     master_str{val+1}.theta = [];
     master_str{val+1}.zarovnana_mat_y = [];
     master_str{val+1}.vysl_vln_delka = [];
     master_str{val+1}. Tm_teplota = [];
     master_str{val+1}.enthalpy = [];  
     show{m+1} = x;
     set(handles.FileListbox, 'String', show);
     set(handles.FileListbox, 'Value',val+1);
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
























function StopWvlE_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


function Approx2E_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function FileListbox_Callback(hObject, eventdata, handles)

function FileListbox_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end




















function StartVwlE_Callback(hObject, eventdata, handles)

function StartVwlE_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function StopWvlE_Callback(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

















%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obsluha prvního tlačítka použít, který provede analýzu v rozmezí zadaných
% vlnových délek. Vykreslí všechny grafy a zobrazí výsledné hodnoty.

function Pouzit1PB_Callback(hObject, eventdata, handles)
cla(handles.axes2);
legend(handles.axes2,'visible','off');
cla(handles.axes3);
legend(handles.axes3,'visible','off');
global parametr master_str val zarovnana_mat_y  leg vysl_vln_delka actg2 actg3
parametr = 1;
val = get(handles.FileListbox, 'Value');
jou = length(val);
actg2 = val;
actg3 = val;
for i = 1:jou
    [mat_x, mat_y] = RozdeleniCsv(master_str,val(i),0,0,handles);
    master_str{val(i)}.mat_x = mat_x;
    master_str{val(i)}.mat_y = mat_y;
    [teplota] = nalezeni_teploty (master_str,val(i),handles);
    master_str{val(i)}.teplota = teplota;
end
hold off
for i = 1:jou
    [index_vln_delka, vysl_vln_delka] = nalezeniVlnDelky(master_str,parametr,val(i), handles);
    master_str{val(i)}.vysl_vln_delka = vysl_vln_delka;
    [zarovnana_mat_y] = zarovnani(index_vln_delka, master_str,val(i), handles);
    master_str{val(i)}.zarovnana_mat_y = zarovnana_mat_y;
    axes(handles.axes2);
    [polynom,leg] = KrivkaTani(master_str,val(i),0, handles); 
    [Theta] = theta(polynom, master_str,val(i), handles);
    master_str{val(i)}.theta = Theta;
end
hold off
for i = 1:jou
    axes(handles.axes3);
    theta_plot(leg,master_str,val(i),handles);
    [Tm_teplota, enthalpy] = parametry( 0,master_str,val(i), handles);
    master_str{val(i)}. Tm_teplota = Tm_teplota;
    master_str{val(i)}.enthalpy = enthalpy;
end
hold off
zobraz_vysledky(0,master_str,leg, handles);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



















function ThisWvlE_Callback(hObject, eventdata, handles)

function ThisWvlE_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end















%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obsluha druhého tlačítka použít, který provede analýzu pro konkrétní 
% zadanou vlnovou délku. Vykreslí všechny grafy a zobrazí výsledné hodnoty.

function Pouzit2PB_Callback(hObject, eventdata, handles)
cla(handles.axes2);
legend(handles.axes2,'visible','off');
cla(handles.axes3);
legend(handles.axes3,'visible','off');
global parametr master_str val zarovnana_mat_y  leg vysl_vln_delka actg2 actg3
parametr = 2;
val = get(handles.FileListbox, 'Value');
jou = length(val);
actg2 = val;
actg3 = val;
for i = 1:jou  
    [mat_x, mat_y] = RozdeleniCsv(master_str,val(i),0,0,handles);
    master_str{val(i)}.mat_x = mat_x;
    master_str{val(i)}.mat_y = mat_y;
    [teplota] = nalezeni_teploty (master_str,val(i),handles);
    master_str{val(i)}.teplota = teplota;
end
hold off
for i = 1:jou
    [index_vln_delka, vysl_vln_delka] = nalezeniVlnDelky(master_str,parametr,val(i), handles);
    master_str{val(i)}.vysl_vln_delka = vysl_vln_delka;
    [zarovnana_mat_y] = zarovnani(index_vln_delka, master_str,val(i), handles);
    master_str{val(i)}.zarovnana_mat_y = zarovnana_mat_y;
    axes(handles.axes2);
    [polynom,leg] = KrivkaTani(master_str,val(i),0, handles); 
    [Theta] = theta(polynom, master_str,val(i), handles);
    master_str{val(i)}.theta =Theta;
hold on
end
hold off
for i = 1:jou
   axes(handles.axes3);
   theta_plot(leg,master_str,val(i),handles);
   [Tm_teplota, enthalpy] = parametry(0, master_str,val(i), handles);
   master_str{val(i)}. Tm_teplota = Tm_teplota;
   master_str{val(i)}.enthalpy = enthalpy;
hold on
end
hold off
zobraz_vysledky(0,master_str,leg, handles);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%











%tlačítka smazat graf
function Clear1PB_Callback(hObject, eventdata, handles)
global actg1
actg1 = [];
cla(handles.axes1);

function Clear2PB_Callback(hObject, eventdata, handles)
global actg2
actg2 = [];
cla(handles.axes2);
legend(handles.axes2,'visible','off');

function Clear3PB_Callback(hObject, eventdata, handles)
global actg3
actg3 = [];
cla(handles.axes3);
legend(handles.axes3,'visible','off');










%tlačítko aktualizovat graf, překreslí aktuální soubor dat vybraný v
%listboxu
function ActAxes1PB_Callback(hObject, eventdata, handles)
global master_str
val = get(handles.FileListbox, 'Value');
tt = length(val);
if tt ==1
    [mat_x, mat_y] = RozdeleniCsv(master_str,val,1,0,handles);
else
    warndlg('Zvolte jen jeden zdrojový soubor', 'Chyba');
end



















%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% talčítko pro změnu aproximace u druhého grafu polynomem. Při změně stupně
% polynomu se k druhému grafu vykreslí i aproximující polynom, což umožní
% uživateli mít pod kontrolou obsluhu přesnosti analýzy. Také dojde k
% aktualizaci třetího grafu s funkcí Theta a k přepocítání výsledných
% termodynamických parametrů.

function Approx2E_Callback(hObject, eventdata, handles)
cla(handles.axes2);
set(legend(handles.axes2,'visible','off'));
global master_str parametr
    val = get(handles.FileListbox, 'Value');
    jou = length(val);
    hold off   
for i = 1:jou
     [index_vln_delka, vysl_vln_delka] = nalezeniVlnDelky(master_str,parametr,val(i), handles);
     master_str{val(i)}.vysl_vln_delka = vysl_vln_delka;
     [zarovnana_mat_y] = zarovnani(index_vln_delka, master_str,val(i), handles);
     master_str{val(i)}.zarovnana_mat_y = zarovnana_mat_y;
     axes(handles.axes2);
     [polynom,leg] = KrivkaTani(master_str,val(i),1, handles); 
     [Theta] = theta(polynom, master_str,val(i), handles);
     master_str{val(i)}.theta = Theta;
     hold on
end
    hold off

for i = 1:jou
    axes(handles.axes3);
    theta_plot(leg,master_str,val(i),handles);
    [Tm_teplota, enthalpy] = parametry( 0,master_str,val(i), handles);
    master_str{val(i)}. Tm_teplota = Tm_teplota;
    master_str{val(i)}.enthalpy = enthalpy;
end
hold off
zobraz_vysledky(0,master_str,leg, handles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Tlačítko pro změnu aproximace polynomem pro třetí graf. Dojde k
%překreslení třetího grafu, kde se kkromě aktuální fukce Theta zobrazí i
%aktuálně zvolený polynom. Také dojde ke změně výsledných parametrů v
%tabulce. Tato aproximace se používá pro získání derivace v bodě Tm při
%výpočku enthalpie.

function Approx3E_Callback(hObject, eventdata, handles)
cla(handles.axes3);
legend(handles.axes3,'visible','off');
global leg master_str 
val = get(handles.FileListbox, 'Value');
jou = length(val); 
for i = 1:jou
     [Tm_teplota, enthalpy] = parametry( 1,master_str,val(i), handles);
     master_str{val(i)}. Tm_teplota = Tm_teplota;
     master_str{val(i)}.enthalpy = enthalpy;
 hold on
end
hold off
zobraz_vysledky(0,master_str,leg, handles);
function Approx3E_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


















%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Obsluha tlačítka změň aproximaci u druhého grafu. Pokud není zobrazeno
% pole edit pro změnu aproximace, tak ze kliknutím na toto tlačítko zobrazí
% a naopak. Dojde  k překreslení druhého a třetího grafu a ke změně 
% výslednýcho hodnot v tabulce.

function Approx2PB_Callback(hObject, eventdata, handles)
global master_str parametr
if strcmp(get(handles.text12,'visible'),'off')
    set(handles.text12,'visible','on');
    set(handles.Approx2E,'visible','on');
    set(handles.uipanel3,'visible','on');   
else
    set(handles.text12,'visible','off');
    set(handles.Approx2E,'visible','off');
    set(handles.uipanel3,'visible','off');
    val = get(handles.FileListbox, 'Value');
    jou = length(val);
      hold off
    for i = 1:jou
        [index_vln_delka, vysl_vln_delka] = nalezeniVlnDelky(master_str,parametr,val(i), handles);
        master_str{val(i)}.vysl_vln_delka = vysl_vln_delka;
        [zarovnana_mat_y] = zarovnani(index_vln_delka, master_str,val(i), handles);
        master_str{val(i)}.zarovnana_mat_y = zarovnana_mat_y;
        axes(handles.axes2);
        [polynom,leg] = KrivkaTani(master_str,val(i),0, handles); 
        [Theta] = theta(polynom, master_str,val(i), handles);
        master_str{val(i)}.theta = Theta;
    hold on
    end
    hold off
for i = 1:jou
    axes(handles.axes3);
    theta_plot(leg,master_str,val(i),handles);
    [Tm_teplota, enthalpy] = parametry( 0,master_str,val(i), handles);
    master_str{val(i)}. Tm_teplota = Tm_teplota;
    master_str{val(i)}.enthalpy = enthalpy;
end
hold off
zobraz_vysledky(0,master_str,leg, handles);
end

function Approx3PB_Callback(hObject, eventdata, handles)
%  Obsluha tlačítka změň aproximaci u třetího grafu. Pokud není zobrazeno
% pole edit pro změnu aproximace, tak ze kliknutím na toto tlačítko zobrazí
% a naopak. Dojde k překreslení třetího grafu a přepočítání
% termodynamických parametrů.

global master_str leg 
if strcmp(get(handles.text1,'visible'),'off')
    set(handles.text1,'visible','on');
    set(handles.Approx3E,'visible','on');
    set(handles.uipanel5,'visible','on');
else 
    set(handles.text1,'visible','off');
    set(handles.Approx3E,'visible','off');
    set(handles.uipanel5,'visible','off');
    val = get(handles.FileListbox, 'Value');
    jou = length(val);
    for i = 1:jou 
        axes(handles.axes3);
        theta_plot(leg,master_str,val(i),handles);
        parametry(0, master_str, val(i), handles);
        hold on
    end
hold off
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%












%Obsluha tlačítek pro export dat. Soubor pro export je typu csv.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Export1PB_Callback(hObject, eventdata, handles)
%Exportovat první graf
global master_str actg1
val = actg1;
if length(val) ==1
        d = datestr(now, 'yyyy-mmm-dd-HH-MM-SS');
        nazevX = [d 'Spektrum']; 
        [FileName,PathName] = uiputfile('*.csv','Uložit soubor',nazevX);
        if FileName ~=0
        nazev = [PathName FileName];
        data = [master_str{val}.mat_x master_str{val}.mat_y];
        csvwrite(nazev,data);
        end
else
    warndlg('Chyba - není vykreslený graf', 'Chyba');
end

function Export2PB_Callback(hObject, eventdata, handles)
%Exportovat druhý graf
global master_str leg actg2
val = actg2;
naag = 'KrivkaTani.csv';
datay =  1;
export(leg, master_str,val,datay, naag)

function Export3PB_Callback(hObject, eventdata, handles)
%exportovat třetí graf
global master_str leg actg3
val = actg3; 
datay = 2;
naag = 'Theta.csv';
export(leg, master_str,val, datay, naag)











% Obsluha tlačítek zvětšit graf. Při kliknutí na tlačítko u daného grafu
% se otevře nové okno, které se může maximalizovat, a dále upravovat.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function MaxAxes1PB_Callback(hObject, eventdata, handles)
% obsluha tlačítka zvětšit první graf
global master_str actg1
val = actg1;
if ~isempty(val)
    figure(1)
    [k,l_mat_y] = size(master_str{val}.mat_y);
    ColorSet = varycolor(k);             
    for j = 1:l_mat_y                       
    plot(master_str{val}.mat_x,master_str{val}.mat_y(:,j),'Color',ColorSet(j,:));
    hold on
    end
hold off
grid on
title('Spektrum absorbancí')
xlabel('Vlnové délka [nm]')
ylabel('Absorbance')  
else
     warndlg('Chyba - není vykreslený graf', 'Chyba');
end


function MaxAxes2PB_Callback(hObject, eventdata, handles)
%obsluha tlačítka zvětšit druhý graf
global master_str actg2
val = actg2;
if ~isempty(val)
    figure(2)
    jou = length(val);
    for i = 1:jou
    KrivkaTani(master_str, val(i),0, handles);   
    end
else
     warndlg('Chyba - není vykreslený graf', 'Chyba');
end

function MaxAxes3PB_Callback(hObject, eventdata, handles)
%obsluha tlačítka zvětšit třetí graf
global master_str leg actg3
val = actg3;
if ~isempty(val)
    figure(3)
    jou = length(val);
    for i = 1:jou
        theta_plot(leg,master_str,val(i),handles)
    end
else
     warndlg('Chyba - není vykreslený graf', 'Chyba');
end



