# psfmodels
[![PyPI](https://img.shields.io/pypi/v/psfmodels.svg?color=green)](https://pypi.org/project/psfmodels)
[![Python
Version](https://img.shields.io/pypi/pyversions/psfmodels.svg?color=green)](https://python.org)
[![CI](https://github.com/tlambert03/psfmodels/actions/workflows/ci.yml/badge.svg)](https://github.com/tlambert03/psfmodels/actions/workflows/ci.yml)
[![codecov](https://codecov.io/gh/tlambert03/psfmodels/branch/main/graph/badge.svg)](https://codecov.io/gh/tlambert03/psfmodels)
Python bindings for scalar and vectorial models of the point spread function.
Original C++ code and MATLAB MEX bindings Copyright © 2006-2013, [Francois
Aguet](http://www.francoisaguet.net/software.html), distributed under GPL-3.0
license. Python bindings by Talley Lambert
This package contains three models:
1. The vectorial model is described in Auget et al 2009<sup>1</sup>. For more
information and implementation details, see Francois' Thesis<sup>2</sup>.
2. A scalar model, based on Gibson & Lanni<sup>3</sup>.
3. A gaussian approximation (both paraxial and non-paraxial), using paramters from Zhang et al (2007)<sup>4</sup>.
<small>
<sup>1</sup> [F. Aguet et al., (2009) Opt. Express 17(8), pp.
6829-6848](https://doi.org/10.1364/OE.17.006829)
<sup>2</sup> [F. Aguet. (2009) Super-Resolution Fluorescence Microscopy Based on
Physical Models. Swiss Federal Institute of Technology Lausanne, EPFL Thesis no.
4418](http://bigwww.epfl.ch/publications/aguet0903.html)
<sup>3</sup> [F. Gibson and F. Lanni (1992) J. Opt. Soc. Am. A, vol. 9, no. 1, pp. 154-166](https://opg.optica.org/josaa/abstract.cfm?uri=josaa-9-1-154)
<sup>4</sup> [Zhang et al (2007). Appl Opt
. 2007 Apr 1;46(10):1819-29.](https://doi.org/10.1364/AO.46.001819)
</small>
### see also:
For a different (faster) scalar-based Gibson–Lanni PSF model, see the
[MicroscPSF](https://github.com/MicroscPSF) project, based on [Li et al
(2017)](https://doi.org/10.1364/JOSAA.34.001029) which has been implemented in
[Python](https://github.com/MicroscPSF/MicroscPSF-Py),
[MATLAB](https://github.com/MicroscPSF/MicroscPSF-Matlab), and
[ImageJ/Java](https://github.com/MicroscPSF/MicroscPSF-ImageJ)
## Install
```sh
pip install psfmodels
```
### from source
```sh
git clone https://github.com/tlambert03/PSFmodels.git
cd PSFmodels
pip install -e ".[dev]" # will compile c code via pybind11
```
## Usage
There are two main functions in `psfmodels`: `vectorial_psf` and `scalar_psf`.
Additionally, each version has a helper function called `vectorial_psf_centered`
and `scalar_psf_centered` respectively. The main difference is that the `_psf`
functions accept a vector of Z positions `zv` (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_centered` variants, by contrast, do
_not_ accecpt `zv`, but rather accept `nz` (the number of z planes) and `dz`
(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 argument `pz`, specifying the position
of the point source relative to the coverslip. See additional keyword arguments
below
_Note, all output dimensions (`nx` and `nz`) should be odd._
```python
import psfmodels as psfm
import matplotlib.pyplot as plt
from matplotlib.colors import PowerNorm
# 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()
```
![Image of PSF](fig.png)
```python
# instead of nz and dz, you can directly specify a vector of z positions
import numpy as np
# generate 31 evenly spaced Z positions from -3 to 3 microns
psf = psfm.make_psf(np.linspace(-3, 3, 31), nx=127)
psf.shape # (31, 127, 127)
```
**all** PSF 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 models
While these models are definitely slower than the one implemented in [Li et al
(2017)](https://doi.org/10.1364/JOSAA.34.001029) and
[MicroscPSF](https://github.com/MicroscPSF), 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 the [examples.ipynb](notebooks/examples.ipynb) Jupyter
notebook.
## Lightsheet PSF utility function
The `psfmodels.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 the [lightsheet.ipynb](notebooks/lightsheet.ipynb) Jupyter notebook for
examples.
Raw data
{
"_id": null,
"home_page": "https://github.com/tlambert03/psfmodels",
"name": "psfmodels",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "",
"author": "Talley Lambert",
"author_email": "talley.lambert@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/92/65/c2d27897c4cbb9d36e83a65ace5543b490af4160e85bcf5c6c03eb30c7e6/psfmodels-0.3.3.tar.gz",
"platform": null,
"description": "# psfmodels\n\n[![PyPI](https://img.shields.io/pypi/v/psfmodels.svg?color=green)](https://pypi.org/project/psfmodels)\n[![Python\nVersion](https://img.shields.io/pypi/pyversions/psfmodels.svg?color=green)](https://python.org)\n[![CI](https://github.com/tlambert03/psfmodels/actions/workflows/ci.yml/badge.svg)](https://github.com/tlambert03/psfmodels/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/tlambert03/psfmodels/branch/main/graph/badge.svg)](https://codecov.io/gh/tlambert03/psfmodels)\n\nPython bindings for scalar and vectorial models of the point spread function.\n\nOriginal C++ code and MATLAB MEX bindings Copyright © 2006-2013, [Francois\nAguet](http://www.francoisaguet.net/software.html), distributed under GPL-3.0\nlicense. Python bindings by Talley Lambert\n\nThis package contains three models:\n\n1. The vectorial model is described in Auget et al 2009<sup>1</sup>. For more\ninformation and implementation details, see Francois' Thesis<sup>2</sup>.\n2. A scalar model, based on Gibson & Lanni<sup>3</sup>.\n3. A gaussian approximation (both paraxial and non-paraxial), using paramters from Zhang et al (2007)<sup>4</sup>.\n\n<small>\n\n<sup>1</sup> [F. Aguet et al., (2009) Opt. Express 17(8), pp.\n6829-6848](https://doi.org/10.1364/OE.17.006829)\n\n<sup>2</sup> [F. Aguet. (2009) Super-Resolution Fluorescence Microscopy Based on\nPhysical Models. Swiss Federal Institute of Technology Lausanne, EPFL Thesis no.\n4418](http://bigwww.epfl.ch/publications/aguet0903.html)\n\n<sup>3</sup> [F. Gibson and F. Lanni (1992) J. Opt. Soc. Am. A, vol. 9, no. 1, pp. 154-166](https://opg.optica.org/josaa/abstract.cfm?uri=josaa-9-1-154)\n\n<sup>4</sup> [Zhang et al (2007). Appl Opt\n. 2007 Apr 1;46(10):1819-29.](https://doi.org/10.1364/AO.46.001819)\n\n</small>\n\n### see also:\n\nFor a different (faster) scalar-based Gibson\u2013Lanni PSF model, see the\n[MicroscPSF](https://github.com/MicroscPSF) project, based on [Li et al\n(2017)](https://doi.org/10.1364/JOSAA.34.001029) which has been implemented in\n[Python](https://github.com/MicroscPSF/MicroscPSF-Py),\n[MATLAB](https://github.com/MicroscPSF/MicroscPSF-Matlab), and\n[ImageJ/Java](https://github.com/MicroscPSF/MicroscPSF-ImageJ)\n\n## Install\n\n```sh\npip install psfmodels\n```\n\n### from source\n\n```sh\ngit clone https://github.com/tlambert03/PSFmodels.git\ncd PSFmodels\npip install -e \".[dev]\" # will compile c code via pybind11\n```\n\n## Usage\n\nThere are two main functions in `psfmodels`: `vectorial_psf` and `scalar_psf`.\nAdditionally, each version has a helper function called `vectorial_psf_centered`\nand `scalar_psf_centered` respectively. The main difference is that the `_psf`\nfunctions accept a vector of Z positions `zv` (relative to coverslip) at which\nPSF is calculated. As such, the point source may or may not actually be in the\ncenter of the rendered volume. The `_psf_centered` variants, by contrast, do\n_not_ accecpt `zv`, but rather accept `nz` (the number of z planes) and `dz`\n(the z step size in microns), and always generates an output volume in which the\npoint source is positioned in the middle of the Z range, with planes equidistant\nfrom each other. All functions accept an argument `pz`, specifying the position\nof the point source relative to the coverslip. See additional keyword arguments\nbelow\n\n_Note, all output dimensions (`nx` and `nz`) should be odd._\n\n```python\nimport psfmodels as psfm\nimport matplotlib.pyplot as plt\nfrom matplotlib.colors import PowerNorm\n\n# generate centered psf with a point source at `pz` microns from coverslip\n# shape will be (127, 127, 127)\npsf = psfm.make_psf(127, 127, dxy=0.05, dz=0.05, pz=0)\nfig, (ax1, ax2) = plt.subplots(1, 2)\nax1.imshow(psf[nz//2], norm=PowerNorm(gamma=0.4))\nax2.imshow(psf[:, nx//2], norm=PowerNorm(gamma=0.4))\nplt.show()\n```\n\n![Image of PSF](fig.png)\n\n```python\n# instead of nz and dz, you can directly specify a vector of z positions\nimport numpy as np\n\n# generate 31 evenly spaced Z positions from -3 to 3 microns\npsf = psfm.make_psf(np.linspace(-3, 3, 31), nx=127)\npsf.shape # (31, 127, 127)\n```\n\n**all** PSF functions accept the following parameters. Units should be provided\nin microns unless otherwise stated. Python API may change slightly in the\nfuture. See function docstrings as well.\n\n```\nnx (int): XY size of output PSF in pixels, must be odd.\ndxy (float): pixel size in sample space (microns) [default: 0.05]\npz (float): depth of point source relative to coverslip (in microns) [default: 0]\nti0 (float): working distance of the objective (microns) [default: 150.0]\nni0 (float): immersion medium refractive index, design value [default: 1.515]\nni (float): immersion medium refractive index, experimental value [default: 1.515]\ntg0 (float): coverslip thickness, design value (microns) [default: 170.0]\ntg (float): coverslip thickness, experimental value (microns) [default: 170.0]\nng0 (float): coverslip refractive index, design value [default: 1.515]\nng (float): coverslip refractive index, experimental value [default: 1.515]\nns (float): sample refractive index [default: 1.47]\nwvl (float): emission wavelength (microns) [default: 0.6]\nNA (float): numerical aperture [default: 1.4]\n```\n\n## Comparison with other models\n\nWhile these models are definitely slower than the one implemented in [Li et al\n(2017)](https://doi.org/10.1364/JOSAA.34.001029) and\n[MicroscPSF](https://github.com/MicroscPSF), there are some interesting\ndifferences between the scalar and vectorial approximations, particularly with\nhigher NA lenses, non-ideal sample refractive index, and increasing spherical\naberration with depth from the coverslip.\n\nFor an interactive comparison, see the [examples.ipynb](notebooks/examples.ipynb) Jupyter\nnotebook.\n\n## Lightsheet PSF utility function\n\nThe `psfmodels.tot_psf()` function provides a quick way to simulate the total\nsystem PSF (excitation x detection) as might be observed on a light sheet\nmicroscope (currently, only strictly orthogonal illumination and detection are\nsupported). See the [lightsheet.ipynb](notebooks/lightsheet.ipynb) Jupyter notebook for\nexamples.\n",
"bugtrack_url": null,
"license": "GPL-3.0",
"summary": "Scalar and vectorial models of the microscope point spread function (PSF).",
"version": "0.3.3",
"project_urls": {
"Homepage": "https://github.com/tlambert03/psfmodels",
"Source Code": "https://github.com/tlambert03/psfmodels"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0760f17f914a0d411108f7f44937816e480c41c955535945b94d9a446f140721",
"md5": "9f25241a821ac579fe3e871b744b58da",
"sha256": "44719f2fc8d7fa6e22a3ac05f2f0aa79c61c437ef6ed9d407175ef06e4aa1f7f"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp310-cp310-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "9f25241a821ac579fe3e871b744b58da",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 113134,
"upload_time": "2023-05-06T16:08:03",
"upload_time_iso_8601": "2023-05-06T16:08:03.979550Z",
"url": "https://files.pythonhosted.org/packages/07/60/f17f914a0d411108f7f44937816e480c41c955535945b94d9a446f140721/psfmodels-0.3.3-cp310-cp310-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f706e6f0831ffaebb1434d781b6f21132edf23d5f18a0786f510325c90f2852c",
"md5": "0c28d7acc5abdd00b92161c80c6d5ff7",
"sha256": "bfa93b79b4a00c9b24409508fd5f086dcd092f9ad1ad2f994c3121eb2ae39784"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp310-cp310-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "0c28d7acc5abdd00b92161c80c6d5ff7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 106132,
"upload_time": "2023-05-06T16:08:05",
"upload_time_iso_8601": "2023-05-06T16:08:05.671595Z",
"url": "https://files.pythonhosted.org/packages/f7/06/e6f0831ffaebb1434d781b6f21132edf23d5f18a0786f510325c90f2852c/psfmodels-0.3.3-cp310-cp310-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "28226fc28a14975d7308b54faa0309de6ed6013d6ce0d049274815c72ac41065",
"md5": "1fd8383dd804b2e8a2cfbc2dc3358ec8",
"sha256": "2fd544494a4aee0573bc0573e23033c3bf4f58f7145f9cfd5f784a7e08ab34cf"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "1fd8383dd804b2e8a2cfbc2dc3358ec8",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 158216,
"upload_time": "2023-05-06T16:08:07",
"upload_time_iso_8601": "2023-05-06T16:08:07.552849Z",
"url": "https://files.pythonhosted.org/packages/28/22/6fc28a14975d7308b54faa0309de6ed6013d6ce0d049274815c72ac41065/psfmodels-0.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0d02e50b8969552b8d8ce9a78dbaaee1a6ab2d4c48f695d6cbbf0de052ef2ed4",
"md5": "364f01187df01ef98bdb6f33a24c56e4",
"sha256": "f4cdf4bb035c4312fef8206f012a86f5670c0a4f7323eaffc7b6e94f49afbb8f"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp310-cp310-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "364f01187df01ef98bdb6f33a24c56e4",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 673894,
"upload_time": "2023-05-06T16:08:09",
"upload_time_iso_8601": "2023-05-06T16:08:09.390915Z",
"url": "https://files.pythonhosted.org/packages/0d/02/e50b8969552b8d8ce9a78dbaaee1a6ab2d4c48f695d6cbbf0de052ef2ed4/psfmodels-0.3.3-cp310-cp310-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d6498ab2f493ff0f3e576bac7756ef9339cdb8cc8a15df7ef71cd92761740373",
"md5": "d5e89bcafb1565ac4fd4feb270a2140e",
"sha256": "546e96d1298a0ee132eff06961b64c24b7e2f5d44b81f205ab79120a2f0eb0ae"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "d5e89bcafb1565ac4fd4feb270a2140e",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 111008,
"upload_time": "2023-05-06T16:08:11",
"upload_time_iso_8601": "2023-05-06T16:08:11.010939Z",
"url": "https://files.pythonhosted.org/packages/d6/49/8ab2f493ff0f3e576bac7756ef9339cdb8cc8a15df7ef71cd92761740373/psfmodels-0.3.3-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "12fb85cc651f15555dd6d1c0336cc8975b03e47372c5e68c4de68e8b105c96db",
"md5": "938f48533a5c444ddd16912e9658b66a",
"sha256": "55e27e40ccc0d2d6377d2801df67363879ef032ded5722b4a3f1dcc359d6f4ff"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp311-cp311-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "938f48533a5c444ddd16912e9658b66a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 113144,
"upload_time": "2023-05-06T16:08:12",
"upload_time_iso_8601": "2023-05-06T16:08:12.830084Z",
"url": "https://files.pythonhosted.org/packages/12/fb/85cc651f15555dd6d1c0336cc8975b03e47372c5e68c4de68e8b105c96db/psfmodels-0.3.3-cp311-cp311-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "39acc3134cbe0386f0b775a621f58b8d2fb948334bad2f534255c3baf4f8c7da",
"md5": "9f38580b66bdab0293555c634161ca13",
"sha256": "18cd28bd5fae8334dcabcb424e6de1ce42527661ef7197f94eec455ec64cf6ed"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "9f38580b66bdab0293555c634161ca13",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 106141,
"upload_time": "2023-05-06T16:08:14",
"upload_time_iso_8601": "2023-05-06T16:08:14.600807Z",
"url": "https://files.pythonhosted.org/packages/39/ac/c3134cbe0386f0b775a621f58b8d2fb948334bad2f534255c3baf4f8c7da/psfmodels-0.3.3-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2d380c2002e91c975a386092c2af5be87956dea0e50cfbc0f795baafe405a177",
"md5": "1da21969a8c60a982a3dc639947743a5",
"sha256": "28b4719506e2784e90edf191ae1fbb820c1455d661b10aed916a8fdec9448f81"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "1da21969a8c60a982a3dc639947743a5",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 158198,
"upload_time": "2023-05-06T16:08:16",
"upload_time_iso_8601": "2023-05-06T16:08:16.213919Z",
"url": "https://files.pythonhosted.org/packages/2d/38/0c2002e91c975a386092c2af5be87956dea0e50cfbc0f795baafe405a177/psfmodels-0.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "1c9b5fc5c787ba3aae60f2ba1888e390c3f1cc695be46c90b268794e6e413d06",
"md5": "c6306ab00aeac7af86106301adae8bc4",
"sha256": "7af483fe5868a1300763c3f9288756f867a8b4d8dd08d8eabec8342bd58ca65e"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp311-cp311-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "c6306ab00aeac7af86106301adae8bc4",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 673869,
"upload_time": "2023-05-06T16:08:17",
"upload_time_iso_8601": "2023-05-06T16:08:17.420543Z",
"url": "https://files.pythonhosted.org/packages/1c/9b/5fc5c787ba3aae60f2ba1888e390c3f1cc695be46c90b268794e6e413d06/psfmodels-0.3.3-cp311-cp311-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7750c9d02dd6ee9f7840a141b6a00a1bd6b1db75f981871074697e0edfd48205",
"md5": "1bee7f40793fd345b67d9ca7ff7b2e99",
"sha256": "6015f92f25834f04ef4d4a670bb02271e342f37955f2ea868387a6f3e76f61e1"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "1bee7f40793fd345b67d9ca7ff7b2e99",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 110980,
"upload_time": "2023-05-06T16:08:19",
"upload_time_iso_8601": "2023-05-06T16:08:19.080699Z",
"url": "https://files.pythonhosted.org/packages/77/50/c9d02dd6ee9f7840a141b6a00a1bd6b1db75f981871074697e0edfd48205/psfmodels-0.3.3-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ebab0d99ed81311bd5d30eb2dfd36db232b6cc5fefae084610cb66bd9e8ac040",
"md5": "281d6fb5ca4a274b1eca055965441716",
"sha256": "c41f5ac03e1c487fa90641e84fb82b3581b025b2bf2f9cb315b2e3808439c9c6"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp37-cp37m-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "281d6fb5ca4a274b1eca055965441716",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 112858,
"upload_time": "2023-05-06T16:08:20",
"upload_time_iso_8601": "2023-05-06T16:08:20.156805Z",
"url": "https://files.pythonhosted.org/packages/eb/ab/0d99ed81311bd5d30eb2dfd36db232b6cc5fefae084610cb66bd9e8ac040/psfmodels-0.3.3-cp37-cp37m-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0815b0ff3cea9e2302cdb342b6896057620f8caebe753d34beaa7f78cd5b0601",
"md5": "8f63a784cb891d836ce59b85a6bb7fcc",
"sha256": "b357a747a15e269fc83485e28918aab736b598a8820462d9e5f7708aa4734580"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8f63a784cb891d836ce59b85a6bb7fcc",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 158074,
"upload_time": "2023-05-06T16:08:22",
"upload_time_iso_8601": "2023-05-06T16:08:22.650124Z",
"url": "https://files.pythonhosted.org/packages/08/15/b0ff3cea9e2302cdb342b6896057620f8caebe753d34beaa7f78cd5b0601/psfmodels-0.3.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4fd5bcb4887f92ae02fde8c67d677a49a364c5748583f6064bc75974a447d530",
"md5": "a9e94d19a5c4a7a9ecfba25ecbb071d1",
"sha256": "9b89ae640281cff952a2136633fb97d35cf4335acde2e5c5201ea5ee02f565f8"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "a9e94d19a5c4a7a9ecfba25ecbb071d1",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 675150,
"upload_time": "2023-05-06T16:08:25",
"upload_time_iso_8601": "2023-05-06T16:08:25.080875Z",
"url": "https://files.pythonhosted.org/packages/4f/d5/bcb4887f92ae02fde8c67d677a49a364c5748583f6064bc75974a447d530/psfmodels-0.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "88e8ec26ba303fcc8b13d1ad370287b1dee79a3b057cc0d25cbc235e994385a7",
"md5": "3edccdfc69ef4d4104d082c37e56b44c",
"sha256": "ded17819fc961085e92b253b8d94a8bbade39bd26e1d9ab18c6fb33df83f588a"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp37-cp37m-win_amd64.whl",
"has_sig": false,
"md5_digest": "3edccdfc69ef4d4104d082c37e56b44c",
"packagetype": "bdist_wheel",
"python_version": "cp37",
"requires_python": ">=3.7",
"size": 111502,
"upload_time": "2023-05-06T16:08:26",
"upload_time_iso_8601": "2023-05-06T16:08:26.645289Z",
"url": "https://files.pythonhosted.org/packages/88/e8/ec26ba303fcc8b13d1ad370287b1dee79a3b057cc0d25cbc235e994385a7/psfmodels-0.3.3-cp37-cp37m-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "eebfac87e124c6d506049444ce48a3f65d3ffbefd8ccc629a82ad5c02bda18a6",
"md5": "bee6776bbb566124a074afb231f8d15c",
"sha256": "e297c1eaf6a811bc4ae913dfa573a9680ab75b675cc1559969d7b3ace9c99cbd"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp38-cp38-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "bee6776bbb566124a074afb231f8d15c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 113014,
"upload_time": "2023-05-06T16:08:29",
"upload_time_iso_8601": "2023-05-06T16:08:29.341165Z",
"url": "https://files.pythonhosted.org/packages/ee/bf/ac87e124c6d506049444ce48a3f65d3ffbefd8ccc629a82ad5c02bda18a6/psfmodels-0.3.3-cp38-cp38-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "623daff7bd9f8088def417d59a405fc662f54e8665db412e4c2523f15e4ee5f5",
"md5": "f275e13d0d49799d39f4df95be9b19f7",
"sha256": "de6cdb2af93094a7eb422dfb799105a15636e50d52cf2c30f761fa1f809e6c1e"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp38-cp38-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f275e13d0d49799d39f4df95be9b19f7",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 106010,
"upload_time": "2023-05-06T16:08:30",
"upload_time_iso_8601": "2023-05-06T16:08:30.666923Z",
"url": "https://files.pythonhosted.org/packages/62/3d/aff7bd9f8088def417d59a405fc662f54e8665db412e4c2523f15e4ee5f5/psfmodels-0.3.3-cp38-cp38-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ef23c2781eca08c63b1cb8dd51ad8e36ee270aa49464a5544d596e3969c13a88",
"md5": "94c99df3ae52dc34320008a0af037cb4",
"sha256": "0b141df4263050731ad68fb056fe52758c72978a35e2dbb781dbbce8ebdfe0fa"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "94c99df3ae52dc34320008a0af037cb4",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 158013,
"upload_time": "2023-05-06T16:08:32",
"upload_time_iso_8601": "2023-05-06T16:08:32.608247Z",
"url": "https://files.pythonhosted.org/packages/ef/23/c2781eca08c63b1cb8dd51ad8e36ee270aa49464a5544d596e3969c13a88/psfmodels-0.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3b997e84728c76341f593be9575bc2e113bb8d53c3899ad957b620403c00903c",
"md5": "e2952c0c7d0fc71d3881f0cad605cfae",
"sha256": "32b5e51d3c11c860dfdda18e8603da0f6ff24a6f063c8017ccf8a400ab9b1e25"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp38-cp38-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "e2952c0c7d0fc71d3881f0cad605cfae",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 673660,
"upload_time": "2023-05-06T16:08:33",
"upload_time_iso_8601": "2023-05-06T16:08:33.913365Z",
"url": "https://files.pythonhosted.org/packages/3b/99/7e84728c76341f593be9575bc2e113bb8d53c3899ad957b620403c00903c/psfmodels-0.3.3-cp38-cp38-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a4c16efab42af9520867b467f2fb1b32193795772f1440a1742c94fa2ac0a373",
"md5": "eb0f4a9f74d04ac432ee1eac5b22c431",
"sha256": "007e989bebd872a16b4352c7e02798a9f6f13c246c1d7b32d390aa5da1865118"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "eb0f4a9f74d04ac432ee1eac5b22c431",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 110967,
"upload_time": "2023-05-06T16:08:35",
"upload_time_iso_8601": "2023-05-06T16:08:35.471471Z",
"url": "https://files.pythonhosted.org/packages/a4/c1/6efab42af9520867b467f2fb1b32193795772f1440a1742c94fa2ac0a373/psfmodels-0.3.3-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e82270f9157216d3e1bcec5cd638ce1632f50c8109f7e56d81707a5182c20a95",
"md5": "192b67174052d77783c2aaf52d98df5a",
"sha256": "73bcc890242edd589c343007cdaee6e7085b7b608bf465136446a70fa431dde2"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp39-cp39-macosx_10_9_x86_64.whl",
"has_sig": false,
"md5_digest": "192b67174052d77783c2aaf52d98df5a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 113235,
"upload_time": "2023-05-06T16:08:36",
"upload_time_iso_8601": "2023-05-06T16:08:36.658526Z",
"url": "https://files.pythonhosted.org/packages/e8/22/70f9157216d3e1bcec5cd638ce1632f50c8109f7e56d81707a5182c20a95/psfmodels-0.3.3-cp39-cp39-macosx_10_9_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "98e0cb9c860c095cbba3e83b001c6c67ea105c7e4222d3a5a5dd5d6f44149f46",
"md5": "4b18fdfd8059a3e6dcc4c9d3f129dda3",
"sha256": "394e91167374df7b1a99840575efd3081423c489a5e86fadcfc6416667cb7942"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp39-cp39-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "4b18fdfd8059a3e6dcc4c9d3f129dda3",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 106217,
"upload_time": "2023-05-06T16:08:37",
"upload_time_iso_8601": "2023-05-06T16:08:37.927266Z",
"url": "https://files.pythonhosted.org/packages/98/e0/cb9c860c095cbba3e83b001c6c67ea105c7e4222d3a5a5dd5d6f44149f46/psfmodels-0.3.3-cp39-cp39-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b8e64aef2196f25fc904c8416062992d6aee692f060b4d6d7d0eabab2a5474b3",
"md5": "bcab2a4977d3ac835a944b93159bba59",
"sha256": "892c4f878ca18c8d924298a59e85ac74acd2044326321e10053f9a04092028d7"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "bcab2a4977d3ac835a944b93159bba59",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 158140,
"upload_time": "2023-05-06T16:08:39",
"upload_time_iso_8601": "2023-05-06T16:08:39.850788Z",
"url": "https://files.pythonhosted.org/packages/b8/e6/4aef2196f25fc904c8416062992d6aee692f060b4d6d7d0eabab2a5474b3/psfmodels-0.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "bca64510a7a3008e8f6874c4645d19b7d2846a470ff88f5c4dbd583b55c81ab8",
"md5": "a02797d024430123d1783630ff52983e",
"sha256": "faeee699758b5c8415159461b1df984b32e10d0c8ffafed627278e33cc0958b6"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp39-cp39-musllinux_1_1_x86_64.whl",
"has_sig": false,
"md5_digest": "a02797d024430123d1783630ff52983e",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 673938,
"upload_time": "2023-05-06T16:08:40",
"upload_time_iso_8601": "2023-05-06T16:08:40.942797Z",
"url": "https://files.pythonhosted.org/packages/bc/a6/4510a7a3008e8f6874c4645d19b7d2846a470ff88f5c4dbd583b55c81ab8/psfmodels-0.3.3-cp39-cp39-musllinux_1_1_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "03c270dfcbc094505b1831f272ad49cac3d77595a3de2fb50c4d45940a25f787",
"md5": "8f91b7057e68a6d7250493452704de93",
"sha256": "7ef1d766540d7f1cfe3a22f6ad6057e28672b523fcb4ba012c333d2079f7cf9c"
},
"downloads": -1,
"filename": "psfmodels-0.3.3-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "8f91b7057e68a6d7250493452704de93",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 110696,
"upload_time": "2023-05-06T16:08:42",
"upload_time_iso_8601": "2023-05-06T16:08:42.187616Z",
"url": "https://files.pythonhosted.org/packages/03/c2/70dfcbc094505b1831f272ad49cac3d77595a3de2fb50c4d45940a25f787/psfmodels-0.3.3-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9265c2d27897c4cbb9d36e83a65ace5543b490af4160e85bcf5c6c03eb30c7e6",
"md5": "2a861cafd2eac04adef35a0817eb831a",
"sha256": "4dd4388f26b731d0a39b1e0593648c02aff108a89dea2218632536479e24de57"
},
"downloads": -1,
"filename": "psfmodels-0.3.3.tar.gz",
"has_sig": false,
"md5_digest": "2a861cafd2eac04adef35a0817eb831a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 581117,
"upload_time": "2023-05-06T16:08:44",
"upload_time_iso_8601": "2023-05-06T16:08:44.768233Z",
"url": "https://files.pythonhosted.org/packages/92/65/c2d27897c4cbb9d36e83a65ace5543b490af4160e85bcf5c6c03eb30c7e6/psfmodels-0.3.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-06 16:08:44",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tlambert03",
"github_project": "psfmodels",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "psfmodels"
}