Package: psfmodels
psfmodelsPython bindings for scalar and vectorial models of the point spread function.Original C++ code and MATLAB MEX bindings Copyright © 2006-2013,Francois
Aguet, distributed under GPL-3.0
license. Python bindings by Talley LambertThis package contains three models:The vectorial model is described in Auget et al 20091. For more
information and implementation details, see Francois' Thesis2.A scalar model, based on Gibson & Lanni3.A gaussian approximation (both paraxial and non-paraxial), using paramters from Zhang et al (2007)4.1F. Aguet et al., (2009) Opt. Express 17(8), pp.
6829-68482F. Aguet. (2009) Super-Resolution Fluorescence Microscopy Based on
Physical Models. Swiss Federal Institute of Technology Lausanne, EPFL Thesis no.
44183F. Gibson and F. Lanni (1992) J. Opt. Soc. Am. A, vol. 9, no. 1, pp. 154-1664Zhang et al (2007). Appl Opt
. 2007 Apr 1;46(10):1819-29.see also:For a different (faster) scalar-based Gibson–Lanni PSF model, see theMicroscPSFproject, based onLi et al
(2017)which has been implemented inPython,MATLAB, andImageJ/JavaInstallpipinstallpsfmodelsfrom sourcegitclonehttps://github.com/tlambert03/PSFmodels.gitcdPSFmodels
pipinstall-e".[dev]"# will compile c code via pybind11UsageThere are two main functions inpsfmodels:vectorial_psfandscalar_psf.
Additionally, each version has a helper function calledvectorial_psf_centeredandscalar_psf_centeredrespectively. The main difference is that the_psffunctions accept a vector of Z positionszv(relative to coverslip) at which
PSF is calculated. As such, the point source may or may not actually be in the
center of the rendered volume. The_psf_centeredvariants, by contrast, donotaccecptzv, but rather acceptnz(the number of z planes) anddz(the z step size in microns), and always generates an output volume in which the
point source is positioned in the middle of the Z range, with planes equidistant
from each other. All functions accept an argumentpz, specifying the position
of the point source relative to the coverslip. See additional keyword arguments
belowNote, all output dimensions (nxandnz) should be odd.importpsfmodelsaspsfmimportmatplotlib.pyplotaspltfrommatplotlib.colorsimportPowerNorm# generate centered psf with a point source at `pz` microns from coverslip# shape will be (127, 127, 127)psf=psfm.make_psf(127,127,dxy=0.05,dz=0.05,pz=0)fig,(ax1,ax2)=plt.subplots(1,2)ax1.imshow(psf[nz//2],norm=PowerNorm(gamma=0.4))ax2.imshow(psf[:,nx//2],norm=PowerNorm(gamma=0.4))plt.show()# instead of nz and dz, you can directly specify a vector of z positionsimportnumpyasnp# generate 31 evenly spaced Z positions from -3 to 3 micronspsf=psfm.make_psf(np.linspace(-3,3,31),nx=127)psf.shape# (31, 127, 127)allPSF functions accept the following parameters. Units should be provided
in microns unless otherwise stated. Python API may change slightly in the
future.  See function docstrings as well.nx (int):       XY size of output PSF in pixels, must be odd.
dxy (float):    pixel size in sample space (microns) [default: 0.05]
pz (float):     depth of point source relative to coverslip (in microns) [default: 0]
ti0 (float):    working distance of the objective (microns) [default: 150.0]
ni0 (float):    immersion medium refractive index, design value [default: 1.515]
ni (float):     immersion medium refractive index, experimental value [default: 1.515]
tg0 (float):    coverslip thickness, design value (microns) [default: 170.0]
tg (float):     coverslip thickness, experimental value (microns) [default: 170.0]
ng0 (float):    coverslip refractive index, design value [default: 1.515]
ng (float):     coverslip refractive index, experimental value [default: 1.515]
ns (float):     sample refractive index [default: 1.47]
wvl (float):    emission wavelength (microns) [default: 0.6]
NA (float):     numerical aperture [default: 1.4]Comparison with other modelsWhile these models are definitely slower than the one implemented inLi et al
(2017)andMicroscPSF, there are some interesting
differences between the scalar and vectorial approximations, particularly with
higher NA lenses, non-ideal sample refractive index, and increasing spherical
aberration with depth from the coverslip.For an interactive comparison, see theexamples.ipynbJupyter
notebook.Lightsheet PSF utility functionThepsfmodels.tot_psf()function provides a quick way to simulate the total
system PSF (excitation x detection) as might be observed on a light sheet
microscope (currently, only strictly orthogonal illumination and detection are
supported).  See thelightsheet.ipynbJupyter notebook for
examples.