Source code for ewoksndreg.math.fit2d

import warnings

import numpy

try:
    from scipy.optimize import leastsq
except ImportError:
    leastsq = None


[docs] def gaussian(x, y, x0, y0, sx, sy, rho, A): num = ( (x - x0) ** 2 / sx**2 - 2 * rho / (sx * sy) * (x - x0) * (y - y0) + (y - y0) ** 2 / sy**2 ) denom = 2 * (1 - rho**2) return ( A / (2 * numpy.pi * sx * sy * numpy.sqrt(1 - rho**2)) * numpy.exp(-num / denom) )
[docs] def errorf_gaussian(p, x, y, data): x0, y0, sx, sy, rho, A = tuple(p) return numpy.ravel(gaussian(x, y, x0, y0, sx, sy, rho, A) - data)
[docs] def guess_gaussian(x, y, data): y0i, x0i = numpy.unravel_index(numpy.argmax(data), data.shape) y0 = y[y0i, 0] x0 = x[0, x0i] xv = x[y0i, :] - x0 yv = data[y0i, :] sx = numpy.sqrt(abs(xv**2 * yv).sum() / yv.sum()) xv = y[:, x0i] - y0 yv = data[:, x0i] sy = numpy.sqrt(abs(xv**2 * yv).sum() / yv.sum()) rho = 0.0 A = data[y0, x0] * 2 * numpy.pi * sx * sy * numpy.sqrt(1 - rho**2) return numpy.array([x0, y0, sx, sy, rho, A], dtype=numpy.float32)
[docs] def fitgaussian(x, y, data): if leastsq is None: raise RuntimeError("requires 'scipy'") guess = guess_gaussian(x, y, data) with warnings.catch_warnings(): warnings.simplefilter("ignore") p, success = leastsq(errorf_gaussian, guess, args=(x, y, data)) success = success > 0 and success < 5 return p, success