Source code for aotools.image_processing.psf

"""
PSF Analysis
------------

Functions for analysing PSFs.

"""

import numpy
from .. import functions


[docs]def azimuthal_average(data): """ Measure the azimuthal average of a 2d array Args: data (ndarray): A 2-d array of data Returns: ndarray: A 1-d vector of the azimuthal average """ size = data.shape[0] avg = numpy.empty(int(size / 2), dtype="float") for i in range(int(size / 2)): ring = functions.pupil.circle(i + 1, size) - functions.pupil.circle(i, size) avg[i] = (ring * data).sum() / (ring.sum()) return avg
[docs]def encircled_energy(data, fraction=0.5, center=None, eeDiameter=True): """ Return the encircled energy diameter for a given fraction (default is ee50d). Can also return the encircled energy function. Translated and extended from YAO. Parameters: data : 2-d array fraction : energy fraction for diameter calculation default = 0.5 center : default = center of image eeDiameter : toggle option for return. If False returns two vectors: (x, ee(x)) Default = True Returns: Encircled energy diameter or 2 vectors: diameters and encircled energies """ dim = data.shape[0] // 2 if center is None: center = [dim, dim] xc = center[0] yc = center[1] e = 1.9 npt = 20 rad = numpy.linspace(0, dim**(1. / e), npt)**e ee = numpy.empty(rad.shape) for i in range(npt): pup = functions.pupil.circle(rad[i], int(dim) * 2, circle_centre=(xc, yc), origin='corner') rad[i] = numpy.sqrt(numpy.sum(pup) * 4 / numpy.pi) # diameter ee[i] = numpy.sum(pup * data) rad = numpy.append(0, rad) ee = numpy.append(0, ee) ee /= numpy.sum(data) xi = numpy.linspace(0, dim, int(4 * dim)) yi = numpy.interp(xi, rad, ee) if eeDiameter is False: return xi, yi else: ee50d = float(xi[numpy.argmin(numpy.abs(yi - fraction))]) return ee50d