psfmodels


Namepsfmodels JSON
Version 0.3.3 PyPI version JSON
download
home_pagehttps://github.com/tlambert03/psfmodels
SummaryScalar and vectorial models of the microscope point spread function (PSF).
upload_time2023-05-06 16:08:44
maintainer
docs_urlNone
authorTalley Lambert
requires_python>=3.7
licenseGPL-3.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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 &copy; 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"
}
        
Elapsed time: 0.07898s