Code covered by the BSD License  

Highlights from
TOFsPRO toolbox

from TOFsPRO toolbox by Dariya Malyarenko
Signal processing for time-of-flight mass spectra over the broad m/z range (1-200 kDa)

resample_rev2(sigt, masst, sigma0, skew0, pfit, minHW, Gnoise)
function [sigr, massr, rrr,ii, nsigma, nskew] = resample_rev2(sigt, masst, sigma0, skew0, pfit, minHW, Gnoise)
%   
% Function resamples TOF and m/z axis and integrates signal with the step
% determined by the ratio of predicted HWFM for the peak outside
% mass focusing range (given by quadratic polynomial fit) to the
% intitial FWHM (left half) of the peak in the mass focusing range
% as measured by "peakwidth_pf"
%
% INPUT:
% 
% sigt - raw equisampled TOF signal;
% masst - mass axis, corresponding to sigt;
% sigma0 - value of FWHM for the instrumental function peak in the
%          mass focusing range (in time points, can be fractional);
% skew0 - right peak half skew (can be negative)
% pfit - is the array of polyfit coefficients [p1,p2,p3] for the
% expected peak HWFM  outside mass focusing range;
% minHW - sufficient minimum peak point density (4.5 by default)
% Gnoise - set to 1 in case of Gaussian noise (e.g., 0 in sace of
% derivative noise)
%
% Output:
%
% sigr - resampled, integrated TOF signal;
% massr - resampled mass axis, corresponding to sigr
% rrr - resampling rate curve;
% ii - resampled time;
% nsigma - new sigma, if constant resampling was used;
% nskew - new skew, if constant resampling was used;
%
% USAGE:
% [sigr, massr, rrr,ii, nsigma, nskew] = resample_rev2(sigt, masst, sigma0, skew0, pfit, minHW, Gnoise);
% Dependency: none
%

if (nargin < 2) | (nargin < 1)
  error('Requires both the data array and the peak position as an input');
  sigma = NaN;
end

nsigma=sigma0; nskew=skew0;

t=1:length(sigt);
t=t'; tb=t;
rr=(pfit(1)*t.*t+pfit(2)*t+pfit(3))/sigma0;
rr0=rr;
stp=round(sigma0/minHW);
if stp >= 3
  % 'doing_initial_constant_resampling'
  if (stp/2-fix(stp/2))==0 stp=stp-1; end;
  trs=1:stp:length(t);
  k=1;sigr_stp=zeros(length(trs),1);
  ks=(stp-1)/2;
  sigr_stp(1)=sum(sigt(1:ks));
  sigr_stp(end)=sum(sigt(trs(end)-ks:trs(end)));
  
  for jk=trs(2):stp:trs(end-1)
    k=k+1; 
    sigr_stp(k)= sum(sigt(jk-ks:jk+ks));
  end;
  stp;  % constant IDS step
  nsigma=sigma0/stp; nskew=skew0/stp;
  masst=masst(trs);
  sigt=sigr_stp;
  rr0=rr0(trs);
  rr=rr(trs);
  t=t(trs);
end;

t1=(1:length(t))'; % assuming that length(sigt)=length(t)
[minrr0, iminrr0]=min(rr0);
%plot(rr);
il=find((rr-floor(rr))<0.5);
rr(il)=floor(rr(il));

ih=setdiff(t1,il);

rr(ih)=ceil(rr(ih));

[minrr, iminrr]=min(rr);

ir=find(rr>=2); ir=ir(find(ir>iminrr));
%length(ir)

if(length(ir)<1) %% if any quadratic resampling should be done
  sigr=sigt;
  massr=masst;
  rrr=ones(length(t),1);
  ii=t;
  
else
  
  % 'onset'
  ir(1)*stp  % onset of sampling in "original" time
  %'max_rate'
  mr=max(rr);  % maximum sampling rate for this record
  %plot(rr)
  
  sigr=sigt(1:ir(1)-2); sigr(end)=sigr(end)+0.5*sigt(ir(1)-1);
  %%%!!! need to weigh original points between 1 and 1.5
  massr=masst(1:ir(1)-2);
  rrr=rr(1:ir(1)-2);
  
  ii=[(1:(ir(1)-2))'];
  %'last_ii'
  ii(end);
  rsp=ir(1);
  rst=ir(1);
  
  for jj=(rr(ir(1))+1):mr
    %  jj
    ich=find(rr>=jj); ich=ich(find(ich>ir(1)));
    rsp=[rsp,ich(1)];
    % 'first_ii'
    % correct for integer sampling
    rr((ii(end)+jj-1):rsp(end-1))=rr(rsp(end-1));
    %ii(end)+jj-1
    rst=[rst, ii(end)+jj-1];
    ii=[ii;t1((ii(end)+jj-1):(jj-1):(rsp(end)-jj))];
    % 'last_ii'
    % ii(end)
  end;
  
  %'first_ii'
  % back correct for integer jump lagging
  rr((ii(end)+mr):rsp(end))=rr(rsp(end));
  %ii(end)+mr
  rst=[rst,ii(end)+mr]; rst=rst(2:end);
  
  ii=[ii;t1((ii(end)+mr):mr:(t1(end)-ceil(mr/2)))];
  
  %'last_ii'
  %ii(end);
  %%rsp  % rounded resampling start for different rates
  %%rst  % start resampling corrected for integer jumps
  %% [rr(rst), rr(rst-1), rr(rst+1)] % check the edge points
  %plot(ii, 'k.');
  
  irs=ii(rst(1):end); % resampling time index
  massr=[massr;masst(irs)]; % resampled mass
  rrr=[rrr;rr(irs);rr(irs(end))]; % resampling rate
  
  for ri=1:(length(irs)-1)
    rri=rr(irs(ri));
    if (rri/2-fix(rri/2))==0 
      k=rri/2;
      sri=sum(sigt(irs(ri)-k+1:irs(ri)+k-1))+0.5*sigt(irs(ri)-k);
      rri1=rr(irs(ri+1));
      if (rri1/2-fix(rri1/2))~=0 
	sri=sri+sigt(irs(ri)+k); 
      else sri=sri+0.5*sigt(irs(ri)+k);
      end;
    else
      k=(rri-1)/2;
      sri=sum(sigt(irs(ri)-k:irs(ri)+k));
      rri1=rr(irs(ri+1));
      if (rri1/2-fix(rri1/2))==0 
	sri=sri+0.5*sigt(irs(ri)+k+1); 
      end;
    end;
    
    sr(ri)=sri;  
  end;   % loop through resampled signal
  sigr=[sigr;sr'];  %% main work is done for signal intensity integration
  %% resample last point assuming that next rri1 is the same
  ri=length(irs); rri=rr(irs(ri));
  if (rri/2-fix(rri/2))==0 
    k=rri/2;
    sri=sum(sigt(irs(ri)-k+1:irs(ri)+k-1));
    sri=sri+0.5*sigt(irs(ri)-k)+0.5*sigt(irs(ri)+k);
  else
    k=(rri-1)/2;
    sri=sum(sigt(irs(ri)-k:irs(ri)+k));
  end;
  sigr=[sigr;sri;mean(sigr(end-k:end))]; %% add last resampled point
  %% assumes that last point is a mean of (end-k): 
  %% one point lost
  
  %%% add the last time point of the data as "mean" of what is left
  ii=[ii;t1(end)]; 
  rrr=[rrr;rrr(end)];
  massr=[massr; masst(ii(end-1));masst(t1(end))];
  sigr=[sigr; mean(sigt(ii(end-1):ii(end)))];
  
  %%% scale by sqrt(rate) for Gaussian noise
  if Gnoise==1    
  sigr((ir(1)-2):end)=sigr((ir(1)-2):end)./((rrr((ir(1)-2):end)).^(0.5));    
  end;
  
  %%%%% try to correct for ramps %%%%%%
  rmpi=find(diff(rrr)==1); rmpi=rmpi+1; % ramp positions
  rmpa=sigr(rmpi)-sigr(rmpi-2); % ramp amplitudes
  %determine noise amplitude
  [y,mi]=min(sigr(rmpi(1):(end-2*mr-1)));
  pst=rmpi(1)+mi;
  nsa=2*std(sigr((pst-2*rrr(pst)):(pst+2*rrr(pst))));
  i1=find(rmpa>nsa & ((rmpa+nsa)>(sigr(rmpi+1)-sigr(rmpi-1)))); 
  ii(rmpi(i1)); % ramps to correct
  for cr=1:length(i1)
    si=rmpi(i1(cr));  % cor-ramp positions in resampled signal
    trmp=ii(rmpi(i1(cr))); % cor-ramp positions in original time
    trmp1=ii(rmpi(i1(cr))-2);
    %iminrr0
    rrmp=rrr(rmpi(i1(cr))); % resampling rate at the ramp
    lcr=fix(length(find(rr0(trmp:end)<rrmp))/rrmp); 
    % length to the right
    %rr0(trmp+lcr*rrmp)
    %rrr(si+lcr)
    if (lcr<1) lcr=1; end; %% avoid 0-division 11/07/07
    wcr=1./lcr; % weight step to the right
    lcr=floor(lcr-2*nsa/(wcr*rmpa(i1(cr)))); 
    wcl=1; % initialize
    % limited length to the right
    if (lcr>0) wcr=1./abs(lcr);  end; % if negative??
    % rr0(trmp+abs(lcr)*rrmp)
    %rrr(si+abs(lcr))
    lcl=fix(length(find(rr0(iminrr0:trmp1)>(rrmp-1)))/(rrmp-1));
    %rr0(trmp1-lcl*(rrmp-1))
    %rrr(si-2-lcl)
    if (lcl<1) lcl=1; end; %% avoid 0-division 11/07/07
    if (lcl>0)  % if negative??
    wcl=1./lcl; % weight step to the left 
    lcl=floor(lcl-2*nsa/(wcl*rmpa(i1(cr)))); 
    % limited length to the left
    wcl=1./abs(lcl);
    end;
    %rr0(trmp1-abs(lcl)*(rrmp-1))
    %rrr(si-2-abs(lcl))
    rrl=length(find(rrr==rrmp));
    rll=length(find(rrr==(rrmp-1)));
    
    if (abs(lcr)>0.5*rrl) lcr=floor(0.5*rrl); wcr=1./lcr; end;
    
    dcr=0.5*rmpa(i1(cr))*(1-wcr*(1:abs(lcr))');
    sigr(si:(si+abs(lcr)-1))=sigr(si:(si+abs(lcr)-1))-dcr;
    
    if (abs(lcl)>0.5*rll) lcl=floor(rll/2); wcl=1./lcl; end;
    
    dcl=0.5*rmpa(i1(cr))*(1-wcl*(1:abs(lcl))');
    sigr((si-2):-1:(si-2-abs(lcl)+1))=sigr((si-2):-1:(si-2-abs(lcl)+1))+dcl;
    
  end; % loop through corrected ramps
  ii=t(ii); 
  %ir(1)
  %ii(ir(1))
  ii(ir(1):(end-1))=ii((ir(1)+1):end); %% correct for 1-point resampling onset shift 11/06/07
  ii(end)=tb(end); %% correct for copy of end-value 11/19/07
end; % if resampling length is nonzero (safety check)

return;

Contact us at files@mathworks.com