function [gt,d]=findmax2(data, flag)
%FINDMAX2 Interpolates the maxima in a matrix of data.
%
%	Function used for returning all the maxima in a set of
%	data (matrices). The maxima are calculated by
%	quadratic interpolation.

if nargin < 2, flag = 0, end
% 2-D
d = [1.5, 1.5];
[m,n]=size(data);
% Factor for error control:    
factor = 5;  % Keep error five times less than nearest constraint

% Constants
diagix = [-1 -1 1 1];
diagix2 = [1 -1 -1 1];
% Use point [0,0], [1,0], [0,1], [0, -1], [-1 0] and [1,1] on grid:
diagix3 = [0 1 0 0 -1 1 ];
diagix4 = [0 0 1 -1 0 1 ];
% Point [-1, -1] used to check goodness of quadratic fit. 
xerr = [-1; -1];

invH = [  ... 
-1.0000    0.5000         0         0    0.5000         0
0.5000   -0.5000   -0.5000         0         0    0.5000
-1.0000         0    0.5000    0.5000         0         0
0    0.5000         0         0   -0.5000         0
0         0    0.5000   -0.5000         0         0
1.0000         0         0         0         0         0
];

% Find the peaks
crmax = (data>[data(1,:)-1;data(1:m-1,:)]) & (data>=[data(2:m,:);data(m,:)-1]) & ...
	(data>[data(:,1)-1,data(:,1:n-1)]) & (data>=[data(:, 2:n),data(:,n)-1]);

f = find(crmax);
for i = f'
	ni = 1 + floor((i-0.5)/m);
	mi = i - (ni-1)*m;
	ix = mi - diagix;
	iy = ni - diagix2;
	fix = find(ix > 0 & ix <= m & iy > 0 & iy <= n); 
	if any(data(mi, ni) <= data(ix(fix), iy(fix)))
		crmax(mi, ni) = 0; 
	end
end
f = find(crmax)';
H =zeros(2,2); 
% Fit a quadratic
cnt = 0; 
for i = f
	cnt = cnt + 1;
	ni = 1 + floor((i-0.5)/m);
	mi = i - (ni-1)*m;
	if (mi > 1 & mi < m & ni > 1 & ni < n) 
		ix = mi - diagix3;
		iy = ni - diagix4;
		for k = 1:6
		    y(k,1) = data(ix(k),iy(k)); 
		end
		coeffs = invH*y; 
		H(1,1) = coeffs(1);
		H(1,2) = coeffs(2);
		H(2,1) = H(1,2);
		H(2,2) = coeffs(3); 
		b = coeffs(4:5);
		c = coeffs(6);
		x = -0.5 * (H\b); 
		gt(cnt) = x'*H*x + b'*x + c;
% Error control 
		if flag 
		    err2 = abs(xerr'*H*xerr + b'*xerr + c - data(mi+1, ni+1 ));
		    mult = 1; 
		    if err2 < 1/20*abs(gt(cnt))
		        mult = 1.25;
		    elseif err2 > (5*abs(gt(cnt))+1e-5)
		        mult = 0.75;
		    end

		    pky = quad2(data(mi-1:mi+1,ni));
		    f = abs((pky + 1.1e-5) /(factor *(data(mi,ni)-pky) + 1e-5));
		    d(1,2) = min(d(1,2), mult * ((f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100)));
		    pkx =  quad2(data(mi, ni-1:ni+1)');
		    f = abs((pkx + 1.1e-5) /(factor  *(data(mi,ni) - pkx) + 1e-5));
		    d(1,1) = min(d(1,1), mult * ((f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100)));
		end
	elseif mi > 1 & mi < m
		gt(cnt) = quad2(data(mi-1:mi+1,ni));
		if flag 
		    pky = gt(cnt);
		    f = abs((pky + 1.1e-5) /(factor *(data(mi,ni) - pky) + 1e-5));
		    d(1,2) = min(d(1,2), (f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100));
		    if (pky > -1e-5), d(1,1) = min(1, d(1,1)); end
		end
	elseif ni > 1 & ni < n
		gt(cnt) = quad2(data(mi, ni-1:ni+1)');
		if flag 
		    pkx = gt(cnt); 
		    f = abs((pkx + 1.1e-5) /(factor  *(data(mi,ni) - pkx) + 1e-5));
		    d(1,1) = min(d(1,1), (f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100));
		    if (pkx > -1e-5), d(1,2) = min(1, d(1,2)); end
		end
	else
		gt(cnt) = data(mi, ni);
		if (gt(cnt) > -1e-5), 
		    d(1,1) = min(1, d(1,1)); 
		    d(1,2) = min(1, d(1,2)); 
		end
	end
end
