clear all;
newcolors =[0 0.4470 0.7410         %pořadí barev v grafu
            0 0.4470 0.7410
            0.99 0.5250 0.0580
            0.99 0.5250 0.0580
            0.6350 0.0780 0.1840
            0.6350 0.0780 0.1840];  

% ZMĚŘENÉ PRAVDĚPODOBNOSTI REABSORPCE %
    % ORANGE 240 %
        Oreabs=[10^(-4) 0.639; 10^(-3) 0.4971;10^(-2) 0.2694];    %vypočtené pravděpodobnosti reabsorpce
            errO=[0.054; 0.058; 0.035];                           %odhadovaná absolutní chyba

     % RED 305 %
        Rreabs=[10^(-4) 0.8092; 2*10^(-4) 0.7568;10^(-3) 0.5216;2*10^(-3) 0.4761;10^(-2) 0.3195];
            errR=[0.075; 0.08; 0.045; 0.02; 0.029];

     % COUMARIN 314 %
        Creabs=[10^(-2) 0.2128; 3*10^(-3) 0.4032; 10^(-3) 0.4902; 10^(-4) 0.7291];
            errC=[0.013; 0.053; 0.056;0.01];

% VYPOČTENÉ HODNOTY QA, QC, OPT. ÚČINNOSTI %
    % ORANGE 240 %
        QAO=[10^(-2) 0.2645;10^(-3) 0.1111;10^(-4) 0.0955];         %vypočtené účinnosti absorpce
        QCo=Oreabs;                                                 %výpočet účinnosti kolekce
            QCo(:,2)=(0.99*(1-0.255)*(Oreabs(:,2)))./(1-0.99*(1-0.255)*(1-Oreabs(:,2)));
        optO=[10^(-2) 0.1127;10^(-3) 0.0648;10^(-4) 0.0614];        %vypočtené optické účinnosti

    % RED 305 %
        QAR=[10^(-2) 0.4835;2*10^(-3) 0.2214;10^(-3) 0.1615;2*10^(-4) 0.0938;10^(-4) 0.0833];
        QcR=Rreabs;
            QcR(:,2)=(0.98*(1-0.255)*(Rreabs(:,2)))./(1-0.98*(1-0.255)*(1-Rreabs(:,2)));
        optR=[10^(-2) 0.2244;2*10^(-3) 0.1247;10^(-3) 0.0946;2*10^(-4) 0.0631;10^(-4) 0.0572];

    % COUMARIN 314 %
        QAC=[10^(-2) 0.1466;3*10^(-3) 0.1044; 10^(-3) 0.0832;10^(-4) 0.0518];
        Qcc=Creabs;
            Qcc(:,2)=(0.8*(1-0.255)*(Creabs(:,2)))./(1-0.8*(1-0.255)*(1-Creabs(:,2)));
        optC=[10^(-2) 0.0351;3*10^(-3) 0.039;10^(-3) 0.035;10^(-4) 0.0269];

% KONSTANTY PRO MODEL ABSORPČNÍHO A EMISNÍHO (1. GENERACE) SPEKTRA BARVIVA O240 %    
    % ORANGE 240 %
        absorbO=0;          %konstanty
        emisO=0;
        amplitudeO=1;       %maxima gaussových křivek
        amplitude2O=0.67;
        amplitude3O=0.38;
        amplitude4O=0.17;
        amplitude5O=0.05;           
        centO=526;          %střed gaussovy křivky (vlnová délka)
        cent2O=489;
        cent3O=462;
        stokesO=10.5;       %stokes shift mezi absorpcí a emisí
        stokes2O=577-cent2O;
        stokes3O=160;
        widthO=10;          %šířka gaussovy křivky
        width2O=10;
        width3O=9;
    % RED 305 %
        absorbR=0;
        emisR=0;
        amplitudeR=0.965;
        amplitude2R=0.56;
        amplitude3R=0.3;       
        centR=575; 
        cent2R=534;        
        stokesR=25; 
        stokes2R=110;
        widthR=15; 
        width2R=17;
    % COUMARIN 314 %
        absorbC=0;
        emisC=0;
        amplitudeC=1;
        centC=425;
        stokesC=41; 
        widthC=22; 
                
% CYKLUS PRO VYTVOŘENÍ MODELU SPEKTER JAKO GAUSSOVÝCH KŘIVEK %
% ORANGE 240 %
    for i=1:1000        %vytvoření modelovaného absorpčního a emisního spektra barviva
            absorbO(i)=amplitudeO*exp(-(i*1-centO)^2/(2*widthO^2))+amplitude2O*exp(-(i*1-cent2O)^2/(2*width2O^2))+amplitude4O*exp(-(i*1-cent3O)^2/(2*width3O^2)); 
            emisO(i)=amplitudeO*exp(-(i*1-centO-stokesO)^2/(2*(widthO-1)^2))+amplitude3O*exp(-(i*1-cent2O-stokes2O)^2/(2*(width2O+2)^2))+amplitude5O*exp(-(i*1-cent3O-stokes3O)^2/(2*(width3O+3)^2));
    end

    emis1O=emisO/sum(emisO); %pravděpodobnost emise
    absorb1O=absorbO;
    stepO=logspace(-4,4,101); %rozsah od 10E-4 do 10E4, 101 bodů

% RED 305 %
    for i=1:1000
            absorbR(i)=amplitudeR*exp(-(i*1-centR)^2/(2*widthR^2))+amplitude2R*exp(-(i*1-cent2R)^2/(2*width2R^2)); 
            emisR(i)=0.975*amplitudeR*exp(-(i*1-centR-stokesR)^2/(2*(widthR)^2))+amplitude3R*exp(-(i*1-cent2R-stokes2R)^2/(2*(width2R+7)^2));
    end
    emis1R=emisR/sum(emisR); 
    absorb1R=absorbR;
    stepR=logspace(-4,4,101);

% COUMARIN 314 %
    for i=1:1000
            absorbC(i)=amplitudeC*exp(-(i*1-centC)^2/(2*widthC^2)); 
            emisC(i)=amplitudeC*exp(-(i*1-centC-stokesC)^2/(2*(widthC-4)^2));
    end
    emis1C=emisC/sum(emisC); 
    absorb1C=absorbC;
    stepC=logspace(-4,4,101);

% CYKLUS POČÍTAJÍCÍ SPEKTRÁLNÍ PRAVDĚPODOBNOST REABSORPCE Z MODELU %
% ORANGE 240 %
    for k=1:101
        i=stepO(k);                                                    %spektrální pravděpodobnost reabsorpce dle modelu
        reabs_lambdaO = (1-exp(-2*absorbO*i))./(2*absorbO*i);          %absorb zahrnuje absorpční funkci
        for j=1:1000
            reabs_lambda_spectraO(k,j)=reabs_lambdaO(j)*emis1O(j);     %výpočet pravděpodobnosti reabsorpce z překryvu absorpčního a emisního spektra
         
            if isnan(reabs_lambda_spectraO(k,j))                       %kontrolní část
                reabs_lambda_spectraO(k,j)=0;            
            end           
        end
    end

% RED 305 %
    for k=1:101
        i=stepR(k);
        reabs_lambdaR = (1-exp(-2*absorbR*i))./(2*absorbR*i);
        for j=1:1000
            reabs_lambda_spectraR(k,j)=reabs_lambdaR(j)*emis1R(j);
         
            if isnan(reabs_lambda_spectraR(k,j))
                reabs_lambda_spectraR(k,j)=0;            
            end        
        end
    end

% COUMARIN 314 %
    for k=1:101
        i=stepC(k);
        reabs_lambdaC = (1-exp(-2*absorbC*i))./(2*absorbC*i);    
        for j=1:1000
            reabs_lambda_spectraC(k,j)=reabs_lambdaC(j)*emis1C(j);
         
            if isnan(reabs_lambda_spectraC(k,j))
               reabs_lambda_spectraC(k,j)=0;            
            end           
        end
    end

% CYKLUS PRO VÝPOČET PRŮMĚRNÉ PRAVDĚPODOBNOSTI REABSORPCE %
% ORANGE 240 %
    for k=1:101                         %integrace spektrální pravd. reabsorpce -> průměrná pravděpodobnost reabsorpce
        reabs_averageO(k)=sum(reabs_lambda_spectraO(k,:));
    end

% RED 305 %
    for k=1:101
        reabs_averageR(k)=sum(reabs_lambda_spectraR(k,:));
    end

% COUMARIN 314 %
    for k=1:101
        reabs_averageC(k)=sum(reabs_lambda_spectraC(k,:));
    end

% EXPORT HODNOT MODELU %
%   writematrix(reabs_averageO','reabsorption_averageO.txt');
%   writematrix(stepO','xsteps_logO.txt');
%   writematrix(reabs_averageR','reabsorption_averageR.txt');
%   writematrix(stepR','xsteps_logR.txt');
%   writematrix(reabs_averageC','reabsorption_averageC.txt');
%   writematrix(stepC','xsteps_logC.txt');

% ŠKÁLOVÁNÍ VODOROVNÉHO MĚŘÍTKA MODELU PRAVDĚPODOBNOSTI REABSORPCE %
    % ORANGE 240 %
        scaleO=logspace(-7.8,-0.4,101);
    % RED 305 %
        scaleR=logspace(-8,-0.05,101);
    % COUMARIN 314 %
        scaleC=logspace(-10.37,1.89,101);

% GRAF ZÁVISLOSTI 1-R NA KONCENTRACI, PROLOŽENO MODELEM 1-R %

colororder('default')       %defaultní barvy grafu
tiledlayout(3,1)            %rozdělené zobrazení grafu
nexttile
    errorbar(Creabs(:,1),Creabs(:,2),errC,'o')      %změřené hodnoty s chybpvými intervaly
        set(gca, 'XScale', 'log')                   %vodorovná osa logaritmicky
    hold on
    semilogx(scaleC, reabs_averageC)                %model reabsorpce
        grid
        ylabel("1-R (-)")
        xlabel("c (M)")
        title("Coumarin 314")
        xlim([10^(-6) 10^(-1)])
        set(gca,'FontName','cambria')
nexttile
    errorbar(Oreabs(:,1),Oreabs(:,2),errO,'o')      %to samé pro další barviva
        set(gca, 'XScale', 'log')
    hold on
    semilogx(scaleO, reabs_averageO)
        grid
        legend("Změřená data","Aproximce","AutoUpdate","off")
        ylabel("1-R (-)")
        xlabel("c (M)")
        title("Lumogen Orange 240")
        xlim([10^(-6) 10^(-1)])
        set(gca,'FontName','cambria')
    hold off
nexttile
    errorbar(Rreabs(:,1),Rreabs(:,2),errR,'o')
        set(gca, 'XScale', 'log')
    hold on
    semilogx(scaleR, reabs_averageR)
        grid
        ylabel("1-R (-)")
        xlabel("c (M)")
        title("Lumogen Red 305")
        xlim([10^(-6) 10^(-1)])
        set(gca,'FontName','cambria')
fig=gcf;
fig.Position(3:4)=[600,700];
f=gcf;
exportgraphics(f,'reabs_tiled_all.jpg','Resolution',300)        %export grafu



% APROXIMACE QC, QA A OPT. ÚČINNOSTI %
    % ORANGE 240 %
    Qc_aproxO=(0.99*(1-0.255)*(reabs_averageO(:)))./(1-0.99*(1-0.255)*(1-reabs_averageO(:)));                   %aproximace účinnosti kolekce z modelu
    qao=QAO(:,2);               %hodnoty účinnosti absorpce
    cO=QAO(:,1);                %hodnoty koncentrace barviva vzorků
        myfitO=fittype('1-exp(-k2-k*cO)','dependent',{'qao'},'independent',{'cO'},'coefficients',{'k','k2'});   %fit účinnosti absorpce
        ffO=fit(cO,qao,myfitO,'StartPoint',[1,1]);
        k1O=ffO.k;
        k2O=ffO.k2;
    cOO=logspace(-5,-1,101);    %rozsah hodnot aproximace účinnosti absorpce
        for k=1:101
            Qa_aproxO(k)=1-exp(-k2O-k1O*cOO(k));        %vytvoření matice aproximace účinnosti absorpce
        end
    for m=1:101
        optO_aprox(m)=Qc_aproxO(m)*Qa_aproxO(m);        %aproximace opt. účinnosti
    end

    % RED 305 %
    Qc_aproxR=(0.98*(1-0.255)*(reabs_averageR(:)))./(1-0.98*(1-0.255)*(1-reabs_averageR(:)));
    qaR=QAR(:,2);
    cR=QAR(:,1);
        myfitR=fittype('1-exp(-k2-k*cR)','dependent',{'qaR'},'independent',{'cR'},'coefficients',{'k','k2'});
        ffR=fit(cR,qaR,myfitR,'StartPoint',[1,1]);
        k1R=ffR.k;
        k2R=ffR.k2;
    cRR=logspace(-5,-1,101);
        for k=1:101
            Qa_aproxR(k)=1-exp(-k2R-k1R*cRR(k));
        end
    for m=1:101
        optR_aprox(m)=Qc_aproxR(m)*Qa_aproxR(m);
    end

    % COUMARIN 314 %
    Qc_aproxC=(0.8*(1-0.255)*(reabs_averageC(:)))./(1-0.8*(1-0.255)*(1-reabs_averageC(:)));
    qaC=QAC(:,2);
    cC=QAC(:,1);
        myfit=fittype('1-exp(-k2-k*cC)','dependent',{'qaC'},'independent',{'cC'},'coefficients',{'k','k2'});
        ffC=fit(cC,qaC,myfit,'StartPoint',[1,1]);
        k1C=ffC.k;
        k2C=ffC.k2;
    cCC=logspace(-5,-1,101);
        for k=1:101
            Qa_aproxC(k)=1-exp(-k2C-k1C*cCC(k));
        end
     for m=1:101
       optC_aprox(m)=Qc_aproxC(m)*Qa_aproxC(m);
    end

% GRAF QC, QA A OPT. ÚČINNOSTI %
colororder(newcolors)              %pořadí barev v grafu

tiledlayout(3,1)                   %rozdělené zobrazení grafu
nexttile
semilogx(Qcc(:,1),Qcc(:,2),'s',scaleC,Qc_aproxC,QAC(:,1),QAC(:,2),'x',cCC(:),Qa_aproxC(:),optC(:,1),optC(:,2),'o',cCC(:),optC_aprox(:))
    grid
    xlabel('c (M)')
    ylabel('Q_C (-), Q_A (-), \eta (-)')
    title('Coumarin 314')
    xlim([10^(-5) 10^(-1)])
    ylim([0 1])
    set(gca,'FontName','cambria')
nexttile
semilogx(QCo(:,1),QCo(:,2),'s',scaleO,Qc_aproxO,QAO(:,1),QAO(:,2),'x',cOO(:),Qa_aproxO(:),optO(:,1),optO(:,2),'o',cOO(:),optO_aprox(:))
    grid
    legend('Q_C','Q_C aproximace','Q_A','Q_A aproximace','\eta', '\eta aproximace','Location','bestoutside'),
    xlabel('c (M)'),
    ylabel('Q_C (-), Q_A (-), \eta (-)'),
    title('Lumogen Orange 240'),
    xlim([10^(-5) 10^(-1)])
    set(gca,'FontName','cambria')
nexttile
semilogx(QcR(:,1),QcR(:,2),'s',scaleR,Qc_aproxR,QAR(:,1),QAR(:,2),'x',cRR(:),Qa_aproxR(:),optR(:,1),optR(:,2),'o',cRR(:),optR_aprox(:))
    grid
    xlabel('c (M)')
    ylabel('Q_C (-), Q_A (-), \eta (-)')
    title('Lumogen Red 305')
    xlim([10^(-5) 10^(-1)])
    fig=gcf;
    fig.Position(3:4)=[600,800];
    set(gca,'FontName','cambria')
 f=gcf;
 exportgraphics(f,'aprox_all.jpg','Resolution',300)         %export grafu
