function F=pos_correct_all(F,err,t,max_diff,accept_code);
% Замена данных с кодом ошибки ~= 80 на NaN и отдельного выброса (импульса)
% с амплитудой больше заданной - на среднее по двум соседним измерениям
%
%      F=pos_correct_all(F,err,t[,max_diff,[accept_code]]);
%
%        F    - исходные данные
%      err    - коды ошибок [80] - нормальное измерение
%        t    - вектор времени измерениЯ (в условных единицах)
% max_diff    - допустимое отклонение единичного выброса (импульса), 
%               по умолчанию = 7
% accept_code - допустимые коды ошибок 
%               (строковый вектор типа ['80';'84';'86';'88'])
%               по умолчанию - '80'

% 15.01.2004 -  1) ввод значения max_diff как аргумента
%               2) выброс обрабатывается, если градиенты имеют разные знаки
% 27.07.2006 -  код ошибки [84] (низкое отношение сигнал/шум) не
%               обрабатывается
% 30.10.2006 -  значения F с кодами ошибок не [80]
%               заменЯютсЯ на NaN (интерполяция не выполняется)
% 12.07.2007 - допустимые коды ошибок можно задать как параметр
% 05.03.2012 - коды ошибок трактуются как строковые переменные,
%               для сравнения используется преобразование hex2dec()

% set difference limit to default value
switch nargin,
    case 3,
        max_diff=7;
        accept_code=['80'; '88'];
    case 4,
        accept_code=['80'; '88'];
end    

% Correct the measurements with abnormal conditions (Err~=accept_code)
kerr=~ismember(hex2dec(err),hex2dec(accept_code)');
F(kerr)=NaN;
if sum(kerr)>0,
   disp(['"pos_correct_all.m" -> F=NaN for ERR~=[' sprintf(' %02d',str2num(accept_code)') '] ... ' num2str(sum(kerr))])
end
   
% Correct the measurements with single large deviations
tmp=[]; nsum=0;
dF=diff(F);
ks=find(abs(dF)>=max_diff)+1;
if sum(ks)>0,
   kdiff=ks(diff(ks)==1);   % indeces of single deviated measurements
   nsum=0;
   for k=1:length(kdiff),
       % учитываем, только если градиенты имеют разные знаки
        if sign(dF(kdiff(k)-1))~=sign(dF(kdiff(k))),
            F(kdiff(k))=mean([F(kdiff(k)-1) F(kdiff(k)+1)]);
            nsum=nsum+1;
		tmp(nsum)=kdiff(k);
        end
   end
end
if nsum>0,
   disp(['"pos_correct_all.m" -> Correction diff(F) >= ' ...
      num2str(max_diff) ' nT ... ' num2str(nsum)])
end

% сохранЯем длЯ протокола
fid=fopen('pos_correct_log.tmp','w');
fprintf(fid,'%d\n',tmp');
fclose(fid);
%save pos_correct_protocol.tmp tmp -ascii