diff --git a/.gitignore b/.gitignore index 894a44c..a8b27b0 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,5 @@ venv.bak/ # mypy .mypy_cache/ + +sandbox/ diff --git a/README.md b/docs/README.md similarity index 91% rename from README.md rename to docs/README.md index 7b7d39f..bccf051 100644 --- a/README.md +++ b/docs/README.md @@ -1,3 +1,28 @@ +# This branch contains a vectorized version of `tess-point`! + +This is an attempt to 1) make this tool faster by using Python niceties 2) make the API for this tool easier for Python users. Making the tool faster also means we can do calculations on the fly for updating interactive plots. + +This is a work in progress! Lots of documentation is missing. + +You probably won't be able to install this branch as it is, because the package structure is broken. + +![speed](speed.png) +![overlay](overlay.png) + +## Missing Functions +* star_in_fov +* optics_fp +* make_az_asym +* mm_to_pix +* radec2pix + +## Usage + +```python +TESSPoint(1, 1, 1).pix2radec(coords) +``` +Where coords is an N x 2 array of pixel coordinates. You can get pixel coordinates for the edge easily using the `footprint` function. + # TESS-Point High Precision TESS pointing tool. @@ -89,7 +114,7 @@ Burke, C. J., Levine, A., Fausnaugh, M., Vanderspek, R., Barclay, T., Libby-Robe - numpy ### SPECIAL THANKS TO: -Includes code from the python MAST query examples +Includes code from the python MAST query examples https://mast.stsci.edu/api/v0/pyex.html ### IMPLEMENTATION DETAILS: @@ -118,4 +143,4 @@ eprint = {2003.001}, adsurl = {http://adsabs.harvard.edu/abs/2020ascl.soft03001B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } -``` \ No newline at end of file +``` diff --git a/docs/overlay.png b/docs/overlay.png new file mode 100644 index 0000000..2a813fd Binary files /dev/null and b/docs/overlay.png differ diff --git a/docs/speed.png b/docs/speed.png new file mode 100644 index 0000000..b60c45a Binary files /dev/null and b/docs/speed.png differ diff --git a/example_use_tess_stars2py_byfunction.py b/example_use_tess_stars2py_byfunction.py deleted file mode 100644 index 9fd06d0..0000000 --- a/example_use_tess_stars2py_byfunction.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Sun Jan 6 09:14:04 2019 - -@author: cjburke -""" - -import numpy as np -from tess_stars2px import tess_stars2px_function_entry - -if __name__ == '__main__': - # This is an example of using tess_stars2px functionality - # from a program rather than the typical command line interface - # the function example only takes ra and dec [deg] - # Your program should provide these - # The other ways of getting coordinates 'TIC MAST query' 'By name' 'file list' - # are not supported in the wrapper function. Just ra and decs - # Location for pi mensae - ra = 84.291188 - dec = -80.469119 - ticid = 261136679 # code doesn't actually use ticid, so this can be - # any integer you like. It is included just for convenience of - # keeping track of target in the output because - # for a given target it is not known ahead of time how many - # output entries a target will have. Thus the user - # should make sure to match the output ticid (outID) - # with the ticid they are using - outID, outEclipLong, outEclipLat, outSec, outCam, outCcd, \ - outColPix, outRowPix, scinfo = tess_stars2px_function_entry( - ticid, ra, dec) - for i in range(len(outID)): - print('{0:d} {1:d} {2:d} {3:d} {4:f} {5:f}'.format(outID[i], outSec[i], \ - outCam[i], outCcd[i], outColPix[i], outRowPix[i])) - - # For efficiency purposes if you save scinfo between calls - # you will save time in setting up the the telescope fields - outID, outEclipLong, outEclipLat, outSec, outCam, outCcd, \ - outColPix, outRowPix, scinfo = tess_stars2px_function_entry( - ticid, ra, dec, scInfo=scinfo) - print('Faster to re-use scinfo in repeated calls') - for i in range(len(outID)): - print('{0:d} {1:d} {2:d} {3:d} {4:f} {5:f}'.format(outID[i], outSec[i], \ - outCam[i], outCcd[i], outColPix[i], outRowPix[i])) - - print('Also accepts multiple targets') - ra = np.array([219.90085,10.897379], dtype=np.float) - dec = np.array([-60.835619,-17.986606], dtype=np.float) - ticid = np.array([0,1], dtype=np.int) - outID, outEclipLong, outEclipLat, outSec, outCam, outCcd, \ - outColPix, outRowPix, scinfo = tess_stars2px_function_entry( - ticid, ra, dec, scInfo=scinfo) - for i in range(len(outID)): - print('{0:d} {1:d} {2:d} {3:d} {4:f} {5:f}'.format(outID[i], outSec[i], \ - outCam[i], outCcd[i], outColPix[i], outRowPix[i])) diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..289ab04 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1750 @@ +[[package]] +name = "anyio" +version = "3.6.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["packaging", "sphinx-rtd-theme", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "contextlib2", "uvloop (<0.15)", "mock (>=4)", "uvloop (>=0.15)"] +trio = ["trio (>=0.16)"] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "argon2-cffi" +version = "21.3.0" +description = "The secure Argon2 password hashing algorithm." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["pre-commit", "cogapp", "tomli", "coverage[toml] (>=5.0.2)", "hypothesis", "pytest", "sphinx", "sphinx-notfound-page", "furo"] +docs = ["sphinx", "sphinx-notfound-page", "furo"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["pytest", "cogapp", "pre-commit", "wheel"] +tests = ["pytest"] + +[[package]] +name = "asttokens" +version = "2.0.5" +description = "Annotate AST trees with source code positions" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.4.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "babel" +version = "2.10.3" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "beautifulsoup4" +version = "4.11.1" +description = "Screen-scraping library" +category = "dev" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "5.0.1" +description = "An easy safelist-based HTML-sanitizing tool." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.2)"] +dev = ["build (==0.8.0)", "flake8 (==4.0.1)", "hashin (==0.17.0)", "pip-tools (==6.6.2)", "pytest (==7.1.2)", "Sphinx (==4.3.2)", "tox (==3.25.0)", "twine (==4.0.1)", "wheel (==0.37.1)", "black (==22.3.0)", "mypy (==0.961)"] + +[[package]] +name = "certifi" +version = "2022.6.15" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.0" +description = "Foreign Function Interface for Python calling C code." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "debugpy" +version = "1.6.0" +description = "An implementation of the Debug Adapter Protocol for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "executing" +version = "0.8.3" +description = "Get the currently executing AST node of a frame, and other information" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "fastjsonschema" +version = "2.15.3" +description = "Fastest Python implementation of JSON schema" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +devel = ["colorama", "jsonschema", "json-spec", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "importlib-metadata" +version = "4.12.0" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] + +[[package]] +name = "importlib-resources" +version = "5.8.0" +description = "Read resources from Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "ipykernel" +version = "6.15.0" +description = "IPython Kernel for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +debugpy = ">=1.0" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=17" +tornado = ">=6.1" +traitlets = ">=5.1.0" + +[package.extras] +test = ["flaky", "ipyparallel", "pre-commit", "pytest-cov", "pytest-timeout", "pytest (>=6.0)"] + +[[package]] +name = "ipython" +version = "8.4.0" +description = "IPython: Productive Interactive Computing" +category = "dev" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" + +[package.extras] +all = ["black", "Sphinx (>=1.3)", "ipykernel", "nbconvert", "nbformat", "ipywidgets", "notebook", "ipyparallel", "qtconsole", "pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "numpy (>=1.19)", "pandas", "trio"] +black = ["black"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test_extra = ["pytest (<7.1)", "pytest-asyncio", "testpath", "curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.19)", "pandas", "trio"] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "jedi" +version = "0.18.1" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.9.8" +description = "A Python implementation of the JSON5 data format." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonschema" +version = "4.6.1" +description = "An implementation of JSON Schema validation for Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=17.4.0" +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jupyter-client" +version = "7.3.4" +description = "Jupyter protocol implementation and client libraries" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +entrypoints = "*" +jupyter-core = ">=4.9.2" +nest-asyncio = ">=1.5.4" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.0" +traitlets = "*" + +[package.extras] +doc = ["ipykernel", "myst-parser", "sphinx-rtd-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt"] +test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-commit", "pytest", "pytest-asyncio (>=0.18)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "4.10.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = "*" + +[package.extras] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-server" +version = "1.18.0" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +anyio = ">=3.1.0,<4" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.7.0" +nbconvert = ">=6.4.4" +nbformat = ">=5.2.0" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=17" +Send2Trash = "*" +terminado = ">=0.8.3" +tornado = ">=6.1.0" +traitlets = ">=5.1" +websocket-client = "*" + +[package.extras] +test = ["coverage", "ipykernel", "pre-commit", "pytest-console-scripts", "pytest-cov", "pytest-mock", "pytest-timeout", "pytest-tornasync", "pytest (>=6.0)", "requests"] + +[[package]] +name = "jupyterlab" +version = "3.4.3" +description = "JupyterLab computational environment" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ipython = "*" +jinja2 = ">=2.1" +jupyter-core = "*" +jupyter-server = ">=1.16,<2.0" +jupyterlab-server = ">=2.10,<3.0" +nbclassic = ">=0.2,<1.0" +packaging = "*" +tornado = ">=6.1.0" + +[package.extras] +test = ["check-manifest", "coverage", "jupyterlab-server", "pytest (>=6.0)", "pytest-cov", "pytest-console-scripts", "pytest-check-links (>=0.5)", "requests", "requests-cache", "virtualenv", "pre-commit"] +ui-tests = ["build"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.2.2" +description = "Pygments theme using JupyterLab CSS variables" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jupyterlab-server" +version = "2.14.0" +description = "A set of server components for JupyterLab and JupyterLab like applications." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +babel = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = "*" +jsonschema = ">=3.0.1" +jupyter-server = ">=1.8,<2" +packaging = "*" +requests = "*" + +[package.extras] +openapi = ["openapi-core (>=0.14.2)", "ruamel-yaml"] +test = ["codecov", "ipykernel", "jupyter-server", "openapi-core (>=0.14.2)", "openapi-spec-validator (<0.5)", "pytest-console-scripts", "pytest-cov", "pytest (>=5.3.2)", "ruamel-yaml", "strict-rfc3339"] + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "matplotlib-inline" +version = "0.1.3" +description = "Inline Matplotlib backend for Jupyter" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mistune" +version = "0.8.4" +description = "The fastest markdown parser in pure Python" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "nbclassic" +version = "0.3.7" +description = "Jupyter Notebook as a Jupyter Server extension." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8" +notebook = "<7" +notebook-shim = ">=0.1.0" + +[package.extras] +test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] + +[[package]] +name = "nbclient" +version = "0.6.4" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +jupyter-client = ">=6.1.5" +nbformat = ">=5.0" +nest-asyncio = "*" +traitlets = ">=5.2.2" + +[package.extras] +sphinx = ["autodoc-traits", "mock", "moto", "myst-parser", "Sphinx (>=1.7)", "sphinx-book-theme"] +test = ["black", "check-manifest", "flake8", "ipykernel", "ipython (<8.0.0)", "ipywidgets (<8.0.0)", "mypy", "pip (>=18.1)", "pre-commit", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=60.0)", "testpath", "twine (>=1.11.0)", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "6.5.0" +description = "Converting Jupyter Notebooks" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +MarkupSafe = ">=2.0" +mistune = ">=0.8.1,<2" +nbclient = ">=0.5.0" +nbformat = ">=5.1" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.0" + +[package.extras] +all = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)", "tornado (>=6.1)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "ipython"] +serve = ["tornado (>=6.1)"] +test = ["pytest", "pytest-cov", "pytest-dependency", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pyppeteer (>=1,<1.1)"] +webpdf = ["pyppeteer (>=1,<1.1)"] + +[[package]] +name = "nbformat" +version = "5.4.0" +description = "The Jupyter Notebook format" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +test = ["check-manifest", "testpath", "pytest", "pre-commit"] + +[[package]] +name = "nest-asyncio" +version = "1.5.5" +description = "Patch asyncio to allow nested event loops" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "notebook" +version = "6.4.12" +description = "A web-based notebook environment for interactive computing" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +argon2-cffi = "*" +ipykernel = "*" +ipython-genutils = "*" +jinja2 = "*" +jupyter-client = ">=5.3.4" +jupyter-core = ">=4.6.1" +nbconvert = ">=5" +nbformat = "*" +nest-asyncio = ">=1.5" +prometheus-client = "*" +pyzmq = ">=17" +Send2Trash = ">=1.8.0" +terminado = ">=0.8.3" +tornado = ">=6.1" +traitlets = ">=4.2.1" + +[package.extras] +docs = ["sphinx", "nbsphinx", "sphinxcontrib-github-alt", "sphinx-rtd-theme", "myst-parser"] +json-logging = ["json-logging"] +test = ["pytest", "coverage", "requests", "testpath", "nbval", "selenium", "pytest-cov", "requests-unixsocket"] + +[[package]] +name = "notebook-shim" +version = "0.1.0" +description = "A shim layer for notebook traits and config" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jupyter-server = ">=1.8,<2.0" + +[package.extras] +test = ["pytest", "pytest-tornasync", "pytest-console-scripts"] + +[[package]] +name = "numpy" +version = "1.23.0" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.8" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.14.1" +description = "Python client for the Prometheus monitoring system." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.30" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.1" +description = "Cross-platform lib for process and system monitoring in Python." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "dev" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyrsistent" +version = "0.18.1" +description = "Persistent/Functional/Immutable data structures" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pytest" +version = "7.1.2" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2022.1" +description = "World timezone definitions, modern and historical" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32" +version = "304" +description = "Python for Window Extensions" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "pywinpty" +version = "2.0.5" +description = "Pseudo terminal support for Windows from Python." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pyzmq" +version = "23.2.0" +description = "Python bindings for 0MQ" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "send2trash" +version = "1.8.0" +description = "Send file to trash natively under Mac OS X, Windows and Linux." +category = "dev" +optional = false +python-versions = "*" + +[package.extras] +nativelib = ["pyobjc-framework-cocoa", "pywin32"] +objc = ["pyobjc-framework-cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sniffio" +version = "1.2.0" +description = "Sniff out which async library your code is running under" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "stack-data" +version = "0.3.0" +description = "Extract data from python stack frames and tracebacks for informative displays" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +asttokens = "*" +executing = "*" +pure-eval = "*" + +[package.extras] +tests = ["pytest", "typeguard", "pygments", "littleutils", "cython"] + +[[package]] +name = "terminado" +version = "0.15.0" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +test = ["pre-commit", "pytest-timeout", "pytest (>=6.0)"] + +[[package]] +name = "tinycss2" +version = "1.1.1" +description = "A tiny CSS parser" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov", "pytest-flake8", "pytest-isort", "coverage"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tornado" +version = "6.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" +optional = false +python-versions = ">= 3.5" + +[[package]] +name = "traitlets" +version = "5.3.0" +description = "" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pre-commit", "pytest"] + +[[package]] +name = "urllib3" +version = "1.26.9" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "websocket-client" +version = "1.3.3" +description = "WebSocket client for Python with low level API options" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "zipp" +version = "3.8.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.8" +content-hash = "2d4e5ca903789932a7434d41053dd4904b814c722c3598aece22dd4d5837b072" + +[metadata.files] +anyio = [ + {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"}, + {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"}, +] +appnope = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] +argon2-cffi = [ + {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, + {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, +] +argon2-cffi-bindings = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] +asttokens = [ + {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, + {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, + {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, +] +babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, +] +backcall = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, + {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, +] +bleach = [ + {file = "bleach-5.0.1-py3-none-any.whl", hash = "sha256:085f7f33c15bd408dd9b17a4ad77c577db66d76203e5984b1bd59baeee948b2a"}, + {file = "bleach-5.0.1.tar.gz", hash = "sha256:0d03255c47eb9bd2f26aa9bb7f2107732e7e8fe195ca2f64709fcf3b0a4a085c"}, +] +certifi = [ + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, +] +cffi = [ + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +debugpy = [ + {file = "debugpy-1.6.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:eb1946efac0c0c3d411cea0b5ac772fbde744109fd9520fb0c5a51979faf05ad"}, + {file = "debugpy-1.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e3513399177dd37af4c1332df52da5da1d0c387e5927dc4c0709e26ee7302e8f"}, + {file = "debugpy-1.6.0-cp310-cp310-win32.whl", hash = "sha256:5c492235d6b68f879df3bdbdb01f25c15be15682665517c2c7d0420e5658d71f"}, + {file = "debugpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:40de9ba137d355538432209d05e0f5fe5d0498dce761c39119ad4b950b51db31"}, + {file = "debugpy-1.6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:0d383b91efee57dbb923ba20801130cf60450a0eda60bce25bccd937de8e323a"}, + {file = "debugpy-1.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1ff853e60e77e1c16f85a31adb8360bb2d98ca588d7ed645b7f0985b240bdb5e"}, + {file = "debugpy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:8e972c717d95f56b6a3a7a29a5ede1ee8f2c3802f6f0e678203b0778eb322bf1"}, + {file = "debugpy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a8aaeb53e87225141fda7b9081bd87155c1debc13e2f5a532d341112d1983b65"}, + {file = "debugpy-1.6.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:132defb585b518955358321d0f42f6aa815aa15b432be27db654807707c70b2f"}, + {file = "debugpy-1.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ee75844242b4537beb5899f3e60a578454d1f136b99e8d57ac424573797b94a"}, + {file = "debugpy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:a65a2499761d47df3e9ea9567109be6e73d412e00ac3ffcf74839f3ddfcdf028"}, + {file = "debugpy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:bd980d533d0ddfc451e03a3bb32acb2900049fec39afc3425b944ebf0889be62"}, + {file = "debugpy-1.6.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:245c7789a012f86210847ec7ee9f38c30a30d4c2223c3e111829a76c9006a5d0"}, + {file = "debugpy-1.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0e3aa2368883e83e7b689ddff3cafb595f7b711f6a065886b46a96a7fef874e7"}, + {file = "debugpy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:72bcfa97f3afa0064afc77ab811f48ad4a06ac330f290b675082c24437730366"}, + {file = "debugpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30abefefd2ff5a5481162d613cb70e60e2fa80a5eb4c994717c0f008ed25d2e1"}, + {file = "debugpy-1.6.0-py2.py3-none-any.whl", hash = "sha256:4de7777842da7e08652f2776c552070bbdd758557fdec73a15d7be0e4aab95ce"}, + {file = "debugpy-1.6.0.zip", hash = "sha256:7b79c40852991f7b6c3ea65845ed0f5f6b731c37f4f9ad9c61e2ab4bd48a9275"}, +] +decorator = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] +defusedxml = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] +entrypoints = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] +executing = [ + {file = "executing-0.8.3-py2.py3-none-any.whl", hash = "sha256:d1eef132db1b83649a3905ca6dd8897f71ac6f8cac79a7e58a1a09cf137546c9"}, + {file = "executing-0.8.3.tar.gz", hash = "sha256:c6554e21c6b060590a6d3be4b82fb78f8f0194d809de5ea7df1c093763311501"}, +] +fastjsonschema = [ + {file = "fastjsonschema-2.15.3-py3-none-any.whl", hash = "sha256:ddb0b1d8243e6e3abb822bd14e447a89f4ab7439342912d590444831fa00b6a0"}, + {file = "fastjsonschema-2.15.3.tar.gz", hash = "sha256:0a572f0836962d844c1fc435e200b2e4f4677e4e6611a2e3bdd01ba697c275ec"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.12.0-py3-none-any.whl", hash = "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"}, + {file = "importlib_metadata-4.12.0.tar.gz", hash = "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670"}, +] +importlib-resources = [ + {file = "importlib_resources-5.8.0-py3-none-any.whl", hash = "sha256:7952325ffd516c05a8ad0858c74dff2c3343f136fe66a6002b2623dd1d43f223"}, + {file = "importlib_resources-5.8.0.tar.gz", hash = "sha256:568c9f16cb204f9decc8d6d24a572eeea27dacbb4cee9e6b03a8025736769751"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +ipykernel = [ + {file = "ipykernel-6.15.0-py3-none-any.whl", hash = "sha256:b9ed519a29eb819eb82e87e0d3754088237b233e5c647b8bb0ff23c8c70ed16f"}, + {file = "ipykernel-6.15.0.tar.gz", hash = "sha256:b59f9d9672c3a483494bb75915a2b315e78b833a38b039b1ee36dc28683f0d89"}, +] +ipython = [ + {file = "ipython-8.4.0-py3-none-any.whl", hash = "sha256:7ca74052a38fa25fe9bedf52da0be7d3fdd2fb027c3b778ea78dfe8c212937d1"}, + {file = "ipython-8.4.0.tar.gz", hash = "sha256:f2db3a10254241d9b447232cec8b424847f338d9d36f9a577a6192c332a46abd"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +jedi = [ + {file = "jedi-0.18.1-py2.py3-none-any.whl", hash = "sha256:637c9635fcf47945ceb91cd7f320234a7be540ded6f3e99a50cb6febdfd1ba8d"}, + {file = "jedi-0.18.1.tar.gz", hash = "sha256:74137626a64a99c8eb6ae5832d99b3bdd7d29a3850fe2aa80a4126b2a7d949ab"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +json5 = [ + {file = "json5-0.9.8.tar.gz", hash = "sha256:0fa6e4d3ef062f93ba9cf2a9103fe8e68c7917dfa33519ae3ac8c7e48e3c84ff"}, +] +jsonschema = [ + {file = "jsonschema-4.6.1-py3-none-any.whl", hash = "sha256:5eb781753403847fb320f05e9ab2191725b58c5e7f97f1bed63285ca423159bc"}, + {file = "jsonschema-4.6.1.tar.gz", hash = "sha256:ec2802e6a37517f09d47d9ba107947589ae1d25ff557b925d83a321fc2aa5d3b"}, +] +jupyter-client = [ + {file = "jupyter_client-7.3.4-py3-none-any.whl", hash = "sha256:17d74b0d0a7b24f1c8c527b24fcf4607c56bee542ffe8e3418e50b21e514b621"}, + {file = "jupyter_client-7.3.4.tar.gz", hash = "sha256:aa9a6c32054b290374f95f73bb0cae91455c58dfb84f65c8591912b8f65e6d56"}, +] +jupyter-core = [ + {file = "jupyter_core-4.10.0-py3-none-any.whl", hash = "sha256:e7f5212177af7ab34179690140f188aa9bf3d322d8155ed972cbded19f55b6f3"}, + {file = "jupyter_core-4.10.0.tar.gz", hash = "sha256:a6de44b16b7b31d7271130c71a6792c4040f077011961138afed5e5e73181aec"}, +] +jupyter-server = [ + {file = "jupyter_server-1.18.0-py3-none-any.whl", hash = "sha256:06103b71740eaa80aac1b3918da1b22125d3d649386c91fa236de753934bd6c8"}, + {file = "jupyter_server-1.18.0.tar.gz", hash = "sha256:b65ea1d24038dc32c80b916c89005ae8d1d70f6ede0d314230e93b329b7e845a"}, +] +jupyterlab = [ + {file = "jupyterlab-3.4.3-py3-none-any.whl", hash = "sha256:f028f4c6a4171785c4a1d592ca9bf36812047703e4aa981482cd3872eb0fc169"}, + {file = "jupyterlab-3.4.3.tar.gz", hash = "sha256:e2dcc40e94366dde5de4b19e8c43ee133cf041b852d01a3625a7cf29532da49d"}, +] +jupyterlab-pygments = [ + {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, + {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, +] +jupyterlab-server = [ + {file = "jupyterlab_server-2.14.0-py3-none-any.whl", hash = "sha256:ea72e8cf36824a99af08c93202aa2d4d0deb069445335e190586d1dc7c9a4b6c"}, + {file = "jupyterlab_server-2.14.0.tar.gz", hash = "sha256:b04eaf68fe1ef96f70dd38b256417abe0b6ba1a07dd8ca0c97da5b0ebade57ec"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +matplotlib-inline = [ + {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, + {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +nbclassic = [ + {file = "nbclassic-0.3.7-py3-none-any.whl", hash = "sha256:89184baa2d66b8ac3c8d3df57cbcf16f34148954d410a2fb3e897d7c18f2479d"}, + {file = "nbclassic-0.3.7.tar.gz", hash = "sha256:36dbaa88ffaf5dc05d149deb97504b86ba648f4a80a60b8a58ac94acab2daeb5"}, +] +nbclient = [ + {file = "nbclient-0.6.4-py3-none-any.whl", hash = "sha256:f251bba200a2b401a061dfd700a7a70b5772f664fb49d4a2d3e5536ec0e98c76"}, + {file = "nbclient-0.6.4.tar.gz", hash = "sha256:cdef7757cead1735d2c70cc66095b072dced8a1e6d1c7639ef90cd3e04a11f2e"}, +] +nbconvert = [ + {file = "nbconvert-6.5.0-py3-none-any.whl", hash = "sha256:c56dd0b8978a1811a5654f74c727ff16ca87dd5a43abd435a1c49b840fcd8360"}, + {file = "nbconvert-6.5.0.tar.gz", hash = "sha256:223e46e27abe8596b8aed54301fadbba433b7ffea8196a68fd7b1ff509eee99d"}, +] +nbformat = [ + {file = "nbformat-5.4.0-py3-none-any.whl", hash = "sha256:0d6072aaec95dddc39735c144ee8bbc6589c383fb462e4058abc855348152dad"}, + {file = "nbformat-5.4.0.tar.gz", hash = "sha256:44ba5ca6acb80c5d5a500f1e5b83ede8cbe364d5a495c4c8cf60aaf1ba656501"}, +] +nest-asyncio = [ + {file = "nest_asyncio-1.5.5-py3-none-any.whl", hash = "sha256:b98e3ec1b246135e4642eceffa5a6c23a3ab12c82ff816a92c612d68205813b2"}, + {file = "nest_asyncio-1.5.5.tar.gz", hash = "sha256:e442291cd942698be619823a17a86a5759eabe1f8613084790de189fe9e16d65"}, +] +notebook = [ + {file = "notebook-6.4.12-py3-none-any.whl", hash = "sha256:8c07a3bb7640e371f8a609bdbb2366a1976c6a2589da8ef917f761a61e3ad8b1"}, + {file = "notebook-6.4.12.tar.gz", hash = "sha256:6268c9ec9048cff7a45405c990c29ac9ca40b0bc3ec29263d218c5e01f2b4e86"}, +] +notebook-shim = [ + {file = "notebook_shim-0.1.0-py3-none-any.whl", hash = "sha256:02432d55a01139ac16e2100888aa2b56c614720cec73a27e71f40a5387e45324"}, + {file = "notebook_shim-0.1.0.tar.gz", hash = "sha256:7897e47a36d92248925a2143e3596f19c60597708f7bef50d81fcd31d7263e85"}, +] +numpy = [ + {file = "numpy-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58bfd40eb478f54ff7a5710dd61c8097e169bc36cc68333d00a9bcd8def53b38"}, + {file = "numpy-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:196cd074c3f97c4121601790955f915187736f9cf458d3ee1f1b46aff2b1ade0"}, + {file = "numpy-1.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1d88ef79e0a7fa631bb2c3dda1ea46b32b1fe614e10fedd611d3d5398447f2f"}, + {file = "numpy-1.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d54b3b828d618a19779a84c3ad952e96e2c2311b16384e973e671aa5be1f6187"}, + {file = "numpy-1.23.0-cp310-cp310-win32.whl", hash = "sha256:2b2da66582f3a69c8ce25ed7921dcd8010d05e59ac8d89d126a299be60421171"}, + {file = "numpy-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:97a76604d9b0e79f59baeca16593c711fddb44936e40310f78bfef79ee9a835f"}, + {file = "numpy-1.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8cc87bed09de55477dba9da370c1679bd534df9baa171dd01accbb09687dac3"}, + {file = "numpy-1.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f0f18804df7370571fb65db9b98bf1378172bd4e962482b857e612d1fec0f53e"}, + {file = "numpy-1.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac86f407873b952679f5f9e6c0612687e51547af0e14ddea1eedfcb22466babd"}, + {file = "numpy-1.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae8adff4172692ce56233db04b7ce5792186f179c415c37d539c25de7298d25d"}, + {file = "numpy-1.23.0-cp38-cp38-win32.whl", hash = "sha256:fe8b9683eb26d2c4d5db32cd29b38fdcf8381324ab48313b5b69088e0e355379"}, + {file = "numpy-1.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:5043bcd71fcc458dfb8a0fc5509bbc979da0131b9d08e3d5f50fb0bbb36f169a"}, + {file = "numpy-1.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c29b44905af288b3919803aceb6ec7fec77406d8b08aaa2e8b9e63d0fe2f160"}, + {file = "numpy-1.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:98e8e0d8d69ff4d3fa63e6c61e8cfe2d03c29b16b58dbef1f9baa175bbed7860"}, + {file = "numpy-1.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a506cacf2be3a74ead5467aee97b81fca00c9c4c8b3ba16dbab488cd99ba10"}, + {file = "numpy-1.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:092f5e6025813e64ad6d1b52b519165d08c730d099c114a9247c9bb635a2a450"}, + {file = "numpy-1.23.0-cp39-cp39-win32.whl", hash = "sha256:d6ca8dabe696c2785d0c8c9b0d8a9b6e5fdbe4f922bde70d57fa1a2848134f95"}, + {file = "numpy-1.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc431493df245f3c627c0c05c2bd134535e7929dbe2e602b80e42bf52ff760bc"}, + {file = "numpy-1.23.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f9c3fc2adf67762c9fe1849c859942d23f8d3e0bee7b5ed3d4a9c3eeb50a2f07"}, + {file = "numpy-1.23.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0d2094e8f4d760500394d77b383a1b06d3663e8892cdf5df3c592f55f3bff66"}, + {file = "numpy-1.23.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:94b170b4fa0168cd6be4becf37cb5b127bd12a795123984385b8cd4aca9857e5"}, + {file = "numpy-1.23.0.tar.gz", hash = "sha256:bd3fa4fe2e38533d5336e1272fc4e765cabbbde144309ccee8675509d5cd7b05"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pandocfilters = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] +parso = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pickleshare = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +prometheus-client = [ + {file = "prometheus_client-0.14.1-py3-none-any.whl", hash = "sha256:522fded625282822a89e2773452f42df14b5a8e84a86433e3f8a189c1d54dc01"}, + {file = "prometheus_client-0.14.1.tar.gz", hash = "sha256:5459c427624961076277fdc6dc50540e2bacb98eebde99886e59ec55ed92093a"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.30-py3-none-any.whl", hash = "sha256:d8916d3f62a7b67ab353a952ce4ced6a1d2587dfe9ef8ebc30dd7c386751f289"}, + {file = "prompt_toolkit-3.0.30.tar.gz", hash = "sha256:859b283c50bde45f5f97829f77a4674d1c1fcd88539364f1b28a37805cfd89c0"}, +] +psutil = [ + {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87"}, + {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af"}, + {file = "psutil-5.9.1-cp27-cp27m-win32.whl", hash = "sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc"}, + {file = "psutil-5.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2"}, + {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0"}, + {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22"}, + {file = "psutil-5.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9"}, + {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8"}, + {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de"}, + {file = "psutil-5.9.1-cp310-cp310-win32.whl", hash = "sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329"}, + {file = "psutil-5.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021"}, + {file = "psutil-5.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237"}, + {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453"}, + {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685"}, + {file = "psutil-5.9.1-cp36-cp36m-win32.whl", hash = "sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36"}, + {file = "psutil-5.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d"}, + {file = "psutil-5.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc"}, + {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676"}, + {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4"}, + {file = "psutil-5.9.1-cp37-cp37m-win32.whl", hash = "sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b"}, + {file = "psutil-5.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680"}, + {file = "psutil-5.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1"}, + {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4"}, + {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b"}, + {file = "psutil-5.9.1-cp38-cp38-win32.whl", hash = "sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689"}, + {file = "psutil-5.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0"}, + {file = "psutil-5.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81"}, + {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e"}, + {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537"}, + {file = "psutil-5.9.1-cp39-cp39-win32.whl", hash = "sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574"}, + {file = "psutil-5.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5"}, + {file = "psutil-5.9.1.tar.gz", hash = "sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +pure-eval = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyrsistent = [ + {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, + {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, + {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, + {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, +] +pytest = [ + {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, + {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +pytz = [ + {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, + {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, +] +pywin32 = [ + {file = "pywin32-304-cp310-cp310-win32.whl", hash = "sha256:3c7bacf5e24298c86314f03fa20e16558a4e4138fc34615d7de4070c23e65af3"}, + {file = "pywin32-304-cp310-cp310-win_amd64.whl", hash = "sha256:4f32145913a2447736dad62495199a8e280a77a0ca662daa2332acf849f0be48"}, + {file = "pywin32-304-cp310-cp310-win_arm64.whl", hash = "sha256:d3ee45adff48e0551d1aa60d2ec066fec006083b791f5c3527c40cd8aefac71f"}, + {file = "pywin32-304-cp311-cp311-win32.whl", hash = "sha256:30c53d6ce44c12a316a06c153ea74152d3b1342610f1b99d40ba2795e5af0269"}, + {file = "pywin32-304-cp311-cp311-win_amd64.whl", hash = "sha256:7ffa0c0fa4ae4077e8b8aa73800540ef8c24530057768c3ac57c609f99a14fd4"}, + {file = "pywin32-304-cp311-cp311-win_arm64.whl", hash = "sha256:cbbe34dad39bdbaa2889a424d28752f1b4971939b14b1bb48cbf0182a3bcfc43"}, + {file = "pywin32-304-cp36-cp36m-win32.whl", hash = "sha256:be253e7b14bc601718f014d2832e4c18a5b023cbe72db826da63df76b77507a1"}, + {file = "pywin32-304-cp36-cp36m-win_amd64.whl", hash = "sha256:de9827c23321dcf43d2f288f09f3b6d772fee11e809015bdae9e69fe13213988"}, + {file = "pywin32-304-cp37-cp37m-win32.whl", hash = "sha256:f64c0377cf01b61bd5e76c25e1480ca8ab3b73f0c4add50538d332afdf8f69c5"}, + {file = "pywin32-304-cp37-cp37m-win_amd64.whl", hash = "sha256:bb2ea2aa81e96eee6a6b79d87e1d1648d3f8b87f9a64499e0b92b30d141e76df"}, + {file = "pywin32-304-cp38-cp38-win32.whl", hash = "sha256:94037b5259701988954931333aafd39cf897e990852115656b014ce72e052e96"}, + {file = "pywin32-304-cp38-cp38-win_amd64.whl", hash = "sha256:ead865a2e179b30fb717831f73cf4373401fc62fbc3455a0889a7ddac848f83e"}, + {file = "pywin32-304-cp39-cp39-win32.whl", hash = "sha256:25746d841201fd9f96b648a248f731c1dec851c9a08b8e33da8b56148e4c65cc"}, + {file = "pywin32-304-cp39-cp39-win_amd64.whl", hash = "sha256:d24a3382f013b21aa24a5cfbfad5a2cd9926610c0affde3e8ab5b3d7dbcf4ac9"}, +] +pywinpty = [ + {file = "pywinpty-2.0.5-cp310-none-win_amd64.whl", hash = "sha256:f86c76e2881c37e69678cbbf178109f8da1fa8584db24d58e1b9369b0276cfcb"}, + {file = "pywinpty-2.0.5-cp37-none-win_amd64.whl", hash = "sha256:ff9b52f182650cfdf3db1b264a6fe0963eb9d996a7a1fa843ac406c1e32111f8"}, + {file = "pywinpty-2.0.5-cp38-none-win_amd64.whl", hash = "sha256:651ee1467bd7eb6f64d44dbc954b7ab7d15ab6d8adacc4e13299692c67c5d5d2"}, + {file = "pywinpty-2.0.5-cp39-none-win_amd64.whl", hash = "sha256:e59a508ae78374febada3e53b5bbc90b5ad07ae68cbfd72a2e965f9793ae04f3"}, + {file = "pywinpty-2.0.5.tar.gz", hash = "sha256:e125d3f1804d8804952b13e33604ad2ca8b9b2cac92b27b521c005d1604794f8"}, +] +pyzmq = [ + {file = "pyzmq-23.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:22ac0243a41798e3eb5d5714b28c2f28e3d10792dffbc8a5fca092f975fdeceb"}, + {file = "pyzmq-23.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f685003d836ad0e5d4f08d1e024ee3ac7816eb2f873b2266306eef858f058133"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d4651de7316ec8560afe430fb042c0782ed8ac54c0be43a515944d7c78fddac8"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bcc6953e47bcfc9028ddf9ab2a321a3c51d7cc969db65edec092019bb837959f"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e08671dc202a1880fa522f921f35ca5925ba30da8bc96228d74a8f0643ead9c"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de727ea906033b30527b4a99498f19aca3f4d1073230a958679a5b726e2784e0"}, + {file = "pyzmq-23.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5aa9da520e4bb8cee8189f2f541701405e7690745094ded7a37b425d60527ea"}, + {file = "pyzmq-23.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f3ff6abde52e702397949054cb5b06c1c75b5d6542f6a2ce029e46f71ffbbbf2"}, + {file = "pyzmq-23.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e2e2db5c6ef376e97c912733dfc24406f5949474d03e800d5f07b6aca4d870af"}, + {file = "pyzmq-23.2.0-cp310-cp310-win32.whl", hash = "sha256:e669913cb2179507628419ec4f0e453e48ce6f924de5884d396f18c31836089c"}, + {file = "pyzmq-23.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a3dc339f7bc185d5fd0fd976242a5baf35de404d467e056484def8a4dd95868b"}, + {file = "pyzmq-23.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:30c365e60c39c53f8eea042b37ea28304ffa6558fb7241cf278745095a5757da"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2d8b69a2bf239ae3d987537bf3fbc2b044a405394cf4c258fc684971dd48b2"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:602835e5672ca9ca1d78e6c148fb28c4f91b748ebc41fbd2f479d8763d58bc9b"}, + {file = "pyzmq-23.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:831da96ba3f36cc892f0afbb4fb89b28b61b387261676e55d55a682addbd29f7"}, + {file = "pyzmq-23.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c8dec8a2f3f0bb462e6439df436cd8c7ec37968e90b4209ac621e7fbc0ed3b00"}, + {file = "pyzmq-23.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:814e5aaf0c3be9991a59066eafb2d6e117aed6b413e3e7e9be45d4e55f5e2748"}, + {file = "pyzmq-23.2.0-cp36-cp36m-win32.whl", hash = "sha256:8496a2a5efd055c61ac2c6a18116c768a25c644b6747dcfde43e91620ab3453c"}, + {file = "pyzmq-23.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:60746a7e8558655420a69441c0a1d47ed225ed3ac355920b96a96d0554ef7e6b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5cb642e94337b0c76c9c8cb9bfb0f8a78654575847d080d3e1504f312d691fc3"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:444f7d615d5f686d0ef508b9edfa8a286e6d89f449a1ba37b60ef69d869220a3"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c9638e0057e3f1a8b7c5ce33c7575349d9183a033a19b5676ad55096ae36820b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:004a431dfa0459123e6f4660d7e3c4ac19217d134ca38bacfffb2e78716fe944"}, + {file = "pyzmq-23.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5592fb4316f895922b1cacb91b04a0fa09d6f6f19bbab4442b4d0a0825177b93"}, + {file = "pyzmq-23.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c0a5f987d73fd9b46c3d180891f829afda714ab6bab30a1218724d4a0a63afd8"}, + {file = "pyzmq-23.2.0-cp37-cp37m-win32.whl", hash = "sha256:d11628212fd731b8986f1561d9bb3f8c38d9c15b330c3d8a88963519fbcd553b"}, + {file = "pyzmq-23.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:558f5f636e3e65f261b64925e8b190e8689e334911595394572cc7523879006d"}, + {file = "pyzmq-23.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61b97f624da42813f74977425a3a6144d604ea21cf065616d36ea3a866d92c1c"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:693c96ae4d975eb8efa1639670e9b1fac0c3f98b7845b65c0f369141fb4bb21f"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b054525c9f7e240562185bf21671ca16d56bde92e9bd0f822c07dec7626b704"}, + {file = "pyzmq-23.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:859059caf564f0c9398c9005278055ed3d37af4d73de6b1597821193b04ca09b"}, + {file = "pyzmq-23.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8355744fdbdeac5cfadfa4f38b82029b5f2b8cab7472a33453a217a7f3a9dce2"}, + {file = "pyzmq-23.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:420b9abd1a7330687a095373b8280a20cdee04342fbc8ccb3b56d9ec8efd4e62"}, + {file = "pyzmq-23.2.0-cp38-cp38-win32.whl", hash = "sha256:59928dfebe93cf1e203e3cb0fd5d5dd384da56b99c8305f2e1b0a933751710f6"}, + {file = "pyzmq-23.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:c882f1d4f96fbd807e92c334251d8ebd159a1ef89059ccd386ddea83fdb91bd8"}, + {file = "pyzmq-23.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:ced12075cdf3c7332ecc1960f77f7439d5ebb8ea20bbd3c34c8299e694f1b0a1"}, + {file = "pyzmq-23.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3a4d87342c2737fbb9eee5c33c792db27b36b04957b4e6b7edd73a5b239a2a13"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:99cedf38eaddf263cf7e2a50e405f12c02cedf6d9df00a0d9c5d7b9417b57f76"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1610260cc672975723fcf7705c69a95f3b88802a594c9867781bedd9b13422c"}, + {file = "pyzmq-23.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c223a13555444707a0a7ebc6f9ee63053147c8c082bd1a31fd1207a03e8b0500"}, + {file = "pyzmq-23.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5fdb00d65ec44b10cc6b9b6318ef1363b81647a4aa3270ca39565eadb2d1201"}, + {file = "pyzmq-23.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:984b232802eddf9f0be264a4d57a10b3a1fd7319df14ee6fc7b41c6d155a3e6c"}, + {file = "pyzmq-23.2.0-cp39-cp39-win32.whl", hash = "sha256:f146648941cadaaaf01254a75651a23c08159d009d36c5af42a7cc200a5e53ec"}, + {file = "pyzmq-23.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:83005d8928f8a5cebcfb33af3bfb84b1ad65d882b899141a331cc5d07d89f093"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fee86542dc4ee8229e023003e3939b4d58cc2453922cf127778b69505fc9064b"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5d57542429df6acff02ff022067aa75b677603cee70e3abb9742787545eec966"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:057b154471e096e2dda147f7b057041acc303bb7ca4aa24c3b88c6cecdd78717"}, + {file = "pyzmq-23.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:5d92e7cbeab7f70b08cc0f27255b0bb2500afc30f31075bca0b1cb87735d186c"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:eb4a573a8499685d62545e806d8fd143c84ac8b3439f925cd92c8763f0ed9bd7"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:da338e2728410d74ddeb1479ec67cfba73311607037455a40f92b6f5c62bf11d"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1b2a21f595f8cc549abd6c8de1fcd34c83441e35fb24b8a59bf161889c62a486"}, + {file = "pyzmq-23.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8c0f4d6f8c985bab83792be26ff3233940ba42e22237610ac50cbcfc10a5c235"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bbabd1df23bf63ae829e81200034c0e433499275a6ed29ca1a912ea7629426d9"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21552624ce69e69f7924f413b802b1fb554f4c0497f837810e429faa1cd4f163"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c616893a577e9d6773a3836732fd7e2a729157a108b8fccd31c87512fa01671a"}, + {file = "pyzmq-23.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ce4f71e17fa849de41a06109030d3f6815fcc33338bf98dd0dde6d456d33c929"}, + {file = "pyzmq-23.2.0.tar.gz", hash = "sha256:a51f12a8719aad9dcfb55d456022f16b90abc8dde7d3ca93ce3120b40e3fa169"}, +] +requests = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +send2trash = [ + {file = "Send2Trash-1.8.0-py3-none-any.whl", hash = "sha256:f20eaadfdb517eaca5ce077640cb261c7d2698385a6a0f072a4a5447fd49fa08"}, + {file = "Send2Trash-1.8.0.tar.gz", hash = "sha256:d2c24762fd3759860a0aff155e45871447ea58d2be6bdd39b5c8f966a0c99c2d"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +sniffio = [ + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +stack-data = [ + {file = "stack_data-0.3.0-py3-none-any.whl", hash = "sha256:aa1d52d14d09c7a9a12bb740e6bdfffe0f5e8f4f9218d85e7c73a8c37f7ae38d"}, + {file = "stack_data-0.3.0.tar.gz", hash = "sha256:77bec1402dcd0987e9022326473fdbcc767304892a533ed8c29888dacb7dddbc"}, +] +terminado = [ + {file = "terminado-0.15.0-py3-none-any.whl", hash = "sha256:0d5f126fbfdb5887b25ae7d9d07b0d716b1cc0ccaacc71c1f3c14d228e065197"}, + {file = "terminado-0.15.0.tar.gz", hash = "sha256:ab4eeedccfcc1e6134bfee86106af90852c69d602884ea3a1e8ca6d4486e9bfe"}, +] +tinycss2 = [ + {file = "tinycss2-1.1.1-py3-none-any.whl", hash = "sha256:fe794ceaadfe3cf3e686b22155d0da5780dd0e273471a51846d0a02bc204fec8"}, + {file = "tinycss2-1.1.1.tar.gz", hash = "sha256:b2e44dd8883c360c35dd0d1b5aad0b610e5156c2cb3b33434634e539ead9d8bf"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tornado = [ + {file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"}, + {file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"}, + {file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"}, + {file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"}, + {file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"}, + {file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"}, + {file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"}, + {file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"}, + {file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"}, + {file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"}, + {file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"}, + {file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"}, + {file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"}, + {file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"}, + {file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"}, + {file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"}, + {file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"}, + {file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"}, + {file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"}, + {file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"}, + {file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"}, + {file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"}, + {file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"}, + {file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"}, + {file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"}, + {file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"}, + {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, +] +traitlets = [ + {file = "traitlets-5.3.0-py3-none-any.whl", hash = "sha256:65fa18961659635933100db8ca120ef6220555286949774b9cfc106f941d1c7a"}, + {file = "traitlets-5.3.0.tar.gz", hash = "sha256:0bb9f1f9f017aa8ec187d8b1b2a7a6626a2a1d877116baba52a129bfa124f8e2"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websocket-client = [ + {file = "websocket-client-1.3.3.tar.gz", hash = "sha256:d58c5f284d6a9bf8379dab423259fe8f85b70d5fa5d2916d5791a84594b122b1"}, + {file = "websocket_client-1.3.3-py3-none-any.whl", hash = "sha256:5d55652dc1d0b3c734f044337d929aaf83f4f9138816ec680c1aefefb4dc4877"}, +] +zipp = [ + {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, + {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..84b52a2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "tesspoint" +version = "1.0.0" +description = "High Precision TESS pointing tool" +authors = ["Your Name "] +license = "MIT" + +[tool.poetry.dependencies] +python = "^3.8" +numpy = "^1.23.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.1.2" +jupyterlab = "^3.4.3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index b88034e..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[metadata] -description-file = README.md diff --git a/setup.py b/setup.py deleted file mode 100644 index 86b7ffc..0000000 --- a/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -import setuptools - -with open("README.md", "r") as fh: - long_description = fh.read() - -setuptools.setup( - name="tess-point", - version="0.7.1", - author="Christopher J. Burke", - author_email="cjburke@mit.edu", - description="Determine pixel coordinates for TESS targets", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/christopherburke/tess-point", - license="MIT", - install_requires=[ - 'numpy', - 'astropy', - 'scipy' - ], - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering :: Astronomy" - ], - py_modules=['tess_stars2px'], -) diff --git a/src/tesspoint/__init__.py b/src/tesspoint/__init__.py new file mode 100644 index 0000000..03e9353 --- /dev/null +++ b/src/tesspoint/__init__.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import absolute_import # noqa +import os # noqa + +PACKAGEDIR = os.path.abspath(os.path.dirname(__file__)) + +from .tesspoint import TESSPoint, footprint diff --git a/src/tesspoint/data/pointings.csv b/src/tesspoint/data/pointings.csv new file mode 100644 index 0000000..a1c7744 --- /dev/null +++ b/src/tesspoint/data/pointings.csv @@ -0,0 +1,84 @@ +sector,ra,dec,roll +1,352.6844,-64.8531,222.1532 +2,16.5571,-54.016000000000005,220.4335 +3,36.3138,-44.25899999999999,213.0384 +4,55.007,-36.641999999999996,202.8302 +5,73.5382,-31.9349,191.0517 +6,92.0096,-30.5839,178.6367 +7,110.2559,-32.6344,166.4476 +8,128.1156,-37.736999999999995,155.3091 +9,145.9071,-45.3044,145.9163 +10,165.0475,-54.8165,139.1724 +11,189.1247,-65.5369,138.0761 +12,229.5885,-75.1256,153.9773 +13,298.6671,-76.3281,198.9378 +14,276.7169,62.4756,32.2329 +15,280.3985,64.0671,55.4277 +16,282.4427,66.1422,79.4699 +17,351.2381,57.8456,41.9686 +18,16.1103,67.9575,40.5453 +19,60.2026,76.2343,19.6463 +20,129.3867,75.252,334.5689 +21,171.7951,65.1924,317.9495 +22,197.1008,53.7434,319.6992 +23,217.2879,43.8074,327.4246 +24,261.4516,63.1181,317.2624 +25,265.6098,61.9383,339.5293 +26,270.1381,61.5637,0.6038 +27,326.8525,-72.4265,214.5061 +28,357.2944,-63.0056,222.5216 +29,18.919,-52.8296,219.797 +30,38.3564,-43.3178,212.0441 +31,57.6357,-35.7835,201.2334 +32,77.1891,-31.3957,188.6263 +33,96.5996,-30.7848,175.5369 +34,115.2951,-33.779,163.1916 +35,133.2035,-39.6871,152.4006 +36,150.9497,-47.7512,143.7306 +37,170.25400000000002,-57.3725,138.1685 +38,195.7176,-67.8307,139.3519 +39,242.1981,-76.3969,161.5986 +40,273.0766,61.745,14.1539 +41,277.6209,62.763999999999996,37.2224 +42,13.014000000000001,6.3337,292.8009 +43,49.526,18.9737,284.9617 +44,89.6066,24.1343,270.1557 +45,130.296,19.0181,255.0927 +46,157.6997,10.0922,248.4063 +47,143.3807,73.1125,327.10200000000003 +48,179.4254,62.1038,317.4166 +49,202.6424,50.9532,321.3516 +50,221.8575,41.7577,329.73400000000004 +51,239.4257,35.2333,339.865 +52,266.3618,61.818999999999996,343.1429 +53,270.8126,61.5761,3.6838 +54,290.121,32.6073,13.4565 +55,307.8655,37.6464,24.5369 +56,324.2778,46.3448,36.2524 +57,344.2275,56.4121,44.01 +58,9.3118,67.6524,45.3615 +59,52.9755,77.1746,26.5121 +60,125.6742,77.3113,337.3244 +61,118.0446,-36.0902,162.2198 +62,135.2412,-42.2415,151.5884 +63,153.0613,-50.6996,142.7405 +64,173.2653,-60.865,137.281 +65,201.6239,-71.5724,140.7443 +66,259.1702,-78.7974,173.9147 +67,326.7691,-74.2796,217.4678 +68,359.2829,-64.2357,226.0975 +69,20.0449,-54.2315,222.7721 +70,24.04,9.26,291.3 +71,77.34,22.22,275.0 +72,133.76,16.65,254.03 +73,80.67,78.83,8.03 +74,261.22,72.3,213.92 +75,254.93,69.94,247.49 +76,253.53,66.84,276.64 +77,255.86,63.86,302.34 +78,260.42,61.57,325.71 +79,266.06,60.3,347.51 +80,275.7,32.23,5.49 +81,292.57,34.69,17.13 +82,309.13,39.78,27.8 +83,325.89,47.12,37.05 \ No newline at end of file diff --git a/src/tesspoint/tesspoint.py b/src/tesspoint/tesspoint.py new file mode 100644 index 0000000..3b7e865 --- /dev/null +++ b/src/tesspoint/tesspoint.py @@ -0,0 +1,294 @@ +"""Python vectorized version of tess-point""" +import numpy as np +from dataclasses import dataclass +from . import PACKAGEDIR + +__all__ = ["TESSPoint", "footprint"] + +pointings = { + key: col + for col, key in zip( + np.loadtxt(f"{PACKAGEDIR}/data/pointings.csv", delimiter=",", skiprows=1).T, + np.loadtxt( + f"{PACKAGEDIR}/data/pointings.csv", delimiter=",", max_rows=1, dtype=str + ), + ) +} + +tess_params = { + 1: { + "ang1": 0.101588, + "ang2": -36.022035, + "ang3": 90.048315, + "fl": 145.948116, + "opt_coef1": 1.00000140, + "opt_coef2": 0.24779006, + "opt_coef3": -0.22681254, + "opt_coef4": 10.78243356, + "opt_coef5": -34.97817276, + "x0_ccd1": 31.573417, + "y0_ccd1": 31.551637, + "ang_ccd1": 179.980833, + "x0_ccd2": -0.906060, + "y0_ccd2": 31.536148, + "ang_ccd2": 180.000000, + "x0_ccd3": -31.652818, + "y0_ccd3": -31.438350, + "ang_ccd3": -0.024851, + "x0_ccd4": 0.833161, + "y0_ccd4": -31.458180, + "ang_ccd4": 0.001488, + }, + 2: { + "ang1": -0.179412, + "ang2": -12.017260, + "ang3": 90.046500, + "fl": 145.989933, + "opt_coef1": 1.00000140, + "opt_coef2": 0.24069345, + "opt_coef3": 0.15391120, + "opt_coef4": 4.05433503, + "opt_coef5": 3.43136895, + "x0_ccd1": 31.653635, + "y0_ccd1": 31.470291, + "ang_ccd1": 180.010890, + "x0_ccd2": -0.827405, + "y0_ccd2": 31.491388, + "ang_ccd2": 180.000000, + "x0_ccd3": -31.543794, + "y0_ccd3": -31.550699, + "ang_ccd3": -0.006624, + "x0_ccd4": 0.922834, + "y0_ccd4": -31.557268, + "ang_ccd4": -0.015464, + }, + 3: { + "ang1": 0.066596, + "ang2": 12.007750, + "ang3": -89.889085, + "fl": 146.006602, + "opt_coef1": 1.00000140, + "opt_coef2": 0.23452229, + "opt_coef3": 0.33552009, + "opt_coef4": 1.92009863, + "opt_coef5": 12.48880182, + "x0_ccd1": 31.615486, + "y0_ccd1": 31.413644, + "ang_ccd1": 179.993948, + "x0_ccd2": -0.832993, + "y0_ccd2": 31.426621, + "ang_ccd2": 180.000000, + "x0_ccd3": -31.548296, + "y0_ccd3": -31.606976, + "ang_ccd3": 0.000298, + "x0_ccd4": 0.896018, + "y0_ccd4": -31.569542, + "ang_ccd4": -0.006464, + }, + 4: { + "ang1": 0.030756, + "ang2": 35.978116, + "ang3": -89.976802, + "fl": 146.039793, + "opt_coef1": 1.00000140, + "opt_coef2": 0.23920416, + "opt_coef3": 0.13349450, + "opt_coef4": 4.77768896, + "opt_coef5": -1.75114744, + "x0_ccd1": 31.575820, + "y0_ccd1": 31.316510, + "ang_ccd1": 179.968217, + "x0_ccd2": -0.890877, + "y0_ccd2": 31.363511, + "ang_ccd2": 180.000000, + "x0_ccd3": -31.630470, + "y0_ccd3": -31.716942, + "ang_ccd3": -0.024359, + "x0_ccd4": 0.824159, + "y0_ccd4": -31.728751, + "ang_ccd4": -0.024280, + }, +} + + +@dataclass +class TESSPoint: + sector: int + camera: int + ccd: int + + def __post_init__(self): + xeul = np.hstack( + [ + (np.pi / 180.0) * pointings["ra"][pointings["sector"] == self.sector], + np.pi / 2.0 + - (np.pi / 180.0) + * pointings["dec"][pointings["sector"] == self.sector], + (np.pi / 180.0) * pointings["roll"][pointings["sector"] == self.sector] + + np.pi, + ] + ) + + self.rmat1 = eulerm323(xeul) + eulcam = np.asarray( + [tess_params[self.camera][f"ang{idx}"] for idx in np.arange(1, 4)] + ) + self.rmat2 = eulerm323(eulcam * (np.pi / 180.0)) + self.rmat4 = np.matmul(self.rmat2, self.rmat1) + + @property + def opt_coeffs(self): + return np.asarray( + [ + tess_params[self.camera][key] + for key in np.hstack( + [["fl"], [f"opt_coef{idx}" for idx in np.arange(1, 6)]] + ) + ] + ) + + def pix_to_mm(self, coords): + """convert pixel to mm focal plane position""" + pixsz = 0.015000 + angle = tess_params[self.camera][f"ang_ccd{self.ccd}"] + xyb = xyrotate(angle, (coords + 0.5) * pixsz) + return np.vstack( + [ + xyb[:, 0] + tess_params[self.camera][f"x0_ccd{self.ccd}"], + xyb[:, 1] + tess_params[self.camera][f"y0_ccd{self.ccd}"], + ] + ).T + + def pix2radec(self, coords): + xyfp = self.pix_to_mm(coords) + lng_deg, lat_deg = fp_optics(xyfp, self.opt_coeffs) + vcam = np.asarray(sphereToCart(lng_deg, lat_deg)).T + curVec = np.matmul(self.rmat4.T, vcam.T).T + ra, dec = cartToSphere(curVec) + return ra / (np.pi / 180.0), dec / (np.pi / 180.0) + + +def footprint(npoints=50): + """Gets the column and row points for CCD edges""" + column = np.hstack( + [ + np.zeros(npoints), + np.linspace(0, 2048, npoints), + np.linspace(0, 2048, npoints), + np.ones(npoints) * 2048, + ] + ) + row = np.hstack( + [ + np.linspace(0, 2048, npoints), + np.zeros(npoints), + np.ones(npoints) * 2048, + np.linspace(0, 2048, npoints), + ] + ) + return np.vstack([column, row]).T + + +def xyrotate(angle, coords): + ca = np.cos((np.pi / 180.0) * angle) + sa = np.sin((np.pi / 180.0) * angle) + return np.vstack( + [ca * coords[:, 0] + sa * coords[:, 1], -sa * coords[:, 0] + ca * coords[:, 1]] + ).T.astype(coords.dtype) + + +def rev_az_asym(coords): + asymang = 0.0 + asymfac = 1.0 + xypa = xyrotate(asymang, coords) * np.asarray([1 / asymfac, 1]) + return xyrotate(-asymang, xypa) + + +def r_of_tanth(z, opt_coeffs): + tanth = np.tan(z) + rfp0 = tanth * opt_coeffs[0] + rfp = np.sum(opt_coeffs[1:] * (tanth ** (2 * np.arange(5))[:, None]).T, axis=1) + return rfp0 * rfp + + +def tanth_of_r(rfp_times_rfp0, opt_coeffs): + zi = np.arctan(rfp_times_rfp0 ** 0.5 / opt_coeffs[0]) + # Minimize... + # This is a way to minimize that + # 1) let's us minimize the whole vector and + # 2) doesn't use scipy, so we could do something similar in other scripting languates + # But it's not even close to optimal. + # If you pass in a lot of points this might fill up your memory though... + # ---- + bounds = (0, 0.55) + resolution = 0.001 + x = np.arange(*bounds, resolution)[:, None] * np.ones((1, len(zi))) + for count in range(3): + minimize = np.asarray( + [ + (r_of_tanth(zi + x[idx], opt_coeffs) - rfp_times_rfp0) ** 2 + for idx in range(x.shape[0]) + ] + ) + argmin = np.argmin(minimize, axis=0) + xmin = np.asarray([x[am, idx] for idx, am in enumerate(argmin)]) + # Every iteration, scale down the offset to be narrower around the minimum + x = (x - xmin) * 0.25 + xmin + # ---- + return xmin + zi + + +def fp_optics(xyfp, opt_coeffs): + xy = rev_az_asym(xyfp) + rfp_times_rfp0 = np.sum(xy ** 2, axis=1) ** 0.5 + phirad = np.arctan2(-xy[:, 1], -xy[:, 0]) + phideg = phirad / (np.pi / 180.0) % 360 + thetarad = tanth_of_r(rfp_times_rfp0, opt_coeffs) + thetadeg = thetarad / (np.pi / 180.0) + return phideg, 90.0 - thetadeg + + +def sphereToCart(ras, decs): + """Convert 3d spherical coordinates to cartesian""" + rarads = (np.pi / 180.0) * ras + decrads = (np.pi / 180.0) * decs + sinras = np.sin(rarads) + cosras = np.cos(rarads) + sindecs = np.sin(decrads) + cosdecs = np.cos(decrads) + vec0s = cosras * cosdecs + vec1s = sinras * cosdecs + vec2s = sindecs + return vec0s, vec1s, vec2s + + +def eulerm323(eul): + mat1 = rotm1(2, eul[0]) + mat2 = rotm1(1, eul[1]) + mata = np.matmul(mat2, mat1) + mat1 = rotm1(2, eul[2]) + rmat = np.matmul(mat1, mata) + return rmat + + +def rotm1(ax, angle): + mat = np.zeros((3, 3), dtype=np.double) + n1 = ax + n2 = np.mod((n1 + 1), 3) + n3 = np.mod((n2 + 1), 3) + sinang = np.sin(angle) + cosang = np.cos(angle) + mat[n1][n1] = 1.0 + mat[n2][n2] = cosang + mat[n3][n3] = cosang + mat[n2][n3] = sinang + mat[n3][n2] = -sinang + return mat + + +def cartToSphere(vec): + norm = np.sqrt(np.sum(vec ** 2, axis=1)) + dec = np.arcsin(vec[:, 2] / norm) + ra = np.arctan2(vec[:, 1], vec[:, 0]) + ra = np.mod(ra, 2.0 * np.pi) + return ra, dec diff --git a/src/tesspoint/wrapper.py b/src/tesspoint/wrapper.py new file mode 100644 index 0000000..15576e6 --- /dev/null +++ b/src/tesspoint/wrapper.py @@ -0,0 +1,115 @@ +from dataclasses import dataclass +from typing import Optional, List + +@dataclass +class TESSpoint(object): + coord : Optional = None # SkyCoord? + ra : Optional = None + dec : Optional = None + row : Optional = None + column : Optional = None + targetname : Optional = None + filename : Optional[str] = None + + def __post_init__(self): + if self.targetname is not None: + self._read_name() + elif self.filename is not None: + self._read_csv() + elif self.coord is not None: + self._read_skycoord() + self.validate() + + def _read_skycoord(self): + if isinstance(self.coord, list): + if isinstance(self.coord[0], SkyCoord): + self.coord = SkyCoord(self.coord) + else: + raise ValueError("Must pass either a `astropy.coordinate.SkyCoord` object or a list of `astropy.coordinate.SkyCoord` objects to `coord`") + elif not isinstance(self.coord, SkyCoord): + raise ValueError("Must pass either a `astropy.coordinate.SkyCoord` object or a list of `astropy.coordinate.SkyCoord` objects to `coord`") + if len(self.coord.shape) == 0: + self.coord = SkyCoord([self.coord]) + self.ra, self.dec = self.coord.ra.deg, self.coord.dec.deg + + def _read_name(self): + if isinstance(self.targetname, str): + c = SkyCoord.from_name(self.targetname) + self.ra, self.dec = c.ra.deg, c.dec.deg + elif isinstance(self.targetname, (list, np.ndarray)): + self.ra, self.dec = [], [] + for name in self.targetname: + c = SkyCoord.from_name(name) + self.ra.append(c.ra.deg) + self.dec.append(c.dec.deg) + + def _read_csv(self): + df = pd.read_csv(self.filename) + cols = np.asarray([c.lower().strip() for c in df.columns]) + if np.any(cols == 'col'): + cols[cols == 'col'] = 'column' + + if not np.in1d(['ra', 'dec', 'row', 'column'], cols).any(): + raise ValueError('Must pass a dataframe with column headers of "ra", "dec", "column", or "row".') + + [setattr(self, attr, np.asarray(df[attr])) for attr in ['ra', 'dec', 'row', 'column'] if attr in cols] + + + def validate(self): + attrs = np.asarray(['ra', 'dec', 'row', 'column']) + + isnone = np.asarray([getattr(self, attr) is None for attr in attrs]) + # Passed in something + if isnone.all(): + raise ValueError(f"Must pass either RA and Dec, Column and Row, a target name, or a filename.") + + if np.atleast_1d(np.where(~isnone)[0] == [0, 1]).all(): + self.coord_type = 'radec' + elif np.atleast_1d(np.where(~isnone)[0] == [2, 3]).all(): + self.coord_type = 'pixels' + else: + raise ValueError("Must pass either RA and Dec, or Column and Row.") + + # Correct length + valid_lengths = len(np.unique([len(np.atleast_1d(getattr(self, attr))) for attr in attrs[np.where(~isnone)]])) == 1 + if not valid_lengths: + raise ValueError("Must pass arrays of the same length.") + [setattr(self, attr, np.atleast_1d(getattr(self, attr))) for attr in attrs[np.where(~isnone)]] + self.nvals = len(np.atleast_1d(getattr(self, attrs[np.where(~isnone)[0][0]]))) + + def __len__(self): + return self.nvals + + def __repr__(self): + if self.coord_type == 'pixels': + return f'TESSpoint ({self.nvals} Row/Column pairs)' + elif self.coord_type == 'radec': + return f'TESSpoint ({self.nvals} RA/Dec pairs)' + else: + return 'TESSpoint' + + def __getitem__(self, idx): + if self.coord_type == 'radec': + return TESSpoint(ra=self.ra[idx], dec=self.dec[idx]) + elif self.coord_type == 'pixels': + return TESSpoint(row=self.row[idx], column=self.column[idx]) + else: + raise ValueError('No `coord_type` set.') + + + def to_RADec(self, sector:Optional[List] = None, camera:Optional[List] = None, ccd:Optional[List] = None): + raise NotImplementedError + + #return df # with dates? + + def to_Pixel(self, sector:Optional[List] = None): + raise NotImplementedError + #return df # with dates? + + def ObservabilityMask(self, sectors:Optional[List] = None, cycle:Optional[List] = None): + raise NotImplementedError + #return np.ndarray of bools + + def NumberOfObservations(self, sectors:Optional[List] = None, cycle:Optional[List] = None): + raise NotImplementedError + #return np.ndarray of ints \ No newline at end of file diff --git a/tess_stars2px.py b/tess_stars2px.py deleted file mode 100644 index 5bb7e6b..0000000 --- a/tess_stars2px.py +++ /dev/null @@ -1,1441 +0,0 @@ - -""" -tess_stars2px.py - High precision TESS pointing tool. -Convert target coordinates given in Right Ascension and Declination to -TESS detector pixel coordinates for the prime mission TESS observing -sectors (Year 1 & 2), Extendend mission Years 3-5. -Can also query MAST to obtain detector -pixel coordinates for a star by TIC ID or common star name (must be online for this option). - -USAGE to display command line arguments: -python tess_stars2px.py -h - -AUTHORS: Original programming in C and focal plane geometry solutions - by Alan Levine (MIT) - This python translation by Christopher J. Burke (MIT) - Testing and focal plane geometry refinements by Michael Fausnaugh & - Roland Vanderspek (MIT) - Testing by Thomas Barclay (NASA Goddard) & - Jessica Roberts (Univ. of Colorado) - Sesame queries by Brett Morris (UW) - Proxy Support added by Dishendra Mishra - Deprecation warnings correctsion by Ethan Kruse - -VERSION: 0.7.1 - -WHAT'S NEW: - -Deprecation Warning Corrections - -Year 5 pointings (Sectors 56-69) now available - -Added Sector Pointing override file input - Supports mission planning as well as enabling the user - to speed up the calculation by only searching a subset of all sectors - -Bug correction for aberration. Only impacts if you were using - aberration flag (-a) WITHOUT the single sector flag (-s). In other words, - does not affect users that did not use --aberrate or -aberrate with -s - -NOTES: - -Pointing table is for TESS Year 1 - 5 (Sectors 1-69) - -Pointing table is unofficial, and the pointings may change. - -See https://tess.mit.edu/observations/ for latest TESS pointing table - -Pointing prediction algorithm is similar to internally at MIT for - target management. However, hard coded focal plane geometry is not - up to date and may contain inaccurate results. - -Testing shows pointing with this tool should be accurate to better than - a pixel, but without including aberration effects, ones algorithm - adopted for centroiding highly assymmetric point-spread function - at edge of - camera, and by-eye source location, a 2 pixel accuracy estimate is - warranted. There is an approximate aberration option now available - -The output pixel coordinates assume the ds9 convention with - 1,1 being the middle of the lower left corner pixel. - -No corrections for velocity aberration are calculated by default. - Potentially more accurate - results can be obtained if the target RA and Declination coordinates - have aberration effects applied. An aberration approximation is available - by using the -a flag. The aberration approximation assumes Earth motion without - taking into account the TESS spacecraft motion around Earth. - -For proposals to the TESS science office or directors discretionary time, - please consult the TESS prediction webtool available at - https://heasarc.gsfc.nasa.gov/cgi-bin/tess/webtess/wtv.py - for official identification of 'observable' targets. However, - if your proposal depends on a single or few targets, then this tool is - helpful to further refine the likelihood of the target being available - on the detectors. - -The calibrated FFI fits file release at MAST and calibrated by - NASA Ames SPOC will have WCS information available to - supplant this code. The WCS generation is independent of the - focal plane geometry model employed in this code and will give - different results at the pixel level. However, the WCS information - is not available until the FFI files are released, whereas - this code can predict positions in advance of data release. - -Hard coded focal plane geometry parameters from rfpg5_c1kb.txt - - -TODOS: - -Time dependent Focal plane geometry - -DEPENDENCIES: - python 3+ - astropy - numpy - -SPECIAL THANKS TO: - Includes code from the python MAST query examples - https://mast.stsci.edu/api/v0/pyex.html - -IMPLEMENTATION DETAILS: - In summary, the code begins with a space craft bore site pointing in RA, - Dec, and roll angle. A series of Euler angle translation matrices - are calculated based upon the space craft bore site. Next the target - coordinates in RA and Dec are translated to the space craft bore site - frame. Next, the target coordinates are translated to each of the four - TESS camera frames. Once target coordinates are translated to the - camera frame the radial position of the target relative to the camera - center is checked to see if it is potentially in the camera field of view. - If so, the focal plane position is calculated using a radial polynomial - model with a constant term and terms the even powers (2nd ,4th , and 8th). - Rotations are applied to convert the on sky positions to the detector - readout directions. - -MIT License -Copyright (c) 2018 Christopher J Burke - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -""" - -import numpy as np -import os -import argparse -from astropy.coordinates import SkyCoord -import astropy.units as u -from astropy.time import Time -import sys -import datetime -import json -try: # Python 3.x - from urllib.parse import quote as urlencode - from urllib.request import urlretrieve - from urllib.parse import urlparse -except ImportError: # Python 2.x - from urllib import pathname2url as urlencode - from urllib import urlretrieve - from urlparse import urlparse -try: # Python 3.x - import http.client as httplib -except ImportError: # Python 2.x - import httplib -import scipy.optimize as opt -import base64 - - -class Levine_FPG(): - """Al Levine Focal Plane Geometry Methods - Translated from starspx6.c - INPUT: - sc_ra_dec_roll = numpy array of the SpaceCraft boresite (sc Z-axis) - ra, dec, and roll [deg] - The roll angle is in RA, Dec space clockwise relative to the celestial - pole. roll angle = 0 [deg] implies space craft X-axis points N celestial (increasing dec) - roll angle = 90 [deg] implies sc X-axis points towards increasing/decreasing (?) RA - *** In practice there is a separate fpg file for each of the four cameras *** - rmat1[3,3] = is the rotation matrix from ra&dec to spacecraft boresite coords - rmat4[NCAM,3,3] - is the rotation matrix from ra&dec to NCAM coords - """ - parm_dict_list = [{}, {}, {}, {}] - NCAM = 4 # Number of Cameras - NCCD = 4 # Number of CCDs per Camera - - def __init__(self, sc_ra_dec_roll=None, fpg_file_list=None): - self.eulcam = np.zeros((self.NCAM,3), dtype=np.double) - self.optcon = np.zeros((self.NCAM,6), dtype=np.double) - self.ccdxy0 = np.zeros((self.NCAM, self.NCCD, 2), dtype=np.double) - self.pixsz = np.zeros((self.NCAM, self.NCCD, 2), dtype=np.double) - self.ccdang = np.zeros((self.NCAM, self.NCCD), dtype=np.double) - self.ccdtilt = np.zeros((self.NCAM, self.NCCD, 2), dtype=np.double) - self.asymang = np.zeros((self.NCAM,), dtype=np.double) - self.asymfac = np.zeros((self.NCAM,), dtype=np.double) - self.rmat1 = np.zeros((3,3), dtype=np.double) - self.rmat4 = np.zeros((self.NCAM,3,3), dtype=np.double) - self.havePointing = False - # Read in the fpg parameter files - self.read_all_levine_fpg_files(fpg_file_list) - # Generate rotation matrices if ra dec and roll values given - if not sc_ra_dec_roll is None: - # go from sky to spacecraft - self.sky_to_sc_mat(sc_ra_dec_roll) - # Go from spacecraft to each camera's coords - for icam in range(self.NCAM): - cureul = self.eulcam[icam,:] - rmat2 = self.sc_to_cam_mat(cureul) - self.rmat4[icam] = np.matmul(rmat2, self.rmat1) - self.havePointing = True - - def read_all_levine_fpg_files(self, fpg_file_list=None): - default_fpg_file_list = ['fpg_pars.txt-', \ - 'fpg_pars.txt-', \ - 'fpg_pars.txt-', \ - 'fpg_pars.txt-'] - # For each camera read in the separate fpg parameter file - for icam in range(self.NCAM): - if fpg_file_list == None: - fpg_file = default_fpg_file_list[icam] - else: - fpg_file = fpg_file_list[icam] - self.read_levine_fpg_file(icam, fpg_file) - # We now have parameters for all 4 cameras in the parm_dict_list - # parse the dictionary values into the working numpy arrays - for icam in range(self.NCAM): - pd = self.parm_dict_list[icam] - self.eulcam[icam][0] = pd['ang1_cam1'] - self.eulcam[icam][1] = pd['ang2_cam1'] - self.eulcam[icam][2] = pd['ang3_cam1'] - self.optcon[icam][0] = pd['fl_cam1'] - self.optcon[icam][1] = pd['opt_coef1_cam1'] - self.optcon[icam][2] = pd['opt_coef2_cam1'] - self.optcon[icam][3] = pd['opt_coef3_cam1'] - self.optcon[icam][4] = pd['opt_coef4_cam1'] - self.optcon[icam][5] = pd['opt_coef5_cam1'] - self.asymang[icam] = pd['asymang_cam1'] - self.asymfac[icam] = pd['asymfac_cam1'] - for iccd in range(self.NCCD): - self.ccdxy0[icam][iccd][0] = pd['x0_ccd{0:1d}_cam1'.format(iccd+1)] - self.ccdxy0[icam][iccd][1] = pd['y0_ccd{0:1d}_cam1'.format(iccd+1)] - self.pixsz[icam][iccd][0] = pd['pix_x_ccd{0:1d}_cam1'.format(iccd+1)] - self.pixsz[icam][iccd][1] = pd['pix_y_ccd{0:1d}_cam1'.format(iccd+1)] - self.ccdang[icam][iccd] = pd['ang_ccd{0:1d}_cam1'.format(iccd+1)] - self.ccdtilt[icam][iccd][0] = pd['tilt_x_ccd{0:1d}_cam1'.format(iccd+1)] - self.ccdtilt[icam][iccd][1] = pd['tilt_y_ccd{0:1d}_cam1'.format(iccd+1)] - - - def read_levine_fpg_file(self, icam, fpg_file): - gotParm = False - parm_dict = {} - if os.path.isfile(fpg_file): - try: - fpin = open(fpg_file, 'r') - # Read in parameters - dtypeseq = ['U20','i4','f16'] - dataBlock = np.genfromtxt(fpin, dtype=dtypeseq) - parm_keys = dataBlock['f0'] - parm_fitted_flags = dataBlock['f1'] - parm_values = dataBlock['f2'] - # Now build dictionary of the parameters - for i in range(len(parm_keys)): - parm_dict[parm_keys[i]] = parm_values[i] - self.parm_dict_list[icam] = parm_dict - gotParm = True - print('Successful Focal Plane Geometry Read From {0}'.format(fpg_file)) - except: - print('Could not open {0}! Using Hard-coded Focal Plane Geometry from Levine_FPG read_levine_fpg_file()'.format(fpg_file)) - # If anything goes wrong with reading in parameters revert to hard coded version - # or file was never given and default_fpg_file does not exist - if not gotParm: - #print('Using Hard-coded Focal Plane Geometry from Levine_FPG read_levine_fpg_file') - # *** For now this hard code is just a filler need to actually fill in values for all cameras separately - # to prepare parameters for dictionary - # awk -v q="'" -v d=":" '{print q $1 q d $3 ",\"}' rfpg5_c1kb.txt - if icam == 0: - parm_dict = {'ang1_cam1' : 0.101588, \ - 'ang2_cam1' : -36.022035, \ - 'ang3_cam1' : 90.048315, \ - 'fl_cam1' : 145.948116, \ - 'opt_coef1_cam1' : 1.00000140, \ - 'opt_coef2_cam1' : 0.24779006, \ - 'opt_coef3_cam1' : -0.22681254, \ - 'opt_coef4_cam1' : 10.78243356, \ - 'opt_coef5_cam1' : -34.97817276, \ - 'asymang_cam1' : 0.00000000, \ - 'asymfac_cam1' : 1.00000000, \ - 'x0_ccd1_cam1' : 31.573417, \ - 'y0_ccd1_cam1' : 31.551637, \ - 'pix_x_ccd1_cam1' : 0.015000, \ - 'pix_y_ccd1_cam1' : 0.015000, \ - 'ang_ccd1_cam1' : 179.980833, \ - 'tilt_x_ccd1_cam1' : 0.000000, \ - 'tilt_y_ccd1_cam1' : 0.000000, \ - 'x0_ccd2_cam1' : -0.906060, \ - 'y0_ccd2_cam1' : 31.536148, \ - 'pix_x_ccd2_cam1' : 0.015000, \ - 'pix_y_ccd2_cam1' : 0.015000, \ - 'ang_ccd2_cam1' : 180.000000, \ - 'tilt_x_ccd2_cam1' : 0.000000, \ - 'tilt_y_ccd2_cam1' : 0.000000, \ - 'x0_ccd3_cam1' : -31.652818, \ - 'y0_ccd3_cam1' : -31.438350, \ - 'pix_x_ccd3_cam1' : 0.015000, \ - 'pix_y_ccd3_cam1' : 0.015000, \ - 'ang_ccd3_cam1' : -0.024851, \ - 'tilt_x_ccd3_cam1' : 0.000000, \ - 'tilt_y_ccd3_cam1' : 0.000000, \ - 'x0_ccd4_cam1' : 0.833161, \ - 'y0_ccd4_cam1' : -31.458180, \ - 'pix_x_ccd4_cam1' : 0.015000, \ - 'pix_y_ccd4_cam1' : 0.015000, \ - 'ang_ccd4_cam1' : 0.001488, \ - 'tilt_x_ccd4_cam1' : 0.000000, \ - 'tilt_y_ccd4_cam1' : 0.000000} - - - if icam == 1: - parm_dict = {'ang1_cam1':-0.179412,\ - 'ang2_cam1':-12.017260,\ - 'ang3_cam1':90.046500,\ - 'fl_cam1':145.989933,\ - 'opt_coef1_cam1':1.00000140,\ - 'opt_coef2_cam1':0.24069345,\ - 'opt_coef3_cam1':0.15391120,\ - 'opt_coef4_cam1':4.05433503,\ - 'opt_coef5_cam1':3.43136895,\ - 'asymang_cam1':0.00000000,\ - 'asymfac_cam1':1.00000000,\ - 'x0_ccd1_cam1':31.653635,\ - 'y0_ccd1_cam1':31.470291,\ - 'pix_x_ccd1_cam1':0.015000,\ - 'pix_y_ccd1_cam1':0.015000,\ - 'ang_ccd1_cam1':180.010890,\ - 'tilt_x_ccd1_cam1':0.000000,\ - 'tilt_y_ccd1_cam1':0.000000,\ - 'x0_ccd2_cam1':-0.827405,\ - 'y0_ccd2_cam1':31.491388,\ - 'pix_x_ccd2_cam1':0.015000,\ - 'pix_y_ccd2_cam1':0.015000,\ - 'ang_ccd2_cam1':180.000000,\ - 'tilt_x_ccd2_cam1':0.000000,\ - 'tilt_y_ccd2_cam1':0.000000,\ - 'x0_ccd3_cam1':-31.543794,\ - 'y0_ccd3_cam1':-31.550699,\ - 'pix_x_ccd3_cam1':0.015000,\ - 'pix_y_ccd3_cam1':0.015000,\ - 'ang_ccd3_cam1':-0.006624,\ - 'tilt_x_ccd3_cam1':0.000000,\ - 'tilt_y_ccd3_cam1':0.000000,\ - 'x0_ccd4_cam1':0.922834,\ - 'y0_ccd4_cam1':-31.557268,\ - 'pix_x_ccd4_cam1':0.015000,\ - 'pix_y_ccd4_cam1':0.015000,\ - 'ang_ccd4_cam1':-0.015464,\ - 'tilt_x_ccd4_cam1':0.000000,\ - 'tilt_y_ccd4_cam1':0.000000} - - if icam == 2: - parm_dict = {'ang1_cam1':0.066596,\ - 'ang2_cam1':12.007750,\ - 'ang3_cam1':-89.889085,\ - 'fl_cam1':146.006602,\ - 'opt_coef1_cam1':1.00000140,\ - 'opt_coef2_cam1':0.23452229,\ - 'opt_coef3_cam1':0.33552009,\ - 'opt_coef4_cam1':1.92009863,\ - 'opt_coef5_cam1':12.48880182,\ - 'asymang_cam1':0.00000000,\ - 'asymfac_cam1':1.00000000,\ - 'x0_ccd1_cam1':31.615486,\ - 'y0_ccd1_cam1':31.413644,\ - 'pix_x_ccd1_cam1':0.015000,\ - 'pix_y_ccd1_cam1':0.015000,\ - 'ang_ccd1_cam1':179.993948,\ - 'tilt_x_ccd1_cam1':0.000000,\ - 'tilt_y_ccd1_cam1':0.000000,\ - 'x0_ccd2_cam1':-0.832993,\ - 'y0_ccd2_cam1':31.426621,\ - 'pix_x_ccd2_cam1':0.015000,\ - 'pix_y_ccd2_cam1':0.015000,\ - 'ang_ccd2_cam1':180.000000,\ - 'tilt_x_ccd2_cam1':0.000000,\ - 'tilt_y_ccd2_cam1':0.000000,\ - 'x0_ccd3_cam1':-31.548296,\ - 'y0_ccd3_cam1':-31.606976,\ - 'pix_x_ccd3_cam1':0.015000,\ - 'pix_y_ccd3_cam1':0.015000,\ - 'ang_ccd3_cam1':0.000298,\ - 'tilt_x_ccd3_cam1':0.000000,\ - 'tilt_y_ccd3_cam1':0.000000,\ - 'x0_ccd4_cam1':0.896018,\ - 'y0_ccd4_cam1':-31.569542,\ - 'pix_x_ccd4_cam1':0.015000,\ - 'pix_y_ccd4_cam1':0.015000,\ - 'ang_ccd4_cam1':-0.006464,\ - 'tilt_x_ccd4_cam1':0.000000,\ - 'tilt_y_ccd4_cam1':0.000000} - - if icam == 3: - parm_dict = {'ang1_cam1':0.030756,\ - 'ang2_cam1':35.978116,\ - 'ang3_cam1':-89.976802,\ - 'fl_cam1':146.039793,\ - 'opt_coef1_cam1':1.00000140,\ - 'opt_coef2_cam1':0.23920416,\ - 'opt_coef3_cam1':0.13349450,\ - 'opt_coef4_cam1':4.77768896,\ - 'opt_coef5_cam1':-1.75114744,\ - 'asymang_cam1':0.00000000,\ - 'asymfac_cam1':1.00000000,\ - 'x0_ccd1_cam1':31.575820,\ - 'y0_ccd1_cam1':31.316510,\ - 'pix_x_ccd1_cam1':0.015000,\ - 'pix_y_ccd1_cam1':0.015000,\ - 'ang_ccd1_cam1':179.968217,\ - 'tilt_x_ccd1_cam1':0.000000,\ - 'tilt_y_ccd1_cam1':0.000000,\ - 'x0_ccd2_cam1':-0.890877,\ - 'y0_ccd2_cam1':31.363511,\ - 'pix_x_ccd2_cam1':0.015000,\ - 'pix_y_ccd2_cam1':0.015000,\ - 'ang_ccd2_cam1':180.000000,\ - 'tilt_x_ccd2_cam1':0.000000,\ - 'tilt_y_ccd2_cam1':0.000000,\ - 'x0_ccd3_cam1':-31.630470,\ - 'y0_ccd3_cam1':-31.716942,\ - 'pix_x_ccd3_cam1':0.015000,\ - 'pix_y_ccd3_cam1':0.015000,\ - 'ang_ccd3_cam1':-0.024359,\ - 'tilt_x_ccd3_cam1':0.000000,\ - 'tilt_y_ccd3_cam1':0.000000,\ - 'x0_ccd4_cam1':0.824159,\ - 'y0_ccd4_cam1':-31.728751,\ - 'pix_x_ccd4_cam1':0.015000,\ - 'pix_y_ccd4_cam1':0.015000,\ - 'ang_ccd4_cam1':-0.024280,\ - 'tilt_x_ccd4_cam1':0.000000,\ - 'tilt_y_ccd4_cam1':0.000000} - - self.parm_dict_list[icam] = parm_dict - - def sky_to_sc_mat(self, sc_ra_dec_roll): - """Calculate the rotation matrix that will convert a vector in ra&dec - into the spacecraft boresite frame - """ - deg2rad = np.pi / 180.0 - # Define the 3 euler angles of rotation - xeul = np.zeros((3,), dtype=np.double) - xeul[0] = deg2rad * sc_ra_dec_roll[0] - xeul[1] = np.pi/2.0 - deg2rad*sc_ra_dec_roll[1] - xeul[2] = deg2rad * sc_ra_dec_roll[2] + np.pi - # Generate the rotation matrix from the 3 euler angles - self.rmat1 = self.eulerm323(xeul) - - def sc_to_cam_mat(self, eul): - """Calculate the rotation matrix that will convert a vector in spacecraft - into the a camera's coords - """ - deg2rad = np.pi / 180.0 - # Generate the rotation matrix from the 3 euler angles - xeul = deg2rad * eul - return self.eulerm323(xeul) - - def eulerm323(self, eul): - mat1 = self.rotm1(2, eul[0]) - mat2 = self.rotm1(1, eul[1]) - mata = np.matmul(mat2, mat1) - mat1 = self.rotm1(2, eul[2]) - rmat = np.matmul(mat1, mata) - return rmat - - def rotm1(self, ax, ang): - mat = np.zeros((3,3), dtype=np.double) - n1 = ax - n2 = np.mod((n1+1), 3) - n3 = np.mod((n2+1), 3) - sinang = np.sin(ang) - cosang = np.cos(ang) - mat[n1][n1] = 1.0 - mat[n2][n2] = cosang - mat[n3][n3] = cosang - mat[n2][n3] = sinang - mat[n3][n2] = -sinang - return mat - - def sphereToCart(self, ras, decs): - """ Convert 3d spherical coordinates to cartesian - """ - deg2rad = np.pi / 180.0 - rarads = deg2rad * ras - decrads = deg2rad * decs - sinras = np.sin(rarads) - cosras = np.cos(rarads) - sindecs = np.sin(decrads) - cosdecs = np.cos(decrads) - vec0s = cosras * cosdecs - vec1s = sinras * cosdecs - vec2s = sindecs - return vec0s, vec1s, vec2s - - def cartToSphere(self, vec): - ra = 0.0 - dec = 0.0 - norm = np.sqrt(np.sum(vec*vec)) - if (norm > 0.0): - dec = np.arcsin(vec[2] / norm) - if (not vec[0] == 0.0) or (not vec[1] == 0.0): - ra = np.arctan2(vec[1], vec[0]) - ra = np.mod(ra, 2.0*np.pi) - return ra, dec - - def star_in_fov(self, lng, lat): - deg2rad = np.pi / 180.0 - inView = False - if lat > 70.0: - vec0, vec1, vec2 = self.sphereToCart(lng, lat) - vec = np.array([vec0, vec1, vec2], dtype=np.double) - norm = np.sqrt(np.sum(vec*vec)) - if norm > 0.0: - vec = vec / norm - xlen = np.abs(np.arctan(vec[0]/vec[2])) - ylen = np.abs(np.arctan(vec[1]/vec[2])) - if (xlen <= (12.5 * deg2rad)) and (ylen <= (12.5 * deg2rad)): - inView = True - return inView - - def optics_fp(self, icam, lng_deg, lat_deg): - deg2rad = np.pi / 180.0 - thetar = np.pi / 2.0 - (lat_deg * deg2rad) - tanth = np.tan(thetar) - cphi = np.cos(deg2rad*lng_deg) - sphi = np.sin(deg2rad*lng_deg) - rfp0 = self.optcon[icam][0]*tanth - noptcon = len(self.optcon[icam]) - ii = np.arange(1, noptcon) - rfp = np.sum(self.optcon[icam][1:] * np.power(tanth, 2.0*(ii-1))) - xytmp = np.zeros((2,), dtype=np.double) - xytmp[0] = -cphi*rfp0*rfp - xytmp[1] = -sphi*rfp0*rfp - return self.make_az_asym(icam, xytmp) - - def fp_optics(self, icam, xyfp): - deg2rad = np.pi/ 180.0 - xy = self.rev_az_asym(icam, xyfp) - rfp_times_rfp0 = np.sqrt(xy[0]*xy[0] + xy[1]*xy[1]) - phirad = np.arctan2(-xy[1], -xy[0]) - phideg = phirad / deg2rad - if (phideg < 0.0): - phideg += 360.0 - thetarad = self.tanth_of_r(icam, rfp_times_rfp0) - thetadeg = thetarad / deg2rad - lng_deg = phideg - lat_deg = 90.0 - thetadeg - return lng_deg, lat_deg - - def r_of_tanth(self, icam, z): - tanth = np.tan(z) - rfp0 = self.optcon[icam][0]*tanth - noptcon = len(self.optcon[icam]) - ii = np.arange(1, noptcon) - rfp = np.sum(self.optcon[icam][1:] * np.power(tanth, 2.0*(ii-1))) - return rfp0*rfp - - def tanth_of_r(self, icam, rprp0): - - if np.abs(rprp0) > 1.0e-10: - c0 = self.optcon[icam][0] - zi = np.arctan(np.sqrt(rprp0) / c0) - def minFunc(z, icam, rp): - rtmp = self.r_of_tanth(icam, z) - return (rtmp - rprp0)*(rtmp - rprp0) - - optResult = opt.minimize(minFunc, [zi], \ - args=(icam, rprp0), method='Nelder-Mead', \ - tol=1.0e-10, \ - options={'maxiter':500}) - #print(optResult) - return optResult.x[0] - else: - return 0.0 - - def make_az_asym(self, icam, xy): - xyp = self.xyrotate(self.asymang[icam], xy) - xypa = np.zeros_like(xyp) - xypa[0] = self.asymfac[icam] * xyp[0] - xypa[1] = xyp[1] - xyout = self.xyrotate(-self.asymang[icam], xypa) - return xyout - - def rev_az_asym(self, icam, xyin): - xyp = self.xyrotate(self.asymang[icam], xyin) - xypa = np.zeros_like(xyp) - xypa[0] = xyp[0] / self.asymfac[icam] - xypa[1] = xyp[1] - xyout = self.xyrotate(-self.asymang[icam], xypa) - return xyout - - def xyrotate(self, angle_deg, xin): - deg2rad = np.pi / 180.0 - ca = np.cos(deg2rad * angle_deg) - sa = np.sin(deg2rad * angle_deg) - xyout = np.zeros_like(xin) - xyout[0] = ca*xin[0] + sa*xin[1] - xyout[1] = -sa*xin[0] + ca*xin[1] - return xyout - - def mm_to_pix(self, icam, xy): - """Convert focal plane to pixel location also need to add in the - auxillary pixels added into FFIs - """ - CCDWD_T=2048 - CCDHT_T=2058 - ROWA=44 - ROWB=44 - COLDK_T=20 - xya = np.copy(xy) - xyb = np.zeros_like(xya) - ccdpx = np.zeros_like(xya) - fitpx = np.zeros_like(xya) - if xya[0] >= 0.0: - if xya[1] >= 0.0: - iccd = 0 - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = (CCDWD_T - ccdpx[0]) + CCDWD_T + 2*ROWA + ROWB - 1.0 - fitpx[1] = (CCDHT_T - ccdpx[1]) + CCDHT_T + 2*COLDK_T - 1.0 - else: - iccd = 3 - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = ccdpx[0] + CCDWD_T + 2*ROWA + ROWB - fitpx[1] = ccdpx[1] - else: - if xya[1] >= 0.0: - iccd = 1 - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = (CCDWD_T - ccdpx[0]) + ROWA - 1.0 - fitpx[1] = (CCDHT_T - ccdpx[1]) + CCDHT_T + 2*COLDK_T - 1.0 - else: - iccd = 2 - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = ccdpx[0] + ROWA - fitpx[1] = ccdpx[1] - - return iccd, ccdpx, fitpx - - def mm_to_pix_single_ccd(self, icam, xy, iccd): - """Convert focal plane to pixel location also need to add in the - auxillary pixels added into FFIs - """ - CCDWD_T=2048 - CCDHT_T=2058 - ROWA=44 - ROWB=44 - COLDK_T=20 - xya = np.copy(xy) - xyb = np.zeros_like(xya) - ccdpx = np.zeros_like(xya) - fitpx = np.zeros_like(xya) - if iccd == 0: - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = (CCDWD_T - ccdpx[0]) + CCDWD_T + 2*ROWA + ROWB - 1.0 - fitpx[1] = (CCDHT_T - ccdpx[1]) + CCDHT_T + 2*COLDK_T - 1.0 - if iccd == 3: - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = ccdpx[0] + CCDWD_T + 2*ROWA + ROWB - fitpx[1] = ccdpx[1] - if iccd == 1: - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = (CCDWD_T - ccdpx[0]) + ROWA - 1.0 - fitpx[1] = (CCDHT_T - ccdpx[1]) + CCDHT_T + 2*COLDK_T - 1.0 - if iccd == 2: - xyb[0] = xya[0] - self.ccdxy0[icam][iccd][0] - xyb[1] = xya[1] - self.ccdxy0[icam][iccd][1] - xyccd = self.xyrotate(self.ccdang[icam][iccd], xyb) - ccdpx[0] = (xyccd[0] / self.pixsz[icam][iccd][0]) - 0.5 - ccdpx[1] = (xyccd[1] / self.pixsz[icam][iccd][1]) - 0.5 - fitpx[0] = ccdpx[0] + ROWA - fitpx[1] = ccdpx[1] - - return ccdpx, fitpx - - def pix_to_mm_single_ccd(self, icam, ccdpx, iccd): - """convert pixel to mm focal plane position - """ - xyccd = np.zeros_like(ccdpx) - xyccd[0] = (ccdpx[0] + 0.5) * self.pixsz[icam][iccd][0] - xyccd[1] = (ccdpx[1] + 0.5) * self.pixsz[icam][iccd][1] - xyb = self.xyrotate(-self.ccdang[icam][iccd], xyccd) - xya = np.zeros_like(xyb) - xya[0] = xyb[0] + self.ccdxy0[icam][iccd][0] - xya[1] = xyb[1] + self.ccdxy0[icam][iccd][1] - - return xya - - def radec2pix(self, ras, decs): - """ After the rotation matrices are defined to the actual - ra and dec to pixel coords mapping - """ - nStar = len(ras) - inCamera = np.array([], dtype=int) - ccdNum = np.array([], dtype=int) - fitsxpos = np.array([], dtype=np.double) - fitsypos = np.array([], dtype=np.double) - ccdxpos = np.array([], dtype=np.double) - ccdypos = np.array([], dtype=np.double) - - deg2rad = np.pi / 180.0 - if self.havePointing == True: - # Convert ra and dec spherical coords to cartesian - vec0s, vec1s, vec2s = self.sphereToCart(ras, decs) - for i in range(nStar): - curVec = np.array([vec0s[i], vec1s[i], vec2s[i]], dtype=np.double) - # Find the new vector in all cameras - for j in range(self.NCAM): - # Do the rotation from ra dec coords to camera coords - camVec = np.matmul(self.rmat4[j], curVec) - # Get the longitude and latitude of camera coords position - lng, lat = self.cartToSphere(camVec) - lng = lng / deg2rad - lat = lat / deg2rad - if self.star_in_fov(lng, lat): - # Get the xy focal plane position in mm - xyfp = self.optics_fp(j, lng, lat) - # Convert mm to pixels - iccd, ccdpx, fitpx = self.mm_to_pix(j, xyfp) - inCamera = np.append(inCamera, j+1) # Als code is base 0 convert to base 1 - ccdNum = np.append(ccdNum, iccd+1) # "" - fitsxpos = np.append(fitsxpos, fitpx[0]) - fitsypos = np.append(fitsypos, fitpx[1]) - ccdxpos = np.append(ccdxpos, ccdpx[0]) - ccdypos = np.append(ccdypos, ccdpx[1]) - - else: - print('Spacecraft Pointing Not specified!') - - return inCamera, ccdNum, fitsxpos, fitsypos, ccdxpos, ccdypos - - def radec2pix_nocheck_single(self, ras, decs, cam, iccd): - """ - ra and dec to pixel coords mapping - With no checks and assuming a single target and detector - Supports minimizing for reverse mode - """ - deg2rad = np.pi / 180.0 - # Convert ra and dec spherical coords to cartesian - vec0s, vec1s, vec2s = self.sphereToCart(ras, decs) - curVec = np.array([vec0s, vec1s, vec2s], dtype=np.double) - j = cam - # Do the rotation from ra dec coords to camera coords - camVec = np.matmul(self.rmat4[j], curVec) - # Get the longitude and latitude of camera coords position - lng, lat = self.cartToSphere(camVec) - lng = lng / deg2rad - lat = lat / deg2rad - # Get the xy focal plane position in mm - xyfp = self.optics_fp(j, lng, lat) - # Convert mm to pixels - ccdpx, fitpx = self.mm_to_pix_single_ccd(j, xyfp, iccd) - ccdNum = iccd+1 - fitsxpos = fitpx[0] - fitsypos = fitpx[1] - ccdxpos = ccdpx[0] - ccdypos = ccdpx[1] - return ccdNum, fitsxpos, fitsypos, ccdxpos, ccdypos, lat - - def pix2radec_nocheck_single(self, cam, iccd, ccdpx): - """ - Reverse the transform going from pixel coords to Ra & Dec - """ - deg2rad = np.pi / 180.0 - # Convert pixels to mm - xyfp = self.pix_to_mm_single_ccd(cam, ccdpx, iccd) - lng_deg, lat_deg = self.fp_optics(cam, xyfp) - vcam0, vcam1, vcam2 = self.sphereToCart(lng_deg, lat_deg) - vcam = np.array([vcam0, vcam1, vcam2], dtype=np.double) - curVec = np.matmul(np.transpose(self.rmat4[cam]), vcam) - ra, dec = self.cartToSphere(curVec) - - return ra/deg2rad, dec/deg2rad - -class TESS_Spacecraft_Pointing_Data: - #Hard coded spacecraft pointings by Sector - # When adding sectors the arg2 needs to end +1 from sector - # due to the np.arange function ending at arg2-1 - sectors = np.arange(1,70, dtype=int) - - # Arrays are broken up into the following sectors: - # Line 1: Sectors 1-5 Start Year 1 - # Line 2: Secotrs 6-9 - # Line 3: Sectors 10-13 End Year 1 - # Line 4: Sectors 14-17 Start Year 2 - # Line 5: Sectors 18-22 - # Line 6: Sectors 23-26 End Year 2 - # Line 7: Sectors 27-30 Star Year 3 - # Line 8: Sectors 31-34 - # Line 9: Sectors 35-38 - # Line 10: Sectors 39 End Year 3 - # Line 11: Sectors 40-43 Star Year 4 - # Line 12: S 44-47 - # Line 13: S 48-51 - # Line 14: S 52-55 END YEAR 4 - # Line 15: S 56-59 START YEAR 5 - # Line 16: S 60-63 - # Line 17: S 64-67 - # Line 18: S 68-69 END Year 5 - ### NOTE IF you add Sectors be sure to update the allowed range - ### for sectors in argparse arguments!!! - ras = np.array([352.6844, 16.5571, 36.3138, 55.0070, 73.5382,\ - 92.0096,110.2559,128.1156,145.9071,\ - 165.0475,189.1247,229.5885,298.6671,\ - 276.7169,280.3985,282.4427,351.2381,\ - 16.1103, 60.2026,129.3867,171.7951,197.1008,\ - 217.2879,261.4516,265.6098,270.1381,\ - 326.8525,357.2944, 18.9190, 38.3564,\ - 57.6357, 77.1891, 96.5996,115.2951,\ - 133.2035,150.9497,170.2540,195.7176,\ - 242.1981,\ - 273.0766,277.6209, 13.0140, 49.5260,\ - 89.6066,130.2960,157.6997,143.3807,\ - 179.4254,202.6424,221.8575,239.4257,\ - 266.3618,270.8126,290.1210,307.8655,\ - 324.2778,344.2275, 9.3118, 52.9755,\ - 125.6742,118.0446,135.2412,153.0613,\ - 173.2653,201.6239,259.1702,326.7691,\ - 359.2829, 20.0449], dtype=float) - - decs = np.array([-64.8531,-54.0160,-44.2590,-36.6420,-31.9349,\ - -30.5839,-32.6344,-37.7370,-45.3044,\ - -54.8165,-65.5369,-75.1256,-76.3281,\ - 62.4756, 64.0671, 66.1422, 57.8456,\ - 67.9575, 76.2343, 75.2520, 65.1924, 53.7434,\ - 43.8074, 63.1181, 61.9383, 61.5637,\ - -72.4265,-63.0056,-52.8296,-43.3178,\ - -35.7835,-31.3957,-30.7848,-33.7790,\ - -39.6871,-47.7512,-57.3725,-67.8307,\ - -76.3969,\ - 61.7450, 62.7640, 6.3337, 18.9737,\ - 24.1343, 19.0181, 10.0922, 73.1125,\ - 62.1038, 50.9532, 41.7577, 35.2333,\ - 61.8190, 61.5761, 32.6073, 37.6464,\ - 46.3448, 56.4121, 67.6524, 77.1746,\ - 77.3113,-36.0902,-42.2415,-50.6996,\ - -60.8650,-71.5724,-78.7974,-74.2796,\ - -64.2357,-54.2315], dtype=float) - - rolls = np.array([222.1532,220.4335,213.0384,202.8302,191.0517,\ - 178.6367,166.4476,155.3091,145.9163,\ - 139.1724,138.0761,153.9773,198.9378,\ - 32.2329, 55.4277, 79.4699, 41.9686,\ - 40.5453, 19.6463,334.5689,317.9495,319.6992,\ - 327.4246,317.2624,339.5293, 0.6038,\ - 214.5061,222.5216,219.7970,212.0441,\ - 201.2334,188.6263,175.5369,163.1916,\ - 152.4006,143.7306,138.1685,139.3519,\ - 161.5986,\ - 14.1539, 37.2224,292.8009,284.9617,\ - 270.1557,255.0927,248.4063,327.1020,\ - 317.4166,321.3516,329.7340,339.8650,\ - 343.1429, 3.6838, 13.4565, 24.5369,\ - 36.2524, 44.0100, 45.3615, 26.5121,\ - 337.3244,162.2198,151.5884,142.7405,\ - 137.2810,140.7443,173.9147,217.4678,\ - 226.0975,222.7721], dtype=float) - - midtimes = np.array([ 2458339.652778, 2458368.593750, 2458396.659722, 2458424.548611, 2458451.548611, \ - 2458478.104167, 2458504.697917, 2458530.256944, 2458556.722222, \ - 2458582.760417, 2458610.774306, 2458640.031250, 2458668.618056, \ - 2458697.336806, 2458724.934028, 2458751.649306, 2458777.722222, \ - 2458803.440972, 2458828.958333, 2458856.388889, 2458884.916667, 2458913.565972, \ - 2458941.829861, 2458969.263889, 2458996.909722, 2459023.107639, \ - 2459049.145833, 2459075.166667, 2459102.319444, 2459130.201389, \ - 2459158.854167, 2459186.940972, 2459215.427083, 2459241.979167, \ - 2459268.579861, 2459295.301177, 2459322.577780, 2459349.854382, \ - 2459377.130985, \ - 2459404.407588, 2459431.684191, 2459458.960794, 2459486.237397, \ - 2459513.514000, 2459540.790602, 2459568.067205, 2459595.343808, \ - 2459622.620411, 2459649.897014, 2459677.173617, 2459704.450219, \ - 2459731.726822, 2459759.003425, 2459786.280028, 2459813.556631, \ - 2459840.833234, 2459868.109837, 2459895.386439, 2459922.663042, \ - 2459949.939645, 2459977.216248, 2460004.492851, 2460031.769454, \ - 2460059.046057, 2460086.322659, 2460113.599262, 2460140.875865, \ - 2460168.152468, 2460195.429071], dtype=float) - - - camSeps = np.array([36.0, 12.0, 12.0, 36.0], dtype=float) - - - def __init__(self, trySector=None, fpgParmFileList=None, sectorOverrideFile=None): - # Convert S/C boresite pointings to ecliptic coords for each camera - - # if sectorOverrideFile is set read in the sector pointing overrides - # This can be used for mission planning or for speed ups - # by allowing the user to put in a custom list of sectors that they want - # to run over - if not sectorOverrideFile is None: - try: - dataBlock = np.genfromtxt(sectorOverrideFile, dtype=['i4','f8','f8','f8']) - self.sectors = np.array(dataBlock['f0']) - self.ras = np.array(dataBlock['f1']) - self.decs = np.array(dataBlock['f2']) - self.rolls = np.array(dataBlock['f3']) - # just put something into midtimes at this point should never get used - # because aberration is not supported with sector override file - medmidtimes = np.median(self.midtimes) - self.midtimes = np.full_like(self.ras, medmidtimes) - except: - print('There was a problem reading the Sector Override File. Exiting!') - sys.exit(1) - - # If trySector is set only keep the single requested sector - if not trySector is None: - idx = np.where(self.sectors == trySector)[0] - # Check for condition where the requested sector is not in list! - if len(idx) == 0: - print('Could not find requested sector: {0:d} in the available sector pointing data'.format(trySector)) - sys.exit(1) - self.sectors = self.sectors[idx] - self.ras = self.ras[idx] - self.decs = self.decs[idx] - self.rolls = self.rolls[idx] - self.midtimes = self.midtimes[idx] - nPoints = len(self.sectors) - self.camRa = np.zeros((4, nPoints), dtype=float) - self.camDec = np.zeros((4, nPoints), dtype=float) - # Convert S/C boresite ra and dec to camera ra and dec - for iPnt in range(nPoints): - curra = self.ras[iPnt] - curdec = self.decs[iPnt] - curroll = self.rolls[iPnt] - camposangs = np.array([180.0-curroll, 180.0-curroll, \ - 360.0-curroll, 360.0-curroll]) - camposangs = np.mod(camposangs, 360.0) - for iCam in range(4): - # Need to correct s/c roll to posang - pang = camposangs[iCam] - camra, camdec = get_radec_from_posangsep(curra, curdec, \ - pang, self.camSeps[iCam]) - self.camRa[iCam,iPnt] = camra - self.camDec[iCam,iPnt] = camdec - # Just for testing camera coords - # compare to published values -# print('{:d} {:d} {:f} {:f}'.format(self.sectors[iPnt],iCam+1,\ -# self.camRa[iCam,iPnt], self.camDec[iCam,iPnt])) - # For every pointing make a Levine pointing class object - self.fpgObjs = [] - fpg_file_list=None - if not fpgParmFileList is None: - fpg_file_list=fpgParmFileList - for iPnt in range(nPoints): - sc_ra_dec_roll = np.array([self.ras[iPnt], self.decs[iPnt], self.rolls[iPnt]]) - self.fpgObjs.append(Levine_FPG(sc_ra_dec_roll, fpg_file_list=fpg_file_list)) - - # Dump sector data out - #for i, curSec in enumerate(self.sectors): - # strout = '{0:d} {1:8.4f} {2:7.4f} {3:9.4f}'.format(curSec,\ - # self.ras[i], self.decs[i], self.rolls[i]) - # print(strout) - -def get_radec_from_posangsep(ra, dec, pa, sep): - deg2rad = np.pi/180.0 - rad2deg = 180.0/np.pi - twopi = 2.0*np.pi - pidtwo = np.pi/2.0 - rar = ra*deg2rad - decr = dec*deg2rad - par = pa*deg2rad - sepr = sep*deg2rad - c = pidtwo - decr - bigB = par - a = sepr - b = np.arccos((np.cos(c)*np.cos(a) + np.sin(c)*np.sin(a)*np.cos(bigB))) - newdec = pidtwo - b - delalp = np.arccos(np.min([(np.cos(sepr)-np.sin(decr)*np.sin(newdec))/(np.cos(decr)*np.cos(newdec)),1.0])) - if pa > 180.0: - newra = rar - delalp - else: - newra = rar + delalp -# print(pa, newra*rad2deg, rar*rad2deg, delalp*rad2deg) - newra = np.mod(newra, twopi) - return newra*rad2deg, newdec*rad2deg - - -class target_info: - def __init__(self): - self.ticid = int(0) - self.ra = 0.0 - self.dec = 0.0 - self.eclipLong = 0.0 - self.eclipLat = 0.0 - self.sectors = np.array([], dtype=int) - self.onSiliconFlag = np.array([], dtype=int) - self.possibleOnSiliconFlag = np.array([], dtype=int) - self.cameras = np.array([], dtype=int) - self.xpxs = np.array([], dtype=float) - self.ypxs = np.array([], dtype=float) - -def make_target_objects(tic, ra, dec): - starList = [] - for i, curTic in enumerate(tic): - curRa = ra[i] - curDec = dec[i] - # instantiate target object - curTarg = target_info() - curTarg.ra = curRa - curTarg.dec = curDec - curTarg.ticid = tic[i] - # Convert ra and dec coords to ecliptic - planCoords = SkyCoord(curRa, curDec, unit='deg') - planEclipCoords = planCoords.transform_to(frame='barycentrictrueecliptic') - curTarg.eclipLat = planEclipCoords.lat.deg - curTarg.eclipLong = planEclipCoords.lon.deg - starList.append(curTarg) - return starList - -def doRoughPosition(targinfo, scinfo): - # Return the combinations of sector and detectors that can possibly observe - # target - # go through each position in the spacecraft info class - tRa = targinfo.ra - tDec = targinfo.dec - FOVDeg = 17.68 - nPoints = len(scinfo.sectors) - targCoords = SkyCoord(tRa, tDec, unit='deg', frame='icrs') - for iPnt in range(nPoints): - for iCam in range(4): - camRa = scinfo.camRa[iCam,iPnt] - camDec = scinfo.camDec[iCam,iPnt] - camCenter = SkyCoord(camRa, np.max([-89.99999,camDec]), unit='deg', frame='icrs') - posAngs = camCenter.position_angle(targCoords) - seps = camCenter.separation(targCoords) - # Check for potentially on silicon - if seps.deg < FOVDeg: - # Append potential pointing camera combo to targets list - targinfo.sectors = np.append(targinfo.sectors, scinfo.sectors[iPnt]) - targinfo.onSiliconFlag = np.append(targinfo.onSiliconFlag, 0) - targinfo.possibleOnSiliconFlag = np.append(targinfo.possibleOnSiliconFlag, 1) - targinfo.cameras = np.append(targinfo.cameras, iCam+1) - targinfo.xpxs = np.append(targinfo.xpxs, 0.0) - targinfo.ypxs = np.append(targinfo.ypxs, 0.0) - return targinfo - -## [Mast Query] -def mastQuery(request,proxy_uri=None): - - host='mast.stsci.edu' - # Grab Python Version - version = ".".join(map(str, sys.version_info[:3])) - - # Create Http Header Variables - headers = {"Content-type": "application/x-www-form-urlencoded", - "Accept": "text/plain", - "User-agent":"python-requests/"+version} - - # Encoding the request as a json string - requestString = json.dumps(request) - requestString = urlencode(requestString) - - # opening the https connection - if None == proxy_uri: - conn = httplib.HTTPSConnection(host) - else: - port = 443 - url = urlparse(proxy_uri) - conn = httplib.HTTPSConnection(url.hostname,url.port) - - if url.username and url.password: - auth = '%s:%s' % (url.username, url.password) - headers['Proxy-Authorization'] = 'Basic ' + str(base64.b64encode(auth.encode())).replace("b'", "").replace("'", "") - conn.set_tunnel(host, port, headers) - - # Making the query - conn.request("POST", "/api/v0/invoke", "request="+requestString, headers) - - # Getting the response - resp = conn.getresponse() - head = resp.getheaders() - content = resp.read().decode('utf-8') - - # Close the https connection - conn.close() - - return head,content -## [Mast Query] - -def fileOutputHeader(fp, fpgParmFileList=None): - # output a header to the file - fp.write('# stars2px.py - Convert Target RA and Dec to TESS spacecraft pixel coordinates\n') - fp.write('# Original starspx.c by Alan Levine (MIT Kavli Institute)\n') - fp.write('# Python translation by Christopher Burke (MIT Kavli Institute)\n') - fp.write('# Output columns Pipe Delimited; 16 header lines\n') - fp.write('# File Creation: {:}\n'.format(datetime.datetime.now())) - if fpgParmFileList is None: - fp.write('# FPG Model Default\n') - else: - fp.write('# FPG Model {:s} {:s} {:s} {:s}\n'.format(fpgParmFileList[0], \ - fpgParmFileList[1],fpgParmFileList[2],fpgParmFileList[3])) - fp.write('# 1 [int] Input TIC ID\n') - fp.write('# 2 [degree] Input or MAST TIC query target RA\n') - fp.write('# 3 [degree] Input or MAST TIC query target Dec\n') - fp.write('# 4 [degree] Ecliptic Longitude\n') - fp.write('# 5 [degree] Ecliptic Latitude\n') - fp.write('# 6 [int] - Observing Sector number for target\n') - fp.write('# 7 [int] - Camera number for target\n') - fp.write('# 8 [int] - Detector number for target\n') - fp.write('# 9 [float] - Column pixel location for target\n') - fp.write('# 10 [float] - Row pixel location for target\n') - - -def tess_stars2px_function_entry(starIDs, starRas, starDecs, trySector=None, scInfo=None, \ - fpgParmFileList=None, combinedFits=False,\ - noCollateral=False, aberrate=False, sectorOverrideFile=None): - if scInfo == None: - # Instantiate Spacecraft position info - scinfo = TESS_Spacecraft_Pointing_Data(trySector=trySector, fpgParmFileList=fpgParmFileList, \ - sectorOverrideFile=sectorOverrideFile) - else: - scinfo = scInfo - # Now make list of the star objects - starList = make_target_objects(np.atleast_1d(starIDs), \ - np.atleast_1d(starRas), np.atleast_1d(starDecs)) - # Make rough determination as to which pointing camera combos are worth - # Checking in detail and then do detailed checking - findAny=False - outID = np.array([-1], dtype=np.int64) - outEclipLong = np.array([-1.0], dtype=float) - outEclipLat = np.array([-1.0], dtype=float) - outSec = np.array([-1], dtype=int) - outCam = np.array([-1], dtype=int) - outCcd = np.array([-1], dtype=int) - outColPix = np.array([-1.0], dtype=float) - outRowPix = np.array([-1.0], dtype=float) - for i, curTarg in enumerate(starList): - for curSec in scinfo.sectors: - starRas = np.array([curTarg.ra]) - starDecs = np.array([curTarg.dec]) - idxSec = np.where(scinfo.sectors == curSec)[0][0] - # Apply an approximate aberration correction - if aberrate: - useTime = Time(scinfo.midtimes[idxSec], format='jd') - # Make coordinate object in ICRS coordinates - ccat = SkyCoord(ra=starRas * u.deg, - dec=starDecs * u.deg, - obstime=useTime, frame='icrs') - # convert to Geocentric aberrated coordinates - # This is only an approximation to TESS - # because TESS orbits Earth and has - # velocity <=4km/s relative to Earth whereas Earth is 30km/s - cgcrs = ccat.transform_to('gcrs') - starRas = np.array(cgcrs.ra.degree) - starDecs = np.array(cgcrs.dec.degree) - - starInCam, starCcdNum, starFitsXs, starFitsYs, starCcdXs, starCcdYs = scinfo.fpgObjs[idxSec].radec2pix(\ - starRas, starDecs) - for jj, cam in enumerate(starInCam): - # SPOC calibrated FFIs have 44 collateral pixels in x and are 1 based - xUse = starCcdXs[jj] + 45.0 - yUse = starCcdYs[jj] + 1.0 - xMin = 44.0 - ymaxCoord = 2049 - xmaxCoord = 2093 - if combinedFits: - xUse = starFitsXs[jj] - yUse = starFitsYs[jj] - xmaxCoord = 4097 - ymaxCoord = 4097 - xMin = 0.0 - if noCollateral: - xUse = starCcdXs[jj] - yUse = starCcdYs[jj] - xMin = 0.0 - if xUse>xMin and yUse>0 and xUse:@:\" ") - parser.add_argument("-a", "--aberrate", action='store_true',\ - help="Apply approximate aberration correction to input coordinates. Uses astropy GCRS coordinate frame to approximate TESS aberration") - parser.add_argument("-sovr", "--sector_override", type=argparse.FileType('r'), \ - help="Filename for sector pointing overrides SectorNum [Int]; RA(deg) [Float]; Dec(deg) [Float]; Roll(deg) [Float]; in white space delimited text file Column 1, 2, 3, and 4 respectively") - args = parser.parse_args() - -# DEBUG BLOCK for hard coding input parameters and testing -# class test_arg: -# def __init__(self): -# #self.ticId = 281541555 -# self.ticId = None -# self.coord = None -# self.name = ['KIC 6443093'] -# self.coord = [330.6803807390524, 42.27777178] -# self.inputFile = None -# self.sector = None -# self.fpgParameterFiles = None -# self.outputFile = None -# self.combinedFits = False -# self.noCollateral = False -# self.reverse = None -# self.reverse = [2,1,2,2092.0,1.0] -# self.sectorOverrideFile = None -# args = test_arg() - - # At least one Mode -t -c -f -r -n must have been specified - if (args.ticId is None) and (args.coord is None) and (args.inputFile is None) and (args.reverse is None) and (args.name is None): - print('You must specify one and only one mode -t, -c, -f, -r, -n') - print('`python stars2px.py -h\' for help') - sys.exit(1) - - # sector overrides are currently not allowed with the aberration flag - if (not (args.sector_override is None)) and args.aberrate: - print('Aberration flag (-a) is not supported with the sector override file input (-sovr)') - sys.exit(1) - - # Check for reverse mode - if (args.reverse is None): - # Do single coords first - if args.coord is not None and args.name is None: - nTarg = 1 - starTics = np.array([0], dtype=np.int64) - starRas = np.array([args.coord[0]], dtype=float) - starDecs = np.array([args.coord[1]], dtype=float) - elif args.coord is None and args.name is not None: - nTarg = 1 - starTics = np.array([0], dtype=np.int64) - - # Name resolve in try except for detecting problem - try: - coordinate = SkyCoord.from_name(args.name[0]) - print("Coordinates for {0}: ({1}, {2})" - .format(args.name[0], coordinate.ra.degree, - coordinate.dec.degree)) - starRas = np.array([coordinate.ra.degree], dtype=float) - starDecs = np.array([coordinate.dec.degree], dtype=float) - except: - print("Could not resolve: {0}".format(args.name[0])) - sys.exit(1) - else: - if not (args.inputFile is None): # Check for input file list next - # Read in star positions in input - # Now go through stars - starFile = args.inputFile - dataBlock = np.genfromtxt(starFile, dtype=['i4','f8','f8']) - starTics = np.atleast_1d(dataBlock['f0']) - starRas = np.atleast_1d(dataBlock['f1']) - starDecs = np.atleast_1d(dataBlock['f2']) - else: - # Must have requested MAST query with TIC ID - # Make a list of TICs using strings - starTics = np.array([args.ticId], dtype=np.int64) - ticStringList = ['{0:d}'.format(x) for x in starTics] - # Setup mast query - request = {'service':'Mast.Catalogs.Filtered.Tic', \ - 'params':{'columns':'*', 'filters':[{ \ - 'paramName':'ID', 'values':ticStringList}]}, \ - 'format':'json', 'removenullcolumns':True} - if args.proxy_uri is None: - headers, outString = mastQuery(request) - else: - headers, outString = mastQuery(request,args.proxy_uri[0]) - outObject = json.loads(outString) - starRas = np.array([x['ra'] for x in outObject['data']]) - starDecs = np.array([x['dec'] for x in outObject['data']]) - - trySector = None - if not (args.sector is None): - trySector = args.sector - fpgParmFileList = None - if not (args.fpgParameterFiles is None): - fpgParmFileList = [x for x in args.fpgParameterFiles] - - sectorOverrideFile = None - if not (args.sector_override is None): - sectorOverrideFile = args.sector_override - - - # Instantiate Spacecraft position info - scinfo = TESS_Spacecraft_Pointing_Data(trySector=trySector, fpgParmFileList=fpgParmFileList, \ - sectorOverrideFile=sectorOverrideFile) - # Open output file if requested - # if not (args.outputFile is None): - # fout = open(args.outputFile, 'w') - - # Add header to outputfile - if not (args.outputFile is None): - fileOutputHeader(args.outputFile, fpgParmFileList=fpgParmFileList) - else: - # add single line header to stdout - print('# TIC | RA | Dec | EclipticLong | EclipticLat | Sector | Camera | Ccd | ColPix | RowPix | EdgeWarn') - # Now make list of the star objects - starList = make_target_objects(starTics, starRas, starDecs) - #print('Finished converting coords to ecliptic') - # Make rough determination as to which pointing camera combos are worth - # Checking in detail and then do detailed checking - findAny=False - for i, curTarg in enumerate(starList): - for curSec in scinfo.sectors: - starRas = np.array([curTarg.ra]) - starDecs = np.array([curTarg.dec]) - idxSec = np.where(scinfo.sectors == curSec)[0][0] - # Apply an approximate aberration correction - if args.aberrate: - useTime = Time(scinfo.midtimes[idxSec], format='jd') - # Make coordinate object in ICRS coordinates - ccat = SkyCoord(ra=starRas * u.deg, - dec=starDecs * u.deg, - obstime=useTime, frame='icrs') - # convert to Geocentric aberrated coordinates - # This is only an approximation to TESS - # because TESS orbits Earth and has - # velocity <=4km/s relative to Earth whereas Earth is 30km/s - cgcrs = ccat.transform_to('gcrs') - starRas = np.array(cgcrs.ra.degree) - starDecs = np.array(cgcrs.dec.degree) - starInCam, starCcdNum, starFitsXs, starFitsYs, starCcdXs, starCcdYs = scinfo.fpgObjs[idxSec].radec2pix(\ - starRas, starDecs) - for jj, cam in enumerate(starInCam): - # SPOC calibrated FFIs have 44 collateral pixels in x and are 1 based - xUse = starCcdXs[jj] + 45.0 - yUse = starCcdYs[jj] + 1.0 - xMin = 44.0 - ymaxCoord = 2049 - xmaxCoord = 2093 - if args.combinedFits: - xUse = starFitsXs[jj] - yUse = starFitsYs[jj] - xmaxCoord = 4097 - ymaxCoord = 4097 - xMin = 0.0 - if args.noCollateral: - xUse = starCcdXs[jj] - yUse = starCcdYs[jj] - xMin = 0.0 - if xUse>xMin and yUse>0 and xUse=(xmaxCoord-edgePix): - edgeWarn = 1 - if yUse<=edgePix: - edgeWarn = 1 - if yUse>=(ymaxCoord-edgePix): - edgeWarn = 1 - strout = '{:09d} | {:10.6f} | {:10.6f} | {:10.6f} | {:10.6f} | {:2d} | {:1d} | {:1d} | {:11.6f} | {:11.6f} | {:1d}'.format(\ - curTarg.ticid, curTarg.ra, curTarg.dec, curTarg.eclipLong,\ - curTarg.eclipLat, curSec, starInCam[jj], starCcdNum[jj], xUse, yUse, edgeWarn) - if not (args.outputFile is None): - args.outputFile.write('{:s}\n'.format(strout)) - else: - print(strout) - - if not findAny: - print('No Target/s were found to be on detectors') - # Do reverse mode - else: - trySector = int(args.reverse[0]) - fpgParmFileList = None - if not (args.fpgParameterFiles is None): - fpgParmFileList = [x for x in args.fpgParameterFiles] - - sectorOverrideFile = None - if not (args.sector_override is None): - sectorOverrideFile = args.sector_override - - # Instantiate Spacecraft position info - scinfo = TESS_Spacecraft_Pointing_Data(trySector=trySector, fpgParmFileList=fpgParmFileList,\ - sectorOverrideFile=sectorOverrideFile) - # Camera center ra and dec - iCam = int(args.reverse[1])-1 - iCcd = int(args.reverse[2])-1 - colWnt = float(args.reverse[3]) - rowWnt = float(args.reverse[4]) - - # Lets try going direct route with inversion of codes - starCcdXs = colWnt - 45.0 - starCcdYs = rowWnt - 1.0 - idxSec = np.where(scinfo.sectors == trySector)[0][0] - ra_deg, dec_deg = scinfo.fpgObjs[idxSec].pix2radec_nocheck_single(iCam, iCcd, [starCcdXs, starCcdYs]) - print(ra_deg, dec_deg) - diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_tesspoint.py b/tests/test_tesspoint.py new file mode 100644 index 0000000..a33d2c0 --- /dev/null +++ b/tests/test_tesspoint.py @@ -0,0 +1,6 @@ +from tesspoint import TESSPoint, footprint + + +def test_tesspoint(): + tp = TESSPoint(1, 1, 1) + tp.pix2radec(footprint())