function [To,Co,Ta,Ca,dF,comp,flag_d]=blv_read_fun(file_or_year,obs_code,file_path,plot_code,jump)
% чтение данных из файла базисных значение (стандарт Интермагнета)
%
% [To,Co,Ta,Ca,dF,comp, flag_d]=blv_read_fun(file_or_year,obs_code[,file_path[,plot_code],jump]);
%
% file_or_year - имя файла в виде CodYYYY*.* или год
%  obs_code - код обсерватории (например, nvs или aaa) или код графика
%               plot_code
% file_path - путь к файлу с данными. 
%             По умолчанию - cd\КОД_ОБСЕРВАТОРИИ\ГОД
% plot_code - 1 -рисуем (по умолчанияю), 0 - не рисуем
% jump      - убираем скачки = 1, оставляем скачки = 0 (по умолчанию)
%
% To,Ta - сериальная дата набл. и принятых базисных
% Co,Ca - матрицы базисных значений компонент, перечисленных в comp
%    dF - разности F(Var)-F(ppm)
%  comp - компоненты, для которых представлены базисные, например, XYZF
% flag_d - код (скачок - "d", непрерывно - "c")

% 08.11.2008 - Хомутов С.Ю., Новосибирск
% 22.03.2010 - адаптировано под два формата базисных IBF v1.11 (до 2009) 
%              и v2.00 (c 2009 г.)
% 18.05.2010 - добавлен пропуск данных с "88888.00"
% 12.03.2012 - сделан вывод графика "базисных" F (градиента dFgrad)
% 16.11.2013 - возможность указать файл базисных напрямую
% 26.05.2018 - проверка наличия файла. При отсутствии выводится сообщение и
%               все выходные аргументы инициализируются как пустые =[]
% 30.06.2019 - добавлен "o" в подписях Y-осей
% 06.07.2019 - подписи осей ординат оптимизированы
% 07.08.2019 - для deltaF пределы оси X установлены от min(Ta) до max(Ta)
% 03.10.2021 - убираются скачки

if isstr(file_or_year), % дается только имя файла в виде CODYYYY*.*
    year=str2num(file_or_year(4:7));
%     plot_code=obs_code;
%     obs_code=file_or_year(1:3);
    if nargin<3,    % путь к файлу не указан
        file_path=['CD\' obs_code '\' sprintf('%4d',year) '\'];
        plot_code=1;
    elseif nargin<4,
        plot_code=1;
    elseif isempty(file_path),
        file_path=['CD\' obs_code '\' sprintf('%4d',year) '\'];
    end
    file=[file_path file_or_year];
    if nargin<5, jump=0; end
else
    year=file_or_year;
    if year<2000, 
        yy=sprintf('%02d',year-1900);
    elseif year<2009,
        yy=sprintf('%02d',year-2000);
    else
        yy=sprintf('%04d',year);
    end
    if nargin<3,    % путь к файлу не указан
        file_path=['CD\' obs_code '\' sprintf('%4d',year) '\'];
        plot_code=1;
    elseif nargin<4,
        plot_code=1;
    elseif isempty(file_path),
        file_path=['CD\' obs_code '\' sprintf('%4d',year) '\'];
    end
    file=[file_path obs_code yy '.blv'];
    if nargin<5, jump=0; end
end

if ~exist(file,'file'),
    disp(['!!! Не могу найти файл ' file])
    To=[];Co=[];Ta=[];Ca=[];dF=[];comp=[];
    return
end

fid=fopen(file,'rt');
inform_line=fgetl(fid); % first line as "XYZF 18955 BEL 2000"
comp=inform_line(1:3);
% проверяем какой формат в файле (смотрим кол-во пробелов)
k=findstr(inform_line,' ');
if length(k)==3,
    ibf_ver=111; Kc=3;
    comp=inform_line(1:3);
else
    ibf_ver=200; Kc=4;
    comp=inform_line(1:4);
end

% Observed data
ndo=[]; Co=[];
while 1,
    str=fgetl(fid);
    if ~isempty(findstr(str,'*')), break, end % end of processing of init data
    tmp=str2num(str);
    ndo=[ndo; tmp(1)];
    Co=[Co; tmp(2:Kc+1)];
end

%Adopted data
nda=[]; Ca=[]; dF=[]; flag_d=[];
while 1,
    str=fgetl(fid);
    if ~isempty(findstr(str,'*')), break, end % end of processing of init data
    if ibf_ver==111,
        tmp=str2num(str);
    else
        tmp=str2num(str(1:length(str)-1));
    end
    nda=[nda; tmp(1)];
    Ca=[Ca; tmp(2:Kc+1)];
    dF=[dF;tmp(Kc+2)];
    flag_d=[flag_d; str(length(str))];
end
fclose(fid);

Co(fix(Co)==99999)=NaN; Co(fix(Co)==88888)=NaN;
Ca(fix(Ca)==99999)=NaN; Ca(fix(Ca)==88888)=NaN;
if ibf_ver==111,
    dF(fix(dF)==9999)=NaN;
    Co=Co/10; Ca=Ca/10;
    dF=dF/10;
    k=findstr('D',comp);
    Co(:,k)=Co(:,k)/10; Ca(:,k)=Ca(:,k)/10;
    kp=3;
else
    Co(fix(Co(:,4))==999 | fix(Co(:,4))==888,4)=NaN;
    Ca(fix(Ca(:,4))==999 | fix(Ca(:,4))==888,4)=NaN;
    dF(fix(dF)==999 | fix(dF)==888)=NaN;
    kp=4;
end

T0=datenum(year,1,1)-1;
To=T0+ndo; [yyyo,mmmo,dddo]=datevec(To);
Ta=T0+nda; [yyya,mmma,ddda]=datevec(Ta);

units=repmat(', nT    ',3,1);
k=findstr('D',comp);
if ~isempty(k),
    units(k,:)=', arcmin';
end
k=findstr('I',comp);
if ~isempty(k),
    units(k,:)=', arcmin';
end

% убираем скачки, если нужно
if jump>0   % убираем скачки
    kj=strfind(flag_d','d'); Nj=length(kj);
    for k=1:Nj
        for kele=1:4
            dCj(k,kele)=Ca(kj(k),kele)-Ca(kj(k)-1,kele);
        end
    end
    Co_ini=Co; Ca_ini=Ca;
    for k=1:Nj
        ko=To>=Ta(kj(k)); ka=Ta>=Ta(kj(k));
        for kele=1:4
            Co(ko,kele)=Co(ko,kele)-dCj(k,kele);
            Ca(ka,kele)=Ca(ka,kele)-dCj(k,kele);
        end
    end
    
end

if plot_code==1,
    CC1=base_to_extract(Co(:,1));
    CC2=base_to_extract(Co(:,2));
    CC3=base_to_extract(Co(:,3));

    figure(1)
    subplot(kp,1,1), hndl=plot(To,Co(:,1)-CC1,'ro',Ta,Ca(:,1)-CC1,'b.');
    datetick('x',3)
    set(hndl,'MarkerFaceColor','r')
    title(['Baseline values for Observatory ' upper(obs_code) '; year ' num2str(year)])
    if abs(CC1)<0.1,
        ylabel(sprintf('%c0%s',inform_line(1),units(1,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(1),-CC1,units(1,:)))
    end

    subplot(kp,1,2), hndl=plot(To,Co(:,2)-CC2,'ro',Ta,Ca(:,2)-CC2,'b.');
    datetick('x',3)
    set(hndl,'MarkerFaceColor','r')
    if abs(CC2)<0.1,
        ylabel(sprintf('%c0%s',inform_line(2),units(2,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(2),-CC2,units(2,:)))
    end

    subplot(kp,1,3), hndl=plot(To,Co(:,3)-CC3,'ro',Ta,Ca(:,3)-CC3,'b.');
    datetick('x',3)
    set(hndl,'MarkerFaceColor','r')
    if abs(CC3)<0.1,
        ylabel(sprintf('%c0%s',inform_line(3),units(3,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(3),-CC3,units(3,:)))
    end

    if kp==4,
        subplot(kp,1,4)
        plot(To,Co(:,4),'ro',Ta,Ca(:,4),'b.','MarkerFaceColor','m');
        datetick('x',3), ylabel('dF\_Grad, nT')
    end

    figure(2)
    subplot(411), hndl=plot(To,Co(:,1)-CC1,'ro',Ta,Ca(:,1)-CC1,'b.');
    datetick('x',3)
    axis tight
    set(hndl,'MarkerFaceColor','r')
    title(['Baseline values for Observatory ' upper(obs_code) '; year ' num2str(year)])
    if abs(CC1)<0.1,
        ylabel(sprintf('%c0%s',inform_line(1),units(1,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(1),-CC1,units(1,:)))
    end

    subplot(412), hndl=plot(To,Co(:,2)-CC2,'ro',Ta,Ca(:,2)-CC2,'b.');
    datetick('x',3)
    axis tight
    set(hndl,'MarkerFaceColor','r')
    if abs(CC2)<0.1,
        ylabel(sprintf('%c0%s',inform_line(2),units(2,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(2),-CC2,units(2,:)))
    end

    subplot(413), hndl=plot(To,Co(:,3)-CC3,'ro',Ta,Ca(:,3)-CC3,'b.');
    datetick('x',3)
    axis tight
    set(hndl,'MarkerFaceColor','r')
    if abs(CC3)<0.1,
        ylabel(sprintf('%c0%s',inform_line(3),units(3,:)))
    else
        ylabel(sprintf('%c0%+d%s',inform_line(3),-CC3,units(3,:)))
    end

    subplot(414), plot(Ta,dF,'r.-');
    datetick('x',3,'KeepLimits')
    axis tight, set(gca, 'XLim',[min(Ta) max(Ta)])
    ylabel('F-P, nT')
end
