function NLIN_OmoriFigure

% створюємо глобальну змінну TS, куди будуть записуватись дані
global TS; TS.index=0;
global TSTemp; TSTemp.index=0;
TSTemp.f1=0; TSTemp.f2=0; TSTemp.OmoriX=0; TSTemp.OmoriY=0;

% визначаємо поточну розподільчу здатність, встановивши одиниці в PIXELS
set(0,'Units','pixels');
SCREEN_SIZE=get(0,'ScreenSize');
% SCREEN_SIZE = [left bottom width height]
SCRHeight=SCREEN_SIZE(1,4);

% створюємо фігуру розміром 100 x 600, що знаходиться у верхному лівому
% куті з відсутпом у 10 пікселів зверху та зліва
fg=figure('Position',[10,SCRHeight-630,300,600], 'Units','pixels', ...
          'HandleVisibility','on', 'MenuBar','none', 'Name','Omori research', ...
          'Resize','off', 'Tag','WaveLet entropy set properties figure', ...
          'NumberTitle','off', 'DeleteFcn',@DeleteFcn_Callback);
      
% записуємо handle фігури
handles.rootFigure=fg;

% створюємо меню користувача
menuRoot=uimenu('Parent',fg, 'Label','Файл', 'Tag', 'Menu File');
menuTemp=uimenu('Parent',menuRoot, 'Label','Читать', 'Tag','Menu File Load', 'Callback',@MenuFileLoad_Callback);
      
% створюємо статичний текст 
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,575,297,25], ...
          'String','Имеющиеся ряды:', 'FontName','Times New Roman', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо ListBox
handles.ListBoxTS=uicontrol(fg, 'Style','listbox', 'Units','pixels', 'Position',[3,475,297,100], ...
          'String','', 'FontName','Times New Roman', ...
          'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Tag', 'ListBoxTS', 'ListboxTop', 5);

% ==================================================================================================
% створюємо кнопку для вибору ділянки ряду
handles.getSubSeriesbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','getSubSeries', ...
          'Units','pixels', 'Position',[65,430,170,25], 'String','Взять часть ряда', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@getSubSeriesButton_Callback);

% ==================================================================================================
% створюємо статичний текст та випадаючий список для введення множника СКВ
handles.STDKText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
          'Position',[3,400,120,25], 'String','k (*sigma):', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.STDKEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'WTTransformTypeEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[128,400,173,25], ...
          'String','1',...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Value',2);

% створюємо статичний текст та випадаючий список для введення типу функції для розрахунку
handles.FunctionTypeText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
          'Position',[3,375,120,25], 'String','Тип функции:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.FunctionTypeEdit=uicontrol(fg, 'Style','popupmenu', 'Tag', 'WTTransformTypeEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[128,375,173,25], ...
          'String',['n(t)=K*(t+tau)^(-p)'],...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Value',1);

% створюємо статичний текст та edit для введення ймовірності
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,350,225,25], ...
          'String','Вероятность "выброса":', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.probabilityEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'probabilityEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,350,72,25], ...
          'String','0.1', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку показника Оморі
handles.calcPPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcPButton', ...
          'Units','pixels', 'Position',[65,297,170,25], 'String','Рассчитать степень p', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcPButton_Callback);

% ==================================================================================================
% створюємо статичний текст та edit для введення значення початкової ширини вікна
%uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,300,225,25], ...
%          'String','Начальная ширина окна:', ...
%          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
%handles.beginWidthMovingWindowEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'beginWidthMovingWindowEdit', ...
%          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,300,72,25], ...
%          'String','200', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення кроку зміни ширини вікна
%handles.windowMovingText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
%          'Position',[3,275,200,25], 'String','Шаг перемещения окна:', ...
%          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
%handles.windowMovingEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'windowMovingEdit', ...
%          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,275,72,25], ...
%          'String','1', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
% створюємо кнопку для розрахунку динамічної ентропії
%handles.calcWindowOmoriPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcWindowOmoriButton', ...
%          'Units','pixels', 'Position',[65,250,170,25], 'String','Закон Омори в окне', ...
%          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
%          'Callback',@calcWindowOmoriButton_Callback);

% ==================================================================================================
% створюємо кнопку для визначення прямої
%handles.calcWindowOmoriPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcWindowOmoriButton', ...
%          'Units','pixels', 'Position',[55,200,180,25], 'String','Рассчитать наклон прямой', ...
%          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
%         'Callback',@calcCoeffButton_Callback);

% створюємо кнопку для закриття фігур
%handles.calcWindowOmoriPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcWindowOmoriButton', ...
%          'Units','pixels', 'Position',[55,175,180,25], 'String','Закрыть окна', ...
%          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
%          'Callback',@calcCloseWindowsButton_Callback);

guidata(fg,handles);

% =============================================================================================================================
% Функція, що виконується при закритті фігури
function DeleteFcn_Callback(h,eventdata,handles)

% очищення пам"яті, що використовувалась для локальних змінних
global TSTemp;
clear TSTemp;

% =============================================================================================================================
% при натисненні на кнопку "Взять часть ряда"
function getSubSeriesButton_Callback(h,eventdata,handles)

global TSTemp;
global OmoriTempVariable;

OmoriTempVariable=guidata(gcbo);
index=get(OmoriTempVariable.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;
tsOmoriGet(X);

% очищуємо локальні змінні
clear index X;

% =============================================================================================================================
% при натисненні на кнопку "Рассчитать степень p"
function calcPButton_Callback(h,eventdata,handles)

global TSTemp;
global OmoriTempVariable;

handles=guidata(gcbo);
OmoriTempVariable=handles;

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;
kSTD=get(handles.STDKEdit,'String');    % беремо множник sigma
kSTD=str2num(kSTD);
probability=get(handles.probabilityEdit,'Value');

[X,Y,Ticks]=getSigmaDeviations(X,kSTD);
lX=log(X);
lY=log(Y);
koeffs=GeneralMinSquare(lX,lY,1);
Y2=exp(koeffs(2))*X.^koeffs(1);

%TSTemp.f1=figure; TSTemp.OmoriX=X; TSTemp.OmoriY=Y;
%plot(X,Y,'k');
%hold on;
%plot(X,Y2,'r');
%hold off;
%kStr=num2str(exp(koeffs(1)));
%pStr=num2str(koeffs(2));
%legend('Source',['p=' pStr]);

%TSTemp.f2=figure;
%loglog(X,Y,'k');
%hold on;
%loglog(X,Y2,'r');
%hold off;
%legend('Source',['p=' pStr]);

tsPlotOmori(X,Y);

% очищуємо локальні змінні
clear index X ttType teType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Динамический MFDFA"
function calcWindowOmoriButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;
kSTD=get(handles.STDKEdit,'Value');    % беремо множник sigma
wWidth=str2num(get(handles.beginWidthMovingWindowEdit,'String'));
wStep=str2num(get(handles.windowMovingEdit,'String'));

[X,Y,Ticks]=getSigmaDeviations(X,kSTD);
[m,n]=size(Ticks);

T=[];
XT=[];
i=1;
windowStart=1;
windowEnd=windowStart+wWidth-1;
while (windowEnd<=m)
    XT=[XT; i]; i=i+1;
    T=[T; sum(Ticks(windowStart:windowEnd,1))];
    if (T(i-1)==0)
        T(i-1)=0.001;
    end
    windowStart=windowStart+wStep;
    windowEnd=windowEnd+wStep;
end

lXT=log(XT);
lT=log(T);
koeffs=GeneralMinSquare(lXT,lT,1);
T2=exp(koeffs(1))*XT.^koeffs(2);

TSTemp.f1=figure; TSTemp.OmoriX=XT; TSTemp.OmoriY=T;
plot(XT,T,'k');
hold on;
plot(XT,T2,'r');
hold off;
kStr=num2str(exp(koeffs(1)));
pStr=num2str(koeffs(2));
legend('Source',['p=' pStr]);

TSTemp.f2=figure;
loglog(XT,T,'k');
hold on;
loglog(XT,T2,'r');
hold off;
legend('Source',['p=' pStr]);

% очищуємо локальні змінні
% clear index X ttType teType wWidth wStep actionType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Рассчитать наклон прямой"
function calcCoeffButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

figure(TSTemp.f1);
legend off;
temp=get(get(TSTemp.f1,'Children'),'Children');
delete(temp(1));

figure(TSTemp.f2);
legend off;
temp=get(get(TSTemp.f2,'Children'),'Children');
delete(temp(1));

X=TSTemp.OmoriX;
Y=TSTemp.OmoriY;
[m,n]=size(X);

[mouseX,mouseY]=ginput(2);

index=1;
while (mouseX(1)>X(index))
    index=index+1;
end
indexBegin=index;
while (X(index)<mouseX(2))
    index=index+1;
end
indexEnd=index;

lX=log(X(indexBegin:indexEnd));
lY=log(Y(indexBegin:indexEnd));
koeffs=GeneralMinSquare(lX,lY,1);
Y2=exp(koeffs(1))*X.^koeffs(2);

figure(TSTemp.f1);
hold on;
plot(X,Y2,'r');
hold off;
kStr=num2str(exp(koeffs(1)));
pStr=num2str(koeffs(2));
legend('Source',['p=' pStr]);

figure(TSTemp.f2);
hold on;
loglog(X,Y2,'r');
hold off;
legend('Source',['p=' pStr]);

% =============================================================================================================================
% при натисненні на кнопку "Закрыть окна"
function calcCloseWindowsButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

if (TSTemp.f1~=0)
    close(TSTemp.f1);
    TSTemp.f1=0;
end
if (TSTemp.f2~=0)
    close(TSTemp.f2);
    TSTemp.f2=0;
end
TSTemp.OmoriX=0;
TSTemp.OmoriY=0;

% =============================================================================================================================
% вибір пункту меню "Прочитати файл"
function MenuFileLoad_Callback(h,eventdata,handles)

% читаємо ім"я файла
[FILENAME,PATHNAME,FILTERINDEX]=uigetfile( ...
    {'*.txt;*.dat;*.ts', 'Файлы с данными (*.txt, *.dat, *.ts)'; ...
     '*.ts',             'Файлы с временными рядами (*.ts)'; ...
     '*.txt',            'Текстовые файлы (*.txt)'; ...
     '*.dat',            'Текстовый файлы с данными (*.dat)'}, ...
     'Выберите файл с временным рядом');

if ((FILENAME(1,1)~=0) & (PATHNAME(1,1)~=0))
    % читаємо дані з вибраного файла
    [NAMES,DATAS,DATES]=loadTS(PATHNAME,FILENAME);

    global TSTemp;
    
    % повідомляємо про прочитаний файл
    TSTemp.index=TSTemp.index+1;
    TSTemp.data{TSTemp.index}.datas=DATAS;
    TSTemp.data{TSTemp.index}.names=NAMES
    TSTemp.data{TSTemp.index}.dates=DATES
    
    % отримуємо handle ListBox
    handles=guidata(gcbo);
    ListBoxTS=handles.ListBoxTS;
    STRINGS=get(ListBoxTS,'String');
    STRINGS=appendString(STRINGS,FILENAME);
    set(ListBoxTS,'String',STRINGS);
end