diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 70c891f1..7b0d0049 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,19 +1,25 @@ name: Publish to Docker + on: push: - branches: - - master + tags: + - 'v*' jobs: build: runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[docker skip]')" steps: - - uses: actions/checkout@master - - name: Publish to Registry - uses: docker/build-push-action@v1 + - uses: actions/checkout@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to DockerHub + uses: docker/login-action@v3 with: - repository: mmtobservatory/mmtwfs username: ${{ secrets.DOCKER_USER }} password: ${{ secrets.DOCKER_TOKEN }} - tags: latest + - name: Build and Push + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: mmtobservatory/mmtwfs:latest diff --git a/.github/workflows/mmtwfs-tests.yml b/.github/workflows/mmtwfs-tests.yml index 267730a4..2a5f06d6 100644 --- a/.github/workflows/mmtwfs-tests.yml +++ b/.github/workflows/mmtwfs-tests.yml @@ -21,17 +21,15 @@ jobs: envs: | - linux: codestyle pytest: false - - linux: py39-alldeps-cov - name: py39 - - macos: py39 - name: py39-macos - - linux: py38-astropylts - name: py38-astropyLTS + - linux: py313-alldeps-cov + name: py313 + - linux: py313-astropydev + name: py313-astropy-latest + continue-on-error: true + - linux: py313-numpydev + name: py313-numpy-latest + continue-on-error: true - linux: build_docs - - linux: linkcheck -# - linux: py310-astropydev-numpydev -# name: py310-dev -# continue-on-error: true coverage: 'codecov' secrets: CODECOV_TOKEN: ${{ secrets.CODECOV }} diff --git a/.gitignore b/.gitignore index 51dac79c..e62dca63 100644 --- a/.gitignore +++ b/.gitignore @@ -98,3 +98,4 @@ ENV/ # Rope project settings .ropeproject .tmp +notebooks/*.fits diff --git a/Dockerfile b/Dockerfile index a1857aae..51671057 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM python:latest +FROM python:3.13 LABEL maintainer="te.pickering@gmail.com" COPY . . -RUN pip install -e .[all,test] +RUN pip install -e .[test] diff --git a/docs/conf.py b/docs/conf.py index 6568bf60..eadaee85 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -30,19 +30,14 @@ import datetime from importlib import import_module +from mmtwfs.version import version as __version__ + try: from sphinx_astropy.conf.v1 import * # noqa except ImportError: print('ERROR: the documentation requires the sphinx-astropy package to be installed') sys.exit(1) -# Get configuration information from setup.cfg -from configparser import ConfigParser -conf = ConfigParser() - -conf.read([os.path.join(os.path.dirname(__file__), '..', 'setup.cfg')]) -setup_cfg = dict(conf.items('metadata')) - # -- General configuration ---------------------------------------------------- # By default, highlight as Python 3. @@ -67,22 +62,22 @@ # -- Project information ------------------------------------------------------ # This does not *have* to match the package name, but typically does -project = setup_cfg['name'] -author = setup_cfg['author'] +project = "mmtwfs" +author = "T. E. Pickering" copyright = '{0}, {1}'.format( - datetime.datetime.now().year, setup_cfg['author']) + datetime.datetime.now().year, "T. E. Pickering") # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -import_module(setup_cfg['name']) -package = sys.modules[setup_cfg['name']] +import_module("mmtwfs") +package = sys.modules["mmtwfs"] # The short X.Y version. -version = package.__version__.split('-', 1)[0] +version = __version__.split('-', 1)[0] # The full version, including alpha/beta/rc tags. -release = package.__version__ +release = __version__ # -- Options for HTML output -------------------------------------------------- @@ -151,21 +146,8 @@ man_pages = [('index', project.lower(), project + u' Documentation', [author], 1)] - -# -- Options for the edit_on_github extension --------------------------------- - -if setup_cfg.get('edit_on_github').lower() == 'true': - - extensions += ['sphinx_astropy.ext.edit_on_github'] - - edit_on_github_project = setup_cfg['github_project'] - edit_on_github_branch = "master" - - edit_on_github_source_root = "" - edit_on_github_doc_root = "docs" - # -- Resolving issue number to links in changelog ----------------------------- -github_issues_url = 'https://github.com/{0}/issues/'.format(setup_cfg['github_project']) +github_issues_url = 'https://github.com/{0}/issues/'.format("mmtwfs") # -- Turn on nitpicky mode for sphinx (to warn about references not found) ---- # diff --git a/mmtwfs/__init__.py b/mmtwfs/__init__.py index b5fa884c..db10858b 100644 --- a/mmtwfs/__init__.py +++ b/mmtwfs/__init__.py @@ -1,28 +1,3 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst """ The ``mmtwfs`` package is a collection of code that for analyzing Shack-Hartmann wavefront sensor data for the MMTO """ - -# Affiliated packages may add whatever they like to this file, but -# should keep this content at the top. -# ---------------------------------------------------------------------------- -from ._astropy_init import * # noqa -# ---------------------------------------------------------------------------- - -# Enforce Python version check during package import. -# This is the same check as the one at the top of setup.py -import sys -from distutils.version import LooseVersion - -__minimum_python_version__ = "3.7" - -__all__ = [] - - -class UnsupportedPythonError(Exception): - pass - - -if LooseVersion(sys.version) < LooseVersion(__minimum_python_version__): - raise UnsupportedPythonError("mmtwfs does not support Python < {}" - .format(__minimum_python_version__)) diff --git a/mmtwfs/_astropy_init.py b/mmtwfs/_astropy_init.py deleted file mode 100644 index 2dffe8fd..00000000 --- a/mmtwfs/_astropy_init.py +++ /dev/null @@ -1,52 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst - -__all__ = ['__version__'] - -# this indicates whether or not we are in the package's setup.py -try: - _ASTROPY_SETUP_ -except NameError: - import builtins - builtins._ASTROPY_SETUP_ = False - -try: - from .version import version as __version__ -except ImportError: - __version__ = '' - - -if not _ASTROPY_SETUP_: # noqa - import os - from warnings import warn - from astropy.config.configuration import ( - update_default_config, - ConfigurationDefaultMissingError, - ConfigurationDefaultMissingWarning) - - # Create the test function for self test - from astropy.tests.runner import TestRunner - test = TestRunner.make_test_runner_in(os.path.dirname(__file__)) - test.__test__ = False - __all__ += ['test'] - - # add these here so we only need to cleanup the namespace at the end - config_dir = None - - if not os.environ.get('ASTROPY_SKIP_CONFIG_UPDATE', False): - config_dir = os.path.dirname(__file__) - config_template = os.path.join(config_dir, __package__ + ".cfg") - if os.path.isfile(config_template): - try: - update_default_config( - __package__, config_dir, version=__version__) - except TypeError as orig_error: - try: - update_default_config(__package__, config_dir) - except ConfigurationDefaultMissingError as e: - wmsg = (e.args[0] + - " Cannot install default profile. If you are " - "importing from source, this is expected.") - warn(ConfigurationDefaultMissingWarning(wmsg)) - del e - except Exception: - raise orig_error diff --git a/mmtwfs/config.py b/mmtwfs/config.py index b463bd19..ad536307 100644 --- a/mmtwfs/config.py +++ b/mmtwfs/config.py @@ -5,13 +5,15 @@ config.py - Configuration data and utility functions """ -import os -import pkg_resources +import importlib import astropy.units as u -__all__ = ['recursive_subclasses', 'merge_config', 'mmtwfs_config'] +__all__ = ["recursive_subclasses", "merge_config", "mmtwfs_config"] + + +WFS_DATA_DIR = importlib.resources.files(__name__) / "data" def recursive_subclasses(cls): @@ -79,25 +81,34 @@ def merge_config(*dicts): """ MMTO optics numbers are taken from http://www.mmto.org/sites/default/files/mmt_conv7_2.pdf. -FLWO optics numbers are taken from Deb Woods' memo. Unsure if the description is published online somewhere... +FLWO optics numbers are taken from Deb Woods' memo. Unsure if the description is +published online somewhere... """ mmtwfs_config = { "telescope": { "mmt": { - "diameter": 6502.4 * u.mm, # primary diameter - "bcv_radius": 3228.5 * u.mm, # radius to use when normalizing BCV finite element coordinates - "n_supports": 4, # number of secondary support struts - "support_width": 0.12 * u.m, # width of support struts in meters - "support_offset": 45. * u.deg, # offset of support struts in degrees - "psf_pixel_scale": 0.02, # arcsec/pixel - "psf_fov": 1.0, # arcsec + # primary diameter + "diameter": 6502.4 * u.mm, + # radius to use when normalizing BCV coordinates + "bcv_radius": 3228.5 * u.mm, + # number of secondary support struts + "n_supports": 4, + # width of support struts in meters + "support_width": 0.12 * u.m, + # offset of support struts in degrees + "support_offset": 45.0 * u.deg, + # arcsec/pixel + "psf_pixel_scale": 0.02, + # arcsec + "psf_fov": 1.0, # influence matrix to map actuator forces to surface displacement - "surf2act_file": pkg_resources.resource_filename(__name__, os.path.join("data", "Surf2ActTEL_32.bin")), + "surf2act_file": WFS_DATA_DIR / "Surf2ActTEL_32.bin", # coordinates of finite element nodes used in surf2act - "nodecoor_file": pkg_resources.resource_filename(__name__, os.path.join("data", "bcv_node_coordinates.dat")), + "nodecoor_file": WFS_DATA_DIR / "bcv_node_coordinates.dat", # coordinates of the force actuators - "actuator_file": pkg_resources.resource_filename(__name__, os.path.join("data", "actuator_coordinates.dat")), - "zern_map": { # map the old zernike mode indexing scheme to the Noll scheme used in ZernikeVector + "actuator_file": WFS_DATA_DIR / "actuator_coordinates.dat", + # map the old zernike mode indexing scheme to the Noll scheme used in ZernikeVector + "zern_map": { "Z02": 0, "Z03": 1, "Z04": 2, @@ -116,36 +127,54 @@ def merge_config(*dicts): "Z17": 17, "Z18": 14, "Z19": 15, - "Z22": 18 - } + "Z22": 18, + }, }, "flwo12": { - "diameter": 1219.225 * u.mm, # primary diameter - "n_supports": 4, # number of secondary support struts - "support_width": 0.03 * u.m, # width of support struts in meters - "support_offset": 0. * u.deg, # offset of support struts in degrees - "psf_pixel_scale": 0.02, # arcsec/pixel - "psf_fov": 1.0 # arcsec + # primary diameter + "diameter": 1219.225 * u.mm, + # number of secondary support struts + "n_supports": 4, + # width of support struts in meters + "support_width": 0.03 * u.m, + # offset of support struts in degrees + "support_offset": 0.0 * u.deg, + # arcsec/pixel + "psf_pixel_scale": 0.02, + # arcsec + "psf_fov": 1.0, }, "flwo15": { - "diameter": 1500.0 * u.mm, # primary diameter - "n_supports": 4, # number of secondary support struts - "support_width": 0.03 * u.m, # width of support struts in meters - "support_offset": 45. * u.deg, # offset of support struts in degrees - "psf_pixel_scale": 0.02, # arcsec/pixel - "psf_fov": 1.0 # arcsec - } + # primary diameter + "diameter": 1500.0 * u.mm, + # number of secondary support struts + "n_supports": 4, + # width of support struts in meters + "support_width": 0.03 * u.m, + # offset of support struts in degrees + "support_offset": 45.0 * u.deg, + # arcsec/pixel + "psf_pixel_scale": 0.02, + # arcsec + "psf_fov": 1.0, + }, }, "secondary": { "f5": { "telescope": "mmt", "hexserv": "_hexapod._tcp.mmto.arizona.edu", - "diameter": 1688.0 * u.mm, # clear aperture of secondary - "plate_scale": 0.167 * u.mm / u.arcsec, # plate scale of the focal plane (this is for spectroscopic mode) - "theta_cc": 79.0 * u.nm / u.arcsec, # nm of coma per arcsec of center-of-curvature tilt. - "cc_trans": 24.97 * u.um / u.arcsec, # um of hexapod translation per arcsec of center-of-curvature tilt. - "zc_trans": 9.453 * u.um / u.arcsec, # um of hexapod translation per arcsec of zero-coma tilt. - "focus_trans": 40.8 * u.nm / u.um # nm of defocus per um of hexapod Z (focus) translation. + # clear aperture of secondary + "diameter": 1688.0 * u.mm, + # plate scale of the focal plane (this is for spectroscopic mode + "plate_scale": 0.167 * u.mm / u.arcsec, + # nm of coma per arcsec of center-of-curvature tilt. + "theta_cc": 79.0 * u.nm / u.arcsec, + # um of hexapod translation per arcsec of center-of-curvature tilt. + "cc_trans": 24.97 * u.um / u.arcsec, + # um of hexapod translation per arcsec of zero-coma tilt. + "zc_trans": 9.453 * u.um / u.arcsec, + # nm of defocus per um of hexapod Z (focus) translation. + "focus_trans": 40.8 * u.nm / u.um, }, "f9": { "telescope": "mmt", @@ -155,344 +184,400 @@ def merge_config(*dicts): "theta_cc": 44.4 * u.nm / u.arcsec, "cc_trans": 13.6 * u.um / u.arcsec, "zc_trans": 5.86 * u.um / u.arcsec, - "focus_trans": 34.7 * u.nm / u.um + "focus_trans": 34.7 * u.nm / u.um, }, "flwo12": { "telescope": "flwo12", - "diameter": 310.295 * u.mm, # clear aperture of secondary - "plate_scale": 0.0455 * u.mm / u.arcsec # plate scale of the focal plane + # clear aperture of secondary + "diameter": 310.295 * u.mm, + # plate scale of the focal plane + "plate_scale": 0.0455 * u.mm / u.arcsec, }, "flwo15": { "telescope": "flwo15", - "diameter": 230.0 * u.mm, # clear aperture of secondary - "plate_scale": 0.056 * u.mm / u.arcsec # plate scale of the focal plane - } + # clear aperture of secondary + "diameter": 230.0 * u.mm, + # plate scale of the focal plane + "plate_scale": 0.056 * u.mm / u.arcsec, + }, }, "wfs": { "f5": { "name": "Hecto WFS", - "telescope": "mmt", # telescope used with WFS system - "secondary": "f5", # secondary used with WFS system + # telescope used with WFS system + "telescope": "mmt", + # secondary used with WFS system + "secondary": "f5", "default_mode": "hecto", - "eff_wave": 600 * u.nm, # effective wavelength of the thruput response of the system - "cor_coords": [251.0, 267.0], # image coordinates of the center of rotation - "find_fwhm": 9.0, # FWHM for DAOfind kernel - "find_thresh": 5.0, # threshold for DAOfind - "cen_thresh": 0.7, # threshold for finding peaks in correlation image used for pupil registration - "cen_sigma": 10.0, # sigma of smoothing kernel used on data before pupil registration - "cen_tol": 50., # distance from cor_coords allowed for a wavefront analysis to be considered potentially valid - "rotation": 234.0 * u.deg, # rotation of aperture locations w.r.t. the primary mirror - "lenslet_pitch": 600 * u.um, # width of each lenslet - "lenslet_fl": 40 * u.mm, # focal length of each lenslet_fl - "pix_um": 20 * u.um, # pixel size in micrometers - "pix_size": 0.135 * u.arcsec, # arcsec per WFS detector pixel - "pup_size": 450, # pixels - "pup_inner": 45, # inner obscuration radius in pixels - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": -1, # E/W flip in image motion - "el_parity": -1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "f5_mask.fits")), - "reference_file": pkg_resources.resource_filename( - __name__, - os.path.join("data", "ref_images", "f5_hecto_ref.fits") - ), - "aberr_table_file": pkg_resources.resource_filename( - __name__, - os.path.join("data", "f5zernfield_std_curvedsurface.TXT") - ), + # effective wavelength of the thruput response of the system + "eff_wave": 600 * u.nm, + # image coordinates of the center of rotation + "cor_coords": [251.0, 267.0], + # FWHM for DAOfind kernel + "find_fwhm": 9.0, + # threshold for DAOfind + "find_thresh": 5.0, + # threshold for finding peaks in correlation image used for pupil registration + "cen_thresh": 0.7, + # sigma of smoothing kernel used on data before pupil registration + "cen_sigma": 10.0, + # distance from cor_coords allowed for a wavefront analysis to be considered potentially valid + "cen_tol": 50.0, + # rotation of aperture locations w.r.t. the primary mirror + "rotation": 234.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 600 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 40 * u.mm, + # pixel size in micrometers + "pix_um": 20 * u.um, + # arcsec per WFS detector pixel + "pix_size": 0.135 * u.arcsec, + # pixels + "pup_size": 450, + # inner obscuration radius in pixels + "pup_inner": 45, + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": -1, + # N/S flip in image motion + "el_parity": -1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "f5_mask.fits", + "reference_file": WFS_DATA_DIR / "ref_images" / "f5_hecto_ref.fits", + "aberr_table_file": WFS_DATA_DIR / "f5zernfield_std_curvedsurface.TXT", "modes": { "megacam": { "label": "Megacam", "ref_zern": { - "Z04": -468. * u.nm, # defocus - "Z11": -80. * u.nm # primary spherical + # defocus + "Z04": -468.0 * u.nm, + # primary spherical + "Z11": -80.0 * u.nm, }, }, "hecto": { "label": "Hecto", - "ref_zern": { - "Z04": -2810. * u.nm, - "Z11": -150. * u.nm - }, + "ref_zern": {"Z04": -2810.0 * u.nm, "Z11": -150.0 * u.nm}, }, "mmtcam": { "label": "MMTCam", - "ref_zern": { - "Z04": -500. * u.nm, - "Z11": -150. * u.nm - }, + "ref_zern": {"Z04": -500.0 * u.nm, "Z11": -150.0 * u.nm}, }, "maestro": { "label": "Maestro", - "ref_zern": { - "Z04": -2820. * u.nm, - "Z11": -150. * u.nm - }, + "ref_zern": {"Z04": -2820.0 * u.nm, "Z11": -150.0 * u.nm}, }, "swirc": { "label": "SWIRC", - "ref_zern": { - "Z04": -2017. * u.nm, - "Z11": -1079. * u.nm - } - } - } + "ref_zern": {"Z04": -2017.0 * u.nm, "Z11": -1079.0 * u.nm}, + }, + }, }, "f9": { "name": "F/9 WFS with Apogee Camera", - "telescope": "mmt", # telescope used with WFS system + # telescope used with WFS system + "telescope": "mmt", "secondary": "f9", "default_mode": "blue", - "eff_wave": 780 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 780 * u.nm, "lampsrv": "_lampbox._tcp.mmto.arizona.edu", "cor_coords": [255.0, 255.0], "find_fwhm": 7.0, "find_thresh": 5.0, "cen_thresh": 0.7, "cen_sigma": 5.0, - "cen_tol": 50., - "rotation": -225. * u.deg, - "lenslet_pitch": 625 * u.um, # width of each lenslet - "lenslet_fl": 45 * u.mm, # focal length of each lenslet_fl - "pix_um": 20 * u.um, # pixel size in micrometers - "pix_size": 0.119 * u.arcsec, # old KX260e detector with 20 um pixels - "pup_size": 420, # pupil outer diameter in pixels - "pup_inner": 25, # inner obscuration radius in pixels - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": -1, # E/W flip in image motion - "el_parity": 1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "oldf9_mask.fits")), - "reference_file": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "f9_ref.fits")), + "cen_tol": 50.0, + "rotation": -225.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 625 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 45 * u.mm, + # pixel size in micrometers + "pix_um": 20 * u.um, + # old KX260e detector with 20 um pixels + "pix_size": 0.119 * u.arcsec, + # pupil outer diameter in pixels + "pup_size": 420, + # inner obscuration radius in pixels + "pup_inner": 25, + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": -1, + # N/S flip in image motion + "el_parity": 1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "oldf9_mask.fits", + "reference_file": WFS_DATA_DIR / "ref_images" / "f9_ref.fits", "modes": { "blue": { "label": "Blue Channel", - "ref_zern": { - "Z04": 7982. * u.nm - }, + "ref_zern": {"Z04": 7982.0 * u.nm}, }, "red": { "label": "Red Channel", - "ref_zern": { - "Z04": 7982. * u.nm - }, + "ref_zern": {"Z04": 7982.0 * u.nm}, }, "spol": { "label": "SPOL", - "ref_zern": { - "Z04": -308. * u.nm - }, - } - } + "ref_zern": {"Z04": -308.0 * u.nm}, + }, + }, }, "newf9": { "name": "F/9 WFS with SBIG Camera", - "telescope": "mmt", # telescope used with WFS system + # telescope used with WFS system + "telescope": "mmt", "secondary": "f9", "default_mode": "blue", - "eff_wave": 600 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 600 * u.nm, "lampsrv": "_lampbox._tcp.mmto.arizona.edu", "cor_coords": [376.0, 434.0], "find_fwhm": 12.0, "find_thresh": 5.0, "cen_thresh": 0.7, "cen_sigma": 15.0, - "cen_tol": 150., - "rotation": -225. * u.deg, - "lenslet_pitch": 625 * u.um, # width of each lenslet - "lenslet_fl": 45 * u.mm, # focal length of each lenslet_fl - "pix_um": 5.4 * u.um * 3, # pixel size in micrometers - "pix_size": 0.09639 * u.arcsec, # SBIG STT-8300 with 5.4 um pixels binned 3x3 - "pup_size": 570, # pupil outer diameter in pixels - "pup_inner": 25, # inner obscuration radius in pixels - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": 1, # E/W flip in image motion - "el_parity": -1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "newf9_mask.fits")), - "reference_file": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "f9_new_ref.fits")), + "cen_tol": 150.0, + "rotation": -225.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 625 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 45 * u.mm, + # pixel size in micrometers + "pix_um": 5.4 * u.um * 3, + # SBIG STT-8300 with 5.4 um pixels binned 3x3 + "pix_size": 0.09639 * u.arcsec, + # pupil outer diameter in pixels + "pup_size": 570, + # inner obscuration radius in pixels + "pup_inner": 25, + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": 1, + # N/S flip in image motion + "el_parity": -1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "newf9_mask.fits", + "reference_file": WFS_DATA_DIR / "ref_images" / "f9_new_ref.fits", "modes": { "blue": { "label": "Blue Channel", - "ref_zern": { - "Z04": 8282. * u.nm - }, + "ref_zern": {"Z04": 8282.0 * u.nm}, }, "red": { "label": "Red Channel", - "ref_zern": { - "Z04": 8282. * u.nm - }, + "ref_zern": {"Z04": 8282.0 * u.nm}, }, "spol": { "label": "SPOL", - "ref_zern": { - "Z04": -308. * u.nm - }, - } - } + "ref_zern": {"Z04": -308.0 * u.nm}, + }, + }, }, "mmirs": { "name": "MMIRS WFS", - "telescope": "mmt", # telescope used with WFS system + # telescope used with WFS system + "telescope": "mmt", "secondary": "f5", "default_mode": None, - "eff_wave": 750 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 762 * u.nm, "cor_coords": [245.0, 253.0], "find_fwhm": 8.0, "find_thresh": 4.0, "cen_thresh": 0.7, "cen_sigma": 6.0, - "cen_tol": 75., - "rotation": 180. * u.deg, # this is referenced to camera2. camera1 is camera2+180, but is flipped by image acq - "lenslet_pitch": 600 * u.um, # width of each lenslet - "lenslet_fl": 40 * u.mm, # focal length of each lenslet_fl - "pix_um": 13 * u.um * 2, # pixel size in micrometers, always binned 2x2 - "pix_size": 0.156 * u.arcsec, - "pup_size": 345, # pixels + "cen_tol": 75.0, + # this is referenced to camera2. camera1 is camera2+180, but is flipped by image acq + "rotation": 180.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 600 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 40 * u.mm, + # pixel size in micrometers, always binned 2x2 + "pix_um": 13 * u.um * 2, + "pix_size": 0.2035 * u.arcsec, + # pixels + "pup_size": 345, "pup_inner": 40, - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": 1, # E/W flip in image motion - "el_parity": 1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "mmirs_mask.fits")), - "aberr_table_file": pkg_resources.resource_filename(__name__, os.path.join("data", "mmirszernfield.tab")), + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": 1, + # N/S flip in image motion + "el_parity": 1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "mmirs_mask.fits", + "aberr_table_file": WFS_DATA_DIR / "mmirszernfield.tab", "modes": { "mmirs1": { "label": "Camera 1", - "ref_zern": { - "Z04": -3176. * u.nm - }, - "reference_file": pkg_resources.resource_filename( - __name__, - os.path.join("data", "ref_images", "mmirs_camera1_ref.fits") - ), + "ref_zern": {"Z04": -3176.0 * u.nm}, + "reference_file": WFS_DATA_DIR + / "ref_images" + / "mmirs_camera1_ref.fits", }, "mmirs2": { "label": "Camera 2", - "ref_zern": { - "Z04": 1059. * u.nm - }, - "reference_file": pkg_resources.resource_filename( - __name__, - os.path.join("data", "ref_images", "mmirs_camera2_ref.fits") - ), - } - } + "ref_zern": {"Z04": 1059.0 * u.nm}, + "reference_file": WFS_DATA_DIR + / "ref_images" + / "mmirs_camera2_ref.fits", + }, + }, }, "binospec": { "name": "Binospec WFS", - "telescope": "mmt", # telescope used with WFS system + # telescope used with WFS system + "telescope": "mmt", "secondary": "f5", "default_mode": "binospec", - "eff_wave": 600 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 670 * u.nm, "cor_coords": [269.0, 252.0], "find_fwhm": 7.0, "find_thresh": 5.0, "cen_thresh": 0.7, "cen_sigma": 6.0, - "cen_tol": 100., - "rotation": 180. * u.deg, # per j. kansky 9/26/2017 - "lenslet_pitch": 600 * u.um, # width of each lenslet - "lenslet_fl": 40 * u.mm, # focal length of each lenslet_fl - "pix_um": 13 * u.um * 2, # pixel size in micrometers, always binned 2x2 - "pix_size": 0.156 * u.arcsec, - "pup_size": 300, # pixels + "cen_tol": 100.0, + # per j. kansky 9/26/2017 + "rotation": 180.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 600 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 40 * u.mm, + # pixel size in micrometers, always binned 2x2 + "pix_um": 13 * u.um * 2, + "pix_size": 0.153 * u.arcsec, + # pixels + "pup_size": 300, "pup_inner": 45, - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": 1, # E/W flip in image motion - "el_parity": 1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "bino_mask.fits")), - "aberr_table_file": pkg_resources.resource_filename(__name__, os.path.join("data", "f5zernfield_flatsurface.tab")), + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": 1, + # N/S flip in image motion + "el_parity": 1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "bino_mask.fits", + "aberr_table_file": WFS_DATA_DIR / "f5zernfield_flatsurface.tab", "modes": { "binospec": { "label": "Binospec", - "ref_zern": { - "Z04": 0.0 * u.nm - }, - "reference_file": pkg_resources.resource_filename( - __name__, - os.path.join("data", "ref_images", "binospec_ref.fits") - ) + "ref_zern": {"Z04": 0.0 * u.nm}, + "reference_file": WFS_DATA_DIR / "ref_images" / "binospec_ref.fits", } - } + }, }, "flwo12": { "name": "FLWO 1.2m WFS", - "telescope": "flwo12", # telescope used with WFS system + # telescope used with WFS system + "telescope": "flwo12", "secondary": "flwo12", "default_mode": "default", - "eff_wave": 600 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 600 * u.nm, "cor_coords": [255.0, 255.0], "find_fwhm": 7.0, "find_thresh": 5.0, "cen_thresh": 0.7, "cen_sigma": 6.0, - "cen_tol": 75., - "rotation": 0. * u.deg, - "lenslet_pitch": 400. * u.um, # width of each lenslet - "lenslet_fl": 53 * u.mm, # focal length of each lenslet_fl - "pix_um": 20 * u.um, # pixel size in micrometers + "cen_tol": 75.0, + "rotation": 0.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 400.0 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 53 * u.mm, + # pixel size in micrometers + "pix_um": 20 * u.um, "pix_size": 0.24 * u.arcsec, - "pup_size": 420, # pupil outer diameter in pixels - "pup_inner": 40, # inner obscuration radius in pixels - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": -1, # E/W flip in image motion - "el_parity": 1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "flwo12_mask.fits")), - "reference_file": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "LED2sec_22.fits")), + # pupil outer diameter in pixels + "pup_size": 420, + # inner obscuration radius in pixels + "pup_inner": 40, + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": -1, + # N/S flip in image motion + "el_parity": 1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "flwo12_mask.fits", + "reference_file": WFS_DATA_DIR / "ref_images" / "LED2sec_22.fits", "modes": { "default": { "label": "FLWO 1.2m WFS", - "ref_zern": { - "Z04": 0. * u.nm - }, + "ref_zern": {"Z04": 0.0 * u.nm}, } - } + }, }, "flwo15": { "name": "FLWO 1.5m WFS", - "telescope": "flwo15", # telescope used with WFS system + # telescope used with WFS system + "telescope": "flwo15", "secondary": "flwo15", "default_mode": "default", - "eff_wave": 600 * u.nm, # effective wavelength of the thruput response of the system + # effective wavelength of the thruput response of the system + "eff_wave": 600 * u.nm, "cor_coords": [255.0, 255.0], "find_fwhm": 7.0, "find_thresh": 5.0, "cen_thresh": 0.7, "cen_sigma": 6.0, - "cen_tol": 75., - "rotation": 0. * u.deg, - "lenslet_pitch": 400. * u.um, # width of each lenslet - "lenslet_fl": 53 * u.mm, # focal length of each lenslet_fl - "pix_um": 20 * u.um, # pixel size in micrometers + "cen_tol": 75.0, + "rotation": 0.0 * u.deg, + # width of each lenslet + "lenslet_pitch": 400.0 * u.um, + # focal length of each lenslet_fl + "lenslet_fl": 53 * u.mm, + # pixel size in micrometers + "pix_um": 20 * u.um, "pix_size": 0.295 * u.arcsec, - "pup_size": 330, # pupil outer diameter in pixels - "pup_inner": 40, # inner obscuration radius in pixels - "m1_gain": 0.5, # default gain to apply to primary mirror corrections - "m2_gain": 1.0, # default gain to apply to secondary mirror corrections - "nzern": 21, # number of zernike modes to fit - "az_parity": -1, # E/W flip in image motion - "el_parity": 1, # N/S flip in image motion - "wfs_mask": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "flwo15_mask.fits")), - "reference_file": pkg_resources.resource_filename(__name__, os.path.join("data", "ref_images", "LED2sec_22.fits")), + # pupil outer diameter in pixels + "pup_size": 330, + # inner obscuration radius in pixels + "pup_inner": 40, + # default gain to apply to primary mirror corrections + "m1_gain": 0.5, + # default gain to apply to secondary mirror corrections + "m2_gain": 1.0, + # number of zernike modes to fit + "nzern": 21, + # E/W flip in image motion + "az_parity": -1, + # N/S flip in image motion + "el_parity": 1, + "wfs_mask": WFS_DATA_DIR / "ref_images" / "flwo15_mask.fits", + "reference_file": WFS_DATA_DIR / "ref_images" / "LED2sec_22.fits", "modes": { "default": { "label": "FLWO 1.5m WFS", - "ref_zern": { - "Z04": 0. * u.nm - }, + "ref_zern": {"Z04": 0.0 * u.nm}, } - } - } - } + }, + }, + }, } diff --git a/mmtwfs/conftest.py b/mmtwfs/conftest.py deleted file mode 100644 index 672b2733..00000000 --- a/mmtwfs/conftest.py +++ /dev/null @@ -1,49 +0,0 @@ -# This file is used to configure the behavior of pytest when using the Astropy -# test infrastructure. It needs to live inside the package in order for it to -# get picked up when running the tests inside an interpreter using -# packagename.test - -import os - -from astropy.version import version as astropy_version - -# For Astropy 3.0 and later, we can use the standalone pytest plugin -if astropy_version < '3.0': - from astropy.tests.pytest_plugins import * # noqa - del pytest_report_header - ASTROPY_HEADER = True -else: - try: - from pytest_astropy_header.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS - ASTROPY_HEADER = True - except ImportError: - ASTROPY_HEADER = False - - -def pytest_configure(config): - - if ASTROPY_HEADER: - - config.option.astropy_header = True - - # Customize the following lines to add/remove entries from the list of - # packages for which version numbers are displayed when running the tests. - PYTEST_HEADER_MODULES.pop('Pandas', None) - PYTEST_HEADER_MODULES['scikit-image'] = 'skimage' - - from . import __version__ - packagename = os.path.basename(os.path.dirname(__file__)) - TESTED_VERSIONS[packagename] = __version__ - -# Uncomment the last two lines in this block to treat all DeprecationWarnings as -# exceptions. For Astropy v2.0 or later, there are 2 additional keywords, -# as follow (although default should work for most cases). -# To ignore some packages that produce deprecation warnings on import -# (in addition to 'compiler', 'scipy', 'pygments', 'ipykernel', and -# 'setuptools'), add: -# modules_to_ignore_on_import=['module_1', 'module_2'] -# To ignore some specific deprecation warning messages for Python version -# MAJOR.MINOR or later, add: -# warnings_to_ignore_by_pyver={(MAJOR, MINOR): ['Message to ignore']} -# from astropy.tests.helper import enable_deprecations_as_exceptions # noqa -# enable_deprecations_as_exceptions() diff --git a/mmtwfs/custom_exceptions.py b/mmtwfs/custom_exceptions.py index 3073b253..b9956934 100644 --- a/mmtwfs/custom_exceptions.py +++ b/mmtwfs/custom_exceptions.py @@ -1,7 +1,13 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst # coding=utf-8 -__all__ = ['MMTWFSException', 'WFSConfigException', 'WFSCommandException', 'WFSAnalysisFailed', 'ZernikeException'] +__all__ = [ + "MMTWFSException", + "WFSConfigException", + "WFSCommandException", + "WFSAnalysisFailed", + "ZernikeException", +] class MMTWFSException(Exception): @@ -16,7 +22,7 @@ class MMTWFSException(Exception): """ - def __init__(self, value='Unspecified Error', results=None): + def __init__(self, value="Unspecified Error", results=None): super(MMTWFSException, self).__init__(self, value) self.results = results self.name = "Unspecified mmtwfs exception" @@ -26,6 +32,7 @@ class WFSConfigException(MMTWFSException): """ Raise when an error occurs due to invalid configuration data. """ + def __init__(self, value="Config Error", results=None): super(WFSConfigException, self).__init__(value, results=results) self.name = "Config Error" @@ -35,6 +42,7 @@ class WFSCommandException(MMTWFSException): """ Raise when an error occurs due to invalid command sent to a WFS system or invalid inputs given to WFS method. """ + def __init__(self, value="Command Error", results=None): super(WFSCommandException, self).__init__(value, results=results) self.name = "Command Error" @@ -44,6 +52,7 @@ class WFSAnalysisFailed(MMTWFSException): """ Raise when something is wrong with the WFS data that prevents it from being analyzed """ + def __init__(self, value="WFS Image Analysis Error", results=None): super(WFSAnalysisFailed, self).__init__(value, results=results) self.name = "Analysis Error" @@ -53,6 +62,7 @@ class ZernikeException(MMTWFSException): """ Raise when an error occurs in handling or configuring of ZernikeVectors """ + def __init__(self, value="Zernike Handling Error", results=None): super(ZernikeException, self).__init__(value, results=results) self.name = "Zernike Error" diff --git a/mmtwfs/data/null_forces b/mmtwfs/data/null_forces new file mode 100644 index 00000000..c816caa6 --- /dev/null +++ b/mmtwfs/data/null_forces @@ -0,0 +1,104 @@ +1 0.0 +2 0.0 +3 0.0 +4 0.0 +5 0.0 +6 0.0 +7 0.0 +8 0.0 +9 0.0 +10 0.0 +11 0.0 +12 0.0 +13 0.0 +14 0.0 +15 0.0 +16 0.0 +17 0.0 +18 0.0 +19 0.0 +20 0.0 +21 0.0 +22 0.0 +23 0.0 +24 0.0 +25 0.0 +26 0.0 +27 0.0 +28 0.0 +29 0.0 +30 0.0 +31 0.0 +32 0.0 +33 0.0 +34 0.0 +35 0.0 +36 0.0 +37 0.0 +38 0.0 +39 0.0 +40 0.0 +41 0.0 +42 0.0 +43 0.0 +44 0.0 +45 0.0 +46 0.0 +47 0.0 +48 0.0 +49 0.0 +50 0.0 +51 0.0 +52 0.0 +101 0.0 +102 0.0 +103 0.0 +104 0.0 +105 0.0 +106 0.0 +107 0.0 +108 0.0 +109 0.0 +110 0.0 +111 0.0 +112 0.0 +113 0.0 +114 0.0 +115 0.0 +116 0.0 +117 0.0 +118 0.0 +119 0.0 +120 0.0 +121 0.0 +122 0.0 +123 0.0 +124 0.0 +125 0.0 +126 0.0 +127 0.0 +128 0.0 +129 0.0 +130 0.0 +131 0.0 +132 0.0 +133 0.0 +134 0.0 +135 0.0 +136 0.0 +137 0.0 +138 0.0 +139 0.0 +140 0.0 +141 0.0 +142 0.0 +143 0.0 +144 0.0 +145 0.0 +146 0.0 +147 0.0 +148 0.0 +149 0.0 +150 0.0 +151 0.0 +152 0.0 diff --git a/mmtwfs/f9topbox.py b/mmtwfs/f9topbox.py index b8229b5e..01737aed 100644 --- a/mmtwfs/f9topbox.py +++ b/mmtwfs/f9topbox.py @@ -9,19 +9,20 @@ import logging import logging.handlers -from .utils import srvlookup +from mmtwfs.utils import srvlookup log = logging.getLogger("F/9 TopBox") log.setLevel(logging.INFO) -__all__ = ['CompMirror'] +__all__ = ["CompMirror"] class CompMirror(object): """ Defines how to query and command the comparison mirror within the F/9 topbox """ + def __init__(self, host=None, port=None): # use this boolean to determine if commands are actually to be sent self.connected = False @@ -61,7 +62,9 @@ def netsock(self): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(topbox_server) except Exception as e: - log.error(f"Error connecting to topbox server. Remaining disconnected...: {e}") + log.error( + f"Error connecting to topbox server. Remaining disconnected...: {e}" + ) return None return sock @@ -73,7 +76,7 @@ def get_mirror(self): if self.connected: sock = self.netsock() sock.sendall(b"get_mirror\n") - result = sock.recv(4096).decode('utf8') + result = sock.recv(4096).decode("utf8") sock.shutdown(socket.SHUT_RDWR) sock.close() if "OUT" in result: @@ -101,7 +104,7 @@ def _move_mirror(self, cmd): sock = self.netsock() netcmd = f"set_mirror_exclusive {cmd}\n" sock.sendall(netcmd.encode("utf8")) - result = sock.recv(4096).decode('utf8') + result = sock.recv(4096).decode("utf8") sock.shutdown(socket.SHUT_RDWR) sock.close() if "X" in result: @@ -114,7 +117,9 @@ def _move_mirror(self, cmd): else: log.warning("Topbox not connected. Can't send motion command.") else: - log.error(f"Invalid comparison mirror command, {cmd}, send to topbox. Must be 'in' or 'out'") + log.error( + f"Invalid comparison mirror command, {cmd}, send to topbox. Must be 'in' or 'out'" + ) return state def mirror_in(self): diff --git a/mmtwfs/mmtcell.py b/mmtwfs/mmtcell.py new file mode 100644 index 00000000..f6bf5444 --- /dev/null +++ b/mmtwfs/mmtcell.py @@ -0,0 +1,178 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +# coding=utf-8 + +import asyncio +import logging +import re +import importlib +from pathlib import Path + + +log = logging.getLogger("Cell") +log.setLevel(logging.DEBUG) + + +class Cell: + """ + Async class to manage communications with the MMT primary mirror cell's control computer + + Attributes + ---------- + writer : asyncio connection stream handler + Handles writing and draining the stream + reader : asyncio connection stream handler + Handles reading the stream + timeout : int + Timeout for connecting to indiserver using future wait for + read_width : int + Amount to read from the stream per read + """ + + def __init__(self): + self.writer = None + self.reader = None + self.timeout = 3 + self.read_width = 30000 + + async def connect(self): + """ + Connect to the cell + """ + log.debug("Connecting to the cell") + future = asyncio.open_connection("mmtcell", 5810) + # Handle timeouts or cell not available + try: + self.reader, self.writer = await asyncio.wait_for( + future, timeout=self.timeout + ) + except asyncio.TimeoutError: + log.debug("Timed out trying to connect to the cell.") + raise + except ConnectionRefusedError: + log.debug("Connection to cell refused.") + raise + + self.ident() + + return None + + async def disconnect(self): + """ + Disconnect from the cell + + If connected, this will close the writer and wait for it to close. + Then it will reset the read/write stream handlers. + """ + if self.is_connected: + log.debug("Disconnecting from the cell") + self.writer.close() + await self.writer.wait_closed() + + # reset stream handlers + self.reset() + + return None + + def reset(self): + """ + Reset the stream handlers + """ + log.debug("Resetting stream handlers") + self.reader = self.writer = None + return None + + @property + def is_connected(self): + """ + Returns True is writer and reader stream handlers have been initialized + """ + return self.writer is not None and self.reader is not None + + async def send(self, msg): + """ + Send message to cell + + Parameters + ---------- + msg : str + Message to send to shell + + Returns + ------- + None + """ + if self.is_connected: + log.debug(f"Sending message: {msg}") + # the cell code predates UTF-8 by many years so encode to ascii to be safe + msg = msg.encode("ascii", "ignore") + self.writer.write(msg) + await self.writer.drain() + else: + log.warning(f"Cell not connected, {msg} not sent") + + return None + + async def recv(self): + """ + Receive message from the cell + """ + response = None + if self.is_connected: + log.debug("Receiving message from cell") + if self.reader.at_eof(): + raise Exception("No data available from cell connection") + + response = await self.reader.read(self.read_width) + response = response.decode("ascii") + log.debug(f"Received from cell: {response}") + else: + log.warning("Can't receive data, cell not connected") + + return response + + async def ident(self): + """ + Send ident to the cell so it can log who's talking to it + """ + response = None + if self.is_connected: + id_msg = "@ident mmtwfs\n" + self.send(id_msg) + response = await self.recv() + else: + log.warning("Can't sent ident command to cell, not connected") + + return response + + async def send_force_file(self, forcefile): + """ + Send file containing influence forces to the cell + """ + response = None + forcefile = Path(forcefile) + if forcefile.exists() and self.is_connected: + self.send(f"set_zinf_newtons {forcefile.name}\n") + with open(forcefile, "r") as fp: + for line in fp.readlines(): + if re.search("^#", line) or re.search(r"^\s*$", line): # noqa + continue + line = line.replace("\t", " ") + self.send(line) + self.send(".EOF\n") + response = await self.recv() + else: + if not self.is_connected: + log.warning("Can't send forces to cell, not connected") + if not forcefile.exists(): + log.warning(f"Cell force file, {forcefile}, does not exist") + + return response + + async def send_null_forces(self): + """ + Send file containing null force set to the cell + """ + response = None + forcefile = importlib.resources.files(__name__) / "data" / "null_forces" + response = await self.send_force_file(forcefile) + return response diff --git a/mmtwfs/photometry.py b/mmtwfs/photometry.py new file mode 100644 index 00000000..38b9207b --- /dev/null +++ b/mmtwfs/photometry.py @@ -0,0 +1,78 @@ +""" +This module provides tools for performing photometry on spots in Shack-Hartmann +WFS images. +""" + +import numpy as np +from scipy import ndimage + +from astropy.stats import SigmaClip + +from photutils.segmentation.detect import detect_sources, detect_threshold + + +def make_spot_mask( + data, nsigma, npixels, mask=None, sigclip_sigma=3.0, sigclip_iters=5, dilate_size=11 +): + """ + Make a WFS spot mask using source segmentation and binary dilation. This + is a modified version of the deprecated function + `~photutils.segmentation.detect.mask_source_mask` + + Parameters + ---------- + data : 2D `~numpy.ndarray` + The 2D array of the image. + + .. note:: + It is recommended that the user convolve the data with + ``kernel`` and input the convolved data directly into the + ``data`` parameter. In this case do not input a ``kernel``, + otherwise the data will be convolved twice. + + nsigma : float + The number of standard deviations per pixel above the + ``background`` for which to consider a pixel as possibly being + part of a source. + + npixels : int + The minimum number of connected pixels, each greater than + ``threshold``, that an object must have to be detected. + ``npixels`` must be a positive integer. + + mask : 2D bool `~numpy.ndarray`, optional + A boolean mask with the same shape as ``data``, where a `True` + value indicates the corresponding element of ``data`` is masked. + Masked pixels are ignored when computing the image background + statistics. + + sigclip_sigma : float, optional + The number of standard deviations to use as the clipping limit + when calculating the image background statistics. + + sigclip_iters : int, optional + The maximum number of iterations to perform sigma clipping, or + `None` to clip until convergence is achieved (i.e., continue + until the last iteration clips nothing) when calculating the + image background statistics. + + dilate_size : int, optional + The size of the square array used to dilate the segmentation + image. + + Returns + ------- + mask : 2D bool `~numpy.ndarray` + A 2D boolean image containing the source mask. + """ + sigma_clip = SigmaClip(sigma=sigclip_sigma, maxiters=sigclip_iters) + threshold = detect_threshold( + data, nsigma, background=None, error=None, mask=mask, sigma_clip=sigma_clip + ) + + segm = detect_sources(data, threshold, npixels) + if segm is None: + return np.zeros(data.shape, dtype=bool) + + footprint = np.ones((dilate_size, dilate_size)) + return ndimage.binary_dilation(segm.data.astype(bool), footprint) diff --git a/mmtwfs/scripts/fix_mmirs_exposure_time.py b/mmtwfs/scripts/fix_mmirs_exposure_time.py index a2986398..c198ca84 100755 --- a/mmtwfs/scripts/fix_mmirs_exposure_time.py +++ b/mmtwfs/scripts/fix_mmirs_exposure_time.py @@ -48,11 +48,16 @@ def main(): timedict = {} for f in files: with fits.open(f) as hdulist: + hdulist.verify('fix') hdr = hdulist[-1].header if 'DATE-OBS' in hdr: timedict[str(f)] = hdr['DATE-OBS'] elif 'DATE' in hdr: timedict[str(f)] = hdr['DATE'] + elif 'DATEOBS' in hdr: + time_string = f"{hdr['DATEOBS']} {hdr['UT']}" + time_format = "%a %b %d %Y %H:%M:%S" + timedict[str(f)] = datetime.strptime(time_string, time_format).strftime("%Y-%m-%dT%H:%M:%S") else: log.error(f"No valid time information in {str(f)}") return @@ -79,6 +84,7 @@ def main(): f = files[i] with fits.open(f) as hdulist: + hdulist.verify('fix') changed = False for h in hdulist: if 'EXPTIME' in h.header: @@ -91,6 +97,13 @@ def main(): changed = True else: log.info(f"EXPTIME already set to {h.header['EXPTIME']} for {str(f)}") + if 'CAMERA' not in h.header: + log.info(f"Adding CAMERA keyword to header for {str(f)}") + if h.header['WFSNAME'] == 'mmirs1': + h.header['CAMERA'] = 1 + else: + h.header['CAMERA'] = 2 + changed = True if changed and not args.dryrun: hdulist.writeto(f, overwrite=True, output_verify="silentfix") diff --git a/mmtwfs/scripts/reanalyze.py b/mmtwfs/scripts/reanalyze.py index 666e42e9..0ab13a89 100644 --- a/mmtwfs/scripts/reanalyze.py +++ b/mmtwfs/scripts/reanalyze.py @@ -57,7 +57,8 @@ def check_image(f, wfskey=None): hdr = {} - with fits.open(f, output_verify="ignore", ignore_missing_simple=True) as hdulist: + with fits.open(f, ignore_missing_simple=True) as hdulist: + hdulist.verify('silentfix') for h in hdulist: hdr.update(h.header) data = hdulist[-1].data @@ -74,6 +75,13 @@ def check_image(f, wfskey=None): if 'mmirs' in f.name: wfskey = 'mmirs' + if wfskey == 'mmirs': + if 'CAMERA' not in hdr: + if hdr['WFSNAME'] == 'mmirs1': + hdr['CAMERA'] = 1 + else: + hdr['CAMERA'] = 2 + # check for binospec if 'bino' in f.name or 'wfs_ff_cal_img' in f.name: wfskey = 'binospec' @@ -206,7 +214,7 @@ def process_image(f, force=False): appropriate WFS instance. Return results in a comma-separated line that will be collected and saved in a CSV file. """ - if "Ref" in str(f) or "sog" in str(f): + if "Ref" in str(f) or "sog" in str(f) or "coadded" in str(f): return None outfile = f.parent / (f.stem + ".output") @@ -265,12 +273,14 @@ def process_image(f, force=False): line = f"{obstime},{wfskey},{f.name},{exptime},{airmass},{az},{el},{osst},{outt}," \ f"{chamt},{tiltx},{tilty},{transx},{transy},{focus},{focerr.value},{cc_x_err.value}," \ f"{cc_y_err.value},{results['xcen']},{results['ycen']},{results['seeing'].value}," \ - f"{results['raw_seeing'].value},{results['fwhm']},{zresults['zernike_rms'].value}," \ + f"{results['raw_seeing'].value},{results["vlt_seeing"].value},{results["raw_vlt_seeing"].value},"\ + f"{results['ellipticity']},{results['fwhm']},{zresults['zernike_rms'].value}," \ f"{zresults['residual_rms'].value}\n" zfile = f.parent / (f.stem + ".reanalyze.zernike") zresults['zernike'].save(filename=zfile) spotfile = f.parent / (f.stem + ".spots.csv") results['spots'].write(spotfile, overwrite=True) + fits.writeto(f.parent / (f.stem + ".coadded_spot.fits"), results["coadded_spot"], overwrite=True) with open(outfile, 'w') as fp: fp.write(line) return line @@ -330,7 +340,8 @@ def main(): dirs = sorted(list(args.dirs)) # pathlib, where have you been all my life! csv_header = "time,wfs,file,exptime,airmass,az,el,osst,outt,chamt,tiltx,tilty,"\ - "transx,transy,focus,focerr,cc_x_err,cc_y_err,xcen,ycen,seeing,raw_seeing,fwhm,wavefront_rms,residual_rms\n" + "transx,transy,focus,focerr,cc_x_err,cc_y_err,xcen,ycen,seeing,raw_seeing,"\ + "vlt_seeing,raw_vlt_seeing,ellipticity,fwhm,wavefront_rms,residual_rms\n" log.info(f"Found {len(dirs)} directories to process...") @@ -350,7 +361,8 @@ def main(): process = partial(process_image, force=args.force) plines = pool.map(process, fitsfiles) # plines comes out in same order as fitslines! - plines = list(filter(None.__ne__, plines)) # trim out any None entries + plines = [line for line in plines if line is not None] # trim out any None entries + if len(plines) > 0: lines.extend(plines) with open(d / "reanalyze_results.csv", "w") as f: diff --git a/mmtwfs/secondary.py b/mmtwfs/secondary.py index 61193cb4..d7e794de 100644 --- a/mmtwfs/secondary.py +++ b/mmtwfs/secondary.py @@ -8,17 +8,18 @@ import astropy.units as u -from .utils import srvlookup -from .config import recursive_subclasses, merge_config, mmtwfs_config -from .custom_exceptions import WFSConfigException, WFSCommandException +from mmtwfs.utils import srvlookup +from mmtwfs.config import recursive_subclasses, merge_config, mmtwfs_config +from mmtwfs.custom_exceptions import WFSConfigException, WFSCommandException import logging import logging.handlers + log = logging.getLogger("Secondary") log.setLevel(logging.INFO) -__all__ = ['F9', 'F5', 'FLWO12', 'SecondaryFactory'] +__all__ = ["F9", "F5", "FLWO12", "SecondaryFactory"] def SecondaryFactory(secondary="f5", config={}, **kwargs): @@ -33,7 +34,9 @@ def SecondaryFactory(secondary="f5", config={}, **kwargs): sec_map = dict(list(zip(secondaries, types))) if secondary not in secondaries: - raise WFSConfigException(value=f"Specified secondary, {secondary}, not valid or not implemented.") + raise WFSConfigException( + value=f"Specified secondary, {secondary}, not valid or not implemented." + ) sec_cls = sec_map[secondary](config=config) return sec_cls @@ -43,15 +46,17 @@ class Secondary(object): """ Defines configuration pattern and methods common to all secondary mirror systems """ + def __init__(self, config={}): key = self.__class__.__name__.lower() - self.__dict__.update(merge_config(mmtwfs_config['secondary'][key], config)) + self.__dict__.update(merge_config(mmtwfs_config["secondary"][key], config)) class FLWO12(Secondary): """ Secondary mirror configuration for the FLWO 1.2-meter """ + pass @@ -59,6 +64,7 @@ class FLWO15(Secondary): """ Secondary mirror configuration for the FLWO 1.5-meter """ + pass @@ -66,6 +72,7 @@ class MMTSecondary(object): """ Mixin class that defines methods specific to MMT secondary mirror systems """ + def __init__(self, config={}): super(MMTSecondary, self).__init__(config=config) @@ -113,7 +120,9 @@ def hex_sock(self): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(hex_server) except Exception as e: - log.error(f"Error connecting to hexapod server. Remaining disconnected...: {e}") + log.error( + f"Error connecting to hexapod server. Remaining disconnected...: {e}" + ) return None return sock @@ -138,7 +147,9 @@ def m1spherical(self, foc): commands that help correct spherical aberration from normal focus commands. """ foc_um = u.Quantity(foc, u.um).value # focus command must be in microsn - log.info(f"Moving {self.__class__.__name__.lower()} hexapod {foc} in Z to correct spherical aberration...") + log.info( + f"Moving {self.__class__.__name__.lower()} hexapod {foc} in Z to correct spherical aberration..." + ) cmd = self.inc_offset("m1spherical", "z", foc_um) return cmd @@ -149,12 +160,14 @@ def cc(self, axis, tilt): """ tilt = u.Quantity(tilt, u.arcsec).value axis = axis.lower() - if axis not in ['x', 'y']: + if axis not in ["x", "y"]: msg = f"Invalid axis {axis} send to hexapod. Only 'x' and 'y' are valid for center-of-curvature offsets." raise WFSCommandException(value=msg) hexname = self.__class__.__name__.lower() - log.info(f"Moving {hexname} hexapod {tilt} arcsec about the center of curvature along the {axis} axis...") + log.info( + f"Moving {hexname} hexapod {tilt} arcsec about the center of curvature along the {axis} axis..." + ) cmd = f"offset_cc wfs t{axis} {tilt}\n" if self.connected: sock = self.hex_sock() @@ -171,12 +184,14 @@ def zc(self, axis, tilt): """ tilt = u.Quantity(tilt, u.arcsec).value axis = axis.lower() - if axis not in ['x', 'y']: + if axis not in ["x", "y"]: msg = f"Invalid axis {axis} send to hexapod. Only 'x' and 'y' are valid for zero-coma offsets." raise WFSCommandException(value=msg) hexname = self.__class__.__name__.lower() - log.info(f"Moving {hexname} hexapod {tilt} arcsec about the zero-coma point along the {axis} axis...") + log.info( + f"Moving {hexname} hexapod {tilt} arcsec about the zero-coma point along the {axis} axis..." + ) cmd = f"offset_zc wfs t{axis} {tilt}\n" if self.connected: sock = self.hex_sock() @@ -191,8 +206,8 @@ def correct_coma(self, cc_x_corr, cc_y_corr): Apply calculated tilts to correct coma """ if self.connected: - self.cc('x', cc_x_corr) - self.cc('y', cc_y_corr) + self.cc("x", cc_x_corr) + self.cc("y", cc_y_corr) return cc_x_corr, cc_y_corr def recenter(self, az, el): @@ -200,8 +215,8 @@ def recenter(self, az, el): Apply calculated az/el offsets using ZC tilts """ if self.connected: - self.zc('x', el) - self.zc('y', az) + self.zc("x", el) + self.zc("y", az) return az, el def clear_m1spherical(self): @@ -224,7 +239,7 @@ def clear_wfs(self): Clear the 'wfs' offsets that get populated by WFS corrections. """ log.info("Resetting hexapod's WFS offsets to 0...") - axes = ['tx', 'ty', 'x', 'y', 'z'] + axes = ["tx", "ty", "x", "y", "z"] cmds = [] if self.connected: sock = self.hex_sock() @@ -242,6 +257,7 @@ class F5(MMTSecondary, Secondary): """ Defines configuration and methods specific to the F/5 secondary system """ + pass @@ -249,4 +265,5 @@ class F9(MMTSecondary, Secondary): """ Defines configuration and methods specific to the F/9 secondary system """ + pass diff --git a/mmtwfs/telescope.py b/mmtwfs/telescope.py index 097f5c26..c47bef83 100644 --- a/mmtwfs/telescope.py +++ b/mmtwfs/telescope.py @@ -16,15 +16,16 @@ import matplotlib.cm as cm import matplotlib.colors as col -from .config import recursive_subclasses, merge_config, mmtwfs_config -from .custom_exceptions import WFSConfigException -from .secondary import SecondaryFactory -from .zernike import ZernikeVector +from mmtwfs.config import recursive_subclasses, merge_config, mmtwfs_config +from mmtwfs.custom_exceptions import WFSConfigException +from mmtwfs.secondary import SecondaryFactory +from mmtwfs.zernike import ZernikeVector import logging import logging.handlers -# we need to wrap the poppy import in a context manager to trap its whinging about missing pysynphot stuff that we don't use. +# we need to wrap the poppy import in a context manager to trap its whinging about +# missing pysynphot stuff that we don't use. with warnings.catch_warnings(): warnings.simplefilter("ignore") import poppy @@ -33,7 +34,7 @@ log.setLevel(logging.INFO) -__all__ = ['TelescopeFactory', 'MMT', 'FLWO12'] +__all__ = ["TelescopeFactory", "MMT", "FLWO12"] def TelescopeFactory(telescope="mmt", secondary="f5", config={}, **kwargs): @@ -49,7 +50,9 @@ def TelescopeFactory(telescope="mmt", secondary="f5", config={}, **kwargs): tel_map = dict(list(zip(telescopes, types))) if telescope not in telescopes: - raise WFSConfigException(value=f"Specified telescope, {telescope}, not valid or not implemented.") + raise WFSConfigException( + value=f"Specified telescope, {telescope}, not valid or not implemented." + ) tel_cls = tel_map[telescope](secondary=secondary, config=config) return tel_cls @@ -59,25 +62,28 @@ class Telescope(object): """ Defines generic configuration and methods that pertain to telescope and primary mirror systems """ + def __init__(self, telescope="mmt", secondary="f5", config={}, **kwargs): config = merge_config(config, dict(**kwargs)) - if telescope not in mmtwfs_config['telescope']: + if telescope not in mmtwfs_config["telescope"]: msg = f"Invalid telescope specified, {telescope}." raise WFSConfigException(value=msg) - if secondary not in mmtwfs_config['secondary']: + if secondary not in mmtwfs_config["secondary"]: msg = f"Invalid secondary specified, {secondary}." raise WFSConfigException(value=msg) - if mmtwfs_config['secondary'][secondary]['telescope'] != telescope: + if mmtwfs_config["secondary"][secondary]["telescope"] != telescope: msg = f"Invalid secondary, {secondary}, for telescope, {telescope}." raise WFSConfigException(value=msg) - self.__dict__.update(merge_config(mmtwfs_config['telescope'][telescope], config)) + self.__dict__.update( + merge_config(mmtwfs_config["telescope"][telescope], config) + ) self.secondary = SecondaryFactory(secondary=secondary) - self.radius = self.diameter / 2. + self.radius = self.diameter / 2.0 self.nmperrad = self.radius.to(u.nm).value - self.nmperasec = self.nmperrad / 206265. + self.nmperasec = self.nmperrad / 206265.0 # ratio of the size of the central obstruction of the secondary to the size of the primary self.obscuration = self.secondary.diameter / self.diameter @@ -88,7 +94,11 @@ def __init__(self, telescope="mmt", secondary="f5", config={}, **kwargs): # initialize poppy optical system used for calculating the PSFs self.osys = poppy.OpticalSystem() self.osys.add_pupil(self.pupil) - self.osys.add_pupil(poppy.ZernikeWFE(radius=self.radius.to(u.m).value, coefficients=[0.0, 0.0, 0.0, 0.0])) + self.osys.add_pupil( + poppy.ZernikeWFE( + radius=self.radius.to(u.m).value, coefficients=[0.0, 0.0, 0.0, 0.0] + ) + ) self.osys.add_detector(pixelscale=self.psf_pixel_scale, fov_arcsec=self.psf_fov) def _pupil_model(self): @@ -100,9 +110,11 @@ def _pupil_model(self): secondary_radius=self.secondary.diameter.to(u.m).value / 2, n_supports=self.n_supports, support_width=self.support_width.to(u.m).value, - support_angle_offset=self.support_offset.to(u.deg).value + support_angle_offset=self.support_offset.to(u.deg).value, + ) + pup_model = poppy.CompoundAnalyticOptic( + opticslist=[primary, secondary], name="MMTO" ) - pup_model = poppy.CompoundAnalyticOptic(opticslist=[primary, secondary], name="MMTO") return pup_model def pupil_mask(self, rotation=0.0, size=512): @@ -116,11 +128,13 @@ def pupil_mask(self, rotation=0.0, size=512): rotation = u.Quantity(rotation, u.deg) # not sure how to get the image data out directly, but the to_fits() method gives me a path... - pup_im = imrotate(self.pupil.to_fits(npix=size)[0].data.astype(float), rotation.value) + pup_im = imrotate( + self.pupil.to_fits(npix=size)[0].data.astype(float), rotation.value + ) pup_im = pup_im / pup_im.max() return pup_im - def psf(self, zv=ZernikeVector(), wavelength=550.*u.nm, plot=True): + def psf(self, zv=ZernikeVector(), wavelength=550.0 * u.nm, plot=True): """ Take a ZernikeVector and calculate resulting PSF at given wavelength. """ @@ -133,7 +147,7 @@ def psf(self, zv=ZernikeVector(), wavelength=550.*u.nm, plot=True): # poppy wants the piston term so whack it in there if modestart isn't already 1 if zv.modestart != 1: zv.modestart = 1 - zv['Z01'] = 0.0 + zv["Z01"] = 0.0 # poppy wants coeffs in meters zv.units = u.m @@ -156,8 +170,15 @@ def psf(self, zv=ZernikeVector(), wavelength=550.*u.nm, plot=True): if plot: psf_fig, ax = plt.subplots() psf_fig.set_label("PSF at {0:0.0f}".format(wavelength)) - norm = visualization.mpl_normalize.ImageNormalize(stretch=visualization.LinearStretch()) - ims = ax.imshow(psf[0].data, extent=[-fov/2, fov/2, -fov/2, fov/2], cmap=cm.magma, norm=norm) + norm = visualization.mpl_normalize.ImageNormalize( + stretch=visualization.LinearStretch() + ) + ims = ax.imshow( + psf[0].data, + extent=[-fov / 2, fov / 2, -fov / 2, fov / 2], + cmap=cm.magma, + norm=norm, + ) ax.set_xlabel("arcsec") ax.set_ylabel("arcsec") cb = psf_fig.colorbar(ims) @@ -169,24 +190,31 @@ class FLWO12(Telescope): """ Defines configuration and methods for the FLWO 1.2-meter """ + def __init__(self, config={}, **kwargs): config = merge_config(config, dict(**kwargs)) - super(FLWO12, self).__init__(telescope="flwo12", secondary="flwo12", config=config) + super(FLWO12, self).__init__( + telescope="flwo12", secondary="flwo12", config=config + ) class FLWO15(Telescope): """ Defines configuration and methods for the FLWO 1.5-meter """ + def __init__(self, config={}, **kwargs): config = merge_config(config, dict(**kwargs)) - super(FLWO15, self).__init__(telescope="flwo15", secondary="flwo15", config=config) + super(FLWO15, self).__init__( + telescope="flwo15", secondary="flwo15", config=config + ) class MMT(Telescope): """ Defines configuration and methods that pertain to the MMT's telescope and primary mirror systems """ + def __init__(self, secondary="f5", config={}, **kwargs): config = merge_config(config, dict(**kwargs)) super(MMT, self).__init__(telescope="mmt", secondary=secondary, config=config) @@ -231,10 +259,10 @@ def bending_forces(self, zv=ZernikeVector(), gain=0.5): to correct for the surface displacement it describes. """ # we don't want to bend any tilts... - if 'Z02' in zv: - zv['Z02'] = 0.0 - if 'Z03' in zv: - zv['Z03'] = 0.0 + if "Z02" in zv: + zv["Z02"] = 0.0 + if "Z03" in zv: + zv["Z03"] = 0.0 # convert to nm... zv.units = u.nm @@ -243,33 +271,45 @@ def bending_forces(self, zv=ZernikeVector(), gain=0.5): zv.denormalize() # need to rotate the wavefront -90 degrees to match the BCV angle convention of +Y being 0 deg. - zv.rotate(-90*u.deg) + zv.rotate(-90 * u.deg) # get surface displacements at the BCV node positions. multiply the wavefront amplitude by 0.5 to account for # reflection off the surface. - surf_corr = -0.5 * gain * zv.total_phase(self.nodecoor['bcv_rho'], self.nodecoor['bcv_phi']) + surf_corr = ( + -0.5 + * gain + * zv.total_phase(self.nodecoor["bcv_rho"], self.nodecoor["bcv_phi"]) + ) if isinstance(surf_corr, float): # means we got 0.0 from zv.total_phase() force_vec = np.zeros(self.n_act) else: - force_vec = np.dot(surf_corr, self.surf2act).value # remove the units that got passed through + force_vec = np.dot( + surf_corr, self.surf2act + ).value # remove the units that got passed through # return an astropy.table.Table so we can easily package actuator ID along with the force. its write() method # also provides a lot of flexibility in providing outputs that match the old system. - t = Table([self.actcoor['act_id'], force_vec], names=['actuator', 'force']) + t = Table([self.actcoor["act_id"], force_vec], names=["actuator", "force"]) return t def to_rcell(self, t, filename="zfile", overwrite=True): """ Take table generated by bending_forces() and write it to a file of a format that matches the old SHWFS system """ - t.write(filename, format="ascii.no_header", delimiter="\t", formats={'force': ".1f"}, overwrite=overwrite) + t.write( + filename, + format="ascii.no_header", + delimiter="\t", + formats={"force": ".1f"}, + overwrite=overwrite, + ) def calculate_primary_corrections(self, zv, mask=[], gain=0.5): """ Take ZernikeVector as input and determine corrections to apply to primary/secondary """ # leave out tilts, focus, and coma from force calcs to start with - def_mask = ['Z02', 'Z03', 'Z04', 'Z07', 'Z08'] + def_mask = ["Z02", "Z03", "Z04", "Z07", "Z08"] def_mask.extend(mask) # mask out all high order terms beyond 2nd order spherical @@ -294,9 +334,11 @@ def calculate_primary_corrections(self, zv, mask=[], gain=0.5): # Z22 ~ 20r**6 - 30r**4 + 12r**2 - 1 # Z37 ~ 70r**8 - 140r**6 + 90r**4 - 20r**2 + 1 # - zv_masked['Z04'] = -6.0 * zv_masked['Z11'] - 12.0 * zv_masked['Z22'] - 20.0 * zv_masked['Z37'] + zv_masked["Z04"] = ( + -6.0 * zv_masked["Z11"] - 12.0 * zv_masked["Z22"] - 20.0 * zv_masked["Z37"] + ) - m1focus_corr = gain * zv_masked['Z04'] / self.secondary.focus_trans + m1focus_corr = gain * zv_masked["Z04"] / self.secondary.focus_trans t = self.bending_forces(zv=zv_masked, gain=gain) @@ -308,11 +350,13 @@ def bend_mirror(self, filename="zfile"): forces that the cell reports were applied. """ frac = 1.0 - log.info(f"Using command, /mmt/scripts/cell_send_forces {filename}, to apply forces...") + log.info( + f"Using command, /mmt/scripts/cell_send_forces {filename}, to apply forces..." + ) pipe = subprocess.Popen( - ['/mmt/scripts/cell_send_forces', f"{filename}"], + ["/mmt/scripts/cell_send_forces", f"{filename}"], stdout=subprocess.PIPE, - stderr=subprocess.PIPE + stderr=subprocess.PIPE, ) try: @@ -321,8 +365,8 @@ def bend_mirror(self, filename="zfile"): pipe.kill() (stdout, stderr) = pipe.communicate() - outstr = stdout.decode('utf8') - outerr = stderr.decode('utf8') + outstr = stdout.decode("utf8") + outerr = stderr.decode("utf8") # had to dig into the cell code at /mmt/vxsource/mmt/cell/src/cell_inf.c to get the messages that are produces if "Able to Apply" in outstr: @@ -361,9 +405,9 @@ def correct_primary(self, t, m1focus_corr, filename="zfile"): log.info("Not connected; no commands sent to cell or hexapod.") self.last_forces = t.copy(copy_data=True) - self.last_forces['force'] *= frac + self.last_forces["force"] *= frac self.last_m1focus = frac * m1focus_corr.copy() - self.total_forces['force'] += frac * t['force'] + self.total_forces["force"] += frac * t["force"] self.total_m1focus += frac * m1focus_corr return t, m1focus_corr @@ -371,7 +415,7 @@ def undo_last(self, zfilename="zfile_undo"): """ Undo the last set of corrections. """ - self.last_forces['force'] *= -1 + self.last_forces["force"] *= -1 self.last_m1focus *= -1 frac = 1.0 if self.connected: @@ -383,7 +427,7 @@ def undo_last(self, zfilename="zfile_undo"): log.info("Not connected; no undo commands sent.") self.total_m1focus += frac * self.last_m1focus - self.total_forces['force'] += frac * self.last_forces['force'] + self.total_forces["force"] += frac * self.last_forces["force"] return self.last_forces.copy(), self.last_m1focus.copy() def clear_forces(self): @@ -393,7 +437,11 @@ def clear_forces(self): if self.connected: log.info("Clearing forces and spherical aberration focus offsets...") self.secondary.clear_m1spherical() - pipe = subprocess.Popen(['/mmt/scripts/cell_clear_forces'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + pipe = subprocess.Popen( + ["/mmt/scripts/cell_clear_forces"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) try: (stdout, stderr) = pipe.communicate(timeout=20) @@ -401,8 +449,8 @@ def clear_forces(self): pipe.kill() (stdout, stderr) = pipe.communicate() - outstr = stdout.decode('utf8') - outerr = stderr.decode('utf8') + outstr = stdout.decode("utf8") + outerr = stderr.decode("utf8") log.info(f"...{outstr.strip()}") if len(outerr) > 0: log.warn(f"Got error from cell_clear_forces: {outerr}") @@ -411,7 +459,7 @@ def clear_forces(self): # the 'last' corrections are negations of the current total. reset the totals to 0. self.last_forces = self.total_forces.copy(copy_data=True) - self.last_forces['force'] *= -1 + self.last_forces["force"] *= -1 self.last_m1focus = -self.total_m1focus self.total_forces = self.bending_forces(zv=ZernikeVector()) self.total_m1focus = 0.0 @@ -425,7 +473,11 @@ def load_influence_matrix(self): the influence of 1 lb of force on the mirror surface at each finite element node. This matrix is stored in a binary file for compactness and speed of loading. """ - surf2act = np.fromfile(self.surf2act_file, dtype=np.float32).reshape(self.n_act, self.n_node).transpose() + surf2act = ( + np.fromfile(self.surf2act_file, dtype=np.float32) + .reshape(self.n_act, self.n_node) + .transpose() + ) return surf2act def load_actuator_coordinates(self): @@ -433,12 +485,14 @@ def load_actuator_coordinates(self): The actuator IDs and X/Y positions in mm are stored in a simple ASCII table. Load it using astropy.io.ascii, convert to units of mirror radius, and add polar coordinates. """ - coord = ascii.read(self.actuator_file, names=["act_id", "act_x", "act_y", "act_type"]) + coord = ascii.read( + self.actuator_file, names=["act_id", "act_x", "act_y", "act_type"] + ) for ax in ["act_x", "act_y"]: coord[ax] /= self.bcv_radius.to(u.mm).value - coord['act_rho'] = np.sqrt(coord['act_x']**2 + coord['act_y']**2) - coord['act_phi'] = np.arctan2(coord['act_y'], coord['act_x']) - coord['act_phi'].unit = u.radian + coord["act_rho"] = np.sqrt(coord["act_x"] ** 2 + coord["act_y"] ** 2) + coord["act_phi"] = np.arctan2(coord["act_y"], coord["act_x"]) + coord["act_phi"].unit = u.radian return coord @@ -447,38 +501,47 @@ def load_bcv_coordinates(self): The BCV finite element nodes IDs and X/Y/Z positions in mm are stored in a simple ASCII table. Load it using astropy.io.ascii, convert to units of mirror radius, and add polar coordinates. """ - coord = ascii.read(self.nodecoor_file, names=["bcv_id", "bcv_x", "bcv_y", "bcv_z"]) + coord = ascii.read( + self.nodecoor_file, names=["bcv_id", "bcv_x", "bcv_y", "bcv_z"] + ) for ax in ["bcv_x", "bcv_y"]: coord[ax] /= self.bcv_radius.to(u.mm).value - coord['bcv_rho'] = np.sqrt(coord['bcv_x']**2 + coord['bcv_y']**2) - coord['bcv_phi'] = np.arctan2(coord['bcv_y'], coord['bcv_x']) - coord['bcv_phi'].unit = u.radian + coord["bcv_rho"] = np.sqrt(coord["bcv_x"] ** 2 + coord["bcv_y"] ** 2) + coord["bcv_phi"] = np.arctan2(coord["bcv_y"], coord["bcv_x"]) + coord["bcv_phi"].unit = u.radian return coord - def plot_forces(self, t, m1focus=None, limit=100.): + def plot_forces(self, t, m1focus=None, limit=100.0): """ Plot actuator forces given force table as output from self.bending_forces() """ coords = self.actcoor r_fac = 0.5 * self.diameter / self.bcv_radius # adjust for slight difference - cmap = cm.ScalarMappable(col.Normalize(-1*limit, limit), cm.bwr) + cmap = cm.ScalarMappable(col.Normalize(-1 * limit, limit), cm.bwr) cmap._A = [] # grr stupid matplotlib fig, ax = plt.subplots() fig.set_label("M1 Actuator Forces") - xcor, ycor = coords['act_x']/r_fac, coords['act_y']/r_fac - ax.scatter(xcor, ycor, color=cmap.to_rgba(t['force'])) + xcor, ycor = coords["act_x"] / r_fac, coords["act_y"] / r_fac + ax.scatter(xcor, ycor, color=cmap.to_rgba(t["force"])) for i, (x, y) in enumerate(zip(xcor, ycor)): - ax.text(x, y+0.02, t['actuator'][i], horizontalalignment='center', verticalalignment='bottom', size='xx-small') + ax.text( + x, + y + 0.02, + t["actuator"][i], + horizontalalignment="center", + verticalalignment="bottom", + size="xx-small", + ) ax.set_aspect(1.0) - circle1 = plt.Circle((0, 0), 1.0, fill=False, color='black', alpha=0.2) - circle2 = plt.Circle((0, 0), 0.9/6.5, fill=False, color='black', alpha=0.2) + circle1 = plt.Circle((0, 0), 1.0, fill=False, color="black", alpha=0.2) + circle2 = plt.Circle((0, 0), 0.9 / 6.5, fill=False, color="black", alpha=0.2) ax.add_artist(circle1) ax.add_artist(circle2) if m1focus is not None: ax.set_title("M1 Focus Offset: {0:0.1f}".format(m1focus)) ax.set_axis_off() - cb = fig.colorbar(cmap) + cb = fig.colorbar(cmap, ax=ax) cb.set_label("Actuator Force (N)") return fig diff --git a/mmtwfs/tests/test_secondaries.py b/mmtwfs/tests/test_secondaries.py index 39a08a56..0f539a7b 100644 --- a/mmtwfs/tests/test_secondaries.py +++ b/mmtwfs/tests/test_secondaries.py @@ -1,92 +1,80 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst # coding=utf-8 -from ..config import mmtwfs_config -from ..secondary import SecondaryFactory -from ..custom_exceptions import WFSConfigException, WFSCommandException +from mmtwfs.config import mmtwfs_config +from mmtwfs.secondary import SecondaryFactory +from mmtwfs.custom_exceptions import WFSConfigException, WFSCommandException def test_secondaries(): - for s in mmtwfs_config['secondary']: + for s in mmtwfs_config["secondary"]: sec = SecondaryFactory(secondary=s, test="foo") - assert(sec.test == "foo") + assert sec.test == "foo" def test_bogus_secondary(): try: sec = SecondaryFactory(secondary="bazz") - assert(sec is not None) + assert sec is not None except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False -def test_connect(): - s = SecondaryFactory(secondary='f5') - try: - s.connect() - except Exception as e: - assert(not s.connected) - assert(e is not None) - finally: - s.disconnect() - assert(not s.connected) - - def test_focus(): - s = SecondaryFactory(secondary='f5') + s = SecondaryFactory(secondary="f5") cmd = s.focus(200.3) - assert("200.3" in cmd) + assert "200.3" in cmd def test_m1spherical(): - s = SecondaryFactory(secondary='f5') + s = SecondaryFactory(secondary="f5") cmd = s.m1spherical(200.3) - assert("200.3" in cmd) + assert "200.3" in cmd def test_cc(): - s = SecondaryFactory(secondary='f5') - cmd = s.cc('x', 200.3) - assert("200.3" in cmd) - cmd = s.cc('y', 200.3) - assert("200.3" in cmd) + s = SecondaryFactory(secondary="f5") + cmd = s.cc("x", 200.3) + assert "200.3" in cmd + cmd = s.cc("y", 200.3) + assert "200.3" in cmd try: - cmd = s.cc('z', 200.3) + cmd = s.cc("z", 200.3) except WFSCommandException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False def test_zc(): - s = SecondaryFactory(secondary='f5') - cmd = s.zc('x', 200.3) - assert("200.3" in cmd) - cmd = s.zc('y', 200.3) - assert("200.3" in cmd) + s = SecondaryFactory(secondary="f5") + cmd = s.zc("x", 200.3) + assert "200.3" in cmd + cmd = s.zc("y", 200.3) + assert "200.3" in cmd try: - cmd = s.zc('z', 200.3) + cmd = s.zc("z", 200.3) except WFSCommandException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False def test_clear(): - s = SecondaryFactory(secondary='f5') + s = SecondaryFactory(secondary="f5") cmd = s.clear_m1spherical() - assert("0.0" in cmd) + assert "0.0" in cmd cmds = s.clear_wfs() for c in cmds: - assert("0.0" in c) + assert "0.0" in c diff --git a/mmtwfs/tests/test_telescope.py b/mmtwfs/tests/test_telescope.py index ef8d48cc..51bf5696 100644 --- a/mmtwfs/tests/test_telescope.py +++ b/mmtwfs/tests/test_telescope.py @@ -2,66 +2,62 @@ # coding=utf-8 import os -import pkg_resources +import importlib import filecmp +import matplotlib.pyplot as plt + import numpy as np import astropy.units as u -from matplotlib.testing.decorators import cleanup - -from ..config import mmtwfs_config -from ..telescope import TelescopeFactory, MMT -from ..zernike import ZernikeVector -from ..custom_exceptions import WFSConfigException +from mmtwfs.config import mmtwfs_config +from mmtwfs.telescope import TelescopeFactory, MMT +from mmtwfs.zernike import ZernikeVector +from mmtwfs.custom_exceptions import WFSConfigException def test_telescope(): - for s in mmtwfs_config['secondary']: - tel = mmtwfs_config['secondary'][s]['telescope'] + for s in mmtwfs_config["secondary"]: + tel = mmtwfs_config["secondary"][s]["telescope"] t = TelescopeFactory(telescope=tel, secondary=s) - if tel == 'mmt': - t.connect() - assert(t.connected) - t.disconnect() - assert(not t.connected) - assert(t.secondary.diameter == mmtwfs_config['secondary'][s]['diameter']) + assert t.secondary.diameter == mmtwfs_config["secondary"][s]["diameter"] def test_pupil_mask(): - for s in mmtwfs_config['secondary']: - tel = mmtwfs_config['secondary'][s]['telescope'] + for s in mmtwfs_config["secondary"]: + tel = mmtwfs_config["secondary"][s]["telescope"] t = TelescopeFactory(telescope=tel, secondary=s) mask = t.pupil_mask(size=400) - assert(mask.shape == (400, 400)) - assert(mask.max() == 1.0) - assert(mask.min() == 0.0) + assert mask.shape == (400, 400) + assert mask.max() == 1.0 + assert mask.min() == 0.0 def test_bogus_pupil_mask(): - for s in mmtwfs_config['secondary']: - tel = mmtwfs_config['secondary'][s]['telescope'] + for s in mmtwfs_config["secondary"]: + tel = mmtwfs_config["secondary"][s]["telescope"] t = TelescopeFactory(telescope=tel, secondary=s) try: t.pupil_mask(size=900) except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False def test_psf(): - for s in mmtwfs_config['secondary']: - tel = mmtwfs_config['secondary'][s]['telescope'] + for s in mmtwfs_config["secondary"]: + tel = mmtwfs_config["secondary"][s]["telescope"] t = TelescopeFactory(telescope=tel, secondary=s) - zv = ZernikeVector(Z04=500*u.nm) + zv = ZernikeVector(Z04=500 * u.nm) p, p_fig = t.psf(zv=zv) p_im = p[0].data - assert(p_im.max() < 1.0) - assert(p_fig is not None) + assert p_im.max() < 1.0 + assert p_fig is not None + plt.close("all") def test_force_file(): @@ -71,8 +67,11 @@ def test_force_file(): zv = ZernikeVector(Z05=1000) f_table = t.bending_forces(zv=zv, gain=1.0) t.to_rcell(f_table, filename="forcefile") - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "AST45_p1000.frc")) - assert(filecmp.cmp("forcefile", test_file)) + test_file = ( + importlib.resources.files("mmtwfs") / "data" / "test_data" / "AST45_p1000.frc" + ) + assert filecmp.cmp("forcefile", test_file) + os.remove("forcefile") def test_correct_primary(): @@ -80,19 +79,19 @@ def test_correct_primary(): zv = ZernikeVector(Z05=1000, Z11=250) force, focus, zv_masked = t.calculate_primary_corrections(zv) lforce, lfocus = t.correct_primary(force, focus) - assert(np.abs(focus) > 0.0) + assert np.abs(focus) > 0.0 uforce, ufocus = t.undo_last() - assert(ufocus == -1 * focus) - assert(np.allclose(uforce['force'], -force['force'])) + assert ufocus == -1 * focus + assert np.allclose(uforce["force"], -force["force"]) nullforce, nullfocus = t.clear_forces() - assert(nullfocus == 0.0) - assert(np.allclose(nullforce['force'].data, 0.0)) + assert nullfocus == 0.0 + assert np.allclose(nullforce["force"].data, 0.0) -@cleanup def test_plots(): t = MMT() zv = ZernikeVector(Z05=1000, Z11=250) f_table = t.bending_forces(zv=zv) fig = t.plot_forces(f_table) - assert(fig is not None) + assert fig is not None + plt.close("all") diff --git a/mmtwfs/tests/test_wfs.py b/mmtwfs/tests/test_wfs.py index 3b165d3d..4cf95957 100644 --- a/mmtwfs/tests/test_wfs.py +++ b/mmtwfs/tests/test_wfs.py @@ -1,18 +1,19 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst # coding=utf-8 -import pkg_resources -import os +import importlib import numpy as np import matplotlib.pyplot as plt -from matplotlib.testing.decorators import cleanup -from ..zernike import ZernikeVector -from ..config import mmtwfs_config -from ..wfs import WFSFactory, check_wfsdata, mk_wfs_mask -from ..custom_exceptions import WFSConfigException, WFSCommandException +from mmtwfs.zernike import ZernikeVector +from mmtwfs.config import mmtwfs_config +from mmtwfs.wfs import WFSFactory, check_wfsdata, mk_wfs_mask +from mmtwfs.custom_exceptions import WFSConfigException, WFSCommandException + + +WFS_DATA_DIR = importlib.resources.files("mmtwfs") / "data" def test_check_wfsdata(): @@ -21,7 +22,7 @@ def test_check_wfsdata(): except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -31,7 +32,7 @@ def test_check_wfsdata(): except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -42,16 +43,17 @@ def test_check_wfsdata(): except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False def test_wfses(): - for s in mmtwfs_config['wfs']: + for s in mmtwfs_config["wfs"]: wfs = WFSFactory(wfs=s, plot=True, test="foo") - assert(wfs.test == "foo") + assert wfs.test == "foo" + plt.close("all") def test_bogus_wfs(): @@ -60,57 +62,49 @@ def test_bogus_wfs(): except WFSConfigException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False -def test_connect(): - wfs = WFSFactory(wfs='f5') - wfs.connect() - wfs.disconnect() - assert(not wfs.connected) # can't always access systems... - - def test_make_mask(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "test_newf9.fits")) - mask = mk_wfs_mask(test_file, thresh_factor=4., outfile=None) - assert(mask.min() == 0.0) + test_file = WFS_DATA_DIR / "test_data" / "test_newf9.fits" + mask = mk_wfs_mask(test_file, thresh_factor=4.0, outfile=None) + assert mask.min() == 0.0 -@cleanup def test_mmirs_analysis(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "mmirs_wfs_0150.fits")) - mmirs = WFSFactory(wfs='mmirs') + test_file = WFS_DATA_DIR / "test_data" / "mmirs_wfs_0150.fits" + mmirs = WFSFactory(wfs="mmirs") results = mmirs.measure_slopes(test_file) zresults = mmirs.fit_wavefront(results) - testval = int(zresults['zernike']['Z10'].value) - assert((testval > 335) & (testval < 345)) + testval = int(zresults["zernike"]["Z10"].value) + assert (testval > 416) & (testval < 436) + plt.close("all") -@cleanup def test_mmirs_pacman(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "mmirs_wfs_rename_0566.fits")) - mmirs = WFSFactory(wfs='mmirs') + test_file = WFS_DATA_DIR / "test_data" / "mmirs_wfs_rename_0566.fits" + mmirs = WFSFactory(wfs="mmirs") results = mmirs.measure_slopes(test_file) - testval = results['xcen'] - assert((testval > 227) & (testval < 229)) + testval = results["xcen"] + assert (testval > 227) & (testval < 229) + plt.close("all") -@cleanup def test_mmirs_pupil_mask(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "mmirs_wfs_0150.fits")) - mmirs = WFSFactory(wfs='mmirs') + test_file = WFS_DATA_DIR / "test_data" / "mmirs_wfs_0150.fits" + mmirs = WFSFactory(wfs="mmirs") data, hdr = check_wfsdata(test_file, header=True) fig, ax = plt.subplots() ngood = mmirs.plotgrid_hdr(hdr, ax) - assert(ngood > 0) + assert ngood > 0 + plt.close("all") -@cleanup def test_mmirs_pickoff_plots(): - mmirs = WFSFactory(wfs='mmirs') + mmirs = WFSFactory(wfs="mmirs") fig, ax = plt.subplots() mmirs.drawoutline(ax) # Some representative positions that vignette on different edges of the mirror @@ -120,12 +114,12 @@ def test_mmirs_pickoff_plots(): mmirs.plotgrid(50, 60, ax) mmirs.plotgrid(45, 40, ax) mmirs.plotgrid(7, 52, ax) - assert(fig is not None) + assert fig is not None + plt.close("all") -@cleanup def test_mmirs_bogus_pupil_mask(): - mmirs = WFSFactory(wfs='mmirs') + mmirs = WFSFactory(wfs="mmirs") hdr = {} fig, ax = plt.subplots() try: @@ -133,134 +127,130 @@ def test_mmirs_bogus_pupil_mask(): except WFSCommandException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False -@cleanup def test_f9_analysis(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "TREX_p500_0000.fits")) - f9 = WFSFactory(wfs='f9') + test_file = WFS_DATA_DIR / "test_data" / "TREX_p500_0000.fits" + f9 = WFSFactory(wfs="f9") results = f9.measure_slopes(test_file) zresults = f9.fit_wavefront(results) - testval = int(zresults['zernike']['Z09'].value) - assert((testval > 440) & (testval < 450)) + testval = int(zresults["zernike"]["Z09"].value) + assert (testval > 440) & (testval < 450) + plt.close("all") -@cleanup def test_newf9_analysis(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "test_newf9.fits")) - f9 = WFSFactory(wfs='newf9') + test_file = WFS_DATA_DIR / "test_data" / "test_newf9.fits" + f9 = WFSFactory(wfs="newf9") results = f9.measure_slopes(test_file) zresults = f9.fit_wavefront(results) - testval = int(zresults['zernike']['Z09'].value) - assert((testval > 90) & (testval < 110)) + testval = int(zresults["zernike"]["Z09"].value) + assert (testval > 109) & (testval < 129) + plt.close("all") -@cleanup def test_f5_analysis(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "auto_wfs_0037_ave.fits")) - f5 = WFSFactory(wfs='f5') + test_file = WFS_DATA_DIR / "test_data" / "auto_wfs_0037_ave.fits" + f5 = WFSFactory(wfs="f5") results = f5.measure_slopes(test_file) zresults = f5.fit_wavefront(results) - testval = int(zresults['zernike']['Z10'].value) - assert((testval > 120) & (testval < 140)) + testval = int(zresults["zernike"]["Z10"].value) + assert (testval > 76) & (testval < 96) + plt.close("all") -@cleanup def test_bino_analysis(): - test_file = pkg_resources.resource_filename( - "mmtwfs", - os.path.join("data", "test_data", "wfs_ff_cal_img_2017.1113.111402.fits") - ) - wfs = WFSFactory(wfs='binospec') + test_file = WFS_DATA_DIR / "test_data" / "wfs_ff_cal_img_2017.1113.111402.fits" + wfs = WFSFactory(wfs="binospec") results = wfs.measure_slopes(test_file, mode="binospec") zresults = wfs.fit_wavefront(results) - testval = int(zresults['zernike']['Z10'].value) - assert((testval > 130) & (testval < 140)) + testval = int(zresults["zernike"]["Z10"].value) + assert (testval > 163) & (testval < 183) + plt.close("all") -@cleanup def test_flwo_analysis(): - test_file = pkg_resources.resource_filename( - "mmtwfs", - os.path.join("data", "test_data", "1195.star.p2m18.fits") - ) + test_file = WFS_DATA_DIR / "test_data" / "1195.star.p2m18.fits" wfs = WFSFactory(wfs="flwo15") results = wfs.measure_slopes(test_file) zresults = wfs.fit_wavefront(results) - testval = int(zresults['zernike']['Z06'].value) - assert((testval > 700) & (testval < 1000)) + testval = int(zresults["zernike"]["Z06"].value) + assert (testval > 700) & (testval < 1000) + plt.close("all") -@cleanup def test_too_few_spots(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "mmirs_bogus.fits")) - mmirs = WFSFactory(wfs='mmirs') + test_file = WFS_DATA_DIR / "test_data" / "mmirs_bogus.fits" + mmirs = WFSFactory(wfs="mmirs") results = mmirs.measure_slopes(test_file) - assert(results['slopes'] is None) + assert results["slopes"] is None + plt.close("all") -@cleanup -def test_no_spots(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "mmirs_blank.fits")) - mmirs = WFSFactory(wfs='mmirs') - results = mmirs.measure_slopes(test_file) - assert(results['slopes'] is None) +# def test_no_spots(): +# test_file = WFS_DATA_DIR / "test_data" / "mmirs_blank.fits" +# mmirs = WFSFactory(wfs="mmirs") +# results = mmirs.measure_slopes(test_file) +# assert results["slopes"] is None +# plt.close("all") -@cleanup def test_frosted_donut(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "f9wfs_20200225-205600.fits")) - wfs = WFSFactory(wfs='newf9') + test_file = WFS_DATA_DIR / "test_data" / "f9wfs_20200225-205600.fits" + wfs = WFSFactory(wfs="newf9") results = wfs.measure_slopes(test_file) - assert(results['slopes'] is None) + assert results["slopes"] is None + plt.close("all") def test_correct_primary(): - wfs = WFSFactory(wfs='f5') + wfs = WFSFactory(wfs="f5") zv = ZernikeVector(Z04=1000) f, m1f, zv_masked = wfs.calculate_primary(zv) - assert(m1f == 0.0) + assert m1f == 0.0 def test_correct_focus(): - wfs = WFSFactory(wfs='f5') + wfs = WFSFactory(wfs="f5") zv = ZernikeVector() corr = wfs.calculate_focus(zv) - assert(corr == 0.0) + assert corr == 0.0 def test_correct_coma(): - wfs = WFSFactory(wfs='f5') + wfs = WFSFactory(wfs="f5") zv = ZernikeVector() cx, cy = wfs.calculate_cc(zv) - assert(cx == 0.0) - assert(cy == 0.0) + assert cx == 0.0 + assert cy == 0.0 def test_recenter(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "test_newf9.fits")) - f9 = WFSFactory(wfs='newf9') + test_file = WFS_DATA_DIR / "test_data" / "test_newf9.fits" + f9 = WFSFactory(wfs="newf9") results = f9.measure_slopes(test_file, plot=False) az, el = f9.calculate_recenter(results) - assert(np.abs(az) > 0.0) - assert(np.abs(el) > 0.0) + assert np.abs(az) > 0.0 + assert np.abs(el) > 0.0 + plt.close("all") def test_f5_recenter(): - test_file = pkg_resources.resource_filename("mmtwfs", os.path.join("data", "test_data", "auto_wfs_0037_ave.fits")) - f5 = WFSFactory(wfs='f5') + test_file = WFS_DATA_DIR / "test_data" / "auto_wfs_0037_ave.fits" + f5 = WFSFactory(wfs="f5") results = f5.measure_slopes(test_file, plot=False) az, el = f5.calculate_recenter(results) - assert(np.abs(az) > 0.0) - assert(np.abs(el) > 0.0) + assert np.abs(az) > 0.0 + assert np.abs(el) > 0.0 + plt.close("all") def test_clear(): - wfs = WFSFactory(wfs='f5') + wfs = WFSFactory(wfs="f5") clear_forces, clear_m1f, cmds = wfs.clear_corrections() - assert(clear_m1f == 0.0) - assert(np.allclose(clear_forces['force'], 0.0)) + assert clear_m1f == 0.0 + assert np.allclose(clear_forces["force"], 0.0) diff --git a/mmtwfs/tests/test_zernike.py b/mmtwfs/tests/test_zernike.py index eafa8d98..14f6a363 100644 --- a/mmtwfs/tests/test_zernike.py +++ b/mmtwfs/tests/test_zernike.py @@ -1,20 +1,32 @@ # -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst +import os +import pytest + +import matplotlib.pyplot as plt + import numpy as np import astropy.units as u -from matplotlib.testing.decorators import cleanup - -from ..zernike import ZernikeVector, noll_normalization_vector, noll_coefficient, R_mn, norm_coefficient, zernike, \ - dZ_dx, dZ_dy, noll_to_zernike -from ..custom_exceptions import ZernikeException +from mmtwfs.zernike import ( + ZernikeVector, + noll_normalization_vector, + noll_coefficient, + R_mn, + norm_coefficient, + zernike, + dZ_dx, + dZ_dy, + noll_to_zernike, +) +from mmtwfs.custom_exceptions import ZernikeException def test_R_mn(): r = R_mn(2, 1, np.ones(25).reshape((5, 5))) - assert(r == 0.0) + assert r == 0.0 def test_norm(): @@ -25,7 +37,7 @@ def test_norm(): for f in [zernike, dZ_dx, dZ_dy]: z1 = f(m, n, rho, phi, norm=False) z2 = f(m, n, rho, phi, norm=True) - assert(np.isclose(z2/z1, nc)) + assert np.isclose(z2 / z1, nc) def test_bogus_noll_to_zernike(): @@ -43,7 +55,7 @@ def test_bogus_coefficient(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -57,7 +69,7 @@ def test_bogus_setkeys(): except KeyError: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -71,7 +83,7 @@ def test_bogus_getkeys(): except KeyError: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -84,7 +96,7 @@ def test_bogus_add(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -97,7 +109,7 @@ def test_bogus_radd(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -110,7 +122,7 @@ def test_bogus_sub(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -123,7 +135,7 @@ def test_bogus_rsub(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -136,7 +148,7 @@ def test_bogus_div(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -149,7 +161,7 @@ def test_bogus_rdiv(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -162,7 +174,7 @@ def test_bogus_mul(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -175,7 +187,7 @@ def test_bogus_pow(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -188,7 +200,7 @@ def test_bogus_key(): except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False @@ -196,109 +208,109 @@ def test_bogus_key(): def test_repr(): zv = ZernikeVector(Z04=1000, Z05=500, modestart=2) - assert(len(repr(zv)) > 0) + assert len(repr(zv)) > 0 zv.normalize() - assert(len(repr(zv)) > 0) - zv['Z99'] = 1.0 - assert(len(repr(zv)) > 0) + assert len(repr(zv)) > 0 + zv["Z99"] = 1.0 + assert len(repr(zv)) > 0 def test_str(): zv = ZernikeVector(Z04=1000, Z05=500, modestart=2) - assert(len(str(zv)) > 0) + assert len(str(zv)) > 0 def test_pprint(): zv = ZernikeVector(Z04=1000, Z05=500, Z80=100, modestart=2) s = zv.pretty_print() - assert(len(s) > 0) + assert len(s) > 0 def test_zernike_del(): zv = ZernikeVector(Z04=1000, Z05=500, modestart=2) - assert(len(zv) == 4) - del zv['Z05'] - assert(len(zv) == 3) + assert len(zv) == 4 + del zv["Z05"] + assert len(zv) == 3 def test_zernike_add(): - z1 = ZernikeVector(Z04=1000, errorbars={'Z04': 10}) - z2 = ZernikeVector(Z06=500, errorbars={'Z06': 10}) + z1 = ZernikeVector(Z04=1000, errorbars={"Z04": 10}) + z2 = ZernikeVector(Z06=500, errorbars={"Z06": 10}) a1 = z1 + z2 a2 = z2 + z1 - assert(a1 == a2) + assert a1 == a2 def test_zernike_add_scalar(): z1 = ZernikeVector(Z04=1000) - z2 = 100. + z2 = 100.0 a1 = z1 + z2 a2 = z2 + z1 - assert(a1 == a2) + assert a1 == a2 def test_zernike_mult_scalar(): z1 = ZernikeVector(Z04=1000) - z2 = 3. + z2 = 3.0 a1 = z1 * z2 a2 = z2 * z1 - assert(a1 == a2) + assert a1 == a2 def test_zernike_mult(): - z1 = ZernikeVector(Z04=1000, errorbars={'Z04': 10}) - z2 = ZernikeVector(Z06=100, errorbars={'Z06': 10}) + z1 = ZernikeVector(Z04=1000, errorbars={"Z04": 10}) + z2 = ZernikeVector(Z06=100, errorbars={"Z06": 10}) a1 = z1 * z2 a2 = z2 * z1 - assert(a1 == a2) + assert a1 == a2 def test_zernike_sub(): - z1 = ZernikeVector(Z04=1000, errorbars={'Z04': 10}) - z2 = ZernikeVector(Z06=500, errorbars={'Z06': 10}) + z1 = ZernikeVector(Z04=1000, errorbars={"Z04": 10}) + z2 = ZernikeVector(Z06=500, errorbars={"Z06": 10}) a1 = z1 - z2 a2 = z2 - z1 - assert(a1 == -1*a2) + assert a1 == -1 * a2 a2 = z1.__rsub__(z2) - assert(a1 == -1*a2) + assert a1 == -1 * a2 def test_zernike_sub_scalar(): z1 = ZernikeVector(Z04=1000) - z2 = 500. + z2 = 500.0 a1 = z1 - z2 a2 = z2 - z1 - assert(a1 == -1*a2) + assert a1 == -1 * a2 def test_zernike_div_scalar(): z1 = ZernikeVector(Z04=1000) - z2 = 500. + z2 = 500.0 a1 = z1 / z2 a2 = z2 / z1 - assert(a1 == 1. / a2) + assert a1 == 1.0 / a2 # test python2.x methods a1 = z1.__div__(z2) a2 = z1.__rdiv__(z2) - assert(a1 == 1. / a2) + assert a1 == 1.0 / a2 def test_zernike_div(): - z1 = ZernikeVector(Z04=1000, errorbars={'Z04': 10}) - z2 = ZernikeVector(Z04=100, errorbars={'Z04': 10}) - z3 = ZernikeVector(Z04=100, errorbars={'Z06': 10}) + z1 = ZernikeVector(Z04=1000, errorbars={"Z04": 10}) + z2 = ZernikeVector(Z04=100, errorbars={"Z04": 10}) + z3 = ZernikeVector(Z04=100, errorbars={"Z06": 10}) a1 = z1 / z2 a2 = z2 / z1 a3 = z1 / z3 a4 = z3 / z1 - assert(a1 == 1. / a2) - assert(a3 == 1. / a4) + assert a1 == 1.0 / a2 + assert a3 == 1.0 / a4 a2 = z1.__rtruediv__(z2) a3 = z1.__rtruediv__(z3) a4 = z3.__rtruediv__(z1) - assert(a1 == 1. / a2) - assert(a1['Z04'] == 1. / a3['Z04']) - assert(a4['Z04'] == 1. / a3['Z04']) + assert a1 == 1.0 / a2 + assert a1["Z04"] == 1.0 / a3["Z04"] + assert a4["Z04"] == 1.0 / a3["Z04"] def test_zernike_div_nan(): @@ -306,61 +318,61 @@ def test_zernike_div_nan(): z2 = ZernikeVector(Z06=100) a1 = z1 / z2 a2 = z2 / z1 - assert(a1 == 1. / a2) + assert a1 == 1.0 / a2 def test_zernike_pow(): amp = 1000 - z1 = ZernikeVector(Z04=amp, errorbars={'Z04': 10}) - z2 = z1 ** 2 - assert(amp**2 == z2['Z04'].value) + z1 = ZernikeVector(Z04=amp, errorbars={"Z04": 10}) + z2 = z1**2 + assert amp**2 == z2["Z04"].value def test_p2v(): zv = ZernikeVector(Z04=1000) p2v = zv.peak2valley - assert(p2v > 0.0) + assert p2v > 0.0 def test_rms(): zv = ZernikeVector(Z04=1000) rms = zv.rms - assert(rms > 0.0) + assert rms > 0.0 def test_from_array(): zv = ZernikeVector(coeffs=[0, 0, 1000], modestart=2) - assert(len(zv) == 3) - assert(zv['Z04'].value == 1000.0) - zv2 = ZernikeVector(coeffs=[500., 500.], zmap={'Z05': 0, 'Z06': 1}, modestart=5) - assert(len(zv2) == 2) - assert(zv2['Z06'].value == 500.0) + assert len(zv) == 3 + assert zv["Z04"].value == 1000.0 + zv2 = ZernikeVector(coeffs=[500.0, 500.0], zmap={"Z05": 0, "Z06": 1}, modestart=5) + assert len(zv2) == 2 + assert zv2["Z06"].value == 500.0 def test_noll_vector(): arr = noll_normalization_vector(nmodes=20) - assert(len(arr) == 20) + assert len(arr) == 20 def test_ignore(): zv = ZernikeVector(Z04=1000, Z05=500, modestart=2) - assert(len(zv) == 4) - zv.ignore('Z05') - assert(zv['Z05'].value == 0.0) - zv.restore('Z05') - assert(len(zv) == 4) - assert(zv['Z05'].value == 500.0) + assert len(zv) == 4 + zv.ignore("Z05") + assert zv["Z05"].value == 0.0 + zv.restore("Z05") + assert len(zv) == 4 + assert zv["Z05"].value == 500.0 def test_rotate(): zv = ZernikeVector(Z05=500) - a = zv['Z05'].value - zv.rotate(angle=180*u.deg) - b = zv['Z05'].value - assert(a == b) - zv.rotate(angle=90*u.deg) - c = zv['Z05'].value - assert(a == -c) + a = zv["Z05"].value + zv.rotate(angle=180 * u.deg) + b = zv["Z05"].value + assert a == b + zv.rotate(angle=90 * u.deg) + c = zv["Z05"].value + assert a == -c def test_loadsave(): @@ -368,46 +380,48 @@ def test_loadsave(): zv.save(filename="test.json") zv2 = ZernikeVector(coeffs="test.json") for c in zv2: - assert(zv2[c] == zv[c]) + assert zv2[c] == zv[c] try: ZernikeVector(coeffs="bogus.json") except ZernikeException: assert True except Exception as e: - assert(e is not None) + assert e is not None assert False else: assert False + os.remove("test.json") def test_labels(): zv = ZernikeVector(Z04=100, Z05=200, Z06=-500) - long = zv.label('Z04') - ls = zv.shortlabel('Z04') - assert(len(long) > len(ls)) - ll = zv.label('Z80') - lls = zv.shortlabel('Z80') - assert(len(ll) == len(lls)) + long = zv.label("Z04") + ls = zv.shortlabel("Z04") + assert len(long) > len(ls) + ll = zv.label("Z80") + lls = zv.shortlabel("Z80") + assert len(ll) == len(lls) -@cleanup +@pytest.mark.filterwarnings("ignore:The input coordinates to pcolormesh") def test_plots(): zv = ZernikeVector(Z04=100, Z05=200, Z06=-500) - f1 = zv.bar_chart(title="bar chart", residual=100.) - assert(f1 is not None) + f1 = zv.bar_chart(title="bar chart", residual=100.0) + assert f1 is not None f2 = zv.plot_map() - assert(f2 is not None) + assert f2 is not None f3 = zv.plot_surface() - assert(f3 is not None) + assert f3 is not None f4 = zv.fringe_bar_chart(title="fringe bar chart") - assert(f4 is not None) + assert f4 is not None zv.normalize() - zv['Z99'] = 100.0 * u.nm + zv["Z99"] = 100.0 * u.nm f1 = zv.bar_chart() - assert(f1 is not None) + assert f1 is not None f2 = zv.plot_map() - assert(f2 is not None) + assert f2 is not None f3 = zv.plot_surface() - assert(f3 is not None) + assert f3 is not None f4 = zv.fringe_bar_chart() - assert(f4 is not None) + assert f4 is not None + plt.close("all") diff --git a/mmtwfs/utils.py b/mmtwfs/utils.py index 9678c359..5c40b971 100644 --- a/mmtwfs/utils.py +++ b/mmtwfs/utils.py @@ -13,7 +13,7 @@ log = logging.getLogger("DNSresolver") log.setLevel(logging.INFO) -__all__ = ['srvlookup'] +__all__ = ["srvlookup"] def srvlookup(server): @@ -21,7 +21,7 @@ def srvlookup(server): Perform a SRV lookup of 'server' and return its hostname and port. """ try: - response = resolver.resolve(server, 'SRV') + response = resolver.resolve(server, "SRV") host = response[0].target.to_text() port = response[0].port except Exception as e: diff --git a/mmtwfs/wfs.py b/mmtwfs/wfs.py index bfb49f58..7aea067e 100644 --- a/mmtwfs/wfs.py +++ b/mmtwfs/wfs.py @@ -10,12 +10,11 @@ import pathlib import numpy as np -import photutils import matplotlib.pyplot as plt import matplotlib.cm as cm -from skimage import feature +from skimage import feature, restoration from scipy import ndimage, optimize from scipy.ndimage import rotate from scipy.spatial import cKDTree @@ -26,41 +25,86 @@ from astropy.io import fits from astropy.io import ascii from astropy import stats, visualization, timeseries -from astropy.modeling.models import Gaussian2D, Polynomial2D -from astropy.modeling.fitting import LevMarLSQFitter +from astropy.modeling.models import Gaussian2D +from astropy.modeling.fitting import DogBoxLSQFitter +from astropy.modeling import custom_model +from astropy.convolution import Gaussian2DKernel from astropy.table import conf as table_conf from astroscrappy import detect_cosmics +from photutils.detection import DAOStarFinder, find_peaks +from photutils.aperture import CircularAperture +from photutils.centroids import centroid_com +from photutils.background import Background2D, ModeEstimatorBackground +from photutils.isophote import EllipseGeometry, Ellipse +from photutils.profiles import RadialProfile + from ccdproc.utils.slices import slice_from_string -from .config import recursive_subclasses, merge_config, mmtwfs_config -from .telescope import TelescopeFactory -from .f9topbox import CompMirror -from .zernike import ZernikeVector, zernike_slopes, cart2pol, pol2cart -from .custom_exceptions import WFSConfigException, WFSAnalysisFailed, WFSCommandException +from mmtwfs.config import recursive_subclasses, merge_config, mmtwfs_config +from mmtwfs.telescope import TelescopeFactory +from mmtwfs.f9topbox import CompMirror +from mmtwfs.zernike import ZernikeVector, zernike_slopes, cart2pol, pol2cart +from mmtwfs.photometry import make_spot_mask +from mmtwfs.custom_exceptions import ( + WFSConfigException, + WFSAnalysisFailed, + WFSCommandException, +) import logging import logging.handlers + log = logging.getLogger("WFS") log.setLevel(logging.INFO) warnings.simplefilter(action="ignore", category=FutureWarning) -table_conf.replace_warnings = ['attributes'] - - -__all__ = ['SH_Reference', 'WFS', 'F9', 'NewF9', 'F5', 'Binospec', 'MMIRS', 'WFSFactory', 'wfs_norm', 'check_wfsdata', - 'wfsfind', 'grid_spacing', 'center_pupil', 'get_apertures', 'match_apertures', 'aperture_distance', 'fit_apertures', - 'get_slopes', 'make_init_pars', 'slope_diff', 'mk_wfs_mask'] +table_conf.replace_warnings = ["attributes"] + + +__all__ = [ + "SH_Reference", + "WFS", + "F9", + "NewF9", + "F5", + "Binospec", + "MMIRS", + "WFSFactory", + "wfs_norm", + "check_wfsdata", + "wfsfind", + "grid_spacing", + "center_pupil", + "get_apertures", + "match_apertures", + "aperture_distance", + "fit_apertures", + "get_slopes", + "make_init_pars", + "slope_diff", + "mk_wfs_mask", +] + + +@custom_model +def spot_profile(r, amplitude=1, a=1): + """ + Model for long-exposure spot PSFs in Shack-Hartmann images. + """ + return amplitude * np.exp(-a * r ** (5 / 3)) -def wfs_norm(data, interval=visualization.ZScaleInterval(contrast=0.05), stretch=visualization.LinearStretch()): +def wfs_norm( + data, + interval=visualization.ZScaleInterval(contrast=0.05), + stretch=visualization.LinearStretch(), +): """ Define default image normalization to use for WFS images """ norm = visualization.mpl_normalize.ImageNormalize( - data, - interval=interval, - stretch=stretch + data, interval=interval, stretch=stretch ) return norm @@ -84,7 +128,9 @@ def check_wfsdata(data, header=False): # we're a fits file (hopefully) try: with fits.open(data, ignore_missing_simple=True) as h: - data = h[-1].data # binospec images put the image data into separate extension so always grab last available. + h.verify("silentfix") + # binospec images put the image data into separate extension so always grab last available. + data = h[-1].data if header: hdr = h[-1].header except Exception as e: @@ -94,7 +140,9 @@ def check_wfsdata(data, header=False): msg = "WFS image data in improper format, %s" % type(data) raise WFSConfigException(value=msg) if len(data.shape) != 2: - msg = "WFS image data has improper shape, %dD. Must be 2D image." % len(data.shape) + msg = "WFS image data has improper shape, %dD. Must be 2D image." % len( + data.shape + ) raise WFSConfigException(value=msg) if header and hdr is not None: @@ -103,7 +151,7 @@ def check_wfsdata(data, header=False): return data -def mk_wfs_mask(data, thresh_factor=50., outfile="wfs_mask.fits"): +def mk_wfs_mask(data, thresh_factor=50.0, outfile="wfs_mask.fits"): """ Take a WFS image and mask/scale it so that it can be used as a reference for pupil centering @@ -124,7 +172,7 @@ def mk_wfs_mask(data, thresh_factor=50., outfile="wfs_mask.fits"): data = check_wfsdata(data) mx = data.max() thresh = mx / thresh_factor - data[data < thresh] = 0. + data[data < thresh] = 0.0 scaled = data / mx if outfile is not None: fits.writeto(outfile, scaled) @@ -133,7 +181,7 @@ def mk_wfs_mask(data, thresh_factor=50., outfile="wfs_mask.fits"): def wfsfind(data, fwhm=7.0, threshold=5.0, plot=True, ap_radius=5.0, std=None): """ - Use photutils.DAOStarFinder() to find and centroid spots in a Shack-Hartmann WFS image. + Use photutils.detection.DAOStarFinder() to find and centroid spots in a Shack-Hartmann WFS image. Parameters ---------- @@ -152,7 +200,7 @@ def wfsfind(data, fwhm=7.0, threshold=5.0, plot=True, ap_radius=5.0, std=None): data = check_wfsdata(data) if std is None: mean, median, std = stats.sigma_clipped_stats(data, sigma=3.0, maxiters=5) - daofind = photutils.DAOStarFinder(fwhm=fwhm, threshold=threshold*std, sharphi=0.95) + daofind = DAOStarFinder(fwhm=fwhm, threshold=threshold * std, sharphi=0.95) sources = daofind(data) if sources is None: @@ -166,17 +214,17 @@ def wfsfind(data, fwhm=7.0, threshold=5.0, plot=True, ap_radius=5.0, std=None): raise WFSAnalysisFailed(value=msg) # only keep spots more than 1/4 as bright as the max. need this for f/9 especially. - sources = sources[sources['flux'] > sources['flux'].max()/4.] + sources = sources[sources["flux"] > sources["flux"].max() / 4.0] fig = None if plot: fig, ax = plt.subplots() fig.set_label("WFSfind") - positions = list(zip(sources['xcentroid'], sources['ycentroid'])) - apertures = photutils.CircularAperture(positions, r=ap_radius) + positions = list(zip(sources["xcentroid"], sources["ycentroid"])) + apertures = CircularAperture(positions, r=ap_radius) norm = wfs_norm(data) - ax.imshow(data, cmap='Greys', origin='lower', norm=norm, interpolation='None') - apertures.plot(color='red', lw=1.5, alpha=0.5, axes=ax) + ax.imshow(data, cmap="Greys", origin="lower", norm=norm, interpolation="None") + apertures.plot(color="red", lw=1.5, alpha=0.5, ax=ax) return sources, fig @@ -198,15 +246,17 @@ def grid_spacing(data, apertures): data = check_wfsdata(data) x = np.arange(data.shape[1]) y = np.arange(data.shape[0]) - bx = np.arange(data.shape[1]+1) - by = np.arange(data.shape[0]+1) + bx = np.arange(data.shape[1] + 1) + by = np.arange(data.shape[0] + 1) # bin the spot positions along the axes and use Lomb-Scargle to measure the grid spacing in each direction - xsum = np.histogram(apertures['xcentroid'], bins=bx) - ysum = np.histogram(apertures['ycentroid'], bins=by) + xsum = np.histogram(apertures["xcentroid"], bins=bx) + ysum = np.histogram(apertures["ycentroid"], bins=by) - k = np.linspace(10.0, 50., 1000) # look for spacings from 10 to 50 pixels (plenty of range, but not too small to alias) - f = 1.0 / k # convert spacing to frequency + # look for spacings from 10 to 50 pixels (plenty of range, but not too small to alias) + k = np.linspace(10.0, 50.0, 1000) + # convert spacing to frequency + f = 1.0 / k xp = timeseries.LombScargle(x, xsum[0]).power(f) yp = timeseries.LombScargle(y, ysum[0]).power(f) @@ -217,7 +267,7 @@ def grid_spacing(data, apertures): return xspacing, yspacing -def center_pupil(input_data, pup_mask, threshold=0.8, sigma=10., plot=True): +def center_pupil(input_data, pup_mask, threshold=0.8, sigma=10.0, plot=True): """ Find the center of the pupil in a WFS image using skimage.feature.match_template(). This generates a correlation image and we centroid the peak of the correlation to determine the center. @@ -241,7 +291,8 @@ def center_pupil(input_data, pup_mask, threshold=0.8, sigma=10., plot=True): X and Y pixel coordinates of the pupil center """ data = np.copy(check_wfsdata(input_data)) - pup_mask = check_wfsdata(pup_mask).astype(np.float64) # need to force float64 here to make scipy >= 1.4 happy... + # need to force float64 here to make scipy >= 1.4 happy... + pup_mask = check_wfsdata(pup_mask).astype(np.float64) # smooth the image to increae the S/N. smo = ndimage.gaussian_filter(data, sigma) @@ -250,27 +301,27 @@ def center_pupil(input_data, pup_mask, threshold=0.8, sigma=10., plot=True): # the location of the peak of the correlation will be the center of the WFS pattern. match = feature.match_template(smo, pup_mask, pad_input=True) find_thresh = threshold * match.max() - t = photutils.detection.find_peaks(match, find_thresh, box_size=5, centroid_func=photutils.centroids.centroid_com) + t = find_peaks(match, find_thresh, box_size=5, centroid_func=centroid_com) if t is None: msg = "No valid pupil or spot pattern detected." raise WFSAnalysisFailed(value=msg) - peak = t['peak_value'].max() + peak = t["peak_value"].max() xps = [] yps = [] # if there are peaks that are very nearly correlated, average their positions for p in t: - if p['peak_value'] >= 0.95*peak: - xps.append(p['x_centroid']) - yps.append(p['y_centroid']) + if p["peak_value"] >= 0.95 * peak: + xps.append(p["x_centroid"]) + yps.append(p["y_centroid"]) xp = np.mean(xps) yp = np.mean(yps) fig = None if plot: fig, ax = plt.subplots() fig.set_label("Pupil Correlation Image (masked)") - ax.imshow(match, interpolation=None, cmap=cm.magma, origin='lower') + ax.imshow(match, interpolation=None, cmap=cm.magma, origin="lower") ax.scatter(xp, yp, marker="+", color="green") return xp, yp, fig @@ -304,31 +355,35 @@ def get_apertures(data, apsize, fwhm=5.0, thresh=7.0, plot=True, cen=None): mean, median, stddev = stats.sigma_clipped_stats(data, sigma=3.0, maxiters=None) else: xcen, ycen = int(cen[0]), int(cen[1]) - mean, median, stddev = stats.sigma_clipped_stats(data[ycen-50:ycen+50, xcen-50:ycen+50], sigma=3.0, maxiters=None) + mean, median, stddev = stats.sigma_clipped_stats( + data[ycen - 50:ycen + 50, xcen - 50:ycen + 50], sigma=3.0, maxiters=None + ) # use wfsfind() and pass it the clipped stddev from here with warnings.catch_warnings(): warnings.simplefilter("ignore") - srcs, wfsfind_fig = wfsfind(data, fwhm=fwhm, threshold=thresh, std=stddev, plot=plot) + srcs, wfsfind_fig = wfsfind( + data, fwhm=fwhm, threshold=thresh, std=stddev, plot=plot + ) # we use circular apertures here because they generate square masks of the appropriate size. # rectangular apertures produced masks that were sqrt(2) too large. # see https://github.com/astropy/photutils/issues/499 for details. - apers = photutils.CircularAperture( - list(zip(srcs['xcentroid'], srcs['ycentroid'])), - r=apsize/2. + apers = CircularAperture( + list(zip(srcs["xcentroid"], srcs["ycentroid"])), r=np.ceil(apsize / 2.0) ) - masks = apers.to_mask(method='subpixel') + + masks = apers.to_mask(method="subpixel") sigma = 0.0 snrs = [] + spot = np.zeros(masks[0].shape) if len(masks) >= 1: - spot = np.zeros(masks[0].shape) for m in masks: subim = m.cutout(data) # make co-added spot image for use in calculating the seeing - if subim.shape == spot.shape: - spot += subim + # if subim.shape == spot.shape: + spot += subim signal = subim.sum() noise = np.sqrt(stddev**2 * subim.shape[0] * subim.shape[1]) @@ -337,23 +392,40 @@ def get_apertures(data, apsize, fwhm=5.0, thresh=7.0, plot=True, cen=None): snrs = np.array(snrs) - # set up 2D gaussian model plus constant background to fit to the coadded spot + # calculate background from edges of the spot image and subtract it + back = np.mean( + [ + spot[:1, :].mean(), + spot[-1:, :].mean(), + spot[:, :1].mean(), + spot[:, -1:].mean(), + ] + ) + spot -= back + + # set up 2D gaussian model to fit to the coadded, background-subtracted spot with warnings.catch_warnings(): # ignore astropy warnings about issues with the fit... warnings.simplefilter("ignore") - g2d = Gaussian2D(amplitude=spot.max(), x_mean=spot.shape[1]/2, y_mean=spot.shape[0]/2) - p2d = Polynomial2D(degree=0) - model = g2d + p2d - fitter = LevMarLSQFitter() - y, x = np.mgrid[:spot.shape[0], :spot.shape[1]] - fit = fitter(model, x, y, spot) + model = Gaussian2D( + amplitude=spot.max(), x_mean=spot.shape[1] / 2, y_mean=spot.shape[0] / 2 + ) + fitter = DogBoxLSQFitter() + y, x = np.mgrid[: spot.shape[0], : spot.shape[1]] + try: + fit = fitter(model, x, y, spot) - sigma = 0.5 * (fit.x_stddev_0.value + fit.y_stddev_0.value) + sigma = min(fit.x_stddev.value, fit.y_stddev.value) + ellipticity = 1 - sigma / max(fit.x_stddev.value, fit.y_stddev.value) + except Exception as e: + log.warning(f"Gaussian fit to coadded spot failed: {e}") + sigma = 0.0 + ellipticity = 0.0 - return srcs, masks, snrs, sigma, wfsfind_fig + return srcs, masks, snrs, sigma, ellipticity, spot, wfsfind_fig -def match_apertures(refx, refy, spotx, spoty, max_dist=25.): +def match_apertures(refx, refy, spotx, spoty, max_dist=25.0): """ Given reference aperture and spot X/Y positions, loop through reference apertures and find closest spot. Use max_dist to exclude matches that are too far from reference position. Return masks to use to denote validly @@ -364,7 +436,7 @@ def match_apertures(refx, refy, spotx, spoty, max_dist=25.): match = np.nan * np.ones(len(refx)) matched = [] for i in np.arange(len(refx)): - dists = np.sqrt((spots[0]-refs[0][i])**2 + (spots[1]-refs[1][i])**2) + dists = np.sqrt((spots[0] - refs[0][i]) ** 2 + (spots[1] - refs[1][i]) ** 2) min_i = np.argmin(dists) if np.min(dists) < max_dist: if min_i not in matched: @@ -427,16 +499,27 @@ def fit_apertures(pars, ref, spots): scale = pars[2] xcoma = pars[3] ycoma = pars[4] - refx = ref['xcentroid'] * (scale + ref['xcentroid'] * xcoma) + xc - refy = ref['ycentroid'] * (scale + ref['ycentroid'] * ycoma) + yc - spotx = spots['xcentroid'] - spoty = spots['ycentroid'] + refx = ref["xcentroid"] * (scale + ref["xcentroid"] * xcoma) + xc + refy = ref["ycentroid"] * (scale + ref["ycentroid"] * ycoma) + yc + spotx = spots["xcentroid"] + spoty = spots["ycentroid"] dist = aperture_distance(refx, refy, spotx, spoty) return dist -def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], - cen_thresh=0.8, cen_sigma=10., cen_tol=50., spot_snr_thresh=3.0, plot=True): +def get_slopes( + data, + ref, + pup_mask, + fwhm=7.0, + thresh=5.0, + cen=[255, 255], + cen_thresh=0.8, + cen_sigma=10.0, + cen_tol=50.0, + spot_snr_thresh=3.0, + plot=True, +): """ Analyze a WFS image and produce pixel offsets between reference and observed spot positions. @@ -492,9 +575,11 @@ def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], # input data should be background subtracted for best results. this initial guess of the center positions # will be good enough to get the central obscuration, but will need to be fine-tuned for aperture association. - xcen, ycen, pupcen_fig = center_pupil(data, pup_mask, threshold=cen_thresh, sigma=cen_sigma, plot=plot) + xcen, ycen, pupcen_fig = center_pupil( + data, pup_mask, threshold=cen_thresh, sigma=cen_sigma, plot=plot + ) - if np.hypot(xcen-cen[0], ycen-cen[1]) > cen_tol: + if np.hypot(xcen - cen[0], ycen - cen[1]) > cen_tol: msg = f"Measured pupil center [{round(xcen)}, {round(ycen)}] more than {cen_tol} pixels from {cen}." raise WFSAnalysisFailed(value=msg) @@ -502,7 +587,9 @@ def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], ref_spacing = np.mean([ref.xspacing, ref.yspacing]) apsize = ref_spacing - srcs, masks, snrs, sigma, wfsfind_fig = get_apertures(data, apsize, fwhm=fwhm, thresh=thresh, cen=(xcen, ycen)) + srcs, masks, snrs, sigma, ellipticity, coadded_spot, wfsfind_fig = get_apertures( + data, apsize, fwhm=fwhm, thresh=thresh, cen=(xcen, ycen) + ) # ignore low S/N spots srcs = srcs[snrs > spot_snr_thresh] @@ -511,75 +598,99 @@ def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], xspacing, yspacing = grid_spacing(data, srcs) # find the scale difference between data and ref and use as init - init_scale = (xspacing/ref.xspacing + yspacing/ref.yspacing) / 2. + init_scale = (xspacing / ref.xspacing + yspacing / ref.yspacing) / 2.0 # apply masking to detected sources to avoid partially illuminated apertures at the edges - srcs['dist'] = np.sqrt((srcs['xcentroid'] - xcen)**2 + (srcs['ycentroid'] - ycen)**2) - srcs = srcs[(srcs['dist'] > pup_inner*init_scale) & (srcs['dist'] < pup_outer*init_scale)] + srcs["dist"] = np.sqrt( + (srcs["xcentroid"] - xcen) ** 2 + (srcs["ycentroid"] - ycen) ** 2 + ) + srcs = srcs[ + (srcs["dist"] > pup_inner * init_scale) + & (srcs["dist"] < pup_outer * init_scale) + ] # if we don't detect spots in at least half of the reference apertures, we can't usually get a good wavefront measurement - if len(srcs) < 0.5 * len(ref.masked_apertures['xcentroid']): - msg = "Only %d spots detected out of %d apertures." % (len(srcs), len(ref.masked_apertures['xcentroid'])) + if len(srcs) < 0.5 * len(ref.masked_apertures["xcentroid"]): + msg = "Only %d spots detected out of %d apertures." % ( + len(srcs), + len(ref.masked_apertures["xcentroid"]), + ) raise WFSAnalysisFailed(value=msg) - src_aps = photutils.CircularAperture( - list(zip(srcs['xcentroid'], srcs['ycentroid'])), - r=apsize/2. + src_aps = CircularAperture( + list(zip(srcs["xcentroid"], srcs["ycentroid"])), r=apsize / 2.0 ) # set up to do a fit of the reference apertures to the spot positions with the center, scaling, and position-dependent # scaling (coma) as free parameters args = (ref.masked_apertures, srcs) - par_keys = ('xcen', 'ycen', 'scale', 'xcoma', 'ycoma') + par_keys = ("xcen", "ycen", "scale", "xcoma", "ycoma") pars = (xcen, ycen, init_scale, 0.0, 0.0) coma_bound = 1e-4 # keep coma constrained by now since it can cause trouble # scipy.optimize.minimize can do bounded minimization so leverage that to keep the solution within a reasonable range. bounds = ( - (xcen-15, xcen+15), # hopefully we're not too far off from true center... - (ycen-15, ycen+15), - (init_scale-0.05, init_scale+0.05), # reasonable range of expected focus difference... + (xcen - 15, xcen + 15), # hopefully we're not too far off from true center... + (ycen - 15, ycen + 15), + # reasonable range of expected focus difference... + ( + init_scale - 0.05, + init_scale + 0.05, + ), + (-coma_bound, coma_bound), (-coma_bound, coma_bound), - (-coma_bound, coma_bound) ) try: - min_results = optimize.minimize(fit_apertures, pars, args=args, bounds=bounds, options={'ftol': 1e-13, 'gtol': 1e-7}) + min_results = optimize.minimize( + fit_apertures, + pars, + args=args, + bounds=bounds, + options={"ftol": 1e-13, "gtol": 1e-7}, + ) except Exception as e: msg = f"Aperture grid matching failed: {e}" raise WFSAnalysisFailed(value=msg) fit_results = {} for i, k in enumerate(par_keys): - fit_results[k] = min_results['x'][i] + fit_results[k] = min_results["x"][i] # this is more reliably the center of the actual pupil image whereas fit_results shifts a bit depending on detected spots. # the lenslet pattern can move around a bit on the pupil, but we need the center of the pupil to calculate their pupil # coordinates. pup_center = [xcen, ycen] - scale = fit_results['scale'] - xcoma, ycoma = fit_results['xcoma'], fit_results['ycoma'] + scale = fit_results["scale"] + xcoma, ycoma = fit_results["xcoma"], fit_results["ycoma"] - refx = ref.masked_apertures['xcentroid'] * (scale + ref.masked_apertures['xcentroid'] * xcoma) + fit_results['xcen'] - refy = ref.masked_apertures['ycentroid'] * (scale + ref.masked_apertures['ycentroid'] * ycoma) + fit_results['ycen'] + refx = ( + ref.masked_apertures["xcentroid"] + * (scale + ref.masked_apertures["xcentroid"] * xcoma) + + fit_results["xcen"] + ) + refy = ( + ref.masked_apertures["ycentroid"] + * (scale + ref.masked_apertures["ycentroid"] * ycoma) + + fit_results["ycen"] + ) xspacing = scale * ref.xspacing yspacing = scale * ref.yspacing # coarse match reference apertures to spots spacing = np.max([xspacing, yspacing]) - ref_mask, src_mask = match_apertures(refx, refy, srcs['xcentroid'], srcs['ycentroid'], max_dist=spacing/2.) + ref_mask, src_mask = match_apertures( + refx, refy, srcs["xcentroid"], srcs["ycentroid"], max_dist=spacing / 2.0 + ) # these are unscaled so that the slope includes defocus - trim_refx = ref.masked_apertures['xcentroid'][ref_mask] + fit_results['xcen'] - trim_refy = ref.masked_apertures['ycentroid'][ref_mask] + fit_results['ycen'] + trim_refx = ref.masked_apertures["xcentroid"][ref_mask] + fit_results["xcen"] + trim_refy = ref.masked_apertures["ycentroid"][ref_mask] + fit_results["ycen"] - ref_aps = photutils.CircularAperture( - list(zip(trim_refx, trim_refy)), - r=ref_spacing/2. - ) + ref_aps = CircularAperture(list(zip(trim_refx, trim_refy)), r=ref_spacing / 2.0) - slope_x = srcs['xcentroid'][src_mask] - trim_refx - slope_y = srcs['ycentroid'][src_mask] - trim_refy + slope_x = srcs["xcentroid"][src_mask] - trim_refx + slope_y = srcs["ycentroid"][src_mask] - trim_refy pup_coords = (ref_aps.positions - pup_center) / [pup_outer, pup_outer] @@ -588,19 +699,20 @@ def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], norm = wfs_norm(data) aps_fig, ax = plt.subplots() aps_fig.set_label("Aperture Positions") - ax.imshow(data, cmap='Greys', origin='lower', norm=norm, interpolation='None') + ax.imshow(data, cmap="Greys", origin="lower", norm=norm, interpolation="None") ax.scatter(pup_center[0], pup_center[1]) - src_aps.plot(color='blue', axes=ax) + src_aps.plot(color="blue", ax=ax) # need full slopes array the size of the complete set of reference apertures and pre-filled with np.nan for masking - slopes = np.nan * np.ones((2, len(ref.masked_apertures['xcentroid']))) + slopes = np.nan * np.ones((2, len(ref.masked_apertures["xcentroid"]))) slopes[0][ref_mask] = slope_x slopes[1][ref_mask] = slope_y figures = {} - figures['pupil_center'] = pupcen_fig - figures['slopes'] = aps_fig + figures["pupil_center"] = pupcen_fig + figures["slopes"] = aps_fig + figures["wfsfind"] = wfsfind_fig results = { "slopes": np.ma.masked_invalid(slopes), "pup_coords": pup_coords.transpose(), @@ -611,8 +723,10 @@ def get_slopes(data, ref, pup_mask, fwhm=7., thresh=5., cen=[255, 255], "ref_mask": ref_mask, "src_mask": src_mask, "spot_sigma": sigma, + "ellipticity": ellipticity, + "coadded_spot": coadded_spot, "figures": figures, - "grid_fit": fit_results + "grid_fit": fit_results, } return results @@ -637,11 +751,11 @@ def make_init_pars(nmodes=21, modestart=2, init_zv=None): Initial parameters in form that can be passed to `~lmfit.minimize`. """ pars = [] - for i in range(modestart, modestart+nmodes, 1): + for i in range(modestart, modestart + nmodes, 1): key = "Z{:02d}".format(i) if init_zv is not None: val = init_zv[key].value - if val < 2. * np.finfo(float).eps: + if val < 2.0 * np.finfo(float).eps: val = 0.0 else: val = 0.0 @@ -662,7 +776,7 @@ def slope_diff(pars, coords, slopes, norm=False): xslope = slopes[0] yslope = slopes[1] pred_xslope, pred_yslope = zernike_slopes(parsdict, rho, phi, norm=norm) - dist = np.sqrt((xslope - pred_xslope)**2 + (yslope - pred_yslope)**2) + dist = np.sqrt((xslope - pred_xslope) ** 2 + (yslope - pred_yslope) ** 2) return dist @@ -670,6 +784,7 @@ class SH_Reference(object): """ Class to handle Shack-Hartmann reference data """ + def __init__(self, data, fwhm=4.5, threshold=20.0, plot=True): """ Read WFS reference image and generate reference magnifications (i.e. grid spacing) and @@ -688,22 +803,24 @@ def __init__(self, data, fwhm=4.5, threshold=20.0, plot=True): """ self.data = check_wfsdata(data) data = data - np.median(data) - self.apertures, self.figure = wfsfind(data, fwhm=fwhm, threshold=threshold, plot=plot) + self.apertures, self.figure = wfsfind( + data, fwhm=fwhm, threshold=threshold, plot=plot + ) if plot: self.figure.set_label("Reference Image") - self.xcen = self.apertures['xcentroid'].mean() - self.ycen = self.apertures['ycentroid'].mean() + self.xcen = self.apertures["xcentroid"].mean() + self.ycen = self.apertures["ycentroid"].mean() self.xspacing, self.yspacing = grid_spacing(data, self.apertures) # make masks for each reference spot and fit a 2D gaussian to get its FWHM. the reference FWHM is subtracted in # quadrature from the observed FWHM when calculating the seeing. apsize = np.mean([self.xspacing, self.yspacing]) - apers = photutils.CircularAperture( - list(zip(self.apertures['xcentroid'], self.apertures['ycentroid'])), - r=apsize/2. + apers = CircularAperture( + list(zip(self.apertures["xcentroid"], self.apertures["ycentroid"])), + r=apsize / 2.0, ) - masks = apers.to_mask(method='subpixel') + masks = apers.to_mask(method="subpixel") self.photapers = apers self.spot = np.zeros(masks[0].shape) for m in masks: @@ -712,9 +829,11 @@ def __init__(self, data, fwhm=4.5, threshold=20.0, plot=True): if subim.shape == self.spot.shape: self.spot += subim - self.apertures['xcentroid'] -= self.xcen - self.apertures['ycentroid'] -= self.ycen - self.apertures['dist'] = np.sqrt(self.apertures['xcentroid']**2 + self.apertures['ycentroid']**2) + self.apertures["xcentroid"] -= self.xcen + self.apertures["ycentroid"] -= self.ycen + self.apertures["dist"] = np.sqrt( + self.apertures["xcentroid"] ** 2 + self.apertures["ycentroid"] ** 2 + ) self.masked_apertures = self.apertures self.pup_inner = None @@ -724,11 +843,13 @@ def adjust_center(self, x, y): """ Adjust reference center to new x, y position. """ - self.apertures['xcentroid'] += self.xcen - self.apertures['ycentroid'] += self.ycen - self.apertures['xcentroid'] -= x - self.apertures['ycentroid'] -= y - self.apertures['dist'] = np.sqrt(self.apertures['xcentroid']**2 + self.apertures['ycentroid']**2) + self.apertures["xcentroid"] += self.xcen + self.apertures["ycentroid"] += self.ycen + self.apertures["xcentroid"] -= x + self.apertures["ycentroid"] -= y + self.apertures["dist"] = np.sqrt( + self.apertures["xcentroid"] ** 2 + self.apertures["ycentroid"] ** 2 + ) self.xcen = x self.ycen = y self.apply_pupil(self.pup_inner, self.pup_outer) @@ -738,7 +859,10 @@ def apply_pupil(self, pup_inner, pup_outer): Apply a pupil mask to the reference apertures """ if pup_inner is not None and pup_outer is not None: - self.masked_apertures = self.apertures[(self.apertures['dist'] > pup_inner) & (self.apertures['dist'] < pup_outer)] + self.masked_apertures = self.apertures[ + (self.apertures["dist"] > pup_inner) + & (self.apertures["dist"] < pup_outer) + ] self.pup_inner = pup_inner self.pup_outer = pup_outer @@ -746,7 +870,10 @@ def pup_coords(self, pup_outer): """ Take outer radius of pupil and calculate pupil coordinates for the masked apertures """ - coords = (self.masked_apertures['xcentroid']/pup_outer, self.masked_apertures['ycentroid']/pup_outer) + coords = ( + self.masked_apertures["xcentroid"] / pup_outer, + self.masked_apertures["ycentroid"] / pup_outer, + ) return coords @@ -762,10 +889,12 @@ def WFSFactory(wfs="f5", config={}, **kwargs): wfs_map = dict(list(zip(wfses, types))) if wfs not in wfses: - raise WFSConfigException(value="Specified WFS, %s, not valid or not implemented." % wfs) + raise WFSConfigException( + value="Specified WFS, %s, not valid or not implemented." % wfs + ) - if 'plot' in config: - plot = config['plot'] + if "plot" in config: + plot = config["plot"] else: plot = True @@ -777,14 +906,16 @@ class WFS(object): """ Defines configuration pattern and methods common to all WFS systems """ + def __init__(self, config={}, plot=True, **kwargs): key = self.__class__.__name__.lower() - self.__dict__.update(merge_config(mmtwfs_config['wfs'][key], config)) - self.telescope = TelescopeFactory(telescope=self.telescope, secondary=self.secondary) + self.__dict__.update(merge_config(mmtwfs_config["wfs"][key], config)) + self.telescope = TelescopeFactory( + telescope=self.telescope, secondary=self.secondary + ) self.secondary = self.telescope.secondary self.plot = plot self.connected = False - self.ref_fwhm = self.ref_spot_fwhm() # this factor calibrates spot motion in pixels to nm of wavefront error self.tiltfactor = self.telescope.nmperasec * (self.pix_size.to(u.arcsec).value) @@ -797,23 +928,39 @@ def __init__(self, config={}, plot=True, **kwargs): # now assign 'reference' for each mode so that it can be accessed consistently in all cases for mode in self.modes: - if 'reference_file' in self.modes[mode]: - refdata, hdr = check_wfsdata(self.modes[mode]['reference_file'], header=True) - refdata = self.trim_overscan(refdata, hdr) - self.modes[mode]['reference'] = SH_Reference( - refdata, - plot=self.plot + if "reference_file" in self.modes[mode]: + refdata, hdr = check_wfsdata( + self.modes[mode]["reference_file"], header=True ) + refdata = self.trim_overscan(refdata, hdr) + self.modes[mode]["reference"] = SH_Reference(refdata, plot=self.plot) else: - self.modes[mode]['reference'] = reference + self.modes[mode]["reference"] = reference - def ref_spot_fwhm(self): + def ref_spot_fwhm(self, mode): """ - Calculate the Airy FWHM in pixels of a perfect WFS spot from the optical prescription and detector pixel size + Calculate the Airy FWHM in pixels of a perfect WFS spot from the optical prescriptions and detector pixel size. + There is diffraction from both the lenslet optics and projected physical size of the WFS aperture. """ - theta_fwhm = 1.028 * self.eff_wave / self.lenslet_pitch - det_fwhm = np.arctan(theta_fwhm).value * self.lenslet_fl - det_fwhm_pix = det_fwhm.to(u.um).value / self.pix_um.to(u.um).value + # For square WFS apertures the resulting PSF core is not quite azimuthally symmetric, but has a + # mean FWHM of 0.894*lambda/d. In the case of F/9 the apertures are hexagonal so the PSF is more complex, + # but this is still a good enough approximation of its core PSF size. + theta_fwhm = 0.894 * self.eff_wave / self.lenslet_pitch + lens_fwhm = np.arctan(theta_fwhm).value * self.lenslet_fl + lens_fwhm_pix = lens_fwhm.to(u.um).value / self.pix_um.to(u.um).value + + # calculate the physical size of each aperture. + ref = self.modes[mode]["reference"] + apsize_pix = np.max((ref.xspacing, ref.yspacing)) + d = self.telescope.diameter * apsize_pix / self.pup_size + d = d.to(u.m).value + + # calculate the diffraction FWHM of the WFS aperture using PSF for square aperture. + ap_fwhm = 0.894 * self.eff_wave.to(u.m).value / d + ap_fwhm_pix = 206265 * ap_fwhm / self.pix_size.value + + det_fwhm_pix = np.sqrt(lens_fwhm_pix**2 + ap_fwhm_pix**2) + return det_fwhm_pix def get_flipud(self, mode=None): @@ -832,11 +979,105 @@ def ref_pupil_location(self, mode, hdr=None): """ Get the center of the pupil on the reference image """ - ref = self.modes[mode]['reference'] + ref = self.modes[mode]["reference"] x = ref.xcen y = ref.ycen return x, y + def vlt_seeing(self, spot, mode, airmass=None): + """ + Calculate the seeing using a method derived from the one used at the VLT that is + described by Martinez, et al. in https://ui.adsabs.harvard.edu/abs/2012MNRAS.421.3019M/abstract. + They show that straightforward atmospheric turbulence models create long-exposure PSFs of the form: + T(f) = T_0(f) x exp[-3.44(lambda*f/r0)^5/3] (equation 2 in the linked paper) + where f is the spatial frequency (e.g. 1/radians). The T_0(f) term is due to diffraction from the WFS aperture. + Another significant diffraction term is the diffraction PSF of the Shack-Hartmann lenslets themselves. The + unaberrated spot PSF is the convolution of these two diffraction terms. Rather than approximate the + spot PSF model as a Gaussian and subtract the unaberrated PSF width in quadrature, we use Richardson-Lucy + deconvolution to mitigate the effect of the unaberrated PSF and use the deconvolved spot image to calculate the seeing. + """ + # the effective wavelength of the WFS imagers is about 600-700 nm. mmirs and the oldf9 system use blue-blocking filters + wave = self.eff_wave + # r_0 equation expects meters so convert + wave = wave.to(u.m).value + + # standard wavelength that seeing values are referenced to + refwave = 500 * u.nm + refwave = refwave.to(u.m).value + + # create deconvolution kernel from the lenslet width + lenslet_spot_psf = Gaussian2DKernel( + self.ref_spot_fwhm(mode) * stats.gaussian_fwhm_to_sigma + ) + + # deconvolve the spot image with the lenslet PSF using Richardson-Lucy deconvolution + # via skimage. num_iter is set to 10 with a filter_epsilon set to minimize deconvolution artifacts. + spot_deconvolved = restoration.richardson_lucy( + spot / spot.max(), + lenslet_spot_psf.array / lenslet_spot_psf.array.max(), + num_iter=10, + filter_epsilon=1e-2, + ) + + # create elliptical isophote model of the deconvolved spot image. want to use semi-minor + # axes to calculate radial profile to minimize effect of tracking errors/oscillations which + # are usually along one axis (usually elevation). + xycen = (spot_deconvolved.shape[1] / 2, spot_deconvolved.shape[0] / 2) + + with warnings.catch_warnings(): + # ignore astropy warnings about issues with the fitting process... + warnings.simplefilter("ignore") + # the initial angle seems to matter for getting successful fits so try a set + for ang in [0, 45, 90, 135, 180]: + try: + ellipses = Ellipse( + spot_deconvolved, + geometry=EllipseGeometry( + x0=xycen[0], y0=xycen[1], sma=5, eps=0.0, pa=ang + ), + ) + isolist = ellipses.fit_image(minsma=1.5, step=0.2) + break + except Exception: + continue + + # if isolist is empty, fall back to just doing a radial profile + if len(isolist) > 0: + smi = isolist.sma * (1 - isolist.eps) + rad_ang = smi * self.pix_size.value + flux = isolist.intens + else: + log.warning( + "Ellipse fitting to spot failed. Using average radial profile to calculate seeing." + ) + edge_radii = np.arange(np.max(xycen)) + rp = RadialProfile(spot_deconvolved, xycen, edge_radii) + rp.normalize() + rad_ang = rp.radius * self.pix_size.value + flux = rp.profile + + prof_model = spot_profile(amplitude=1, a=1) + fitter = DogBoxLSQFitter() + prof_fit = fitter(prof_model, rad_ang, flux) + + # solve for r0 from the fitted profile where the spatial frequency is 1/arcsec + r0 = wave / (3.44 / prof_fit.a) ** 0.6 + + # calculate large telescope seeing FWHM from r0 using the standard equation + raw_seeing = (0.976 * wave / r0) * u.arcsec + + # seeing scales as lambda^-1/5 so calculate factor to scale to reference lambda + wave_corr = refwave**-0.2 / wave**-0.2 + raw_seeing *= wave_corr + + # correct seeing to zenith if airmass is provided + if airmass is not None: + seeing = raw_seeing / airmass**0.6 + else: + seeing = raw_seeing + + return seeing, raw_seeing + def seeing(self, mode, sigma, airmass=None): """ Given a sigma derived from a gaussian fit to a WFS spot, deconvolve the systematic width from the reference image @@ -844,33 +1085,37 @@ def seeing(self, mode, sigma, airmass=None): """ # the effective wavelength of the WFS imagers is about 600-700 nm. mmirs and the oldf9 system use blue-blocking filters wave = self.eff_wave - wave = wave.to(u.m).value # r_0 equation expects meters so convert + # r_0 equation expects meters so convert + wave = wave.to(u.m).value - refwave = 500 * u.nm # standard wavelength that seeing values are referenced to + # standard wavelength that seeing values are referenced to + refwave = 500 * u.nm refwave = refwave.to(u.m).value # calculate the physical size of each aperture. - ref = self.modes[mode]['reference'] + ref = self.modes[mode]["reference"] apsize_pix = np.max((ref.xspacing, ref.yspacing)) d = self.telescope.diameter * apsize_pix / self.pup_size - d = d.to(u.m).value # r_0 equation expects meters so convert + # r_0 equation expects meters so convert + d = d.to(u.m).value # we need to deconvolve the instrumental spot width from the measured one to get the portion of the width that # is due to spot motion - ref_sigma = stats.funcs.gaussian_fwhm_to_sigma * self.ref_fwhm + ref_sigma = stats.funcs.gaussian_fwhm_to_sigma * self.ref_spot_fwhm(mode) if sigma > ref_sigma: corr_sigma = np.sqrt(sigma**2 - ref_sigma**2) else: return 0.0 * u.arcsec, 0.0 * u.arcsec - corr_sigma *= self.pix_size.to(u.rad).value # r_0 equation expects radians so convert + # r_0 equation expects radians so convert + corr_sigma *= self.pix_size.to(u.rad).value # this equation relates the motion within a single aperture to the characteristic scale size of the # turbulence, r_0. - r_0 = (0.179 * (wave**2) * (d**(-1/3))/corr_sigma**2)**0.6 + r_0 = (0.179 * (wave**2) * (d ** (-1 / 3)) / corr_sigma**2) ** 0.6 # this equation relates the turbulence scale size to an expected image FWHM at the given wavelength. - raw_seeing = u.Quantity(u.rad * 0.98 * wave / r_0, u.arcsec) + raw_seeing = u.Quantity(u.rad * 0.976 * wave / r_0, u.arcsec) # seeing scales as lambda^-1/5 so calculate factor to scale to reference lambda wave_corr = refwave**-0.2 / wave**-0.2 @@ -896,7 +1141,7 @@ def reference_aberrations(self, mode, **kwargs): """ Create reference ZernikeVector for 'mode'. """ - z = ZernikeVector(**self.modes[mode]['ref_zern']) + z = ZernikeVector(**self.modes[mode]["ref_zern"]) return z def get_mode(self, hdr): @@ -916,12 +1161,16 @@ def process_image(self, fitsfile): trimdata = self.trim_overscan(rawdata, hdr=hdr) # MMIRS gets a lot of hot pixels/CRs so make a quick pass to nuke them - cr_mask, data = detect_cosmics(trimdata, sigclip=5., niter=5, cleantype='medmask', psffwhm=5.) + cr_mask, data = detect_cosmics( + trimdata, sigclip=5.0, niter=5, cleantype="medmask", psffwhm=5.0 + ) # calculate the background and subtract it - bkg_estimator = photutils.ModeEstimatorBackground() - mask = photutils.make_source_mask(data, nsigma=2, npixels=5, dilate_size=11) - bkg = photutils.Background2D(data, (10, 10), filter_size=(5, 5), bkg_estimator=bkg_estimator, mask=mask) + bkg_estimator = ModeEstimatorBackground() + mask = make_spot_mask(data, nsigma=2, npixels=5, dilate_size=11) + bkg = Background2D( + data, (10, 10), filter_size=(5, 5), bkg_estimator=bkg_estimator, mask=mask + ) data -= bkg.background return data, hdr @@ -934,14 +1183,16 @@ def trim_overscan(self, data, hdr=None): if hdr is None: return data - if 'DATASEC' not in hdr: + if "DATASEC" not in hdr: # if no DATASEC in header, punt and return unchanged return data - datasec = slice_from_string(hdr['DATASEC'], fits_convention=True) + datasec = slice_from_string(hdr["DATASEC"], fits_convention=True) return data[datasec] - def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=False): + def measure_slopes( + self, fitsfile, mode=None, plot=True, flipud=False, fliplr=False + ): """ Take a WFS image in FITS format, perform background subtration, pupil centration, and then use get_slopes() to perform the aperture placement and spot centroiding. @@ -961,28 +1212,31 @@ def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=Fa mode = self.get_mode(hdr) if mode not in self.modes: - msg = "Invalid mode, %s, for WFS system, %s." % (mode, self.__class__.__name__) + msg = "Invalid mode, %s, for WFS system, %s." % ( + mode, + self.__class__.__name__, + ) raise WFSConfigException(value=msg) # if available, get the rotator angle out of the header - if 'ROT' in hdr: - rotator = hdr['ROT'] * u.deg + if "ROT" in hdr: + rotator = hdr["ROT"] * u.deg else: rotator = 0.0 * u.deg # if there's a ROTOFF in the image header, grab it and adjust the rotator angle accordingly - if 'ROTOFF' in hdr: - rotator -= hdr['ROTOFF'] * u.deg + if "ROTOFF" in hdr: + rotator -= hdr["ROTOFF"] * u.deg # make mask for finding wfs spot pattern pup_mask = self.pupil_mask(hdr=hdr) # get adjusted reference center position and update the reference xcen, ycen = self.ref_pupil_location(mode, hdr=hdr) - self.modes[mode]['reference'].adjust_center(xcen, ycen) + self.modes[mode]["reference"].adjust_center(xcen, ycen) # apply pupil to the reference - self.modes[mode]['reference'].apply_pupil(self.pup_inner, self.pup_size/2.) + self.modes[mode]["reference"].apply_pupil(self.pup_inner, self.pup_size / 2.0) ref_zv = self.reference_aberrations(mode, hdr=hdr) @@ -994,7 +1248,7 @@ def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=Fa try: slope_results = get_slopes( data, - self.modes[mode]['reference'], + self.modes[mode]["reference"], pup_mask, fwhm=self.find_fwhm, thresh=self.find_thresh, @@ -1002,18 +1256,22 @@ def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=Fa cen_thresh=self.cen_thresh, cen_sigma=self.cen_sigma, cen_tol=self.cen_tol, - plot=plot + plot=plot, + ) + slopes = slope_results["slopes"] + coords = slope_results["pup_coords"] + ref_pup_coords = self.modes[mode]["reference"].pup_coords( + self.pup_size / 2.0 ) - slopes = slope_results['slopes'] - coords = slope_results['pup_coords'] - ref_pup_coords = self.modes[mode]['reference'].pup_coords(self.pup_size/2.) rho, phi = cart2pol(ref_pup_coords) - ref_slopes = -(1. / self.tiltfactor) * np.array(zernike_slopes(ref_zv, rho, phi)) - aps = slope_results['src_aps'] - ref_mask = slope_results['ref_mask'] - src_mask = slope_results['src_mask'] - figures = slope_results['figures'] + ref_slopes = -(1.0 / self.tiltfactor) * np.array( + zernike_slopes(ref_zv, rho, phi) + ) + aps = slope_results["src_aps"] + ref_mask = slope_results["ref_mask"] + src_mask = slope_results["src_mask"] + figures = slope_results["figures"] except WFSAnalysisFailed as e: log.warning(f"Wavefront slope measurement failed: {e}") slope_fig = None @@ -1021,22 +1279,31 @@ def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=Fa slope_fig, ax = plt.subplots() slope_fig.set_label("WFS Image") norm = wfs_norm(data) - ax.imshow(data, cmap='Greys', origin='lower', norm=norm, interpolation='None') + ax.imshow( + data, cmap="Greys", origin="lower", norm=norm, interpolation="None" + ) results = {} - results['slopes'] = None - results['figures'] = {} - results['mode'] = mode - results['figures']['slopes'] = slope_fig + results["slopes"] = None + results["figures"] = {} + results["mode"] = mode + results["figures"]["slopes"] = slope_fig return results except Exception as e: raise WFSAnalysisFailed(value=str(e)) # use the average width of the spots to estimate the seeing and use the airmass to extrapolate to zenith seeing - if 'AIRMASS' in hdr: - airmass = hdr['AIRMASS'] + if "AIRMASS" in hdr: + airmass = hdr["AIRMASS"] else: airmass = None - seeing, raw_seeing = self.seeing(mode=mode, sigma=slope_results['spot_sigma'], airmass=airmass) + + seeing, raw_seeing = self.seeing( + mode=mode, sigma=slope_results["spot_sigma"], airmass=airmass + ) + + vlt_seeing, raw_vlt_seeing = self.vlt_seeing( + slope_results["coadded_spot"], mode=mode, airmass=airmass + ) if plot: sub_slopes = slopes - ref_slopes @@ -1045,44 +1312,64 @@ def measure_slopes(self, fitsfile, mode=None, plot=True, flipud=False, fliplr=Fa uu = sub_slopes[0][ref_mask] vv = sub_slopes[1][ref_mask] norm = wfs_norm(data) - figures['slopes'].set_label("Aperture Positions and Spot Movement") - ax = figures['slopes'].axes[0] - ax.imshow(data, cmap='Greys', origin='lower', norm=norm, interpolation='None') - aps.plot(color='blue', axes=ax) - ax.quiver(x, y, uu, vv, scale_units='xy', scale=0.2, pivot='tip', color='red') - xl = [0.1*data.shape[1]] - yl = [0.95*data.shape[0]] - ul = [1.0/self.pix_size.value] + figures["slopes"].set_label("Aperture Positions and Spot Movement") + ax = figures["slopes"].axes[0] + ax.imshow( + data, cmap="Greys", origin="lower", norm=norm, interpolation="None" + ) + aps.plot(color="blue", ax=ax) + ax.quiver( + x, y, uu, vv, scale_units="xy", scale=0.2, pivot="tip", color="red" + ) + xl = [0.1 * data.shape[1]] + yl = [0.95 * data.shape[0]] + ul = [1.0 / self.pix_size.value] vl = [0.0] - ax.quiver(xl, yl, ul, vl, scale_units='xy', scale=0.2, pivot='tip', color='red') - ax.scatter([slope_results['center'][0]], [slope_results['center'][1]]) - ax.text(0.12*data.shape[1], 0.95*data.shape[0], "1{0:unicode}".format(u.arcsec), verticalalignment='center') - ax.set_title("Seeing: %.2f\" (%.2f\" @ zenith)" % (raw_seeing.value, seeing.value)) + ax.quiver( + xl, yl, ul, vl, scale_units="xy", scale=0.2, pivot="tip", color="red" + ) + ax.scatter([slope_results["center"][0]], [slope_results["center"][1]]) + ax.text( + 0.12 * data.shape[1], + 0.95 * data.shape[0], + "1{0:unicode}".format(u.arcsec), + verticalalignment="center", + ) + ax.set_title( + 'Seeing: %.2f" (%.2f" @ zenith)' + % (raw_vlt_seeing.value, vlt_seeing.value) + ) results = {} - results['seeing'] = seeing - results['raw_seeing'] = raw_seeing - results['slopes'] = slopes - results['ref_slopes'] = ref_slopes - results['ref_zv'] = ref_zv - results['spots'] = slope_results['spots'] - results['pup_coords'] = coords - results['ref_pup_coords'] = ref_pup_coords - results['apertures'] = aps - results['xspacing'] = slope_results['spacing'][0] - results['yspacing'] = slope_results['spacing'][1] - results['xcen'] = slope_results['center'][0] - results['ycen'] = slope_results['center'][1] - results['pup_mask'] = pup_mask - results['data'] = data - results['header'] = hdr - results['rotator'] = rotator - results['mode'] = mode - results['ref_mask'] = ref_mask - results['src_mask'] = src_mask - results['fwhm'] = stats.funcs.gaussian_sigma_to_fwhm * slope_results['spot_sigma'] - results['figures'] = figures - results['grid_fit'] = slope_results['grid_fit'] + results["seeing"] = seeing + results["raw_seeing"] = raw_seeing + results["vlt_seeing"] = vlt_seeing + results["raw_vlt_seeing"] = raw_vlt_seeing + results["coadded_spot"] = slope_results["coadded_spot"] + results["ellipticity"] = slope_results["ellipticity"] + results["slopes"] = slopes + results["ref_slopes"] = ref_slopes + results["ref_zv"] = ref_zv + results["spots"] = slope_results["spots"] + results["pup_coords"] = coords + results["ref_pup_coords"] = ref_pup_coords + results["apertures"] = aps + results["xspacing"] = slope_results["spacing"][0] + results["yspacing"] = slope_results["spacing"][1] + results["xcen"] = slope_results["center"][0] + results["ycen"] = slope_results["center"][1] + results["pup_mask"] = pup_mask + results["data"] = data + results["header"] = hdr + results["rotator"] = rotator + results["mode"] = mode + results["ref_mask"] = ref_mask + results["src_mask"] = src_mask + results["fwhm"] = ( + stats.funcs.gaussian_sigma_to_fwhm * slope_results["spot_sigma"] + ) + results["figures"] = figures + results["grid_fit"] = slope_results["grid_fit"] return results @@ -1091,70 +1378,105 @@ def fit_wavefront(self, slope_results, plot=True): Use results from self.measure_slopes() to fit a set of zernike polynomials to the wavefront shape. """ plot = plot and self.plot - if slope_results['slopes'] is not None: + if slope_results["slopes"] is not None: results = {} - slopes = -self.tiltfactor * slope_results['slopes'] - coords = slope_results['ref_pup_coords'] + slopes = -self.tiltfactor * slope_results["slopes"] + coords = slope_results["ref_pup_coords"] rho, phi = cart2pol(coords) - zref = slope_results['ref_zv'] + zref = slope_results["ref_zv"] params = make_init_pars(nmodes=self.nzern, init_zv=zref) - results['fit_report'] = lmfit.minimize(slope_diff, params, args=(coords, slopes)) - zfit = ZernikeVector(coeffs=results['fit_report']) + results["fit_report"] = lmfit.minimize( + slope_diff, params, args=(coords, slopes) + ) + zfit = ZernikeVector(coeffs=results["fit_report"]) - results['raw_zernike'] = zfit + results["raw_zernike"] = zfit # derotate the zernike solution to match the primary mirror coordinate system - total_rotation = self.rotation - slope_results['rotator'] - zv_rot = ZernikeVector(coeffs=results['fit_report']) + total_rotation = self.rotation - slope_results["rotator"] + zv_rot = ZernikeVector(coeffs=results["fit_report"]) zv_rot.rotate(angle=-total_rotation) - results['rot_zernike'] = zv_rot + results["rot_zernike"] = zv_rot # subtract the reference aberrations zsub = zv_rot - zref - results['ref_zernike'] = zref - results['zernike'] = zsub + results["ref_zernike"] = zref + results["zernike"] = zsub pred_slopes = np.array(zernike_slopes(zfit, rho, phi)) diff = slopes - pred_slopes diff_pix = diff / self.tiltfactor - rms = np.sqrt((diff[0]**2 + diff[1]**2).mean()) - results['residual_rms_asec'] = rms / self.telescope.nmperasec * u.arcsec - results['residual_rms'] = rms * zsub.units - results['zernike_rms'] = zsub.rms - results['zernike_p2v'] = zsub.peak2valley + rms = np.sqrt((diff[0] ** 2 + diff[1] ** 2).mean()) + results["residual_rms_asec"] = rms / self.telescope.nmperasec * u.arcsec + results["residual_rms"] = rms * zsub.units + results["zernike_rms"] = zsub.rms + results["zernike_p2v"] = zsub.peak2valley fig = None if plot: - ref_mask = slope_results['ref_mask'] - src_mask = slope_results['src_mask'] - im = slope_results['data'] + ref_mask = slope_results["ref_mask"] + src_mask = slope_results["src_mask"] + im = slope_results["data"] gnorm = wfs_norm(im) fig, ax = plt.subplots() fig.set_label("Zernike Fit Residuals") - ax.imshow(im, cmap='Greys', origin='lower', norm=gnorm, interpolation='None') - x = slope_results['apertures'].positions.transpose()[0][src_mask] - y = slope_results['apertures'].positions.transpose()[1][src_mask] - ax.quiver(x, y, diff_pix[0][ref_mask], diff_pix[1][ref_mask], scale_units='xy', - scale=0.05, pivot='tip', color='red') - xl = [0.1*im.shape[1]] - yl = [0.95*im.shape[0]] - ul = [0.2/self.pix_size.value] + ax.imshow( + im, cmap="Greys", origin="lower", norm=gnorm, interpolation="None" + ) + x = slope_results["apertures"].positions.transpose()[0][src_mask] + y = slope_results["apertures"].positions.transpose()[1][src_mask] + ax.quiver( + x, + y, + diff_pix[0][ref_mask], + diff_pix[1][ref_mask], + scale_units="xy", + scale=0.05, + pivot="tip", + color="red", + ) + xl = [0.1 * im.shape[1]] + yl = [0.95 * im.shape[0]] + ul = [0.2 / self.pix_size.value] vl = [0.0] - ax.quiver(xl, yl, ul, vl, scale_units='xy', scale=0.05, pivot='tip', color='red') - ax.text(0.12*im.shape[1], 0.95*im.shape[0], "0.2{0:unicode}".format(u.arcsec), verticalalignment='center') + ax.quiver( + xl, + yl, + ul, + vl, + scale_units="xy", + scale=0.05, + pivot="tip", + color="red", + ) + ax.text( + 0.12 * im.shape[1], + 0.95 * im.shape[0], + "0.2{0:unicode}".format(u.arcsec), + verticalalignment="center", + ) ax.text( - 0.95*im.shape[1], - 0.95*im.shape[0], - "Residual RMS: {0.value:0.2f}{0.unit:unicode}".format(results['residual_rms_asec']), - verticalalignment='center', - horizontalalignment='right' + 0.95 * im.shape[1], + 0.95 * im.shape[0], + "Residual RMS: {0.value:0.2f}{0.unit:unicode}".format( + results["residual_rms_asec"] + ), + verticalalignment="center", + horizontalalignment="right", + ) + iq = np.sqrt( + results["residual_rms_asec"] ** 2 + + ( + results["zernike_rms"].value + / self.telescope.nmperasec + * u.arcsec + ) + ** 2 ) - iq = np.sqrt(results['residual_rms_asec']**2 + - (results['zernike_rms'].value / self.telescope.nmperasec * u.arcsec)**2) ax.set_title("Image Quality: {0.value:0.2f}{0.unit:unicode}".format(iq)) - results['resid_plot'] = fig + results["resid_plot"] = fig else: results = None return results @@ -1183,13 +1505,11 @@ def calculate_primary(self, zv, threshold=0.0 * u.nm, mask=[]): # use any available error bars to mask down to 1 sigma below amplitude or 0 if error bars are larger than amplitude. for z in zv_masked: - frac_err = 1. - min(zv_masked.frac_error(key=z), 1.) + frac_err = 1.0 - min(zv_masked.frac_error(key=z), 1.0) zv_masked[z] *= frac_err log.debug(f"\nErrorbar masked: {zv_masked}") forces, m1focus, zv_allmasked = self.telescope.calculate_primary_corrections( - zv=zv_masked, - mask=mask, - gain=self.m1_gain + zv=zv_masked, mask=mask, gain=self.m1_gain ) log.debug(f"\nAll masked: {zv_allmasked}") return forces, m1focus, zv_allmasked @@ -1199,9 +1519,12 @@ def calculate_focus(self, zv): Convert Zernike defocus to um of secondary offset. """ z_denorm = zv.copy() - z_denorm.denormalize() # need to assure we're using fringe coeffs - frac_err = 1. - min(z_denorm.frac_error(key='Z04'), 1.) - foc_corr = -self.m2_gain * frac_err * z_denorm['Z04'] / self.secondary.focus_trans + # need to assure we're using fringe coeffs + z_denorm.denormalize() + frac_err = 1.0 - min(z_denorm.frac_error(key="Z04"), 1.0) + foc_corr = ( + -self.m2_gain * frac_err * z_denorm["Z04"] / self.secondary.focus_trans + ) return foc_corr.round(2) @@ -1210,13 +1533,18 @@ def calculate_cc(self, zv): Convert Zernike coma (Z07 and Z08) into arcsec of secondary center-of-curvature tilts. """ z_denorm = zv.copy() - z_denorm.denormalize() # need to assure we're using fringe coeffs + # need to assure we're using fringe coeffs + z_denorm.denormalize() # fix coma using tilts around the M2 center of curvature. - y_frac_err = 1. - min(z_denorm.frac_error(key='Z07'), 1.) - x_frac_err = 1. - min(z_denorm.frac_error(key='Z08'), 1.) - cc_y_corr = -self.m2_gain * y_frac_err * z_denorm['Z07'] / self.secondary.theta_cc - cc_x_corr = -self.m2_gain * x_frac_err * z_denorm['Z08'] / self.secondary.theta_cc + y_frac_err = 1.0 - min(z_denorm.frac_error(key="Z07"), 1.0) + x_frac_err = 1.0 - min(z_denorm.frac_error(key="Z08"), 1.0) + cc_y_corr = ( + -self.m2_gain * y_frac_err * z_denorm["Z07"] / self.secondary.theta_cc + ) + cc_x_corr = ( + -self.m2_gain * x_frac_err * z_denorm["Z08"] / self.secondary.theta_cc + ) return cc_x_corr.round(3), cc_y_corr.round(3) @@ -1225,14 +1553,14 @@ def calculate_recenter(self, fit_results, defoc=1.0): Perform zero-coma hexapod tilts to align the pupil center to the center-of-rotation. The location of the CoR is configured to be at self.cor_coords. """ - xc = fit_results['xcen'] - yc = fit_results['ycen'] + xc = fit_results["xcen"] + yc = fit_results["ycen"] xref = self.cor_coords[0] yref = self.cor_coords[1] dx = xc - xref dy = yc - yref - total_rotation = u.Quantity(self.rotation - fit_results['rotator'], u.rad).value + total_rotation = u.Quantity(self.rotation - fit_results["rotator"], u.rad).value dr, phi = cart2pol([dx, dy]) @@ -1240,7 +1568,8 @@ def calculate_recenter(self, fit_results, defoc=1.0): az, el = pol2cart([dr, derot_phi]) - az *= self.az_parity * self.pix_size * defoc # pix size scales with the pupil size as focus changes. + # pix size scales with the pupil size as focus changes. + az *= self.az_parity * self.pix_size * defoc el *= self.el_parity * self.pix_size * defoc return az.round(3), el.round(3) @@ -1294,6 +1623,7 @@ class F9(WFS): """ Defines configuration and methods specific to the F/9 WFS system """ + def __init__(self, config={}, plot=True): super(F9, self).__init__(config=config, plot=plot) @@ -1322,6 +1652,7 @@ class NewF9(F9): """ Defines configuration and methods specific to the F/9 WFS system with the new SBIG CCD """ + def process_image(self, fitsfile): """ Process the image to make it suitable for accurate wavefront analysis. Steps include nuking cosmic rays, @@ -1329,12 +1660,16 @@ def process_image(self, fitsfile): """ rawdata, hdr = check_wfsdata(fitsfile, header=True) - cr_mask, data = detect_cosmics(rawdata, sigclip=15., niter=5, cleantype='medmask', psffwhm=10.) + cr_mask, data = detect_cosmics( + rawdata, sigclip=15.0, niter=5, cleantype="medmask", psffwhm=10.0 + ) # calculate the background and subtract it - bkg_estimator = photutils.ModeEstimatorBackground() - mask = photutils.make_source_mask(data, nsigma=2, npixels=7, dilate_size=13) - bkg = photutils.Background2D(data, (50, 50), filter_size=(15, 15), bkg_estimator=bkg_estimator, mask=mask) + bkg_estimator = ModeEstimatorBackground() + mask = make_spot_mask(data, nsigma=2, npixels=7, dilate_size=13) + bkg = Background2D( + data, (50, 50), filter_size=(15, 15), bkg_estimator=bkg_estimator, mask=mask + ) data -= bkg.background return data, hdr @@ -1344,6 +1679,7 @@ class F5(WFS): """ Defines configuration and methods specific to the F/5 WFS systems """ + def __init__(self, config={}, plot=True): super(F5, self).__init__(config=config, plot=plot) @@ -1351,7 +1687,7 @@ def __init__(self, config={}, plot=True): self.sock = None # load lookup table for off-axis aberrations - self.aberr_table = ascii.read(self.aberr_table_file) + self.aberr_table = ascii.read(str(self.aberr_table_file)) def process_image(self, fitsfile): """ @@ -1362,12 +1698,16 @@ def process_image(self, fitsfile): trimdata = self.trim_overscan(rawdata, hdr=hdr) - cr_mask, data = detect_cosmics(trimdata, sigclip=15., niter=5, cleantype='medmask', psffwhm=10.) + cr_mask, data = detect_cosmics( + trimdata, sigclip=15.0, niter=5, cleantype="medmask", psffwhm=10.0 + ) # calculate the background and subtract it - bkg_estimator = photutils.ModeEstimatorBackground() - mask = photutils.make_source_mask(data, nsigma=2, npixels=5, dilate_size=11) - bkg = photutils.Background2D(data, (20, 20), filter_size=(10, 10), bkg_estimator=bkg_estimator, mask=mask) + bkg_estimator = ModeEstimatorBackground() + mask = make_spot_mask(data, nsigma=2, npixels=5, dilate_size=11) + bkg = Background2D( + data, (20, 20), filter_size=(11, 11), bkg_estimator=bkg_estimator, mask=mask + ) data -= bkg.background return data, hdr @@ -1391,23 +1731,26 @@ def calculate_recenter(self, fit_results, defoc=1.0): Perform zero-coma hexapod tilts to align the pupil center to the center-of-rotation. The location of the CoR is configured to be at self.cor_coords. """ - xc = fit_results['xcen'] - yc = fit_results['ycen'] + xc = fit_results["xcen"] + yc = fit_results["ycen"] xref = self.cor_coords[0] yref = self.cor_coords[1] dx = xc - xref dy = yc - yref - cam_rotation = self.rotation - 90 * u.deg # pickoff plus fold mirror makes a 90 deg rotation - total_rotation = u.Quantity(cam_rotation - fit_results['rotator'], u.rad).value + # pickoff plus fold mirror makes a 90 deg rotation + cam_rotation = self.rotation - 90 * u.deg + total_rotation = u.Quantity(cam_rotation - fit_results["rotator"], u.rad).value - dr, phi = cart2pol([dx, -dy]) # F/5 camera needs an up/down flip + # F/5 camera needs an up/down flip + dr, phi = cart2pol([dx, -dy]) derot_phi = phi + total_rotation az, el = pol2cart([dr, derot_phi]) - az *= self.az_parity * self.pix_size * defoc # pix size scales with the pupil size as focus changes. + # pix size scales with the pupil size as focus changes. + az *= self.az_parity * self.pix_size * defoc el *= self.el_parity * self.pix_size * defoc return az.round(3), el.round(3) @@ -1418,7 +1761,7 @@ def reference_aberrations(self, mode, hdr=None): the WFS when the data was acquired. """ # for most cases, this gets the reference focus - z_default = ZernikeVector(**self.modes[mode]['ref_zern']) + z_default = ZernikeVector(**self.modes[mode]["ref_zern"]) # now get the off-axis aberrations z_offaxis = ZernikeVector() @@ -1432,10 +1775,17 @@ def reference_aberrations(self, mode, hdr=None): # ignore piston and x/y tilts for i in range(4, 12): k = "Z%02d" % i - z_offaxis[k] = np.interp(field_r.to(u.deg).value, self.aberr_table['field_r'], self.aberr_table[k]) * u.um + z_offaxis[k] = ( + np.interp( + field_r.to(u.deg).value, + self.aberr_table["field_r"], + self.aberr_table[k], + ) + * u.um + ) # remove the 90 degree offset between the MMT and zernike conventions and then rotate the offaxis aberrations - z_offaxis.rotate(angle=field_phi - 90. * u.deg) + z_offaxis.rotate(angle=field_phi - 90.0 * u.deg) z = z_default + z_offaxis @@ -1447,6 +1797,7 @@ class Binospec(F5): Defines configuration and methods specific to the Binospec WFS system. Binospec uses the same aberration table as the F5 system so we inherit from that. """ + def get_flipud(self, mode): """ Method to determine if the WFS image needs to be flipped up/down @@ -1462,43 +1813,44 @@ def ref_pupil_location(self, mode, hdr=None): Otherwise, use the default method. """ if hdr is None: - ref = self.modes[mode]['reference'] + ref = self.modes[mode]["reference"] x = ref.xcen y = ref.ycen else: - for k in ['STARXMM', 'STARYMM']: + for k in ["STARXMM", "STARYMM"]: if k not in hdr: # we'll be lenient for now with missing header info. if not provided, assume we're on-axis. msg = f"Missing value, {k}, that is required to transform Binospec guider coordinates. Defaulting to 0.0." log.warning(msg) hdr[k] = 0.0 - y = 232.771 + 0.17544 * hdr['STARXMM'] - x = 265.438 + -0.20406 * hdr['STARYMM'] + 12.0 + y = 232.771 + 0.17544 * hdr["STARXMM"] + x = 265.438 + -0.20406 * hdr["STARYMM"] + 12.0 return x, y def focal_plane_position(self, hdr): """ Transform from the Binospec guider coordinate system to MMTO focal plane coordinates. """ - for k in ['ROT', 'STARXMM', 'STARYMM']: + for k in ["ROT", "STARXMM", "STARYMM"]: if k not in hdr: # we'll be lenient for now with missing header info. if not provided, assume we're on-axis. msg = f"Missing value, {k}, that is required to transform Binospec guider coordinates. Defaulting to 0.0." log.warning(msg) hdr[k] = 0.0 - guide_x = hdr['STARXMM'] - guide_y = hdr['STARYMM'] - rot = hdr['ROT'] + guide_x = hdr["STARXMM"] + guide_y = hdr["STARYMM"] + rot = hdr["ROT"] guide_r = np.sqrt(guide_x**2 + guide_y**2) * u.mm - rot = u.Quantity(rot, u.deg) # make sure rotation is cast to degrees + # make sure rotation is cast to degrees + rot = u.Quantity(rot, u.deg) # the MMTO focal plane coordinate convention has phi=0 aligned with +Y instead of +X if guide_y != 0.0: guide_phi = np.arctan2(guide_x, guide_y) * u.rad else: - guide_phi = 90. * u.deg + guide_phi = 90.0 * u.deg # transform radius in guider coords to degrees in focal plane focal_r = (guide_r / self.secondary.plate_scale).to(u.deg) @@ -1512,44 +1864,47 @@ def in_wfs_region(self, xw, yw, x, y): """ Determine if a position is within the region available to Binospec's WFS """ - return True # placekeeper until the optical prescription is implemented + # placekeeper until the optical prescription is implemented + return True def pupil_mask(self, hdr, npts=14): """ Generate a synthetic pupil mask """ if hdr is not None: - x_wfs = hdr.get('STARXMM', 150.0) - y_wfs = hdr.get('STARYMM', 0.0) + x_wfs = hdr.get("STARXMM", 150.0) + y_wfs = hdr.get("STARYMM", 0.0) else: x_wfs = 150.0 y_wfs = 0.0 - log.warning("Header information not available for Binospec pupil mask. Assuming default position.") + log.warning( + "Header information not available for Binospec pupil mask. Assuming default position." + ) good = [] - center = self.pup_size / 2. + center = self.pup_size / 2.0 obsc = self.telescope.obscuration.value spacing = 2.0 / npts for x in np.arange(-1, 1, spacing): for y in np.arange(-1, 1, spacing): r = np.hypot(x, y) - if (r < 1 and np.hypot(x, y) >= obsc): + if r < 1 and np.hypot(x, y) >= obsc: if self.in_wfs_region(x_wfs, y_wfs, x, y): - x_impos = center * (x + 1.) - y_impos = center * (y + 1.) - amp = 1. + x_impos = center * (x + 1.0) + y_impos = center * (y + 1.0) + amp = 1.0 # this is kind of a hacky way to dim spots near the edge, but easier than doing full calc # of the aperture intersection with pupil. it also doesn't need to be that accurate for the # purposes of the cross-correlation used to register the pupil. - if r > 1. - spacing: - amp = 1. - (r - (1. - spacing)) / spacing + if r > 1.0 - spacing: + amp = 1.0 - (r - (1.0 - spacing)) / spacing if r - obsc < spacing: amp = (r - obsc) / spacing good.append((amp, x_impos, y_impos)) yi, xi = np.mgrid[0:self.pup_size, 0:self.pup_size] im = np.zeros((self.pup_size, self.pup_size)) - sigma = 3. + sigma = 3.0 for g in good: im += Gaussian2D(g[0], g[1], g[2], sigma, sigma)(xi, yi) @@ -1566,6 +1921,7 @@ class MMIRS(F5): """ Defines configuration and methods specific to the MMIRS WFS system """ + def __init__(self, config={}, plot=True): super(MMIRS, self).__init__(config=config, plot=plot) @@ -1610,7 +1966,7 @@ def mirrorpoint(self, x0, y0, x, y): V0 = np.array([0, 0, self.zm]) # normal to mirror - if (x0 < 0): + if x0 < 0: n = np.array([-np.sin(self.am), 0, np.cos(self.am)]) else: n = np.array([np.sin(self.am), 0, np.cos(self.am)]) @@ -1634,16 +1990,25 @@ def onmirror(self, x, y, side): x,y = coordinates of ray side=1 means right face of the pickoff mirror, -1=left face """ - if np.hypot(x, y) > self.pickoff_diam / 2.: + if np.hypot(x, y) > self.pickoff_diam / 2.0: return False if x * side < 0: return False x = abs(x) y = abs(y) - if ((x > self.pickoff_xsize/2) or (y > self.pickoff_ysize/2) - or (x > self.pickoff_xsize/2 - self.pickoff_rcirc and y > self.pickoff_ysize/2 - self.pickoff_rcirc - and np.hypot(x - (self.pickoff_xsize/2 - self.pickoff_rcirc), - y - (self.pickoff_ysize/2 - self.pickoff_rcirc)) > self.pickoff_rcirc)): + if ( + (x > self.pickoff_xsize / 2) + or (y > self.pickoff_ysize / 2) + or ( + x > self.pickoff_xsize / 2 - self.pickoff_rcirc + and y > self.pickoff_ysize / 2 - self.pickoff_rcirc + and np.hypot( + x - (self.pickoff_xsize / 2 - self.pickoff_rcirc), + y - (self.pickoff_ysize / 2 - self.pickoff_rcirc), + ) + > self.pickoff_rcirc + ) + ): return True else: return False @@ -1653,50 +2018,82 @@ def drawoutline(self, ax): Draw outline of MMIRS pickoff mirror onto matplotlib axis, ax """ circ = np.arange(360) * u.deg - ax.plot(np.cos(circ) * self.pickoff_diam/2, np.sin(circ) * self.pickoff_diam/2, "b") - ax.set_aspect('equal', 'datalim') ax.plot( - [-(self.pickoff_xsize/2 - self.pickoff_rcirc), (self.pickoff_xsize/2 - self.pickoff_rcirc)], - [self.pickoff_ysize/2, self.pickoff_ysize/2], - "b" + np.cos(circ) * self.pickoff_diam / 2, + np.sin(circ) * self.pickoff_diam / 2, + "b", ) + ax.set_aspect("equal", "datalim") ax.plot( - [-(self.pickoff_xsize/2 - self.pickoff_rcirc), (self.pickoff_xsize/2 - self.pickoff_rcirc)], - [-self.pickoff_ysize/2, -self.pickoff_ysize/2], - "b" + [ + -(self.pickoff_xsize / 2 - self.pickoff_rcirc), + (self.pickoff_xsize / 2 - self.pickoff_rcirc), + ], + [self.pickoff_ysize / 2, self.pickoff_ysize / 2], + "b", ) ax.plot( - [-(self.pickoff_xsize/2), -(self.pickoff_xsize/2)], - [self.pickoff_ysize/2 - self.pickoff_rcirc, -(self.pickoff_ysize/2 - self.pickoff_rcirc)], - "b" + [ + -(self.pickoff_xsize / 2 - self.pickoff_rcirc), + (self.pickoff_xsize / 2 - self.pickoff_rcirc), + ], + [-self.pickoff_ysize / 2, -self.pickoff_ysize / 2], + "b", ) ax.plot( - [(self.pickoff_xsize/2), (self.pickoff_xsize/2)], - [self.pickoff_ysize/2 - self.pickoff_rcirc, -(self.pickoff_ysize/2 - self.pickoff_rcirc)], - "b" + [-(self.pickoff_xsize / 2), -(self.pickoff_xsize / 2)], + [ + self.pickoff_ysize / 2 - self.pickoff_rcirc, + -(self.pickoff_ysize / 2 - self.pickoff_rcirc), + ], + "b", ) ax.plot( - np.cos(circ[0:90]) * self.pickoff_rcirc + self.pickoff_xsize/2 - self.pickoff_rcirc, - np.sin(circ[0:90]) * self.pickoff_rcirc + self.pickoff_ysize/2 - self.pickoff_rcirc, - "b" + [(self.pickoff_xsize / 2), (self.pickoff_xsize / 2)], + [ + self.pickoff_ysize / 2 - self.pickoff_rcirc, + -(self.pickoff_ysize / 2 - self.pickoff_rcirc), + ], + "b", ) ax.plot( - np.cos(circ[90:180]) * self.pickoff_rcirc - self.pickoff_xsize/2 + self.pickoff_rcirc, - np.sin(circ[90:180]) * self.pickoff_rcirc + self.pickoff_ysize/2 - self.pickoff_rcirc, - "b" + np.cos(circ[0:90]) * self.pickoff_rcirc + + self.pickoff_xsize / 2 + - self.pickoff_rcirc, + np.sin(circ[0:90]) * self.pickoff_rcirc + + self.pickoff_ysize / 2 + - self.pickoff_rcirc, + "b", ) ax.plot( - np.cos(circ[180:270]) * self.pickoff_rcirc - self.pickoff_xsize/2 + self.pickoff_rcirc, - np.sin(circ[180:270]) * self.pickoff_rcirc - self.pickoff_ysize/2 + self.pickoff_rcirc, - "b" + np.cos(circ[90:180]) * self.pickoff_rcirc + - self.pickoff_xsize / 2 + + self.pickoff_rcirc, + np.sin(circ[90:180]) * self.pickoff_rcirc + + self.pickoff_ysize / 2 + - self.pickoff_rcirc, + "b", ) ax.plot( - np.cos(circ[270:360]) * self.pickoff_rcirc + self.pickoff_xsize/2 - self.pickoff_rcirc, - np.sin(circ[270:360]) * self.pickoff_rcirc - self.pickoff_ysize/2 + self.pickoff_rcirc, - "b" + np.cos(circ[180:270]) * self.pickoff_rcirc + - self.pickoff_xsize / 2 + + self.pickoff_rcirc, + np.sin(circ[180:270]) * self.pickoff_rcirc + - self.pickoff_ysize / 2 + + self.pickoff_rcirc, + "b", ) - ax.plot([0, 0], [self.pickoff_ysize/2, self.pickoff_diam/2], "b") - ax.plot([0, 0], [-self.pickoff_ysize/2, -self.pickoff_diam/2], "b") + ax.plot( + np.cos(circ[270:360]) * self.pickoff_rcirc + + self.pickoff_xsize / 2 + - self.pickoff_rcirc, + np.sin(circ[270:360]) * self.pickoff_rcirc + - self.pickoff_ysize / 2 + + self.pickoff_rcirc, + "b", + ) + ax.plot([0, 0], [self.pickoff_ysize / 2, self.pickoff_diam / 2], "b") + ax.plot([0, 0], [-self.pickoff_ysize / 2, -self.pickoff_diam / 2], "b") def plotgrid(self, x0, y0, ax, npts=15): """ @@ -1706,9 +2103,12 @@ def plotgrid(self, x0, y0, ax, npts=15): ngood = 0 for x in np.arange(-1, 1, 2.0 / npts): for y in np.arange(-1, 1, 2.0 / npts): - if (np.hypot(x, y) < 1 and np.hypot(x, y) >= self.telescope.obscuration): # Only plot points w/in the pupil - xm, ym = self.mirrorpoint(x0, y0, x, y) # Get intersection with pickoff - if self.onmirror(xm, ym, x0/abs(x0)): # Find out if point is on the mirror surface + # Only plot points w/in the pupil + if np.hypot(x, y) < 1 and np.hypot(x, y) >= self.telescope.obscuration: + # Get intersection with pickoff + xm, ym = self.mirrorpoint(x0, y0, x, y) + # Find out if point is on the mirror surface + if self.onmirror(xm, ym, x0 / abs(x0)): ax.scatter(xm, ym, 1, "g") ngood += 1 else: @@ -1719,11 +2119,11 @@ def plotgrid_hdr(self, hdr, ax, npts=15): """ Wrap self.plotgrid() and get x0, y0 values from hdr. """ - if 'GUIDERX' not in hdr or 'GUIDERY' not in hdr: + if "GUIDERX" not in hdr or "GUIDERY" not in hdr: msg = "No MMIRS WFS position available in header." raise WFSCommandException(value=msg) - x0 = hdr['GUIDERX'] - y0 = hdr['GUIDERY'] + x0 = hdr["GUIDERX"] + y0 = hdr["GUIDERY"] ngood = self.plotgrid(x0, y0, ax=ax, npts=npts) return ngood @@ -1731,46 +2131,46 @@ def pupil_mask(self, hdr, npts=15): """ Use MMIRS pickoff mirror geometry to calculate the pupil mask """ - if 'GUIDERX' not in hdr or 'GUIDERY' not in hdr: + if "GUIDERX" not in hdr or "GUIDERY" not in hdr: msg = "No MMIRS WFS position available in header." raise WFSCommandException(value=msg) - if 'CA' not in hdr: + if "CA" not in hdr: msg = "No camera rotation angle available in header." raise WFSCommandException(value=msg) - cam_rot = hdr['CA'] - x0 = hdr['GUIDERX'] - y0 = hdr['GUIDERY'] + cam_rot = hdr["CA"] + x0 = hdr["GUIDERX"] + y0 = hdr["GUIDERY"] good = [] - center = self.pup_size / 2. + center = self.pup_size / 2.0 obsc = self.telescope.obscuration.value spacing = 2.0 / npts for x in np.arange(-1, 1, spacing): for y in np.arange(-1, 1, spacing): r = np.hypot(x, y) - if (r < 1 and np.hypot(x, y) >= obsc): + if r < 1 and np.hypot(x, y) >= obsc: xm, ym = self.mirrorpoint(x0, y0, x, y) - if self.onmirror(xm, ym, x0/abs(x0)): - x_impos = center * (x + 1.) - y_impos = center * (y + 1.) - amp = 1. + if self.onmirror(xm, ym, x0 / abs(x0)): + x_impos = center * (x + 1.0) + y_impos = center * (y + 1.0) + amp = 1.0 # this is kind of a hacky way to dim spots near the edge, but easier than doing full calc # of the aperture intersection with pupil. it also doesn't need to be that accurate for the # purposes of the cross-correlation used to register the pupil. - if r > 1. - spacing: - amp = 1. - (r - (1. - spacing)) / spacing + if r > 1.0 - spacing: + amp = 1.0 - (r - (1.0 - spacing)) / spacing if r - obsc < spacing: amp = (r - obsc) / spacing good.append((amp, x_impos, y_impos)) yi, xi = np.mgrid[0:self.pup_size, 0:self.pup_size] im = np.zeros((self.pup_size, self.pup_size)) - sigma = 3. + sigma = 3.0 for g in good: im += Gaussian2D(g[0], g[1], g[2], sigma, sigma)(xi, yi) # camera 2's lenslet array is rotated -1.12 deg w.r.t. the camera. - if hdr['CAMERA'] == 1: + if hdr["CAMERA"] == 1: cam_rot -= 1.12 im_rot = rotate(im, cam_rot, reshape=False) @@ -1782,7 +2182,7 @@ def get_mode(self, hdr): """ For MMIRS we figure out the mode from which camera the image is taken with. """ - cam = hdr['CAMERA'] + cam = hdr["CAMERA"] mode = f"mmirs{cam}" return mode @@ -1802,12 +2202,16 @@ def process_image(self, fitsfile): trimdata = self.trim_overscan(rawdata, hdr=hdr) # MMIRS gets a lot of hot pixels/CRs so make a quick pass to nuke them - cr_mask, data = detect_cosmics(trimdata, sigclip=5., niter=5, cleantype='medmask', psffwhm=5.) + cr_mask, data = detect_cosmics( + trimdata, sigclip=5.0, niter=5, cleantype="medmask", psffwhm=5.0 + ) # calculate the background and subtract it - bkg_estimator = photutils.ModeEstimatorBackground() - mask = photutils.make_source_mask(data, nsigma=2, npixels=5, dilate_size=11) - bkg = photutils.Background2D(data, (20, 20), filter_size=(7, 7), bkg_estimator=bkg_estimator, mask=mask) + bkg_estimator = ModeEstimatorBackground() + mask = make_spot_mask(data, nsigma=2, npixels=5, dilate_size=11) + bkg = Background2D( + data, (20, 20), filter_size=(7, 7), bkg_estimator=bkg_estimator, mask=mask + ) data -= bkg.background return data, hdr @@ -1816,26 +2220,29 @@ def focal_plane_position(self, hdr): """ Transform from the MMIRS guider coordinate system to MMTO focal plane coordinates. """ - for k in ['ROT', 'GUIDERX', 'GUIDERY']: + for k in ["ROT", "GUIDERX", "GUIDERY"]: if k not in hdr: msg = f"Missing value, {k}, that is required to transform MMIRS guider coordinates." raise WFSConfigException(value=msg) - guide_x = hdr['GUIDERX'] - guide_y = hdr['GUIDERY'] - rot = hdr['ROT'] + guide_x = hdr["GUIDERX"] + guide_y = hdr["GUIDERY"] + rot = hdr["ROT"] guide_r = np.sqrt(guide_x**2 + guide_y**2) - rot = u.Quantity(rot, u.deg) # make sure rotation is cast to degrees + # make sure rotation is cast to degrees + rot = u.Quantity(rot, u.deg) # the MMTO focal plane coordinate convention has phi=0 aligned with +Y instead of +X if guide_y != 0.0: guide_phi = np.arctan2(guide_x, guide_y) * u.rad else: - guide_phi = 90. * u.deg + guide_phi = 90.0 * u.deg # transform radius in guider coords to degrees in focal plane - focal_r = (0.0016922 * guide_r - 4.60789e-9 * guide_r**3 - 8.111307e-14 * guide_r**5) * u.deg + focal_r = ( + 0.0016922 * guide_r - 4.60789e-9 * guide_r**3 - 8.111307e-14 * guide_r**5 + ) * u.deg focal_phi = guide_phi + rot + self.rotation return focal_r, focal_phi @@ -1845,6 +2252,7 @@ class FLWO12(WFS): """ Defines configuration and methods for the WFS on the FLWO 1.2-meter """ + def trim_overscan(self, data, hdr=None): # remove last column that is always set to 0 return data[:, :510] @@ -1854,4 +2262,5 @@ class FLWO15(FLWO12): """ Defines configuration and methods for the WFS on the FLWO 1.5-meter """ + pass diff --git a/mmtwfs/zernike.py b/mmtwfs/zernike.py index 54cc1a4e..314d1c3d 100644 --- a/mmtwfs/zernike.py +++ b/mmtwfs/zernike.py @@ -26,12 +26,28 @@ from collections.abc import MutableMapping from math import factorial as fac -from .custom_exceptions import ZernikeException - - -__all__ = ['ZernikeVector', 'cart2pol', 'pol2cart', 'R_mn', 'dR_drho', 'theta_m', 'dtheta_dphi', 'zernike', 'dZ_dx', 'dZ_dy', - 'noll_to_zernike', 'zernike_noll', 'zernike_slope_noll', 'zernike_slopes', 'noll_normalization_vector', - 'norm_coefficient', 'noll_coefficient'] +from mmtwfs.custom_exceptions import ZernikeException + + +__all__ = [ + "ZernikeVector", + "cart2pol", + "pol2cart", + "R_mn", + "dR_drho", + "theta_m", + "dtheta_dphi", + "zernike", + "dZ_dx", + "dZ_dy", + "noll_to_zernike", + "zernike_noll", + "zernike_slope_noll", + "zernike_slopes", + "noll_normalization_vector", + "norm_coefficient", + "noll_coefficient", +] def cart2pol(arr): @@ -101,19 +117,24 @@ def R_mn(m, n, rho, cache=None): See https://en.wikipedia.org/wiki/Zernike_polynomials for details. """ if cache is not None: - if ('R_mn', n, m) in cache: - return cache[('R_mn', n, m)] + if ("R_mn", n, m) in cache: + return cache[("R_mn", n, m)] - if np.mod(n-m, 2) == 1: + if np.mod(n - m, 2) == 1: return 0.0 m = np.abs(m) wf = 0.0 - for k in range(int((n - m)/2) + 1): - wf += rho**(n - 2*k) * (-1)**k * fac(n-k) / (fac(k) * fac(int((n + m)/2) - k) * fac(int((n - m)/2) - k)) + for k in range(int((n - m) / 2) + 1): + wf += ( + rho ** (n - 2 * k) + * (-1) ** k + * fac(n - k) + / (fac(k) * fac(int((n + m) / 2) - k) * fac(int((n - m) / 2) - k)) + ) if cache is not None: - cache[('R_mn', n, m)] = wf + cache[("R_mn", n, m)] = wf return wf @@ -141,14 +162,15 @@ def dR_drho(m, n, rho, cache=None): See http://adsabs.harvard.edu/abs/2014OptLE..52....7N for details. """ if cache is not None: - if ('dR_drho', n, m) in cache: - return cache[('dR_drho', n, m)] + if ("dR_drho", n, m) in cache: + return cache[("dR_drho", n, m)] - dR_mn = R_mn(m, n, rho, cache=cache) * (rho**2 * (n + 2.) + m) / (rho * (1. - rho**2)) - \ - R_mn(m+1, n+1, rho, cache=cache) * (n + m + 2.) / (1. - rho**2) + dR_mn = R_mn(m, n, rho, cache=cache) * (rho**2 * (n + 2.0) + m) / ( + rho * (1.0 - rho**2) + ) - R_mn(m + 1, n + 1, rho, cache=cache) * (n + m + 2.0) / (1.0 - rho**2) if cache is not None: - cache[('dR_drho', n, m)] = dR_mn + cache[("dR_drho", n, m)] = dR_mn return dR_mn @@ -264,20 +286,22 @@ def dZ_dx(m, n, rho, phi, norm=False, cache=None): See http://adsabs.harvard.edu/abs/2014OptLE..52....7N for details. """ if cache is not None: - if ('dZ_dx', n, m) in cache: - return cache[('dZ_dx', n, m)] + if ("dZ_dx", n, m) in cache: + return cache[("dZ_dx", n, m)] nc = 1.0 if norm: nc = norm_coefficient(m, n) - dwf = dR_drho(m, n, rho, cache=cache) * theta_m(m, phi) * np.cos(phi) - \ - R_mn(m, n, rho, cache=cache) * dtheta_dphi(m, phi) * np.sin(phi) / rho + dwf = ( + dR_drho(m, n, rho, cache=cache) * theta_m(m, phi) * np.cos(phi) + - R_mn(m, n, rho, cache=cache) * dtheta_dphi(m, phi) * np.sin(phi) / rho + ) dwf *= nc if cache is not None: - cache[('dZ_dx', n, m)] = dwf + cache[("dZ_dx", n, m)] = dwf return dwf @@ -309,20 +333,22 @@ def dZ_dy(m, n, rho, phi, norm=False, cache=None): See http://adsabs.harvard.edu/abs/2014OptLE..52....7N for details. """ if cache is not None: - if ('dZ_dy', n, m) in cache: - return cache[('dZ_dy', n, m)] + if ("dZ_dy", n, m) in cache: + return cache[("dZ_dy", n, m)] nc = 1.0 if norm: nc = norm_coefficient(m, n) - dwf = dR_drho(m, n, rho, cache=cache) * theta_m(m, phi) * np.sin(phi) + \ - R_mn(m, n, rho, cache=cache) * dtheta_dphi(m, phi) * np.cos(phi) / rho + dwf = ( + dR_drho(m, n, rho, cache=cache) * theta_m(m, phi) * np.sin(phi) + + R_mn(m, n, rho, cache=cache) * dtheta_dphi(m, phi) * np.cos(phi) / rho + ) dwf *= nc if cache is not None: - cache[('dZ_dy', n, m)] = dwf + cache[("dZ_dy", n, m)] = dwf return dwf @@ -355,7 +381,7 @@ def noll_to_zernike(j): n += 1 j1 -= n - m = (-1)**j * ((n % 2) + 2 * int((j1 + ((n + 1) % 2)) / 2.0)) + m = (-1) ** j * ((n % 2) + 2 * int((j1 + ((n + 1) % 2)) / 2.0)) return (n, m) @@ -432,8 +458,8 @@ def zernike_slopes(zv, rho, phi, norm=False): xslope, yslope: `~numpy.ndarray`, `~numpy.ndarray` Total X and Y slopes of zv at each (rho, phi) point. Same shapes as **rho** and **phi**. """ - xslope = 0. - yslope = 0. + xslope = 0.0 + yslope = 0.0 cache = {} for k, v in zv.items(): mode = int(k.replace("Z", "")) @@ -458,7 +484,7 @@ def noll_normalization_vector(nmodes=30): ------- norms : 1D `~numpy.ndarray` of length nmodes """ - nolls = (noll_to_zernike(j+1) for j in range(nmodes)) + nolls = (noll_to_zernike(j + 1) for j in range(nmodes)) norms = np.asanyarray([norm_coefficient(m, n) for n, m in nolls]) return norms @@ -479,7 +505,7 @@ def norm_coefficient(m, n): norm_coeff : float Noll normalization coefficient """ - norm_coeff = np.sqrt(2 * (n + 1)/(1 + (m == 0))) + norm_coeff = np.sqrt(2 * (n + 1) / (1 + (m == 0))) return norm_coeff @@ -522,20 +548,21 @@ class ZernikeVector(MutableMapping): ignored : dict Used to store coefficients that are temporarily ignored. Managed via ``self.ignore()`` and ``self.restore()``. """ + __zernikelabels = { "Z01": "Piston (0, 0)", "Z02": "X Tilt (1, 1)", "Z03": "Y Tilt (1, -1)", "Z04": "Defocus (2, 0)", - "Z05": u"Primary Astig at 45° (2, -2)", - "Z06": u"Primary Astig at 0° (2, 2)", + "Z05": "Primary Astig at 45° (2, -2)", + "Z06": "Primary Astig at 0° (2, 2)", "Z07": "Primary Y Coma (3, -1)", "Z08": "Primary X Coma (3, 1)", "Z09": "Y Trefoil (3, -3)", "Z10": "X Trefoil (3, 3)", "Z11": "Primary Spherical (4, 0)", - "Z12": u"Secondary Astigmatism at 0° (4, 2)", - "Z13": u"Secondary Astigmatism at 45° (4, -2)", + "Z12": "Secondary Astigmatism at 0° (4, 2)", + "Z13": "Secondary Astigmatism at 45° (4, -2)", "Z14": "X Tetrafoil (4, 4)", "Z15": "Y Tetrafoil (4, -4)", "Z16": "Secondary X Coma (5, 1)", @@ -545,8 +572,8 @@ class ZernikeVector(MutableMapping): "Z20": "X Pentafoil (5, 5)", "Z21": "Y Pentafoil (5, -5)", "Z22": "Secondary Spherical (6, 0)", - "Z23": u"Tertiary Astigmatism at 45° (6, -2)", - "Z24": u"Tertiary Astigmatism at 0° (6, 2)", + "Z23": "Tertiary Astigmatism at 45° (6, -2)", + "Z24": "Tertiary Astigmatism at 0° (6, 2)", "Z25": "Secondary X Trefoil (6, -4)", "Z26": "Secondary Y Trefoil (6, 4)", "Z27": "Y Hexafoil (6, -6)", @@ -559,7 +586,7 @@ class ZernikeVector(MutableMapping): "Z34": "Secondary X Pentafoil (7, 5)", "Z35": "Y Heptafoil (7, -7)", "Z36": "X Heptafoil (7, 7)", - "Z37": "Tertiary Spherical (8, 0)" + "Z37": "Tertiary Spherical (8, 0)", } __shortlabels = { @@ -567,15 +594,15 @@ class ZernikeVector(MutableMapping): "Z02": "X Tilt", "Z03": "Y Tilt", "Z04": "Defocus", - "Z05": u"Astig 45°", - "Z06": u"Astig 0° ", + "Z05": "Astig 45°", + "Z06": "Astig 0° ", "Z07": "Y Coma", "Z08": "X Coma", "Z09": "Y Tref", "Z10": "X Tref", "Z11": "Spher", - "Z12": u"Astig2 0°", - "Z13": u"Astig2 45°", + "Z12": "Astig2 0°", + "Z13": "Astig2 45°", "Z14": "X Tetra", "Z15": "Y Tetra", "Z16": "X Coma2", @@ -585,8 +612,8 @@ class ZernikeVector(MutableMapping): "Z20": "X Penta", "Z21": "Y Penta", "Z22": "Spher2", - "Z23": u"Astig3 45°", - "Z24": u"Astig3 0°", + "Z23": "Astig3 45°", + "Z24": "Astig3 0°", "Z25": "X Tref2", "Z26": "Y Tref2", "Z27": "Y Hexa", @@ -599,10 +626,19 @@ class ZernikeVector(MutableMapping): "Z34": "X Penta2", "Z35": "Y Hept", "Z36": "X Hept", - "Z37": "Spher3" + "Z37": "Spher3", } - def __init__(self, coeffs=[], modestart=2, normalized=False, zmap=None, units=u.nm, errorbars=None, **kwargs): + def __init__( + self, + coeffs=[], + modestart=2, + normalized=False, + zmap=None, + units=u.nm, + errorbars=None, + **kwargs, + ): """ Parameters ---------- @@ -637,7 +673,9 @@ def __init__(self, coeffs=[], modestart=2, normalized=False, zmap=None, units=u. elif isinstance(errorbars, dict): self.errorbars = errorbars else: - raise ValueError("Errorbars for ZernikeVectors must be in the form of a dict.") + raise ValueError( + "Errorbars for ZernikeVectors must be in the form of a dict." + ) # coeffs can be either a list-like or a string which is a JSON filename if isinstance(coeffs, str): @@ -732,7 +770,9 @@ def __add__(self, zv): for k in keys: d[k] = self.__getitem__(k) + zv[k] if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.sqrt(self.errorbars[k]**2 + zv.errorbars[k]**2) + errorbars[k] = np.sqrt( + self.errorbars[k] ** 2 + zv.errorbars[k] ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: errorbars[k] = self.errorbars[k] elif k not in self.errorbars and k in zv.errorbars: @@ -745,7 +785,9 @@ def __add__(self, zv): if k in self.errorbars: errorbars[k] = self.errorbars[k] except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector + operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector + operation: zv = {zv} ({e})" + ) return ZernikeVector(units=self.units, errorbars=errorbars, **d) def __radd__(self, zv): @@ -765,7 +807,9 @@ def __sub__(self, zv): for k in keys: d[k] = self.__getitem__(k) - zv[k] if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.sqrt(self.errorbars[k]**2 + zv.errorbars[k]**2) + errorbars[k] = np.sqrt( + self.errorbars[k] ** 2 + zv.errorbars[k] ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: errorbars[k] = self.errorbars[k] elif k not in self.errorbars and k in zv.errorbars: @@ -778,7 +822,9 @@ def __sub__(self, zv): if k in self.errorbars: errorbars[k] = self.errorbars[k] except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector - operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector - operation: zv = {zv} ({e})" + ) return ZernikeVector(units=self.units, errorbars=errorbars, **d) def __rsub__(self, zv): @@ -792,7 +838,9 @@ def __rsub__(self, zv): for k in keys: d[k] = zv[k] - self.__getitem__(k) if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.sqrt(self.errorbars[k]**2 + zv.errorbars[k]**2) + errorbars[k] = np.sqrt( + self.errorbars[k] ** 2 + zv.errorbars[k] ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: errorbars[k] = self.errorbars[k] elif k not in self.errorbars and k in zv.errorbars: @@ -805,7 +853,9 @@ def __rsub__(self, zv): if k in self.errorbars: errorbars[k] = self.errorbars[k] except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector - operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector - operation: zv = {zv} ({e})" + ) return ZernikeVector(errorbars=errorbars, **d) def __mul__(self, zv): @@ -821,21 +871,29 @@ def __mul__(self, zv): for k in keys: d[k] = self.__getitem__(k) * zv[k].to(self.units) if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.sqrt((self.errorbars[k]/self.__getitem__(k))**2 + - (zv.errorbars[k]/zv[k])**2) + errorbars[k] = np.abs(d[k]) * np.sqrt( + (self.errorbars[k] / self.__getitem__(k)) ** 2 + + (zv.errorbars[k] / zv[k]) ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(self.errorbars[k]/self.__getitem__(k)) + errorbars[k] = np.abs(d[k]) * np.abs( + self.errorbars[k] / self.__getitem__(k) + ) elif k not in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k]/zv[k]) + errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k] / zv[k]) else: try: for k in self.coeffs: d[k] = self.__getitem__(k) * zv if k in self.errorbars: - errorbars[k] = np.abs(d[k]/self.__getitem__(k)) * self.errorbars[k] + errorbars[k] = ( + np.abs(d[k] / self.__getitem__(k)) * self.errorbars[k] + ) outunits = d[k].unit except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector * operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector * operation: zv = {zv} ({e})" + ) return ZernikeVector(units=outunits, errorbars=errorbars, **d) def __rmul__(self, zv): @@ -864,21 +922,29 @@ def __truediv__(self, zv): for k in keys: d[k] = self.__getitem__(k) / zv[k].to(self.units) if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.sqrt((self.errorbars[k]/self.__getitem__(k))**2 + - (zv.errorbars[k]/zv[k])**2) + errorbars[k] = np.abs(d[k]) * np.sqrt( + (self.errorbars[k] / self.__getitem__(k)) ** 2 + + (zv.errorbars[k] / zv[k]) ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(self.errorbars[k]/self.__getitem__(k)) + errorbars[k] = np.abs(d[k]) * np.abs( + self.errorbars[k] / self.__getitem__(k) + ) elif k not in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k]/zv[k]) + errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k] / zv[k]) else: try: for k in self.coeffs: d[k] = self.__getitem__(k) / float(zv) if k in self.errorbars: - errorbars[k] = np.abs(d[k]/self.__getitem__(k)) * self.errorbars[k] + errorbars[k] = ( + np.abs(d[k] / self.__getitem__(k)) * self.errorbars[k] + ) outunits = self.units except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector / operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector / operation: zv = {zv} ({e})" + ) return ZernikeVector(units=outunits, errorbars=errorbars, **d) def __rdiv__(self, zv): @@ -900,21 +966,29 @@ def __rtruediv__(self, zv): for k in keys: d[k] = zv[k].to(self.units) / self.__getitem__(k) if k in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.sqrt((self.errorbars[k]/self.__getitem__(k))**2 + - (zv.errorbars[k]/zv[k])**2) + errorbars[k] = np.abs(d[k]) * np.sqrt( + (self.errorbars[k] / self.__getitem__(k)) ** 2 + + (zv.errorbars[k] / zv[k]) ** 2 + ) elif k in self.errorbars and k not in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(self.errorbars[k]/self.__getitem__(k)) + errorbars[k] = np.abs(d[k]) * np.abs( + self.errorbars[k] / self.__getitem__(k) + ) elif k not in self.errorbars and k in zv.errorbars: - errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k]/zv[k]) + errorbars[k] = np.abs(d[k]) * np.abs(zv.errorbars[k] / zv[k]) else: try: for k in self.coeffs: d[k] = float(zv) / self.__getitem__(k) if k in self.errorbars: - errorbars[k] = np.abs(d[k]/self.__getitem__(k)) * self.errorbars[k] - outunits = (1. / self.units).unit + errorbars[k] = ( + np.abs(d[k] / self.__getitem__(k)) * self.errorbars[k] + ) + outunits = (1.0 / self.units).unit except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(zv)}, for ZernikeVector / operation: zv = {zv} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(zv)}, for ZernikeVector / operation: zv = {zv} ({e})" + ) return ZernikeVector(units=outunits, errorbars=errorbars, **d) def __pow__(self, n): @@ -928,9 +1002,13 @@ def __pow__(self, n): for k in self.coeffs: d[k] = self.__getitem__(k) ** n if k in self.errorbars: - errorbars[k] = np.abs(d[k] * n / self.__getitem__(k)) * self.errorbars[k] + errorbars[k] = ( + np.abs(d[k] * n / self.__getitem__(k)) * self.errorbars[k] + ) except Exception as e: - raise ZernikeException(f"Invalid data-type, {type(n)}, for ZernikeVector ** operation: n = {n} ({e})") + raise ZernikeException( + f"Invalid data-type, {type(n)}, for ZernikeVector ** operation: n = {n} ({e})" + ) return ZernikeVector(units=outunits, errorbars=errorbars, **d) def _valid_key(self, key): @@ -1052,21 +1130,28 @@ def pretty_print(self, last=22): if k in self.errorbars: s += "{0:>4s}: {1:>24s} \t {2:s}".format( k, - "{0:8.4g} ± {1:5.3g}".format(self.coeffs[k].value, self.errorbars[k]), - label + "{0:8.4g} ± {1:5.3g}".format( + self.coeffs[k].value, self.errorbars[k] + ), + label, ) else: - s += "{0:>4s}: {1:>24s} \t {2:s}".format(k, "{0:0.4g}".format(self.coeffs[k]), label) + s += "{0:>4s}: {1:>24s} \t {2:s}".format( + k, "{0:0.4g}".format(self.coeffs[k]), label + ) s += "\n" s += "\n" if self._key_to_l(keys[-1]) > last: - hi_orders = ZernikeVector(modestart=last+1, normalized=self.normalized, units=self.units, **self.coeffs) + hi_orders = ZernikeVector( + modestart=last + 1, + normalized=self.normalized, + units=self.units, + **self.coeffs, + ) s += "High Orders RMS: \t {0:0.3g} {1:>3s} ➞ {2:>3s}\n".format( - hi_orders.rms, - self._l_to_key(last+1), - keys[-1] + hi_orders.rms, self._l_to_key(last + 1), keys[-1] ) s += "Total RMS: \t {0:0.4g}\n".format(self.rms) @@ -1076,8 +1161,13 @@ def copy(self): """ Make a new ZernikeVector with the same configuration and coefficients """ - new = ZernikeVector(modestart=self.modestart, normalized=self.normalized, errorbars=copy.deepcopy(self.errorbars), - units=self.units, **self.coeffs) + new = ZernikeVector( + modestart=self.modestart, + normalized=self.normalized, + errorbars=copy.deepcopy(self.errorbars), + units=self.units, + **self.coeffs, + ) return new def save(self, filename="zernike.json"): @@ -1085,47 +1175,47 @@ def save(self, filename="zernike.json"): Save Zernike vector to JSON format to retain units and normalization info. """ outdict = {} - outdict['units'] = self.units.to_string() - outdict['normalized'] = self.normalized - outdict['modestart'] = self.modestart - outdict['errorbars'] = {} - outdict['coeffs'] = {} + outdict["units"] = self.units.to_string() + outdict["normalized"] = self.normalized + outdict["modestart"] = self.modestart + outdict["errorbars"] = {} + outdict["coeffs"] = {} for k, c in self.coeffs.items(): - outdict['coeffs'][k] = c.value + outdict["coeffs"][k] = c.value for k, v in self.errorbars.items(): - outdict['errorbars'][k] = v.value + outdict["errorbars"][k] = v.value - with open(filename, 'w') as f: - json.dump(outdict, f, indent=4, separators=(',', ': '), sort_keys=True) + with open(filename, "w") as f: + json.dump(outdict, f, indent=4, separators=(",", ": "), sort_keys=True) def load(self, filename="zernike.json"): """ Load ZernikeVector data from JSON format. """ try: - with open(filename, 'r') as f: + with open(filename, "r") as f: json_data = json.load(f) except IOError as e: msg = f"Missing JSON file, {filename}: {e}" raise ZernikeException(value=msg) - if 'units' in json_data: - self.units = u.Unit(json_data['units']) + if "units" in json_data: + self.units = u.Unit(json_data["units"]) - if 'normalized' in json_data: - self.normalized = json_data['normalized'] + if "normalized" in json_data: + self.normalized = json_data["normalized"] - if 'modestart' in json_data: - self.modestart = json_data['modestart'] + if "modestart" in json_data: + self.modestart = json_data["modestart"] self.coeffs = {} - if 'coeffs' in json_data: - for k, v in json_data['coeffs'].items(): + if "coeffs" in json_data: + for k, v in json_data["coeffs"].items(): self.__setitem__(k, v) self.errorbars = {} - if 'errorbars' in json_data: - for k, v in json_data['coeffs'].items(): + if "errorbars" in json_data: + for k, v in json_data["coeffs"].items(): self.errorbars[k] = u.Quantity(v, self.units) def load_lmfit(self, fit_report): @@ -1157,7 +1247,9 @@ def shortlabel(self, key): else: return key - def from_array(self, coeffs, zmap=None, modestart=None, errorbars=None, normalized=False): + def from_array( + self, coeffs, zmap=None, modestart=None, errorbars=None, normalized=False + ): """ Load coefficients from a provided list/array starting from modestart. Array is assumed to start from self.modestart if modestart is not provided. @@ -1189,7 +1281,9 @@ def frac_error(self, key=None): """ err = 0.0 if key is not None and key in self.coeffs and self.coeffs[key].value != 0.0: - err = np.abs(self.errorbars.get(key, 0.0 * self.units).value / self.coeffs[key].value) + err = np.abs( + self.errorbars.get(key, 0.0 * self.units).value / self.coeffs[key].value + ) return err def normalize(self): @@ -1240,7 +1334,7 @@ def rotate(self, angle=0.0 * u.deg): """ # this is a hack to extend the vector to the largest supported term to make sure we include everything affected # by the rotation - self.coeffs['Z99'] = 0.0 + self.coeffs["Z99"] = 0.0 a = self.array ang = u.Quantity(angle, u.rad) # convert angle to radians @@ -1263,7 +1357,7 @@ def rotate(self, angle=0.0 * u.deg): rot_arr = np.dot(rotm, a) # this will take back out the zero terms - del self.coeffs['Z99'] + del self.coeffs["Z99"] # i think it's correct to just pass on the uncertainties unchanged since measurements are done in unrotated space. # might want to consider handling rotations in the pupil coordinates before doing a fit. @@ -1289,14 +1383,16 @@ def phase_map(self, n=400): Calculate a 2D polar map of total phase displacements with sampling of n points along rho and phi vectors. """ rho = np.linspace(0.0, 1.0, n) - phi = np.linspace(0, 2*np.pi, n) + phi = np.linspace(0, 2 * np.pi, n) [p, r] = np.meshgrid(phi, rho) x = r * np.cos(p) y = r * np.sin(p) ph = self.total_phase(r, p) return x, y, r, p, ph - def fringe_bar_chart(self, total=True, max_c=2000*u.nm, title=None, last_mode=None): + def fringe_bar_chart( + self, total=True, max_c=2000 * u.nm, title=None, last_mode=None + ): """ Plot a bar chart of the fringe amplitudes of the coefficients """ @@ -1315,15 +1411,27 @@ def fringe_bar_chart(self, total=True, max_c=2000*u.nm, title=None, last_mode=No labels = [self.shortlabel(m) for m in modes] if self.normalized: - coeffs = [self.__getitem__(m).value * noll_coefficient(self._key_to_l(m)) for m in modes] - errorbars = [self.errorbars.get(m, 0.0 * self.units).value * noll_coefficient(self._key_to_l(m)) for m in modes] + coeffs = [ + self.__getitem__(m).value * noll_coefficient(self._key_to_l(m)) + for m in modes + ] + errorbars = [ + self.errorbars.get(m, 0.0 * self.units).value + * noll_coefficient(self._key_to_l(m)) + for m in modes + ] else: coeffs = [self.__getitem__(m).value for m in modes] errorbars = [self.errorbars.get(m, 0.0 * self.units).value for m in modes] # lump higher order terms into one RMS bin. if last_coeff > last_label: - hi_orders = ZernikeVector(modestart=last_label+1, normalized=self.normalized, units=self.units, **self.coeffs) + hi_orders = ZernikeVector( + modestart=last_label + 1, + normalized=self.normalized, + units=self.units, + **self.coeffs, + ) labels.append("Hi Ord RMS") coeffs.append(hi_orders.rms.value) errorbars.append(0.0) @@ -1341,22 +1449,24 @@ def fringe_bar_chart(self, total=True, max_c=2000*u.nm, title=None, last_mode=No fig, ax = plt.subplots(figsize=(11, 5)) fig.set_label("Fringe Wavefront Amplitude per Zernike Mode") ax.bar(ind, coeffs, color=cmap.to_rgba(coeffs), yerr=errorbars) - ax.spines['top'].set_visible(False) - ax.spines['right'].set_visible(False) - ax.yaxis.grid(color='gray', linestyle='dotted') - ax.xaxis.grid(color='gray', linestyle='dotted', lw=1) + ax.spines["top"].set_visible(False) + ax.spines["right"].set_visible(False) + ax.yaxis.grid(color="gray", linestyle="dotted") + ax.xaxis.grid(color="gray", linestyle="dotted", lw=1) ax.set_axisbelow(True) ax.set_xticks(ind) - ax.set_xticklabels(labels, rotation=45, ha='right', size='x-small') + ax.set_xticklabels(labels, rotation=45, ha="right", size="x-small") ax.set_ylim(-max_c, max_c) ax.set_ylabel(f"Wavefront Amplitude ({self.units})") if title is not None: ax.set_title(title) - cb = fig.colorbar(cmap) + cb = fig.colorbar(cmap, ax=ax) cb.set_label(f"{self.units}") return fig - def bar_chart(self, residual=None, total=True, max_c=500*u.nm, title=None, last_mode=None): + def bar_chart( + self, residual=None, total=True, max_c=500 * u.nm, title=None, last_mode=None + ): """ Plot a bar chart of the coefficients and, optionally, a residual amount not included in the coefficients. """ @@ -1377,11 +1487,19 @@ def bar_chart(self, residual=None, total=True, max_c=500*u.nm, title=None, last_ if self.normalized: coeffs = [np.abs(self.__getitem__(m).value) for m in modes] else: - coeffs = [np.abs(self.__getitem__(m).value) / noll_coefficient(self._key_to_l(m)) for m in modes] + coeffs = [ + np.abs(self.__getitem__(m).value) / noll_coefficient(self._key_to_l(m)) + for m in modes + ] # lump higher order terms into one RMS bin. if last_coeff > last_label: - hi_orders = ZernikeVector(modestart=last_label+1, normalized=self.normalized, units=self.units, **self.coeffs) + hi_orders = ZernikeVector( + modestart=last_label + 1, + normalized=self.normalized, + units=self.units, + **self.coeffs, + ) labels.append("High Orders") coeffs.append(hi_orders.rms.value) @@ -1403,17 +1521,17 @@ def bar_chart(self, residual=None, total=True, max_c=500*u.nm, title=None, last_ fig, ax = plt.subplots(figsize=(11, 5)) fig.set_label("RMS Wavefront Error per Zernike Mode") ax.bar(ind, coeffs, color=cmap.to_rgba(coeffs)) - ax.spines['top'].set_visible(False) - ax.spines['right'].set_visible(False) - ax.yaxis.grid(color='gray', linestyle='dotted') + ax.spines["top"].set_visible(False) + ax.spines["right"].set_visible(False) + ax.yaxis.grid(color="gray", linestyle="dotted") ax.set_axisbelow(True) ax.set_xticks(ind) - ax.set_xticklabels(labels, rotation=45, ha='right', size='x-small') + ax.set_xticklabels(labels, rotation=45, ha="right", size="x-small") ax.set_ylim(0, max_c) ax.set_ylabel(f"RMS Wavefront Error ({self.units})") if title is not None: ax.set_title(title) - cb = fig.colorbar(cmap) + cb = fig.colorbar(cmap, ax=ax) cb.set_label(f"{self.units}") return fig @@ -1440,13 +1558,15 @@ def plot_surface(self): x, y, r, p, ph = self.phase_map(n=100) fig = plt.figure(figsize=(8, 6)) fig.set_label("3D Wavefront Map") - ax = fig.add_subplot(111, projection='3d') - ax.plot_surface(x, y, ph, rstride=1, cstride=1, linewidth=0, alpha=0.6, cmap='plasma') + ax = fig.add_subplot(111, projection="3d") + surf = ax.plot_surface( + x, y, ph, rstride=1, cstride=1, linewidth=0, alpha=0.6, cmap="plasma" + ) v = max(abs(ph.max().value), abs(ph.min().value)) - ax.set_zlim(-v*5, v*5) - cset = ax.contourf(x, y, ph, zdir='z', offset=-v*5, cmap='plasma') + ax.set_zlim(-v * 5, v * 5) + # cset = ax.contourf(x, y, ph, zdir='z', offset=-v*5, cmap='plasma') ax.xaxis.set_ticks([-1, 0, 1]) ax.yaxis.set_ticks([-1, 0, 1]) - cbar = fig.colorbar(cset, shrink=1, aspect=30) + cbar = fig.colorbar(surf, shrink=1, aspect=30, ax=ax) cbar.set_label(self.units.name, rotation=0) return fig diff --git a/notebooks/WFS testing.ipynb b/notebooks/WFS testing.ipynb index 33f5f0f5..ce2898af 100644 --- a/notebooks/WFS testing.ipynb +++ b/notebooks/WFS testing.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -27,18 +27,18 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", - "%matplotlib widget" + "#%matplotlib widget" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -56,55 +56,18 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "15247d37e82c4be98ba798eba03cdc44", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "bino = WFSFactory(wfs=\"binospec\")" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fac05a891dee4594981f7bbd97fa4dc3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Header information not available for Binospec pupil mask. Assuming default position.\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "ax.imshow(bino.pupil_mask(hdr=None))\n", @@ -113,56 +76,14 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "712ec573aa9f490bb1ddf739c5367977", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6b487b2989a14b2dbff3f9bc0f9d6a8c", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7d1d7a445485479190d6ac8b95cc1ecb", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "#%%prun\n", - "bino_file = \"/Volumes/LaCie 8TB/wfsdat/20180208/wfs_ff_cal_img_2018.0208.074052.fits\"\n", - "bino_file = \"/home/tim/MMT/mmtwfs/mmtwfs/data/test_data/wfs_ff_cal_img_2017.1113.111402.fits\"\n", + "%%prun\n", + "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20180208/wfs_ff_cal_img_2018.0208.074052.fits\"\n", + "bino_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/test_data/wfs_ff_cal_img_2017.1113.111402.fits\"\n", + "bino_file = \"~/MMT/wfsdat/20250203/wfs_ff_cal_img_2025.02.03T123505.342.fits\"\n", "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20180209/wfs_ff_cal_img_2018.0209.114054.fits\"\n", "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20180210/wfs_ff_cal_img_2018.0210.095719.fits\"\n", "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20180210/wfs_ff_cal_img_2018.0210.102615.fits\"\n", @@ -172,14 +93,15 @@ "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20200316/wfs_ff_cal_img_2020.0316.121544.fits\"\n", "#bino_file = \"/Volumes/LaCie 8TB/wfsdat/20200127/wfs_ff_cal_img_2020.0127.041552.fits\"\n", "#bino_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/ref_images/bino_mask.fits\"\n", - "bino_file = \"/mnt/f/wfsdat/20220125/wfs_ff_cal_img_2022.0125.054438.fits\"\n", + "#bino_file = \"/mnt/f/wfsdat/20220125/wfs_ff_cal_img_2022.0125.054438.fits\"\n", "results = bino.measure_slopes(bino_file, mode=\"binospec\", plot=True)\n", - "results['figures']['slopes'].show()" + "results['figures']['slopes'].show()\n", + "print(results['vlt_seeing'])" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -188,38 +110,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "0947440800de45868cf4881545d8f2f3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "{'xcen': 268.08644143440875,\n", - " 'ycen': 259.22179795211866,\n", - " 'scale': 0.958507076670938,\n", - " 'xcoma': 3.723314666258065e-06,\n", - " 'ycoma': -1.8648469324104172e-05}" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "refaps = bino.modes['binospec']['reference'].masked_apertures\n", "fig, ax = plt.subplots()\n", @@ -240,34 +133,9 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1e23bd9fea5c4dc4a426108cefe7fbfe", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "149.17766808867196" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "fig, ax = plt.subplots()\n", "ax.scatter(refaps['xcentroid'], refaps['ycentroid'])\n", @@ -278,23 +146,9 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$0.59495037 \\; \\mathrm{{}^{\\circ}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# get rotation of reference LED image\n", "x1, y1 = 4.5, 491.5\n", @@ -304,58 +158,11 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c6fd605e9a474520becbff293e0de12f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1198.0630805536023 nm\n", - "Fringe Coefficients\n", - " Z02: -393.4 ± 223 nm \t X Tilt (1, 1)\n", - " Z03: 80.81 ± 210 nm \t Y Tilt (1, -1)\n", - " Z04: 148.3 ± 67.2 nm \t Defocus (2, 0)\n", - " Z05: -61.08 ± 156 nm \t Primary Astig at 45° (2, -2)\n", - " Z06: -219.8 ± 128 nm \t Primary Astig at 0° (2, 2)\n", - " Z07: -60.04 ± 89.5 nm \t Primary Y Coma (3, -1)\n", - " Z08: -190.8 ± 93.8 nm \t Primary X Coma (3, 1)\n", - " Z09: -144.7 ± 116 nm \t Y Trefoil (3, -3)\n", - " Z10: 46.88 ± 129 nm \t X Trefoil (3, 3)\n", - " Z11: -248.3 ± 55 nm \t Primary Spherical (4, 0)\n", - " Z12: -31.35 ± 66.6 nm \t Secondary Astigmatism at 0° (4, 2)\n", - " Z13: -17.05 ± 71.5 nm \t Secondary Astigmatism at 45° (4, -2)\n", - " Z14: -29.22 ± 103 nm \t X Tetrafoil (4, 4)\n", - " Z15: -91.25 ± 94.4 nm \t Y Tetrafoil (4, -4)\n", - " Z16: 43.5 ± 70 nm \t Secondary X Coma (5, 1)\n", - " Z17: 237.1 ± 68 nm \t Secondary Y Coma (5, -1)\n", - " Z18: -57.27 ± 71.2 nm \t Secondary X Trefoil (5, 3)\n", - " Z19: 137.3 ± 64.9 nm \t Secondary Y Trefoil (5, -3)\n", - " Z20: -9.132 ± 95.5 nm \t X Pentafoil (5, 5)\n", - " Z21: 72.12 ± 94.3 nm \t Y Pentafoil (5, -5)\n", - " Z22: 420.1 ± 47.9 nm \t Secondary Spherical (6, 0)\n", - "\n", - "Total RMS: \t 263.8 nm\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ - "#%%prun\n", + "%%prun\n", "zresults = bino.fit_wavefront(results, plot=True)\n", "zvec = zresults['zernike']\n", "print(zresults['residual_rms'])\n", @@ -367,48 +174,18 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "16ddfd52c01947e9bb3f6ccc14173178", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "zvec.fringe_bar_chart().show()" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "6b05ea4fc8cb478ebb338041f2c5bcec", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "zvec.bar_chart(last_mode=22).show()" ] @@ -478,90 +255,18 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "mmirs = WFSFactory(wfs=\"mmirs\")" ] }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "73aff6124fd746299560ec370963aec5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "15562924b9b44385bba08a6b45f77fc1", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "41e1958afb1f46f6847c00d2f9f41560", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plt.close('all')\n", "#mmirs.cen_sigma = 6.0\n", @@ -575,21 +280,12 @@ "#mmirs_file = \"/Users/tim/MMT/wfsdat/20181120/mmirs_wfs_0125.fits\"\n", "#mmirs_file = \"/Volumes/LaCie 8TB/wfsdat/20191213/mmirs_wfs_0039.fits\"\n", "#mmirs_file = \"/Volumes/LaCie 8TB/wfsdat/20200109/mmirs_wfs_0135.fits\"\n", - "#mmirs_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/test_data/mmirs_wfs_0150.fits\"\n", + "mmirs_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/test_data/mmirs_wfs_rename_0566.fits\"\n", + "mmirs_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/test_data/mmirs_blank.fits\"\n", "results = mmirs.measure_slopes(mmirs_file, plot=True)\n", "results['figures']['slopes'].show()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# 107, 184 363 189\n", - "180. * np.arctan2(5, 256) / np.pi" - ] - }, { "cell_type": "code", "execution_count": null, @@ -630,45 +326,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "57d0f4b05c20430eba15bf96dcb95cee", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1141.4053991164974 nm\n", - "Fringe Coefficients\n", - " Z02: -208.6 ± 137 nm \t X Tilt (1, 1)\n", - " Z03: 53.72 ± 156 nm \t Y Tilt (1, -1)\n", - " Z04: 360.5 ± 47.8 nm \t Defocus (2, 0)\n", - " Z05: 312.9 ± 89 nm \t Primary Astig at 45° (2, -2)\n", - " Z06: 40.8 ± 102 nm \t Primary Astig at 0° (2, 2)\n", - " Z07: -188.6 ± 65.7 nm \t Primary Y Coma (3, -1)\n", - " Z08: -188.2 ± 54.9 nm \t Primary X Coma (3, 1)\n", - " Z09: -81.51 ± 83.2 nm \t Y Trefoil (3, -3)\n", - " Z10: 120.1 ± 84 nm \t X Trefoil (3, 3)\n", - " Z11: -91.18 ± 36.3 nm \t Primary Spherical (4, 0)\n", - "\n", - "Total RMS: \t 270.3 nm\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "mmirs.nzern = 10\n", "zresults = mmirs.fit_wavefront(results, plot=True)\n", @@ -681,24 +341,9 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fd716674c93c4255a33d4f474a000721", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "zresults['zernike'].fringe_bar_chart().show()" ] @@ -718,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -894,24 +539,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ed48694a08cf4fcc88d922c0b65aa689", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.close('all')\n", "f9wfs = WFSFactory(wfs=\"newf9\")\n", @@ -928,7 +558,7 @@ "baseline1_files = [\"f9wfs_20180131-191734.fits\", \"f9wfs_20180131-191925.fits\", \"f9wfs_20180131-192131.fits\"]\n", "baseline2_files = [\"f9wfs_20180131-192350.fits\", \"f9wfs_20180131-192541.fits\", \"f9wfs_20180131-192731.fits\"]\n", "baseline3_files = [\n", - " \"f9wfs_20180131-192927.fits\", \"f9wfs_20180131-193109.fits\", \n", + " \"f9wfs_20180131-192927.fits\", \"f9wfs_20180131-193109.fits\",\n", " \"f9wfs_20180131-193325.fits\", \"f9wfs_20180131-193509.fits\"\n", "]" ] @@ -944,52 +574,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "d54d7cdc395f4cdd8c181ec179b30a09", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "90edd5c0773b42bb8b7cf69b176169f8", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "9259b9c641fd4123aab1059378d4b723", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "plt.close('all')\n", "#f9_file = \"/Volumes/LaCie 8TB/wfsdat/20180201/\" + baseline3_files[0]\n", @@ -998,7 +585,8 @@ "#f9_file = \"/Volumes/LaCie 8TB/wfsdat/20190104/f9wfs_20190104-020657.fits\"\n", "#f9_file = \"/Volumes/LaCie 8TB/wfsdat/20200218/f9wfs_20200218-044238.fits\"\n", "#f9_file = \"/Volumes/LaCie 8TB/wfsdat/20200226/f9wfs_20200225-205600.fits\"\n", - "f9_file = \"/home/tim/tmp/f9wfs_20211130-180901.fits\"\n", + "#f9_file = \"/home/tim/tmp/f9wfs_20211130-180901.fits\"\n", + "f9_file = \"/Users/tim/MMT/mmtwfs/mmtwfs/data/test_data/f9wfs_20200225-205600.fits\"\n", "results = f9wfs.measure_slopes(f9_file, 'blue', plot=True)\n", "#plt.scatter(refaps['xcentroid']+results['xcen'], refaps['ycentroid']+results['ycen'])\n", "results['figures']['slopes'].show()\n", @@ -1008,56 +596,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "8e22fb71a5d94df6a83fc1e4b0d52f98", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1472.7682033210717 nm\n", - "Fringe Coefficients\n", - " Z02: 1367 ± 279 nm \t X Tilt (1, 1)\n", - " Z03: -1440 ± 214 nm \t Y Tilt (1, -1)\n", - " Z04: -9559 ± 115 nm \t Defocus (2, 0)\n", - " Z05: -49.34 ± 156 nm \t Primary Astig at 45° (2, -2)\n", - " Z06: -1118 ± 221 nm \t Primary Astig at 0° (2, 2)\n", - " Z07: -1133 ± 105 nm \t Primary Y Coma (3, -1)\n", - " Z08: 920.1 ± 215 nm \t Primary X Coma (3, 1)\n", - " Z09: -430.4 ± 163 nm \t Y Trefoil (3, -3)\n", - " Z10: 418.6 ± 233 nm \t X Trefoil (3, 3)\n", - " Z11: 227.4 ± 95.6 nm \t Primary Spherical (4, 0)\n", - " Z12: 520.1 ± 156 nm \t Secondary Astigmatism at 0° (4, 2)\n", - " Z13: -736.4 ± 94 nm \t Secondary Astigmatism at 45° (4, -2)\n", - " Z14: 234.6 ± 178 nm \t X Tetrafoil (4, 4)\n", - " Z15: -46.03 ± 160 nm \t Y Tetrafoil (4, -4)\n", - " Z16: -86.32 ± 148 nm \t Secondary X Coma (5, 1)\n", - " Z17: -146.1 ± 94.9 nm \t Secondary Y Coma (5, -1)\n", - " Z18: 343.1 ± 137 nm \t Secondary X Trefoil (5, 3)\n", - " Z19: -48.58 ± 97.4 nm \t Secondary Y Trefoil (5, -3)\n", - " Z20: 38.52 ± 165 nm \t X Pentafoil (5, 5)\n", - " Z21: 596 ± 152 nm \t Y Pentafoil (5, -5)\n", - " Z22: 106.5 ± 58 nm \t Secondary Spherical (6, 0)\n", - "\n", - "Total RMS: \t 5578 nm\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "zresults = f9wfs.fit_wavefront(results, plot=True)\n", "print(zresults['residual_rms'])\n", @@ -1067,24 +608,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "a708d7f8cd3f479da9a8d71056ea8be0", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "zresults['zernike'].fringe_bar_chart().show()" ] @@ -1199,7 +725,7 @@ "args = (refaps, spots)\n", "pars = (results['xcen'], results['ycen'], 1.0, 1.0, 0.0, 0.0)\n", "bounds = (\n", - " (results['xcen']-50, results['xcen']+50), \n", + " (results['xcen']-50, results['xcen']+50),\n", " (results['ycen']-50, results['ycen']+50),\n", " (0.8, 1.2),\n", " (0.8, 1.2),\n", @@ -1292,76 +818,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "f5wfs = WFSFactory(wfs=\"f5\")" ] }, { "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "477c407b148e411fae0d71a8b2f0d606", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7603f6a03074434e916fdfb141976771", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3b93f2faa9c7414986a549588f3918c5", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#%%prun\n", "plt.close('all')\n", @@ -1384,78 +852,18 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "((, ),\n", - " 236.00917575744455,\n", - " 284.99026226450553)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "f5wfs.calculate_recenter(results), results['xcen'], results['ycen']" ] }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "fcbeec26d1c94d6498aa6e196de893af", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fringe Coefficients\n", - " Z02: -57.29 ± 192 nm \t X Tilt (1, 1)\n", - " Z03: 136.7 ± 186 nm \t Y Tilt (1, -1)\n", - " Z04: 1117 ± 60.8 nm \t Defocus (2, 0)\n", - " Z05: 446.6 ± 131 nm \t Primary Astig at 45° (2, -2)\n", - " Z06: 184.6 ± 131 nm \t Primary Astig at 0° (2, 2)\n", - " Z07: 14.78 ± 75.3 nm \t Primary Y Coma (3, -1)\n", - " Z08: 135.8 ± 84.5 nm \t Primary X Coma (3, 1)\n", - " Z09: 47.62 ± 117 nm \t Y Trefoil (3, -3)\n", - " Z10: 128.1 ± 108 nm \t X Trefoil (3, 3)\n", - " Z11: -63.59 ± 49.1 nm \t Primary Spherical (4, 0)\n", - " Z12: -94.48 ± 64.1 nm \t Secondary Astigmatism at 0° (4, 2)\n", - " Z13: -130.8 ± 55.2 nm \t Secondary Astigmatism at 45° (4, -2)\n", - " Z14: 16.49 ± 93.6 nm \t X Tetrafoil (4, 4)\n", - " Z15: -2.547 ± 85.9 nm \t Y Tetrafoil (4, -4)\n", - " Z16: -132.9 ± 61.3 nm \t Secondary X Coma (5, 1)\n", - " Z17: -17.24 ± 59.3 nm \t Secondary Y Coma (5, -1)\n", - " Z18: -1.69 ± 55.4 nm \t Secondary X Trefoil (5, 3)\n", - " Z19: -3.584 ± 61.9 nm \t Secondary Y Trefoil (5, -3)\n", - " Z20: 86.13 ± 84.2 nm \t X Pentafoil (5, 5)\n", - " Z21: -19.39 ± 86.1 nm \t Y Pentafoil (5, -5)\n", - " Z22: 20.9 ± 39.8 nm \t Secondary Spherical (6, 0)\n", - "\n", - "Total RMS: \t 682 nm\n", - "\n", - "682.0185900346773 nm\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#%%prun\n", "zresults = f5wfs.fit_wavefront(results, plot=True)\n", @@ -1467,37 +875,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "12407f7d22434ab1b51c7ffe24218e7e", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/latex": [ - "$1363.4802 \\; \\mathrm{nm}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "zf = zv.fringe_bar_chart()\n", "zf.show()\n", @@ -2196,27 +1576,16 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "524800.0" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "0.8 * .328e9 * 0.002" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2230,20 +1599,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'thisisastring'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "blah" ] @@ -2258,7 +1616,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "py313", "language": "python", "name": "python3" }, @@ -2272,7 +1630,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.13.1" } }, "nbformat": 4, diff --git a/notebooks/astropy_example.ipynb b/notebooks/astropy_example.ipynb new file mode 100644 index 00000000..5dd00424 --- /dev/null +++ b/notebooks/astropy_example.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (12,) + inhomogeneous part.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 28\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m warnings\u001b[38;5;241m.\u001b[39mcatch_warnings():\n\u001b[1;32m 25\u001b[0m \u001b[38;5;66;03m# Ignore model linearity warning from the fitter\u001b[39;00m\n\u001b[1;32m 26\u001b[0m warnings\u001b[38;5;241m.\u001b[39mfilterwarnings(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mignore\u001b[39m\u001b[38;5;124m'\u001b[39m, message\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mModel is linear in parameters\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[1;32m 27\u001b[0m category\u001b[38;5;241m=\u001b[39mAstropyUserWarning)\n\u001b[0;32m---> 28\u001b[0m p \u001b[38;5;241m=\u001b[39m \u001b[43mfit_p\u001b[49m\u001b[43m(\u001b[49m\u001b[43mp_init\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mz\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;66;03m# Plot the data with the best-fit model\u001b[39;00m\n\u001b[1;32m 31\u001b[0m plt\u001b[38;5;241m.\u001b[39mfigure(figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m8\u001b[39m, \u001b[38;5;241m2.5\u001b[39m))\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/astropy/modeling/fitting.py:303\u001b[0m, in \u001b[0;36mfitter_unit_support..wrapper\u001b[0;34m(self, model, x, y, z, **kwargs)\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[1;32m 299\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThis model does not support being fit to data with units.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 300\u001b[0m )\n\u001b[1;32m 302\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 303\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mz\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mz\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/astropy/modeling/fitting.py:1434\u001b[0m, in \u001b[0;36m_NonLinearLSQFitter.__call__\u001b[0;34m(self, model, x, y, z, weights, maxiter, acc, epsilon, estimate_jacobian, filter_non_finite, inplace)\u001b[0m\n\u001b[1;32m 1427\u001b[0m farg \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 1428\u001b[0m model_copy,\n\u001b[1;32m 1429\u001b[0m weights,\n\u001b[1;32m 1430\u001b[0m ) \u001b[38;5;241m+\u001b[39m _convert_input(x, y, z)\n\u001b[1;32m 1432\u001b[0m fkwarg \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfit_param_indices\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28mset\u001b[39m(fit_param_indices)}\n\u001b[0;32m-> 1434\u001b[0m init_values, fitparams, cov_x \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_run_fitter\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1435\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel_copy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfarg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfkwarg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmaxiter\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43macc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mepsilon\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mestimate_jacobian\u001b[49m\n\u001b[1;32m 1436\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1438\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compute_param_cov(\n\u001b[1;32m 1439\u001b[0m model_copy, y, init_values, cov_x, fitparams, farg, fkwarg, weights\n\u001b[1;32m 1440\u001b[0m )\n\u001b[1;32m 1442\u001b[0m model_copy\u001b[38;5;241m.\u001b[39msync_constraints \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/astropy/modeling/fitting.py:1608\u001b[0m, in \u001b[0;36m_NLLSQFitter._run_fitter\u001b[0;34m(self, model, farg, fkwarg, maxiter, acc, epsilon, estimate_jacobian)\u001b[0m\n\u001b[1;32m 1605\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_use_min_max_bounds:\n\u001b[1;32m 1606\u001b[0m bounds \u001b[38;5;241m=\u001b[39m (\u001b[38;5;241m-\u001b[39mnp\u001b[38;5;241m.\u001b[39minf, np\u001b[38;5;241m.\u001b[39minf)\n\u001b[0;32m-> 1608\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit_info \u001b[38;5;241m=\u001b[39m \u001b[43moptimize\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mleast_squares\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1609\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mobjective_function\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1610\u001b[0m \u001b[43m \u001b[49m\u001b[43minit_values\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1611\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfarg\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1612\u001b[0m \u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfkwarg\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1613\u001b[0m \u001b[43m \u001b[49m\u001b[43mjac\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdfunc\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1614\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_nfev\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmaxiter\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1615\u001b[0m \u001b[43m \u001b[49m\u001b[43mdiff_step\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msqrt\u001b[49m\u001b[43m(\u001b[49m\u001b[43mepsilon\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1616\u001b[0m \u001b[43m \u001b[49m\u001b[43mxtol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43macc\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1617\u001b[0m \u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_method\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1618\u001b[0m \u001b[43m \u001b[49m\u001b[43mbounds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbounds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1619\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1621\u001b[0m \u001b[38;5;66;03m# Adapted from ~scipy.optimize.minpack, see:\u001b[39;00m\n\u001b[1;32m 1622\u001b[0m \u001b[38;5;66;03m# https://github.com/scipy/scipy/blob/47bb6febaa10658c72962b9615d5d5aa2513fa3a/scipy/optimize/minpack.py#L795-L816\u001b[39;00m\n\u001b[1;32m 1623\u001b[0m \u001b[38;5;66;03m# Do Moore-Penrose inverse discarding zero singular values.\u001b[39;00m\n\u001b[1;32m 1624\u001b[0m _, s, VT \u001b[38;5;241m=\u001b[39m svd(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit_info\u001b[38;5;241m.\u001b[39mjac, full_matrices\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/scipy/optimize/_lsq/least_squares.py:861\u001b[0m, in \u001b[0;36mleast_squares\u001b[0;34m(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, loss, f_scale, diff_step, tr_solver, tr_options, jac_sparsity, max_nfev, verbose, args, kwargs)\u001b[0m\n\u001b[1;32m 858\u001b[0m initial_cost \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.5\u001b[39m \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39mdot(f0, f0)\n\u001b[1;32m 860\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcallable\u001b[39m(jac):\n\u001b[0;32m--> 861\u001b[0m J0 \u001b[38;5;241m=\u001b[39m \u001b[43mjac\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx0\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 863\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m issparse(J0):\n\u001b[1;32m 864\u001b[0m J0 \u001b[38;5;241m=\u001b[39m J0\u001b[38;5;241m.\u001b[39mtocsr()\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/astropy/modeling/fitting.py:1587\u001b[0m, in \u001b[0;36m_NLLSQFitter._run_fitter.._dfunc\u001b[0;34m(params, model, weights, *args, **context)\u001b[0m\n\u001b[1;32m 1584\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_dfunc\u001b[39m(params, model, weights, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcontext):\n\u001b[1;32m 1585\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m model\u001b[38;5;241m.\u001b[39mcol_fit_deriv:\n\u001b[1;32m 1586\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m np\u001b[38;5;241m.\u001b[39mtranspose(\n\u001b[0;32m-> 1587\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_wrap_deriv\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1588\u001b[0m \u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfit_param_indices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\n\u001b[1;32m 1589\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1590\u001b[0m )\n\u001b[1;32m 1591\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1592\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wrap_deriv(\n\u001b[1;32m 1593\u001b[0m params, model, weights, \u001b[38;5;241m*\u001b[39margs, fit_param_indices\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1594\u001b[0m )\n", + "File \u001b[0;32m~/conda/envs/mmtwfs/lib/python3.12/site-packages/astropy/modeling/fitting.py:1287\u001b[0m, in \u001b[0;36m_NonLinearLSQFitter._wrap_deriv\u001b[0;34m(params, model, weights, x, y, z, fit_param_indices)\u001b[0m\n\u001b[1;32m 1277\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m model\u001b[38;5;241m.\u001b[39mcol_fit_deriv:\n\u001b[1;32m 1278\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[1;32m 1279\u001b[0m np\u001b[38;5;241m.\u001b[39mravel(_)\n\u001b[1;32m 1280\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m (\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1283\u001b[0m )\u001b[38;5;241m.\u001b[39mT\n\u001b[1;32m 1284\u001b[0m ]\n\u001b[1;32m 1285\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m [\n\u001b[1;32m 1286\u001b[0m np\u001b[38;5;241m.\u001b[39mravel(_)\n\u001b[0;32m-> 1287\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m weights \u001b[38;5;241m*\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43marray\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfit_deriv\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1288\u001b[0m ]\n", + "\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (12,) + inhomogeneous part." + ] + } + ], + "source": [ + "import warnings\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from astropy.modeling import models, fitting\n", + "from astropy.utils.exceptions import AstropyUserWarning\n", + "\n", + "# Generate fake data\n", + "rng = np.random.default_rng(0)\n", + "y, x = np.mgrid[:128, :128]\n", + "z = 2. * x ** 2 - 0.5 * x ** 2 + 1.5 * x * y - 1.\n", + "z += rng.normal(0., 0.1, z.shape) * 50000.\n", + "z += models.Gaussian2D(\n", + " amplitude=50000,\n", + " x_mean=60,\n", + " y_mean=60,\n", + " x_stddev=5,\n", + " y_stddev=5\n", + ")(x, y)\n", + "\n", + "# Fit the data using astropy.modeling\n", + "p_init = models.Polynomial2D(degree=2) + models.Gaussian2D(amplitude=50000, x_mean=60, y_mean=60)\n", + "fit_p = fitting.DogBoxLSQFitter()\n", + "\n", + "with warnings.catch_warnings():\n", + " # Ignore model linearity warning from the fitter\n", + " warnings.filterwarnings('ignore', message='Model is linear in parameters',\n", + " category=AstropyUserWarning)\n", + " p = fit_p(p_init, x, y, z)\n", + "\n", + "# Plot the data with the best-fit model\n", + "plt.figure(figsize=(8, 2.5))\n", + "plt.subplot(1, 3, 1)\n", + "plt.imshow(z, origin='lower', interpolation='nearest', vmin=-1e4, vmax=5e4)\n", + "plt.title(\"Data\")\n", + "plt.subplot(1, 3, 2)\n", + "plt.imshow(p(x, y), origin='lower', interpolation='nearest', vmin=-1e4,\n", + " vmax=5e4)\n", + "plt.title(\"Model\")\n", + "plt.subplot(1, 3, 3)\n", + "plt.imshow(z - p(x, y), origin='lower', interpolation='nearest', vmin=-1e4,\n", + " vmax=5e4)\n", + "plt.title(\"Residual\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "platform\n", + "--------\n", + "platform.platform() = 'macOS-15.1.1-arm64-arm-64bit'\n", + "platform.version() = 'Darwin Kernel Version 24.1.0: Thu Oct 10 21:03:15 PDT 2024; root:xnu-11215.41.3~2/RELEASE_ARM64_T6000'\n", + "platform.python_version() = '3.12.7'\n", + "\n", + "packages\n", + "--------\n", + "astropy 7.0.0\n", + "numpy 2.1.3\n", + "scipy 1.14.1\n", + "matplotlib 3.9.3\n", + "pandas 2.2.3\n", + "pyerfa 2.0.1.5\n" + ] + } + ], + "source": [ + "import astropy\n", + "try:\n", + " astropy.system_info()\n", + "except AttributeError:\n", + " import platform; print(platform.platform())\n", + " import sys; print(\"Python\", sys.version)\n", + " import astropy; print(\"astropy\", astropy.__version__)\n", + " import numpy; print(\"Numpy\", numpy.__version__)\n", + " import erfa; print(\"pyerfa\", erfa.__version__)\n", + " try:\n", + " import scipy\n", + " print(\"Scipy\", scipy.__version__)\n", + " except ImportError:\n", + " print(\"Scipy not installed\")\n", + " try:\n", + " import matplotlib\n", + " print(\"Matplotlib\", matplotlib.__version__)\n", + " except ImportError:\n", + " print(\"Matplotlib not installed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mmtwfs", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/benchmark.ipynb b/notebooks/benchmark.ipynb index 4cbb8176..a1e130cb 100644 --- a/notebooks/benchmark.ipynb +++ b/notebooks/benchmark.ipynb @@ -43,28 +43,20 @@ } ], "source": [ - "mmirs = WFSFactory(wfs=\"mmirs\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + "mmirs = WFSFactory(wfs=\"mmirs\")\n", "mmirs_file = \"/home/tim/MMT/mmtwfs/mmtwfs/data/test_data/mmirs_wfs_0150.fits\"" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2.3 s ± 103 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" + "2.24 s ± 23 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] }, { @@ -167,12 +159,13 @@ "source": [ "%%timeit\n", "results = mmirs.measure_slopes(mmirs_file, plot=False)\n", - "zresults = mmirs.fit_wavefront(results, plot=False)" + "zresults = mmirs.fit_wavefront(results, plot=False)\n", + "#results['seeing']" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -198,1959 +191,1959 @@ "name": "stdout", "output_type": "stream", "text": [ - " 1715348 function calls (1649268 primitive calls) in 2.799 seconds\n", + " 1813683 function calls (1747714 primitive calls) in 2.744 seconds\n", "\n", " Ordered by: internal time\n", "\n", " ncalls tottime percall cumtime percall filename:lineno(function)\n", - " 27101 0.396 0.000 0.406 0.000 zernike.py:81(R_mn)\n", - " 207 0.379 0.002 0.379 0.002 functional_models.py:367(evaluate)\n", - " 13561 0.119 0.000 0.119 0.000 zernike.py:156(theta_m)\n", - " 26237 0.114 0.000 0.114 0.000 zernike.py:330(noll_to_zernike)\n", - " 13540 0.098 0.000 0.330 0.000 zernike.py:121(dR_drho)\n", - " 13540 0.095 0.000 0.095 0.000 zernike.py:180(dtheta_dphi)\n", - " 6770 0.081 0.000 0.555 0.000 zernike.py:240(dZ_dx)\n", - " 6770 0.077 0.000 0.216 0.000 zernike.py:285(dZ_dy)\n", - " 1 0.064 0.064 0.065 0.065 {astroscrappy.astroscrappy.detect_cosmics}\n", - " 2 0.047 0.023 0.047 0.023 {astropy.timeseries.periodograms.lombscargle.implementations.cython_impl.lombscargle_cython}\n", - "58222/41508 0.041 0.000 0.077 0.000 column.py:1070(__setattr__)\n", - " 323 0.039 0.000 0.832 0.003 zernike.py:415(zernike_slopes)\n", - " 2 0.037 0.019 0.037 0.019 {built-in method scipy.fft._pocketfft.pypocketfft.r2c}\n", - " 6819 0.037 0.000 0.037 0.000 {built-in method numpy.asanyarray}\n", - " 9129 0.032 0.000 0.032 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", - " 475 0.031 0.000 0.041 0.000 {method 'query' of 'scipy.spatial.ckdtree.cKDTree' objects}\n", - "42488/1004 0.029 0.000 0.067 0.000 copy.py:128(deepcopy)\n", - " 6 0.028 0.005 0.028 0.005 {method 'cumsum' of 'numpy.ndarray' objects}\n", - " 1 0.028 0.028 0.028 0.028 {built-in method scipy.ndimage._nd_image.binary_erosion}\n", - "28654/25045 0.027 0.000 0.187 0.000 {built-in method numpy.core._multiarray_umath.implement_array_function}\n", + " 160 0.290 0.002 0.290 0.002 functional_models.py:367(evaluate)\n", + " 24720 0.271 0.000 0.280 0.000 zernike.py:111()\n", + " 25292 0.115 0.000 0.115 0.000 zernike.py:331(noll_to_zernike)\n", + " 11671 0.104 0.000 0.104 0.000 zernike.py:157(theta_m)\n", + " 22251 0.099 0.000 0.099 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n", + " 11650 0.099 0.000 0.389 0.000 zernike.py:122(dR_drho)\n", + " 11650 0.081 0.000 0.081 0.000 zernike.py:181(dtheta_dphi)\n", + " 5825 0.078 0.000 0.611 0.000 zernike.py:241(dZ_dx)\n", + " 5825 0.073 0.000 0.217 0.000 zernike.py:286(dZ_dy)\n", + " 23321 0.073 0.000 0.500 0.000 zernike.py:81(R_mn)\n", + " 1 0.061 0.061 0.062 0.062 {astroscrappy.astroscrappy.detect_cosmics}\n", + " 2 0.045 0.022 0.045 0.022 {astropy.timeseries.periodograms.lombscargle.implementations.cython_impl.lombscargle_cython}\n", + "55882/39843 0.039 0.000 0.073 0.000 column.py:1070(__setattr__)\n", + " 6833 0.038 0.000 0.038 0.000 {built-in method numpy.asanyarray}\n", + " 2 0.038 0.019 0.038 0.019 {built-in method scipy.fft._pocketfft.pypocketfft.r2c}\n", + "42105/38299 0.034 0.000 0.318 0.000 {built-in method numpy.core._multiarray_umath.implement_array_function}\n", + " 278 0.034 0.000 0.884 0.003 zernike.py:416(zernike_slopes)\n", + " 6 0.032 0.005 0.032 0.005 {method 'cumsum' of 'numpy.ndarray' objects}\n", + " 475 0.031 0.000 0.042 0.000 {method 'query' of 'scipy.spatial.ckdtree.cKDTree' objects}\n", + " 1 0.030 0.030 0.030 0.030 {built-in method scipy.ndimage._nd_image.binary_erosion}\n", + " 18018 0.029 0.000 0.132 0.000 fromnumeric.py:69(_wrapreduction)\n", + "42739/1005 0.029 0.000 0.063 0.000 copy.py:128(deepcopy)\n", " 1 0.027 0.027 0.027 0.027 {built-in method scipy.fft._pocketfft.pypocketfft.c2r}\n", - " 1 0.022 0.022 0.022 0.022 {built-in method scipy.ndimage._nd_image.zoom_shift}\n", - " 1 0.022 0.022 0.038 0.038 detect.py:166(_detect_sources)\n", - " 2 0.020 0.010 0.166 0.083 zernike.py:1237(rotate)\n", - " 691 0.020 0.000 0.020 0.000 {method 'partition' of 'numpy.ndarray' objects}\n", - " 154324 0.019 0.000 0.022 0.000 {built-in method builtins.isinstance}\n", + " 1 0.024 0.024 0.040 0.040 detect.py:166(_detect_sources)\n", + "134816/134754 0.023 0.000 0.031 0.000 {built-in method builtins.getattr}\n", + " 1 0.023 0.023 0.023 0.023 {built-in method scipy.ndimage._nd_image.zoom_shift}\n", + " 2 0.021 0.011 0.174 0.087 zernike.py:1238(rotate)\n", + " 162259 0.021 0.000 0.024 0.000 {built-in method builtins.isinstance}\n", " 1 0.019 0.019 0.019 0.019 {built-in method scipy.ndimage._nd_image.min_or_max_filter}\n", - "131373/131311 0.018 0.000 0.027 0.000 {built-in method builtins.getattr}\n", - " 474 0.017 0.000 0.173 0.000 wfs.py:395(fit_apertures)\n", - " 6452 0.015 0.000 0.024 0.000 core.py:2948(_update_from)\n", - " 1 0.014 0.014 0.590 0.590 wfs.py:1731(pupil_mask)\n", - "15801/15759 0.014 0.000 0.015 0.000 {built-in method numpy.array}\n", + " 691 0.018 0.000 0.018 0.000 {method 'partition' of 'numpy.ndarray' objects}\n", + " 474 0.018 0.000 0.175 0.000 wfs.py:398(fit_apertures)\n", + " 14268 0.015 0.000 0.127 0.000 fromnumeric.py:2123(sum)\n", + "15165/15123 0.014 0.000 0.015 0.000 {built-in method numpy.array}\n", + " 1 0.014 0.014 0.493 0.493 wfs.py:1734(pupil_mask)\n", " 1 0.013 0.013 0.013 0.013 {built-in method scipy.ndimage._nd_image.correlate}\n", - " 3551 0.013 0.000 0.036 0.000 core.py:2974(__array_finalize__)\n", - " 5527 0.012 0.000 0.119 0.000 column.py:570(__array_finalize__)\n", - " 474 0.011 0.000 0.068 0.000 wfs.py:381(aperture_distance)\n", - " 644 0.011 0.000 0.041 0.000 core.py:6816(power)\n", - " 1 0.011 0.011 0.124 0.124 template.py:31(match_template)\n", - " 114900 0.010 0.000 0.010 0.000 {built-in method math.factorial}\n", - " 3295 0.010 0.000 0.014 0.000 shapes.py:308(check_broadcast)\n", - " 323 0.009 0.000 0.049 0.000 zernike.py:37(cart2pol)\n", - " 5500 0.009 0.000 0.014 0.000 data_info.py:348(__set__)\n", - " 100067 0.009 0.000 0.009 0.000 {method 'get' of 'dict' objects}\n", - " 965 0.009 0.000 0.047 0.000 core.py:1005(__call__)\n", - " 1 0.008 0.008 0.008 0.008 {built-in method scipy.ndimage._nd_image.geometric_transform}\n", - " 1017/971 0.008 0.000 0.050 0.000 copy.py:226(_deepcopy_dict)\n", - " 1391 0.008 0.000 0.008 0.000 {function Quantity.__array_ufunc__ at 0x7f27b3d1d280}\n", - " 5527 0.007 0.000 0.064 0.000 column.py:951(_copy_attrs)\n", - " 6267 0.007 0.000 0.016 0.000 _ufunc_config.py:32(seterr)\n", - " 6770 0.007 0.000 0.787 0.000 zernike.py:388(zernike_slope_noll)\n", - " 321 0.007 0.000 1.030 0.003 wfs.py:656(slope_diff)\n", + " 5552 0.013 0.000 0.020 0.000 core.py:2948(_update_from)\n", + " 5302 0.012 0.000 0.114 0.000 column.py:570(__array_finalize__)\n", + " 474 0.012 0.000 0.070 0.000 wfs.py:385(aperture_distance)\n", + " 1 0.011 0.011 0.129 0.129 template.py:31(match_template)\n", + " 3056 0.011 0.000 0.031 0.000 core.py:2974(__array_finalize__)\n", + " 554 0.009 0.000 0.034 0.000 core.py:6816(power)\n", + " 14268 0.009 0.000 0.145 0.000 <__array_function__ internals>:2(sum)\n", + " 13612 0.009 0.000 0.289 0.000 zernike.py:113()\n", + " 98880 0.009 0.000 0.009 0.000 {built-in method math.factorial}\n", + " 5275 0.009 0.000 0.013 0.000 data_info.py:348(__set__)\n", + " 1 0.009 0.009 0.009 0.009 {built-in method scipy.ndimage._nd_image.geometric_transform}\n", + " 100536 0.009 0.000 0.009 0.000 {method 'get' of 'dict' objects}\n", + " 3187 0.008 0.000 0.012 0.000 shapes.py:308(check_broadcast)\n", + " 1043/972 0.008 0.000 0.048 0.000 copy.py:226(_deepcopy_dict)\n", + " 1391 0.008 0.000 0.008 0.000 {function Quantity.__array_ufunc__ at 0x7f2d6bf454c0}\n", + " 278 0.008 0.000 0.041 0.000 zernike.py:37(cart2pol)\n", + " 830 0.007 0.000 0.038 0.000 core.py:1005(__call__)\n", + " 5302 0.007 0.000 0.061 0.000 column.py:951(_copy_attrs)\n", " 2 0.007 0.003 0.007 0.003 {built-in method scipy.ndimage._nd_image.correlate1d}\n", - " 321 0.007 0.000 1.051 0.003 minimizer.py:539(__residual)\n", + " 18018 0.007 0.000 0.007 0.000 fromnumeric.py:70()\n", + " 5825 0.007 0.000 0.844 0.000 zernike.py:389(zernike_slope_noll)\n", " 1 0.006 0.006 0.006 0.006 {method 'argsort' of 'numpy.ndarray' objects}\n", - " 4450 0.006 0.000 0.027 0.000 fromnumeric.py:69(_wrapreduction)\n", + " 5412 0.006 0.000 0.014 0.000 _ufunc_config.py:32(seterr)\n", + " 21915 0.006 0.000 0.043 0.000 {built-in method builtins.setattr}\n", " 1 0.006 0.006 0.014 0.014 interpolation.py:158(__call__)\n", - " 22814 0.006 0.000 0.046 0.000 {built-in method builtins.setattr}\n", - " 1391 0.005 0.000 0.041 0.000 quantity.py:571(__array_ufunc__)\n", - "13835/13191 0.005 0.000 0.032 0.000 {method 'view' of 'numpy.ndarray' objects}\n", - " 6268 0.005 0.000 0.006 0.000 _ufunc_config.py:131(geterr)\n", - " 5446 0.005 0.000 0.006 0.000 column.py:588(__array_wrap__)\n", - " 254 0.005 0.000 0.012 0.000 core.py:2618(_param_sets)\n", - " 1174 0.005 0.000 0.005 0.000 {built-in method numpy.zeros}\n", + " 276 0.006 0.000 1.046 0.004 wfs.py:659(slope_diff)\n", + " 1391 0.005 0.000 0.040 0.000 quantity.py:571(__array_ufunc__)\n", + " 356 0.005 0.000 0.012 0.000 core.py:2618(_param_sets)\n", + " 276 0.005 0.000 1.063 0.004 minimizer.py:539(__residual)\n", " 1 0.005 0.005 0.005 0.005 sigma_clipping.py:307(_sigmaclip_fast)\n", - " 1 0.005 0.005 0.075 0.075 signaltools.py:456(_freq_domain_conv)\n", - " 29101 0.005 0.000 0.005 0.000 {method 'update' of 'dict' objects}\n", - " 692 0.005 0.000 0.006 0.000 utils.py:1007(_median_nancheck)\n", - " 2 0.005 0.002 0.033 0.017 template.py:7(_window_sum_2d)\n", - " 1 0.005 0.005 0.118 0.118 zernike.py:1287(phase_map)\n", - " 6741 0.004 0.000 0.005 0.000 parameter.py:819(value)\n", - " 586 0.004 0.000 0.017 0.000 utils.py:31(overlap_slices)\n", - " 54791 0.004 0.000 0.004 0.000 {built-in method builtins.id}\n", - " 691 0.004 0.000 0.046 0.000 function_base.py:3663(_median)\n", - " 644/323 0.004 0.000 0.041 0.000 core.py:3067(__array_wrap__)\n", + " 1 0.005 0.005 0.076 0.076 signaltools.py:456(_freq_domain_conv)\n", + "12665/12111 0.005 0.000 0.027 0.000 {method 'view' of 'numpy.ndarray' objects}\n", + " 1041 0.005 0.000 0.005 0.000 {built-in method numpy.zeros}\n", + " 5221 0.005 0.000 0.006 0.000 column.py:588(__array_wrap__)\n", + " 1 0.005 0.005 0.119 0.119 zernike.py:1288(phase_map)\n", + " 586 0.005 0.000 0.018 0.000 utils.py:31(overlap_slices)\n", + " 2 0.005 0.002 0.037 0.018 template.py:7(_window_sum_2d)\n", + " 1386 0.005 0.000 0.005 0.000 transforms.py:207(set_children)\n", + " 5413 0.004 0.000 0.005 0.000 _ufunc_config.py:131(geterr)\n", + " 692 0.004 0.000 0.006 0.000 utils.py:1007(_median_nancheck)\n", + " 691 0.004 0.000 0.044 0.000 function_base.py:3663(_median)\n", " 586 0.004 0.000 0.004 0.000 utils.py:102()\n", - " 5527 0.004 0.000 0.011 0.000 column.py:624(name)\n", - " 162 0.004 0.000 0.100 0.001 core.py:698(__init__)\n", + " 55150 0.004 0.000 0.004 0.000 {built-in method builtins.id}\n", " 586 0.004 0.000 0.004 0.000 utils.py:104()\n", - " 5599 0.004 0.000 0.004 0.000 data_info.py:333(__get__)\n", - " 1386 0.004 0.000 0.004 0.000 transforms.py:207(set_children)\n", - " 647 0.004 0.000 0.014 0.000 core.py:3213(__getitem__)\n", - " 5502 0.004 0.000 0.017 0.000 data_info.py:555(__set__)\n", - " 27602 0.004 0.000 0.004 0.000 {built-in method builtins.hasattr}\n", - " 10526 0.003 0.000 0.003 0.000 shapes.py:332()\n", - " 1452 0.003 0.000 0.008 0.000 quantity.py:684(_new_view)\n", - "31028/30788 0.003 0.000 0.004 0.000 {built-in method builtins.len}\n", - " 254 0.003 0.000 0.015 0.000 core.py:1820(_prepare_inputs_single_model)\n", + " 25194 0.004 0.000 0.004 0.000 {method 'update' of 'dict' objects}\n", + " 5302 0.004 0.000 0.010 0.000 column.py:624(name)\n", + " 5796 0.004 0.000 0.004 0.000 parameter.py:819(value)\n", + " 2148 0.004 0.000 0.004 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", + " 554/278 0.004 0.000 0.034 0.000 core.py:3067(__array_wrap__)\n", + " 5374 0.004 0.000 0.004 0.000 data_info.py:333(__get__)\n", + " 26906 0.004 0.000 0.004 0.000 {built-in method builtins.hasattr}\n", + " 1452 0.003 0.000 0.009 0.000 quantity.py:684(_new_view)\n", + " 557 0.003 0.000 0.012 0.000 core.py:3213(__getitem__)\n", + " 5277 0.003 0.000 0.017 0.000 data_info.py:555(__set__)\n", " 6399 0.003 0.000 0.011 0.000 <__array_function__ internals>:2(count_nonzero)\n", - " 2283 0.003 0.000 0.003 0.000 {method 'copy' of 'numpy.ndarray' objects}\n", - " 966 0.003 0.000 0.006 0.000 utils.py:290(quantity_asanyarray)\n", - " 1 0.003 0.003 0.003 0.003 {built-in method scipy.ndimage._nd_image.find_objects}\n", + "30349/30109 0.003 0.000 0.004 0.000 {built-in method builtins.len}\n", + " 163 0.003 0.000 0.092 0.001 core.py:698(__init__)\n", + " 3288 0.003 0.000 0.018 0.000 quantity.py:855(to_value)\n", " 690 0.003 0.000 0.006 0.000 nanfunctions.py:142(_remove_nan_1d)\n", - " 2668 0.003 0.000 0.003 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", - " 162 0.003 0.000 0.018 0.000 core.py:2337(_initialize_parameters)\n", - " 5227 0.003 0.000 0.010 0.000 <__array_function__ internals>:2(shape)\n", - " 1003/975 0.003 0.000 0.058 0.000 copy.py:258(_reconstruct)\n", - " 5525 0.003 0.000 0.004 0.000 data_info.py:547(__init__)\n", - " 3288 0.003 0.000 0.016 0.000 quantity.py:855(to_value)\n", - " 79 0.003 0.000 0.151 0.002 _numdiff.py:547(_dense_difference)\n", - " 38404 0.003 0.000 0.003 0.000 copy.py:182(_deepcopy_atomic)\n", - " 3392 0.003 0.000 0.003 0.000 {built-in method numpy.asarray}\n", - " 17355 0.003 0.000 0.003 0.000 {built-in method builtins.issubclass}\n", - " 1391 0.003 0.000 0.013 0.000 converters.py:133(converters_and_unit)\n", + " 356 0.003 0.000 0.013 0.000 core.py:1820(_prepare_inputs_single_model)\n", + " 9024 0.003 0.000 0.003 0.000 shapes.py:332()\n", + " 1 0.003 0.003 0.003 0.003 {built-in method scipy.ndimage._nd_image.find_objects}\n", + " 2678 0.003 0.000 0.003 0.000 {method 'reshape' of 'numpy.ndarray' objects}\n", + " 5300 0.003 0.000 0.004 0.000 data_info.py:547(__init__)\n", + " 23976 0.003 0.000 0.003 0.000 {method 'items' of 'dict' objects}\n", + " 3304 0.003 0.000 0.003 0.000 {built-in method numpy.asarray}\n", + " 966 0.003 0.000 0.005 0.000 utils.py:290(quantity_asanyarray)\n", + " 5118 0.003 0.000 0.009 0.000 <__array_function__ internals>:2(shape)\n", + " 454/258 0.003 0.000 0.382 0.001 core.py:1053(__call__)\n", + " 79 0.003 0.000 0.153 0.002 _numdiff.py:547(_dense_difference)\n", " 4380 0.003 0.000 0.005 0.000 numeric.py:1858(isscalar)\n", + " 1014/976 0.003 0.000 0.055 0.000 copy.py:258(_reconstruct)\n", + " 38583 0.003 0.000 0.003 0.000 copy.py:182(_deepcopy_atomic)\n", + " 853/852 0.003 0.000 0.010 0.000 transforms.py:1791(__eq__)\n", + " 163 0.003 0.000 0.016 0.000 core.py:2337(_initialize_parameters)\n", + " 16711 0.003 0.000 0.003 0.000 {built-in method builtins.issubclass}\n", " 695 0.003 0.000 0.008 0.000 _methods.py:162(_mean)\n", - " 3220 0.003 0.000 0.005 0.000 core.py:666(getdata)\n", - " 5528 0.003 0.000 0.005 0.000 metadata.py:397(__get__)\n", - " 1383/692 0.002 0.000 0.067 0.000 function_base.py:3513(_ureduce)\n", - " 254 0.002 0.000 0.384 0.002 core.py:927(evaluate)\n", - " 11072 0.002 0.000 0.003 0.000 column.py:458(parent_table)\n", - " 301/207 0.002 0.000 0.467 0.002 core.py:1053(__call__)\n", - " 2 0.002 0.001 0.023 0.011 sigma_clipping.py:393(_sigmaclip_noaxis)\n", + " 1391 0.003 0.000 0.013 0.000 converters.py:133(converters_and_unit)\n", + " 142 0.003 0.000 0.004 0.000 arraysetops.py:519(in1d)\n", " 3 0.002 0.001 0.006 0.002 helper.py:112(_fix_shape)\n", - " 19699 0.002 0.000 0.002 0.000 {method 'append' of 'list' objects}\n", - " 853/852 0.002 0.000 0.009 0.000 transforms.py:1791(__eq__)\n", - " 7430 0.002 0.000 0.002 0.000 core.py:3405(dtype)\n", - "4638/4177 0.002 0.000 0.003 0.000 artist.py:290(stale)\n", - " 6267 0.002 0.000 0.002 0.000 {built-in method numpy.seterrobj}\n", - " 142 0.002 0.000 0.004 0.000 arraysetops.py:519(in1d)\n", - " 4 0.002 0.001 0.002 0.001 {built-in method scipy.ndimage._nd_image.spline_filter1d}\n", + " 2 0.002 0.001 0.022 0.011 sigma_clipping.py:393(_sigmaclip_noaxis)\n", + " 5303 0.002 0.000 0.004 0.000 metadata.py:397(__get__)\n", + " 142 0.002 0.000 0.048 0.000 _base.py:2363(_update_patch_limits)\n", + " 1041 0.002 0.000 0.007 0.000 transforms.py:2351(__init__)\n", + " 356 0.002 0.000 0.296 0.001 core.py:927(evaluate)\n", + " 3031 0.002 0.000 0.004 0.000 {built-in method builtins.any}\n", " 3500 0.002 0.000 0.002 0.000 quantity.py:534(__array_finalize__)\n", - " 2 0.002 0.001 1.071 0.536 {built-in method scipy.optimize._minpack._lmdif}\n", - "1683/1668 0.002 0.000 0.004 0.000 core.py:873(__setattr__)\n", - " 2650 0.002 0.000 0.008 0.000 _ufunc_config.py:434(__exit__)\n", - " 2254 0.002 0.000 0.006 0.000 core.py:428(_check_fill_value)\n", - " 3917 0.002 0.000 0.002 0.000 parameters.py:313(value)\n", - " 142 0.002 0.000 0.041 0.000 _base.py:2363(_update_patch_limits)\n", - " 21 0.002 0.000 0.106 0.005 zernike.py:204(zernike)\n", - " 162 0.002 0.000 0.006 0.000 core.py:2523(_initialize_slices)\n", - " 3032 0.002 0.000 0.003 0.000 copy.py:242(_keep_alive)\n", - " 5610 0.002 0.000 0.006 0.000 column.py:468(parent_table)\n", - " 5227 0.002 0.000 0.002 0.000 fromnumeric.py:1928(shape)\n", - " 966 0.002 0.000 0.009 0.000 core.py:1689(mask_or)\n", - " 2664 0.002 0.000 0.004 0.000 {built-in method builtins.any}\n", - " 2262 0.002 0.000 0.002 0.000 {method 'view' of 'numpy.generic' objects}\n", - " 321 0.002 0.000 0.023 0.000 core.py:882(__call__)\n", - " 7416 0.002 0.000 0.002 0.000 {method 'replace' of 'str' objects}\n", - " 284 0.002 0.000 0.002 0.000 bounding_box.py:75(from_float)\n", - " 1124 0.002 0.000 0.005 0.000 core.py:1068(_to)\n", - " 161 0.002 0.000 0.102 0.001 functional_models.py:282(__init__)\n", - " 9671 0.002 0.000 0.003 0.000 core.py:1357(getmask)\n", - " 1 0.002 0.002 0.202 0.202 wfs.py:278(get_apertures)\n", - " 2650 0.002 0.000 0.010 0.000 _ufunc_config.py:429(__enter__)\n", - " 287 0.002 0.000 0.009 0.000 artist.py:1046(update)\n", - " 79 0.002 0.000 0.003 0.000 _numdiff.py:11(_adjust_scheme_to_bounds)\n", + " 18358 0.002 0.000 0.002 0.000 {method 'append' of 'list' objects}\n", + " 10622 0.002 0.000 0.003 0.000 column.py:458(parent_table)\n", + " 4 0.002 0.001 0.002 0.001 {built-in method scipy.ndimage._nd_image.spline_filter1d}\n", + " 1383/692 0.002 0.000 0.065 0.000 function_base.py:3513(_ureduce)\n", + "4638/4177 0.002 0.000 0.003 0.000 artist.py:290(stale)\n", " 6397 0.002 0.000 0.002 0.000 {built-in method numpy.core._multiarray_umath.count_nonzero}\n", - " 79 0.002 0.000 0.158 0.002 _numdiff.py:257(approx_derivative)\n", + " 4110 0.002 0.000 0.002 0.000 parameters.py:313(value)\n", + " 356 0.002 0.000 0.057 0.000 core.py:1952(prepare_inputs)\n", + " 79 0.002 0.000 0.160 0.002 _numdiff.py:257(approx_derivative)\n", + " 2770 0.002 0.000 0.004 0.000 core.py:666(getdata)\n", + " 79 0.002 0.000 0.003 0.000 _numdiff.py:11(_adjust_scheme_to_bounds)\n", + " 284 0.002 0.000 0.003 0.000 bounding_box.py:75(from_float)\n", + " 163 0.002 0.000 0.006 0.000 core.py:2523(_initialize_slices)\n", + " 6395 0.002 0.000 0.002 0.000 core.py:3405(dtype)\n", + " 100 0.002 0.000 0.011 0.000 fitting.py:1596(_fitter_to_model_params)\n", + "1745/1719 0.002 0.000 0.004 0.000 core.py:873(__setattr__)\n", + " 774 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", + " 1124 0.002 0.000 0.005 0.000 core.py:1068(_to)\n", + " 202 0.002 0.000 0.004 0.000 converters.py:115(can_have_arbitrary_unit)\n", + " 6399 0.002 0.000 0.004 0.000 numeric.py:425(count_nonzero)\n", + " 3081 0.002 0.000 0.002 0.000 copy.py:242(_keep_alive)\n", + " 5385 0.002 0.000 0.005 0.000 column.py:468(parent_table)\n", + " 14268 0.002 0.000 0.002 0.000 fromnumeric.py:2118(_sum_dispatcher)\n", + " 5118 0.002 0.000 0.002 0.000 fromnumeric.py:1928(shape)\n", " 700 0.002 0.000 0.002 0.000 _methods.py:66(_count_reduce_items)\n", - " 5558 0.002 0.000 0.002 0.000 np_utils.py:155(fix_column_name)\n", - " 254 0.002 0.000 0.057 0.000 core.py:1952(prepare_inputs)\n", - " 3556 0.002 0.000 0.003 0.000 core.py:3637(_get_data)\n", - " 160 0.002 0.000 0.013 0.000 wfs.py:1598(mirrorpoint)\n", - " 1026 0.002 0.000 0.004 0.000 copy.py:209(_deepcopy_tuple)\n", + " 1939 0.002 0.000 0.005 0.000 core.py:428(_check_fill_value)\n", + " 6471 0.002 0.000 0.002 0.000 {method 'replace' of 'str' objects}\n", + " 3 0.002 0.001 1.088 0.363 {built-in method scipy.optimize._minpack._lmdif}\n", + " 5412 0.002 0.000 0.002 0.000 {built-in method numpy.seterrobj}\n", + " 2010 0.002 0.000 0.039 0.000 fromnumeric.py:51(_wrapfunc)\n", + " 1 0.002 0.002 0.003 0.003 wfs.py:360(match_apertures)\n", + " 204 0.002 0.000 0.003 0.000 core.py:2540(_parameters_to_array)\n", + " 5794 0.002 0.000 0.002 0.000 {built-in method _abc._abc_instancecheck}\n", + " 1115 0.002 0.000 0.004 0.000 fromnumeric.py:38(_wrapit)\n", + " 2290 0.002 0.000 0.007 0.000 _ufunc_config.py:434(__exit__)\n", + " 1 0.002 0.002 0.218 0.218 wfs.py:278(get_apertures)\n", " 692 0.002 0.000 0.002 0.000 {method 'nonzero' of 'numpy.ndarray' objects}\n", - " 966 0.002 0.000 0.003 0.000 core.py:639(get_masked_subclass)\n", + " 160 0.002 0.000 0.012 0.000 wfs.py:1601(mirrorpoint)\n", + " 5327 0.002 0.000 0.004 0.000 column.py:832(unit)\n", + " 5333 0.002 0.000 0.002 0.000 np_utils.py:155(fix_column_name)\n", + " 2 0.002 0.001 0.002 0.001 {built-in method scipy.ndimage._nd_image.min_or_max_filter1d}\n", + " 1880 0.002 0.000 0.007 0.000 <__array_function__ internals>:2(copyto)\n", + " 8321 0.002 0.000 0.002 0.000 core.py:1357(getmask)\n", + " 2290 0.002 0.000 0.008 0.000 _ufunc_config.py:429(__enter__)\n", + " 6 0.002 0.000 0.002 0.000 arraypad.py:129(_set_pad_area)\n", + " 1 0.002 0.002 0.607 0.607 wfs.py:442(get_slopes)\n", + " 142 0.002 0.000 0.002 0.000 {photutils.geometry.circular_overlap.circular_overlap_grid}\n", + " 1947 0.002 0.000 0.002 0.000 {method 'view' of 'numpy.generic' objects}\n", " 967 0.002 0.000 0.003 0.000 core.py:2480(_initialize_parameter_value)\n", - " 2007 0.002 0.000 0.035 0.000 fromnumeric.py:51(_wrapfunc)\n", - " 863 0.002 0.000 0.002 0.000 {method 'astype' of 'numpy.ndarray' objects}\n", - " 4450 0.002 0.000 0.002 0.000 fromnumeric.py:70()\n", - " 5782 0.002 0.000 0.002 0.000 {built-in method _abc._abc_instancecheck}\n", - " 2007 0.002 0.000 0.008 0.000 <__array_function__ internals>:2(copyto)\n", - " 6399 0.002 0.000 0.004 0.000 numeric.py:425(count_nonzero)\n", - " 1 0.002 0.002 0.003 0.003 wfs.py:356(match_apertures)\n", - " 5552 0.002 0.000 0.005 0.000 column.py:832(unit)\n", + " 287 0.002 0.000 0.008 0.000 artist.py:1046(update)\n", + " 1 0.002 0.002 0.194 0.194 lbfgsb.py:210(_minimize_lbfgsb)\n", + " 276 0.002 0.000 0.019 0.000 core.py:882(__call__)\n", + " 160 0.002 0.000 0.093 0.001 functional_models.py:282(__init__)\n", " 2941 0.002 0.000 0.006 0.000 table.py:1880(__getitem__)\n", - " 12535 0.002 0.000 0.002 0.000 {built-in method numpy.geterrobj}\n", - " 1288 0.002 0.000 0.010 0.000 core.py:3123(view)\n", - " 202 0.002 0.000 0.004 0.000 converters.py:115(can_have_arbitrary_unit)\n", - " 1041 0.002 0.000 0.006 0.000 transforms.py:2351(__init__)\n", - " 1935 0.002 0.000 0.003 0.000 core.py:1310(_replace_dtype_fields)\n", - " 1115 0.002 0.000 0.004 0.000 fromnumeric.py:38(_wrapit)\n", - " 2960 0.002 0.000 0.002 0.000 __init__.py:653(__getitem__)\n", - " 1400 0.002 0.000 0.004 0.000 numerictypes.py:358(issubdtype)\n", - " 1 0.002 0.002 0.002 0.002 {built-in method scipy.ndimage._ni_label._label}\n", - " 142 0.002 0.000 0.002 0.000 {photutils.geometry.circular_overlap.circular_overlap_grid}\n", - " 162 0.002 0.000 0.005 0.000 core.py:2563(_check_param_broadcast)\n", - " 3228 0.002 0.000 0.009 0.000 {method 'any' of 'numpy.ndarray' objects}\n", - " 1609 0.001 0.000 0.007 0.000 core.py:1419(getmaskarray)\n", - " 2 0.001 0.001 0.001 0.001 {built-in method scipy.ndimage._nd_image.min_or_max_filter1d}\n", - " 5782 0.001 0.000 0.003 0.000 abc.py:117(__instancecheck__)\n", - " 966 0.001 0.000 0.007 0.000 core.py:1550(make_mask)\n", + " 3061 0.002 0.000 0.002 0.000 core.py:3637(_get_data)\n", + " 831 0.001 0.000 0.008 0.000 core.py:1689(mask_or)\n", + " 1041 0.001 0.000 0.004 0.000 copy.py:209(_deepcopy_tuple)\n", + " 1108 0.001 0.000 0.009 0.000 core.py:3123(view)\n", + " 831 0.001 0.000 0.002 0.000 core.py:639(get_masked_subclass)\n", + " 1401 0.001 0.000 0.004 0.000 numerictypes.py:358(issubdtype)\n", + " 163 0.001 0.000 0.005 0.000 core.py:2563(_check_param_broadcast)\n", " 608 0.001 0.000 0.004 0.000 quantity.py:409(__new__)\n", - " 10460 0.001 0.000 0.001 0.000 {method 'items' of 'dict' objects}\n", - " 1003 0.001 0.000 0.001 0.000 {method '__reduce_ex__' of 'object' objects}\n", - " 254 0.001 0.000 0.009 0.000 core.py:1035(_post_evaluate)\n", - " 98 0.001 0.000 0.003 0.000 core.py:2540(_parameters_to_array)\n", - " 321 0.001 0.000 0.003 0.000 parameter.py:417()\n", - " 2 0.001 0.001 0.026 0.013 peakfinder.py:18(find_peaks)\n", - " 48 0.001 0.000 0.008 0.000 fitting.py:1596(_fitter_to_model_params)\n", - " 2800 0.001 0.000 0.002 0.000 numerictypes.py:284(issubclass_)\n", - " 1 0.001 0.001 0.191 0.191 lbfgsb.py:210(_minimize_lbfgsb)\n", - " 6846 0.001 0.000 0.002 0.000 parameter.py:814(value)\n", - " 321 0.001 0.000 0.001 0.000 minimizer.py:2407()\n", - " 148 0.001 0.000 0.015 0.000 patches.py:59(__init__)\n", - " 6 0.001 0.000 0.001 0.000 arraypad.py:129(_set_pad_area)\n", + " 2960 0.001 0.000 0.002 0.000 __init__.py:653(__getitem__)\n", + " 1 0.001 0.001 0.001 0.001 {built-in method scipy.ndimage._ni_label._label}\n", + " 10825 0.001 0.000 0.001 0.000 {built-in method numpy.geterrobj}\n", + " 5794 0.001 0.000 0.003 0.000 abc.py:117(__instancecheck__)\n", + " 98 0.001 0.000 0.001 0.000 functional_models.py:163(evaluate)\n", + " 1420/852 0.001 0.000 0.009 0.000 transforms.py:2402(_iter_break_from_left_to_right)\n", + " 356 0.001 0.000 0.380 0.001 core.py:375(__call__)\n", + " 2 0.001 0.001 0.023 0.012 daofinder.py:387(make_cutouts)\n", " 2931 0.001 0.000 0.002 0.000 table.py:236(__getitem__)\n", - " 254 0.001 0.000 0.467 0.002 core.py:375(__call__)\n", - " 1420/852 0.001 0.000 0.007 0.000 transforms.py:2402(_iter_break_from_left_to_right)\n", - " 709 0.001 0.000 0.001 0.000 {built-in method numpy.empty}\n", - " 694 0.001 0.000 0.009 0.000 fromnumeric.py:3322(mean)\n", - " 1 0.001 0.001 0.584 0.584 wfs.py:439(get_slopes)\n", - " 321 0.001 0.000 0.007 0.000 minimizer.py:2374(_nan_policy)\n", - " 254 0.001 0.000 0.004 0.000 core.py:2109(_prepare_outputs_single_model)\n", - " 474 0.001 0.000 0.175 0.000 _differentiable_functions.py:129(fun_wrapped)\n", + " 356 0.001 0.000 0.008 0.000 core.py:1035(_post_evaluate)\n", + " 1665 0.001 0.000 0.002 0.000 core.py:1310(_replace_dtype_fields)\n", + " 1185 0.001 0.000 0.008 0.000 fromnumeric.py:2367(all)\n", + " 256 0.001 0.000 0.022 0.000 quantity.py:1527(_to_own_unit)\n", + " 2778 0.001 0.000 0.007 0.000 {method 'any' of 'numpy.ndarray' objects}\n", " 700 0.001 0.000 0.004 0.000 helpers.py:179(helper_radian_to_dimensionless)\n", - " 2 0.001 0.001 0.021 0.011 daofinder.py:387(make_cutouts)\n", - " 196 0.001 0.000 0.002 0.000 artist.py:149(__init__)\n", - " 1325 0.001 0.000 0.007 0.000 transforms.py:2508(composite_transform_factory)\n", - " 1185 0.001 0.000 0.007 0.000 fromnumeric.py:2367(all)\n", - " 691 0.001 0.000 0.069 0.000 nanfunctions.py:1028(nanmedian)\n", + " 2802 0.001 0.000 0.002 0.000 numerictypes.py:284(issubclass_)\n", + " 831 0.001 0.000 0.006 0.000 core.py:1550(make_mask)\n", + " 1325 0.001 0.000 0.009 0.000 transforms.py:2508(composite_transform_factory)\n", + " 2 0.001 0.001 0.026 0.013 peakfinder.py:18(find_peaks)\n", + " 765 0.001 0.000 0.001 0.000 {built-in method numpy.empty}\n", + " 578 0.001 0.000 0.021 0.000 utils.py:140(extract_array)\n", + " 1384 0.001 0.000 0.006 0.000 core.py:1419(getmaskarray)\n", + " 808 0.001 0.000 0.002 0.000 core.py:666(_get_physical_type_id)\n", + " 1014 0.001 0.000 0.001 0.000 {method '__reduce_ex__' of 'object' objects}\n", + " 474 0.001 0.000 0.177 0.000 _differentiable_functions.py:129(fun_wrapped)\n", + " 691 0.001 0.000 0.066 0.000 nanfunctions.py:1028(nanmedian)\n", + " 276 0.001 0.000 0.003 0.000 parameter.py:417()\n", + " 148 0.001 0.000 0.015 0.000 patches.py:59(__init__)\n", " 2776 0.001 0.000 0.001 0.000 transforms.py:107(__init__)\n", - " 5014 0.001 0.000 0.001 0.000 {built-in method builtins.max}\n", - " 1394 0.001 0.000 0.009 0.000 quantity.py:625(_result_as_quantity)\n", + " 5901 0.001 0.000 0.002 0.000 parameter.py:814(value)\n", " 1245 0.001 0.000 0.002 0.000 transforms.py:1783(__init__)\n", - " 3247 0.001 0.000 0.008 0.000 _methods.py:54(_any)\n", - " 980 0.001 0.000 0.001 0.000 {method '__deepcopy__' of 'numpy.ndarray' objects}\n", - " 3 0.001 0.000 0.001 0.000 arraypad.py:86(_pad_simple)\n", - " 808 0.001 0.000 0.002 0.000 core.py:666(_get_physical_type_id)\n", - " 578 0.001 0.000 0.020 0.000 utils.py:140(extract_array)\n", - " 256 0.001 0.000 0.019 0.000 quantity.py:1527(_to_own_unit)\n", - " 670 0.001 0.000 0.002 0.000 shape_base.py:23(atleast_1d)\n", - " 700 0.001 0.000 0.007 0.000 fromnumeric.py:2123(sum)\n", + " 21 0.001 0.000 0.108 0.005 zernike.py:205(zernike)\n", + " 196 0.001 0.000 0.002 0.000 artist.py:149(__init__)\n", + " 4740 0.001 0.000 0.001 0.000 {built-in method builtins.max}\n", + " 1394 0.001 0.000 0.009 0.000 quantity.py:625(_result_as_quantity)\n", + " 276 0.001 0.000 0.001 0.000 minimizer.py:2407()\n", + " 356 0.001 0.000 0.003 0.000 core.py:2109(_prepare_outputs_single_model)\n", + " 157 0.001 0.000 0.019 0.000 artist.py:759(set_clip_path)\n", " 1002 0.001 0.000 0.001 0.000 __init__.py:276(process)\n", - " 1610 0.001 0.000 0.002 0.000 core.py:4028(_delegate_binop)\n", - " 157 0.001 0.000 0.017 0.000 artist.py:759(set_clip_path)\n", - " 5525 0.001 0.000 0.001 0.000 data_info.py:307(__init__)\n", - " 1935 0.001 0.000 0.001 0.000 core.py:1278(_replace_dtype_fields_recursive)\n", - " 1 0.001 0.001 0.001 0.001 minimizer.py:830(_calculate_uncertainties_correlations)\n", - " 690 0.001 0.000 0.056 0.000 nanfunctions.py:960(_nanmedian1d)\n", - " 953 0.001 0.000 0.009 0.000 fromnumeric.py:2638(amax)\n", - " 644 0.001 0.000 0.004 0.000 core.py:3667(fill_value)\n", - " 162 0.001 0.000 0.003 0.000 core.py:2320(_initialize_constraints)\n", - " 254 0.001 0.000 0.004 0.000 core.py:992(_validate_input_shapes)\n", + " 671 0.001 0.000 0.002 0.000 shape_base.py:23(atleast_1d)\n", + " 320 0.001 0.000 0.003 0.000 transforms.py:767(__init__)\n", " 2526 0.001 0.000 0.001 0.000 core.py:2348(decompose)\n", - " 2590 0.001 0.000 0.001 0.000 core.py:3421(shape)\n", - " 6044 0.001 0.000 0.001 0.000 {function Section.__getitem__ at 0x7f27b4b525e0}\n", - " 695 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", + " 953 0.001 0.000 0.009 0.000 fromnumeric.py:2638(amax)\n", " 142 0.001 0.000 0.008 0.000 patches.py:1517(_recompute_transform)\n", + " 356 0.001 0.000 0.071 0.000 core.py:916(_pre_evaluate)\n", + " 356 0.001 0.000 0.004 0.000 core.py:992(_validate_input_shapes)\n", + " 690 0.001 0.000 0.054 0.000 nanfunctions.py:960(_nanmedian1d)\n", + " 694 0.001 0.000 0.009 0.000 fromnumeric.py:3322(mean)\n", + " 6399 0.001 0.000 0.001 0.000 numeric.py:421(_count_nonzero_dispatcher)\n", + " 1185 0.001 0.000 0.010 0.000 <__array_function__ internals>:2(all)\n", + " 299 0.001 0.000 0.005 0.000 transforms.py:1996(rotate)\n", + " 276 0.001 0.000 0.006 0.000 minimizer.py:2374(_nan_policy)\n", " 963 0.001 0.000 0.005 0.000 fromnumeric.py:2268(any)\n", - " 967 0.001 0.000 0.002 0.000 parameters.py:607(model)\n", - " 320 0.001 0.000 0.002 0.000 transforms.py:767(__init__)\n", - " 1185 0.001 0.000 0.009 0.000 <__array_function__ internals>:2(all)\n", + " 2797 0.001 0.000 0.006 0.000 _methods.py:54(_any)\n", + " 985 0.001 0.000 0.001 0.000 {method '__deepcopy__' of 'numpy.ndarray' objects}\n", + " 5300 0.001 0.000 0.001 0.000 data_info.py:307(__init__)\n", + " 142 0.001 0.000 0.069 0.000 _base.py:2350(add_patch)\n", + " 2230 0.001 0.000 0.001 0.000 core.py:3421(shape)\n", + " 2544 0.001 0.000 0.001 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", + " 696 0.001 0.000 0.001 0.000 {method 'take' of 'numpy.ndarray' objects}\n", + " 1 0.001 0.001 0.042 0.042 {built-in method scipy.ndimage._nd_image.generic_filter}\n", + " 143 0.001 0.000 0.002 0.000 transforms.py:869(update_from_path)\n", " 1499 0.001 0.000 0.001 0.000 :398(parent)\n", - " 643 0.001 0.000 0.037 0.000 core.py:4150(__sub__)\n", + " 1665 0.001 0.000 0.001 0.000 core.py:1278(_replace_dtype_fields_recursive)\n", + " 98 0.001 0.000 0.001 0.000 utils.py:187(poly_map_domain)\n", + " 456 0.001 0.000 0.002 0.000 transforms.py:2044(translate)\n", + " 143 0.001 0.000 0.001 0.000 {built-in method matplotlib._path.update_path_extents}\n", + " 2448 0.001 0.000 0.001 0.000 _collections_abc.py:868(__iter__)\n", " 2208 0.001 0.000 0.001 0.000 quantity.py:749(_set_unit)\n", - " 326 0.001 0.000 0.004 0.000 core.py:3731(filled)\n", - " 6399 0.001 0.000 0.001 0.000 numeric.py:421(_count_nonzero_dispatcher)\n", - " 299 0.001 0.000 0.004 0.000 transforms.py:1996(rotate)\n", - " 1 0.001 0.001 0.044 0.044 {built-in method scipy.ndimage._nd_image.generic_filter}\n", - " 254 0.001 0.000 0.069 0.000 core.py:916(_pre_evaluate)\n", - " 1936 0.001 0.000 0.001 0.000 parameters.py:634(_create_value_wrapper)\n", - " 1325 0.001 0.000 0.002 0.000 re.py:188(match)\n", + " 927 0.001 0.000 0.014 0.000 core.py:1030(_get_converter)\n", " 1556 0.001 0.000 0.001 0.000 {method 'match' of 're.Pattern' objects}\n", - " 927 0.001 0.000 0.013 0.000 core.py:1030(_get_converter)\n", - " 94 0.001 0.000 0.001 0.000 utils.py:187(poly_map_domain)\n", - " 4776 0.001 0.000 0.001 0.000 quantity.py:917(unit)\n", - " 2409 0.001 0.000 0.001 0.000 {method 'ravel' of 'numpy.ndarray' objects}\n", - " 5532 0.001 0.000 0.001 0.000 column.py:617(name)\n", - " 142 0.001 0.000 0.059 0.000 _base.py:2350(add_patch)\n", - " 143 0.001 0.000 0.005 0.000 _base.py:2457(update_datalim)\n", - " 6888 0.001 0.000 0.001 0.000 parameter.py:798(_getval)\n", - " 1073 0.001 0.000 0.004 0.000 colors.py:152(to_rgba)\n", - " 963 0.001 0.000 0.007 0.000 <__array_function__ internals>:2(any)\n", - " 5446 0.001 0.000 0.001 0.000 {function BaseColumn.__array_wrap__ at 0x7f27b3696ca0}\n", + " 6044 0.001 0.000 0.001 0.000 {function Section.__getitem__ at 0x7f2d6cd79820}\n", " 14 0.001 0.000 0.005 0.000 nanfunctions.py:1427(nanvar)\n", - " 2650 0.001 0.000 0.001 0.000 _ufunc_config.py:425(__init__)\n", + " 967 0.001 0.000 0.002 0.000 parameters.py:607(model)\n", + " 163 0.001 0.000 0.002 0.000 core.py:2320(_initialize_constraints)\n", + " 4776 0.001 0.000 0.001 0.000 quantity.py:917(unit)\n", " 1426 0.001 0.000 0.003 0.000 <__array_function__ internals>:2(copy)\n", - " 953 0.001 0.000 0.010 0.000 <__array_function__ internals>:2(amax)\n", - " 1112 0.001 0.000 0.003 0.000 colors.py:106(_is_nth_color)\n", - " 5549 0.001 0.000 0.001 0.000 column.py:821(unit)\n", - " 1367 0.001 0.000 0.001 0.000 re.py:289(_compile)\n", - " 4638 0.001 0.000 0.001 0.000 artist.py:832(get_animated)\n", - " 4425 0.001 0.000 0.001 0.000 {method 'pop' of 'dict' objects}\n", - " 142 0.001 0.000 0.016 0.000 patches.py:1488(__init__)\n", - " 852/568 0.001 0.000 0.010 0.000 transforms.py:2395(__eq__)\n", - " 160 0.001 0.000 0.001 0.000 wfs.py:1632(onmirror)\n", - " 456 0.001 0.000 0.001 0.000 transforms.py:2044(translate)\n", - " 157 0.001 0.000 0.010 0.000 patches.py:747(get_patch_transform)\n", - " 575 0.001 0.000 0.001 0.000 core.py:2367(is_unity)\n", - " 7311 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", - " 694 0.001 0.000 0.011 0.000 <__array_function__ internals>:2(mean)\n", - " 44 0.001 0.000 0.003 0.000 numeric.py:2257(isclose)\n", - " 1325 0.001 0.000 0.008 0.000 transforms.py:1348(__add__)\n", - " 143 0.001 0.000 0.001 0.000 {built-in method matplotlib._path.update_path_extents}\n", + " 1385 0.001 0.000 0.001 0.000 core.py:4028(_delegate_binop)\n", + " 1325 0.001 0.000 0.002 0.000 re.py:188(match)\n", + " 454 0.001 0.000 0.002 0.000 core.py:1074(_get_renamed_inputs_as_positional)\n", + " 691 0.001 0.000 0.047 0.000 <__array_function__ internals>:2(median)\n", + " 852/568 0.001 0.000 0.012 0.000 transforms.py:2395(__eq__)\n", + " 1325 0.001 0.000 0.010 0.000 transforms.py:1348(__add__)\n", + " 4739 0.001 0.000 0.001 0.000 {method 'pop' of 'dict' objects}\n", " 1111 0.001 0.000 0.008 0.000 <__array_function__ internals>:2(reshape)\n", - " 2 0.001 0.000 0.001 0.000 {built-in method io.open}\n", - " 5227 0.001 0.000 0.001 0.000 fromnumeric.py:1924(_shape_dispatcher)\n", - " 1388 0.001 0.000 0.002 0.000 converters.py:171()\n", + " 157 0.001 0.000 0.012 0.000 patches.py:747(get_patch_transform)\n", + " 554 0.001 0.000 0.003 0.000 core.py:3667(fill_value)\n", + " 143 0.001 0.000 0.006 0.000 _base.py:2457(update_datalim)\n", + " 953 0.001 0.000 0.010 0.000 <__array_function__ internals>:2(amax)\n", + " 963 0.001 0.000 0.007 0.000 <__array_function__ internals>:2(any)\n", " 574 0.001 0.000 0.001 0.000 __init__.py:2014(_setattr_cm)\n", - " 967 0.001 0.000 0.003 0.000 core.py:1639(make_mask_none)\n", - " 142 0.001 0.000 0.011 0.000 transforms.py:1389(contains_branch)\n", - " 930 0.001 0.000 0.001 0.000 transforms.py:170(invalidate)\n", + " 930 0.001 0.000 0.002 0.000 transforms.py:170(invalidate)\n", " 1011/930 0.001 0.000 0.001 0.000 transforms.py:180(_invalidate_internal)\n", - " 312 0.001 0.000 0.002 0.000 transforms.py:1900(__init__)\n", + " 454 0.001 0.000 0.001 0.000 core.py:1075(_keyword2positional)\n", + " 281 0.001 0.000 0.003 0.000 core.py:3731(filled)\n", + " 5307 0.001 0.000 0.001 0.000 column.py:617(name)\n", + " 575 0.001 0.000 0.001 0.000 core.py:2367(is_unity)\n", + " 553 0.001 0.000 0.029 0.000 core.py:4150(__sub__)\n", + " 1 0.001 0.001 0.001 0.001 minimizer.py:830(_calculate_uncertainties_correlations)\n", + " 143 0.001 0.000 0.001 0.000 _base.py:2170(_deprecate_noninstance)\n", + " 17 0.001 0.000 0.001 0.000 nanfunctions.py:68(_replace_nan)\n", + " 404 0.001 0.000 0.009 0.000 core.py:1015(get_err_str)\n", + " 1367 0.001 0.000 0.001 0.000 re.py:289(_compile)\n", + " 1073 0.001 0.000 0.003 0.000 colors.py:152(to_rgba)\n", + " 694 0.001 0.000 0.010 0.000 <__array_function__ internals>:2(mean)\n", + " 142 0.001 0.000 0.013 0.000 transforms.py:1389(contains_branch)\n", + " 44 0.001 0.000 0.003 0.000 numeric.py:2257(isclose)\n", + " 404 0.001 0.000 0.005 0.000 core.py:1479(physical_type)\n", " 1758 0.001 0.000 0.001 0.000 utils.py:131()\n", - " 1287 0.001 0.000 0.004 0.000 core.py:582(filled)\n", - " 254 0.001 0.000 0.001 0.000 core.py:1989(_validate_input_units)\n", + " 419 0.001 0.000 0.001 0.000 {method 'flatten' of 'numpy.ndarray' objects}\n", + " 5324 0.001 0.000 0.001 0.000 column.py:821(unit)\n", + " 4638 0.001 0.000 0.001 0.000 artist.py:832(get_animated)\n", + " 5221 0.001 0.000 0.001 0.000 {function BaseColumn.__array_wrap__ at 0x7f2d6b8c7ee0}\n", + " 5118 0.001 0.000 0.001 0.000 fromnumeric.py:1924(_shape_dispatcher)\n", + " 160 0.001 0.000 0.001 0.000 wfs.py:1635(onmirror)\n", + " 2290 0.001 0.000 0.001 0.000 _ufunc_config.py:425(__init__)\n", + " 1388 0.001 0.000 0.002 0.000 converters.py:171()\n", + " 803 0.001 0.000 0.002 0.000 generic.py:28(_to_string)\n", + " 7042 0.001 0.000 0.001 0.000 {built-in method builtins.callable}\n", + " 1 0.001 0.001 0.041 0.041 detect.py:301(detect_sources)\n", + " 1112 0.001 0.000 0.003 0.000 colors.py:106(_is_nth_color)\n", + " 1936 0.001 0.000 0.001 0.000 parameters.py:634(_create_value_wrapper)\n", + " 356 0.001 0.000 0.001 0.000 core.py:1989(_validate_input_units)\n", + " 1 0.001 0.001 0.258 0.258 wfs.py:1799(process_image)\n", + " 3 0.001 0.000 0.001 0.000 arraypad.py:86(_pad_simple)\n", + " 404 0.001 0.000 0.003 0.000 physical.py:489(get_physical_type)\n", " 995 0.001 0.000 0.002 0.000 artist.py:405(pchanged)\n", - " 404 0.001 0.000 0.008 0.000 core.py:1015(get_err_str)\n", - " 691 0.001 0.000 0.070 0.000 <__array_function__ internals>:2(nanmedian)\n", - " 207 0.001 0.000 0.461 0.002 core.py:397(__call__)\n", - " 418 0.001 0.000 0.001 0.000 {method 'flatten' of 'numpy.ndarray' objects}\n", - " 691 0.001 0.000 0.050 0.000 <__array_function__ internals>:2(median)\n", - " 395 0.001 0.000 0.148 0.000 _numdiff.py:436(fun_wrapped)\n", - " 691 0.001 0.000 0.049 0.000 function_base.py:3573(median)\n", - " 1026 0.001 0.000 0.002 0.000 copy.py:210()\n", - " 404 0.001 0.000 0.004 0.000 core.py:1479(physical_type)\n", - " 529/528 0.001 0.000 0.002 0.000 core.py:818(__mul__)\n", - " 2578 0.001 0.000 0.001 0.000 parameters.py:405(shape)\n", - " 1935 0.001 0.000 0.003 0.000 core.py:1324(make_mask_descr)\n", - " 691 0.001 0.000 0.066 0.000 nanfunctions.py:977(_nanmedian)\n", - " 5 0.001 0.000 0.001 0.000 linalg.py:2169(lstsq)\n", - " 1 0.001 0.001 0.039 0.039 detect.py:301(detect_sources)\n", - " 254 0.001 0.000 0.005 0.000 core.py:2135(prepare_outputs)\n", + " 454/258 0.001 0.000 0.313 0.001 core.py:1020(_generic_evaluate)\n", " 1758 0.001 0.000 0.001 0.000 utils.py:123()\n", - " 160 0.001 0.000 0.002 0.000 converters.py:283(check_output)\n", - " 803 0.001 0.000 0.001 0.000 generic.py:28(_to_string)\n", - " 677 0.001 0.000 0.052 0.000 _utils.py:59(nanmedian)\n", - " 163 0.001 0.000 0.001 0.000 core.py:805(_initialize_unit_support)\n", - " 644 0.001 0.000 0.002 0.000 core.py:225(default_fill_value)\n", - " 404 0.001 0.000 0.003 0.000 physical.py:489(get_physical_type)\n", - " 301/207 0.001 0.000 0.398 0.002 core.py:1020(_generic_evaluate)\n", - " 1813 0.001 0.000 0.001 0.000 _collections_abc.py:868(__iter__)\n", - " 974 0.001 0.000 0.002 0.000 <__array_function__ internals>:2(size)\n", - " 6741 0.001 0.000 0.001 0.000 parameter.py:759()\n", - " 329 0.001 0.000 0.001 0.000 parameters.py:491(bounds)\n", - " 729 0.001 0.000 0.003 0.000 <__array_function__ internals>:2(where)\n", - " 644 0.001 0.000 0.042 0.000 core.py:4222(__pow__)\n", + " 581 0.001 0.000 0.003 0.000 <__array_function__ internals>:2(dot)\n", + " 1 0.001 0.001 0.001 0.001 core.py:566(relabel_consecutive)\n", + " 404 0.001 0.000 0.001 0.000 physical.py:181(_standardize_physical_type_names)\n", + " 142 0.001 0.000 0.015 0.000 patches.py:1488(__init__)\n", + " 312 0.001 0.000 0.002 0.000 transforms.py:1900(__init__)\n", " 526 0.001 0.000 0.003 0.000 helpers.py:204(helper_multiplication)\n", - " 301 0.001 0.000 0.001 0.000 core.py:1075(_keyword2positional)\n", + " 691 0.001 0.000 0.067 0.000 <__array_function__ internals>:2(nanmedian)\n", + " 5943 0.001 0.000 0.001 0.000 parameter.py:798(_getval)\n", + " 165 0.001 0.000 0.001 0.000 core.py:805(_initialize_unit_support)\n", + " 395 0.001 0.000 0.149 0.000 _numdiff.py:436(fun_wrapped)\n", + " 155 0.001 0.000 0.001 0.000 transforms.py:2057(scale)\n", + " 529/528 0.001 0.000 0.002 0.000 core.py:818(__mul__)\n", " 1111 0.001 0.000 0.006 0.000 fromnumeric.py:198(reshape)\n", + " 142 0.001 0.000 0.001 0.000 mask.py:30(__init__)\n", + " 270 0.001 0.000 0.001 0.000 {built-in method numpy.arange}\n", + " 1041 0.001 0.000 0.002 0.000 copy.py:210()\n", + " 691 0.001 0.000 0.046 0.000 function_base.py:3573(median)\n", + " 2312 0.001 0.000 0.001 0.000 parameters.py:405(shape)\n", + " 691 0.001 0.000 0.064 0.000 nanfunctions.py:977(_nanmedian)\n", + " 5 0.001 0.000 0.001 0.000 linalg.py:2169(lstsq)\n", " 2 0.001 0.000 0.001 0.000 astutils.py:363(make_symbol_table)\n", - " 301 0.001 0.000 0.001 0.000 core.py:1074(_get_renamed_inputs_as_positional)\n", - " 1 0.001 0.001 0.003 0.003 interval.py:238(get_limits)\n", - " 155 0.001 0.000 0.001 0.000 transforms.py:2057(scale)\n", - " 404 0.001 0.000 0.001 0.000 physical.py:181(_standardize_physical_type_names)\n", - " 1148 0.001 0.000 0.001 0.000 core.py:2168(decompose)\n", - " 268 0.001 0.000 0.001 0.000 {built-in method numpy.arange}\n", - " 700 0.001 0.000 0.008 0.000 <__array_function__ internals>:2(sum)\n", - " 980 0.001 0.000 0.004 0.000 {built-in method _functools.reduce}\n", + " 356 0.001 0.000 0.002 0.000 core.py:2080(_process_output_units)\n", + " 100 0.001 0.000 0.001 0.000 core.py:2555(_array_to_parameters)\n", + " 160 0.001 0.000 0.002 0.000 converters.py:283(check_output)\n", + " 356 0.001 0.000 0.004 0.000 core.py:2135(prepare_outputs)\n", + " 1640 0.001 0.000 0.001 0.000 {built-in method builtins.iter}\n", + " 1 0.001 0.001 0.002 0.002 interval.py:238(get_limits)\n", + " 1107 0.001 0.000 0.004 0.000 core.py:582(filled)\n", " 1136 0.001 0.000 0.001 0.000 transforms.py:1363(_iter_break_from_left_to_right)\n", - " 1 0.001 0.001 0.001 0.001 core.py:566(relabel_consecutive)\n", - " 700 0.001 0.000 0.001 0.000 quantity.py:1261(__float__)\n", - " 817 0.001 0.000 0.001 0.000 {built-in method _abc._abc_subclasscheck}\n", - " 708 0.001 0.000 0.004 0.000 helpers.py:29(get_converter)\n", - " 2020 0.001 0.000 0.002 0.000 copy.py:263()\n", - " 254 0.001 0.000 0.002 0.000 core.py:2080(_process_output_units)\n", - " 299 0.000 0.000 0.021 0.000 patches.py:276(get_transform)\n", - " 322 0.000 0.000 0.001 0.000 parameter.py:215(update_constraints)\n", - " 168 0.000 0.000 0.001 0.000 __init__.py:1691(normalize_kwargs)\n", - " 644 0.000 0.000 0.001 0.000 core.py:270(_scalar_fill_value)\n", - " 443 0.000 0.000 0.002 0.000 patches.py:357(_set_facecolor)\n", - " 443 0.000 0.000 0.002 0.000 patches.py:331(_set_edgecolor)\n", - " 162 0.000 0.000 0.002 0.000 core.py:723(_default_inputs_outputs)\n", - " 967 0.000 0.000 0.003 0.000 core.py:1540(_shrink_mask)\n", - " 142 0.000 0.000 0.001 0.000 mask.py:30(__init__)\n", - " 645 0.000 0.000 0.005 0.000 fromnumeric.py:2763(amin)\n", + " 142 0.001 0.000 0.009 0.000 transforms.py:1426(__sub__)\n", + " 1148 0.001 0.000 0.001 0.000 core.py:2168(decompose)\n", + " 5796 0.001 0.000 0.001 0.000 parameter.py:759()\n", + " 157 0.001 0.000 0.004 0.000 transforms.py:2032(rotate_deg_around)\n", + " 1665 0.001 0.000 0.003 0.000 core.py:1324(make_mask_descr)\n", + " 645 0.001 0.000 0.005 0.000 fromnumeric.py:2763(amin)\n", + " 677 0.001 0.000 0.050 0.000 _utils.py:59(nanmedian)\n", + " 832 0.001 0.000 0.002 0.000 core.py:1639(make_mask_none)\n", + " 2046 0.000 0.000 0.002 0.000 copy.py:263()\n", + " 975 0.000 0.000 0.002 0.000 <__array_function__ internals>:2(size)\n", " 576 0.000 0.000 0.002 0.000 units.py:56(_is_natively_supported)\n", - " 67 0.000 0.000 0.001 0.000 function_base.py:1164(diff)\n", - " 690 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(nonzero)\n", - " 415 0.000 0.000 0.020 0.000 fromnumeric.py:667(partition)\n", - " 1 0.000 0.000 0.017 0.017 circle.py:159(_to_patch)\n", - " 1375 0.000 0.000 0.000 0.000 {built-in method builtins.iter}\n", + " 299 0.000 0.000 0.024 0.000 patches.py:276(get_transform)\n", + " 708 0.000 0.000 0.003 0.000 helpers.py:29(get_converter)\n", " 2916 0.000 0.000 0.000 0.000 {built-in method builtins.min}\n", - " 1560 0.000 0.000 0.001 0.000 core.py:1971(__call__)\n", - " 103 0.000 0.000 0.005 0.000 quantity.py:1115(__mul__)\n", + " 168 0.000 0.000 0.001 0.000 __init__.py:1691(normalize_kwargs)\n", + " 443 0.000 0.000 0.002 0.000 patches.py:357(_set_facecolor)\n", + " 700 0.000 0.000 0.001 0.000 quantity.py:1261(__float__)\n", + " 710/284 0.000 0.000 0.001 0.000 transforms.py:2408()\n", " 3456 0.000 0.000 0.000 0.000 converters.py:176()\n", - " 579 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(dot)\n", - " 254 0.000 0.000 0.001 0.000 core.py:1800(return_units)\n", - " 12 0.000 0.000 0.001 0.000 index_tricks.py:148(__getitem__)\n", - " 142 0.000 0.000 0.008 0.000 transforms.py:1426(__sub__)\n", " 160 0.000 0.000 0.001 0.000 transforms.py:1100(__init__)\n", - " 1 0.000 0.000 0.258 0.258 wfs.py:1796(process_image)\n", - " 981 0.000 0.000 0.001 0.000 copyreg.py:94(__newobj__)\n", - " 322 0.000 0.000 0.000 0.000 parameter.py:221()\n", + " 1 0.000 0.000 0.016 0.016 circle.py:159(_to_patch)\n", + " 554 0.000 0.000 0.035 0.000 core.py:4222(__pow__)\n", + " 690 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(nonzero)\n", + " 554 0.000 0.000 0.002 0.000 core.py:225(default_fill_value)\n", + " 516 0.000 0.000 0.001 0.000 core.py:962(_validate_input_shape)\n", + " 415 0.000 0.000 0.018 0.000 fromnumeric.py:667(partition)\n", + " 640 0.000 0.000 0.002 0.000 <__array_function__ internals>:2(where)\n", + " 2438 0.000 0.000 0.000 0.000 __init__.py:1053(__getitem__)\n", + " 954 0.000 0.000 0.003 0.000 {built-in method _functools.reduce}\n", + " 160 0.000 0.000 0.361 0.002 core.py:397(__call__)\n", + " 443 0.000 0.000 0.002 0.000 patches.py:331(_set_edgecolor)\n", + " 2 0.000 0.000 0.014 0.007 daofinder.py:460(daofind_marginal_fit)\n", + " 356 0.000 0.000 0.001 0.000 core.py:1800(return_units)\n", " 153 0.000 0.000 0.002 0.000 path.py:99(__init__)\n", - " 710/284 0.000 0.000 0.001 0.000 transforms.py:2408()\n", - " 966 0.000 0.000 0.000 0.000 core.py:653()\n", - " 670 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(atleast_1d)\n", - " 295 0.000 0.000 0.001 0.000 patches.py:398(set_linewidth)\n", - " 17 0.000 0.000 0.001 0.000 nanfunctions.py:68(_replace_nan)\n", - " 47 0.000 0.000 0.003 0.000 polynomial.py:1044(evaluate)\n", - " 48 0.000 0.000 0.001 0.000 core.py:2555(_array_to_parameters)\n", - " 508 0.000 0.000 0.001 0.000 core.py:962(_validate_input_shape)\n", - " 1 0.000 0.000 1.514 1.514 wfs.py:945(measure_slopes)\n", - " 2678 0.000 0.000 0.000 0.000 parameters.py:346(unit)\n", - " 645 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(amin)\n", " 646 0.000 0.000 0.001 0.000 function_base.py:244(iterable)\n", + " 103 0.000 0.000 0.005 0.000 quantity.py:1115(__mul__)\n", + " 204 0.000 0.000 0.004 0.000 core.py:1167(parameters)\n", + " 404 0.000 0.000 0.002 0.000 physical.py:340(__eq__)\n", + " 1560 0.000 0.000 0.001 0.000 core.py:1971(__call__)\n", + " 328 0.000 0.000 0.001 0.000 parameters.py:491(bounds)\n", + " 823 0.000 0.000 0.000 0.000 {built-in method _abc._abc_subclasscheck}\n", + " 102 0.000 0.000 0.004 0.000 fitting.py:1659(_model_to_fit_params)\n", + " 262 0.000 0.000 0.002 0.000 numeric.py:218(ones_like)\n", + " 832 0.000 0.000 0.003 0.000 core.py:1540(_shrink_mask)\n", + " 146 0.000 0.000 0.002 0.000 _base.py:1099(_set_artist_props)\n", + " 554 0.000 0.000 0.001 0.000 core.py:270(_scalar_fill_value)\n", " 612 0.000 0.000 0.002 0.000 artist.py:242(convert_xunits)\n", + " 908 0.000 0.000 0.001 0.000 core.py:932(get_bounding_box)\n", + " 645 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(amin)\n", + " 277 0.000 0.000 0.001 0.000 parameter.py:215(update_constraints)\n", + " 671 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(atleast_1d)\n", + " 11 0.000 0.000 0.001 0.000 index_tricks.py:148(__getitem__)\n", + " 404 0.000 0.000 0.001 0.000 __init__.py:39(get_format)\n", + " 284 0.000 0.000 0.006 0.000 transforms.py:2166(__eq__)\n", + " 356 0.000 0.000 0.036 0.000 core.py:1972()\n", " 287 0.000 0.000 0.000 0.000 contextlib.py:86(__init__)\n", - " 602 0.000 0.000 0.000 0.000 core.py:932(get_bounding_box)\n", - " 1426 0.000 0.000 0.001 0.000 function_base.py:726(copy)\n", - " 640 0.000 0.000 0.003 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.011 0.006 daofinder.py:460(daofind_marginal_fit)\n", - " 404 0.000 0.000 0.002 0.000 physical.py:340(__eq__)\n", + " 98 0.000 0.000 0.001 0.000 polynomial.py:949(horner)\n", + " 8 0.000 0.000 0.000 0.000 {method 'seek' of '_io.FileIO' objects}\n", + " 2746 0.000 0.000 0.000 0.000 parameters.py:346(unit)\n", " 1423 0.000 0.000 0.001 0.000 transforms.py:222()\n", - " 124 0.000 0.000 0.001 0.000 core.py:836(__rmul__)\n", - " 690 0.000 0.000 0.002 0.000 fromnumeric.py:1829(nonzero)\n", - " 2000 0.000 0.000 0.000 0.000 __init__.py:1053(__getitem__)\n", + " 153 0.000 0.000 0.001 0.000 path.py:191(_update_values)\n", + " 1426 0.000 0.000 0.001 0.000 function_base.py:726(copy)\n", + " 988 0.000 0.000 0.001 0.000 copyreg.py:94(__newobj__)\n", + " 295 0.000 0.000 0.001 0.000 patches.py:398(set_linewidth)\n", + " 124 0.000 0.000 0.002 0.000 core.py:836(__rmul__)\n", + " 245 0.000 0.000 0.001 0.000 {method 'all' of 'numpy.generic' objects}\n", + " 1 0.000 0.000 1.441 1.441 wfs.py:948(measure_slopes)\n", + " 1 0.000 0.000 0.006 0.006 circle.py:27(to_mask)\n", + " 98 0.000 0.000 0.034 0.000 fitting.py:1063(objective_function)\n", + " 219 0.000 0.000 0.012 0.000 quantity.py:797(_to_value)\n", + " 31 0.000 0.000 0.001 0.000 nanfunctions.py:183(_divide_by_count)\n", + " 642 0.000 0.000 0.003 0.000 {method 'sum' of 'numpy.ndarray' objects}\n", + " 1499 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", + " 195 0.000 0.000 0.001 0.000 artist.py:723(set_figure)\n", + " 163 0.000 0.000 0.002 0.000 core.py:723(_default_inputs_outputs)\n", " 153 0.000 0.000 0.001 0.000 __init__.py:132(check_shape)\n", - " 415 0.000 0.000 0.020 0.000 <__array_function__ internals>:2(partition)\n", - " 644 0.000 0.000 0.001 0.000 core.py:200(_recursive_fill_value)\n", - " 254 0.000 0.000 0.001 0.000 core.py:2093(_prepare_output_single_model)\n", - " 404 0.000 0.000 0.000 0.000 __init__.py:39(get_format)\n", - " 320 0.000 0.000 0.000 0.000 {method 'dot' of 'numpy.ndarray' objects}\n", + " 415 0.000 0.000 0.019 0.000 <__array_function__ internals>:2(partition)\n", + " 831 0.000 0.000 0.000 0.000 core.py:653()\n", + " 690 0.000 0.000 0.002 0.000 fromnumeric.py:1829(nonzero)\n", + " 6 0.000 0.000 0.024 0.004 zernike.py:1161(from_array)\n", " 233 0.000 0.000 0.001 0.000 __init__.py:65(check_isinstance)\n", - " 148 0.000 0.000 0.001 0.000 patches.py:418(set_linestyle)\n", + " 320 0.000 0.000 0.000 0.000 {method 'dot' of 'numpy.ndarray' objects}\n", + " 612 0.000 0.000 0.001 0.000 artist.py:254(convert_yunits)\n", + " 79 0.000 0.000 0.000 0.000 twodim_base.py:234(diag)\n", + " 1716 0.000 0.000 0.000 0.000 core.py:866(__len__)\n", + " 356 0.000 0.000 0.001 0.000 core.py:2093(_prepare_output_single_model)\n", + " 143 0.000 0.000 0.004 0.000 transforms.py:945(update_from_data_xy)\n", + " 601 0.000 0.000 0.001 0.000 core.py:1753(get_format_name)\n", + " 404 0.000 0.000 0.002 0.000 core.py:728(to_string)\n", + " 1 0.000 0.000 0.001 0.001 background_2d.py:262(_prepare_data)\n", + " 1 0.000 0.000 0.078 0.078 signaltools.py:554(fftconvolve)\n", + " 299 0.000 0.000 0.005 0.000 transforms.py:2012(rotate_deg)\n", + " 366 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", + " 277 0.000 0.000 0.000 0.000 parameter.py:221()\n", + " 435 0.000 0.000 0.000 0.000 :1033(_handle_fromlist)\n", + " 98 0.000 0.000 0.021 0.000 core.py:3177(_evaluate)\n", + " 159 0.000 0.000 0.001 0.000 patches.py:739(_convert_units)\n", + " 404 0.000 0.000 0.002 0.000 physical.py:153(_replace_temperatures_with_kelvin)\n", + " 313 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(empty_like)\n", + " 79 0.000 0.000 0.160 0.002 _differentiable_functions.py:152(update_grad)\n", + " 576 0.000 0.000 0.002 0.000 axis.py:1495(convert_units)\n", " 142 0.000 0.000 0.016 0.000 patches.py:1810(__init__)\n", - " 644 0.000 0.000 0.003 0.000 core.py:3085()\n", - " 974 0.000 0.000 0.000 0.000 fromnumeric.py:3169(size)\n", - " 322 0.000 0.000 0.012 0.000 core.py:4132(__add__)\n", - " 1499 0.000 0.000 0.000 0.000 {method 'rpartition' of 'str' objects}\n", - " 146 0.000 0.000 0.002 0.000 _base.py:1099(_set_artist_props)\n", + " 602 0.000 0.000 0.001 0.000 core.py:1238(bounds)\n", + " 196 0.000 0.000 0.022 0.000 quantity.py:1052(__ne__)\n", + " 1880 0.000 0.000 0.000 0.000 multiarray.py:1071(copyto)\n", + " 148 0.000 0.000 0.001 0.000 patches.py:418(set_linestyle)\n", + " 554 0.000 0.000 0.002 0.000 core.py:3085()\n", " 404 0.000 0.000 0.000 0.000 physical.py:200()\n", - " 142 0.000 0.000 0.001 0.000 bounding_box.py:159(get_overlap_slices)\n", - " 219 0.000 0.000 0.011 0.000 quantity.py:797(_to_value)\n", - " 254 0.000 0.000 0.035 0.000 core.py:1972()\n", - " 366 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}\n", - " 153 0.000 0.000 0.001 0.000 path.py:191(_update_values)\n", - " 195 0.000 0.000 0.001 0.000 artist.py:723(set_figure)\n", - " 6 0.000 0.000 0.021 0.003 zernike.py:1160(from_array)\n", - " 305 0.000 0.000 0.001 0.000 artist.py:81(_stale_axes_callback)\n", - " 284 0.000 0.000 0.005 0.000 transforms.py:2166(__eq__)\n", - " 601 0.000 0.000 0.000 0.000 core.py:1753(get_format_name)\n", - " 31 0.000 0.000 0.001 0.000 nanfunctions.py:183(_divide_by_count)\n", " 159 0.000 0.000 0.001 0.000 transforms.py:2586(__init__)\n", - " 143 0.000 0.000 0.003 0.000 transforms.py:945(update_from_data_xy)\n", - " 647 0.000 0.000 0.001 0.000 core.py:7142(reshape)\n", - " 2007 0.000 0.000 0.000 0.000 multiarray.py:1071(copyto)\n", - " 479 0.000 0.000 0.001 0.000 lines.py:61(_scale_dashes)\n", - " 404 0.000 0.000 0.001 0.000 physical.py:153(_replace_temperatures_with_kelvin)\n", - " 79 0.000 0.000 0.000 0.000 twodim_base.py:234(diag)\n", - " 1547 0.000 0.000 0.000 0.000 core.py:866(__len__)\n", - " 47 0.000 0.000 0.001 0.000 polynomial.py:1132(multivariate_horner)\n", - " 54 0.000 0.000 0.001 0.000 font_manager.py:658(__init__)\n", - " 1 0.000 0.000 0.001 0.001 background_2d.py:262(_prepare_data)\n", + " 399 0.000 0.000 0.001 0.000 core.py:661(__repr__)\n", + " 975 0.000 0.000 0.000 0.000 fromnumeric.py:3169(size)\n", + " 401 0.000 0.000 0.001 0.000 parameters.py:333(value)\n", + " 142 0.000 0.000 0.013 0.000 transforms.py:1408(contains_branch_seperately)\n", " 44 0.000 0.000 0.001 0.000 numeric.py:2337(within_tol)\n", - " 299 0.000 0.000 0.004 0.000 transforms.py:2012(rotate_deg)\n", + " 80 0.000 0.000 0.001 0.000 numeric.py:2385(array_equal)\n", + " 479 0.000 0.000 0.001 0.000 lines.py:61(_scale_dashes)\n", " 284 0.000 0.000 0.001 0.000 bounding_box.py:55(__init__)\n", - " 612 0.000 0.000 0.001 0.000 artist.py:254(convert_yunits)\n", - " 1952 0.000 0.000 0.000 0.000 core.py:2294(powers)\n", - " 576 0.000 0.000 0.002 0.000 axis.py:1495(convert_units)\n", - " 1 0.000 0.000 0.113 0.113 zernike.py:1272(total_phase)\n", - " 159 0.000 0.000 0.001 0.000 patches.py:739(_convert_units)\n", - " 18 0.000 0.000 0.002 0.000 lines.py:276(__init__)\n", + " 142 0.000 0.000 0.000 0.000 bounding_box.py:159(get_overlap_slices)\n", + " 425 0.000 0.000 0.000 0.000 misc.py:46(isiterable)\n", " 1931 0.000 0.000 0.000 0.000 core.py:2287(bases)\n", - " 1284 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x55ffbb26f740}\n", - " 245 0.000 0.000 0.001 0.000 {method 'all' of 'numpy.generic' objects}\n", - " 142 0.000 0.000 0.012 0.000 transforms.py:1408(contains_branch_seperately)\n", - " 643 0.000 0.000 0.004 0.000 _methods.py:46(_sum)\n", - " 434 0.000 0.000 0.000 0.000 :1033(_handle_fromlist)\n", + " 356 0.000 0.000 0.000 0.000 core.py:1971()\n", + " 142 0.000 0.000 0.005 0.000 arraysetops.py:640(isin)\n", " 1929 0.000 0.000 0.000 0.000 artist.py:266(axes)\n", - " 481 0.000 0.000 0.001 0.000 core.py:1238(bounds)\n", - " 404 0.000 0.000 0.001 0.000 core.py:728(to_string)\n", - " 142 0.000 0.000 0.002 0.000 patches.py:391(set_alpha)\n", - " 321 0.000 0.000 0.004 0.000 parameter.py:407(valuesdict)\n", + " 79 0.000 0.000 0.190 0.002 _differentiable_functions.py:264(fun_and_grad)\n", + " 160 0.000 0.000 0.003 0.000 transforms.py:822(from_extents)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method io.open}\n", + " 277 0.000 0.000 0.010 0.000 core.py:4132(__add__)\n", + " 18 0.000 0.000 0.002 0.000 lines.py:276(__init__)\n", + " 1004 0.000 0.000 0.000 0.000 core.py:1211(sync_constraints)\n", + " 404 0.000 0.000 0.002 0.000 physical.py:353(__ne__)\n", " 5 0.000 0.000 0.001 0.000 polynomial.py:453(polyfit)\n", - " 142 0.000 0.000 0.001 0.000 mask.py:109(cutout)\n", + " 1 0.000 0.000 0.025 0.025 detect.py:20(detect_threshold)\n", + " 1291 0.000 0.000 0.000 0.000 {built-in method __new__ of type object at 0x561ed2276740}\n", + " 305 0.000 0.000 0.001 0.000 artist.py:81(_stale_axes_callback)\n", + " 554 0.000 0.000 0.001 0.000 core.py:200(_recursive_fill_value)\n", + " 823 0.000 0.000 0.001 0.000 abc.py:121(__subclasscheck__)\n", + " 54 0.000 0.000 0.001 0.000 font_manager.py:658(__init__)\n", " 5 0.000 0.000 0.002 0.000 table.py:1412(_new_from_slice)\n", - " 166/164 0.000 0.000 0.000 0.000 {function Quantity.__array_function__ at 0x7f27b3d20ca0}\n", - " 143 0.000 0.000 0.001 0.000 transforms.py:869(update_from_path)\n", - " 963 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", - " 51 0.000 0.000 0.001 0.000 configuration.py:406(__call__)\n", + " 202 0.000 0.000 0.010 0.000 core.py:983(_apply_equivalencies)\n", + " 557 0.000 0.000 0.001 0.000 core.py:7142(reshape)\n", " 680 0.000 0.000 0.002 0.000 {built-in method builtins.next}\n", - " 196 0.000 0.000 0.019 0.000 quantity.py:1052(__ne__)\n", - " 254 0.000 0.000 0.000 0.000 core.py:1971()\n", - " 79 0.000 0.000 0.158 0.002 _differentiable_functions.py:152(update_grad)\n", - " 647 0.000 0.000 0.000 0.000 core.py:3227(_is_scalar)\n", - " 160 0.000 0.000 0.003 0.000 transforms.py:822(from_extents)\n", - " 399 0.000 0.000 0.001 0.000 core.py:661(__repr__)\n", - " 1 0.000 0.000 0.006 0.006 circle.py:27(to_mask)\n", - " 207 0.000 0.000 0.000 0.000 functional_models.py:431(input_units)\n", - " 142 0.000 0.000 0.004 0.000 arraysetops.py:640(isin)\n", - " 694 0.000 0.000 0.000 0.000 core.py:6374(isMaskedArray)\n", - " 254 0.000 0.000 0.000 0.000 core.py:2081()\n", + " 645 0.000 0.000 0.003 0.000 _methods.py:46(_sum)\n", + " 157 0.000 0.000 0.004 0.000 patches.py:842(get_bbox)\n", + " 965 0.000 0.000 0.000 0.000 {method 'transpose' of 'numpy.ndarray' objects}\n", + " 219 0.000 0.000 0.012 0.000 core.py:1101(to)\n", + " 158 0.000 0.000 0.002 0.000 transforms.py:803(unit)\n", + " 262 0.000 0.000 0.002 0.000 <__array_function__ internals>:2(ones_like)\n", + " 206 0.000 0.000 0.001 0.000 quantity.py:1253(__len__)\n", + " 109 0.000 0.000 0.002 0.000 zernike.py:690(__setitem__)\n", + " 12 0.000 0.000 0.020 0.002 sigma_clipping.py:297(_compute_bounds)\n", " 168 0.000 0.000 0.000 0.000 __init__.py:1730()\n", - " 817 0.000 0.000 0.001 0.000 abc.py:121(__subclasscheck__)\n", - " 157 0.000 0.000 0.003 0.000 transforms.py:2032(rotate_deg_around)\n", - " 647 0.000 0.000 0.000 0.000 core.py:778(is_string_or_list_of_strings)\n", - " 404 0.000 0.000 0.002 0.000 physical.py:353(__ne__)\n", - " 966 0.000 0.000 0.000 0.000 _internal.py:906(__init__)\n", - " 109 0.000 0.000 0.002 0.000 zernike.py:689(__setitem__)\n", - " 80 0.000 0.000 0.001 0.000 numeric.py:2385(array_equal)\n", " 803 0.000 0.000 0.002 0.000 generic.py:642(to_string)\n", - " 219 0.000 0.000 0.011 0.000 core.py:1101(to)\n", - " 12 0.000 0.000 0.020 0.002 sigma_clipping.py:297(_compute_bounds)\n", - " 202 0.000 0.000 0.008 0.000 core.py:983(_apply_equivalencies)\n", - " 425 0.000 0.000 0.000 0.000 misc.py:46(isiterable)\n", - " 4 0.000 0.000 0.000 0.000 numeric.py:1679(indices)\n", - " 206 0.000 0.000 0.001 0.000 quantity.py:1253(__len__)\n", + " 695 0.000 0.000 0.000 0.000 core.py:6374(isMaskedArray)\n", + " 1 0.000 0.000 0.114 0.114 zernike.py:1273(total_phase)\n", + " 142 0.000 0.000 0.002 0.000 patches.py:391(set_alpha)\n", + " 1952 0.000 0.000 0.000 0.000 core.py:2294(powers)\n", " 287 0.000 0.000 0.001 0.000 contextlib.py:123(__exit__)\n", - " 217 0.000 0.000 0.000 0.000 __init__.py:184(__init__)\n", - " 98 0.000 0.000 0.003 0.000 core.py:1167(parameters)\n", - " 49 0.000 0.000 0.003 0.000 fitting.py:1659(_model_to_fit_params)\n", + " 276 0.000 0.000 0.003 0.000 parameter.py:407(valuesdict)\n", + " 3 0.000 0.000 0.000 0.000 numeric.py:1679(indices)\n", + " 142 0.000 0.000 0.001 0.000 mask.py:109(cutout)\n", + " 149 0.000 0.000 0.001 0.000 numeric.py:149(ones)\n", " 1 0.000 0.000 0.002 0.002 core.py:178(_centered_edges)\n", + " 15 0.000 0.000 0.000 0.000 stride_tricks.py:339(_broadcast_to)\n", + " 356 0.000 0.000 0.000 0.000 core.py:2081()\n", + " 166/164 0.000 0.000 0.000 0.000 {function Quantity.__array_function__ at 0x7f2d6bf4aee0}\n", " 382 0.000 0.000 0.000 0.000 enum.py:358(__call__)\n", - " 25 0.000 0.000 0.002 0.000 table.py:1182(_convert_data_to_col)\n", - " 47 0.000 0.000 0.027 0.001 fitting.py:1063(objective_function)\n", - " 149 0.000 0.000 0.001 0.000 numeric.py:149(ones)\n", - " 337 0.000 0.000 0.000 0.000 parameters.py:333(value)\n", - " 784 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", - " 149 0.000 0.000 0.001 0.000 artist.py:960(set_alpha)\n", - " 6 0.000 0.000 0.005 0.001 axis.py:57(__init__)\n", - " 157 0.000 0.000 0.003 0.000 patches.py:842(get_bbox)\n", - " 355 0.000 0.000 0.000 0.000 {built-in method builtins.all}\n", + " 51 0.000 0.000 0.001 0.000 configuration.py:406(__call__)\n", + " 217 0.000 0.000 0.000 0.000 __init__.py:184(__init__)\n", " 1185 0.000 0.000 0.000 0.000 fromnumeric.py:2362(_all_dispatcher)\n", - " 808 0.000 0.000 0.000 0.000 core.py:674()\n", - " 644 0.000 0.000 0.000 0.000 core.py:215(_get_dtype_of)\n", - " 2 0.000 0.000 0.003 0.001 core.py:170()\n", + " 831 0.000 0.000 0.000 0.000 _internal.py:906(__init__)\n", + " 177 0.000 0.000 0.000 0.000 fromnumeric.py:1718(ravel)\n", + " 601 0.000 0.000 0.001 0.000 generic.py:622(_get_unit_name)\n", " 202 0.000 0.000 0.000 0.000 core.py:749(_normalize_equivalencies)\n", - " 148 0.000 0.000 0.002 0.000 patches.py:455(set_fill)\n", - " 342 0.000 0.000 0.000 0.000 __init__.py:101(check_in_list)\n", - " 1 0.000 0.000 0.077 0.077 signaltools.py:554(fftconvolve)\n", - " 236 0.000 0.000 0.000 0.000 zernike.py:945(_key_to_l)\n", - " 47 0.000 0.000 0.019 0.000 core.py:3177(_evaluate)\n", + " 510 0.000 0.000 0.000 0.000 _collections_abc.py:783(values)\n", + " 557 0.000 0.000 0.000 0.000 core.py:3227(_is_scalar)\n", + " 149 0.000 0.000 0.001 0.000 artist.py:960(set_alpha)\n", + " 98 0.000 0.000 0.003 0.000 polynomial.py:919(evaluate)\n", + " 808 0.000 0.000 0.000 0.000 core.py:674()\n", + " 142 0.000 0.000 0.000 0.000 {built-in method matplotlib._path.affine_transform}\n", + " 557 0.000 0.000 0.000 0.000 core.py:778(is_string_or_list_of_strings)\n", + " 142 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(isin)\n", + " 356 0.000 0.000 0.000 0.000 {built-in method builtins.all}\n", + " 6 0.000 0.000 0.005 0.001 axis.py:57(__init__)\n", " 83/53 0.000 0.000 0.114 0.002 decorators.py:769(__get__)\n", - " 166/164 0.000 0.000 0.001 0.000 quantity.py:1656(__array_function__)\n", - " 142 0.000 0.000 0.001 0.000 patches.py:1825(set_radius)\n", - " 1 0.000 0.000 0.024 0.024 detect.py:20(detect_threshold)\n", - " 1144 0.000 0.000 0.000 0.000 util.py:750(_is_int)\n", - " 69 0.000 0.000 0.000 0.000 configuration.py:510(get_config)\n", - " 4 0.000 0.000 0.000 0.000 {method 'sort' of 'numpy.ndarray' objects}\n", + " 5 0.000 0.000 0.000 0.000 {method 'read' of '_io.FileIO' objects}\n", + " 160 0.000 0.000 0.000 0.000 functional_models.py:431(input_units)\n", + " 157 0.000 0.000 0.000 0.000 transforms.py:266(x0)\n", + " 345 0.000 0.000 0.000 0.000 core.py:2535(_condition_arg)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", + " 25 0.000 0.000 0.002 0.000 table.py:1182(_convert_data_to_col)\n", " 126 0.000 0.000 0.000 0.000 tokenize.py:429(_tokenize)\n", - " 601 0.000 0.000 0.001 0.000 generic.py:622(_get_unit_name)\n", - " 1040 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", - " 79 0.000 0.000 0.187 0.002 _differentiable_functions.py:264(fun_and_grad)\n", - " 215 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(empty_like)\n", - " 1289 0.000 0.000 0.000 0.000 parameters.py:373(internal_unit)\n", - " 152 0.000 0.000 0.000 0.000 patches.py:477(set_capstyle)\n", - " 207 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(result_type)\n", - " 15 0.000 0.000 0.000 0.000 stride_tricks.py:339(_broadcast_to)\n", - " 164 0.000 0.000 0.001 0.000 numeric.py:218(ones_like)\n", - " 158 0.000 0.000 0.002 0.000 transforms.py:803(unit)\n", - " 142 0.000 0.000 0.000 0.000 {built-in method matplotlib._path.affine_transform}\n", + " 2 0.000 0.000 0.003 0.001 core.py:170()\n", + " 4 0.000 0.000 0.000 0.000 {method 'sort' of 'numpy.ndarray' objects}\n", + " 1248 0.000 0.000 0.000 0.000 core.py:3241(param_names)\n", + " 737 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.normalize_axis_index}\n", + " 1005 0.000 0.000 0.000 0.000 core.py:1780(name)\n", + " 1144 0.000 0.000 0.000 0.000 util.py:750(_is_int)\n", + " 142 0.000 0.000 0.000 0.000 transforms.py:1862(transform_affine)\n", + " 148 0.000 0.000 0.002 0.000 patches.py:455(set_fill)\n", " 1426 0.000 0.000 0.000 0.000 function_base.py:722(_copy_dispatcher)\n", - " 19 0.000 0.000 0.002 0.000 text.py:115(__init__)\n", + " 108 0.000 0.000 0.002 0.000 zernike.py:680(__getitem__)\n", + " 142 0.000 0.000 0.001 0.000 patches.py:1825(set_radius)\n", + " 236 0.000 0.000 0.000 0.000 zernike.py:946(_key_to_l)\n", + " 1352 0.000 0.000 0.000 0.000 parameters.py:373(internal_unit)\n", " 337 0.000 0.000 0.000 0.000 core.py:1047()\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:64(parse_parts)\n", - " 148 0.000 0.000 0.000 0.000 patches.py:511(set_hatch)\n", - " 47 0.000 0.000 0.000 0.000 polynomial.py:1121(invlex_coeff)\n", - " 142 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(isin)\n", - " 674 0.000 0.000 0.000 0.000 core.py:1211(sync_constraints)\n", - " 162 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(can_cast)\n", - " 1 0.000 0.000 2.799 2.799 :1()\n", + " 554 0.000 0.000 0.000 0.000 core.py:215(_get_dtype_of)\n", + " 69 0.000 0.000 0.000 0.000 configuration.py:510(get_config)\n", " 1 0.000 0.000 0.000 0.000 core.py:70(_get_labels)\n", - " 142 0.000 0.000 0.000 0.000 transforms.py:1862(transform_affine)\n", + " 152 0.000 0.000 0.000 0.000 patches.py:477(set_capstyle)\n", + " 299 0.000 0.000 0.000 0.000 artist.py:439(get_transform)\n", + " 98 0.000 0.000 0.002 0.000 polynomial.py:913(prepare_inputs)\n", + " 166/164 0.000 0.000 0.001 0.000 quantity.py:1656(__array_function__)\n", + " 142 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(in1d)\n", + " 332 0.000 0.000 0.001 0.000 _methods.py:60(_all)\n", + " 963 0.000 0.000 0.000 0.000 fromnumeric.py:2263(_any_dispatcher)\n", + " 342 0.000 0.000 0.000 0.000 __init__.py:101(check_in_list)\n", " 1143 0.000 0.000 0.000 0.000 helpers.py:22(_d)\n", - " 570 0.000 0.000 0.000 0.000 transforms.py:1772()\n", - " 56 0.000 0.000 0.000 0.000 font_manager.py:826(set_weight)\n", - " 690 0.000 0.000 0.000 0.000 fromnumeric.py:1825(_nonzero_dispatcher)\n", - " 1005 0.000 0.000 0.000 0.000 core.py:1780(name)\n", - " 345 0.000 0.000 0.000 0.000 core.py:2535(_condition_arg)\n", + " 190 0.000 0.000 0.001 0.000 artist.py:426(set_transform)\n", + " 148 0.000 0.000 0.000 0.000 patches.py:511(set_hatch)\n", + " 399 0.000 0.000 0.000 0.000 core.py:2271(__repr__)\n", + " 198 0.000 0.000 0.001 0.000 quantity.py:1201(quantity_iter)\n", " 287 0.000 0.000 0.001 0.000 contextlib.py:114(__enter__)\n", " 967 0.000 0.000 0.000 0.000 parameters.py:380(internal_unit)\n", - " 157 0.000 0.000 0.000 0.000 transforms.py:266(x0)\n", - " 25 0.000 0.000 0.001 0.000 column.py:395(__new__)\n", - " 287 0.000 0.000 0.001 0.000 contextlib.py:261(helper)\n", - " 108 0.000 0.000 0.002 0.000 zernike.py:679(__getitem__)\n", - " 963 0.000 0.000 0.000 0.000 fromnumeric.py:2263(_any_dispatcher)\n", " 1111 0.000 0.000 0.000 0.000 fromnumeric.py:193(_reshape_dispatcher)\n", - " 16 0.000 0.000 0.002 0.000 ticker.py:433(__init__)\n", - " 166 0.000 0.000 0.000 0.000 lines.py:31(_get_dash_pattern)\n", - " 8 0.000 0.000 0.001 0.000 table.py:660(__init__)\n", - " 164 0.000 0.000 0.000 0.000 parameters.py:308(default)\n", - " 299 0.000 0.000 0.000 0.000 artist.py:439(get_transform)\n", - " 198 0.000 0.000 0.001 0.000 quantity.py:1201(quantity_iter)\n", - " 16 0.000 0.000 0.001 0.000 ticker.py:1986(_validate_steps)\n", - " 876 0.000 0.000 0.000 0.000 quantity.py:666(__quantity_subclass__)\n", - " 148 0.000 0.000 0.000 0.000 patches.py:494(set_joinstyle)\n", - " 919 0.000 0.000 0.000 0.000 core.py:2280(scale)\n", - " 399 0.000 0.000 0.000 0.000 core.py:2271(__repr__)\n", - " 142 0.000 0.000 0.004 0.000 <__array_function__ internals>:2(in1d)\n", - " 148 0.000 0.000 0.000 0.000 hatch.py:182(_validate_hatch_pattern)\n", - " 284 0.000 0.000 0.006 0.000 transforms.py:1726(__eq__)\n", - " 535 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", - " 1 0.000 0.000 0.158 0.158 wfs.py:134(wfsfind)\n", - " 2 0.000 0.000 0.000 0.000 asteval.py:180()\n", - " 190 0.000 0.000 0.001 0.000 artist.py:426(set_transform)\n", + " 287 0.000 0.000 0.001 0.000 contextlib.py:261(helper)\n", + " 570 0.000 0.000 0.000 0.000 transforms.py:1772()\n", + " 1040 0.000 0.000 0.000 0.000 {method 'add' of 'set' objects}\n", + " 20 0.000 0.000 0.000 0.000 function_base.py:1164(diff)\n", + " 207 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(result_type)\n", " 404 0.000 0.000 0.000 0.000 physical.py:367(__str__)\n", - " 953 0.000 0.000 0.000 0.000 fromnumeric.py:2633(_amax_dispatcher)\n", - " 75 0.000 0.000 0.000 0.000 card.py:680(_parse_keyword)\n", - " 694 0.000 0.000 0.000 0.000 fromnumeric.py:3317(_mean_dispatcher)\n", + " 284 0.000 0.000 0.006 0.000 transforms.py:1726(__eq__)\n", + " 177 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(ravel)\n", + " 148 0.000 0.000 0.000 0.000 hatch.py:182(_validate_hatch_pattern)\n", " 2 0.000 0.000 0.001 0.000 background_2d.py:347(_get_box_indices)\n", - " 721 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", - " 162 0.000 0.000 0.000 0.000 core.py:741(_initialize_setters)\n", - " 331 0.000 0.000 0.001 0.000 _methods.py:60(_all)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:710(__hash__)\n", - " 156 0.000 0.000 0.000 0.000 figure.py:46(_stale_figure_callback)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:335(__getitem__)\n", - " 42 0.000 0.000 0.001 0.000 quantity.py:1153(__itruediv__)\n", - " 6 0.000 0.000 0.002 0.000 zernike.py:605(__init__)\n", + " 162 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(can_cast)\n", + " 3 0.000 0.000 0.000 0.000 basic.py:900(inv)\n", + " 568 0.000 0.000 0.000 0.000 transforms.py:2311(get_matrix)\n", + " 3 0.000 0.000 1.095 0.365 minpack.py:279(leastsq)\n", + " 166 0.000 0.000 0.000 0.000 lines.py:31(_get_dash_pattern)\n", + " 56 0.000 0.000 0.000 0.000 font_manager.py:826(set_weight)\n", + " 510 0.000 0.000 0.000 0.000 __init__.py:1066(__iter__)\n", + " 400 0.000 0.000 0.000 0.000 fitting.py:1606()\n", " 863 0.000 0.000 0.000 0.000 transforms.py:2126(get_matrix)\n", + " 8 0.000 0.000 0.001 0.000 table.py:660(__init__)\n", + " 25 0.000 0.000 0.001 0.000 column.py:395(__new__)\n", + " 694 0.000 0.000 0.000 0.000 fromnumeric.py:3317(_mean_dispatcher)\n", + " 217 0.000 0.000 0.001 0.000 zernike.py:937(_valid_key)\n", + " 953 0.000 0.000 0.000 0.000 fromnumeric.py:2633(_amax_dispatcher)\n", " 459 0.000 0.000 0.000 0.000 __init__.py:152()\n", " 355 0.000 0.000 0.000 0.000 artist.py:271(axes)\n", " 170 0.000 0.000 0.000 0.000 {method 'argmin' of 'numpy.ndarray' objects}\n", - " 43 0.000 0.000 0.001 0.000 quantity.py:1126(__imul__)\n", - " 63 0.000 0.000 0.002 0.000 text.py:162(update)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:1607(_set_formatter)\n", - " 1 0.000 0.000 0.077 0.077 core.py:532(plot)\n", - " 126 0.000 0.000 0.000 0.000 fromnumeric.py:1718(ravel)\n", - " 700 0.000 0.000 0.000 0.000 fromnumeric.py:2118(_sum_dispatcher)\n", - " 217 0.000 0.000 0.001 0.000 zernike.py:936(_valid_key)\n", - " 164 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(ones_like)\n", - " 142 0.000 0.000 0.001 0.000 __init__.py:1843(method)\n", - " 2 0.000 0.000 0.000 0.000 basic.py:900(inv)\n", - " 568 0.000 0.000 0.000 0.000 transforms.py:2311(get_matrix)\n", - " 974 0.000 0.000 0.000 0.000 fromnumeric.py:3165(_size_dispatcher)\n", - " 729 0.000 0.000 0.000 0.000 multiarray.py:341(where)\n", - " 719 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", - " 143 0.000 0.000 0.000 0.000 _base.py:2170(_deprecate_noninstance)\n", - " 5 0.000 0.000 0.000 0.000 _methods.py:195(_var)\n", - " 266 0.000 0.000 0.000 0.000 quantity.py:975(isscalar)\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:844(set_stretch)\n", - " 58 0.000 0.000 0.000 0.000 quantity.py:1228(__setitem__)\n", + " 721 0.000 0.000 0.000 0.000 {built-in method builtins.abs}\n", + " 204 0.000 0.000 0.000 0.000 core.py:1248(tied)\n", " 691 0.000 0.000 0.000 0.000 function_base.py:3568(_median_dispatcher)\n", + " 919 0.000 0.000 0.000 0.000 core.py:2280(scale)\n", + " 19 0.000 0.000 0.002 0.000 text.py:115(__init__)\n", + " 535 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}\n", + " 1 0.000 0.000 0.086 0.086 core.py:532(plot)\n", " 165 0.000 0.000 0.000 0.000 __init__.py:1290(_to_unmasked_float_array)\n", - " 42 0.000 0.000 0.001 0.000 parameter.py:119(__setitem__)\n", - " 245 0.000 0.000 0.000 0.000 _collections_abc.py:783(values)\n", + " 204 0.000 0.000 0.000 0.000 core.py:1229(fixed)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:64(parse_parts)\n", + " 63 0.000 0.000 0.002 0.000 text.py:162(update)\n", + " 148 0.000 0.000 0.000 0.000 patches.py:494(set_joinstyle)\n", + " 876 0.000 0.000 0.000 0.000 quantity.py:666(__quantity_subclass__)\n", + " 305 0.000 0.000 0.000 0.000 zernike.py:956(_l_to_key)\n", + " 688 0.000 0.000 0.000 0.000 core.py:754(inputs)\n", + " 156 0.000 0.000 0.000 0.000 figure.py:46(_stale_figure_callback)\n", + " 1 0.000 0.000 0.167 0.167 wfs.py:134(wfsfind)\n", + " 43 0.000 0.000 0.001 0.000 quantity.py:1126(__imul__)\n", + " 6 0.000 0.000 0.002 0.000 zernike.py:606(__init__)\n", + " 426 0.000 0.000 0.000 0.000 transforms.py:1940(get_matrix)\n", + " 674 0.000 0.000 0.000 0.000 {method 'values' of 'dict' objects}\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:844(set_stretch)\n", + " 2 0.000 0.000 0.000 0.000 asteval.py:180()\n", + " 2 0.000 0.000 0.046 0.023 core.py:307(power)\n", + " 975 0.000 0.000 0.000 0.000 fromnumeric.py:3165(_size_dispatcher)\n", + " 690 0.000 0.000 0.000 0.000 fromnumeric.py:1825(_nonzero_dispatcher)\n", + " 266 0.000 0.000 0.000 0.000 quantity.py:975(isscalar)\n", + " 581 0.000 0.000 0.000 0.000 multiarray.py:736(dot)\n", " 691 0.000 0.000 0.000 0.000 nanfunctions.py:1023(_nanmedian_dispatcher)\n", - " 305 0.000 0.000 0.000 0.000 zernike.py:955(_l_to_key)\n", - " 4 0.000 0.000 0.001 0.000 zernike.py:980(array)\n", - " 579 0.000 0.000 0.000 0.000 multiarray.py:736(dot)\n", + " 674 0.000 0.000 0.000 0.000 core.py:1094()\n", + " 202 0.000 0.000 0.000 0.000 core.py:65(_normalize_equivalencies)\n", + " 98 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", + " 98 0.000 0.000 0.000 0.000 core.py:3035(_apply_operators_to_value_lists)\n", + " 14 0.000 0.000 0.001 0.000 axis.py:349(_apply_params)\n", + " 16 0.000 0.000 0.000 0.000 ticker.py:1986(_validate_steps)\n", + " 994 0.000 0.000 0.000 0.000 transforms.py:1375(depth)\n", + " 161 0.000 0.000 0.000 0.000 parameters.py:308(default)\n", + " 16 0.000 0.000 0.001 0.000 ticker.py:433(__init__)\n", " 142 0.000 0.000 0.002 0.000 patches.py:375(set_color)\n", - " 78 0.000 0.000 0.000 0.000 _differentiable_functions.py:222(update_x)\n", - " 581 0.000 0.000 0.000 0.000 core.py:754(inputs)\n", - " 426 0.000 0.000 0.000 0.000 transforms.py:1940(get_matrix)\n", " 105 0.000 0.000 0.002 0.000 artist.py:1159(set)\n", - " 8 0.000 0.000 0.001 0.000 core.py:20(centroid_com)\n", - " 994 0.000 0.000 0.000 0.000 transforms.py:1375(depth)\n", - " 674 0.000 0.000 0.000 0.000 core.py:1094()\n", + " 142 0.000 0.000 0.001 0.000 __init__.py:1843(method)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:335(__getitem__)\n", + " 42 0.000 0.000 0.001 0.000 parameter.py:119(__setitem__)\n", + " 78 0.000 0.000 0.000 0.000 _differentiable_functions.py:222(update_x)\n", + " 761 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", " 42 0.000 0.000 0.001 0.000 astutils.py:251(valid_symbol_name)\n", - " 501 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", + " 142 0.000 0.000 0.009 0.000 patches.py:1539(get_patch_transform)\n", + " 8 0.000 0.000 0.001 0.000 core.py:20(centroid_com)\n", " 19 0.000 0.000 0.001 0.000 _ni_support.py:73(_get_output)\n", - " 761 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}\n", - " 1 0.000 0.000 1.284 1.284 wfs.py:1090(fit_wavefront)\n", - " 67 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(diff)\n", - " 602 0.000 0.000 0.000 0.000 core.py:3241(param_names)\n", - " 163 0.000 0.000 0.000 0.000 core.py:812()\n", - " 202 0.000 0.000 0.000 0.000 core.py:65(_normalize_equivalencies)\n", - " 14 0.000 0.000 0.001 0.000 axis.py:349(_apply_params)\n", - " 42 0.000 0.000 0.000 0.000 zernike.py:466(norm_coefficient)\n", - " 329 0.000 0.000 0.000 0.000 core.py:1878(decompose)\n", + " 28/24 0.000 0.000 0.000 0.000 spines.py:330(get_spine_transform)\n", + " 5 0.000 0.000 0.000 0.000 _methods.py:195(_var)\n", + " 513 0.000 0.000 0.000 0.000 _collections_abc.py:802(__init__)\n", + " 14 0.000 0.000 0.006 0.000 nanfunctions.py:1575(nanstd)\n", + " 640 0.000 0.000 0.000 0.000 multiarray.py:341(where)\n", " 382 0.000 0.000 0.000 0.000 enum.py:670(__new__)\n", - " 12 0.000 0.000 0.001 0.000 card.py:721(_parse_value)\n", - " 240 0.000 0.000 0.000 0.000 fitting.py:1606()\n", - " 9 0.000 0.000 0.000 0.000 {method 'tell' of '_io.FileIO' objects}\n", - " 16 0.000 0.000 0.001 0.000 ticker.py:2007(set_params)\n", - " 1 0.000 0.000 0.000 0.000 file.py:245(readarray)\n", - " 126 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ravel)\n", - " 42 0.000 0.000 0.000 0.000 tokenize.py:295(detect_encoding)\n", - " 1 0.000 0.000 0.000 0.000 header.py:529(_fromcards)\n", - " 1 0.000 0.000 0.000 0.000 _utils.py:67(__init__)\n", + " 165 0.000 0.000 0.000 0.000 core.py:812()\n", + " 299 0.000 0.000 0.000 0.000 {built-in method math.radians}\n", + " 32 0.000 0.000 0.000 0.000 axis.py:1607(_set_formatter)\n", + " 299 0.000 0.000 0.000 0.000 {built-in method math.cos}\n", + " 202 0.000 0.000 0.000 0.000 core.py:229(equivalencies)\n", + " 75 0.000 0.000 0.000 0.000 card.py:680(_parse_keyword)\n", + " 1 0.000 0.000 0.002 0.002 wfs.py:727(adjust_center)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:710(__hash__)\n", + " 163 0.000 0.000 0.000 0.000 core.py:741(_initialize_setters)\n", + " 4 0.000 0.000 0.001 0.000 zernike.py:981(array)\n", " 1 0.000 0.000 0.000 0.000 interpolation.py:119(__init__)\n", - " 670 0.000 0.000 0.000 0.000 shape_base.py:19(_atleast_1d_dispatcher)\n", - " 3 0.000 0.000 0.003 0.001 arraypad.py:529(pad)\n", - " 30 0.000 0.000 0.000 0.000 markers.py:295(_set_marker)\n", - " 142 0.000 0.000 0.008 0.000 patches.py:1539(get_patch_transform)\n", - " 16 0.000 0.000 0.004 0.000 scale.py:104(set_default_locators_and_formatters)\n", - " 16 0.000 0.000 0.000 0.000 font_manager.py:1248(findfont)\n", - " 2 0.000 0.000 1.076 0.538 minpack.py:279(leastsq)\n", + " 1 0.000 0.000 0.002 0.002 zernike.py:758(__sub__)\n", + " 645 0.000 0.000 0.000 0.000 fromnumeric.py:2758(_amin_dispatcher)\n", + " 1 0.000 0.000 0.001 0.001 core.py:271(centroid_sources)\n", + " 1 0.000 0.000 0.006 0.006 background_2d.py:381(_sigmaclip_boxes)\n", + " 42 0.000 0.000 0.000 0.000 tokenize.py:295(detect_encoding)\n", + " 9 0.000 0.000 0.000 0.000 {method 'tell' of '_io.FileIO' objects}\n", + " 671 0.000 0.000 0.000 0.000 shape_base.py:19(_atleast_1d_dispatcher)\n", + " 42 0.000 0.000 0.001 0.000 quantity.py:1153(__itruediv__)\n", + " 80 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(array_equal)\n", + " 284 0.000 0.000 0.000 0.000 bounding_box.py:152(shape)\n", + " 1 0.000 0.000 1.303 1.303 wfs.py:1093(fit_wavefront)\n", " 50 0.000 0.000 0.001 0.000 numeric.py:76(zeros_like)\n", - " 70 0.000 0.000 0.000 0.000 font_manager.py:862(set_size)\n", + " 6 0.000 0.000 0.000 0.000 lines.py:649(recache)\n", + " 79 0.000 0.000 0.000 0.000 _numdiff.py:175(_prepare_bounds)\n", + " 30 0.000 0.000 0.000 0.000 markers.py:295(_set_marker)\n", + " 98 0.000 0.000 0.021 0.000 core.py:3154(evaluate)\n", + " 12 0.000 0.000 0.001 0.000 card.py:721(_parse_value)\n", + " 22 0.000 0.000 0.000 0.000 warnings.py:458(__enter__)\n", + " 498 0.000 0.000 0.000 0.000 {method 'setdefault' of 'dict' objects}\n", + " 1 0.000 0.000 0.000 0.000 background_2d.py:375(_select_initial_boxes)\n", + " 1 0.000 0.000 0.001 0.001 header.py:341(fromstring)\n", + " 51 0.000 0.000 0.000 0.000 configuration.py:476(_validate_val)\n", + " 5 0.000 0.000 0.000 0.000 {method 'accumulate' of 'numpy.ufunc' objects}\n", " 153 0.000 0.000 0.001 0.000 patches.py:364(set_facecolor)\n", + " 1 0.000 0.000 0.000 0.000 header.py:529(_fromcards)\n", + " 120 0.000 0.000 0.000 0.000 configobj.py:550(__getitem__)\n", + " 163 0.000 0.000 0.000 0.000 attributes.py:33(__get__)\n", + " 22 0.000 0.000 0.000 0.000 warnings.py:477(__exit__)\n", + " 470 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n", + " 321 0.000 0.000 0.000 0.000 transforms.py:1052(get_points)\n", + " 79 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(diag)\n", + " 58 0.000 0.000 0.000 0.000 quantity.py:1228(__setitem__)\n", + " 79 0.000 0.000 0.000 0.000 _numdiff.py:186()\n", " 170 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(argmin)\n", - " 299 0.000 0.000 0.000 0.000 {built-in method math.cos}\n", - " 47 0.000 0.000 0.002 0.000 polynomial.py:1037(prepare_inputs)\n", + " 356 0.000 0.000 0.000 0.000 core.py:1130(name)\n", + " 157 0.000 0.000 0.000 0.000 transforms.py:276(y0)\n", + " 1 0.000 0.000 0.011 0.011 interpolation.py:822(rotate)\n", + " 1 0.000 0.000 0.000 0.000 _utils.py:67(__init__)\n", + " 223 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", + " 2 0.000 0.000 0.000 0.000 core.py:2334(masked_invalid)\n", + " 70 0.000 0.000 0.000 0.000 font_manager.py:862(set_size)\n", + " 427 0.000 0.000 0.000 0.000 path.py:214(codes)\n", + " 329 0.000 0.000 0.000 0.000 core.py:1878(decompose)\n", + " 11 0.000 0.000 0.001 0.000 header.py:139(__getitem__)\n", + " 2 0.000 0.000 0.044 0.022 basic.py:203(r2cn)\n", + " 170 0.000 0.000 0.000 0.000 fromnumeric.py:1202(argmin)\n", " 14 0.000 0.000 0.001 0.000 table.py:2092(add_column)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:696(polyval)\n", - " 6 0.000 0.000 0.000 0.000 lines.py:649(recache)\n", - " 1 0.000 0.000 0.002 0.002 wfs.py:724(adjust_center)\n", - " 163 0.000 0.000 0.000 0.000 attributes.py:33(__get__)\n", - " 8 0.000 0.000 0.000 0.000 {method 'seek' of '_io.FileIO' objects}\n", - " 47 0.000 0.000 0.000 0.000 {built-in method _operator.add}\n", + " 364 0.000 0.000 0.000 0.000 core.py:1142(model_set_axis)\n", + " 87 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.ndarray' objects}\n", + " 7 0.000 0.000 0.000 0.000 column.py:308(_compare)\n", + " 142 0.000 0.000 0.000 0.000 patches.py:1560(set_width)\n", + " 105 0.000 0.000 0.002 0.000 artist.py:116()\n", + " 42 0.000 0.000 0.000 0.000 zernike.py:467(norm_coefficient)\n", " 149 0.000 0.000 0.000 0.000 patches.py:318(set_antialiased)\n", - " 2 0.000 0.000 0.047 0.024 core.py:307(power)\n", - " 2 0.000 0.000 0.000 0.000 {astropy.io.fits._utils.parse_header}\n", - " 120 0.000 0.000 0.000 0.000 configobj.py:550(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", - " 28/24 0.000 0.000 0.000 0.000 spines.py:330(get_spine_transform)\n", - " 202 0.000 0.000 0.000 0.000 core.py:229(equivalencies)\n", - " 1 0.000 0.000 0.005 0.005 background_2d.py:381(_sigmaclip_boxes)\n", - " 1 0.000 0.000 0.001 0.001 header.py:341(fromstring)\n", - " 1 0.000 0.000 0.001 0.001 core.py:271(centroid_sources)\n", - " 15 0.000 0.000 0.000 0.000 table.py:223(__init__)\n", - " 60 0.000 0.000 0.000 0.000 markers.py:237(_recache)\n", - " 2 0.000 0.000 0.000 0.000 core.py:2334(masked_invalid)\n", - " 645 0.000 0.000 0.000 0.000 fromnumeric.py:2758(_amin_dispatcher)\n", + " 428 0.000 0.000 0.000 0.000 path.py:200(vertices)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:696(polyval)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:23(linspace)\n", + " 1 0.000 0.000 0.077 0.077 wfs.py:1419(reference_aberrations)\n", + " 98 0.000 0.000 0.000 0.000 core.py:3856(binary_operation)\n", " 153 0.000 0.000 0.001 0.000 patches.py:346(set_edgecolor)\n", - " 22 0.000 0.000 0.000 0.000 warnings.py:458(__enter__)\n", - " 142 0.000 0.000 0.000 0.000 patches.py:1560(set_width)\n", - " 98 0.000 0.000 0.000 0.000 core.py:1229(fixed)\n", - " 321 0.000 0.000 0.000 0.000 transforms.py:1052(get_points)\n", - " 299 0.000 0.000 0.000 0.000 {built-in method math.radians}\n", - " 163 0.000 0.000 0.000 0.000 core.py:816()\n", - " 16 0.000 0.000 0.000 0.000 axis.py:1633(set_major_locator)\n", - " 86 0.000 0.000 0.000 0.000 {method 'all' of 'numpy.ndarray' objects}\n", - " 5 0.000 0.000 0.000 0.000 {method 'read' of '_io.FileIO' objects}\n", - " 12 0.000 0.000 0.003 0.000 axis.py:790(clear)\n", - " 248 0.000 0.000 0.000 0.000 _collections_abc.py:802(__init__)\n", - " 1 0.000 0.000 0.001 0.001 zernike.py:757(__sub__)\n", + " 142 0.000 0.000 0.001 0.000 transforms.py:1796(transform)\n", + " 13 0.000 0.000 0.000 0.000 stride_tricks.py:414(_broadcast_shape)\n", + " 1 0.000 0.000 0.142 0.142 wfs.py:220(center_pupil)\n", " 1 0.000 0.000 0.002 0.002 parameter.py:84(__deepcopy__)\n", - " 170 0.000 0.000 0.000 0.000 fromnumeric.py:1202(argmin)\n", - " 47 0.000 0.000 0.000 0.000 polynomial.py:107(_invlex)\n", - " 16 0.000 0.000 0.000 0.000 ticker.py:2001(_staircase)\n", - " 105 0.000 0.000 0.003 0.000 artist.py:116()\n", - " 245 0.000 0.000 0.000 0.000 __init__.py:1066(__iter__)\n", - " 223 0.000 0.000 0.000 0.000 {method 'startswith' of 'bytes' objects}\n", + " 515 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", + " 159 0.000 0.000 0.031 0.000 _differentiable_functions.py:231(_update_fun)\n", + " 2 0.000 0.000 0.038 0.019 fitting.py:1098(__call__)\n", + " 3 0.000 0.000 0.003 0.001 arraypad.py:529(pad)\n", + " 23 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}\n", + " 15 0.000 0.000 0.000 0.000 table.py:223(__init__)\n", + " 60 0.000 0.000 0.000 0.000 markers.py:237(_recache)\n", + " 22 0.000 0.000 0.000 0.000 warnings.py:181(_add_filter)\n", + " 79 0.000 0.000 0.031 0.000 _differentiable_functions.py:136(update_fun)\n", " 142 0.000 0.000 0.000 0.000 patches.py:1579(set_height)\n", " 42 0.000 0.000 0.003 0.000 parameter.py:680(_init_bounds)\n", - " 427 0.000 0.000 0.000 0.000 path.py:214(codes)\n", - " 157 0.000 0.000 0.000 0.000 transforms.py:276(y0)\n", - " 284 0.000 0.000 0.000 0.000 bounding_box.py:152(shape)\n", - " 11 0.000 0.000 0.001 0.000 header.py:139(__getitem__)\n", - " 83 0.000 0.000 0.000 0.000 table.py:260(__setitem__)\n", - " 1 0.000 0.000 0.011 0.011 interpolation.py:822(rotate)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:682(_parse_args)\n", - " 83 0.000 0.000 0.000 0.000 table.py:1468(_set_col_parent_table_and_mask)\n", - " 35 0.000 0.000 0.000 0.000 {built-in method builtins.sorted}\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:807(set_style)\n", + " 1 0.000 0.000 0.011 0.011 daofinder.py:451(sharpness)\n", + " 16 0.000 0.000 0.001 0.000 ticker.py:2007(set_params)\n", + " 80 0.000 0.000 0.160 0.002 _differentiable_functions.py:236(_update_grad)\n", + " 299 0.000 0.000 0.000 0.000 {built-in method math.sin}\n", " 415 0.000 0.000 0.000 0.000 fromnumeric.py:663(_partition_dispatcher)\n", - " 80 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(array_equal)\n", - " 159 0.000 0.000 0.030 0.000 _differentiable_functions.py:231(_update_fun)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:326(getmembers)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:412(roundness1)\n", - " 2 0.000 0.000 0.001 0.001 zernike.py:1131(load_lmfit)\n", - " 142 0.000 0.000 0.000 0.000 transforms.py:1796(transform)\n", - " 1 0.000 0.000 0.076 0.076 wfs.py:1416(reference_aberrations)\n", - " 28 0.000 0.000 0.000 0.000 type_check.py:303(iscomplexobj)\n", - " 1 0.000 0.000 0.023 0.023 daofinder.py:642(apply_filters)\n", - " 10 0.000 0.000 0.000 0.000 cycler.py:364(by_key)\n", - " 3 0.000 0.000 0.000 0.000 function_base.py:23(linspace)\n", - " 79 0.000 0.000 0.000 0.000 _numdiff.py:186()\n", - " 1 0.000 0.000 0.137 0.137 wfs.py:220(center_pupil)\n", - " 1 0.000 0.000 0.001 0.001 figure.py:2154(__init__)\n", + " 75 0.000 0.000 0.000 0.000 card.py:529(fromstring)\n", + " 16 0.000 0.000 0.003 0.000 scale.py:104(set_default_locators_and_formatters)\n", " 1 0.000 0.000 0.011 0.011 _base.py:1182(cla)\n", - " 14 0.000 0.000 0.005 0.000 nanfunctions.py:1575(nanstd)\n", - " 1 0.000 0.000 0.000 0.000 hdulist.py:186(__init__)\n", - " 515 0.000 0.000 0.000 0.000 {method 'strip' of 'str' objects}\n", - " 23 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}\n", - " 7 0.000 0.000 0.000 0.000 column.py:308(_compare)\n", - " 98 0.000 0.000 0.000 0.000 core.py:1248(tied)\n", - " 254 0.000 0.000 0.000 0.000 core.py:1130(name)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.correlate}\n", - " 79 0.000 0.000 0.000 0.000 _numdiff.py:175(_prepare_bounds)\n", + " 1 0.000 0.000 0.008 0.008 background_2d.py:180(__init__)\n", + " 2 0.000 0.000 0.000 0.000 {astropy.io.fits._utils.parse_header}\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:412(roundness1)\n", + " 83 0.000 0.000 0.000 0.000 table.py:1468(_set_col_parent_table_and_mask)\n", " 142 0.000 0.000 0.001 0.000 mask.py:52(get_overlap_slices)\n", - " 75 0.000 0.000 0.000 0.000 card.py:529(fromstring)\n", - " 83 0.000 0.000 0.000 0.000 card.py:634(_check_if_rvkc_image)\n", - " 428 0.000 0.000 0.000 0.000 path.py:200(vertices)\n", - " 22 0.000 0.000 0.000 0.000 warnings.py:181(_add_filter)\n", + " 83 0.000 0.000 0.000 0.000 table.py:260(__setitem__)\n", + " 3 0.000 0.000 0.001 0.000 nanfunctions.py:862(nanmean)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1087(set_linestyle)\n", + " 3 0.000 0.000 0.071 0.024 _backend.py:17(__ua_function__)\n", + " 16 0.000 0.000 0.000 0.000 font_manager.py:1248(findfont)\n", " 35 0.000 0.000 0.000 0.000 text.py:1195(set_verticalalignment)\n", " 42 0.000 0.000 0.000 0.000 tokenize.py:404(tokenize)\n", - " 80 0.000 0.000 0.158 0.002 _differentiable_functions.py:236(_update_grad)\n", - " 58/16 0.000 0.000 0.000 0.000 util.py:166(itersubclasses)\n", - " 208 0.000 0.000 0.000 0.000 {built-in method sys.intern}\n", - " 16 0.000 0.000 0.004 0.000 axis.py:759(_set_scale)\n", - " 317 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n", - " 79 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(diag)\n", - " 1 0.000 0.000 0.000 0.000 background_2d.py:375(_select_initial_boxes)\n", - " 388 0.000 0.000 0.000 0.000 zernike.py:962(units)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1087(set_linestyle)\n", - " 51 0.000 0.000 0.000 0.000 configuration.py:476(_validate_val)\n", - " 380 0.000 0.000 0.000 0.000 core.py:1656(is_unity)\n", - " 51 0.000 0.000 0.001 0.000 configuration.py:300(__get__)\n", - " 299 0.000 0.000 0.000 0.000 {built-in method math.sin}\n", - " 22 0.000 0.000 0.000 0.000 warnings.py:477(__exit__)\n", - " 16 0.000 0.000 0.000 0.000 axis.py:1649(set_minor_locator)\n", + " 35 0.000 0.000 0.000 0.000 {built-in method builtins.sorted}\n", + " 429 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", + " 388 0.000 0.000 0.000 0.000 zernike.py:963(units)\n", + " 1 0.000 0.000 0.001 0.001 background_2d.py:294(_reshape_data)\n", + " 165 0.000 0.000 0.000 0.000 core.py:816()\n", + " 51 0.000 0.000 0.000 0.000 validate.py:651(_check_value)\n", + " 405 0.000 0.000 0.000 0.000 {method 'issubset' of 'set' objects}\n", + " 5 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.correlate}\n", " 7 0.000 0.000 0.000 0.000 _dtype.py:321(_name_get)\n", - " 3 0.000 0.000 0.000 0.000 helper.py:80(_asfarray)\n", - " 79 0.000 0.000 0.030 0.000 _differentiable_functions.py:136(update_fun)\n", + " 83 0.000 0.000 0.000 0.000 card.py:634(_check_if_rvkc_image)\n", + " 1 0.000 0.000 0.009 0.009 extras.py:716(_median)\n", " 54 0.000 0.000 0.000 0.000 lines.py:1149(_set_markercolor)\n", + " 3 0.000 0.000 0.000 0.000 _util.py:247(_asarray_validated)\n", " 19 0.000 0.000 0.002 0.000 table.py:1910(__setitem__)\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:817(set_variant)\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:807(set_style)\n", + " 10 0.000 0.000 0.000 0.000 cycler.py:364(by_key)\n", + " 287 0.000 0.000 0.000 0.000 {built-in method builtins.delattr}\n", + " 5 0.000 0.000 0.000 0.000 twodim_base.py:509(vander)\n", + " 1 0.000 0.000 0.000 0.000 file.py:245(readarray)\n", + " 13 0.000 0.000 0.000 0.000 stride_tricks.py:478(broadcast_arrays)\n", + " 98 0.000 0.000 0.000 0.000 functional_models.py:181(input_units)\n", + " 1 0.000 0.000 0.046 0.046 wfs.py:183(grid_spacing)\n", + " 380 0.000 0.000 0.000 0.000 core.py:1656(is_unity)\n", " 51 0.000 0.000 0.000 0.000 validate.py:593(check)\n", - " 1 0.000 0.000 0.002 0.002 zernike.py:1195(normalize)\n", - " 258 0.000 0.000 0.000 0.000 core.py:1142(model_set_axis)\n", - " 3 0.000 0.000 0.071 0.024 _backend.py:17(__ua_function__)\n", - " 47 0.000 0.000 0.000 0.000 core.py:3035(_apply_operators_to_value_lists)\n", - " 13 0.000 0.000 0.000 0.000 stride_tricks.py:414(_broadcast_shape)\n", - " 1 0.000 0.000 0.011 0.011 daofinder.py:451(sharpness)\n", + " 3 0.000 0.000 0.000 0.000 helper.py:80(_asfarray)\n", + " 98 0.000 0.000 0.000 0.000 core.py:3164(_post_evaluate)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2154(__init__)\n", + " 117 0.000 0.000 0.001 0.000 helpers.py:36(get_converters_and_unit)\n", " 197 0.000 0.000 0.000 0.000 card.py:214(keyword)\n", - " 2 0.000 0.000 0.043 0.022 basic.py:203(r2cn)\n", - " 21 0.000 0.000 0.000 0.000 text.py:936(set_color)\n", - " 8 0.000 0.000 0.006 0.001 axis.py:850(set_tick_params)\n", - " 330 0.000 0.000 0.000 0.000 core.py:721(powers)\n", - " 20 0.000 0.000 0.001 0.000 card.py:276(value)\n", + " 1 0.000 0.000 0.023 0.023 interpolation.py:691(zoom)\n", + " 14 0.000 0.000 0.000 0.000 _ni_support.py:57(_normalize_sequence)\n", + " 98 0.000 0.000 0.000 0.000 polynomial.py:959(input_units)\n", + " 2 0.000 0.000 0.003 0.001 core.py:154(bbox)\n", + " 12 0.000 0.000 0.002 0.000 axis.py:790(clear)\n", + " 19 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", + " 16 0.000 0.000 0.000 0.000 ticker.py:2001(_staircase)\n", + " 1 0.000 0.000 0.009 0.009 nanfunctions.py:1003(_nanmedian_small)\n", + " 2 0.000 0.000 0.001 0.000 wfs.py:740(apply_pupil)\n", + " 1 0.000 0.000 0.001 0.001 file.py:107(__init__)\n", " 8 0.000 0.000 0.000 0.000 core.py:75()\n", - " 1 0.000 0.000 0.009 0.009 extras.py:716(_median)\n", - " 1 0.000 0.000 0.002 0.002 zernike.py:1208(denormalize)\n", - " 47 0.000 0.000 0.019 0.000 core.py:3154(evaluate)\n", - " 1 0.000 0.000 0.016 0.016 _base.py:553(__init__)\n", + " 16 0.000 0.000 0.000 0.000 axis.py:1633(set_major_locator)\n", " 75 0.000 0.000 0.000 0.000 card.py:157(__init__)\n", - " 429 0.000 0.000 0.000 0.000 {method 'lower' of 'str' objects}\n", - " 1 0.000 0.000 0.021 0.021 _utils.py:144(_find_stars)\n", " 42 0.000 0.000 0.003 0.000 parameter.py:550(__init__)\n", - " 117 0.000 0.000 0.001 0.000 helpers.py:36(get_converters_and_unit)\n", + " 143 0.000 0.000 0.000 0.000 mask.py:45(shape)\n", " 2 0.000 0.000 0.002 0.001 parameter.py:371(add_many)\n", - " 15 0.000 0.000 0.000 0.000 {built-in method builtins.__import__}\n", - " 51 0.000 0.000 0.000 0.000 validate.py:651(_check_value)\n", - " 5 0.000 0.000 0.000 0.000 {method 'accumulate' of 'numpy.ufunc' objects}\n", - " 287 0.000 0.000 0.000 0.000 {built-in method builtins.delattr}\n", - " 405 0.000 0.000 0.000 0.000 {method 'issubset' of 'set' objects}\n", - " 63 0.000 0.000 0.000 0.000 parameter.py:734(setup_bounds)\n", - " 1 0.000 0.000 0.003 0.003 wfs.py:621(make_init_pars)\n", - " 16 0.000 0.000 0.000 0.000 axis.py:830(reset_ticks)\n", - " 1 0.000 0.000 0.009 0.009 nanfunctions.py:1003(_nanmedian_small)\n", - " 142 0.000 0.000 0.000 0.000 patches.py:1535(get_path)\n", - " 13 0.000 0.000 0.000 0.000 stride_tricks.py:478(broadcast_arrays)\n", - " 25 0.000 0.000 0.001 0.000 column.py:1056(__new__)\n", - " 91 0.000 0.000 0.000 0.000 data_info.py:215(__get__)\n", - " 4 0.000 0.000 0.000 0.000 attributes.py:84(_validate)\n", - " 1 0.000 0.000 0.001 0.001 background_2d.py:294(_reshape_data)\n", - " 21 0.000 0.000 0.106 0.005 zernike.py:362(zernike_noll)\n", - " 51 0.000 0.000 0.000 0.000 validate.py:637(_parse_with_caching)\n", " 50 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(zeros_like)\n", - " 5 0.000 0.000 0.000 0.000 twodim_base.py:509(vander)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:385(_centered)\n", - " 29 0.000 0.000 0.000 0.000 table.py:2021(colnames)\n", - " 14 0.000 0.000 0.000 0.000 _ni_support.py:57(_normalize_sequence)\n", - " 16 0.000 0.000 0.001 0.000 ticker.py:1945(__init__)\n", + " 28 0.000 0.000 0.000 0.000 type_check.py:303(iscomplexobj)\n", + " 1 0.000 0.000 0.025 0.025 daofinder.py:642(apply_filters)\n", + " 1 0.000 0.000 0.003 0.003 wfs.py:624(make_init_pars)\n", + " 1 0.000 0.000 2.744 2.744 {built-in method builtins.exec}\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:817(set_variant)\n", + " 1 0.000 0.000 0.000 0.000 core.py:3339(__setitem__)\n", + " 330 0.000 0.000 0.000 0.000 core.py:721(powers)\n", + " 4 0.000 0.000 0.000 0.000 attributes.py:84(_validate)\n", + " 8 0.000 0.000 0.006 0.001 axis.py:850(set_tick_params)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:326(getmembers)\n", + " 1 0.000 0.000 0.021 0.021 _utils.py:144(_find_stars)\n", " 82 0.000 0.000 0.000 0.000 card.py:550(normalize_keyword)\n", - " 45 0.000 0.000 0.000 0.000 helpers.py:208(helper_division)\n", - " 25 0.000 0.000 0.000 0.000 registry.py:47(get_mixin_handler)\n", + " 249 0.000 0.000 0.000 0.000 polynomial.py:40(param_names)\n", + " 63 0.000 0.000 0.000 0.000 parameter.py:734(setup_bounds)\n", + " 3 0.000 0.000 0.004 0.001 axis.py:475(__init__)\n", + " 1 0.000 0.000 0.000 0.000 arraysetops.py:320(_unique1d)\n", + " 1 0.000 0.000 0.015 0.015 _base.py:553(__init__)\n", + " 20 0.000 0.000 0.001 0.000 card.py:276(value)\n", + " 21 0.000 0.000 0.108 0.005 zernike.py:363(zernike_noll)\n", + " 3/2 0.000 0.000 0.097 0.049 decorators.py:489(wrapper)\n", + " 296 0.000 0.000 0.000 0.000 core.py:3326(n_inputs)\n", + " 208 0.000 0.000 0.000 0.000 {built-in method sys.intern}\n", + " 2 0.000 0.000 0.001 0.000 zernike.py:1132(load_lmfit)\n", + " 21 0.000 0.000 0.000 0.000 text.py:936(set_color)\n", + " 1 0.000 0.000 0.023 0.023 interpolators.py:55(__call__)\n", + " 142 0.000 0.000 0.000 0.000 patches.py:1535(get_path)\n", " 71 0.000 0.000 0.000 0.000 artist.py:1001(set_visible)\n", - " 1 0.000 0.000 2.799 2.799 {built-in method builtins.exec}\n", - " 4 0.000 0.000 0.001 0.000 spines.py:34(__init__)\n", - " 50 0.000 0.000 0.000 0.000 table.py:178(has_info_class)\n", - " 31 0.000 0.000 0.000 0.000 table.py:3960(_convert_col_for_table)\n", + " 98 0.000 0.000 0.000 0.000 core.py:3133(_pre_evaluate)\n", " 2 0.000 0.000 0.001 0.001 asteval.py:109(__init__)\n", + " 1 0.000 0.000 0.096 0.096 detect.py:402(make_source_mask)\n", + " 202 0.000 0.000 0.000 0.000 core.py:341(get_current_unit_registry)\n", + " 313 0.000 0.000 0.000 0.000 multiarray.py:80(empty_like)\n", + " 16 0.000 0.000 0.000 0.000 axis.py:1649(set_minor_locator)\n", + " 51 0.000 0.000 0.000 0.000 validate.py:637(_parse_with_caching)\n", " 10 0.000 0.000 0.000 0.000 shape_base.py:612(column_stack)\n", - " 2 0.000 0.000 0.000 0.000 filters.py:179(_gaussian_kernel1d)\n", - " 96 0.000 0.000 0.000 0.000 font_manager.py:1304()\n", - " 6 0.000 0.000 0.000 0.000 arraypad.py:454(_as_pairs)\n", - " 33 0.000 0.000 0.000 0.000 getlimits.py:382(__new__)\n", + " 5 0.000 0.000 0.001 0.000 table.py:2329(_replace_column_warnings)\n", " 11 0.000 0.000 0.000 0.000 util.py:754(_str_to_num)\n", - " 3 0.000 0.000 0.001 0.000 nanfunctions.py:862(nanmean)\n", - " 7 0.000 0.000 0.000 0.000 table.py:1445(_make_table_from_cols)\n", - " 2 0.000 0.000 0.000 0.000 inspect.py:2152(_signature_from_function)\n", - " 2 0.000 0.000 0.020 0.010 filters.py:1080(_min_or_max_filter)\n", - " 1 0.000 0.000 0.007 0.007 background_2d.py:180(__init__)\n", - " 1 0.000 0.000 0.044 0.044 background_2d.py:525(_filter_meshes)\n", - " 330 0.000 0.000 0.000 0.000 core.py:714(bases)\n", - " 1 0.000 0.000 0.048 0.048 wfs.py:183(grid_spacing)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3339(__setitem__)\n", - " 36 0.000 0.000 0.001 0.000 _collections_abc.py:849(__iter__)\n", - " 2 0.000 0.000 0.002 0.001 axis.py:638(__init__)\n", - " 19 0.000 0.000 0.001 0.000 text.py:1251(set_fontproperties)\n", - " 288 0.000 0.000 0.000 0.000 polynomial.py:85(degree)\n", + " 25 0.000 0.000 0.001 0.000 column.py:1056(__new__)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:682(_parse_args)\n", + " 6 0.000 0.000 0.000 0.000 arraypad.py:454(_as_pairs)\n", + " 91 0.000 0.000 0.000 0.000 data_info.py:215(__get__)\n", + " 1 0.000 0.000 0.001 0.001 zernike.py:1209(denormalize)\n", + " 51 0.000 0.000 0.001 0.000 configuration.py:300(__get__)\n", " 22 0.000 0.000 0.000 0.000 warnings.py:437(__init__)\n", + " 58/16 0.000 0.000 0.000 0.000 util.py:166(itersubclasses)\n", + " 129 0.000 0.000 0.000 0.000 {method 'tobytes' of 'numpy.ndarray' objects}\n", + " 16 0.000 0.000 0.003 0.000 axis.py:759(_set_scale)\n", " 33 0.000 0.000 0.000 0.000 metadata.py:404(__set__)\n", - " 8 0.000 0.000 0.003 0.000 wfs.py:68(check_wfsdata)\n", - " 16 0.000 0.000 0.001 0.000 ticker.py:2740(__init__)\n", - " 3 0.000 0.000 0.004 0.001 axis.py:414(__init__)\n", - " 47 0.000 0.000 0.000 0.000 core.py:3164(_post_evaluate)\n", - " 5 0.000 0.000 0.001 0.000 table.py:2329(_replace_column_warnings)\n", - " 1 0.000 0.000 0.000 0.000 arraysetops.py:320(_unique1d)\n", - " 2 0.000 0.000 0.000 0.000 _base.py:3608(set_xlim)\n", - " 45 0.000 0.000 0.000 0.000 core.py:780(__div__)\n", - " 142 0.000 0.000 0.000 0.000 path.py:793(unit_circle)\n", - " 30 0.000 0.000 0.000 0.000 markers.py:266(_set_fillstyle)\n", - " 202 0.000 0.000 0.000 0.000 core.py:341(get_current_unit_registry)\n", - " 19 0.000 0.000 0.000 0.000 {method 'any' of 'numpy.generic' objects}\n", - " 191 0.000 0.000 0.000 0.000 polynomial.py:40(param_names)\n", - " 35 0.000 0.000 0.000 0.000 text.py:957(set_horizontalalignment)\n", - " 16 0.000 0.000 0.001 0.000 __init__.py:512(_get_data_path)\n", - " 44 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(isclose)\n", - " 1 0.000 0.000 0.023 0.023 interpolation.py:691(zoom)\n", - " 1 0.000 0.000 0.000 0.000 core.py:1152(__call__)\n", - " 330 0.000 0.000 0.000 0.000 core.py:707(scale)\n", + " 29 0.000 0.000 0.000 0.000 table.py:2021(colnames)\n", + " 2 0.000 0.000 0.027 0.013 sigma_clipping.py:839(sigma_clipped_stats)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:1819(focal_plane_position)\n", + " 36 0.000 0.000 0.001 0.000 _collections_abc.py:849(__iter__)\n", " 21 0.000 0.000 0.000 0.000 warnings.py:165(simplefilter)\n", - " 47 0.000 0.000 0.000 0.000 core.py:3856(binary_operation)\n", - " 2 0.000 0.000 0.001 0.001 base.py:394(_readfrom_internal)\n", - " 20 0.000 0.000 0.000 0.000 text.py:241(set_rotation_mode)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:841(seeing)\n", - " 16 0.000 0.000 0.000 0.000 scale.py:582(scale_factory)\n", - " 1 0.000 0.000 0.030 0.030 fitting.py:1098(__call__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method posix.stat}\n", - " 42 0.000 0.000 0.000 0.000 zernike.py:486(noll_coefficient)\n", - " 36 0.000 0.000 0.000 0.000 lines.py:630(set_data)\n", + " 15 0.000 0.000 0.000 0.000 {built-in method builtins.__import__}\n", + " 6 0.000 0.000 0.032 0.005 <__array_function__ internals>:2(cumsum)\n", + " 16 0.000 0.000 0.000 0.000 axis.py:830(reset_ticks)\n", + " 262 0.000 0.000 0.000 0.000 numeric.py:214(_ones_like_dispatcher)\n", + " 2 0.000 0.000 0.021 0.010 filters.py:1080(_min_or_max_filter)\n", + " 2 0.000 0.000 0.000 0.000 filters.py:179(_gaussian_kernel1d)\n", + " 31 0.000 0.000 0.000 0.000 table.py:3960(_convert_col_for_table)\n", + " 44 0.000 0.000 0.003 0.000 <__array_function__ internals>:2(isclose)\n", + " 30 0.000 0.000 0.000 0.000 markers.py:266(_set_fillstyle)\n", + " 7 0.000 0.000 0.000 0.000 table.py:1445(_make_table_from_cols)\n", + " 33 0.000 0.000 0.000 0.000 getlimits.py:382(__new__)\n", + " 142 0.000 0.000 0.000 0.000 path.py:793(unit_circle)\n", + " 330 0.000 0.000 0.000 0.000 core.py:714(bases)\n", + " 1 0.000 0.000 0.001 0.001 zernike.py:1196(normalize)\n", + " 1 0.000 0.000 0.014 0.014 background_2d.py:428(_interpolate_meshes)\n", " 28 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(iscomplexobj)\n", " 142 0.000 0.000 0.000 0.000 patches.py:1607(get_angle)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:1079(__new__)\n", - " 117/85 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", - " 207 0.000 0.000 0.000 0.000 multiarray.py:664(result_type)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:1816(focal_plane_position)\n", - " 1 0.000 0.000 0.092 0.092 detect.py:402(make_source_mask)\n", - " 143 0.000 0.000 0.000 0.000 mask.py:45(shape)\n", - " 4 0.000 0.000 0.000 0.000 transforms.py:2839(nonsingular)\n", - " 129 0.000 0.000 0.000 0.000 {method 'tobytes' of 'numpy.ndarray' objects}\n", - " 30 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(concatenate)\n", - " 2 0.000 0.000 0.001 0.000 wfs.py:737(apply_pupil)\n", - " 6 0.000 0.000 0.029 0.005 <__array_function__ internals>:2(cumsum)\n", - " 3/2 0.000 0.000 0.093 0.046 decorators.py:489(wrapper)\n", - " 101 0.000 0.000 0.000 0.000 card.py:460(field_specifier)\n", - " 1 0.000 0.000 0.014 0.014 background_2d.py:428(_interpolate_meshes)\n", - " 16 0.000 0.000 0.000 0.000 validate.py:746(_is_num_param)\n", - " 8 0.000 0.000 0.000 0.000 _base.py:3591(_validate_converted_limits)\n", - " 2 0.000 0.000 0.003 0.001 core.py:154(bbox)\n", - " 2 0.000 0.000 0.000 0.000 _util.py:247(_asarray_validated)\n", + " 3 0.000 0.000 0.000 0.000 {method 'outer' of 'numpy.ufunc' objects}\n", + " 25 0.000 0.000 0.000 0.000 registry.py:47(get_mixin_handler)\n", " 12 0.000 0.000 0.000 0.000 header.py:1711(_cardindex)\n", - " 12 0.000 0.000 0.000 0.000 card.py:800(_split)\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:794(set_family)\n", - " 8/4 0.000 0.000 0.000 0.000 units.py:181(get_converter)\n", - " 6 0.000 0.000 0.028 0.005 fromnumeric.py:2458(cumsum)\n", - " 84 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", + " 8 0.000 0.000 0.003 0.000 wfs.py:68(check_wfsdata)\n", + " 14 0.000 0.000 0.006 0.000 <__array_function__ internals>:2(nanstd)\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:385(_centered)\n", + " 19 0.000 0.000 0.001 0.000 text.py:1251(set_fontproperties)\n", + " 142 0.000 0.000 0.000 0.000 arraysetops.py:636(_isin_dispatcher)\n", + " 1 0.000 0.000 0.030 0.030 morphology.py:215(_binary_erosion)\n", + " 36 0.000 0.000 0.000 0.000 lines.py:630(set_data)\n", + " 330 0.000 0.000 0.000 0.000 core.py:707(scale)\n", + " 2 0.000 0.000 0.000 0.000 inspect.py:2152(_signature_from_function)\n", + " 3 0.000 0.000 0.003 0.001 axis.py:414(__init__)\n", + " 45 0.000 0.000 0.000 0.000 helpers.py:208(helper_division)\n", + " 20 0.000 0.000 0.000 0.000 text.py:241(set_rotation_mode)\n", + " 2 0.000 0.000 0.045 0.023 main.py:111(lombscargle)\n", + " 196 0.000 0.000 0.000 0.000 polynomial.py:152(domain)\n", " 4 0.000 0.000 0.000 0.000 helper.py:41(_init_nd_shape_and_axes)\n", - " 21 0.000 0.000 0.000 0.000 font_manager.py:943(copy)\n", - " 25 0.000 0.000 0.000 0.000 table.py:2040(__len__)\n", - " 3 0.000 0.000 0.000 0.000 _misc.py:8(_get_version_info)\n", + " 4 0.000 0.000 0.000 0.000 _base.py:2482(_process_unit_info)\n", + " 101 0.000 0.000 0.000 0.000 card.py:460(field_specifier)\n", + " 35 0.000 0.000 0.000 0.000 text.py:957(set_horizontalalignment)\n", + " 16 0.000 0.000 0.001 0.000 ticker.py:1945(__init__)\n", " 1 0.000 0.000 0.002 0.002 minimizer.py:662(prepare_fit)\n", - " 1 0.000 0.000 0.059 0.059 daofinder.py:203(find_stars)\n", - " 29/15 0.000 0.000 0.000 0.000 _base.py:839(get_xaxis_transform)\n", + " 12 0.000 0.000 0.000 0.000 card.py:800(_split)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:844(seeing)\n", + " 30 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(concatenate)\n", + " 2 0.000 0.000 0.000 0.000 _base.py:3608(set_xlim)\n", + " 4 0.000 0.000 0.001 0.000 spines.py:34(__init__)\n", + " 13 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(broadcast_arrays)\n", + " 142 0.000 0.000 0.000 0.000 arraysetops.py:515(_in1d_dispatcher)\n", + " 6 0.000 0.000 0.032 0.005 fromnumeric.py:2458(cumsum)\n", + " 2 0.000 0.000 0.001 0.001 axis.py:638(__init__)\n", + " 37 0.000 0.000 0.000 0.000 copy.py:200(_deepcopy_list)\n", + " 3 0.000 0.000 0.001 0.000 function_base.py:4248(meshgrid)\n", + " 4 0.000 0.000 0.000 0.000 transforms.py:2839(nonsingular)\n", + " 3 0.000 0.000 0.027 0.009 sigma_clipping.py:540(__call__)\n", + " 21 0.000 0.000 0.000 0.000 font_manager.py:943(copy)\n", " 39 0.000 0.000 0.000 0.000 colors.py:124(_check_color_like)\n", - " 2 0.000 0.000 0.027 0.013 sigma_clipping.py:839(sigma_clipped_stats)\n", - " 1 0.000 0.000 0.000 0.000 zernike.py:723(__add__)\n", + " 45 0.000 0.000 0.000 0.000 core.py:780(__div__)\n", + " 2 0.000 0.000 0.001 0.000 base.py:394(_readfrom_internal)\n", + " 8/4 0.000 0.000 0.000 0.000 units.py:181(get_converter)\n", + " 1 0.000 0.000 0.000 0.000 zernike.py:724(__add__)\n", + " 16 0.000 0.000 0.001 0.000 ticker.py:2740(__init__)\n", + " 207 0.000 0.000 0.000 0.000 multiarray.py:664(result_type)\n", + " 146 0.000 0.000 0.000 0.000 artist.py:1298(mouseover)\n", " 39 0.000 0.000 0.000 0.000 colors.py:111(is_color_like)\n", - " 1 0.000 0.000 0.001 0.001 file.py:107(__init__)\n", - " 12 0.000 0.000 0.000 0.000 card.py:584(_check_if_rvkc)\n", - " 1 0.000 0.000 0.028 0.028 morphology.py:215(_binary_erosion)\n", + " 5 0.000 0.000 0.001 0.000 table.py:2386(replace_column)\n", + " 1 0.000 0.000 2.744 2.744 :1()\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:794(set_family)\n", + " 96 0.000 0.000 0.000 0.000 font_manager.py:1304()\n", " 110 0.000 0.000 0.000 0.000 cycler.py:239(__iter__)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:742(__str__)\n", - " 42 0.000 0.000 0.000 0.000 parameter.py:864(__array__)\n", - " 47/33 0.000 0.000 0.000 0.000 transforms.py:2380(_invalidate_internal)\n", - " 108 0.000 0.000 0.000 0.000 font_manager.py:1022(_normalize_font_family)\n", - " 31 0.000 0.000 0.000 0.000 copy.py:200(_deepcopy_list)\n", - " 142 0.000 0.000 0.000 0.000 arraysetops.py:515(_in1d_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3460(_map_parameters)\n", - " 32 0.000 0.000 0.000 0.000 pathlib.py:303(splitroot)\n", - " 47 0.000 0.000 0.000 0.000 polynomial.py:1158(input_units)\n", - " 22 0.000 0.000 0.000 0.000 header.py:2043(__getitem__)\n", - " 12 0.000 0.000 0.000 0.000 shape_base.py:81(atleast_2d)\n", - " 142 0.000 0.000 0.000 0.000 arraysetops.py:636(_isin_dispatcher)\n", - " 1 0.000 0.000 1.057 1.057 minimizer.py:1612(leastsq)\n", - " 3 0.000 0.000 0.001 0.000 function_base.py:4248(meshgrid)\n", - " 162 0.000 0.000 0.000 0.000 multiarray.py:498(can_cast)\n", - " 3 0.000 0.000 0.003 0.001 axis.py:475(__init__)\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:915(set_math_fontfamily)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:145(get_grid_positions)\n", + " 50 0.000 0.000 0.000 0.000 table.py:178(has_info_class)\n", + " 12 0.000 0.000 0.000 0.000 card.py:584(_check_if_rvkc)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:422(asarray_chkfinite)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1349(set_solid_capstyle)\n", + " 7/6 0.000 0.000 0.002 0.000 hdulist.py:1164(_read_next_hdu)\n", " 45 0.000 0.000 0.000 0.000 lines.py:1222(set_xdata)\n", - " 5 0.000 0.000 0.000 0.000 table.py:2386(replace_column)\n", - " 22 0.000 0.000 0.000 0.000 quantity.py:816(to)\n", - " 30 0.000 0.000 0.001 0.000 markers.py:219(__init__)\n", - " 1 0.000 0.000 0.023 0.023 interpolators.py:55(__call__)\n", - " 4 0.000 0.000 0.000 0.000 _base.py:2482(_process_unit_info)\n", - " 1 0.000 0.000 0.003 0.003 _base.py:741(_init_axis)\n", - " 8 0.000 0.000 0.000 0.000 table.py:1089(_check_names_dtype)\n", - " 1 0.000 0.000 0.000 0.000 image.py:48(__init__)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:702(_from_parts)\n", - " 4 0.000 0.000 0.000 0.000 transforms.py:1735(_set)\n", - " 50 0.000 0.000 0.000 0.000 table.py:3953(_is_mixin_for_table)\n", + " 12 0.000 0.000 0.000 0.000 shape_base.py:81(atleast_2d)\n", + " 177 0.000 0.000 0.000 0.000 fromnumeric.py:1714(_ravel_dispatcher)\n", + " 25 0.000 0.000 0.000 0.000 table.py:2040(__len__)\n", + " 29/15 0.000 0.000 0.000 0.000 _base.py:839(get_xaxis_transform)\n", + " 3 0.000 0.000 0.000 0.000 lapack.py:994(_compute_lwork)\n", + " 42 0.000 0.000 0.000 0.000 zernike.py:487(noll_coefficient)\n", + " 1 0.000 0.000 0.010 0.010 core.py:294(calc_background)\n", + " 8 0.000 0.000 0.000 0.000 _base.py:3591(_validate_converted_limits)\n", " 4 0.000 0.000 0.000 0.000 circle.py:147(__init__)\n", - " 9 0.000 0.000 0.000 0.000 __init__.py:214(connect)\n", - " 1 0.000 0.000 0.001 0.001 _axes.py:5279(imshow)\n", - " 7/6 0.000 0.000 0.002 0.000 hdulist.py:1164(_read_next_hdu)\n", - " 2 0.000 0.000 0.000 0.000 _base.py:3939(set_ylim)\n", + " 29/15 0.000 0.000 0.000 0.000 _base.py:915(get_yaxis_transform)\n", + " 30 0.000 0.000 0.001 0.000 markers.py:219(__init__)\n", + " 1 0.000 0.000 0.042 0.042 filters.py:1522(generic_filter)\n", + " 22 0.000 0.000 0.000 0.000 quantity.py:816(to)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:145(get_grid_positions)\n", + " 32 0.000 0.000 0.000 0.000 axis.py:551(locator)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:1079(__new__)\n", + " 1 0.000 0.000 0.001 0.001 file.py:549(_open_filename)\n", + " 1 0.000 0.000 0.030 0.030 morphology.py:390(binary_dilation)\n", + " 47/33 0.000 0.000 0.000 0.000 transforms.py:2380(_invalidate_internal)\n", + " 2 0.000 0.000 0.000 0.000 histograms.py:678(histogram)\n", + " 108 0.000 0.000 0.000 0.000 font_manager.py:1022(_normalize_font_family)\n", + " 16 0.000 0.000 0.000 0.000 __init__.py:512(_get_data_path)\n", + " 1 0.000 0.000 0.000 0.000 core.py:1152(__call__)\n", " 44 0.000 0.000 0.000 0.000 {built-in method builtins.repr}\n", - " 12 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(atleast_2d)\n", - " 2 0.000 0.000 0.000 0.000 inspect.py:2246(_signature_from_callable)\n", - " 1 0.000 0.000 0.044 0.044 filters.py:1522(generic_filter)\n", + " 1 0.000 0.000 1.068 1.068 minimizer.py:1612(leastsq)\n", + " 117/85 0.000 0.000 0.000 0.000 {built-in method builtins.hash}\n", + " 16 0.000 0.000 0.000 0.000 scale.py:582(scale_factory)\n", + " 8 0.000 0.000 0.000 0.000 table.py:1089(_check_names_dtype)\n", + " 2 0.000 0.000 0.000 0.000 shape_base.py:29(_make_along_axis_idx)\n", + " 2 0.000 0.000 0.000 0.000 core.py:2857(__init__)\n", + " 1 0.000 0.000 0.061 0.061 daofinder.py:203(find_stars)\n", + " 31 0.000 0.000 0.000 0.000 table.py:1372(_convert_col_for_table)\n", + " 14 0.000 0.000 0.000 0.000 nanfunctions.py:113(_copyto)\n", " 1 0.000 0.000 0.000 0.000 asteval.py:199(user_defined_symbols)\n", - " 3 0.000 0.000 0.000 0.000 _collections_abc.py:933(update)\n", - " 215 0.000 0.000 0.000 0.000 multiarray.py:80(empty_like)\n", - " 3 0.000 0.000 0.028 0.009 sigma_clipping.py:540(__call__)\n", - " 10 0.000 0.000 0.000 0.000 inspect.py:2498(__init__)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:551(locator)\n", - " 146 0.000 0.000 0.000 0.000 artist.py:1298(mouseover)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1335(set_dash_capstyle)\n", + " 50 0.000 0.000 0.000 0.000 table.py:3953(_is_mixin_for_table)\n", + " 143 0.000 0.000 0.000 0.000 path.py:245(should_simplify)\n", " 13 0.000 0.000 0.000 0.000 transforms.py:2678(__init__)\n", - " 1 0.000 0.000 0.009 0.009 core.py:294(calc_background)\n", - " 1 0.000 0.000 0.001 0.001 file.py:549(_open_filename)\n", - " 42 0.000 0.000 0.000 0.000 tokenize.py:325(find_cookie)\n", - " 1 0.000 0.000 0.014 0.014 filters.py:640(_correlate_or_convolve)\n", + " 1 0.000 0.000 0.000 0.000 {method '__exit__' of '_io._IOBase' objects}\n", + " 2 0.000 0.000 0.000 0.000 core.py:3460(_map_parameters)\n", + " 162 0.000 0.000 0.000 0.000 multiarray.py:498(can_cast)\n", + " 2 0.000 0.000 0.000 0.000 core.py:4441(count)\n", + " 2 0.000 0.000 0.000 0.000 _base.py:3939(set_ylim)\n", + " 1 0.000 0.000 0.003 0.003 hdulist.py:1058(_readfrom)\n", + " 16 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(transpose)\n", + " 42 0.000 0.000 0.000 0.000 parameter.py:864(__array__)\n", " 91 0.000 0.000 0.000 0.000 data_info.py:314(_parent)\n", - " 2 0.000 0.000 0.000 0.000 backend_bases.py:1694(__init__)\n", - " 98 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1335(set_dash_capstyle)\n", " 7 0.000 0.000 0.000 0.000 _dtype.py:307(_name_includes_bit_suffix)\n", - " 164 0.000 0.000 0.000 0.000 numeric.py:214(_ones_like_dispatcher)\n", - " 11 0.000 0.000 0.000 0.000 __init__.py:872(get_siblings)\n", + " 3 0.000 0.000 0.000 0.000 twodim_base.py:161(eye)\n", + " 3 0.000 0.000 0.000 0.000 _misc.py:8(_get_version_info)\n", + " 42 0.000 0.000 0.000 0.000 tokenize.py:325(find_cookie)\n", " 146 0.000 0.000 0.000 0.000 artist.py:418(is_transform_set)\n", - " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.FileIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 core.py:475(_define_patch_params)\n", - " 13 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(broadcast_arrays)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method builtins.dir}\n", - " 5 0.000 0.000 0.000 0.000 _methods.py:260(_std)\n", - " 1 0.000 0.000 0.000 0.000 base.py:65(_hdu_class_from_header)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:625(mag)\n", - " 31 0.000 0.000 0.000 0.000 table.py:1372(_convert_col_for_table)\n", - " 4 0.000 0.000 0.000 0.000 attributes.py:64(__set__)\n", - " 11 0.000 0.000 0.000 0.000 util.py:522(translate)\n", - " 47 0.000 0.000 0.000 0.000 core.py:3133(_pre_evaluate)\n", - " 142 0.000 0.000 0.000 0.000 core.py:3326(n_inputs)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1034(set_drawstyle)\n", - " 9 0.000 0.000 0.000 0.000 __init__.py:119(_weak_or_strong_ref)\n", - " 2 0.000 0.000 0.007 0.003 filters.py:83(correlate1d)\n", - " 2 0.000 0.000 0.000 0.000 table.py:1386(_init_from_cols)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:1218(__init__)\n", - " 1 0.000 0.000 0.191 0.191 _minimize.py:45(minimize)\n", - " 21 0.000 0.000 0.000 0.000 utils.py:396(__setitem__)\n", - " 1 0.000 0.000 0.001 0.001 daofinder.py:675(to_table)\n", - " 1 0.000 0.000 0.028 0.028 morphology.py:390(binary_dilation)\n", - " 2 0.000 0.000 0.000 0.000 core.py:4441(count)\n", - " 143 0.000 0.000 0.000 0.000 path.py:245(should_simplify)\n", - " 8 0.000 0.000 0.001 0.000 table.py:1163(_init_from_list)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1069(set_linewidth)\n", - " 1 0.000 0.000 0.000 0.000 core.py:2857(__init__)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1022(set_color)\n", - " 1 0.000 0.000 0.000 0.000 minimizer.py:359(_calculate_statistics)\n", - " 29/15 0.000 0.000 0.000 0.000 _base.py:915(get_yaxis_transform)\n", - " 9 0.000 0.000 0.000 0.000 weakref.py:47(__new__)\n", - " 45 0.000 0.000 0.000 0.000 lines.py:1234(set_ydata)\n", - " 42 0.000 0.000 0.000 0.000 tokenize.py:98(_compile)\n", + " 9 0.000 0.000 0.000 0.000 __init__.py:214(connect)\n", " 18 0.000 0.000 0.000 0.000 __init__.py:1277(is_math_text)\n", - " 16 0.000 0.000 0.000 0.000 __init__.py:171(check_getitem)\n", - " 64 0.000 0.000 0.000 0.000 ticker.py:183(set_axis)\n", - " 2 0.000 0.000 0.000 0.000 column.py:45(_auto_names)\n", - " 12 0.000 0.000 0.000 0.000 lines.py:1135(set_marker)\n", - " 40 0.000 0.000 0.000 0.000 validate.py:897(is_boolean)\n", + " 3 0.000 0.000 0.000 0.000 twodim_base.py:475(triu)\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:915(set_math_fontfamily)\n", + " 2 0.000 0.000 0.000 0.000 fitting.py:1682(_validate_constraints)\n", + " 1 0.000 0.000 0.194 0.194 _minimize.py:45(minimize)\n", + " 45 0.000 0.000 0.000 0.000 lines.py:1234(set_ydata)\n", + " 98 0.000 0.000 0.000 0.000 {method 'find' of 'str' objects}\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:742(__str__)\n", " 1 0.000 0.000 0.003 0.003 _differentiable_functions.py:86(__init__)\n", - " 6 0.000 0.000 0.000 0.000 transforms.py:2285(__init__)\n", - " 126 0.000 0.000 0.000 0.000 fromnumeric.py:1714(_ravel_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 histograms.py:678(histogram)\n", - " 2 0.000 0.000 0.000 0.000 shape_base.py:29(_make_along_axis_idx)\n", + " 6 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", " 143 0.000 0.000 0.000 0.000 artist.py:855(get_clip_path)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3505(_initialize_slices)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:725(_format_parsed_parts)\n", - " 4 0.000 0.000 0.001 0.000 spines.py:423(linear_spine)\n", + " 4 0.000 0.000 0.000 0.000 attributes.py:64(__set__)\n", + " 22 0.000 0.000 0.000 0.000 header.py:2043(__getitem__)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:702(_from_parts)\n", + " 24 0.000 0.000 0.000 0.000 utils.py:396(__setitem__)\n", + " 1 0.000 0.000 0.042 0.042 background_2d.py:525(_filter_meshes)\n", + " 16 0.000 0.000 0.000 0.000 validate.py:746(_is_num_param)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1034(set_drawstyle)\n", + " 12 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(atleast_2d)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1069(set_linewidth)\n", + " 1 0.000 0.000 0.000 0.000 image.py:48(__init__)\n", + " 4 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", + " 20 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(diff)\n", " 143 0.000 0.000 0.000 0.000 path.py:233(simplify_threshold)\n", - " 2 0.000 0.000 0.047 0.024 main.py:111(lombscargle)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:186(__init__)\n", - " 14 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(transpose)\n", - " 42 0.000 0.000 0.000 0.000 types.py:171(__get__)\n", - " 14 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(nanstd)\n", - " 94 0.000 0.000 0.000 0.000 polynomial.py:1175(x_domain)\n", - " 102 0.000 0.000 0.000 0.000 table.py:1985(masked)\n", - " 170 0.000 0.000 0.000 0.000 fromnumeric.py:1198(_argmin_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 axis.py:202(_apply_tickdir)\n", - " 8 0.000 0.000 0.000 0.000 axis.py:889(_translate_tick_kw)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:746(pup_coords)\n", - " 14 0.000 0.000 0.000 0.000 nanfunctions.py:113(_copyto)\n", - " 33 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", - " 4 0.000 0.000 0.002 0.001 interpolation.py:47(spline_filter1d)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:562(formatter)\n", - " 75 0.000 0.000 0.000 0.000 card.py:1284(_pad)\n", - " 11 0.000 0.000 0.000 0.000 validate.py:1073(is_string)\n", - " 1 0.000 0.000 0.000 0.000 core.py:844(__call__)\n", - " 67 0.000 0.000 0.000 0.000 function_base.py:1160(_diff_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:135(_commonType)\n", - " 2 0.000 0.000 0.000 0.000 column.py:47()\n", " 2 0.000 0.000 0.000 0.000 shape_base.py:512(expand_dims)\n", - " 66 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", - " 4 0.000 0.000 0.005 0.001 axis.py:1394(grid)\n", + " 10 0.000 0.000 0.000 0.000 inspect.py:2498(__init__)\n", + " 1 0.000 0.000 0.001 0.001 _axes.py:5279(imshow)\n", + " 6 0.000 0.000 0.000 0.000 utils.py:387(__init__)\n", + " 32 0.000 0.000 0.000 0.000 pathlib.py:303(splitroot)\n", " 11 0.000 0.000 0.000 0.000 header.py:1872(_haswildcard)\n", + " 6 0.000 0.000 0.000 0.000 twodim_base.py:32(_min_int)\n", + " 4 0.000 0.000 0.002 0.001 interpolation.py:47(spline_filter1d)\n", + " 100 0.000 0.000 0.000 0.000 polynomial.py:85(degree)\n", + " 1 0.000 0.000 0.014 0.014 filters.py:640(_correlate_or_convolve)\n", + " 5 0.000 0.000 0.000 0.000 core.py:82(shape)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method builtins.dir}\n", + " 12 0.000 0.000 0.000 0.000 lines.py:1135(set_marker)\n", + " 3 0.000 0.000 0.000 0.000 twodim_base.py:370(tri)\n", + " 9 0.000 0.000 0.000 0.000 __init__.py:119(_weak_or_strong_ref)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1022(set_color)\n", + " 11 0.000 0.000 0.000 0.000 __init__.py:872(get_siblings)\n", + " 2 0.000 0.000 0.000 0.000 inspect.py:2246(_signature_from_callable)\n", + " 14 0.000 0.000 0.006 0.000 <__array_function__ internals>:2(nanvar)\n", + " 42 0.000 0.000 0.000 0.000 types.py:171(__get__)\n", + " 1 0.000 0.000 0.000 0.000 core.py:475(_define_patch_params)\n", + " 2 0.000 0.000 0.000 0.000 table.py:1386(_init_from_cols)\n", + " 5 0.000 0.000 0.000 0.000 _methods.py:260(_std)\n", " 4 0.000 0.000 0.000 0.000 numeric.py:1335(normalize_axis_tuple)\n", + " 40 0.000 0.000 0.000 0.000 validate.py:897(is_boolean)\n", " 1 0.000 0.000 0.027 0.027 basic.py:232(c2rn)\n", - " 16 0.000 0.000 0.000 0.000 text.py:1052(set_fontsize)\n", - " 19 0.000 0.000 0.000 0.000 font_manager.py:687(_from_any)\n", - " 3 0.000 0.000 0.000 0.000 utils.py:387(__init__)\n", - " 1 0.000 0.000 0.001 0.001 pyplot.py:665(figure)\n", - " 8 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:307(__init__)\n", - " 18 0.000 0.000 0.000 0.000 artist.py:1096(set_zorder)\n", - " 5 0.000 0.000 0.000 0.000 numeric.py:748(convolve)\n", - " 1 0.000 0.000 0.011 0.011 daofinder.py:398(cutout_convdata)\n", - " 5 0.000 0.000 0.000 0.000 core.py:82(shape)\n", - " 8/7 0.000 0.000 0.000 0.000 hdulist.py:274(__getitem__)\n", - " 3 0.000 0.000 0.000 0.000 _base.py:863(get_xaxis_text1_transform)\n", + " 2 0.000 0.000 0.007 0.003 filters.py:83(correlate1d)\n", + " 8 0.000 0.000 0.000 0.000 axis.py:889(_translate_tick_kw)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:1218(__init__)\n", + " 11 0.000 0.000 0.000 0.000 util.py:522(translate)\n", + " 84 0.000 0.000 0.000 0.000 {method 'group' of 're.Match' objects}\n", " 19 0.000 0.000 0.000 0.000 text.py:1265(set_usetex)\n", - " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:226(__init__)\n", - " 14 0.000 0.000 0.005 0.000 <__array_function__ internals>:2(nanvar)\n", - " 2 0.000 0.000 0.000 0.000 function_base.py:422(asarray_chkfinite)\n", - " 1 0.000 0.000 0.017 0.017 gridspec.py:264(subplots)\n", - " 2 0.000 0.000 0.000 0.000 lapack.py:994(_compute_lwork)\n", + " 9 0.000 0.000 0.001 0.000 {method 'max' of 'numpy.ndarray' objects}\n", + " 3 0.000 0.000 0.005 0.002 minpack.py:22(_check_func)\n", + " 6 0.000 0.000 0.000 0.000 axis.py:202(_apply_tickdir)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:307(__init__)\n", + " 2 0.000 0.000 0.000 0.000 backend_bases.py:1694(__init__)\n", + " 1 0.000 0.000 0.000 0.000 hdulist.py:186(__init__)\n", + " 42 0.000 0.000 0.000 0.000 tokenize.py:98(_compile)\n", + " 98 0.000 0.000 0.000 0.000 polynomial.py:144(window)\n", + " 170 0.000 0.000 0.000 0.000 fromnumeric.py:1198(_argmin_dispatcher)\n", " 2 0.000 0.000 0.000 0.000 function_helpers.py:560(dot_like)\n", - " 1 0.000 0.000 0.003 0.003 hdulist.py:1058(_readfrom)\n", - " 3 0.000 0.000 0.003 0.001 <__array_function__ internals>:2(pad)\n", - " 8 0.000 0.000 0.000 0.000 table.py:1994(_set_masked)\n", - " 1 0.000 0.000 0.002 0.002 measurements.py:44(label)\n", - " 94 0.000 0.000 0.000 0.000 polynomial.py:1183(y_domain)\n", - " 4 0.000 0.000 0.000 0.000 {method 'searchsorted' of 'numpy.ndarray' objects}\n", - " 103 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1291(set_dash_joinstyle)\n", - " 13 0.000 0.000 0.000 0.000 _ni_support.py:36(_extend_mode_to_code)\n", - " 1 0.000 0.000 0.000 0.000 background_2d.py:331(_box_npixels_threshold)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:1129(getfullargspec)\n", - " 1 0.000 0.000 0.001 0.001 signaltools.py:516(_apply_conv_mode)\n", - " 56 0.000 0.000 0.000 0.000 daofinder.py:378(islazyproperty)\n", - " 71 0.000 0.000 0.000 0.000 table.py:1463()\n", + " 9 0.000 0.000 0.000 0.000 weakref.py:47(__new__)\n", + " 75 0.000 0.000 0.000 0.000 card.py:1284(_pad)\n", " 22 0.000 0.000 0.000 0.000 {method 'insert' of 'list' objects}\n", - " 1 0.000 0.000 0.000 0.000 image.py:233(__init__)\n", - " 75 0.000 0.000 0.000 0.000 table.py:2010(ColumnClass)\n", - " 1 0.000 0.000 0.014 0.014 _convolution.py:14(_filter_data)\n", - " 42 0.000 0.000 0.000 0.000 tokenize.py:319(read_or_stop)\n", - " 1 0.000 0.000 0.011 0.011 interpolation.py:461(affine_transform)\n", - " 2 0.000 0.000 0.000 0.000 {method 'outer' of 'numpy.ufunc' objects}\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:66(__init__)\n", - " 5 0.000 0.000 0.000 0.000 function_base.py:1644(trim_zeros)\n", - " 2 0.000 0.000 0.000 0.000 patches.py:708(__init__)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:713(set_transform)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1349(set_solid_capstyle)\n", - " 15/11 0.000 0.000 0.005 0.000 deprecation.py:291(wrapper)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:803(_set_lim_and_transforms)\n", - " 1 0.000 0.000 0.118 0.118 zernike.py:1010(peak2valley)\n", - " 6/4 0.000 0.000 0.007 0.002 axis.py:581(__get__)\n", - " 99 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", - " 85 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", - " 13 0.000 0.000 0.000 0.000 __init__.py:823(clean)\n", - " 80 0.000 0.000 0.000 0.000 numeric.py:2381(_array_equal_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 background_2d.py:331(_box_npixels_threshold)\n", " 2 0.000 0.000 0.000 0.000 histograms.py:360(_get_bin_edges)\n", - " 2 0.000 0.000 0.001 0.000 _base.py:3349(tick_params)\n", - " 4 0.000 0.000 0.000 0.000 spines.py:294(set_position)\n", + " 2 0.000 0.000 0.000 0.000 column.py:45(_auto_names)\n", + " 1 0.000 0.000 0.013 0.013 daofinder.py:394(cutout_data)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:625(mag)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:749(pup_coords)\n", + " 1 0.000 0.000 0.011 0.011 interpolation.py:461(affine_transform)\n", + " 19 0.000 0.000 0.000 0.000 font_manager.py:687(_from_any)\n", + " 8 0.000 0.000 0.001 0.000 table.py:1163(_init_from_list)\n", + " 1 0.000 0.000 0.000 0.000 base.py:65(_hdu_class_from_header)\n", + " 1 0.000 0.000 0.001 0.001 daofinder.py:675(to_table)\n", + " 4 0.000 0.000 0.005 0.001 axis.py:1394(grid)\n", " 2 0.000 0.000 0.000 0.000 core.py:3433(__setmask__)\n", - " 1 0.000 0.000 0.000 0.000 image.py:963(set_extent)\n", - " 1 0.000 0.000 0.010 0.010 daofinder.py:394(cutout_data)\n", - " 9 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", - " 11 0.000 0.000 0.000 0.000 {method 'translate' of 'str' objects}\n", + " 32 0.000 0.000 0.000 0.000 axis.py:711(isDefault_minfmt)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:713(set_transform)\n", + " 102 0.000 0.000 0.000 0.000 table.py:1985(masked)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:1129(getfullargspec)\n", + " 66 0.000 0.000 0.000 0.000 {built-in method _warnings._filters_mutated}\n", + " 30 0.000 0.000 0.000 0.000 axis.py:340(_set_artist_props)\n", + " 1 0.000 0.000 0.002 0.002 _base.py:741(_init_axis)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:186(__init__)\n", " 2 0.000 0.000 0.002 0.001 interpolation.py:135(spline_filter)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1305(set_solid_joinstyle)\n", - " 2 0.000 0.000 0.000 0.000 core.py:1223(sync_constraints)\n", - " 14 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ndim)\n", - " 47 0.000 0.000 0.000 0.000 {method 'index' of 'tuple' objects}\n", - " 1 0.000 0.000 0.007 0.007 filters.py:264(gaussian_filter)\n", - " 1 0.000 0.000 0.001 0.001 axis.py:2279(__init__)\n", - " 6 0.000 0.000 0.000 0.000 _base.py:2939(_get_axis_list)\n", - " 2 0.000 0.000 0.000 0.000 inspect.py:2781(__init__)\n", - " 2 0.000 0.000 0.004 0.002 minpack.py:22(_check_func)\n", - " 1 0.000 0.000 0.001 0.001 backend_bases.py:3487(new_figure_manager)\n", + " 1 0.000 0.000 0.000 0.000 {method 'close' of '_io.FileIO' objects}\n", + " 2 0.000 0.000 0.000 0.000 patches.py:708(__init__)\n", + " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:226(__init__)\n", + " 5 0.000 0.000 0.000 0.000 numeric.py:748(convolve)\n", + " 38 0.000 0.000 0.000 0.000 stride_tricks.py:540()\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:135(_commonType)\n", + " 1 0.000 0.000 0.000 0.000 minimizer.py:359(_calculate_statistics)\n", + " 16 0.000 0.000 0.000 0.000 text.py:1052(set_fontsize)\n", + " 103 0.000 0.000 0.000 0.000 {method 'upper' of 'str' objects}\n", + " 6 0.000 0.000 0.000 0.000 transforms.py:2285(__init__)\n", + " 2 0.000 0.000 0.038 0.019 fitting.py:171(wrapper)\n", " 1 0.000 0.000 0.000 0.000 core.py:2817(__new__)\n", - " 1 0.000 0.000 0.001 0.001 axis.py:2013(__init__)\n", - " 28 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", - " 30 0.000 0.000 0.000 0.000 axis.py:340(_set_artist_props)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:687(isDefault_majloc)\n", - " 1 0.000 0.000 0.000 0.000 minimizer.py:822()\n", - " 8 0.000 0.000 0.000 0.000 transforms.py:1850(is_separable)\n", - " 8 0.000 0.000 0.000 0.000 core.py:2565(unit_scale_converter)\n", - " 2 0.000 0.000 0.000 0.000 core.py:5039(sum)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:668(get_position)\n", - " 2 0.000 0.000 0.001 0.001 base.py:303(readfrom)\n", + " 1 0.000 0.000 0.015 0.015 gridspec.py:264(subplots)\n", + " 8/7 0.000 0.000 0.000 0.000 hdulist.py:274(__getitem__)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1305(set_solid_joinstyle)\n", + " 1 0.000 0.000 0.001 0.001 pyplot.py:665(figure)\n", + " 13 0.000 0.000 0.000 0.000 stride_tricks.py:536()\n", + " 1 0.000 0.000 0.001 0.001 measurements.py:44(label)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1291(set_dash_joinstyle)\n", + " 6 0.000 0.000 0.000 0.000 _collections_abc.py:933(update)\n", + " 8 0.000 0.000 0.000 0.000 function_base.py:1301(interp)\n", + " 80 0.000 0.000 0.000 0.000 numeric.py:2381(_array_equal_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 function_base.py:1644(trim_zeros)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3505(_initialize_slices)\n", + " 2 0.000 0.000 0.000 0.000 main.py:41(_is_regular)\n", + " 4 0.000 0.000 0.001 0.000 spines.py:423(linear_spine)\n", + " 8 0.000 0.000 0.000 0.000 table.py:1994(_set_masked)\n", + " 75 0.000 0.000 0.000 0.000 table.py:2010(ColumnClass)\n", + " 2 0.000 0.000 0.000 0.000 core.py:133(_validate_inputs)\n", + " 85 0.000 0.000 0.000 0.000 {method 'decode' of 'bytes' objects}\n", + " 2 0.000 0.000 0.000 0.000 column.py:47()\n", " 19 0.000 0.000 0.000 0.000 {method 'squeeze' of 'numpy.ndarray' objects}\n", + " 14 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ndim)\n", " 4 0.000 0.000 0.000 0.000 fromnumeric.py:2933(prod)\n", - " 8 0.000 0.000 0.000 0.000 function_base.py:1301(interp)\n", - " 4 0.000 0.000 0.000 0.000 twodim_base.py:32(_min_int)\n", - " 22 0.000 0.000 0.000 0.000 text.py:1149(set_x)\n", - " 1 0.000 0.000 0.000 0.000 header.py:2031(__init__)\n", + " 1 0.000 0.000 0.002 0.002 signaltools.py:516(_apply_conv_mode)\n", + " 18 0.000 0.000 0.000 0.000 artist.py:1096(set_zorder)\n", + " 3 0.000 0.000 0.003 0.001 <__array_function__ internals>:2(pad)\n", + " 99 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}\n", + " 2 0.000 0.000 0.001 0.000 _base.py:3349(tick_params)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:725(_format_parsed_parts)\n", + " 2 0.000 0.000 0.000 0.000 core.py:104(__init__)\n", + " 16 0.000 0.000 0.000 0.000 __init__.py:171(check_getitem)\n", " 1 0.000 0.000 0.003 0.003 hdulist.py:38(fitsopen)\n", - " 1 0.000 0.000 0.000 0.000 base.py:129(__init__)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:157(__init__)\n", - " 15 0.000 0.000 0.000 0.000 column.py:450(data)\n", - " 14 0.000 0.000 0.000 0.000 fromnumeric.py:3127(ndim)\n", - " 2 0.000 0.000 0.001 0.001 filters.py:1023(maximum_filter1d)\n", - " 1 0.000 0.000 0.017 0.017 figure.py:646(add_subplot)\n", - " 1 0.000 0.000 0.000 0.000 image.py:690(set_data)\n", - " 3 0.000 0.000 0.000 0.000 axis.py:442(_apply_tickdir)\n", - " 54 0.000 0.000 0.000 0.000 font_manager.py:887(set_file)\n", - " 2 0.000 0.000 0.001 0.001 parameter.py:47(__init__)\n", - " 6 0.000 0.000 0.001 0.000 axis.py:236(set_clip_path)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1193(set_markeredgewidth)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1208(set_markersize)\n", + " 11 0.000 0.000 0.000 0.000 validate.py:1073(is_string)\n", + " 1 0.000 0.000 0.120 0.120 zernike.py:1011(peak2valley)\n", + " 1 0.000 0.000 0.007 0.007 filters.py:264(gaussian_filter)\n", + " 32 0.000 0.000 0.000 0.000 axis.py:562(formatter)\n", " 3 0.000 0.000 0.000 0.000 background_2d.py:241(_validate_array)\n", - " 42 0.000 0.000 0.000 0.000 re.py:250(compile)\n", - " 16 0.000 0.000 0.000 0.000 {method '__subclasses__' of 'type' objects}\n", - " 16 0.000 0.000 0.000 0.000 axis.py:1567(set_major_formatter)\n", - " 1 0.000 0.000 0.000 0.000 fitting.py:1682(_validate_constraints)\n", - " 10 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(column_stack)\n", - " 13 0.000 0.000 0.000 0.000 stride_tricks.py:536()\n", - " 36 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", - " 5 0.000 0.000 0.000 0.000 _base.py:2942(_get_axis_map)\n", - " 8 0.000 0.000 0.000 0.000 transforms.py:2327(blended_transform_factory)\n", - " 6 0.000 0.000 0.000 0.000 __init__.py:276(__getattr__)\n", - " 1 0.000 0.000 0.000 0.000 backend_bases.py:2776(__init__)\n", - " 8 0.000 0.000 0.000 0.000 __init__.py:1661(safe_first_element)\n", - " 2 0.000 0.000 0.000 0.000 core.py:2227(__init__)\n", - " 4 0.000 0.000 0.000 0.000 attributes.py:38(__set__)\n", - " 1 0.000 0.000 0.000 0.000 minimizer.py:800(_int2ext_cov_x)\n", - " 2 0.000 0.000 0.000 0.000 table.py:1451()\n", - " 7 0.000 0.000 0.000 0.000 _dtype.py:24(_kind_name)\n", - " 1 0.000 0.000 0.003 0.003 mpl_normalize.py:68(__init__)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:771(limit_range_for_scale)\n", - " 31 0.000 0.000 0.000 0.000 text.py:1209(set_text)\n", - " 1 0.000 0.000 0.015 0.015 background_2d.py:477(_make_mesh_image)\n", + " 3 0.000 0.000 0.000 0.000 lapack.py:1029(_check_work_float)\n", + " 2 0.000 0.000 0.002 0.001 filters.py:1023(maximum_filter1d)\n", + " 3 0.000 0.000 0.000 0.000 _base.py:863(get_xaxis_text1_transform)\n", + " 1 0.000 0.000 0.010 0.010 daofinder.py:398(cutout_convdata)\n", + " 1 0.000 0.000 0.000 0.000 {method 'mean' of 'numpy.ndarray' objects}\n", + " 13 0.000 0.000 0.000 0.000 _ni_support.py:36(_extend_mode_to_code)\n", + " 71 0.000 0.000 0.000 0.000 table.py:1463()\n", " 1 0.000 0.000 0.000 0.000 core.py:5961(take)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:620(flux)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:227(__getitem__)\n", - " 28 0.000 0.000 0.000 0.000 spines.py:549(__getattr__)\n", - " 79 0.000 0.000 0.000 0.000 twodim_base.py:230(_diag_dispatcher)\n", + " 8 0.000 0.000 0.000 0.000 fitting.py:1696()\n", + " 2 0.000 0.000 0.000 0.000 background_2d.py:231(_process_size_input)\n", + " 8 0.000 0.000 0.000 0.000 core.py:2565(unit_scale_converter)\n", + " 4 0.000 0.000 0.000 0.000 attributes.py:38(__set__)\n", " 5 0.000 0.000 0.000 0.000 stride_tricks.py:544()\n", - " 3 0.000 0.000 0.004 0.001 axis.py:2052(_get_tick)\n", - " 1 0.000 0.000 0.000 0.000 image.py:773(_get_scaled_image_data)\n", - " 3 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(meshgrid)\n", - " 38 0.000 0.000 0.000 0.000 stride_tricks.py:540()\n", - " 1 0.000 0.000 0.003 0.003 measurements.py:239(find_objects)\n", - " 17 0.000 0.000 0.000 0.000 font_manager.py:1109(get_default_size)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:492(set_pickradius)\n", - " 16 0.000 0.000 0.000 0.000 font_manager.py:721(__eq__)\n", - " 8 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.interp}\n", - " 1 0.000 0.000 0.000 0.000 _base.py:751(set_figure)\n", - " 2 0.000 0.000 0.007 0.003 filters.py:210(gaussian_filter1d)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:2257(add_image)\n", - " 18 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects}\n", - " 62 0.000 0.000 0.000 0.000 axis.py:558(formatter)\n", - " 16 0.000 0.000 0.000 0.000 ticker.py:480(set_useOffset)\n", + " 6 0.000 0.000 0.000 0.000 helper.py:32()\n", + " 64 0.000 0.000 0.000 0.000 ticker.py:183(set_axis)\n", + " 1 0.000 0.000 0.008 0.008 background_2d.py:398(_prepare_box_data)\n", + " 28 0.000 0.000 0.000 0.000 {method '__exit__' of '_thread.RLock' objects}\n", + " 6/4 0.000 0.000 0.007 0.002 axis.py:581(__get__)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:66(__init__)\n", " 4 0.000 0.000 0.000 0.000 attributes.py:123(_validate)\n", - " 8/7 0.000 0.000 0.000 0.000 hdulist.py:1147(_try_while_unread_hdus)\n", - " 2 0.000 0.000 0.000 0.000 twodim_base.py:161(eye)\n", - " 6 0.000 0.000 0.000 0.000 helper.py:15(_iterable_of_int)\n", - " 2 0.000 0.000 0.000 0.000 core.py:104(__init__)\n", - " 21 0.000 0.000 0.000 0.000 parameter.py:847(__set_expression)\n", - " 6 0.000 0.000 0.000 0.000 axis.py:190(_set_labelrotation)\n", - " 22 0.000 0.000 0.000 0.000 text.py:1160(set_y)\n", - " 2 0.000 0.000 0.000 0.000 twodim_base.py:370(tri)\n", + " 16 0.000 0.000 0.000 0.000 fromnumeric.py:601(transpose)\n", + " 36 0.000 0.000 0.000 0.000 {method 'count' of 'str' objects}\n", + " 15 0.000 0.000 0.000 0.000 column.py:450(data)\n", + " 11 0.000 0.000 0.000 0.000 {method 'translate' of 'str' objects}\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1208(set_markersize)\n", + " 2 0.000 0.000 0.000 0.000 core.py:181(_power_unit)\n", + " 1 0.000 0.000 0.000 0.000 image.py:233(__init__)\n", + " 42 0.000 0.000 0.000 0.000 tokenize.py:319(read_or_stop)\n", + " 15/11 0.000 0.000 0.006 0.001 deprecation.py:291(wrapper)\n", + " 2 0.000 0.000 0.002 0.001 shape_base.py:56(take_along_axis)\n", + " 1 0.000 0.000 0.014 0.014 background_2d.py:477(_make_mesh_image)\n", + " 9 0.000 0.000 0.000 0.000 {method 'repeat' of 'numpy.ndarray' objects}\n", " 1 0.000 0.000 0.000 0.000 {built-in method _warnings.warn}\n", - " 1 0.000 0.000 0.000 0.000 lbfgsb.py:428(__init__)\n", - " 6 0.000 0.000 0.000 0.000 helper.py:32()\n", - " 23 0.000 0.000 0.001 0.000 header.py:1969(__get__)\n", + " 13 0.000 0.000 0.000 0.000 __init__.py:823(clean)\n", " 2 0.000 0.000 0.000 0.000 header.py:2064(fromfile)\n", - " 4 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(prod)\n", - " 14 0.000 0.000 0.000 0.000 fromnumeric.py:601(transpose)\n", - " 2 0.000 0.000 0.018 0.009 deprecation.py:445(wrapper)\n", - " 1 0.000 0.000 0.008 0.008 core.py:5577(sort)\n", - " 10 0.000 0.000 0.000 0.000 shape_base.py:608(_column_stack_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 function_base.py:4360()\n", - " 24 0.000 0.000 0.000 0.000 {built-in method math.ceil}\n", - " 3 0.000 0.000 0.000 0.000 __init__.py:1043(__init__)\n", - " 1 0.000 0.000 0.017 0.017 _subplots.py:14(__init__)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1173(set_markerfacecolor)\n", - " 3 0.000 0.000 0.000 0.000 _base.py:939(get_yaxis_text1_transform)\n", - " 3 0.000 0.000 0.000 0.000 _base.py:889(get_xaxis_text2_transform)\n", + " 1 0.000 0.000 0.089 0.089 background_2d.py:653(background)\n", + " 6 0.000 0.000 0.000 0.000 __init__.py:276(__getattr__)\n", + " 10 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(column_stack)\n", + " 1 0.000 0.000 0.001 0.001 backend_bases.py:3487(new_figure_manager)\n", + " 2 0.000 0.000 0.000 0.000 __init__.py:570(__init__)\n", + " 3 0.000 0.000 0.000 0.000 _base.py:939(get_yaxis_text1_transform)\n", + " 1 0.000 0.000 0.000 0.000 image.py:963(set_extent)\n", + " 2 0.000 0.000 0.001 0.001 base.py:303(readfrom)\n", + " 2 0.000 0.000 0.000 0.000 core.py:5039(sum)\n", + " 2 0.000 0.000 0.001 0.001 parameter.py:47(__init__)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:803(_set_lim_and_transforms)\n", + " 8 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.interp}\n", + " 1 0.000 0.000 0.008 0.008 core.py:5577(sort)\n", + " 2 0.000 0.000 0.000 0.000 inspect.py:2781(__init__)\n", + " 1 0.000 0.000 0.000 0.000 image.py:690(set_data)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1193(set_markeredgewidth)\n", + " 1 0.000 0.000 0.000 0.000 header.py:2031(__init__)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:668(get_position)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:157(__init__)\n", + " 4 0.000 0.000 0.000 0.000 transforms.py:1735(_set)\n", + " 3 0.000 0.000 0.000 0.000 blas.py:383(getter)\n", + " 12 0.000 0.000 0.000 0.000 core.py:3253(__getattr__)\n", + " 2 0.000 0.000 0.001 0.000 core.py:430(__init__)\n", + " 1 0.000 0.000 0.000 0.000 core.py:289(__init__)\n", + " 6 0.000 0.000 0.000 0.000 _base.py:2939(_get_axis_list)\n", + " 22 0.000 0.000 0.000 0.000 text.py:1149(set_x)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:492(set_pickradius)\n", + " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(isrealobj)\n", + " 1 0.000 0.000 0.003 0.003 measurements.py:239(find_objects)\n", + " 79 0.000 0.000 0.000 0.000 twodim_base.py:230(_diag_dispatcher)\n", + " 42 0.000 0.000 0.000 0.000 re.py:250(compile)\n", + " 1 0.000 0.000 0.015 0.015 figure.py:646(add_subplot)\n", + " 4 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(prod)\n", + " 14 0.000 0.000 0.000 0.000 fromnumeric.py:3127(ndim)\n", + " 4 0.000 0.000 0.000 0.000 spines.py:294(set_position)\n", + " 6 0.000 0.000 0.000 0.000 axis.py:190(_set_labelrotation)\n", " 28/24 0.000 0.000 0.000 0.000 spines.py:200(_ensure_position_is_set)\n", - " 23 0.000 0.000 0.000 0.000 __init__.py:1799(_str_equal)\n", - " 32 0.000 0.000 0.000 0.000 inspect.py:64(ismodule)\n", + " 28 0.000 0.000 0.000 0.000 spines.py:549(__getattr__)\n", + " 56 0.000 0.000 0.000 0.000 daofinder.py:378(islazyproperty)\n", + " 2 0.000 0.000 0.000 0.000 main.py:28(available_methods)\n", + " 7 0.000 0.000 0.000 0.000 _dtype.py:24(_kind_name)\n", + " 6 0.000 0.000 0.000 0.000 getlimits.py:538(max)\n", " 42 0.000 0.000 0.000 0.000 {built-in method builtins.vars}\n", - " 2 0.000 0.000 0.020 0.010 filters.py:1201(maximum_filter)\n", - " 2 0.000 0.000 0.005 0.003 _base.py:3186(grid)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:4360()\n", + " 2 0.000 0.000 0.021 0.010 filters.py:1201(maximum_filter)\n", + " 6 0.000 0.000 0.000 0.000 helper.py:15(_iterable_of_int)\n", + " 6 0.000 0.000 0.000 0.000 table.py:1347(_get_col_cls_for_table)\n", + " 32 0.000 0.000 0.000 0.000 inspect.py:64(ismodule)\n", + " 21 0.000 0.000 0.000 0.000 parameter.py:847(__set_expression)\n", + " 70 0.000 0.000 0.000 0.000 axis.py:357()\n", + " 2 0.000 0.000 0.000 0.000 core.py:2227(__init__)\n", + " 1 0.000 0.000 0.000 0.000 lbfgsb.py:428(__init__)\n", " 4 0.000 0.000 0.000 0.000 axis.py:1437(update_units)\n", - " 12 0.000 0.000 0.000 0.000 row.py:46(__getitem__)\n", - " 6 0.000 0.000 0.000 0.000 arraypad.py:58(_view_roi)\n", + " 8 0.000 0.000 0.000 0.000 __init__.py:1661(safe_first_element)\n", + " 2 0.000 0.000 0.007 0.003 filters.py:210(gaussian_filter1d)\n", + " 1 0.000 0.000 0.001 0.001 axis.py:2013(__init__)\n", + " 6 0.000 0.000 0.001 0.000 axis.py:236(set_clip_path)\n", " 2 0.000 0.000 0.003 0.002 axis.py:934(set_clip_path)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:594(xcentroid)\n", - " 10 0.000 0.000 0.000 0.000 header.py:126(__contains__)\n", - " 3 0.000 0.000 0.000 0.000 markers.py:702(_set_tickdown)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:700(safe_masked_invalid)\n", - " 9 0.000 0.000 0.000 0.000 hdulist.py:249(__len__)\n", - " 1 0.000 0.000 0.003 0.003 wfs.py:56(wfs_norm)\n", - " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(trim_zeros)\n", - " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(isrealobj)\n", - " 70 0.000 0.000 0.000 0.000 axis.py:357()\n", + " 31 0.000 0.000 0.000 0.000 text.py:1209(set_text)\n", + " 54 0.000 0.000 0.000 0.000 font_manager.py:887(set_file)\n", + " 8 0.000 0.000 0.000 0.000 transforms.py:1850(is_separable)\n", + " 18 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", + " 5 0.000 0.000 0.000 0.000 _base.py:2942(_get_axis_map)\n", + " 3 0.000 0.000 0.000 0.000 axis.py:503(_apply_tickdir)\n", + " 22 0.000 0.000 0.000 0.000 text.py:1160(set_y)\n", + " 1 0.000 0.000 0.000 0.000 core.py:844(__call__)\n", " 18 0.000 0.000 0.000 0.000 lines.py:1010(set_antialiased)\n", + " 1 0.000 0.000 0.014 0.014 _convolution.py:14(_filter_data)\n", + " 10 0.000 0.000 0.000 0.000 header.py:126(__contains__)\n", + " 2 0.000 0.000 0.000 0.000 core.py:6765(__call__)\n", " 1 0.000 0.000 0.000 0.000 signaltools.py:395(_init_freq_conv_axes)\n", - " 18 0.000 0.000 0.000 0.000 _base.py:2940()\n", - " 1 0.000 0.000 0.001 0.001 __init__.py:1409(inner)\n", - " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(convolve)\n", - " 1 0.000 0.000 0.000 0.000 core.py:5215(mean)\n", - " 31 0.000 0.000 0.000 0.000 type_check.py:206(_is_type_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 lapack.py:1029(_check_work_float)\n", - " 1 0.000 0.000 0.000 0.000 fractions.py:62(__new__)\n", - " 1 0.000 0.000 0.003 0.003 mpl_normalize.py:96(_set_limits)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:602(roundness2)\n", - " 2 0.000 0.000 0.000 0.000 background_2d.py:231(_process_size_input)\n", - " 1 0.000 0.000 0.091 0.091 background_2d.py:653(background)\n", - " 2 0.000 0.000 0.000 0.000 utils.py:225(validate_power)\n", - " 2 0.000 0.000 0.000 0.000 twodim_base.py:475(triu)\n", + " 2 0.000 0.000 0.000 0.000 table.py:1451()\n", + " 3 0.000 0.000 0.000 0.000 axis.py:442(_apply_tickdir)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:227(__getitem__)\n", + " 2 0.000 0.000 0.002 0.001 core.py:2143(copy)\n", + " 3 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(meshgrid)\n", + " 6 0.000 0.000 0.000 0.000 getlimits.py:525(min)\n", + " 16 0.000 0.000 0.000 0.000 {method '__subclasses__' of 'type' objects}\n", + " 1 0.000 0.000 0.003 0.003 mpl_normalize.py:68(__init__)\n", + " 6 0.000 0.000 0.000 0.000 arraypad.py:58(_view_roi)\n", + " 1 0.000 0.000 0.000 0.000 _methods.py:274(_ptp)\n", + " 8 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(interp)\n", + " 16 0.000 0.000 0.000 0.000 axis.py:1567(set_major_formatter)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:1493(_set_title_offset_trans)\n", + " 1 0.000 0.000 0.015 0.015 _subplots.py:14(__init__)\n", + " 23 0.000 0.000 0.001 0.000 header.py:1969(__get__)\n", + " 1 0.000 0.000 0.000 0.000 minimizer.py:822()\n", + " 12 0.000 0.000 0.000 0.000 row.py:46(__getitem__)\n", + " 10 0.000 0.000 0.000 0.000 shape_base.py:608(_column_stack_dispatcher)\n", + " 32 0.000 0.000 0.000 0.000 axis.py:687(isDefault_majloc)\n", + " 1 0.000 0.000 0.000 0.000 backend_bases.py:2776(__init__)\n", " 8 0.000 0.000 0.000 0.000 :575(_module_repr_from_spec)\n", + " 1 0.000 0.000 0.000 0.000 minimizer.py:800(_int2ext_cov_x)\n", + " 23 0.000 0.000 0.000 0.000 __init__.py:1799(_str_equal)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:1785(get_mode)\n", + " 18 0.000 0.000 0.000 0.000 {method 'rsplit' of 'str' objects}\n", + " 1 0.000 0.000 0.001 0.001 axis.py:2279(__init__)\n", + " 2 0.000 0.000 0.005 0.003 _base.py:3186(grid)\n", " 3 0.000 0.000 0.000 0.000 axis.py:453(update_position)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:695(isDefault_majfmt)\n", - " 47 0.000 0.000 0.000 0.000 polynomial.py:1191(x_window)\n", - " 4 0.000 0.000 0.000 0.000 {method 'newbyteorder' of 'numpy.dtype' objects}\n", - " 5 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(polyfit)\n", - " 18 0.000 0.000 0.000 0.000 lines.py:537(set_markevery)\n", - " 1 0.000 0.000 0.007 0.007 background_2d.py:398(_prepare_box_data)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:727(get_family)\n", - " 18 0.000 0.000 0.000 0.000 {method 'copy' of 'dict' objects}\n", - " 1 0.000 0.000 0.000 0.000 parameters.py:193(__init__)\n", - " 1 0.000 0.000 0.059 0.059 base.py:18(__call__)\n", - " 42 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1001(intervalx)\n", - " 6 0.000 0.000 0.000 0.000 {method 'min' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 core.py:6765(__call__)\n", - " 2 0.000 0.000 0.002 0.001 shape_base.py:56(take_along_axis)\n", - " 1 0.000 0.000 0.000 0.000 {method 'difference' of 'set' objects}\n", - " 2 0.000 0.000 0.000 0.000 _base.py:991(_update_transScale)\n", - " 9 0.000 0.000 0.000 0.000 row.py:32(__init__)\n", - " 16 0.000 0.000 0.000 0.000 axis.py:1593(set_minor_formatter)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:907(get_math_fontfamily)\n", - " 1 0.000 0.000 0.000 0.000 utils.py:198(maybe_simple_fraction)\n", - " 8 0.000 0.000 0.000 0.000 _methods.py:38(_amax)\n", - " 4 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(may_share_memory)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:711(isDefault_minfmt)\n", - " 1 0.000 0.000 0.000 0.000 core.py:289(__init__)\n", - " 1 0.000 0.000 0.024 0.024 background_2d.py:543(_unfiltered_background_mesh)\n", - " 52 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", " 3 0.000 0.000 0.000 0.000 _base.py:965(get_yaxis_text2_transform)\n", - " 1 0.000 0.000 0.001 0.001 pyplot.py:303(new_figure_manager)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1070(set)\n", - " 42 0.000 0.000 0.000 0.000 {method 'span' of 're.Match' objects}\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:620(flux)\n", + " 8 0.000 0.000 0.000 0.000 transforms.py:2327(blended_transform_factory)\n", + " 1 0.000 0.000 0.024 0.024 background_2d.py:543(_unfiltered_background_mesh)\n", + " 9 0.000 0.000 0.000 0.000 row.py:32(__init__)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:751(set_figure)\n", + " 31 0.000 0.000 0.000 0.000 type_check.py:206(_is_type_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 fractions.py:62(__new__)\n", + " 3 0.000 0.000 0.000 0.000 helper.py:161(_workers)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:2257(add_image)\n", + " 1 0.000 0.000 0.003 0.003 wfs.py:56(wfs_norm)\n", " 12 0.000 0.000 0.000 0.000 {method 'index' of 'str' objects}\n", - " 4 0.000 0.000 0.000 0.000 _base.py:74(wrapper)\n", - " 6 0.000 0.000 0.000 0.000 function_helpers.py:304()\n", + " 3 0.000 0.000 0.004 0.001 axis.py:2320(_get_tick)\n", + " 3 0.000 0.000 0.000 0.000 axis.py:514(update_position)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:537(set_markevery)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1173(set_markerfacecolor)\n", + " 2 0.000 0.000 0.001 0.000 core.py:432(__init__)\n", + " 1 0.000 0.000 0.000 0.000 utils.py:198(maybe_simple_fraction)\n", + " 8/7 0.000 0.000 0.000 0.000 hdulist.py:1147(_try_while_unread_hdus)\n", + " 4 0.000 0.000 0.000 0.000 {method 'newbyteorder' of 'numpy.dtype' objects}\n", + " 9 0.000 0.000 0.000 0.000 _methods.py:38(_amax)\n", " 9 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(repeat)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:1018(__init__)\n", - " 8 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(interp)\n", - " 3 0.000 0.000 0.000 0.000 helper.py:150(_normalization)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:419(get_subplot_params)\n", - " 3 0.000 0.000 0.000 0.000 axis.py:503(_apply_tickdir)\n", - " 12 0.000 0.000 0.000 0.000 arraypad.py:33(_slice_at_axis)\n", - " 10 0.000 0.000 0.000 0.000 linalg.py:107(_makearray)\n", - " 1 0.000 0.000 0.000 0.000 backend_inline.py:59(draw_if_interactive)\n", - " 47 0.000 0.000 0.000 0.000 polynomial.py:1199(y_window)\n", + " 1 0.000 0.000 0.000 0.000 {method 'difference' of 'set' objects}\n", + " 19 0.000 0.000 0.000 0.000 text.py:1283(set_parse_math)\n", + " 16 0.000 0.000 0.000 0.000 font_manager.py:721(__eq__)\n", + " 1 0.000 0.000 0.000 0.000 base.py:129(__init__)\n", + " 2 0.000 0.000 0.000 0.000 numeric.py:2179(allclose)\n", " 5 0.000 0.000 0.000 0.000 core.py:92(isscalar)\n", + " 2 0.000 0.000 0.000 0.000 histograms.py:454(_search_sorted_inclusive)\n", + " 42 0.000 0.000 0.000 0.000 {method 'span' of 're.Match' objects}\n", + " 17 0.000 0.000 0.000 0.000 font_manager.py:1109(get_default_size)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1070(set)\n", + " 2 0.000 0.000 0.000 0.000 main.py:79(validate_method)\n", + " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(convolve)\n", + " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(take)\n", " 50 0.000 0.000 0.000 0.000 numeric.py:72(_zeros_like_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 numeric.py:289(full)\n", - " 63 0.000 0.000 0.000 0.000 parameter.py:833(expr)\n", - " 1 0.000 0.000 1.057 1.057 minimizer.py:2257(minimize)\n", - " 19 0.000 0.000 0.000 0.000 text.py:1283(set_parse_math)\n", - " 3 0.000 0.000 0.000 0.000 quantity.py:1142(__truediv__)\n", - " 3 0.000 0.000 0.000 0.000 {method 'round' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(round_)\n", - " 1 0.000 0.000 0.000 0.000 minimizer.py:837()\n", - " 1 0.000 0.000 0.030 0.030 fitting.py:171(wrapper)\n", - " 8 0.000 0.000 0.000 0.000 table.py:833()\n", - " 6 0.000 0.000 0.000 0.000 table.py:1347(_get_col_cls_for_table)\n", + " 3 0.000 0.000 0.000 0.000 _base.py:889(get_xaxis_text2_transform)\n", + " 1 0.000 0.000 0.000 0.000 image.py:773(_get_scaled_image_data)\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", + " 9 0.000 0.000 0.000 0.000 hdulist.py:249(__len__)\n", + " 3 0.000 0.000 0.000 0.000 util.py:362(isfile)\n", + " 1 0.000 0.000 0.006 0.006 core.py:5415(argsort)\n", " 39 0.000 0.000 0.000 0.000 stride_tricks.py:344()\n", - " 1 0.000 0.000 0.004 0.004 zernike.py:1018(rms)\n", - " 3 0.000 0.000 0.000 0.000 _collections_abc.py:779(items)\n", - " 32 0.000 0.000 0.000 0.000 axis.py:703(isDefault_minloc)\n", - " 4 0.000 0.000 0.001 0.000 spines.py:206(register_axis)\n", - " 5 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(lstsq)\n", - " 30 0.000 0.000 0.000 0.000 multiarray.py:148(concatenate)\n", + " 8 0.000 0.000 0.000 0.000 :278(_module_repr)\n", + " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(trim_zeros)\n", + " 42 0.000 0.000 0.000 0.000 {method 'encode' of 'str' objects}\n", " 1 0.000 0.000 0.000 0.000 minimizer.py:394(__init__)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:1587(set_aspect)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:373(_lazyproperties)\n", + " 5 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(polyfit)\n", + " 6 0.000 0.000 0.000 0.000 __init__.py:1043(__init__)\n", + " 1 0.000 0.000 0.001 0.001 __init__.py:1409(inner)\n", + " 2 0.000 0.000 0.016 0.008 deprecation.py:445(wrapper)\n", + " 2 0.000 0.000 0.000 0.000 function_helpers.py:299(_as_quantities)\n", + " 5 0.000 0.000 0.000 0.000 validate.py:994(is_list)\n", + " 22 0.000 0.000 0.000 0.000 {built-in method math.ceil}\n", + " 1 0.000 0.000 0.003 0.003 zernike.py:1019(rms)\n", + " 3 0.000 0.000 0.003 0.001 axis.py:2052(_get_tick)\n", + " 12 0.000 0.000 0.000 0.000 core.py:14(has_units)\n", + " 5 0.000 0.000 0.000 0.000 validate.py:1180(is_string_list)\n", + " 3 0.000 0.000 0.000 0.000 fromnumeric.py:93(take)\n", + " 3 0.000 0.000 0.000 0.000 helper.py:150(_normalization)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1001(intervalx)\n", + " 2 0.000 0.000 0.002 0.001 fitting.py:1708(_validate_model)\n", + " 4 0.000 0.000 0.000 0.000 file.py:232(read)\n", " 8 0.000 0.000 0.000 0.000 index_tricks.py:170()\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.round}\n", - " 18 0.000 0.000 0.000 0.000 lines.py:1183(set_markerfacecoloralt)\n", - " 2 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", - " 3 0.000 0.000 0.003 0.001 axis.py:2320(_get_tick)\n", + " 10 0.000 0.000 0.000 0.000 linalg.py:107(_makearray)\n", + " 24 0.000 0.000 0.000 0.000 __init__.py:1060(__setitem__)\n", + " 29 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", + " 62 0.000 0.000 0.000 0.000 axis.py:558(formatter)\n", + " 4 0.000 0.000 0.000 0.000 axis.py:771(limit_range_for_scale)\n", + " 6 0.000 0.000 0.000 0.000 function_helpers.py:304()\n", + " 4 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(may_share_memory)\n", + " 1 0.000 0.000 0.000 0.000 parse.py:372(urlparse)\n", + " 3 0.000 0.000 0.000 0.000 _collections_abc.py:779(items)\n", + " 13 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", + " 1 0.000 0.000 0.000 0.000 parameters.py:193(__init__)\n", + " 1 0.000 0.000 0.003 0.003 mpl_normalize.py:96(_set_limits)\n", " 12 0.000 0.000 0.000 0.000 cycler.py:165(keys)\n", - " 1 0.000 0.000 0.001 0.001 hdulist.py:864(update_extend)\n", + " 18 0.000 0.000 0.000 0.000 _base.py:2940()\n", + " 2 0.000 0.000 0.000 0.000 figure.py:84(add)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:594(xcentroid)\n", + " 3 0.000 0.000 0.000 0.000 file.py:373(seek)\n", " 1 0.000 0.000 0.000 0.000 base.py:949(size)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:1782(get_mode)\n", - " 5 0.000 0.000 0.000 0.000 validate.py:994(is_list)\n", - " 3 0.000 0.000 0.000 0.000 fromnumeric.py:3730(round_)\n", - " 42 0.000 0.000 0.000 0.000 {method 'readline' of '_io.BytesIO' objects}\n", + " 1 0.000 0.000 0.000 0.000 core.py:5215(mean)\n", + " 15 0.000 0.000 0.000 0.000 stride_tricks.py:25(_maybe_view_as_subclass)\n", + " 52 0.000 0.000 0.000 0.000 {method 'isidentifier' of 'str' objects}\n", " 21 0.000 0.000 0.000 0.000 parameter.py:838(expr)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:116(_generate_coeff_names)\n", - " 5 0.000 0.000 0.000 0.000 {method 'std' of 'numpy.ndarray' objects}\n", - " 13 0.000 0.000 0.000 0.000 _collections_abc.py:760(get)\n", - " 6 0.000 0.000 0.000 0.000 _collections_abc.py:767(__contains__)\n", - " 1 0.000 0.000 1.057 1.057 minimizer.py:2440(minimize)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:1493(_set_title_offset_trans)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:752(get_weight)\n", - " 6 0.000 0.000 0.000 0.000 lines.py:996(get_path)\n", - " 2 0.000 0.000 0.000 0.000 _methods.py:91(_clip_dep_is_scalar_nan)\n", + " 1 0.000 0.000 1.068 1.068 minimizer.py:2440(minimize)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:776(_add_axes_internal)\n", + " 3 0.000 0.000 0.000 0.000 markers.py:682(_set_tickleft)\n", + " 1 0.000 0.000 0.001 0.001 pyplot.py:303(new_figure_manager)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:225(validate_power)\n", + " 3 0.000 0.000 0.000 0.000 {method 'round' of 'numpy.ndarray' objects}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.c_einsum}\n", + " 3 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(nanmean)\n", " 44 0.000 0.000 0.000 0.000 numeric.py:2253(_isclose_dispatcher)\n", + " 6 0.000 0.000 0.000 0.000 lines.py:996(get_path)\n", + " 12 0.000 0.000 0.000 0.000 arraypad.py:33(_slice_at_axis)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:121(__init__)\n", + " 3 0.000 0.000 0.000 0.000 quantity.py:1142(__truediv__)\n", " 9 0.000 0.000 0.000 0.000 fromnumeric.py:436(repeat)\n", - " 1 0.000 0.000 0.014 0.014 filters.py:756(convolve)\n", - " 2 0.000 0.000 0.000 0.000 figure.py:84(add)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:739(get_style)\n", - " 1 0.000 0.000 0.000 0.000 cm.py:555(norm)\n", - " 2 0.000 0.000 0.000 0.000 main.py:41(_is_regular)\n", - " 5 0.000 0.000 0.000 0.000 validate.py:1180(is_string_list)\n", - " 1 0.000 0.000 0.000 0.000 shape_base.py:285(hstack)\n", - " 2 0.000 0.000 0.000 0.000 blas.py:383(getter)\n", - " 42 0.000 0.000 0.000 0.000 enum.py:792(value)\n", - " 3 0.000 0.000 0.000 0.000 axis.py:514(update_position)\n", - " 2 0.000 0.000 0.000 0.000 core.py:776(__pow__)\n", - " 2 0.000 0.000 0.000 0.000 header.py:2003(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method numpy.core._multiarray_umath.c_einsum}\n", - " 1 0.000 0.000 0.006 0.006 core.py:5415(argsort)\n", - " 15 0.000 0.000 0.000 0.000 stride_tricks.py:25(_maybe_view_as_subclass)\n", - " 3 0.000 0.000 0.000 0.000 stride_tricks.py:366(broadcast_to)\n", - " 16 0.000 0.000 0.000 0.000 pathlib.py:1089(_init)\n", + " 63 0.000 0.000 0.000 0.000 parameter.py:833(expr)\n", + " 3 0.000 0.000 0.000 0.000 markers.py:702(_set_tickdown)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:700(safe_masked_invalid)\n", + " 8 0.000 0.000 0.000 0.000 table.py:833()\n", + " 4 0.000 0.000 0.000 0.000 base.py:1205(isspmatrix)\n", + " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(round_)\n", + " 2 0.000 0.000 0.000 0.000 _methods.py:91(_clip_dep_is_scalar_nan)\n", + " 1 0.000 0.000 0.000 0.000 posixpath.py:117(splitext)\n", + " 1 0.000 0.000 0.000 0.000 backend_inline.py:59(draw_if_interactive)\n", + " 32 0.000 0.000 0.000 0.000 axis.py:695(isDefault_majfmt)\n", + " 32 0.000 0.000 0.000 0.000 axis.py:703(isDefault_minloc)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:727(get_family)\n", + " 18 0.000 0.000 0.000 0.000 lines.py:1183(set_markerfacecoloralt)\n", + " 30 0.000 0.000 0.000 0.000 multiarray.py:148(concatenate)\n", + " 1 0.000 0.000 1.068 1.068 minimizer.py:2257(minimize)\n", " 5 0.000 0.000 0.001 0.000 _base.py:1141()\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2750(clf)\n", - " 1 0.000 0.000 0.000 0.000 cm.py:342(__init__)\n", - " 6 0.000 0.000 0.000 0.000 core.py:3253(__getattr__)\n", - " 8 0.000 0.000 0.000 0.000 hdulist.py:765(_positive_index_of)\n", - " 6 0.000 0.000 0.000 0.000 _methods.py:42(_amin)\n", - " 1 0.000 0.000 0.000 0.000 _methods.py:125(_clip)\n", + " 4 0.000 0.000 0.000 0.000 _base.py:74(wrapper)\n", + " 1 0.000 0.000 0.061 0.061 base.py:18(__call__)\n", + " 5 0.000 0.000 0.000 0.000 {method 'std' of 'numpy.ndarray' objects}\n", + " 1 0.000 0.000 0.000 0.000 shape_base.py:285(hstack)\n", + " 3 0.000 0.000 0.000 0.000 stride_tricks.py:366(broadcast_to)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:419(get_subplot_params)\n", + " 6/2 0.000 0.000 0.000 0.000 core.py:3878(make_subtree_dict)\n", + " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(allclose)\n", + " 3 0.000 0.000 0.000 0.000 fromnumeric.py:3730(round_)\n", + " 2 0.000 0.000 0.000 0.000 numeric.py:289(full)\n", + " 1 0.000 0.000 0.000 0.000 parse.py:437(urlsplit)\n", + " 42 0.000 0.000 0.000 0.000 enum.py:792(value)\n", + " 1 0.000 0.000 0.000 0.000 cm.py:555(norm)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:373(_lazyproperties)\n", + " 1 0.000 0.000 0.000 0.000 data.py:131(is_url)\n", " 5 0.000 0.000 0.000 0.000 polynomial.py:1316(__call__)\n", - " 1 0.000 0.000 0.000 0.000 parse.py:372(urlparse)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:121(__init__)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:775(get_size_in_points)\n", - " 4 0.000 0.000 0.000 0.000 ticker.py:1640(nonsingular)\n", - " 16 0.000 0.000 0.000 0.000 __init__.py:115(__hash__)\n", - " 8 0.000 0.000 0.000 0.000 table.py:1482(itercols)\n", - " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(vander)\n", - " 15 0.000 0.000 0.000 0.000 linalg.py:125(_realType)\n", - " 8 0.000 0.000 0.000 0.000 :278(_module_repr)\n", - " 29 0.000 0.000 0.000 0.000 {built-in method _operator.index}\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1006(intervaly)\n", - " 3 0.000 0.000 0.000 0.000 helper.py:161(_workers)\n", - " 2 0.000 0.000 0.000 0.000 function_helpers.py:299(_as_quantities)\n", - " 1 0.000 0.000 0.000 0.000 groups.py:280(match_header)\n", - " 3 0.000 0.000 0.000 0.000 fromnumeric.py:3220(around)\n", + " 11 0.000 0.000 0.000 0.000 shape_base.py:207(_arrays_for_stack_dispatcher)\n", + " 5 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(lstsq)\n", " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(broadcast_to)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:776(_add_axes_internal)\n", - " 1 0.000 0.000 0.018 0.018 pyplot.py:1300(subplots)\n", - " 2 0.000 0.000 0.000 0.000 table.py:186(_get_names_from_list_of_dict)\n", - " 2 0.000 0.000 0.000 0.000 core.py:2258()\n", - " 3 0.000 0.000 0.000 0.000 file.py:373(seek)\n", " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(linspace)\n", - " 1 0.000 0.000 0.000 0.000 copy.py:66(copy)\n", - " 13 0.000 0.000 0.000 0.000 {method 'endswith' of 'str' objects}\n", " 1 0.000 0.000 0.003 0.003 optimize.py:173(_prepare_scalar_function)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:746(get_variant)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1752(set)\n", - " 30 0.000 0.000 0.000 0.000 ticker.py:265(_set_locator)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:598(ycentroid)\n", - " 2 0.000 0.000 0.000 0.000 core.py:133(_validate_inputs)\n", - " 3 0.000 0.000 0.000 0.000 file.py:383(tell)\n", - " 2 0.000 0.000 0.000 0.000 {method 'argmax' of 'numpy.ndarray' objects}\n", - " 4 0.000 0.000 0.000 0.000 getlimits.py:538(max)\n", - " 12 0.000 0.000 0.000 0.000 inspect.py:2830()\n", - " 2 0.000 0.000 0.000 0.000 axis.py:2239(get_minpos)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:778(get_file)\n", - " 1 0.000 0.000 0.000 0.000 cm.py:259(get_cmap)\n", - " 1 0.000 0.000 0.000 0.000 {method 'mean' of 'numpy.ndarray' objects}\n", - " 3 0.000 0.000 0.001 0.000 <__array_function__ internals>:2(nanmean)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:494(unwrap)\n", + " 16 0.000 0.000 0.000 0.000 axis.py:1593(set_minor_formatter)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:1109(_gen_axes_patch)\n", + " 1 0.000 0.000 0.013 0.013 daofinder.py:570(dx_hx)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:602(roundness2)\n", + " 2 0.000 0.000 0.000 0.000 core.py:776(__pow__)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:4373()\n", + " 15 0.000 0.000 0.000 0.000 linalg.py:125(_realType)\n", + " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(triu)\n", " 1 0.000 0.000 0.000 0.000 image.py:913(__init__)\n", - " 48 0.000 0.000 0.000 0.000 font_manager.py:761(get_stretch)\n", + " 4 0.000 0.000 0.000 0.000 ticker.py:1640(nonsingular)\n", + " 1 0.000 0.000 0.000 0.000 detect.py:126(_make_binary_structure)\n", + " 1 0.000 0.000 0.000 0.000 copy.py:66(copy)\n", + " 13 0.000 0.000 0.000 0.000 _collections_abc.py:760(get)\n", + " 1 0.000 0.000 0.016 0.016 pyplot.py:1300(subplots)\n", + " 8 0.000 0.000 0.000 0.000 table.py:1482(itercols)\n", + " 2 0.000 0.000 0.000 0.000 core.py:2258()\n", + " 42 0.000 0.000 0.000 0.000 {method 'readline' of '_io.BytesIO' objects}\n", + " 16 0.000 0.000 0.000 0.000 ticker.py:480(set_useOffset)\n", " 1 0.000 0.000 0.000 0.000 daofinder.py:616(peak)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:638(npix)\n", - " 12 0.000 0.000 0.000 0.000 core.py:14(has_units)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:3150(set_axisbelow)\n", + " 2 0.000 0.000 0.000 0.000 table.py:186(_get_names_from_list_of_dict)\n", + " 2 0.000 0.000 0.000 0.000 {method 'sort' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 _base.py:991(_update_transScale)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2750(clf)\n", " 1 0.000 0.000 0.000 0.000 _subplots.py:58(set_subplotspec)\n", - " 19 0.000 0.000 0.000 0.000 text.py:543(set_wrap)\n", - " 1 0.000 0.000 0.000 0.000 hdulist.py:964(close)\n", - " 1 0.000 0.000 0.000 0.000 _methods.py:274(_ptp)\n", - " 1 0.000 0.000 0.000 0.000 parameter.py:94()\n", - " 1 0.000 0.000 0.001 0.001 _base.py:1126(_gen_axes_spines)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:1355(add_gridspec)\n", - " 3 0.000 0.000 0.000 0.000 artist.py:1076(set_label)\n", - " 16 0.000 0.000 0.000 0.000 ticker.py:559(set_useMathText)\n", - " 6 0.000 0.000 0.000 0.000 colors.py:96(_sanitize_extrema)\n", - " 1 0.000 0.000 0.000 0.000 fitting.py:1539(_convert_input)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:383(reset_ids)\n", - " 11 0.000 0.000 0.000 0.000 shape_base.py:207(_arrays_for_stack_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 histograms.py:454(_search_sorted_inclusive)\n", - " 1 0.000 0.000 0.000 0.000 posixpath.py:117(splitext)\n", - " 21 0.000 0.000 0.000 0.000 parameter.py:775(scale_gradient)\n", - " 2 0.000 0.000 0.000 0.000 _base.py:236(set_prop_cycle)\n", " 18 0.000 0.000 0.000 0.000 lines.py:1163(set_markeredgecolor)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1710(__init__)\n", - " 2 0.000 0.000 0.000 0.000 main.py:79(validate_method)\n", - " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(around)\n", - " 9 0.000 0.000 0.000 0.000 arraypad.py:120()\n", - " 1 0.000 0.000 0.000 0.000 arraysetops.py:138(unique)\n", - " 21 0.000 0.000 0.000 0.000 __init__.py:1060(__setitem__)\n", - " 1 0.000 0.000 0.004 0.004 zernike.py:995(norm_array)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:1352(get_major_locator)\n", - " 3 0.000 0.000 0.000 0.000 markers.py:682(_set_tickleft)\n", - " 4 0.000 0.000 0.000 0.000 file.py:232(read)\n", - " 1 0.000 0.000 0.000 0.000 file.py:394(close)\n", - " 1 0.000 0.000 0.000 0.000 base.py:914(__init__)\n", - " 2 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.generic' objects}\n", - " 4 0.000 0.000 0.000 0.000 getlimits.py:525(min)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:335(__init__)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2438(set_constrained_layout)\n", - " 11 0.000 0.000 0.000 0.000 __init__.py:876()\n", - " 1 0.000 0.000 0.000 0.000 detect.py:126(_make_binary_structure)\n", - " 3/1 0.000 0.000 0.000 0.000 core.py:3878(make_subtree_dict)\n", - " 2 0.000 0.000 0.000 0.000 core.py:1812(_check_mask_axis)\n", - " 35 0.000 0.000 0.000 0.000 {method 'keys' of 'collections.OrderedDict' objects}\n", - " 2 0.000 0.000 0.000 0.000 colors.py:1145(vmin)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:2071(add)\n", + " 2 0.000 0.000 0.000 0.000 {method 'argmax' of 'numpy.ndarray' objects}\n", + " 15 0.000 0.000 0.000 0.000 {method '__exit__' of 'numpy.nditer' objects}\n", + " 1 0.000 0.000 0.000 0.000 _methods.py:125(_clip)\n", + " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(vander)\n", + " 1 0.000 0.000 0.000 0.000 cm.py:342(__init__)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:899(__init__)\n", + " 1 0.000 0.000 0.000 0.000 file.py:444(_try_read_compressed)\n", " 1 0.000 0.000 0.003 0.003 hdulist.py:399(fromfile)\n", - " 1 0.000 0.000 0.000 0.000 morphology.py:48(_center_is_true)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:1671(set_adjustable)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:1735(set_box_aspect)\n", - " 1 0.000 0.000 0.000 0.000 colors.py:1113(__init__)\n", - " 1 0.000 0.000 0.000 0.000 rcsetup.py:140(validate_bool)\n", - " 1 0.000 0.000 0.002 0.002 core.py:2143(copy)\n", - " 1 0.000 0.000 0.000 0.000 data.py:131(is_url)\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(unravel_index)\n", - " 3 0.000 0.000 0.000 0.000 function_base.py:4373()\n", - " 1 0.000 0.000 0.000 0.000 parse.py:437(urlsplit)\n", - " 9 0.000 0.000 0.000 0.000 helper.py:50()\n", + " 2 0.000 0.000 0.000 0.000 histograms.py:283(_ravel_and_check_weights)\n", + " 1 0.000 0.000 0.000 0.000 parameter.py:94()\n", + " 1 0.000 0.000 0.000 0.000 _base.py:3150(set_axisbelow)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:761(get_stretch)\n", + " 8 0.000 0.000 0.000 0.000 hdulist.py:765(_positive_index_of)\n", + " 2 0.000 0.000 0.000 0.000 util.py:380(fileobj_open)\n", + " 2 0.000 0.000 0.000 0.000 fitting.py:1539(_convert_input)\n", + " 1 0.000 0.000 0.066 0.066 background_2d.py:555(background_mesh)\n", + " 2 0.000 0.000 0.002 0.001 <__array_function__ internals>:2(take_along_axis)\n", + " 33 0.000 0.000 0.000 0.000 {built-in method posix.fspath}\n", + " 1 0.000 0.000 0.000 0.000 minimizer.py:837()\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:746(get_variant)\n", + " 2 0.000 0.000 0.000 0.000 header.py:2003(__getitem__)\n", + " 6 0.000 0.000 0.000 0.000 _methods.py:42(_amin)\n", + " 2 0.000 0.000 0.000 0.000 core.py:1625(_has_units)\n", + " 1 0.000 0.000 0.000 0.000 arraysetops.py:138(unique)\n", + " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(histogram)\n", + " 12 0.000 0.000 0.000 0.000 inspect.py:2830()\n", + " 1 0.000 0.000 0.000 0.000 interpolation.py:769()\n", " 1 0.000 0.000 0.000 0.000 _base.py:1055(_set_position)\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:33(__init__)\n", - " 10 0.000 0.000 0.000 0.000 cycler.py:386()\n", - " 2 0.000 0.000 0.000 0.000 core.py:181(_power_unit)\n", - " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:262(_parse_cenfunc)\n", + " 16 0.000 0.000 0.000 0.000 __init__.py:115(__hash__)\n", + " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(unravel_index)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:1587(set_aspect)\n", + " 19 0.000 0.000 0.000 0.000 text.py:543(set_wrap)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:739(get_style)\n", + " 3 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(around)\n", + " 1 0.000 0.000 0.000 0.000 interface.py:157(__init__)\n", + " 1 0.000 0.000 0.001 0.001 _base.py:1126(_gen_axes_spines)\n", + " 3 0.000 0.000 0.000 0.000 artist.py:1076(set_label)\n", + " 1 0.000 0.000 0.000 0.000 cm.py:259(get_cmap)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1006(intervaly)\n", + " 4 0.000 0.000 0.000 0.000 core.py:1223(sync_constraints)\n", + " 4 0.000 0.000 0.000 0.000 core.py:22(strip_units)\n", " 1 0.000 0.000 0.000 0.000 header.py:542(_from_blocks)\n", - " 1 0.000 0.000 0.000 0.000 file.py:444(_try_read_compressed)\n", - " 1 0.000 0.000 0.017 0.017 figure.py:788(subplots)\n", - " 4 0.000 0.000 0.000 0.000 spines.py:556(__getitem__)\n", - " 1 0.000 0.000 0.000 0.000 core.py:156(labels)\n", - " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(polyval)\n", - " 1 0.000 0.000 0.000 0.000 interpolation.py:769()\n", - " 1 0.000 0.000 0.011 0.011 daofinder.py:570(dx_hx)\n", - " 2 0.000 0.000 0.000 0.000 main.py:28(available_methods)\n", - " 1 0.000 0.000 0.068 0.068 background_2d.py:555(background_mesh)\n", - " 1 0.000 0.000 0.000 0.000 quantity.py:1182(__pow__)\n", + " 1 0.000 0.000 0.001 0.001 hdulist.py:864(update_extend)\n", + " 1 0.000 0.000 0.008 0.008 core.py:6885(sort)\n", + " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(expand_dims)\n", " 1 0.000 0.000 0.000 0.000 genericpath.py:121(_splitext)\n", - " 3 0.000 0.000 0.000 0.000 figure.py:65(as_list)\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(take)\n", - " 9 0.000 0.000 0.000 0.000 arraypad.py:109()\n", - " 2 0.000 0.000 0.000 0.000 numeric.py:2179(allclose)\n", - " 3 0.000 0.000 0.000 0.000 __init__.py:598(push)\n", - " 8 0.000 0.000 0.000 0.000 core.py:72()\n", - " 2 0.000 0.000 0.002 0.001 <__array_function__ internals>:2(take_along_axis)\n", - " 1 0.000 0.000 0.000 0.000 function_helpers.py:311(_quantities2arrays)\n", - " 1 0.000 0.000 0.000 0.000 image.py:109()\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:1790(trim_overscan)\n", - " 15 0.000 0.000 0.000 0.000 linalg.py:112(isComplexType)\n", + " 6 0.000 0.000 0.000 0.000 zernike.py:970(units)\n", " 1 0.000 0.000 0.000 0.000 signaltools.py:494()\n", - " 1 0.000 0.000 0.000 0.000 spines.py:539(from_dict)\n", - " 1 0.000 0.000 0.000 0.000 image.py:762(set_interpolation)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:91(get_num_coeff)\n", - " 1 0.000 0.000 0.000 0.000 core.py:1625(_has_units)\n", - " 1 0.000 0.000 0.000 0.000 file.py:410(_maybe_close_mmap)\n", - " 2 0.000 0.000 0.000 0.000 hdulist.py:262(__iter__)\n", - " 2 0.000 0.000 0.001 0.000 util.py:380(fileobj_open)\n", - " 1 0.000 0.000 0.008 0.008 core.py:6885(sort)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:813(from_bounds)\n", - " 16 0.000 0.000 0.000 0.000 table.py:858(_set_column_attribute)\n", - " 8 0.000 0.000 0.000 0.000 base.py:466()\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:55(_inputs_swap_needed)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:752(get_weight)\n", + " 18 0.000 0.000 0.000 0.000 markers.py:371(_set_nothing)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:638(npix)\n", " 1 0.000 0.000 0.009 0.009 extras.py:634(median)\n", - " 2 0.000 0.000 0.000 0.000 fromnumeric.py:93(take)\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(expand_dims)\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(unique)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:494(unwrap)\n", + " 6 0.000 0.000 0.000 0.000 _collections_abc.py:767(__contains__)\n", + " 1 0.000 0.000 0.003 0.003 zernike.py:996(norm_array)\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:510()\n", + " 1 0.000 0.000 0.000 0.000 interpolation.py:899()\n", + " 1 0.000 0.000 0.000 0.000 figure.py:1355(add_gridspec)\n", + " 4 0.000 0.000 0.001 0.000 spines.py:206(register_axis)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:137(__init__)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:598(ycentroid)\n", + " 8 0.000 0.000 0.000 0.000 hdulist.py:692(index_of)\n", + " 16 0.000 0.000 0.000 0.000 pathlib.py:1089(_init)\n", + " 3 0.000 0.000 0.000 0.000 text.py:524(set_clip_box)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:775(get_size_in_points)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:778(get_file)\n", + " 48 0.000 0.000 0.000 0.000 font_manager.py:907(get_math_fontfamily)\n", + " 1 0.000 0.000 0.000 0.000 core.py:156(labels)\n", + " 8 0.000 0.000 0.000 0.000 core.py:72()\n", + " 3 0.000 0.000 0.000 0.000 file.py:383(tell)\n", + " 2 0.000 0.000 0.000 0.000 core.py:1812(_check_mask_axis)\n", + " 3 0.000 0.000 0.000 0.000 fromnumeric.py:3220(around)\n", + " 20 0.000 0.000 0.000 0.000 function_base.py:1160(_diff_dispatcher)\n", " 3 0.000 0.000 0.000 0.000 type_check.py:344(isrealobj)\n", - " 1 0.000 0.000 0.000 0.000 interface.py:157(__init__)\n", - " 2 0.000 0.000 0.000 0.000 figure.py:61(__init__)\n", - " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:110(_set_new_active_manager)\n", + " 35 0.000 0.000 0.000 0.000 {method 'keys' of 'collections.OrderedDict' objects}\n", + " 1 0.000 0.000 0.000 0.000 _constraints.py:316(old_bound_to_new)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:335(__init__)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:813(from_bounds)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:116(_generate_coeff_names)\n", + " 15 0.000 0.000 0.000 0.000 linalg.py:112(isComplexType)\n", + " 1 0.000 0.000 0.000 0.000 morphology.py:48(_center_is_true)\n", " 3 0.000 0.000 0.000 0.000 markers.py:696(_set_tickup)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:2194(__init__)\n", - " 1 0.000 0.000 0.002 0.002 fitting.py:1708(_validate_model)\n", - " 1 0.000 0.000 0.000 0.000 core.py:39(__init__)\n", - " 4 0.000 0.000 0.000 0.000 numeric.py:1385()\n", - " 3 0.000 0.000 0.000 0.000 axis.py:439(_get_text2_transform)\n", - " 1 0.000 0.000 0.000 0.000 image.py:275(set_alpha)\n", - " 3 0.000 0.000 0.000 0.000 text.py:524(set_clip_box)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1719(_init)\n", - " 1 0.000 0.000 0.000 0.000 header.py:810(clear)\n", - " 2 0.000 0.000 0.000 0.000 file.py:82(_is_bz2file)\n", - " 8 0.000 0.000 0.000 0.000 hdulist.py:692(index_of)\n", - " 1 0.000 0.000 0.000 0.000 util.py:476(_fileobj_normalize_mode)\n", - " 3 0.000 0.000 0.000 0.000 base.py:1205(isspmatrix)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:1209(_coeffs)\n", - " 1 0.000 0.000 0.000 0.000 interface.py:142(__new__)\n", - " 1 0.000 0.000 0.000 0.000 _minimize.py:823(standardize_constraints)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:1492(have_units)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:1109(_gen_axes_patch)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2468(set_constrained_layout_pads)\n", - " 1 0.000 0.000 0.000 0.000 backend_bases.py:3496(new_figure_manager_given_figure)\n", - " 18 0.000 0.000 0.000 0.000 markers.py:371(_set_nothing)\n", - " 15 0.000 0.000 0.000 0.000 {method '__exit__' of 'numpy.nditer' objects}\n", - " 2 0.000 0.000 0.000 0.000 histograms.py:283(_ravel_and_check_weights)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:102(get_linalg_error_extobj)\n", - " 4 0.000 0.000 0.000 0.000 inspect.py:159(isfunction)\n", - " 6 0.000 0.000 0.000 0.000 zernike.py:969(units)\n", - " 1 0.000 0.000 0.000 0.000 _helper.py:70(_init_nd_shape_and_axes)\n", - " 6 0.000 0.000 0.000 0.000 axis.py:222(get_tick_padding)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:1552(_process_projection_requirements)\n", - " 4 0.000 0.000 0.001 0.000 spines.py:219(clear)\n", - " 1 0.000 0.000 0.000 0.000 artist.py:978(_set_alpha_for_array)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:628(bubble)\n", + " 30 0.000 0.000 0.000 0.000 ticker.py:265(_set_locator)\n", + " 3 0.000 0.000 0.000 0.000 __init__.py:598(push)\n", + " 11 0.000 0.000 0.000 0.000 __init__.py:876()\n", + " 2 0.000 0.000 0.000 0.000 core.py:3443(fittable)\n", " 8 0.000 0.000 0.000 0.000 core.py:143()\n", + " 1 0.000 0.000 0.000 0.000 groups.py:280(match_header)\n", " 1 0.000 0.000 0.000 0.000 image.py:222(data)\n", - " 21 0.000 0.000 0.000 0.000 inspect.py:367()\n", - " 1 0.000 0.000 0.000 0.000 warnings.py:130(filterwarnings)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:510()\n", - " 1 0.000 0.000 0.000 0.000 interpolation.py:899()\n", - " 3 0.000 0.000 0.000 0.000 markers.py:688(_set_tickright)\n", - " 4 0.000 0.000 0.000 0.000 scale.py:116(get_transform)\n", - " 2 0.000 0.000 0.000 0.000 colors.py:1173(_changed)\n", - " 16 0.000 0.000 0.000 0.000 __init__.py:269(wrapper)\n", - " 1 0.000 0.000 0.000 0.000 image.py:1029(__init__)\n", - " 1 0.000 0.000 0.000 0.000 base.py:757(_close)\n", + " 9 0.000 0.000 0.000 0.000 arraypad.py:120()\n", + " 16 0.000 0.000 0.000 0.000 fromnumeric.py:597(_transpose_dispatcher)\n", + " 10 0.000 0.000 0.000 0.000 cycler.py:386()\n", + " 16 0.000 0.000 0.000 0.000 table.py:858(_set_column_attribute)\n", " 2 0.000 0.000 0.000 0.000 sputils.py:198(isintlike)\n", - " 1 0.000 0.000 0.000 0.000 stretch.py:118(inverse)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:55(_inputs_swap_needed)\n", - " 1 0.000 0.000 0.000 0.000 _constraints.py:316(old_bound_to_new)\n", + " 4 0.000 0.000 0.000 0.000 numeric.py:1385()\n", + " 21 0.000 0.000 0.000 0.000 parameter.py:775(scale_gradient)\n", + " 9 0.000 0.000 0.000 0.000 helper.py:50()\n", + " 1 0.000 0.000 0.000 0.000 _helper.py:70(_init_nd_shape_and_axes)\n", + " 3 0.000 0.000 0.000 0.000 markers.py:688(_set_tickright)\n", " 1 0.000 0.000 0.000 0.000 core.py:166(max_label)\n", - " 4 0.000 0.000 0.000 0.000 utils.py:209(_validate_domain_window)\n", - " 1 0.000 0.000 0.000 0.000 header.py:460(fromfile)\n", - " 5 0.000 0.000 0.000 0.000 validate.py:1203()\n", - " 12 0.000 0.000 0.000 0.000 axis.py:1512(set_units)\n", - " 3 0.000 0.000 0.000 0.000 util.py:362(isfile)\n", - " 14 0.000 0.000 0.000 0.000 fromnumeric.py:597(_transpose_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2539(ptp)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:1015(_set_artist_props)\n", - " 3 0.000 0.000 0.000 0.000 backend_bases.py:2389(mpl_connect)\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(histogram)\n", - " 13 0.000 0.000 0.000 0.000 stride_tricks.py:474(_broadcast_arrays_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 axis.py:436(_get_text1_transform)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:541(__init__)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:752(get_transform)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2412(set_tight_layout)\n", + " 1 0.000 0.000 0.000 0.000 function_helpers.py:311(_quantities2arrays)\n", + " 1 0.000 0.000 0.000 0.000 quantity.py:1182(__pow__)\n", + " 1 0.000 0.000 0.000 0.000 header.py:810(clear)\n", + " 1 0.000 0.000 0.000 0.000 hdulist.py:964(close)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1752(set)\n", + " 16 0.000 0.000 0.000 0.000 ticker.py:559(set_useMathText)\n", + " 1 0.000 0.000 0.000 0.000 rcsetup.py:140(validate_bool)\n", + " 1 0.000 0.000 0.000 0.000 _minimize.py:823(standardize_constraints)\n", + " 1 0.000 0.000 0.015 0.015 figure.py:788(subplots)\n", + " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:110(_set_new_active_manager)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:2071(add)\n", + " 8 0.000 0.000 0.000 0.000 parameters.py:460(fixed)\n", " 1 0.000 0.000 0.000 0.000 fitting.py:1050(__init__)\n", - " 12 0.000 0.000 0.000 0.000 shape_base.py:77(_atleast_2d_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:187(_assert_2d)\n", + " 2 0.000 0.000 0.000 0.000 hdulist.py:262(__iter__)\n", + " 1 0.000 0.000 0.000 0.000 base.py:914(__init__)\n", " 3 0.000 0.000 0.000 0.000 axis.py:500(_get_text2_transform)\n", - " 1 0.000 0.000 0.000 0.000 pyplot.py:854(get_fignums)\n", - " 8 0.000 0.000 0.000 0.000 __init__.py:106(__init__)\n", - " 5 0.000 0.000 0.000 0.000 table.py:2025(_is_list_or_tuple_of_str)\n", - " 1 0.000 0.000 0.000 0.000 image.py:1083(match_header)\n", - " 5 0.000 0.000 0.000 0.000 {built-in method numpy.promote_types}\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(allclose)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:3111(signature)\n", - " 16 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", - " 3 0.000 0.000 0.000 0.000 axis.py:497(_get_text1_transform)\n", - " 2 0.000 0.000 0.000 0.000 _base.py:223(__init__)\n", - " 2 0.000 0.000 0.000 0.000 __init__.py:817(__init__)\n", - " 13 0.000 0.000 0.000 0.000 __init__.py:826()\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:1683(sanitize_sequence)\n", - " 1 0.000 0.000 0.009 0.009 core.py:49(__call__)\n", - " 1 0.000 0.000 0.011 0.011 daofinder.py:407(convdata_peak)\n", - " 4 0.000 0.000 0.000 0.000 core.py:22(strip_units)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:33(__init__)\n", + " 2 0.000 0.000 0.000 0.000 figure.py:61(__init__)\n", + " 3 0.000 0.000 0.000 0.000 figure.py:65(as_list)\n", + " 4 0.000 0.000 0.000 0.000 spines.py:556(__getitem__)\n", + " 8 0.000 0.000 0.000 0.000 parameters.py:477(tied)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:383(reset_ids)\n", + " 2 0.000 0.000 0.000 0.000 core.py:154(_validate_frequency)\n", + " 1 0.000 0.000 0.000 0.000 header.py:460(fromfile)\n", + " 4 0.000 0.000 0.000 0.000 axis.py:1352(get_major_locator)\n", + " 1 0.000 0.000 0.000 0.000 spines.py:539(from_dict)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1719(_init)\n", + " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:262(_parse_cenfunc)\n", + " 5 0.000 0.000 0.000 0.000 validate.py:1203()\n", " 3 0.000 0.000 0.000 0.000 {method 'tolist' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(unique)\n", - " 12 0.000 0.000 0.000 0.000 markers.py:259(get_fillstyle)\n", - " 1 0.000 0.000 0.000 0.000 transforms.py:374(width)\n", - " 5 0.000 0.000 0.000 0.000 fitting.py:1696()\n", + " 9 0.000 0.000 0.000 0.000 arraypad.py:109()\n", + " 5 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(polyval)\n", + " 1 0.000 0.000 0.000 0.000 stretch.py:118(inverse)\n", + " 1 0.000 0.000 0.014 0.014 filters.py:756(convolve)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2438(set_constrained_layout)\n", + " 4 0.000 0.000 0.001 0.000 spines.py:219(clear)\n", + " 1 0.000 0.000 0.000 0.000 backend_bases.py:3496(new_figure_manager_given_figure)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:628(bubble)\n", " 1 0.000 0.000 0.000 0.000 daofinder.py:574(dy_hy)\n", - " 16 0.000 0.000 0.000 0.000 column.py:634(format)\n", - " 1 0.000 0.000 0.000 0.000 util.py:443(fileobj_mode)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:1735(set_box_aspect)\n", + " 6 0.000 0.000 0.000 0.000 axis.py:222(get_tick_padding)\n", + " 2 0.000 0.000 0.000 0.000 _base.py:236(set_prop_cycle)\n", + " 1 0.000 0.000 0.010 0.010 core.py:49(__call__)\n", + " 1 0.000 0.000 0.000 0.000 core.py:39(__init__)\n", " 1 0.000 0.000 0.000 0.000 core.py:4190(__truediv__)\n", - " 1 0.000 0.000 0.000 0.000 _constraints.py:329()\n", - " 2 0.000 0.000 0.000 0.000 axis.py:2501(get_minpos)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:755(get_scale)\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(hstack)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:1209(_coeffs)\n", " 2 0.000 0.000 0.000 0.000 fromnumeric.py:846(sort)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:391()\n", - " 1 0.000 0.000 0.000 0.000 utils.py:298(check_nD)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:1928(_set_artist_props)\n", - " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:105(get_active)\n", - " 16 0.000 0.000 0.000 0.000 scale.py:97(__init__)\n", - " 4 0.000 0.000 0.000 0.000 __init__.py:623(clear)\n", - " 1 0.000 0.000 0.000 0.000 decorators.py:797(__delete__)\n", - " 14 0.000 0.000 0.000 0.000 fromnumeric.py:3123(_ndim_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:102(get_linalg_error_extobj)\n", + " 13 0.000 0.000 0.000 0.000 stride_tricks.py:474(_broadcast_arrays_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 interface.py:142(__new__)\n", + " 2 0.000 0.000 0.000 0.000 axis.py:2239(get_minpos)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1710(__init__)\n", + " 8 0.000 0.000 0.000 0.000 __init__.py:106(__init__)\n", + " 5 0.000 0.000 0.000 0.000 table.py:2025(_is_list_or_tuple_of_str)\n", + " 1 0.000 0.000 0.000 0.000 header.py:84(__init__)\n", + " 1 0.000 0.000 0.000 0.000 image.py:109()\n", + " 12 0.000 0.000 0.000 0.000 shape_base.py:77(_atleast_2d_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2539(ptp)\n", + " 4 0.000 0.000 0.000 0.000 inspect.py:159(isfunction)\n", + " 3 0.000 0.000 0.000 0.000 axis.py:497(_get_text1_transform)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:2194(__init__)\n", + " 6 0.000 0.000 0.000 0.000 colors.py:96(_sanitize_extrema)\n", + " 2 0.000 0.000 0.000 0.000 _methods.py:101(_clip_dep_is_byte_swapped)\n", " 2 0.000 0.000 0.000 0.000 shape_base.py:600()\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(triu)\n", - " 10 0.000 0.000 0.000 0.000 _constraints.py:12(_arr_to_scalar)\n", - " 1 0.000 0.000 0.000 0.000 cm.py:602(autoscale_None)\n", - " 7 0.000 0.000 0.000 0.000 parameters.py:477(tied)\n", - " 1 0.000 0.000 0.000 0.000 core.py:57()\n", - " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:282(_parse_stdfunc)\n", - " 6 0.000 0.000 0.000 0.000 fromnumeric.py:2454(_cumsum_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:1177(coeffs)\n", + " 12 0.000 0.000 0.000 0.000 axis.py:1512(set_units)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2468(set_constrained_layout_pads)\n", + " 1 0.000 0.000 0.000 0.000 image.py:275(set_alpha)\n", + " 1 0.000 0.000 0.000 0.000 colors.py:1113(__init__)\n", + " 1 0.000 0.000 0.000 0.000 base.py:757(_close)\n", + " 5 0.000 0.000 0.000 0.000 {built-in method numpy.promote_types}\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(hstack)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:1671(set_adjustable)\n", + " 2 0.000 0.000 0.000 0.000 _base.py:2417(_unit_change_handler)\n", + " 3 0.000 0.000 0.000 0.000 axis.py:436(_get_text1_transform)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:1552(_process_projection_requirements)\n", + " 1 0.000 0.000 0.000 0.000 _utils.py:42(nanmean)\n", + " 1 0.000 0.000 0.010 0.010 daofinder.py:407(convdata_peak)\n", + " 1 0.000 0.000 0.000 0.000 file.py:394(close)\n", + " 1 0.000 0.000 0.000 0.000 image.py:1029(__init__)\n", + " 2 0.000 0.000 0.000 0.000 axis.py:2501(get_minpos)\n", + " 2 0.000 0.000 0.000 0.000 polynomial.py:148(window)\n", + " 2 0.000 0.000 0.000 0.000 core.py:758(inputs)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:1793(trim_overscan)\n", + " 1 0.000 0.000 0.000 0.000 warnings.py:130(filterwarnings)\n", " 1 0.000 0.000 0.000 0.000 genericpath.py:16(exists)\n", + " 2 0.000 0.000 0.000 0.000 zernike.py:661(__iter__)\n", " 2 0.000 0.000 0.000 0.000 interpolation.py:196(_prepad_for_spline_filter)\n", - " 2 0.000 0.000 0.000 0.000 _base.py:2417(_unit_change_handler)\n", - " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:123(set_active)\n", + " 1 0.000 0.000 0.000 0.000 image.py:762(set_interpolation)\n", + " 2 0.000 0.000 0.000 0.000 core.py:57()\n", + " 8 0.000 0.000 0.000 0.000 core.py:23()\n", + " 16 0.000 0.000 0.000 0.000 column.py:634(format)\n", + " 1 0.000 0.000 0.000 0.000 file.py:410(_maybe_close_mmap)\n", + " 1 0.000 0.000 0.000 0.000 extras.py:778(replace_masked)\n", + " 14 0.000 0.000 0.000 0.000 fromnumeric.py:3123(_ndim_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:187(_assert_2d)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:3111(signature)\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:391()\n", + " 1 0.000 0.000 0.000 0.000 _constraints.py:329()\n", + " 3 0.000 0.000 0.000 0.000 axis.py:439(_get_text2_transform)\n", + " 4 0.000 0.000 0.000 0.000 axis.py:1015(_set_artist_props)\n", + " 3 0.000 0.000 0.000 0.000 text.py:517(_update_clip_properties)\n", " 1 0.000 0.000 0.000 0.000 transforms.py:797(frozen)\n", - " 1 0.000 0.000 0.000 0.000 rcsetup.py:152(validate_axisbelow)\n", - " 1 0.000 0.000 0.000 0.000 _utils.py:42(nanmean)\n", - " 1 0.000 0.000 0.000 0.000 header.py:84(__init__)\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(einsum)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:2859(from_callable)\n", + " 4 0.000 0.000 0.000 0.000 __init__.py:623(clear)\n", + " 13 0.000 0.000 0.000 0.000 __init__.py:826()\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:1683(sanitize_sequence)\n", + " 2 0.000 0.000 0.000 0.000 sigma_clipping.py:282(_parse_stdfunc)\n", + " 14 0.000 0.000 0.000 0.000 nanfunctions.py:1570(_nanstd_dispatcher)\n", + " 21 0.000 0.000 0.000 0.000 inspect.py:367()\n", + " 1 0.000 0.000 0.000 0.000 utils.py:298(check_nD)\n", + " 2 0.000 0.000 0.000 0.000 colors.py:1145(vmin)\n", + " 16 0.000 0.000 0.000 0.000 __init__.py:269(wrapper)\n", + " 8 0.000 0.000 0.000 0.000 table.py:1389()\n", " 1 0.000 0.000 0.000 0.000 signaltools.py:546()\n", - " 4 0.000 0.000 0.000 0.000 filters.py:50(_invalid_origin)\n", - " 3 0.000 0.000 0.000 0.000 gridspec.py:75(get_geometry)\n", - " 2 0.000 0.000 0.000 0.000 figure.py:155(update)\n", - " 7 0.000 0.000 0.000 0.000 parameters.py:460(fixed)\n", - " 5 0.000 0.000 0.000 0.000 daofinder.py:332(__len__)\n", - " 1 0.000 0.000 0.000 0.000 header.py:2270(_check_padding)\n", - " 1 0.000 0.000 0.000 0.000 hdulist.py:395(__exit__)\n", - " 1 0.000 0.000 0.000 0.000 extras.py:778(replace_masked)\n", - " 11 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", - " 2 0.000 0.000 0.000 0.000 zernike.py:660(__iter__)\n", " 1 0.000 0.000 0.000 0.000 lbfgsb.py:287()\n", + " 2 0.000 0.000 0.000 0.000 figure.py:155(update)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2412(set_tight_layout)\n", + " 3 0.000 0.000 0.000 0.000 backend_bases.py:2389(mpl_connect)\n", + " 4 0.000 0.000 0.000 0.000 utils.py:209(_validate_domain_window)\n", + " 1 0.000 0.000 0.013 0.013 daofinder.py:578(dx)\n", + " 2 0.000 0.000 0.000 0.000 quantity.py:1194(__iter__)\n", + " 8 0.000 0.000 0.000 0.000 base.py:466()\n", + " 1 0.000 0.000 0.000 0.000 base.py:518(_get_raw_data)\n", + " 1 0.000 0.000 0.000 0.000 util.py:476(_fileobj_normalize_mode)\n", + " 10 0.000 0.000 0.000 0.000 {method '__array_prepare__' of 'numpy.ndarray' objects}\n", + " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(sort)\n", + " 10 0.000 0.000 0.000 0.000 _constraints.py:12(_arr_to_scalar)\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:559(__init__)\n", " 14 0.000 0.000 0.000 0.000 axis.py:374()\n", - " 1 0.000 0.000 0.000 0.000 pyplot.py:310(draw_if_interactive)\n", - " 8 0.000 0.000 0.000 0.000 table.py:1389()\n", - " 14 0.000 0.000 0.000 0.000 nanfunctions.py:1570(_nanstd_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 numbers.py:283(__float__)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:71(_entry_from_axes)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1030(minposx)\n", + " 14 0.000 0.000 0.000 0.000 axis.py:392()\n", + " 2 0.000 0.000 0.000 0.000 core.py:3246(_make_leaflist)\n", + " 1 0.000 0.000 0.001 0.001 daofinder.py:582(dy)\n", + " 1 0.000 0.000 0.000 0.000 sputils.py:220(isshape)\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ptp)\n", + " 6 0.000 0.000 0.000 0.000 fromnumeric.py:2454(_cumsum_dispatcher)\n", + " 14 0.000 0.000 0.000 0.000 nanfunctions.py:1422(_nanvar_dispatcher)\n", + " 2 0.000 0.000 0.000 0.000 parse.py:114(_coerce_args)\n", + " 4 0.000 0.000 0.000 0.000 axis.py:1492(have_units)\n", + " 1 0.000 0.000 0.000 0.000 artist.py:978(_set_alpha_for_array)\n", + " 1 0.000 0.000 0.000 0.000 pyplot.py:854(get_fignums)\n", + " 4 0.000 0.000 0.000 0.000 scale.py:116(get_transform)\n", + " 16 0.000 0.000 0.000 0.000 scale.py:97(__init__)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:160(_set_default_domain_window)\n", " 1 0.000 0.000 0.000 0.000 function_helpers.py:349(_iterable_helper)\n", - " 2 0.000 0.000 0.000 0.000 quantity.py:1194(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 image.py:203(shape)\n", - " 1 0.000 0.000 0.000 0.000 base.py:518(_get_raw_data)\n", + " 2 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.generic' objects}\n", + " 11 0.000 0.000 0.000 0.000 {built-in method builtins.ord}\n", + " 12 0.000 0.000 0.000 0.000 helper.py:73()\n", + " 14 0.000 0.000 0.000 0.000 axis.py:387()\n", + " 4 0.000 0.000 0.000 0.000 axis.py:755(get_scale)\n", + " 12 0.000 0.000 0.000 0.000 markers.py:259(get_fillstyle)\n", + " 3 0.000 0.000 0.000 0.000 artist.py:747(set_clip_box)\n", + " 1 0.000 0.000 0.000 0.000 cm.py:602(autoscale_None)\n", + " 2 0.000 0.000 0.000 0.000 core.py:2171(is_unity)\n", + " 2 0.000 0.000 0.000 0.000 file.py:82(_is_bz2file)\n", " 2 0.000 0.000 0.000 0.000 circle.py:151(_xy_extents)\n", - " 2 0.000 0.000 0.000 0.000 _methods.py:101(_clip_dep_is_byte_swapped)\n", + " 1 0.000 0.000 0.000 0.000 decorators.py:797(__delete__)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:1177(coeffs)\n", " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ravel_multi_index)\n", + " 1 0.000 0.000 0.000 0.000 einsumfunc.py:997(einsum)\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(einsum)\n", " 6 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}\n", + " 3 0.000 0.000 0.000 0.000 helper.py:66()\n", + " 4 0.000 0.000 0.000 0.000 axis.py:541(__init__)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:1928(_set_artist_props)\n", " 1 0.000 0.000 0.000 0.000 figure.py:78(bubble)\n", - " 1 0.000 0.000 0.000 0.000 pyplot.py:294(_warn_if_gui_out_of_main_thread)\n", + " 1 0.000 0.000 0.000 0.000 image.py:991(get_extent)\n", + " 1 0.000 0.000 0.000 0.000 transforms.py:374(width)\n", + " 5 0.000 0.000 0.000 0.000 daofinder.py:332(__len__)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3504(mask)\n", + " 1 0.000 0.000 0.000 0.000 _methods.py:106(_clip_dep_invoke_with_casting)\n", + " 3 0.000 0.000 0.000 0.000 helper.py:48()\n", + " 4 0.000 0.000 0.000 0.000 filters.py:50(_invalid_origin)\n", + " 1 0.000 0.000 0.000 0.000 pyplot.py:310(draw_if_interactive)\n", + " 1 0.000 0.000 0.000 0.000 cm.py:367(_scale_norm)\n", " 1 0.000 0.000 0.000 0.000 pyplot.py:201(_get_required_interactive_framework)\n", - " 2 0.000 0.000 0.000 0.000 utils.py:270(resolve_fractions)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1030(minposx)\n", + " 2 0.000 0.000 0.000 0.000 __init__.py:817(__init__)\n", + " 1 0.000 0.000 0.000 0.000 rcsetup.py:152(validate_axisbelow)\n", + " 8 0.000 0.000 0.000 0.000 parameters.py:453(fixed)\n", " 2 0.000 0.000 0.001 0.000 image.py:212(header)\n", - " 2 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(sort)\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(ptp)\n", - " 1 0.000 0.000 0.000 0.000 einsumfunc.py:997(einsum)\n", - " 3 0.000 0.000 0.000 0.000 helper.py:66()\n", - " 4 0.000 0.000 0.000 0.000 _base.py:2539()\n", - " 14 0.000 0.000 0.000 0.000 axis.py:387()\n", + " 1 0.000 0.000 0.000 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", + " 16 0.000 0.000 0.000 0.000 {method 'reverse' of 'list' objects}\n", + " 4 0.000 0.000 0.000 0.000 axis.py:752(get_transform)\n", + " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:105(get_active)\n", + " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:123(set_active)\n", + " 1 0.000 0.000 0.000 0.000 pyplot.py:294(_warn_if_gui_out_of_main_thread)\n", + " 2 0.000 0.000 0.000 0.000 polynomial.py:156(domain)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:402(data_peak)\n", + " 1 0.000 0.000 0.000 0.000 util.py:443(fileobj_mode)\n", + " 3 0.000 0.000 0.000 0.000 misc.py:180(_datacopied)\n", + " 8 0.000 0.000 0.000 0.000 {function HDUList.__getitem__ at 0x7f2d6c7045e0}\n", + " 1 0.000 0.000 0.000 0.000 stretch.py:105(__init__)\n", + " 1 0.000 0.000 0.000 0.000 _minimize.py:811(standardize_bounds)\n", " 4 0.000 0.000 0.000 0.000 axis.py:547(locator)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:71(_entry_from_axes)\n", + " 2 0.000 0.000 0.000 0.000 figure.py:112(__contains__)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:73(get_projection_class)\n", + " 1 0.000 0.000 0.000 0.000 image.py:808(set_resample)\n", + " 1 0.000 0.000 0.000 0.000 deprecation.py:381(wrapper)\n", + " 1 0.000 0.000 0.000 0.000 polynomial.py:91(get_num_coeff)\n", + " 6 0.000 0.000 0.000 0.000 core.py:3449()\n", + " 1 0.000 0.000 0.000 0.000 helpers.py:106(helper_sqrt)\n", + " 1 0.000 0.000 0.000 0.000 header.py:2270(_check_padding)\n", + " 1 0.000 0.000 0.000 0.000 image.py:1083(match_header)\n", + " 1 0.000 0.000 0.000 0.000 image.py:203(shape)\n", + " 1 0.000 0.000 0.000 0.000 numbers.py:283(__float__)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:2859(from_callable)\n", + " 4 0.000 0.000 0.000 0.000 _base.py:2539()\n", + " 3 0.000 0.000 0.000 0.000 figure.py:100(__call__)\n", + " 1 0.000 0.000 0.000 0.000 image.py:826(set_filternorm)\n", " 1 0.000 0.000 0.000 0.000 figure.py:1481(sca)\n", " 2 0.000 0.000 0.000 0.000 text.py:1104(set_fontweight)\n", - " 1 0.000 0.000 0.000 0.000 image.py:808(set_resample)\n", - " 1 0.000 0.000 0.000 0.000 colors.py:1278(autoscale_None)\n", - " 2 0.000 0.000 0.000 0.000 __init__.py:570(__init__)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:1179(x_domain)\n", - " 1 0.000 0.000 0.000 0.000 core.py:758(inputs)\n", - " 1 0.000 0.000 0.000 0.000 table.py:61(match_header)\n", - " 10 0.000 0.000 0.000 0.000 {method '__array_prepare__' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 sputils.py:220(isshape)\n", - " 1 0.000 0.000 0.000 0.000 _methods.py:106(_clip_dep_invoke_with_casting)\n", - " 1 0.000 0.000 0.000 0.000 decorators.py:41(wrapper)\n", - " 13 0.000 0.000 0.000 0.000 inspect.py:2548(name)\n", - " 2 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", - " 12 0.000 0.000 0.000 0.000 helper.py:73()\n", - " 14 0.000 0.000 0.000 0.000 axis.py:392()\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:98(get_projection_class)\n", - " 1 0.000 0.000 0.000 0.000 image.py:991(get_extent)\n", - " 3 0.000 0.000 0.000 0.000 artist.py:747(set_clip_box)\n", + " 1 0.000 0.000 0.000 0.000 image.py:268(get_size)\n", " 1 0.000 0.000 0.000 0.000 cm.py:537(set_cmap)\n", - " 4 0.000 0.000 0.000 0.000 transforms.py:2409()\n", - " 1 0.000 0.000 0.000 0.000 core.py:3443(fittable)\n", - " 2 0.000 0.000 0.000 0.000 core.py:154(_validate_frequency)\n", + " 2 0.000 0.000 0.000 0.000 colors.py:1173(_changed)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:2059(__init__)\n", " 2 0.000 0.000 0.000 0.000 table.py:1396()\n", - " 2 0.000 0.000 0.000 0.000 core.py:2171(is_unity)\n", - " 1 0.000 0.000 0.000 0.000 {method 'clip' of 'numpy.ndarray' objects}\n", - " 8 0.000 0.000 0.000 0.000 {function HDUList.__getitem__ at 0x7f27b44dd3a0}\n", - " 2 0.000 0.000 0.000 0.000 figure.py:112(__contains__)\n", - " 1 0.000 0.000 0.000 0.000 image.py:268(get_size)\n", - " 1 0.000 0.000 0.000 0.000 deprecation.py:381(wrapper)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3246(_make_leaflist)\n", - " 1 0.000 0.000 0.011 0.011 daofinder.py:578(dx)\n", - " 8 0.000 0.000 0.000 0.000 core.py:23()\n", - " 1 0.000 0.000 0.000 0.000 function_helpers.py:365(concatenate)\n", + " 3 0.000 0.000 0.000 0.000 function_helpers.py:342()\n", " 2 0.000 0.000 0.000 0.000 utils.py:169(sanitize_scale)\n", - " 1 0.000 0.000 0.000 0.000 base.py:164(data)\n", - " 1 0.000 0.000 0.000 0.000 util.py:822(_get_array_mmap)\n", - " 14 0.000 0.000 0.000 0.000 nanfunctions.py:1422(_nanvar_dispatcher)\n", - " 8 0.000 0.000 0.000 0.000 function_base.py:1297(_interp_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 parse.py:114(_coerce_args)\n", + " 1 0.000 0.000 0.000 0.000 hdulist.py:395(__exit__)\n", + " 2 0.000 0.000 0.000 0.000 base.py:243(_data_loaded)\n", + " 1 0.000 0.000 0.000 0.000 core.py:6566(is_masked)\n", + " 6 0.000 0.000 0.000 0.000 fromnumeric.py:3216(_around_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 arraysetops.py:125(_unpack_tuple)\n", + " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2046(clip)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:4243(_meshgrid_dispatcher)\n", " 1 0.000 0.000 0.000 0.000 minimizer.py:733()\n", - " 1 0.000 0.000 0.000 0.000 _minimize.py:811(standardize_bounds)\n", - " 1 0.000 0.000 0.000 0.000 transforms.py:2644(__init__)\n", - " 4 0.000 0.000 0.000 0.000 hdulist.py:791(readall)\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(swapaxes)\n", - " 6 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", + " 1 0.000 0.000 0.000 0.000 _base.py:3437(set_axis_on)\n", + " 2 0.000 0.000 0.000 0.000 _base.py:223(__init__)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:586(hx)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:270(resolve_fractions)\n", + " 2 0.000 0.000 0.000 0.000 multiarray.py:1021(unravel_index)\n", + " 2 0.000 0.000 0.000 0.000 core.py:7956(asanyarray)\n", + " 8 0.000 0.000 0.000 0.000 function_base.py:1297(_interp_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 filters.py:1120()\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:435()\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2369(axes)\n", - " 3 0.000 0.000 0.000 0.000 text.py:517(_update_clip_properties)\n", + " 6 0.000 0.000 0.000 0.000 axis.py:148()\n", + " 1 0.000 0.000 0.000 0.000 image.py:843(set_filterrad)\n", + " 4 0.000 0.000 0.000 0.000 transforms.py:2409()\n", + " 1 0.000 0.000 0.000 0.000 colors.py:1278(autoscale_None)\n", + " 8 0.000 0.000 0.000 0.000 parameters.py:485(bounds)\n", + " 2 0.000 0.000 0.000 0.000 core.py:769(outputs)\n", + " 1 0.000 0.000 0.000 0.000 function_helpers.py:288(_as_quantity)\n", + " 1 0.000 0.000 0.000 0.000 function_helpers.py:365(concatenate)\n", + " 1 0.000 0.000 0.000 0.000 header.py:1983(__set__)\n", + " 2 0.000 0.000 0.000 0.000 {method 'values' of 'mappingproxy' objects}\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:438()\n", + " 1 0.000 0.000 0.000 0.000 image.py:784(set_interpolation_stage)\n", + " 1 0.000 0.000 0.000 0.000 spines.py:536(__init__)\n", " 1 0.000 0.000 0.000 0.000 cm.py:575(set_norm)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:2059(__init__)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:582(dy)\n", + " 1 0.000 0.000 0.000 0.000 transforms.py:808(null)\n", + " 8 0.000 0.000 0.000 0.000 parameters.py:467(tied)\n", " 1 0.000 0.000 0.000 0.000 daofinder.py:634(sky)\n", + " 4 0.000 0.000 0.000 0.000 hdulist.py:791(readall)\n", + " 1 0.000 0.000 0.000 0.000 base.py:164(data)\n", + " 5 0.000 0.000 0.000 0.000 numeric.py:744(_convolve_dispatcher)\n", + " 9 0.000 0.000 0.000 0.000 fromnumeric.py:432(_repeat_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 linalg.py:2165(_lstsq_dispatcher)\n", + " 2 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects}\n", + " 3 0.000 0.000 0.000 0.000 gridspec.py:75(get_geometry)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:569(_from_subplot_args)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:98(get_projection_class)\n", + " 1 0.000 0.000 0.000 0.000 backend_bases.py:2795(notify_axes_change)\n", + " 6 0.000 0.000 0.000 0.000 __init__.py:1619()\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:590(hy)\n", " 1 0.000 0.000 0.000 0.000 helpers.py:94(helper_square)\n", - " 2 0.000 0.000 0.000 0.000 base.py:243(_data_loaded)\n", - " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(clip)\n", + " 1 0.000 0.000 0.000 0.000 util.py:822(_get_array_mmap)\n", " 1 0.000 0.000 0.000 0.000 core.py:3601(shrink_mask)\n", - " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2046(clip)\n", - " 4 0.000 0.000 0.000 0.000 fromnumeric.py:2928(_prod_dispatcher)\n", - " 6 0.000 0.000 0.000 0.000 fromnumeric.py:3216(_around_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:73(isclass)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2890(add_axobserver)\n", - " 1 0.000 0.000 0.000 0.000 image.py:784(set_interpolation_stage)\n", - " 1 0.000 0.000 0.000 0.000 image.py:826(set_filternorm)\n", - " 1 0.000 0.000 0.000 0.000 helpers.py:90(helper_invariant)\n", - " 1 0.000 0.000 0.000 0.000 function_helpers.py:288(_as_quantity)\n", - " 3 0.000 0.000 0.000 0.000 function_helpers.py:342()\n", - " 1 0.000 0.000 0.000 0.000 header.py:1983(__set__)\n", - " 1 0.000 0.000 0.000 0.000 header.py:2000(__init__)\n", - " 1 0.000 0.000 0.000 0.000 core.py:6566(is_masked)\n", - " 1 0.000 0.000 0.000 0.000 arraysetops.py:125(_unpack_tuple)\n", - " 1 0.000 0.000 0.000 0.000 fromnumeric.py:550(swapaxes)\n", - " 1 0.000 0.000 0.000 0.000 _constraints.py:331()\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:569(_from_subplot_args)\n", - " 1 0.000 0.000 0.000 0.000 image.py:843(set_filterrad)\n", - " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:34(get_fig_manager)\n", - " 1 0.000 0.000 0.000 0.000 cm.py:367(_scale_norm)\n", + " 1 0.000 0.000 0.000 0.000 shape_base.py:218(_vhstack_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 function_base.py:1640(_trim_zeros)\n", + " 5 0.000 0.000 0.000 0.000 einsumfunc.py:989(_einsum_dispatcher)\n", + " 13 0.000 0.000 0.000 0.000 inspect.py:2548(name)\n", + " 1 0.000 0.000 0.000 0.000 morphology.py:50()\n", + " 1 0.000 0.000 0.000 0.000 transforms.py:2644(__init__)\n", " 1 0.000 0.000 0.000 0.000 transforms.py:259(frozen)\n", - " 2 0.000 0.000 0.000 0.000 transforms.py:1041(minposy)\n", - " 3 0.000 0.000 0.000 0.000 core.py:112(data)\n", - " 8 0.000 0.000 0.000 0.000 core.py:3501()\n", - " 2 0.000 0.000 0.000 0.000 utils.py:159(is_effectively_unity)\n", - " 1 0.000 0.000 0.000 0.000 header.py:2255(_block_size)\n", - " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", - " 2 0.000 0.000 0.000 0.000 core.py:3504(mask)\n", - " 9 0.000 0.000 0.000 0.000 fromnumeric.py:432(_repeat_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:1206(_coeffs)\n", - " 3 0.000 0.000 0.000 0.000 stride_tricks.py:362(_broadcast_to_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 {method 'strip' of 'bytes' objects}\n", - " 3 0.000 0.000 0.000 0.000 helper.py:48()\n", - " 3 0.000 0.000 0.000 0.000 figure.py:100(__call__)\n", - " 1 0.000 0.000 0.000 0.000 transforms.py:808(null)\n", " 2 0.000 0.000 0.000 0.000 colors.py:1156(vmax)\n", - " 6 0.000 0.000 0.000 0.000 __init__.py:1619()\n", - " 7 0.000 0.000 0.000 0.000 parameters.py:467(tied)\n", - " 7 0.000 0.000 0.000 0.000 parameters.py:485(bounds)\n", - " 1 0.000 0.000 0.000 0.000 core.py:769(outputs)\n", + " 1 0.000 0.000 0.000 0.000 hdulist.py:880(get_first_ext)\n", + " 1 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n", + " 4 0.000 0.000 0.000 0.000 multiarray.py:1368(may_share_memory)\n", + " 4 0.000 0.000 0.000 0.000 fromnumeric.py:2928(_prod_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", + " 6 0.000 0.000 0.000 0.000 {method 'values' of 'collections.OrderedDict' objects}\n", + " 1 0.000 0.000 0.000 0.000 _constraints.py:331()\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2369(axes)\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2894()\n", + " 1 0.000 0.000 0.000 0.000 figure.py:2890(add_axobserver)\n", + " 2 0.000 0.000 0.000 0.000 transforms.py:1041(minposy)\n", + " 3 0.000 0.000 0.000 0.000 core.py:112(data)\n", + " 10 0.000 0.000 0.000 0.000 core.py:3501()\n", " 1 0.000 0.000 0.000 0.000 daofinder.py:380()\n", - " 1 0.000 0.000 0.000 0.000 hdulist.py:880(get_first_ext)\n", - " 4 0.000 0.000 0.000 0.000 multiarray.py:1368(may_share_memory)\n", - " 5 0.000 0.000 0.000 0.000 numeric.py:744(_convolve_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 function_base.py:1640(_trim_zeros)\n", + " 1 0.000 0.000 0.000 0.000 core.py:117(_translate_mask_mode)\n", + " 1 0.000 0.000 0.000 0.000 helpers.py:90(helper_invariant)\n", + " 2 0.000 0.000 0.000 0.000 utils.py:159(is_effectively_unity)\n", + " 1 0.000 0.000 0.000 0.000 header.py:514(block_iter)\n", + " 1 0.000 0.000 0.000 0.000 table.py:61(match_header)\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(swapaxes)\n", + " 1 0.000 0.000 0.000 0.000 <__array_function__ internals>:2(clip)\n", " 1 0.000 0.000 0.000 0.000 index_tricks.py:757(__getitem__)\n", + " 1 0.000 0.000 0.000 0.000 decorators.py:41(wrapper)\n", " 10 0.000 0.000 0.000 0.000 inspect.py:2560(kind)\n", - " 8 0.000 0.000 0.000 0.000 :406(has_location)\n", - " 1 0.000 0.000 0.000 0.000 filters.py:1120()\n", + " 2 0.000 0.000 0.000 0.000 {built-in method builtins.sum}\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:443()\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:123(set_height_ratios)\n", - " 1 0.000 0.000 0.000 0.000 figure.py:2894()\n", - " 4 0.000 0.000 0.000 0.000 scale.py:79(limit_range_for_scale)\n", - " 7 0.000 0.000 0.000 0.000 parameters.py:453(fixed)\n", - " 3 0.000 0.000 0.000 0.000 core.py:3449()\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:402(data_peak)\n", - " 1 0.000 0.000 0.000 0.000 helpers.py:106(helper_sqrt)\n", - " 1 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", - " 1 0.000 0.000 0.000 0.000 shape_base.py:218(_vhstack_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:449(_polyfit_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 function_base.py:4243(_meshgrid_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 einsumfunc.py:989(_einsum_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 stretch.py:105(__init__)\n", - " 2 0.000 0.000 0.000 0.000 gridspec.py:231(_normalize)\n", - " 2 0.000 0.000 0.000 0.000 figure.py:2533(set_canvas)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:73(get_projection_class)\n", - " 2 0.000 0.000 0.000 0.000 widgets.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:34(get_fig_manager)\n", " 1 0.000 0.000 0.000 0.000 :1()\n", - " 1 0.000 0.000 0.000 0.000 core.py:161(nlabels)\n", - " 1 0.000 0.000 0.000 0.000 core.py:117(_translate_mask_mode)\n", - " 1 0.000 0.000 0.000 0.000 header.py:514(block_iter)\n", - " 1 0.000 0.000 0.000 0.000 header.py:2055(__len__)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:1376(ref_pupil_location)\n", - " 2 0.000 0.000 0.000 0.000 core.py:7956(asanyarray)\n", - " 2 0.000 0.000 0.000 0.000 misc.py:180(_datacopied)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:443()\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:438()\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:101(set_width_ratios)\n", - " 1 0.000 0.000 0.000 0.000 _base.py:3437(set_axis_on)\n", - " 3 0.000 0.000 0.000 0.000 figure.py:69()\n", - " 1 0.000 0.000 0.000 0.000 transforms.py:380(height)\n", - " 3 0.000 0.000 0.000 0.000 colors.py:1141(vmin)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:586(hx)\n", - " 5 0.000 0.000 0.000 0.000 polynomial.py:692(_polyval_dispatcher)\n", - " 3 0.000 0.000 0.000 0.000 nanfunctions.py:858(_nanmean_dispatcher)\n", - " 5 0.000 0.000 0.000 0.000 linalg.py:2165(_lstsq_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:514(_is_wrapper)\n", - " 2 0.000 0.000 0.000 0.000 {method 'rfind' of 'str' objects}\n", + " 2 0.000 0.000 0.000 0.000 header.py:337(_modified)\n", + " 1 0.000 0.000 0.000 0.000 header.py:2255(_block_size)\n", + " 3 0.000 0.000 0.000 0.000 arraypad.py:521(_pad_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:1206(_coeffs)\n", + " 3 0.000 0.000 0.000 0.000 function_base.py:18(_linspace_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:73(isclass)\n", " 2 0.000 0.000 0.000 0.000 {method 'is_integer' of 'float' objects}\n", - " 1 0.000 0.000 0.000 0.000 morphology.py:50()\n", - " 6 0.000 0.000 0.000 0.000 axis.py:148()\n", - " 1 0.000 0.000 0.000 0.000 _base.py:611()\n", - " 1 0.000 0.000 0.000 0.000 backend_bases.py:2795(notify_axes_change)\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:1180(is_interactive)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:1195(x_window)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:1203(y_window)\n", - " 1 0.000 0.000 0.000 0.000 util.py:393(fileobj_name)\n", - " 5 0.000 0.000 0.000 0.000 twodim_base.py:504(_vander_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method builtins.sum}\n", - " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", " 1 0.000 0.000 0.000 0.000 filters.py:338()\n", - " 1 0.000 0.000 0.000 0.000 _base.py:4206(set_navigate)\n", - " 1 0.000 0.000 0.000 0.000 spines.py:582(__iter__)\n", - " 1 0.000 0.000 0.000 0.000 polynomial.py:1187(y_domain)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3331(n_inputs)\n", + " 4 0.000 0.000 0.000 0.000 axis.py:1426()\n", + " 2 0.000 0.000 0.000 0.000 widgets.py:36(__init__)\n", + " 1 0.000 0.000 0.000 0.000 core.py:161(nlabels)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3331(n_inputs)\n", + " 2 0.000 0.000 0.000 0.000 core.py:1136(name)\n", + " 1 0.000 0.000 0.000 0.000 header.py:2000(__init__)\n", + " 1 0.000 0.000 0.000 0.000 util.py:393(fileobj_name)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:823(get_flipud)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:449(_polyfit_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 polynomial.py:692(_polyval_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:488(getmro)\n", + " 8 0.000 0.000 0.000 0.000 :406(has_location)\n", + " 1 0.000 0.000 0.000 0.000 signaltools.py:663()\n", + " 2 0.000 0.000 0.000 0.000 figure.py:2533(set_canvas)\n", + " 2 0.000 0.000 0.000 0.000 figure.py:72()\n", + " 4 0.000 0.000 0.000 0.000 scale.py:79(limit_range_for_scale)\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:109(__call__)\n", + " 3 0.000 0.000 0.000 0.000 __init__.py:80()\n", " 1 0.000 0.000 0.000 0.000 core.py:105(_default_patch_properties)\n", " 1 0.000 0.000 0.000 0.000 header.py:1986(__delete__)\n", " 1 0.000 0.000 0.000 0.000 header.py:2264(_pad_length)\n", - " 1 0.000 0.000 0.000 0.000 image.py:376(_update_header_scale_info)\n", - " 1 0.000 0.000 0.000 0.000 util.py:501(fileobj_is_binary)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:1379(ref_pupil_location)\n", + " 2 0.000 0.000 0.000 0.000 numeric.py:2175(_allclose_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 fromnumeric.py:550(swapaxes)\n", " 5 0.000 0.000 0.000 0.000 linalg.py:131(_linalgRealType)\n", - " 3 0.000 0.000 0.000 0.000 function_base.py:18(_linspace_dispatcher)\n", + " 5 0.000 0.000 0.000 0.000 twodim_base.py:504(_vander_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 {method 'pop' of 'collections.OrderedDict' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", " 1 0.000 0.000 0.000 0.000 {method 'as_integer_ratio' of 'float' objects}\n", - " 3 0.000 0.000 0.000 0.000 template.py:125()\n", " 1 0.000 0.000 0.000 0.000 filters.py:1591()\n", - " 1 0.000 0.000 0.000 0.000 _base.py:4222(set_navigate_mode)\n", - " 4 0.000 0.000 0.000 0.000 axis.py:1426()\n", - " 3 0.000 0.000 0.000 0.000 backend_bases.py:1715()\n", - " 1 0.000 0.000 0.000 0.000 artist.py:594(set_url)\n", - " 2 0.000 0.000 0.000 0.000 artist.py:1072(get_label)\n", - " 2 0.000 0.000 0.000 0.000 colors.py:1152(vmax)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:590(hy)\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:190()\n", + " 2 0.000 0.000 0.000 0.000 gridspec.py:231(_normalize)\n", + " 3 0.000 0.000 0.000 0.000 figure.py:69()\n", + " 1 0.000 0.000 0.000 0.000 transforms.py:380(height)\n", + " 3 0.000 0.000 0.000 0.000 colors.py:1141(vmin)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:664(select_brightest)\n", + " 1 0.000 0.000 0.000 0.000 background_2d.py:252(_combine_masks)\n", " 2 0.000 0.000 0.000 0.000 shape_base.py:508(_expand_dims_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 fractions.py:260(denominator)\n", - " 1 0.000 0.000 0.000 0.000 inspect.py:488(getmro)\n", + " 3 0.000 0.000 0.000 0.000 stride_tricks.py:362(_broadcast_to_dispatcher)\n", + " 4 0.000 0.000 0.000 0.000 inspect.py:2865(parameters)\n", " 2 0.000 0.000 0.000 0.000 {built-in method math.sqrt}\n", - " 2 0.000 0.000 0.000 0.000 {built-in method time.time}\n", + " 1 0.000 0.000 0.000 0.000 minimizer.py:313(__init__)\n", " 1 0.000 0.000 0.000 0.000 minimizer.py:521(set_max_nfev)\n", - " 1 0.000 0.000 0.000 0.000 signaltools.py:663()\n", - " 1 0.000 0.000 0.000 0.000 filters.py:660()\n", - " 2 0.000 0.000 0.000 0.000 figure.py:2385(_get_dpi)\n", - " 1 0.000 0.000 0.000 0.000 text.py:1171(set_rotation)\n", - " 1 0.000 0.000 0.000 0.000 spines.py:536(__init__)\n", - " 1 0.000 0.000 0.000 0.000 backend_bases.py:2852(set_window_title)\n", + " 3 0.000 0.000 0.000 0.000 template.py:125()\n", + " 3 0.000 0.000 0.000 0.000 signaltools.py:79()\n", + " 2 0.000 0.000 0.000 0.000 signaltools.py:80()\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:101(set_width_ratios)\n", + " 3 0.000 0.000 0.000 0.000 backend_bases.py:1715()\n", " 4 0.000 0.000 0.000 0.000 cm.py:551(norm)\n", - " 1 0.000 0.000 0.000 0.000 core.py:1136(name)\n", - " 1 0.000 0.000 0.000 0.000 background_2d.py:252(_combine_masks)\n", - " 2 0.000 0.000 0.000 0.000 header.py:337(_modified)\n", - " 1 0.000 0.000 0.000 0.000 image.py:581(_verify_blank)\n", - " 2 0.000 0.000 0.000 0.000 multiarray.py:1021(unravel_index)\n", - " 2 0.000 0.000 0.000 0.000 numeric.py:2175(_allclose_dispatcher)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3344(eqcons)\n", + " 1 0.000 0.000 0.000 0.000 header.py:2055(__len__)\n", + " 1 0.000 0.000 0.000 0.000 image.py:376(_update_header_scale_info)\n", + " 1 0.000 0.000 0.000 0.000 arraysetops.py:133(_unique_dispatcher)\n", + " 3 0.000 0.000 0.000 0.000 fromnumeric.py:89(_take_dispatcher)\n", + " 3 0.000 0.000 0.000 0.000 nanfunctions.py:858(_nanmean_dispatcher)\n", + " 3 0.000 0.000 0.000 0.000 twodim_base.py:432(_trilu_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 {method 'move_to_end' of 'collections.OrderedDict' objects}\n", + " 1 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", " 2 0.000 0.000 0.000 0.000 {built-in method _operator.mul}\n", - " 2 0.000 0.000 0.000 0.000 signaltools.py:80()\n", - " 1 0.000 0.000 0.000 0.000 filters.py:1133()\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:190()\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:616(num2)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:4206(set_navigate)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:4222(set_navigate_mode)\n", + " 1 0.000 0.000 0.000 0.000 text.py:1171(set_rotation)\n", + " 1 0.000 0.000 0.000 0.000 spines.py:582(__iter__)\n", + " 1 0.000 0.000 0.000 0.000 artist.py:1033(set_in_layout)\n", + " 2 0.000 0.000 0.000 0.000 artist.py:1072(get_label)\n", + " 2 0.000 0.000 0.000 0.000 colors.py:1152(vmax)\n", + " 2 0.000 0.000 0.000 0.000 __init__.py:818()\n", + " 1 0.000 0.000 0.000 0.000 __init__.py:1180(is_interactive)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3340(n_outputs)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3348(eqcons)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3356(ineqcons)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:327()\n", + " 1 0.000 0.000 0.000 0.000 util.py:501(fileobj_is_binary)\n", + " 1 0.000 0.000 0.000 0.000 {method 'item' of 'numpy.ndarray' objects}\n", + " 1 0.000 0.000 0.000 0.000 {built-in method numpy.ascontiguousarray}\n", + " 2 0.000 0.000 0.000 0.000 histograms.py:673(_histogram_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 inspect.py:514(_is_wrapper)\n", + " 1 0.000 0.000 0.000 0.000 filters.py:660()\n", + " 1 0.000 0.000 0.000 0.000 filters.py:1133()\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:620(num2)\n", - " 2 0.000 0.000 0.000 0.000 figure.py:72()\n", + " 1 0.000 0.000 0.000 0.000 gridspec.py:627(get_gridspec)\n", + " 1 0.000 0.000 0.000 0.000 artist.py:594(set_url)\n", " 2 0.000 0.000 0.000 0.000 artist.py:1111(sticky_edges)\n", - " 3 0.000 0.000 0.000 0.000 __init__.py:80()\n", - " 1 0.000 0.000 0.000 0.000 core.py:3356(ineqcons)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:327()\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:820(get_flipud)\n", - " 1 0.000 0.000 0.000 0.000 multiarray.py:960(ravel_multi_index)\n", - " 3 0.000 0.000 0.000 0.000 arraypad.py:521(_pad_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 image.py:581(_verify_blank)\n", " 2 0.000 0.000 0.000 0.000 shape_base.py:52(_take_along_axis_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 twodim_base.py:432(_trilu_dispatcher)\n", - " 4 0.000 0.000 0.000 0.000 inspect.py:2865(parameters)\n", - " 2 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", - " 1 0.000 0.000 0.000 0.000 minimizer.py:313(__init__)\n", - " 3 0.000 0.000 0.000 0.000 signaltools.py:79()\n", + " 1 0.000 0.000 0.000 0.000 fromnumeric.py:546(_swapaxes_dispatcher)\n", + " 2 0.000 0.000 0.000 0.000 fractions.py:260(denominator)\n", + " 2 0.000 0.000 0.000 0.000 parse.py:103(_noop)\n", + " 1 0.000 0.000 0.000 0.000 {method 'copy' of 'list' objects}\n", + " 1 0.000 0.000 0.000 0.000 optimize.py:145(_check_unknown_options)\n", " 1 0.000 0.000 0.000 0.000 gridspec.py:198()\n", - " 1 0.000 0.000 0.000 0.000 gridspec.py:627(get_gridspec)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3340(n_outputs)\n", - " 1 0.000 0.000 0.000 0.000 utils.py:217(comb)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:664(select_brightest)\n", - " 1 0.000 0.000 0.000 0.000 arraysetops.py:133(_unique_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 _base.py:611()\n", + " 1 0.000 0.000 0.000 0.000 backend_bases.py:2852(set_window_title)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3430(isleaf)\n", + " 1 0.000 0.000 0.000 0.000 daofinder.py:192(_validate_brightest)\n", " 2 0.000 0.000 0.000 0.000 fromnumeric.py:842(_sort_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2535(_ptp_dispatcher)\n", + " 1 0.000 0.000 0.000 0.000 fractions.py:256(numerator)\n", " 5 0.000 0.000 0.000 0.000 inspect.py:2552(default)\n", " 1 0.000 0.000 0.000 0.000 {built-in method math.gcd}\n", - " 1 0.000 0.000 0.000 0.000 {method 'items' of 'mappingproxy' objects}\n", - " 1 0.000 0.000 0.000 0.000 {method 'copy' of 'list' objects}\n", + " 2 0.000 0.000 0.000 0.000 {built-in method sys.getrefcount}\n", " 1 0.000 0.000 0.000 0.000 optimize.py:253(hess)\n", - " 1 0.000 0.000 0.000 0.000 artist.py:1033(set_in_layout)\n", - " 2 0.000 0.000 0.000 0.000 __init__.py:818()\n", - " 1 0.000 0.000 0.000 0.000 core.py:3348(eqcons)\n", - " 1 0.000 0.000 0.000 0.000 daofinder.py:192(_validate_brightest)\n", - " 1 0.000 0.000 0.000 0.000 wfs.py:826(get_fliplr)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method numpy.ascontiguousarray}\n", - " 2 0.000 0.000 0.000 0.000 fromnumeric.py:89(_take_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 fromnumeric.py:546(_swapaxes_dispatcher)\n", + " 2 0.000 0.000 0.000 0.000 figure.py:2385(_get_dpi)\n", + " 1 0.000 0.000 0.000 0.000 colors.py:1167(clip)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3335(n_outputs)\n", + " 2 0.000 0.000 0.000 0.000 core.py:3352(ineqcons)\n", + " 2 0.000 0.000 0.000 0.000 core.py:765(outputs)\n", + " 1 0.000 0.000 0.000 0.000 wfs.py:829(get_fliplr)\n", " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2042(_clip_dispatcher)\n", - " 2 0.000 0.000 0.000 0.000 histograms.py:673(_histogram_dispatcher)\n", - " 1 0.000 0.000 0.000 0.000 fractions.py:256(numerator)\n", " 3 0.000 0.000 0.000 0.000 inspect.py:2556(annotation)\n", - " 2 0.000 0.000 0.000 0.000 parse.py:103(_noop)\n", - " 1 0.000 0.000 0.000 0.000 {method 'move_to_end' of 'collections.OrderedDict' objects}\n", " 1 0.000 0.000 0.000 0.000 {method 'fileno' of '_io.FileIO' objects}\n", - " 1 0.000 0.000 0.000 0.000 optimize.py:145(_check_unknown_options)\n", + " 1 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", " 2 0.000 0.000 0.000 0.000 artist.py:828(get_visible)\n", " 1 0.000 0.000 0.000 0.000 transforms.py:1019(minpos)\n", - " 1 0.000 0.000 0.000 0.000 colors.py:1167(clip)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3344(eqcons)\n", " 1 0.000 0.000 0.000 0.000 hdulist.py:392(__enter__)\n", - " 1 0.000 0.000 0.000 0.000 fromnumeric.py:2535(_ptp_dispatcher)\n", " 1 0.000 0.000 0.000 0.000 inspect.py:2869(return_annotation)\n", - " 1 0.000 0.000 0.000 0.000 {built-in method sys.getrecursionlimit}\n", - " 1 0.000 0.000 0.000 0.000 __init__.py:109(__call__)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3352(ineqcons)\n", - " 1 0.000 0.000 0.000 0.000 core.py:765(outputs)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3335(n_outputs)\n", - " 1 0.000 0.000 0.000 0.000 core.py:3430(isleaf)" + " 1 0.000 0.000 0.000 0.000 multiarray.py:960(ravel_multi_index)" ] } ], @@ -2273,6 +2266,79 @@ "np.log(mindist.sum())" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "a = np.arange(25).reshape(5, 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([50, 55, 60, 65, 70])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.sum(axis=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 10, 35, 60, 85, 110])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.sum(axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 3, 4],\n", + " [ 5, 6, 7, 8, 9],\n", + " [10, 11, 12, 13, 14],\n", + " [15, 16, 17, 18, 19],\n", + " [20, 21, 22, 23, 24]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/notebooks/spot_analysis.ipynb b/notebooks/spot_analysis.ipynb new file mode 100644 index 00000000..9e19c2e8 --- /dev/null +++ b/notebooks/spot_analysis.ipynb @@ -0,0 +1,615 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from astropy.io import fits\n", + "from astropy import stats\n", + "from astropy.modeling.models import Gaussian2D, Polynomial2D, Lorentz2D, Moffat2D, PowerLaw1D\n", + "from astropy.modeling import fitting, custom_model\n", + "from astropy.convolution import Gaussian2DKernel\n", + "\n", + "from photutils.aperture import CircularAperture\n", + "from photutils.profiles import RadialProfile\n", + "from photutils.isophote import EllipseGeometry, Ellipse\n", + "\n", + "from skimage import restoration\n", + "\n", + "from mmtwfs.wfs import check_wfsdata, wfsfind, Binospec" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "#%matplotlib widget" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "bino = Binospec()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "np.float64(0.176904694401664)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bino.ref_spot_fwhm(mode=\"binospec\")\n", + "bino_spot_psf = Gaussian2DKernel(bino.ref_spot_fwhm(mode=\"binospec\") * stats.gaussian_fwhm_to_sigma)\n", + "plt.imshow(bino_spot_psf, origin='lower')\n", + "plt.show()\n", + "bino_spot_psf.array.max()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "311960.88\n", + "0.8093354417352824 0.9135247746600422\n" + ] + } + ], + "source": [ + "spot = fits.open(\"spot.fits\")[0].data\n", + "\n", + "back = np.mean([spot[:1, :].mean(), spot[-1:, :].mean(), spot[:, :1].mean(), spot[:, -1:].mean()])\n", + "print(back)\n", + "spot -= back\n", + "g2d = Gaussian2D(amplitude=spot.max(), x_mean=spot.shape[1]/2, y_mean=spot.shape[0]/2)\n", + "l2d = Lorentz2D(amplitude=spot.max(), x_0=spot.shape[1]/2, y_0=spot.shape[0]/2)\n", + "m2d = Moffat2D(amplitude=spot.max(), x_0=spot.shape[1]/2, y_0=spot.shape[0]/2)\n", + "\n", + "model = m2d\n", + "gmodel = g2d\n", + "fitter = fitting.DogBoxLSQFitter()\n", + "y, x = np.mgrid[:spot.shape[0], :spot.shape[1]]\n", + "fit = fitter(model, x, y, spot)\n", + "gfit = fitter(gmodel, x, y, spot)\n", + "\n", + "gsigma = 0.5 * (gfit.x_stddev.value + gfit.y_stddev.value)\n", + "#print(sigma)\n", + "print(fit.fwhm * 0.153, gsigma * stats.gaussian_sigma_to_fwhm * 0.153)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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BgYGZrQPDAxg586d8zSruWXv3r0YHh6eseZsNouLL7644dc8MjICAFi6dCmA5l6rbPcwzXI9ZbvNbbtA817ThW67C9L5OHDgACqVCrq6uma0d3V1YXh4eJ5mNbccWVezrdk5hw0bNuDLX/4yVq1aBaB51wrIdj9Jo69ZtnuYZljbbDTjNW0E200lfsYYHCnrfATnXKSt2Wi2Na9btw4vvfQS/vjHP0Y+a7a1fpJmXhuj2dYs2z1MM61tNppp3Y1guwvyzUdnZyeCIIh4Y/v37494bc1Cd3c3ADTVmm+55RY89thjePrpp7F8+fLp9mZc6xFkux/TyGuW7X5MM6xtNprtmjaK7S5I5yOTyeCss87Ctm3bZrRv27YNF1xwwTzNam7p7+9Hd3f3jDUXi0Vs37694dbsnMO6devwyCOP4KmnnkJ/f/+Mz5tprdXIdg/TqNdTtnti2S7QPNe04Ww38RDXGnnooYdcOp12v/zlL92rr77q1q9f79ra2txbb70131M7ZkZHR93u3bvd7t27HQC3ZcsWt3v3bvf2228755y74447XEdHh3vkkUfcyy+/7K6++mrX09Pj8vn8PM88HjfeeKPr6OhwzzzzjHv//fenj4mJiek+zbJWC9lu415P2W7z2a5zJ4b9NprtLljnwznnfvKTn7gVK1a4TCbjvvCFL0xLhhqVp59+2gGIHGvXrnXOHZZC3X777a67u9tls1l30UUXuZdffnl+J30MWGsE4LZu3Trdp1nWypDtNub1lO02n+06d2LYb6PZrve3SQshhBBCJMKCjPkQQgghRPMi50MIIYQQiSLnQwghhBCJIudDCCGEEIki50MIIYQQiSLnQwghhBCJIudDCCGEEIki50MIIYQQiSLnQwghhBCJIudDCCGEEIki50MIIYQQifL/AUx0TeIc8ADgAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 3)\n", + "im1 = ax[0].imshow(spot, origin='lower')\n", + "im2 = ax[1].imshow(spot - fit(x, y), origin='lower')\n", + "im2 = ax[2].imshow(spot - gfit(x, y), origin='lower')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "@custom_model\n", + "def spot_profile(r, amplitude=1, a=1):\n", + " return amplitude * np.exp(-a * r**(5/3))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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QSWTSeupmXHOqb29XatXr9bixYslcU1lK+920b6Zb7d2cM7dsN3DbNXS0pL585IlS7Rq1SrdddddevXVV9Xe3m44s/zHtXVrGzduzPx58eLFWr58uerq6vT2229rw4YNhjOzs23bNn3yySf64IMPJj3GNTU1BbESWrBggYqLiyf9FDE4ODjppw38v3nz5mnJkiU6c+aM9VTy1vV3D3JtZa+mpkZ1dXWz9vp65pln9NZbb+ndd9+d0H6Gayo7BRFCZWVlWrZsmXp6eibc39PTo8bGRqNZ5b9kMqlPP/1UNTU11lPJW/X19YrFYhOurdHRUfX29nJt3cKlS5fU398/664v55y2bdumN954Q0eOHFF9ff2Ex7mmslMwv45rb2/XE088oeXLl2vVqlV66aWXdO7cOW3ZssV6annj2Wef1fr167Vo0SINDg7qN7/5jRKJhFpbW62nZury5cs6e/Zs5uu+vj6dPHlSlZWVWrRokdra2tTZ2amGhgY1NDSos7NTc+fO1aZNmwxnffvd7DxVVlaqo6NDjz32mGpqavTFF1/oueee04IFC/Too48azvr227p1q/bv368333xT0Wg0s+KpqKhQeXm5giDgmsqG6XvzsvT73//e1dXVubKyMvejH/0o85ZIfGPjxo2upqbGlZaWung87jZs2OBOnz5tPS1z7777rpM06dba2uqc++Yttbt27XKxWMxFIhH3wAMPuFOnTtlO2sDNztOVK1dcc3Ozu/POO11paalbtGiRa21tdefOnbOe9m13o3Mkyb3yyiuZY7impo5WDgAAMwXxmhAAYGYihAAAZgghAIAZQggAYIYQAgCYIYQAAGYIIQCAGUIIAGCGEAIAmCGEAABmCCEAgBlCCABg5v8AnBvzH6NT81AAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "spot_deconvolved = restoration.richardson_lucy(spot/spot.max(), bino_spot_psf.array/bino_spot_psf.array.max(), num_iter=10, filter_epsilon=1e-2)\n", + "plt.imshow(spot_deconvolved, origin='lower')\n", + "plt.show()\n", + "fits.writeto(\"spot_deconvolved.fits\", spot_deconvolved, overwrite=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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CG89X1ys6nC+sPSqvYZhFLtvmmaJtgv1P7fd0+esLipa9+LFi3n22Wf5+OOPady4cWF7nz596NOnT+H9/v3706NHD1577TVeffXVyiu8CnhyLNq2bUvbtm0L7/ft25cDBw7w0ksvMWjQoAo9Z3VS0brfeecd6taty8iRI4u11+TPhae8+XxRUd54vvCEt58vKqo6nC8sGRlp2LAhdru9RNI8cuRIiUR6RpMmTUrt73A4aNCgwXn7lPWc1UFFjsUZS5YsYcKECXzwwQcMHjz4vH1tNhuXX355tf4/nYs5FkX16dOn2Pv0tc+FaZosWLCAsWPH4u/vf96+NeFzURHeer64GN52vqgs3nC+uBjV5XxhSRjx9/cnJiaG+Pj4Yu3x8fH069ev1H369u1bov9nn31Gz5498fPzO2+fsp6zOqjIsQD3/+GMHz+eRYsWcd11113wdUzTZMuWLYSHh190zVWlosfiXAkJCcXepy99LsD9k9ZffvmFCRMmXPB1asLnoiK89XxRUd54vqgs3nC+uBjV5nxxSabJluL99983/fz8zPnz55s7duwwJ0+ebNaqVatwJu+0adPMsWPHFvbfu3evGRwcbE6ZMsXcsWOHOX/+fNPPz89cunRpYZ/169ebdrvd/Mtf/mLu3LnT/Mtf/mI6HA7z66+/vuTvzxOeHotFixaZDofDfP31183k5OTCLS0trbDPs88+a65atcrcs2ePmZCQYN59992mw+Ewv/nmm0v+/jzh6bH429/+Zi5fvtz8+eefzR9++MGcNm2aCZjLli0r7OMrn4sz7rzzTrN3796lPmdN/VxkZmaaCQkJZkJCggmYr7zyipmQkGDu37/fNE3fOl94eiy8+Xzh6bHw5vOFp8fijOpyvrAsjJimab7++utmVFSU6e/vb/bo0cNcs2ZN4WN33XWXecUVVxTr/+WXX5rdu3c3/f39zRYtWphz584t8Zwffvih2bZtW9PPz89s165dsQ9ZdebJsbjiiitMoMR21113FfaZPHmy2bx5c9Pf399s1KiRGRsba27YsOESvqOK8+RYvPDCC2arVq3MwMBAs169euaAAQPM//73vyWe0xc+F6ZpmmlpaWZQUJD51ltvlfp8NfVzceYnmWV95n3pfOHpsfDm84Wnx8KbzxcV+W+kOp0vDNMsmNUlIiIiYgFdm0ZEREQspTAiIiIillIYEREREUspjIiIiIilFEZERETEUgojIiIiYimFEREREbGUwoiIiIhYSmFERERELKUwIiIiIpZSGBERERFLKYyIiIiIpf4fzGyPl6wEeTkAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameter('amplitude', value=1.0613963594737623) Parameter('a', value=3.175684544555147)\n" + ] + } + ], + "source": [ + "xycen = (spot_deconvolved.shape[1]/2, spot_deconvolved.shape[0]/2)\n", + "edge_radii = np.arange(np.max(xycen))\n", + "rp = RadialProfile(spot_deconvolved, xycen, edge_radii)\n", + "rp.normalize()\n", + "prof_model = spot_profile(amplitude=1, a=1)\n", + "#prof_model.amplitude.fixed = True\n", + "rad_ang = rp.radius * 0.153\n", + "prof_fit = fitter(prof_model, rad_ang, rp.profile)\n", + "plt.plot(rad_ang, rp.profile)\n", + "plt.plot(rad_ang, prof_fit(rad_ang))\n", + "plt.show()\n", + "print(prof_fit.amplitude, prof_fit.a)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(np.float64(0.11796254649046561), np.float64(1.061985823018455))" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wave = 0.6e-6\n", + "refwave = 0.5e-6\n", + "r0 = wave / (3.44/prof_fit.a)**0.6\n", + "seeing_fwhm = 0.976 * wave / r0\n", + "seeing_fwhm = seeing_fwhm * refwave**-0.2 / wave**-0.2\n", + "206265 * r0, seeing_fwhm" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((, ),\n", + " (, ))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bino.seeing(\"binospec\", gsigma), bino.seeing(\"binospec\", fit.fwhm * stats.gaussian_fwhm_to_sigma)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"~/MMT/wfsdat/20250203/reanalyze_results.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMWpJREFUeJzt3XtcVXW+//H3VnADCnhLLnmDQs1KLUmFctQSelhZjZU2+igtKxu7oZVJNokdg8nOqJWpx44p08nLKatjTZqMqWnmhIbVSGkpXpokigzwBhnf3x/93OMO5KKw1/7C6/l47MfD/V3ftfZnf8XN2+9e37VcxhgjAAAASzVxugAAAICzQZgBAABWI8wAAACrEWYAAIDVCDMAAMBqhBkAAGA1wgwAALBagNMF1Lfy8nJ9++23Cg0NlcvlcrocAABQA8YYlZSUKDo6Wk2aVD330uDDzLfffqsOHTo4XQYAADgDBw4cUPv27avs0+DDTGhoqKRfByMsLMzhagAAQE0UFxerQ4cOnt/jVXE8zPzrX//SY489plWrVunYsWPq0qWLFi5cqN69e0v6dZpp2rRpWrBggQ4dOqS+ffvqxRdf1IUXXlij45/8aiksLIwwAwCAZWpyioijJwAfOnRIl19+uQIDA7Vq1Srl5ubqL3/5i1q2bOnpM2PGDM2cOVNz5sxRdna2IiMjlZSUpJKSEucKBwAAfsPl5I0mJ0+erA8//FAbN26sdLsxRtHR0UpJSdFjjz0mSSotLVVERISeeeYZjRs3rtrXKC4uVnh4uIqKipiZAQDAErX5/e3ozMzKlSsVHx+vW265Re3atdMll1yil156ybM9Ly9P+fn5Sk5O9rS53W4NGDBAmzdvrvSYpaWlKi4u9noAAICGy9FzZvbs2aN58+Zp4sSJevzxx/Xxxx/rwQcflNvt1u233678/HxJUkREhNd+ERER2rdvX6XHzMjI0LRp0+q9dgCAPcrLy1VWVuZ0GThFYGCgmjZtWifHcjTMlJeXKz4+Xunp6ZKkSy65RDt27NC8efN0++23e/r99uQfY8xpTwhKTU3VxIkTPc9Png0NAGicysrKlJeXp/LycqdLwW+0bNlSkZGRZ30dOEfDTFRUlLp37+7VdsEFF2jFihWSpMjISElSfn6+oqKiPH0KCgoqzNac5Ha75Xa766liAIBNjDE6ePCgmjZtqg4dOlR78TX4hjFGR48eVUFBgSR5/Y4/E46Gmcsvv1w7d+70atu1a5c6deokSYqJiVFkZKSysrJ0ySWXSPo1YW/YsEHPPPOMz+sFANjlxIkTOnr0qKKjoxUSEuJ0OThFcHCwpF8nKNq1a3dWXzk5GmYmTJigxMREpaena/jw4fr444+1YMECLViwQNKvXy+lpKQoPT1dcXFxiouLU3p6ukJCQjRy5EgnSwcAWOCXX36RJDVr1szhSlCZkwHz559/tjfMXHbZZXrzzTeVmpqqp556SjExMZo9e7ZGjRrl6TNp0iQdO3ZM48eP91w0b82aNTW6IiAAAFLNLrwG36urvxdHrzPjC1xnBgAar+PHjysvL08xMTEKCgpyuhz8RlV/P9ZcZwYAAOBsOX5vJgAAfG1W1i6fvt6EpC4+fb29e/cqJiZGOTk56tWrV432Wbx4sVJSUvTTTz85WseZYGYGAAA/deDAAY0dO1bR0dFq1qyZOnXqpIceekiFhYVV7tehQwcdPHhQF110UY1fa8SIEdq1y7chr64QZgAA8EN79uxRfHy8du3apaVLl+rrr7/W/PnztXbtWiUkJOjHH3+sdL+ysjI1bdpUkZGRCgio+RcwwcHBateuXV2V71OEGQAA/NB9992nZs2aac2aNRowYIA6duyoIUOG6O9//7v+9a9/acqUKZKkzp07a/r06RozZozCw8N19913a+/evXK5XNq+fbvneCtXrlRcXJyCg4M1aNAgZWZmyuVyeb5WWrx4sVq2bOnpn5aWpl69eumVV15R586dFR4erltvvVUlJSWePqtXr9YVV1yhli1bqk2bNrruuuu0e/duXwyPF86ZAfzRuoyqtw9K9U0dABzx448/6r333tPTTz/tubjcSZGRkRo1apSWL1+uuXPnSpKeffZZ/elPf9ITTzxR6fH27t2rm2++WQ899JDuuusu5eTk6JFHHqm2jt27d+utt97SO++8o0OHDmn48OH685//rKefflqSdOTIEU2cOFEXX3yxjhw5oieffFK///3vtX37dp9ebZkwAwCAn/nqq69kjNEFF1xQ6fYLLrhAhw4d0vfffy9JuvLKK73Cyd69e736z58/X127dtWzzz4rSeratav++c9/ekLJ6ZSXl2vx4sWea7vddtttWrt2rWe/m266yav/woUL1a5dO+Xm5tbqfJ2zxddMAABY5uQl4k5edC4+Pr7K/jt37tRll13m1danT59qX6dz585eF6mNiory3E9J+nXmZuTIkYqNjVVYWJhiYmIkSfv376/ZG6kjhBkAAPzM+eefL5fLpdzc3Eq3f/nll2rVqpXatm0rSWrevHmVxzPGVLjabk2umRsYGOj13OVyed19fOjQoSosLNRLL72kf/zjH/rHP/4h6deTkH2JMAMAgJ9p06aNkpKSNHfuXB07dsxrW35+vl599VWNGDGixrcD6Natm7Kzs73atm7delY1FhYW6osvvtATTzyhq666yvPVlxMIMwAA+KE5c+aotLRUV199tT744AMdOHBAq1evVlJSks4999xqz3c51bhx4/Tll1/qscce065du/S///u/Wrx4saQzvz9Sq1at1KZNGy1YsEBff/213n//fU2cOPGMjnW2OAEYANDo+PqKvGciLi5OW7duVVpamkaMGKHCwkJFRkbqxhtv1NSpU9W6desaHysmJkavv/66Hn74YT333HNKSEjQlClT9Mc//lFut/uM6mvSpImWLVumBx98UBdddJG6du2q559/XgMHDjyj450NbjQJ+COWZgN1ghtNnt7TTz+t+fPn68CBA47VUFc3mmRmBgCARmDu3Lm67LLL1KZNG3344Yd69tlndf/99ztdVp0gzAAA0Ah89dVXmj59un788Ud17NhRDz/8sFJTG8YsL2EGAIBGYNasWZo1a5bTZdQLVjMBAACrEWYAAIDVCDMAAMBqhBkAAGA1wgwAALAaYQYAAFiNpdkAgManuqts17VaXLV76NChOnbsmP7+979X2PbRRx8pMTFR27ZtU+/evZWTk6NevXpJksaMGaPMzMwqj91QL/rPzAwAAH5k7Nixev/997Vv374K215++WX16tWr0vsyPffcczp48KDnIUmLFi2q0NYQEWYAAPAj1113ndq1a+e5q/VJR48e1fLlyzV27NhK9wsPD1dkZKTnIUktW7as0NYQEWYAAPAjAQEBuv3227V48WKvr4Vee+01lZWVadSoUQ5W558IMwAA+Jk777xTe/fu1fr16z1tL7/8soYNG6ZWrVo5V5ifIswAAOBnunXrpsTERL388suSpN27d2vjxo268847Ha7MPxFmAADwQ2PHjtWKFStUXFysRYsWqVOnTrrqqqucLssvEWYAAPBDw4cPV9OmTbVkyRJl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tR2Pk4qKinT77bfrqquuqqfKnHEm49GQP0trOx4N/bP0rBhUq0+fPubee+/1auvWrZuZPHlypf1XrVplwsPDTWFhoS/K87najsezzz5rYmNjvdqef/550759+3qr0SmSzJtvvllln0mTJplu3bp5tY0bN87069evHivzvZqMRWW6d+9upk2bVvcFOaw24zFixAjzxBNPmKlTp5qePXvWa11Oqcl4NPTP0lPVZDwa02dpbTEzU42ysjJt27ZNycnJXu3JycnavHlzpfusXLlS8fHxmjFjhs4991x16dJFjzzyiI4dO+aLkuvVmYxHYmKivvnmG7377rsyxui7777T66+/rmuvvdYXJfudjz76qML4XX311dq6dat+/vlnh6ryD+Xl5SopKVHr1q2dLsUxixYt0u7duzV16lSnS3FcQ/4sPRN8lp6e318B2Gk//PCDfvnllwo3toyIiKhwA8yT9uzZo02bNikoKEhvvvmmfvjhB40fP14//vij9d/1nsl4JCYm6tVXX9WIESN0/PhxnThxQtdff71eeOEFX5Tsd/Lz8ysdvxMnTuiHH35QVFSUQ5U57y9/+YuOHDmi4cOHO12KI7766itNnjxZGzduVEAAH88N+bP0TPBZenrMzNSQy+Xyem6MqdB2Unl5uVwul1599VX16dNH11xzjWbOnKnFixc3mP9R1GY8cnNz9eCDD+rJJ5/Utm3btHr1auXl5TXq+2tVNn6VtTcmS5cuVVpampYvX6527do5XY7P/fLLLxo5cqSmTZumLl26OF2OX2gMn6W1wWfp6RH9q9G2bVs1bdq0wqxDQUFBhf9dnxQVFaVzzz3X69blF1xwgYwx+uabbxQXF1evNdenMxmPjIwMXX755Xr00UclST169FDz5s3Vv39/TZ8+vdHNRERGRlY6fgEBAWrTpo1DVTlr+fLlGjt2rF577TUNHjzY6XIcUVJSoq1btyonJ0f333+/pF9/mRtjFBAQoDVr1ujKK690uErfasifpWeCz9LTY2amGs2aNVPv3r2VlZXl1Z6VlaXExMRK97n88sv17bff6vDhw562Xbt2qUmTJmrfvn291lvfzmQ8jh49qiZNvH/UmjZtKunfMxKNSUJCQoXxW7NmjeLj4xUYGOhQVc5ZunSpxowZoyVLljTq7/7DwsL0+eefa/v27Z7Hvffeq65du2r79u3q27ev0yX6XEP+LD0TfJZWwakzj22ybNkyExgYaBYuXGhyc3NNSkqKad68udm7d68xxpjJkyeb2267zdO/pKTEtG/f3tx8881mx44dZsOGDSYuLs7cddddTr2FOlXb8Vi0aJEJCAgwc+fONbt37zabNm0y8fHxpk+fPk69hTpVUlJicnJyTE5OjpFkZs6caXJycsy+ffuMMRXHY8+ePSYkJMRMmDDB5ObmmoULF5rAwEDz+uuvO/UW6kxtx2LJkiUmICDAvPjii+bgwYOex08//eTUW6hTtR2P32poq5lqOx4N/bO0tuPR0D9LzwZhpoZefPFF06lTJ9OsWTNz6aWXmg0bNni2jR492gwYMMCr/xdffGEGDx5sgoODTfv27c3EiRPN0aNHfVx1/anteDz//POme/fuJjg42ERFRZlRo0aZb775xsdV149169YZSRUeo0ePNsZUPh7r1683l1xyiWnWrJnp3LmzmTdvnu8Lrwe1HYsBAwZU2d92Z/KzcaqGFmbOZDwa8mfpmYxHQ/4sPRsuYxr73BQAALAZ58wAAACrEWYAAIDVCDMAAMBqhBkAAGA1wgwAALAaYQYAAFiNMAMAAKxGmAEAAFYjzACocy6XS2+99ZZPXmvhwoVKTk72yWvVl0ceeUQPPvig02UA1uIKwEAjUlBQoD/96U9atWqVvvvuO7Vq1Uo9e/ZUWlqaEhIS6ux18vPz1apVK7nd7jo7ZmVKS0sVGxurZcuWqX///vX6WvWpoKBA5513nj777DPFxMQ4XQ5gHWZmgEbkpptu0qeffqrMzEzt2rVLK1eu1MCBA/Xjjz/W6etERkbWe5CRpBUrVqhFixZnHWR+/vnnOqrozLRr107JycmaP3++o3UAtiLMAI3ETz/9pE2bNumZZ57RoEGD1KlTJ/Xp00epqam69tprPf2Kiop0zz33qF27dgoLC9OVV16pTz/91OtYb7/9tnr37q2goCDFxsZq2rRpOnHihGf7qV8z7d27Vy6XS2+88YYGDRqkkJAQ9ezZUx999JHXMV966SV16NBBISEh+v3vf6+ZM2eqZcuWVb6nZcuW6frrr/dqy87OVlJSktq2bavw8HANGDBAn3zyiVcfl8ul+fPn64YbblDz5s01ffp0SdLKlSsVHx+voKAgtW3bVsOGDfPsM3fuXMXFxSkoKEgRERG6+eabPduMMZoxY4ZiY2MVHBysnj176vXXX/d6zR07dujaa69VWFiYQkND1b9/f+3evduz/frrr9fSpUurfL8ATsPR21wC8Jmff/7ZtGjRwqSkpJjjx49X2qe8vNxcfvnlZujQoSY7O9vs2rXLPPzww6ZNmzamsLDQGGPM6tWrTVhYmFm8eLHZvXu3WbNmjencubNJS0vzHEeSefPNN40xxuTl5RlJplu3buadd94xO3fuNDfffLPp1KmT+fnnn40xxmzatMk0adLEPPvss2bnzp3mxRdfNK1btzbh4eFVvqeWLVuaZcuWebWtXbvWvPLKKyY3N9fk5uaasWPHmoiICFNcXOxVX7t27czChQvN7t27zd69e80777xjmjZtap588kmTm5trtm/fbp5++mljjDHZ2dmmadOmZsmSJWbv3r3mk08+Mc8995zneI8//rjp1q2bWb16tdm9e7dZtGiRcbvdZv369cYYY7755hvTunVrM2zYMJOdnW127txpXn75ZfPll196jpGbm2skmb1791b5ngFURJgBGpHXX3/dtGrVygQFBZnExESTmppqPv30U8/2tWvXmrCwsAph57zzzjP/9V//ZYwxpn///iY9Pd1r+yuvvGKioqI8zysLM//93//t2b5jxw4jyXzxxRfGGGNGjBhhrr32Wq9jjho1qsowc+jQISPJfPDBB1W+5xMnTpjQ0FDz9ttve9WXkpLi1S8hIcGMGjWq0mOsWLHChIWFeQWikw4fPmyCgoLM5s2bvdrHjh1r/vCHPxhjjElNTTUxMTGmrKzstHUWFRUZSZ4ABKDm+JoJaERuuukmffvtt1q5cqWuvvpqrV+/XpdeeqkWL14sSdq2bZsOHz6sNm3aqEWLFp5HXl6e5yuRbdu26amnnvLafvfdd+vgwYM6evToaV+7R48enj9HRUVJ+vXEV0nauXOn+vTp49X/t89/69ixY5KkoKAgr/aCggLde++96tKli8LDwxUeHq7Dhw9r//79Xv3i4+O9nm/fvl1XXXVVpa+VlJSkTp06KTY2VrfddpteffVVz3vNzc3V8ePHlZSU5DUmf/3rXz1jtn37dvXv31+BgYGnfT/BwcGSVOUYAqhcgNMFAPCtoKAgJSUlKSkpSU8++aTuuusuTZ06VWPGjFF5ebmioqK0fv36CvudPH+lvLxc06ZN8zqf5NRjn86pv8hdLpfnWNKv55ycbDvJVLPQsk2bNnK5XDp06JBX+5gxY/T9999r9uzZ6tSpk9xutxISElRWVubVr3nz5l7PT4aJyoSGhuqTTz7R+vXrtWbNGj355JNKS0tTdna25z387W9/07nnnuu138mToKs69kknT8I+55xzqu0LwBthBmjkunfv7jlZ99JLL1V+fr4CAgLUuXPnSvtfeuml2rlzp84///w6q6Fbt276+OOPvdq2bt1a5T7NmjVT9+7dlZub63WdmY0bN2ru3Lm65pprJEkHDhzQDz/8UG0NPXr00Nq1a3XHHXdUuj0gIECDBw/W4MGDNXXqVLVs2VLvv/++kpKS5Ha7tX//fg0YMOC0x87MzNTPP/982tmZf/7znwoMDNSFF15Yba0AvBFmgEaisLBQt9xyi+6880716NFDoaGh2rp1q2bMmKEbbrhBkjR48GAlJCToxhtv1DPPPKOuXbvq22+/1bvvvqsbb7xR8fHxevLJJ3XdddepQ4cOuuWWW9SkSRN99tln+vzzzz2rgmrrgQce0O9+9zvNnDlTQ4cO1fvvv69Vq1ZVmK35rauvvlqbNm1SSkqKp+3888/XK6+8ovj4eBUXF+vRRx+t0czI1KlTddVVV+m8887TrbfeqhMnTmjVqlWaNGmS3nnnHe3Zs0e/+93v1KpVK7377rsqLy9X165dFRoaqkceeUQTJkxQeXm5rrjiChUXF2vz5s1q0aKFRo8erfvvv18vvPCCbr31VqWmpio8PFxbtmxRnz591LVrV0m/hrD+/fvXqFYAv+H0STsAfOP48eNm8uTJ5tJLLzXh4eEmJCTEdO3a1TzxxBPm6NGjnn7FxcXmgQceMNHR0SYwMNB06NDBjBo1yuzfv9/TZ/Xq1SYxMdEEBwebsLAw06dPH7NgwQLPdlVyAnBOTo5n+8mTd9etW+dpW7BggTn33HNNcHCwufHGG8306dNNZGRkle/piy++MMHBweann37ytH3yyScmPj7euN1uExcXZ1577TXTqVMnM2vWrErrO9WKFStMr169TLNmzUzbtm3NsGHDjDHGbNy40QwYMMC0atXKBAcHmx49epjly5d79isvLzfPPfec6dq1qwkMDDTnnHOOufrqq82GDRs8fT799FOTnJxsQkJCTGhoqOnfv7/ZvXu3Z3uXLl3M0qVLq3y/ACrHFYAB+KW7775bX375pTZu3Fhlv+HDh+uSSy5Ramqqjyqre3/729/06KOP6rPPPlNAABPmQG2xmgmAX/jP//xPffrpp/r666/1wgsvKDMzU6NHj652v2effVYtWrTwQYX158iRI1q0aBFBBjhDzMwA8AvDhw/X+vXrVVJSotjYWD3wwAO69957nS4LgAUIMwAAwGp8zQQAAKxGmAEAAFYjzAAAAKsRZgAAgNUIMwAAwGqEGQAAYDXCDAAAsBphBgAAWO3/AceXrwTze+QKAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(df[\"seeing\"], bins=50, alpha=0.5, label=\"Original\")\n", + "plt.hist(df['vlt_seeing'], bins=50, alpha=0.5, label=\"VLT\")\n", + "plt.xlabel(\"Seeing (arcsec)\")\n", + "plt.ylabel(\"N\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(df['ellipticity'], bins=50)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(0.14416841619964155)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['ellipticity'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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WvTo0QNff/11m+1SzXvAeyDjfeA9AHgPgNi6B5Ik4cyZM+jevTucTvVMlbiZYXE6nbjsssuifRlRk56ebvsPpdV4D3gPZLwPvAcA7wEQO/cg1MyKjEm3REREZHsMWIiIiMj2GLDEuOTkZPz6179GcnJytC8langPeA9kvA+8BwDvARCf9yBukm6JiIgofnGGhYiIiGyPAQsRERHZHgMWIiIisj0GLERERGR7DFhsZunSpcjJyUFKSgry8/Oxffv2kMd/+OGHyM/PR0pKCi6//HK8+OKLfn+/cuVKOByOoD/19fVWvo2w6bkPbrcb9913H6688ko4nU5Mnz5d8bg333wTubm5SE5ORm5uLtatW2fR1ZvD7HsQi58FPffgrbfewsiRI9GlSxekp6ejsLAQ7777btBx8fw5ELkH8f452LFjB4qKitC5c2e0b98e/fv3x6JFi4KOi+fPgcg9iMXPASSyjTVr1kiJiYnSihUrpIqKCmnatGlSWlqa9NVXXyke/+WXX0qpqanStGnTpIqKCmnFihVSYmKi9Je//MV7zGuvvSalp6dLbrfb74+d6b0PR44ckf7t3/5N+t///V9p8ODB0rRp04KO2bVrl5SQkCA988wz0sGDB6VnnnlGateunbR7926L340xVtyDWPss6L0H06ZNkxYuXCjt2bNH+uKLL6TZs2dLiYmJ0r59+7zHxPvnQOQexPvnYN++fdLq1aul8vJy6ciRI9If//hHKTU1VVq+fLn3mHj/HIjcg1j7HEiSJDFgsZFhw4ZJkydP9nusf//+0qxZsxSP/8///E+pf//+fo/9/Oc/lwoKCrz//9prr0kZGRmmX6uV9N4HXzfffLPiYH3PPfdIo0eP9nvs1ltvle69996wrtUqVtyDWPsshHMPZLm5udK8efO8/9+WPgeywHvQFj8H48ePl+6//37v/7fFz0HgPYi1z4EkSRKXhGyisbERe/fuxahRo/weHzVqFHbt2qX4nNLS0qDjb731Vvz9739HU1OT97GzZ8+iV69euOyyy3D77bdj//795r8Bkxi5DyLU7lU457SKVfcAiJ3Pghn3oKWlBWfOnEFmZqb3sbb2OVC6B0Db+hzs378fu3btws033+x9rK19DpTuARA7nwMZAxabqKqqQnNzM7p16+b3eLdu3eDxeBSf4/F4FI+/cOECqqqqAAD9+/fHypUrsWHDBhQXFyMlJQVFRUU4dOiQNW8kTEbugwi1exXOOa1i1T2Ipc+CGffg97//Perq6nDPPfd4H2trnwOle9BWPgeXXXYZkpOTcc0112DKlCn42c9+5v27tvI5CHUPYulzIIubbs3xwuFw+P2/JElBj2kd7/t4QUEBCgoKvH9fVFSEoUOH4g9/+AOef/55sy7bdHrvQ7TOaSWzrzcWPwtG70FxcTHmzp2L9evXo2vXrqacM1rMvgdt5XOwfft2nD17Frt378asWbPQt29fTJw4MaxzRpPZ9yAWPwcMWGwiKysLCQkJQRHziRMngiJrmcvlUjy+Xbt26Ny5s+JznE4nrr32WttG0Ubugwi1exXOOa1i1T0IZOfPQjj3YO3atXjkkUfw5z//GSNGjPD7u7byOQh1DwLF6+cgJycHADBw4EB8++23mDt3rnewbiufg1D3IJCdPwcyLgnZRFJSEvLz81FSUuL3eElJCa6//nrF5xQWFgYd/9577+Gaa65BYmKi4nMkSUJZWRmys7PNuXCTGbkPItTuVTjntIpV9yCQnT8LRu9BcXExHnroIaxevRpjx44N+vu28DnQugeB4vFzEEiSJDQ0NHj/vy18DgIF3gOlv7fr58Ar4mm+pEreuvbKK69IFRUV0vTp06W0tDTp6NGjkiRJ0qxZs6QHHnjAe7y8rXnGjBlSRUWF9MorrwRta547d660efNmqbKyUtq/f7/08MMPS+3atZM++uijiL8/UXrvgyRJ0v79+6X9+/dL+fn50n333Sft379f+uyzz7x/v3PnTikhIUF69tlnpYMHD0rPPvtsTGxjNPMexNpnQe89WL16tdSuXTvphRde8Numefr0ae8x8f45ELkH8f45WLJkibRhwwbpiy++kL744gvp1VdfldLT06UnnnjCe0y8fw5E7kGsfQ4kiduabeeFF16QevXqJSUlJUlDhw6VPvzwQ+/f/fSnP5Vuvvlmv+P/9re/SUOGDJGSkpKk3r17S8uWLfP7++nTp0s9e/aUkpKSpC5dukijRo2Sdu3aFYm3Eha99wFA0J9evXr5HfPnP/9ZuvLKK6XExESpf//+0ptvvhmBd2Kc2fcgFj8Leu7BzTffrHgPfvrTn/qdM54/ByL3IN4/B88//7x01VVXSampqVJ6ero0ZMgQaenSpVJzc7PfOeP5cyByD2Lxc+CQpO+zNImIiIhsijksREREZHsMWIiIiMj2GLAQERGR7TFgISIiIttjwEJERES2x4CFiIiIbI8BCxEREdkeAxYiIiKyPQYsREREZHsMWIiIiMj2GLAQERGR7TFgISIiItv7/1X7GWnKhFEGAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(df['ellipticity'], df['seeing'] - df['vlt_seeing'])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/tim/conda/envs/mmtwfs/lib/python3.13/site-packages/photutils/isophote/isophote.py:986: TableReplaceWarning: replaced column 'pa' and column attributes ['unit'] changed.\n", + " isotable[v] = isotable[v] * 180.0 / np.pi * u.deg\n", + "/Users/tim/conda/envs/mmtwfs/lib/python3.13/site-packages/photutils/isophote/isophote.py:986: TableReplaceWarning: replaced column 'pa_err' and column attributes ['unit'] changed.\n", + " isotable[v] = isotable[v] * 180.0 / np.pi * u.deg\n" + ] + }, + { + "data": { + "text/html": [ + "
QTable length=12\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
smaintensintens_errellipticityellipticity_errpapa_errgradgrad_errorgrad_rerrorx0x0_erry0y0_errndatanflagniterstop_code
degdeg
float64float64float64float64float64float64float64float64float64float64float64float64float64float64int64int64int64int64
1.6744898834019210.95245881597808870.0040729359018311960.52989742378444850.02873009377671458140.457993590102182.1836053124401653-0.141046463772824370.043418945310294420.307834341598431611.9998637008355380.0425396214204385112.0188820165949060.037810937053836605130100
2.0093878600823050.88862097491273310.0049756382763464550.465950504617978270.024615817812704437148.98040031556242.0384806384719-0.19092792375682860.038149226514967320.199809570880555412.0035667151848870.04184273384670912612.006171243224570.032390758278758626130100
2.4112654320987660.80907324692855720.0046168930913110160.4631515029162810.015620321410826624152.54684235337331.2799361495412125-0.235360072992139870.026673486831460690.1133305513223211.9751818860683430.0321891844706733612.026954819305310.02346841619569022130100
2.8935185185185190.66917311559754240.0045799729769300960.4350416785276280.012184820017558752152.468758053045151.1075238450488463-0.248439840909934370.0253442010916683640.1020134331065534211.9523825382231730.02820969621093870712.0442315086852410.022197437477561525150100
3.47222222222222280.52333623343128240.0050127752912658750.42012362668225530.01272743810911495150.359837826182881.1468707171429242-0.220355198785443430.019643715658178880.0891456873559206111.8564063090515430.0332486160297602112.0968274334875530.027532198807622223170100
4.1666666666666670.361890354233894930.00397232215219571650.392933330645697740.011267748098803945149.188825365130951.0647986558814235-0.165490451768046530.013438824665669560.0812060425365542111.7548857110613520.033845713410960612.1661209214316270.028884278060116838210100
5.00.215371931392220130.0022867364616316410.347684571956728640.009470933154871323147.331130292101530.9758809999791233-0.098590654189121650.0064937328886092660.0658656030028227111.6120082108128670.0320606069822797512.2518337659286760.028442241903847167260200
6.00.111771581774102620.00122060141380733080.28164584158599480.009886668170257198146.28653850831611.1832651204127342-0.045453115780693010.00340691085108226670.0749543962512996811.4761055655975960.03721486275547209612.338723576028720.03396777453260543320100
7.1999999999999990.053764907119833540.0017121246579645050.193800305570498680.02544634711795455146.45729460408664.216346665559592-0.022654318480558610.0037221938439535270.1643039426300916511.3049812527841540.1060910838185383912.432332682650690.10007614759756707410100
8.6399999999999990.0195432736341724230.00183849383769334230.099359138173282670.07218060140991403146.457294604086622.109562071969478-0.0078654655760330460.00283805312900001560.360824556609577111.0393746509884530.334855497730836612.5117317170518070.32596440915487757520100
10.3679999999999990.0110369379904544440.00182769783159932660.099359138173282670.20385740071188907146.457294604086662.0790741487569-0.0022082197094589240.0023008641533189431.041954359642374411.0393746509884531.133155273106374512.5117317170518071.100523668715828962025
12.4415999999999980.0064990893797874680.00178007021700657240.099359138173282670.0809694789446584146.457294604086626.27107480903542-0.00396591337285034750.00148854262301694060.3753341243424860311.0393746509884530.556414852535781712.5117317170518070.541471201030566570545
" + ], + "text/plain": [ + "\n", + " sma intens ... niter stop_code\n", + " ... \n", + " float64 float64 ... int64 int64 \n", + "------------------ -------------------- ... ----- ---------\n", + " 1.674489883401921 0.9524588159780887 ... 10 0\n", + " 2.009387860082305 0.8886209749127331 ... 10 0\n", + " 2.411265432098766 0.8090732469285572 ... 10 0\n", + " 2.893518518518519 0.6691731155975424 ... 10 0\n", + "3.4722222222222228 0.5233362334312824 ... 10 0\n", + " 4.166666666666667 0.36189035423389493 ... 10 0\n", + " 5.0 0.21537193139222013 ... 20 0\n", + " 6.0 0.11177158177410262 ... 10 0\n", + " 7.199999999999999 0.05376490711983354 ... 10 0\n", + " 8.639999999999999 0.019543273634172423 ... 10 0\n", + "10.367999999999999 0.011036937990454444 ... 2 5\n", + "12.441599999999998 0.006499089379787468 ... 4 5" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#spot_deconvolved = fits.open(\"~/deconvolved_spot.fits\")[0].data\n", + "ellipses = Ellipse(spot_deconvolved, geometry=EllipseGeometry(x0=xycen[0], y0=xycen[1], sma=5, eps=0.0, pa=180))\n", + "isolist = ellipses.fit_image(minsma=1.5, step=0.2, fix_center=False, fix_pa=False)\n", + "isolist.to_table()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(isolist)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABVMAAAHDCAYAAAAp9Iq1AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XV8FOcWBuB31uOCJbgU90vRUrS4W3B3d3d3LRR3Dw7FKVoKFCjFpRQvBI8SWZn7x5KBQIBkJ7uTwPv8bm6XZOY7Z2Zlds9+IoiiKIKIiIiIiIiIiIiIPkuldAJERERERERERERESQGLqURERERERERERERxwGIqERERERERERERURywmEpEREREREREREQUByymEhEREREREREREcUBi6lEREREREREREREccBiKhEREREREREREVEcsJhKREREREREREREFAcsphIRERERERERERHFAYupRERERN+oFStWQBCET/4cPXpU2jZjxoxo1aqV9O979+5BEASsWLHio/bu3bvnsGOIjzJlykAQBGTOnBmiKH709+PHj0vH/v5xySXnvIwaNQqCICRYLkRElPh8eD3WaDTw9fVFo0aN8M8//9glZnyuLx++B1A6HyKlaZROgIiIiIiUtXz5cuTIkeOj3+fKlSte7VSrVg2nTp2Cr69vQqWW4Nzc3HD37l0cPnwY5cuXj/G3ZcuWwd3dHcHBwQplR0RE37Lo63FERAROnjyJ8ePH48iRI7hx4wa8vLwSNFa7du1QuXLlBG2T6FvBYioRERHRNy5Pnjz4/vvvZbeTIkUKpEiRIgEysp/06dPDzc0Ny5Yti1FMDQkJwaZNm9C0aVMsXrxYwQyJiOhb9f71uEyZMjCbzRg5ciS2b9+O1q1bJ2istGnTIm3atAnaJtG3gsP8iYiIiChBxDacvUyZMsiTJw9OnDiBYsWKwcnJCWnSpMHw4cNhNptj7D9//nzkz58frq6ucHNzQ44cOTBkyJAY2wQEBKBjx45ImzYtdDodMmXKhNGjR8NkMsU5zzZt2mDr1q0IDAyUfrdhwwYAQKNGjWLd5/fff0f58uXh5uYGZ2dnlChRArt37/5ou9OnT+OHH36AwWBA6tSpMXjwYBiNxljb3LhxI4oXLw4XFxe4urqiUqVKuHDhQpyPg4iIvm7RhdWnT59Kvzt37hxq1qwJb29vGAwG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e/YMJ06cwPLly6FWq7Ft2zakSJECAFCqVClMnToVyZMnR8aMGXHs2DEsXboUnp6eMdrLkycPAGDRokVwc3ODwWBApkyZkCNHDmTJkgWDBg2CKIrw9vbGrl27cPDgQUcfMhEpLPrLFQ200AgsphIRfZPe1hs4XD3uos+VWmuAhsVUigsZxVTo5IX+ZoupZhZTyTHicv3kJDpEdtK6dWsUL14c5cuXR+fOnXHhwgUMHDgQN27cQNmyZaXt1q1bh7Jly2LAgAGoW7cuzp07h4MHD8LDwyNGe5kyZcKsWbNw8eJFlClTBoULF8auXbug1Wqxa9cuZMuWDR07dkTjxo3x7NkzHDp0yNGHTERERERERET0VRPE95cVJyIioiQrODgYHh4eKINa7JlKRPSNMolGHMUOBAUFwd3dXel0koTo6+f3dcexZyrFiUnPYf7xJTdvbTh7ppJ9mYwROLd1WJyun+yZSkRERERERERERBQHLKYSERERERERERERxQGLqURERERERERERERxwGIqERERERERERERURywmEpEREREREREREQUByymEhEREREREREREcUBi6lEREREREREREREcaBROoEPWSwWPH78GG5ubhAEQel0iIhIIaIoIiQkBKlTp4ZKxe/+iIiIiIiISHmJrpj6+PFjpEuXTuk0iIgokXj48CHSpk2rdBpEREREREREia+Y6ubmBsD64dnd3d1ucWp5tLBb25TE2NgDWlCrbQ4pWkSb97WVoLLtOGXlajHbvi9980ww4nfska4LREREREREREpLdMXU6KH97u7udi2magSt3dqmJMbWYqogo5gqKFBMtfE4ZeUqcGg2yfD2occpX4jsR9AkureCDiGaTEqnQEREChJlfkwx62zfN9JL3ntbwWL7vnLyBoCIFLYH14TJO263B7bvrw9y/Odv+rqx0kFEREREREREREQUByymEhEREREREREREcUBi6lEREREREREREREcfBtTpRF37wUaZPDy9cDydN4wz2ZGzxSusPFwwVuni5wcjXA2d0AnZMeBmc9tHot9AYttHot1Bo1NDo1VGo11Bo1VCoBKrUKKpUKggoQhLf/hQCoBAgAILw/5+O73yUUY6QJ//37BEsHr8eZPRcSrmEiIiIiIiIiIoqBxVRK8ob590bRqoWgd4rbbNpf22I2OoMWmXKnx7idAyGK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from photutils.isophote import build_ellipse_model\n", + "model_image = build_ellipse_model(spot_deconvolved.shape, isolist)\n", + "residual = spot_deconvolved - model_image\n", + "\n", + "fig, (ax1, ax2, ax3) = plt.subplots(figsize=(14, 5), nrows=1, ncols=3)\n", + "fig.subplots_adjust(left=0.04, right=0.98, bottom=0.02, top=0.98)\n", + "ax1.imshow(spot_deconvolved, origin='lower')\n", + "ax1.set_title('Data')\n", + "\n", + "smas = np.linspace(1, int(isolist.sma.max()+1))\n", + "for sma in smas:\n", + " iso = isolist.get_closest(sma)\n", + " x, y, = iso.sampled_coordinates()\n", + " ax1.plot(x, y, color='white')\n", + "\n", + "ax2.imshow(model_image, origin='lower')\n", + "ax2.set_title('Ellipse Model')\n", + "\n", + "ax3.imshow(residual, origin='lower')\n", + "ax3.set_title('Residual')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7dunq6++2vBkyaWzs1Pd3d0qKSkJrTkcDl1++eXav3+/wckSU0J8UB5Gz7IsVVZW6tJLL5XX6zU9TlL43e9+p4MHD+rAgQOmR0kqhw8fVm1trSorK3XvvfequblZq1evlsPh0IoVK0yPl7Duuece+f1+XXDBBbLb7QoEAnrwwQf14x//2PRoSaW7u1uSlJWVFbaelZWl999/38RICY0YSTJ33HGH/va3v2nfvn2mR0kKR44c0Zo1a/Tqq6/K6XSaHiepBINBFRYW6qGHHpIkXXLJJXrnnXdUW1tLjJyBuro6bd++Xc8//7wuvPBCtbW1qaKiQjk5ObrxxhtNj5d0bDZb2HPLsoat4fSIkSRy5513ateuXdqzZ49mzpxpepyk0NLSop6eHhUUFITWAoGA9uzZo82bN2twcFB2u93ghInL7XYrLy8vbG3u3Ll68cUXDU2UHO6++26tW7dO1113nSTpG9/4ht5//33V1NQQIzGUnZ0t6dQZErfbHVrv6ekZdrYEp8d7RpKAZVm644479NJLL+kvf/mLPB6P6ZGSxpVXXqm3335bbW1toUdhYaF+8pOfqK2tjRA5AwsWLBh2C/q7776r2bNnG5ooOXz66adKSQn/T7vdbufW3hjzeDzKzs5WU1NTaO3EiRPavXu3iouLDU6WmDgzkgRWrVql559/Xn/4wx+Umpoaupbpcrk0bdo0w9MlttTU1GHvvfnSl76kjIwM3pNzhtauXavi4mI99NBDWrp0qZqbm7V161Zt3brV9GgJraysTA8++KBmzZqlCy+8UK2trdq0aZNuueUW06MlnI8//lj//Oc/Q887OzvV1tam9PR0zZo1SxUVFXrooYd03nnn6bzzztNDDz2k6dOn6/rrrzc4dYKykPAkRXw888wzpkdLSpdffrm1Zs0a02Mkhfr6esvr9VoOh8O64IILrK1bt5oeKeH19fVZa9assWbNmmU5nU7r3HPPtTZs2GANDg6aHi3h/PWvf43439Ybb7zRsizLCgaDVlVVlZWdnW05HA7rsssus95++22zQyco9hkBAABG8Z4RAABgFDECAACMIkYAAIBRxAgAADCKGAEAAEYRIwAAwChiBAAAGEWMAAAAo4gRAABgFDECAACMIkYAAIBRxAgAADDq/wHeyWDM3srgTgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "smi = isolist.sma * (1 - isolist.eps)\n", + "plt.scatter(smi, isolist.intens)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameter('amplitude', value=1.1288978486975225) Parameter('a', value=5.260505328532923)\n" + ] + } + ], + "source": [ + "prof_model = spot_profile(amplitude=1, a=1)\n", + "#prof_model.amplitude.fixed = True\n", + "rad_ang = smi * 0.153\n", + "prof_fit = fitter(prof_model, rad_ang, isolist.intens)\n", + "plt.plot(rad_ang, isolist.intens)\n", + "plt.plot(rad_ang, prof_fit(rad_ang))\n", + "plt.show()\n", + "print(prof_fit.amplitude, prof_fit.a)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(np.float64(0.1596828241257373), np.float64(0.784521145000456))" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wave = 0.6e-6\n", + "refwave = 0.5e-6\n", + "r0 = wave / (3.44/prof_fit.a)**0.6\n", + "seeing_fwhm = 0.976 * wave / r0\n", + "seeing_fwhm = seeing_fwhm * refwave**-0.2 / wave**-0.2\n", + "206265 * r0, seeing_fwhm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mmtwfs", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/spot_fitting.ipynb b/notebooks/spot_fitting.ipynb new file mode 100644 index 00000000..26b0521d --- /dev/null +++ b/notebooks/spot_fitting.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from astropy.io import fits\n", + "from astropy import stats\n", + "from astropy.modeling.models import Gaussian2D, Lorentz2D, Moffat2D\n", + "from astropy.modeling import fitting\n", + "import astropy.units as u\n", + "\n", + "from photutils.aperture import CircularAperture\n", + "\n", + "from mmtwfs.wfs import check_wfsdata, wfsfind" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "#%matplotlib widget" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "bino_file = \"/Volumes/Elements_18TB/wfsdat/20241001/wfs_ff_cal_img_2024.10.01T025918.888.fits\"\n", + "bino_file = \"~/MMT/wfsdat/20250203/wfs_ff_cal_img_2025.02.03T114159.989.fits\"\n", + "bino_file = \"~/MMT/wfsdat/20250203/wfs_ff_cal_img_2025.02.03T123505.342.fits\"\n", + "data = check_wfsdata(bino_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "mean, median, stddev = stats.sigma_clipped_stats(data, sigma=3.0, maxiters=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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GklHjx7Vtm3btHfvXv2tv/W39Morr0j64aTND/SU/pstN/vKmjdS8fjzaHPy5Mn0nmq1qvHx8RX3rCX6JUmiT37yk3rnO9+pgwcPSlqnz+HDh/XAAw9ocXFRQ0ND+uIXv6g77rgjNSpvVLq4fO5zn9OTTz6p73znOyt+e6PLztvf/nb91//6X/WmN71JFy9e1L/4F/9Chw4d0nPPPfdDSZvXlVNzudFX1rwRy2uhzVqj3y/8wi/omWee0aOPPrritzcqfW699VY99dRTun79uj7/+c/rZ37mZ/Twww+nv79R6SJJp0+f1sc//nE9+OCD6uvrW/W+NyqNPvzhD6ff77rrLj3wwAPav3+//uiP/kjveMc7JP1w0eZ1lX682VfWvJGKVyO9Gm0mJyfVbDY1NTW16j2v9/KLv/iL+tM//VN97Wtf044dO9Lrb3T6VKtVHThwQPfdd58+85nP6O6779a/+Tf/5g1PF2kpPXbp0iXde++9KpfLKpfLevjhh/U7v/M7KpfL6RjfyDRiGRwc1F133aWjR4/+UMrP68qprb+yZvWyd+9eTU5OZmjTbDb18MMPp7S59957ValUMvecP39ezz777OuefkmS6Bd+4Rf0hS98QV/96le1d+/ezO9vdPrEkiSJGo3GOl0kve9979Phw4f11FNPpX/33Xef/u7f/bt66qmntG/fvjc8jVgajYZeeOEFbd269YdTfv7Sl578FRcv6f/P//k/J88//3zyiU98IhkcHExOnDjxg+7aX3mZnZ1Nvve97yXf+973EknJb//2byff+9730u0Mv/mbv5mMjo4mX/jCF5LDhw8nf/tv/+3cpbU7duxIvvKVryRPPvlk8mM/9mNrYtnxz//8zyejo6PJ17/+9czS43q9nt7zRqXPr/7qryaPPPJIcvz48eSZZ55Jfu3Xfi0pFovJgw8+mCTJG5cur1a4+jFJ3tg0+qVf+qXk61//evLKK68kf/7nf5585CMfSYaHh1Ob+8NGm9edU0uSJPm3//bfJrt3706q1Wry1re+NV22vdbL1772tUTSir+f+ZmfSZJkaXntpz71qWRycjKp1WrJu9/97uTw4cOZOhYWFpJf+IVfSCYmJpL+/v7kIx/5SHLq1KkfwGj+ckseXSQlf/AHf5De80alz9//+38/1ZdNmzYl73vf+1KHliRvXLq8WolO7Y1MI+87q1QqybZt25K//tf/evLcc8+lv/+w0Wb91TPrZb2sl/WyXtZMeV3Nqa2X9bJe1st6WS+vVtad2npZL+tlvayXNVPWndp6WS/rZb2slzVT1p3aelkv62W9rJc1U9ad2npZL+tlvayXNVPWndp6WS/rZb2slzVT1p3aelkv62W9rJc1U9ad2npZL+tlvayXNVPWndp6WS/rZb2slzVT1p3aelkv62W9rJc1U9ad2npZL+tlvayXNVPWndp6WS/rZb2slzVT/j+LYSN3lCYZWQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "srcs, wfsfind_fig = wfsfind(data, fwhm=6., threshold=4., std=stddev, plot=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "apers = CircularAperture(\n", + " list(zip(srcs['xcentroid'], srcs['ycentroid'])),\n", + " r=12.\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "311859.01\n", + "5.287631784129794 5.974799511281909\n" + ] + } + ], + "source": [ + "masks = apers.to_mask(method='subpixel')\n", + "sigma = 0.0\n", + "snrs = []\n", + "spot = np.zeros(masks[0].shape)\n", + "for m in masks:\n", + " subim = m.cutout(data)\n", + "\n", + " # make co-added spot image for use in calculating the seeing\n", + " if subim.shape == spot.shape:\n", + " spot += subim\n", + "\n", + " signal = subim.sum()\n", + " noise = np.sqrt(stddev**2 * subim.shape[0] * subim.shape[1])\n", + " snr = signal / noise\n", + " snrs.append(snr)\n", + "\n", + "snrs = np.array(snrs)\n", + "fits.writeto(\"spot.fits\", spot, overwrite=True)\n", + "\n", + "back = np.mean([spot[:2, :].mean(), spot[-2:, :].mean(), spot[:, :2].mean(), spot[:, -2:].mean()])\n", + "print(back)\n", + "spot -= back\n", + "g2d = Gaussian2D(amplitude=spot.max(), x_mean=spot.shape[1]/2, y_mean=spot.shape[0]/2)\n", + "l2d = Lorentz2D(amplitude=spot.max(), x_0=spot.shape[1]/2, y_0=spot.shape[0]/2)\n", + "m2d = Moffat2D(amplitude=spot.max(), x_0=spot.shape[1]/2, y_0=spot.shape[0]/2)\n", + "\n", + "model = m2d\n", + "gmodel = g2d\n", + "fitter = fitting.DogBoxLSQFitter()\n", + "y, x = np.mgrid[:spot.shape[0], :spot.shape[1]]\n", + "fit = fitter(model, x, y, spot)\n", + "gfit = fitter(gmodel, x, y, spot)\n", + "\n", + "gsigma = 0.5 * (gfit.x_stddev.value + gfit.y_stddev.value)\n", + "#print(sigma)\n", + "print(fit.fwhm, gsigma * stats.gaussian_sigma_to_fwhm)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 3)\n", + "im1 = ax[0].imshow(spot, origin='lower')\n", + "im2 = ax[1].imshow(spot - fit(x, y), origin='lower')\n", + "im2 = ax[2].imshow(spot - gfit(x, y), origin='lower')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gfit" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "np.float64(2.124444012896353)" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stats.gaussian_fwhm_to_sigma * fit.fwhm" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$-840.90306\\mathrm{{}^{\\circ}}$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(gfit.theta * u.rad).to(u.deg)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mmtwfs", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pyproject.toml b/pyproject.toml index 7e7daea4..43115d69 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,124 @@ -[build-system] +[project] +name = "mmtwfs" +dynamic = ["version"] +authors = [ + { name = "T. E. Pickering", email = "te.pickering@gmail.com"} +] +license = {file = "LICENSE.rst"} +readme = "README.rst" +description = "Wavefront sensing and active optics management tools for the MMT Observatory" +requires-python = ">=3.12" +dependencies = [ + "astropy", + "scipy", + "matplotlib", + "photutils", + "scikit-image", + "lmfit", + "ccdproc", + "astroscrappy", + "dnspython", + "parse", + "pytz", + "coloredlogs", + "poppy@git+https://github.com/spacetelescope/poppy", +] + +[project.optional-dependencies] +test = [ + "tox", + "coverage", + "pytest-astropy", + "black", + "flake8", + "coverage" +] +docs = [ + "sphinx-astropy", +] +extra = [ + "jupyter", + "ipympl", + "pandas", +] + +[project.scripts] +fix_mmtwfs_csvs = "mmtwfs.scripts.fix_csvs:main" +fix_mmirs_exposure_time = "mmtwfs.scripts.fix_mmirs_exposure_time:main" +rename_mmirs_files = "mmtwfs.scripts.rename_mmirs_files:main" +reanalyze = "mmtwfs.scripts.reanalyze:main" + +[project.urls] +Repository = "https://github.com/mmtobservatory/mmtwfs.git" +Documentation = "https://mmtwfs.readthedocs.io/" + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.package-data] +"mmtwfs.data" = ["**"] + +[tool.setuptools.packages] +find = {} -requires = ["setuptools", - "setuptools_scm", - "wheel"] +[tool.setuptools_scm] +version_file = "mmtwfs/version.py" + +[build-system] +requires = [ + "setuptools", + "setuptools_scm", +] build-backend = 'setuptools.build_meta' + +[tool.pytest.ini_options] +minversion = 7.0 +testpaths = [ + "mmtwfs/tests", + "docs", +] +astropy_header = true +doctest_plus = "enabled" +text_file_format = "rst" +addopts = [ + "--color=yes", + "--doctest-rst", +] +xfail_strict = false +filterwarnings = [ + "error", + "ignore:numpy\\.ufunc size changed:RuntimeWarning", + "ignore:numpy\\.ndarray size changed:RuntimeWarning", + # numpy 2 deprecation warnings from astropy.units + "ignore:.*__array__ implementation doesn't accept a copy keyword:DeprecationWarning", +] + +[tool.coverage] + + [tool.coverage.run] + omit = [ + "mmtwfs/conftest.py", + "mmtwfs/tests/*", + "mmtwfs/version*", + "*/mmtwfs/conftest.py", + "*/mmtwfs/tests/*", + "*/mmtwfs/version*", + ] + + [tool.coverage.report] + exclude_lines = [ + # Have to re-enable the standard pragma + "pragma: no cover", + # Don't complain about packages we have installed + "except ImportError", + # Don't complain if tests don't hit defensive assertion code: + "raise AssertionError", + "raise NotImplementedError", + # Don't complain about script hooks + "'def main(.*):'", + # Ignore branches that don't pertain to this version of Python + "pragma: py{ignore_python_version}", + # Don't complain about IPython completion helper + "def _ipython_key_completions_", + ] diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index ec032095..00000000 --- a/setup.cfg +++ /dev/null @@ -1,108 +0,0 @@ -[metadata] -name = mmtwfs -description = Wavefront sensing and active optics management tools for the MMT Observatory -long_description = file: README.rst -author = T. E. Pickering (MMT Observatory) -author_email = te.pickering@gmail.com -license = BSD-3 -url = https://github.com/MMTObservatory/mmtwfs -edit_on_github = True -github_project = MMTObservatory/mmtwfs - -[options] -zip_safe = False -packages = find: -python_requires = >=3.8 -setup_requires = setuptools_scm -install_requires = - astropy - matplotlib - photutils - scikit-image - poppy - lmfit - ccdproc - astroscrappy - dnspython - parse - pytz - coloredlogs - -include_package_data = True - -[options.extras_require] -docs = - sphinx-astropy -test = - tox - pytest - pytest-cov - pytest-astropy - nose - coverage - codecov -extra = - jupyter - -[options.entry_points] -console_scripts = - fix_mmtwfs_csvs = mmtwfs.scripts.fix_csvs:main - fix_mmirs_exposure_time = mmtwfs.scripts.fix_mmirs_exposure_time:main - rename_mmirs_files = mmtwfs.scripts.rename_mmirs_files:main - reanalyze = mmtwfs.scripts.reanalyze:main - -[build_sphinx] -source-dir = docs -build-dir = docs/_build -all_files = 1 - -[build_docs] -source-dir = docs -build-dir = docs/_build -all_files = 1 - -[upload_docs] -upload-dir = docs/_build/html -show-response = 1 - -[tool:pytest] -testpaths = "mmtwfs" "docs" -astropy_header = true -doctest_plus = enabled -text_file_format = rst -addopts = --doctest-rst - -[coverage:run] -parallel = True -branch = True -omit = - mmtwfs/_astropy_init* - mmtwfs/conftest.py - mmtwfs/*setup_package* - mmtwfs/tests/* - mmtwfs/*/tests/* - mmtwfs/extern/* - mmtwfs/version* - */mmtwfs/_astropy_init* - */mmtwfs/conftest.py - */mmtwfs/*setup_package* - */mmtwfs/tests/* - */mmtwfs/*/tests/* - */mmtwfs/extern/* - */mmtwfs/version* - -[coverage:report] -exclude_lines = - # Have to re-enable the standard pragma - pragma: no cover - # Don't complain about packages we have installed - except ImportError - # Don't complain if tests don't hit assertions - raise AssertionError - raise NotImplementedError - # Don't complain about script hooks - def main\(.*\): - # Ignore branches that don't pertain to this version of Python - pragma: py{ignore_python_version} - # Don't complain about IPython completion helper - def _ipython_key_completions_ diff --git a/setup.py b/setup.py deleted file mode 100755 index 74ba6847..00000000 --- a/setup.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python -# Licensed under a 3-clause BSD style license - see LICENSE.rst - -# NOTE: The configuration for the package, including the name, version, and -# other information are set in the setup.cfg file. - -import os -import sys - -from setuptools import setup -from setuptools.config import read_configuration - - -# First provide helpful messages if contributors try and run legacy commands -# for tests or docs. - -TEST_HELP = """ -Note: running tests is no longer done using 'python setup.py test'. Instead -you will need to run: - - tox -e test - -If you don't already have tox installed, you can install it with: - - pip install tox - -If you only want to run part of the test suite, you can also use pytest -directly with:: - - pip install -e .[test] - pytest - -For more information, see: - - http://docs.astropy.org/en/latest/development/testguide.html#running-tests -""" - -if 'test' in sys.argv: - print(TEST_HELP) - sys.exit(1) - -DOCS_HELP = """ -Note: building the documentation is no longer done using -'python setup.py build_docs'. Instead you will need to run: - - tox -e build_docs - -If you don't already have tox installed, you can install it with: - - pip install tox - -You can also build the documentation with Sphinx directly using:: - - pip install -e .[docs] - cd docs - make html - -For more information, see: - - http://docs.astropy.org/en/latest/install.html#builddocs -""" - -if 'build_docs' in sys.argv or 'build_sphinx' in sys.argv: - print(DOCS_HELP) - sys.exit(1) - -VERSION_TEMPLATE = """ -# Note that we need to fall back to the hard-coded version if either -# setuptools_scm can't be imported or setuptools_scm can't determine the -# version, so we catch the generic 'Exception'. -try: - from setuptools_scm import get_version - version = get_version(root='..', relative_to=__file__) -except Exception: - version = '{version}' -""".lstrip() - - -setup(use_scm_version={'write_to': os.path.join('mmtwfs', 'version.py'), - 'write_to_template': VERSION_TEMPLATE}) - diff --git a/tox.ini b/tox.ini index a74aab76..a7f2ea5a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,8 +1,7 @@ [tox] envlist = - py{38,39,310}{,-alldeps}{,-cov} - py{38,39}-astropylts - py{38,39,310}-{numpy,astropy}dev + py{312,313}{,-alldeps}{,-cov} + py{312,313}-{numpy,astropy}dev build_docs linkcheck codestyle @@ -13,10 +12,10 @@ requires = isolated_build = true [testenv] -usedevelop = True +usedevelop = False # Pass through the following environemnt variables which may be needed for the CI -passenv = HOME WINDIR LC_ALL LC_CTYPE CC CI +passenv = HOME,WINDIR,LC_ALL,LC_CTYPE,CC,CI # Run the tests in a temporary directory to make sure that we don't import # astropy from the source tree @@ -34,12 +33,10 @@ description = run tests cov: with coverage enabled alldeps: with all optional dependencies - astropylts: with astropy LTS {numpy,astropy}dev: with latest master from github repo cov_report: generate HTML coverage report deps = - astropylts: astropy==5.0.* numpydev: git+https://github.com/numpy/numpy.git#egg=numpy astropydev: git+https://github.com/astropy/astropy.git#egg=astropy @@ -55,7 +52,7 @@ extras = commands = pip freeze !cov: pytest --pyargs mmtwfs {toxinidir}/docs {posargs} - cov: pytest --pyargs mmtwfs {toxinidir}/docs --cov mmtwfs --cov-config={toxinidir}/setup.cfg {posargs} + cov: pytest --pyargs mmtwfs {toxinidir}/docs --cov mmtwfs --cov-config={toxinidir}/pyproject.toml {posargs} cov: coverage xml -o {toxinidir}/coverage.xml [testenv:build_docs]