From 12a5264fbcf3e00b3a39a1707014fa54bdcfbf1e Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:39:11 +0100 Subject: [PATCH 01/26] Add first version of docs --- docs/Makefile | 20 +++ docs/_static/pyvisgen.css | 118 +++++++++++++++++ docs/_templates/base.rst | 2 + docs/_templates/class.rst | 2 + docs/_templates/module.rst | 2 + docs/api-reference/fits/data.rst | 16 +++ docs/api-reference/fits/index.rst | 31 +++++ docs/api-reference/fits/writer.rst | 16 +++ docs/api-reference/gridding/index.rst | 16 +++ docs/api-reference/index.rst | 9 ++ docs/api-reference/layouts/index.rst | 16 +++ docs/api-reference/simulation/array.rst | 16 +++ docs/api-reference/simulation/data_set.rst | 16 +++ docs/api-reference/simulation/index.rst | 34 +++++ docs/api-reference/simulation/observation.rst | 16 +++ docs/api-reference/simulation/scan.rst | 16 +++ docs/api-reference/simulation/visibility.rst | 16 +++ docs/api-reference/utils/config.rst | 16 +++ docs/api-reference/utils/data.rst | 16 +++ docs/api-reference/utils/index.rst | 31 +++++ docs/changelog.rst | 5 + docs/conf.py | 123 ++++++++++++++++++ docs/developer-guide/getting-started.rst | 51 ++++++++ docs/developer-guide/index.rst | 10 ++ docs/index.rst | 121 +++++++++++++++++ docs/make.bat | 35 +++++ docs/user-guide/getting-started.rst | 26 ++++ docs/user-guide/index.rst | 10 ++ 28 files changed, 806 insertions(+) create mode 100644 docs/Makefile create mode 100644 docs/_static/pyvisgen.css create mode 100644 docs/_templates/base.rst create mode 100644 docs/_templates/class.rst create mode 100644 docs/_templates/module.rst create mode 100644 docs/api-reference/fits/data.rst create mode 100644 docs/api-reference/fits/index.rst create mode 100644 docs/api-reference/fits/writer.rst create mode 100644 docs/api-reference/gridding/index.rst create mode 100644 docs/api-reference/index.rst create mode 100644 docs/api-reference/layouts/index.rst create mode 100644 docs/api-reference/simulation/array.rst create mode 100644 docs/api-reference/simulation/data_set.rst create mode 100644 docs/api-reference/simulation/index.rst create mode 100644 docs/api-reference/simulation/observation.rst create mode 100644 docs/api-reference/simulation/scan.rst create mode 100644 docs/api-reference/simulation/visibility.rst create mode 100644 docs/api-reference/utils/config.rst create mode 100644 docs/api-reference/utils/data.rst create mode 100644 docs/api-reference/utils/index.rst create mode 100644 docs/changelog.rst create mode 100644 docs/conf.py create mode 100644 docs/developer-guide/getting-started.rst create mode 100644 docs/developer-guide/index.rst create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/user-guide/getting-started.rst create mode 100644 docs/user-guide/index.rst diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_static/pyvisgen.css b/docs/_static/pyvisgen.css new file mode 100644 index 0000000..de614fd --- /dev/null +++ b/docs/_static/pyvisgen.css @@ -0,0 +1,118 @@ +@import url('https://fonts.googleapis.com/css?family=Roboto:700|Roboto:400'); +@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +body { + font-family: 'Roboto'; + font-weight: 400; +} + +h1, h2, h3, h4, h5 { +font-family: 'Roboto'; + font-weight: 700; +} + +html {font-size: 100%;} /* 16px */ + +h1 { + font-size: 2.489rem; + background-image: -webkit-gradient( + linear, + left top, + right top, + color-stop(0.03, var(--pst-color-primary)), + color-stop(0.40, var(--pst-color-secondary)), + color-stop(0.97, var(--pst-color-primary-highlight)) +); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +h1 .docutils { + -webkit-text-fill-color: var(--pst-color-inline-code); +} + +h2 {font-size: 2.074rem; /* 33.12px */} + +h3 {font-size: 1.728rem; /* 27.68px */} + +h4 {font-size: 1.440rem; /* 23.04px */} + +h5 {font-size: 1.200rem; /* 19.2px */} + +small {font-size: 0.833rem; /* 13.28px */} + + +:root { + --pst-font-family-monospace: "Fira Mono"; +} + + +/*:root[data-theme="light"] {*/ +/* --pst-color-text: #090704;*/ +/* --pst-color-background: #faf8f5;*/ +/* --pst-color-primary: #eb9f1b;*/ +/* --pst-color-secondary: #a1d19f;*/ +/* --pst-color-primary-highlight: #83c39c;*/ +/* --pst-color-inline-code: var(--pst-color-primary-highlight);*/ +/* --bd-header-announcement-color: var(--pst-color-text);*/ +/* --bd-header-announcement-background: var(--pst-color-secondary);*/ +/*}*/ +/*:root[data-theme="dark"] {*/ +/* --pst-color-text: #faf8f4;*/ +/* --pst-color-background: #0a0805;*/ +/* --pst-color-primary: #eb9f1b;*/ +/* --pst-color-secondary: #a1d19f;*/ +/* --pst-color-primary-highlight: #83c39c;*/ +/* --pst-color-inline-code: var(--pst-color-primary-highlight);*/ +/* --bd-header-announcement-color: var(--pst-color-background);*/ +/* --bd-header-announcement-background: var(--pst-color-primary-highlight);*/ +/*}*/ + + +dt:target { + background-color: var(--pst-color-surface); + border-radius: 10px; + padding: 5px 5px 5px 5px; +} + +.highlight pre { + border-radius: 20px; +} + +.bd-header-announcement { + color: var(--bd-header-announcement-color); + background-color: var(--bd-header-announcement-background); +} + +/* sphinx-design */ +.sd-card { + border-radius: 10px; + padding: 30px 10px 20px 10px; + margin: 10px 0px; +} + +.sd-card .sd-card-header .sd-card-text { + margin: 0px; +} + +.sd-card .sd-card-header { + border: none; + text-align: center; + font-size: var(--pst-font-size-h4); + font-weight: bold; + padding: 0.5rem 0rem 0.5rem 0rem; +} + +.sd-card .sd-card-footer { + border: none; +} + +.sd-card .sd-card-footer .sd-card-text { + max-width: 220px; + margin-left: auto; + margin-right: auto; +} + +.sd-card .sd-btn { + border-radius: 20px; +} diff --git a/docs/_templates/base.rst b/docs/_templates/base.rst new file mode 100644 index 0000000..1621719 --- /dev/null +++ b/docs/_templates/base.rst @@ -0,0 +1,2 @@ +{% extends "autosummary_core/base.rst" %} +{# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #} diff --git a/docs/_templates/class.rst b/docs/_templates/class.rst new file mode 100644 index 0000000..0fa59f2 --- /dev/null +++ b/docs/_templates/class.rst @@ -0,0 +1,2 @@ +{% extends "autosummary_core/class.rst" %} +{# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #} diff --git a/docs/_templates/module.rst b/docs/_templates/module.rst new file mode 100644 index 0000000..230cd6e --- /dev/null +++ b/docs/_templates/module.rst @@ -0,0 +1,2 @@ +{% extends "autosummary_core/module.rst" %} +{# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #} diff --git a/docs/api-reference/fits/data.rst b/docs/api-reference/fits/data.rst new file mode 100644 index 0000000..6d9ae7a --- /dev/null +++ b/docs/api-reference/fits/data.rst @@ -0,0 +1,16 @@ +.. _data: + +******************************** +Data (:mod:`pyvisgen.fits.data`) +******************************** + +.. currentmodule:: pyvisgen.fits.data + +Data submodule of :mod:`pyvisgen.fits`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.fits.data + :inherited-members: diff --git a/docs/api-reference/fits/index.rst b/docs/api-reference/fits/index.rst new file mode 100644 index 0000000..de2e08e --- /dev/null +++ b/docs/api-reference/fits/index.rst @@ -0,0 +1,31 @@ +.. _fits: + +*********************************** +FITS Handler (:mod:`pyvisgen.fits`) +*********************************** + +.. currentmodule:: pyvisgen.fits + + +Introduction +============ + +This module include all the functions and classes needed for handling FITS files. + + +Submodules +========== + +.. toctree:: + :maxdepth: 1 + :glob: + + data + writer + + +Reference/API +============= + +.. automodapi:: pyvisgen.fits + :no-inheritance-diagram: diff --git a/docs/api-reference/fits/writer.rst b/docs/api-reference/fits/writer.rst new file mode 100644 index 0000000..931673d --- /dev/null +++ b/docs/api-reference/fits/writer.rst @@ -0,0 +1,16 @@ +.. _writer: + +***************************************** +FITS Writer (:mod:`pyvisgen.fits.writer`) +***************************************** + +.. currentmodule:: pyvisgen.fits.writer + +FITS writer submodule of :mod:`pyvisgen.fits`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.fits.writer + :inherited-members: diff --git a/docs/api-reference/gridding/index.rst b/docs/api-reference/gridding/index.rst new file mode 100644 index 0000000..ba07831 --- /dev/null +++ b/docs/api-reference/gridding/index.rst @@ -0,0 +1,16 @@ +.. _gridding: + +*********************************** +Gridding (:mod:`pyvisgen.gridding`) +*********************************** + +.. currentmodule:: pyvisgen.gridding + +Gridding module of pyvisgen. + + +Reference/API +============= + +.. automodapi:: pyvisgen.gridding + :inherited-members: diff --git a/docs/api-reference/index.rst b/docs/api-reference/index.rst new file mode 100644 index 0000000..f22811f --- /dev/null +++ b/docs/api-reference/index.rst @@ -0,0 +1,9 @@ +************* +API Reference +************* + +.. toctree:: + :maxdepth: 1 + :glob: + + */index diff --git a/docs/api-reference/layouts/index.rst b/docs/api-reference/layouts/index.rst new file mode 100644 index 0000000..3fc719b --- /dev/null +++ b/docs/api-reference/layouts/index.rst @@ -0,0 +1,16 @@ +.. _layouts: + +********************************* +Layouts (:mod:`pyvisgen.layouts`) +********************************* + +.. currentmodule:: pyvisgen.layouts + +Layouts module of pyvisgen. + + +Reference/API +============= + +.. automodapi:: pyvisgen.layouts + :inherited-members: diff --git a/docs/api-reference/simulation/array.rst b/docs/api-reference/simulation/array.rst new file mode 100644 index 0000000..d71723b --- /dev/null +++ b/docs/api-reference/simulation/array.rst @@ -0,0 +1,16 @@ +.. array: + +**************************************** +Array (:mod:`pyvisgen.simulation.array`) +**************************************** + +.. currentmodule:: pyvisgen.simulation.array + +Scan submodule of :mod:`pyvisgen.simulation`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation.array + :inherited-members: diff --git a/docs/api-reference/simulation/data_set.rst b/docs/api-reference/simulation/data_set.rst new file mode 100644 index 0000000..741a63f --- /dev/null +++ b/docs/api-reference/simulation/data_set.rst @@ -0,0 +1,16 @@ +.. _data_set: + +********************************************** +Data Set (:mod:`pyvisgen.simulation.data_set`) +********************************************** + +.. currentmodule:: pyvisgen.simulation.visibility + +Data set submodule of :mod:`pyvisgen.simulation`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation.data_set + :inherited-members: diff --git a/docs/api-reference/simulation/index.rst b/docs/api-reference/simulation/index.rst new file mode 100644 index 0000000..837daf6 --- /dev/null +++ b/docs/api-reference/simulation/index.rst @@ -0,0 +1,34 @@ +.. _simulation: + +*************************************** +Simulation (:mod:`pyvisgen.simulation`) +*************************************** + +.. currentmodule:: pyvisgen.simulation + + +Introduction +============ + +This module include all the functions and classes needed for the simulation of an observation. + + +Submodules +========== + +.. toctree:: + :maxdepth: 1 + :glob: + + array + data_set + observation + scan + visibility + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation + :no-inheritance-diagram: diff --git a/docs/api-reference/simulation/observation.rst b/docs/api-reference/simulation/observation.rst new file mode 100644 index 0000000..bda3eed --- /dev/null +++ b/docs/api-reference/simulation/observation.rst @@ -0,0 +1,16 @@ +.. _observation: + +**************************************************** +Observation (:mod:`pyvisgen.simulation.observation`) +**************************************************** + +.. currentmodule:: pyvisgen.simulation.observation + +Observation submodule of pyvisgen. + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation.observation + :inherited-members: diff --git a/docs/api-reference/simulation/scan.rst b/docs/api-reference/simulation/scan.rst new file mode 100644 index 0000000..97ad498 --- /dev/null +++ b/docs/api-reference/simulation/scan.rst @@ -0,0 +1,16 @@ +.. scan: + +************************************** +Scan (:mod:`pyvisgen.simulation.scan`) +************************************** + +.. currentmodule:: pyvisgen.simulation.scan + +Scan submodule of :mod:`pyvisgen.simulation`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation.scan + :inherited-members: diff --git a/docs/api-reference/simulation/visibility.rst b/docs/api-reference/simulation/visibility.rst new file mode 100644 index 0000000..25a0474 --- /dev/null +++ b/docs/api-reference/simulation/visibility.rst @@ -0,0 +1,16 @@ +.. _visibility: + +************************************************** +Visibility (:mod:`pyvisgen.simulation.visibility`) +************************************************** + +.. currentmodule:: pyvisgen.simulation.visibility + +Visibility simulation submodule of :mod:`pyvisgen.simulation`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.simulation.visibility + :inherited-members: diff --git a/docs/api-reference/utils/config.rst b/docs/api-reference/utils/config.rst new file mode 100644 index 0000000..4d66dc4 --- /dev/null +++ b/docs/api-reference/utils/config.rst @@ -0,0 +1,16 @@ +.. _utils_config: + +************************************* +Config (:mod:`pyvisgen.utils.config`) +************************************* + +.. currentmodule:: pyvisgen.utils.config + +Config utility submodule of :mod:`pyvisgen.utils`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.utils.config + :inherited-members: diff --git a/docs/api-reference/utils/data.rst b/docs/api-reference/utils/data.rst new file mode 100644 index 0000000..a7bf249 --- /dev/null +++ b/docs/api-reference/utils/data.rst @@ -0,0 +1,16 @@ +.. _utils_data: + +********************************* +Data (:mod:`pyvisgen.utils.data`) +********************************* + +.. currentmodule:: pyvisgen.utils.data + +Data utility submodule of :mod:`pyvisgen.utils`. + + +Reference/API +============= + +.. automodapi:: pyvisgen.utils.data + :inherited-members: diff --git a/docs/api-reference/utils/index.rst b/docs/api-reference/utils/index.rst new file mode 100644 index 0000000..915bbdb --- /dev/null +++ b/docs/api-reference/utils/index.rst @@ -0,0 +1,31 @@ +.. _utils: + +***************************** +Utils (:mod:`pyvisgen.utils`) +***************************** + +.. currentmodule:: pyvisgen.utils + + +Introduction +============ + +This module contains utility functions. + + +Submodules +========== + +.. toctree:: + :maxdepth: 1 + :glob: + + config + data + + +Reference/API +============= + +.. automodapi:: pyvisgen.utils + :no-inheritance-diagram: diff --git a/docs/changelog.rst b/docs/changelog.rst new file mode 100644 index 0000000..2120f07 --- /dev/null +++ b/docs/changelog.rst @@ -0,0 +1,5 @@ +********** +Change Log +********** + +.. include:: ../CHANGES.rst diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..acb81a3 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +import datetime +import sys +from pathlib import Path + +import pyvisgen + +if sys.version_info < (3, 11): + import tomli as tomllib +else: + import tomllib + +pyproject_path = Path(__file__).parent.parent / "pyproject.toml" +pyproject = tomllib.loads(pyproject_path.read_text()) + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.coverage", + "sphinx.ext.viewcode", + "sphinx_automodapi.automodapi", + "sphinx_automodapi.smart_resolver", + "matplotlib.sphinxext.plot_directive", + "numpydoc", + "sphinx_design", + "IPython.sphinxext.ipython_console_highlighting", +] + +numpydoc_show_class_members = False +numpydoc_class_members_toctree = False + +templates_path = ["_templates"] +exclude_patterns = [ + "_build", + "Thumbs.db", + ".DS_Store", + "changes", + "*.log", +] + +source_suffix = ".rst" +master_doc = "index" + + +project = pyproject["project"]["name"] +author = pyproject["project"]["authors"][0]["name"] +copyright = "{}. Last updated {}".format( + author, datetime.datetime.now().strftime("%d %b %Y %H:%M") +) +python_requires = pyproject["project"]["requires-python"] + +# make some variables available to each page +rst_epilog = f""" +.. |python_requires| replace:: {python_requires} +""" + + +version = pyvisgen.__version__ +# The full version, including alpha/beta/rc tags. +release = version + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = "pydata_sphinx_theme" +html_static_path = ["_static"] + +html_file_suffix = ".html" + +html_css_files = ["pyvisgen.css"] + + +html_theme_options = { + "github_url": "https://github.com/radionets-project/pyvisgen", + "header_links_before_dropdown": 5, + "navbar_start": ["navbar-logo"], + "navigation_with_keys": False, + # "use_edit_page_button": True, + "icon_links_label": "Quick Links", + "icon_links": [ + { + "name": "Radionets Project", + "url": "https://github.com/radionets-project", + "type": "url", + "icon": "https://avatars.githubusercontent.com/u/77392854?s=200&v=4", # noqa: E501 + }, + ], + "announcement": """ +

pyvisgen is not stable yet, so expect large and rapid + changes to structure and functionality as we explore various + design choices before the 1.0 release.

+ """, +} + +html_title = f"{project}" +htmlhelp_basename = project + "docs" + + +# Configuration for intersphinx +intersphinx_mapping = { + "astropy": ("https://docs.astropy.org/en/stable", None), + "ipywidgets": ("https://ipywidgets.readthedocs.io/en/stable", None), + "joblib": ("https://joblib.readthedocs.io/en/stable", None), + "matplotlib": ("https://matplotlib.org/stable", None), + "numba": ("https://numba.readthedocs.io/en/stable", None), + "numpy": ("https://numpy.org/doc/stable", None), + "pandas": ("https://pandas.pydata.org/pandas-docs/stable", None), + "pytest": ("https://docs.pytest.org/en/stable", None), + "python": ("https://docs.python.org/3", None), + "scipy": ("https://docs.scipy.org/doc/scipy", None), + "setuptools": ("https://setuptools.pypa.io/en/stable", None), + "sklearn": ("https://scikit-learn.org/stable", None), +} + + +suppress_warnings = [ + "intersphinx.external", +] diff --git a/docs/developer-guide/getting-started.rst b/docs/developer-guide/getting-started.rst new file mode 100644 index 0000000..a73e4a3 --- /dev/null +++ b/docs/developer-guide/getting-started.rst @@ -0,0 +1,51 @@ +.. _getting_started_dev: + +****************************** +Getting Started for Developers +****************************** + +We strongly recommend using the `Miniforge3 conda distribution `_ +that ships the package installer ``mamba``, a C++ reimplementation of ``conda``. + +.. warning:: + + The following guide is used only if you want to *develop* the + ``pyvisgen`` package, if you just want to write code that uses it + as a dependency, you can install ``pyvisgen`` using pip. + See :ref:`getting_started_users` + + +Setting Up the Development Environment +====================================== + +We provide a conda environment with all packages needed for development of pyvisgen +that can be installed via: + +.. code-block:: console + + $ mamba env create -f environment.yml + + +Next, switch to this new virtual environment: + +.. code-block:: console + + $ mamba activate pyvisgen + +You will need to run that last command any time you open a new +terminal session to activate the conda environment. + + +Installing pyvisgen in Development Mode +======================================= + +To install pyvisgen inside the ``pyvisgen`` environment +(or any environment for that matter), just run + +.. code-block:: console + + $ pip install -e . + +This installs the package in editable mode, meaning that you won't have to rerun +the installation for code changes to take effect. For greater changes such as +adding new entry points, the command may have to be run again. diff --git a/docs/developer-guide/index.rst b/docs/developer-guide/index.rst new file mode 100644 index 0000000..e26b4d2 --- /dev/null +++ b/docs/developer-guide/index.rst @@ -0,0 +1,10 @@ +.. _dev-guide: + +*************** +Developer Guide +*************** + +.. toctree:: + :maxdepth: 2 + + getting-started diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..98c92bf --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,121 @@ +:html_theme.sidebar_secondary.remove: true +:html_theme.sidebar_primary.remove: true + +.. _pyvisgen: + +######## +Pyvisgen +######## + +.. currentmodule:: pyvisgen + +| + +.. .. image:: _static/pyvisgen_logo.webp +.. :class: only-light +.. :align: center +.. :width: 90% +.. :alt: The pyvisgen logo. +.. +.. .. image:: _static/pyvisgen_logo_dark.webp +.. :class: only-dark +.. :align: center +.. :width: 90% +.. :alt: The pyvisgen logo. + + + +**Version**: |version| **Date**: |today| + +**Useful links**: +`Source Repository `__ | +`Issue Tracker `__ | +`Pull Requests `__ + +**License**: MIT + +**Python**: |python_requires| + + + +`pyvisgen` is a python implementation of the VISGEN tool developed at `Haystack Observatory `__. +It uses the Radio Interferometer Measurement Equation (RIME) to simulate the measurement process +of a radio interferometer. A gridder is also implemented to process the resulting visibilities and +convert them to images suitable as input for the neural networks developed in the +`radionets project `__. + +.. _pyvisgen_docs: + +.. toctree:: + :maxdepth: 1 + :hidden: + + user-guide/index + developer-guide/index + api-reference/index + changelog + + + +.. grid:: 1 2 2 3 + + .. grid-item-card:: + + :octicon:`book;40px` + + User Guide + ^^^^^^^^^^ + + Learn how to get started as a user. This guide + will help you install pyvisgen. + + +++ + + .. button-ref:: user-guide/index + :expand: + :color: primary + :click-parent: + + To the user guide + + + .. grid-item-card:: + + :octicon:`person-add;40px` + + Developer Guide + ^^^^^^^^^^^^^^^ + + Learn how to get started as a developer. + This guide will help you install pyvisgen for development + and explains how to contribute. + + +++ + + .. button-ref:: developer-guide/index + :expand: + :color: primary + :click-parent: + + To the developer guide + + + .. grid-item-card:: + + :octicon:`code;40px` + + API Docs + ^^^^^^^^ + + The API docs contain detailed descriptions of + of the various modules, classes and functions + included in pyvisgen. + + +++ + + .. button-ref:: api-reference/index + :expand: + :color: primary + :click-parent: + + To the API docs diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..32bb245 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/user-guide/getting-started.rst b/docs/user-guide/getting-started.rst new file mode 100644 index 0000000..6da3d4f --- /dev/null +++ b/docs/user-guide/getting-started.rst @@ -0,0 +1,26 @@ +.. _getting_started_users: + + +************************* +Getting Started for Users +************************* + +.. warning:: + + The following guide is for *users*. If you want to contribute to + pyvisgen as a developer, see :ref:`getting_started_dev`. + + +Installation +============ + +Currently, pyvisgen is only available via the +`source repository `_. + +To install ``pyvisgen`` into an existing (conda) environment, use + +.. code-block:: console + + $ pip install . + +in the root directory of the source repository. diff --git a/docs/user-guide/index.rst b/docs/user-guide/index.rst new file mode 100644 index 0000000..12eb561 --- /dev/null +++ b/docs/user-guide/index.rst @@ -0,0 +1,10 @@ +.. _user-guide: + +********** +User Guide +********** + +.. toctree:: + :maxdepth: 2 + + getting-started From 81c371c419ee6db2a11d7d6763344038c7092364 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:40:54 +0100 Subject: [PATCH 02/26] Update pyproject.toml for docs --- pyproject.toml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a95bae4..dd7e59c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pyvisgen" -version = "0.2.0" +dynamic = ["version"] description = "Simulate radio interferometer observations and visibility generation with the RIME formalism." readme = "README.md" authors = [{ name = "Kevin Schmidt, Felix Geyer, Stefan Fröse" }] @@ -52,9 +52,19 @@ dependencies = [ [project.scripts] pyvisgen_create_dataset = "pyvisgen.simulation.scripts.create_dataset:main" +[tool.setuptools_scm] +write_to = "pyvisgen/_version.py" + [tool.setuptools.packages.find] where = ["."] +[tool.coverage.run] +branch = true +omit = [ + "pyvisgen/_version.py", + "docs/*" +] + [tool.towncrier] package = "pyvisgen" directory = "docs/changes" From 2a1458d7cd5ba7d9a36585f73a0dce6314a7b4cb Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:41:33 +0100 Subject: [PATCH 03/26] Add pyvisgen/version.py to autogenerate version tag --- pyvisgen/version.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 pyvisgen/version.py diff --git a/pyvisgen/version.py b/pyvisgen/version.py new file mode 100644 index 0000000..90c7787 --- /dev/null +++ b/pyvisgen/version.py @@ -0,0 +1,19 @@ +# this is adapted from https://github.com/astropy/astropy/blob/master/astropy/version.py +# see https://github.com/astropy/astropy/pull/10774 for a discussion on why this needed. +try: + try: + from ._dev_version import version + except ImportError: + from ._version import version +except Exception: + import warnings + + warnings.warn( + "Could not determine pyvisgen version. This indicates" + " a broken installation. Please install pyvisgen from" + " the local git repository." + ) + del warnings + version = "0.0.0" + +__version__ = version From 3ab05438700e2e6fd6ac94927e9d993d3b179d96 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:41:55 +0100 Subject: [PATCH 04/26] Add .readthedocs.yaml --- .readthedocs.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..5b16ce9 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,18 @@ +version: 2 + +build: + os: ubuntu-24.04 + apt_packages: + - graphviz + tools: + python: "3.10" + +python: + install: + - method: pip + path: . + extra_requirements: + - docs + +sphinx: + configuration: docs/conf.py From ffd516b15a8fb454d2074056a334f11ecd90110f Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:42:39 +0100 Subject: [PATCH 05/26] Update inits to flatten import hierarchy --- pyvisgen/__init__.py | 9 ++++++++ pyvisgen/fits/__init__.py | 17 +++++++++++++++ pyvisgen/gridding/__init__.py | 21 ++++++++++++++++++ pyvisgen/layouts/__init__.py | 7 ++++++ pyvisgen/simulation/__init__.py | 38 +++++++++++++++++++++++++++++++++ pyvisgen/utils/__init__.py | 9 ++++++++ 6 files changed, 101 insertions(+) diff --git a/pyvisgen/__init__.py b/pyvisgen/__init__.py index e69de29..76e6b0b 100644 --- a/pyvisgen/__init__.py +++ b/pyvisgen/__init__.py @@ -0,0 +1,9 @@ +""" +pyvisgen - Python implementation of the VISGEN tool. + +Licensed under a MIT style license - see LICENSE +""" + +from .version import __version__ + +__all__ = ["__version__"] diff --git a/pyvisgen/fits/__init__.py b/pyvisgen/fits/__init__.py index e69de29..3417d49 100644 --- a/pyvisgen/fits/__init__.py +++ b/pyvisgen/fits/__init__.py @@ -0,0 +1,17 @@ +from .data import fits_data +from .writer import ( + create_antenna_hdu, + create_frequency_hdu, + create_hdu_list, + create_time_hdu, + create_vis_hdu, +) + +__all__ = [ + "create_antenna_hdu", + "create_frequency_hdu", + "create_hdu_list", + "create_time_hdu", + "create_vis_hdu", + "fits_data", +] diff --git a/pyvisgen/gridding/__init__.py b/pyvisgen/gridding/__init__.py index e69de29..9bcde62 100644 --- a/pyvisgen/gridding/__init__.py +++ b/pyvisgen/gridding/__init__.py @@ -0,0 +1,21 @@ +from .gridder import ( + calc_truth_fft, + convert_amp_phase, + convert_real_imag, + create_gridded_data_set, + ducc0_gridding, + grid_data, + open_data, + save_fft_pair, +) + +__all__ = [ + "calc_truth_fft", + "convert_amp_phase", + "convert_real_imag", + "create_gridded_data_set", + "ducc0_gridding", + "grid_data", + "open_data", + "save_fft_pair", +] diff --git a/pyvisgen/layouts/__init__.py b/pyvisgen/layouts/__init__.py index e69de29..d906012 100644 --- a/pyvisgen/layouts/__init__.py +++ b/pyvisgen/layouts/__init__.py @@ -0,0 +1,7 @@ +from .layouts import Stations, get_array_layout, get_array_names + +__all__ = [ + "Stations", + "get_array_layout", + "get_array_names", +] diff --git a/pyvisgen/simulation/__init__.py b/pyvisgen/simulation/__init__.py index e69de29..87e7ba4 100644 --- a/pyvisgen/simulation/__init__.py +++ b/pyvisgen/simulation/__init__.py @@ -0,0 +1,38 @@ +from .array import Array +from .data_set import ( + calc_ref_elev, + calc_time_steps, + create_observation, + create_sampling_rc, + draw_sampling_opts, + get_images, + simulate_data_set, + test_opts, +) +from .observation import Baselines, Observation, ValidBaselineSubset +from .scan import angularDistance, calc_beam, calc_fourier, integrate, jinc, rime +from .visibilities import Visibilities, generate_noise, vis_loop + +__all__ = [ + "Array", + "Baselines", + "Observation", + "ValidBaselineSubset", + "Visibilities", + "angularDistance", + "calc_beam", + "calc_fourier", + "calc_ref_elev", + "calc_time_steps", + "create_observation", + "create_sampling_rc", + "draw_sampling_opts", + "generate_noise", + "get_images", + "integrate", + "jinc", + "rime", + "simulate_data_set", + "test_opts", + "vis_loop", +] diff --git a/pyvisgen/utils/__init__.py b/pyvisgen/utils/__init__.py index e69de29..b76a994 100644 --- a/pyvisgen/utils/__init__.py +++ b/pyvisgen/utils/__init__.py @@ -0,0 +1,9 @@ +from .config import read_data_set_conf +from .data import get_bundles, load_bundles, open_bundles + +__all__ = [ + "get_bundles", + "load_bundles", + "open_bundles", + "read_data_set_conf", +] From 0a087ef1359051744bba8fbab66a62eeaacefa98 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Fri, 29 Nov 2024 11:42:53 +0100 Subject: [PATCH 06/26] Update .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 30010a7..4e0cbb3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# docs +docs/_build +docs/api + +pyvisgen/_version_cache.py +pyvisgen/_version.py + #slurm *.slurm *.log From a00083beabc94585eb2aa5e3860567e9cc2076c2 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 22 Jan 2025 09:31:20 +0100 Subject: [PATCH 07/26] Fix import --- pyvisgen/simulation/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyvisgen/simulation/__init__.py b/pyvisgen/simulation/__init__.py index 87e7ba4..c7fd0c7 100644 --- a/pyvisgen/simulation/__init__.py +++ b/pyvisgen/simulation/__init__.py @@ -11,7 +11,7 @@ ) from .observation import Baselines, Observation, ValidBaselineSubset from .scan import angularDistance, calc_beam, calc_fourier, integrate, jinc, rime -from .visibilities import Visibilities, generate_noise, vis_loop +from .visibility import Visibilities, generate_noise, vis_loop __all__ = [ "Array", From dda6cff378992caf88ee4c3717751a41dbb0d782 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 22 Jan 2025 09:32:17 +0100 Subject: [PATCH 08/26] Add .coveragerc --- .coveragerc | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..2430a18 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,5 @@ +[xml] +output = coverage.xml + +[run] +parallel = True From 37801d078952ae985c4518078895f901e7ce97b6 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Wed, 22 Jan 2025 10:06:44 +0100 Subject: [PATCH 09/26] Move coverage config to pyproject.toml, ignore pyvisgen/version.py --- .coveragerc | 5 ----- pyproject.toml | 5 ++++- 2 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 2430a18..0000000 --- a/.coveragerc +++ /dev/null @@ -1,5 +0,0 @@ -[xml] -output = coverage.xml - -[run] -parallel = True diff --git a/pyproject.toml b/pyproject.toml index 1139c92..7d88497 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,12 +60,15 @@ write_to = "pyvisgen/_version.py" where = ["."] [tool.coverage.run] -branch = true omit = [ + "pyvisgen/version.py", "pyvisgen/_version.py", "docs/*" ] +[tool.coverage.xml] +output = "coverage.xml" + [tool.towncrier] package = "pyvisgen" directory = "docs/changes" From f2381b7ba786421f12e1fd9783a1e030a836a71c Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:08:40 +0100 Subject: [PATCH 10/26] Update css --- docs/_static/pyvisgen.css | 145 +++++++++++++++++++++++++++++++------- 1 file changed, 119 insertions(+), 26 deletions(-) diff --git a/docs/_static/pyvisgen.css b/docs/_static/pyvisgen.css index de614fd..a338664 100644 --- a/docs/_static/pyvisgen.css +++ b/docs/_static/pyvisgen.css @@ -1,13 +1,42 @@ -@import url('https://fonts.googleapis.com/css?family=Roboto:700|Roboto:400'); +@import url('https://fonts.googleapis.com/css?family=Open+Sans:700|Open+Sans:400'); @import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +:root[data-theme="light"] { + --pst-color-text: #090704; + --pst-color-background: #ebebeb; + --pst-color-on-background: #ffffff; + --pst-color-primary: #52ba66; + --pst-color-secondary: #325e8d; + --pst-color-primary-highlight: #6EC87F; + --pst-color-secondary-highlight: #547cae; + --pst-color-inline-code: var(--pst-color-primary-highlight); + --bd-header-announcement-color: var(--pst-color-background); + --bd-header-announcement-background: var(--pst-color-primary); + --table-hover-background: var(--pst-color-primary-highlight); +} +:root[data-theme="dark"] { + --pst-color-text: #faf8f4; + --pst-color-background: #181f28; + --pst-color-on-background: #222832; + --pst-color-primary: #52ba66; + --pst-color-secondary: #b8dc2e; + --pst-color-primary-highlight: #83c39c; + --pst-color-secondary-highlight: #ece520; + --pst-color-inline-code: var(--pst-color-primary-highlight); + --bd-header-announcement-color: var(--pst-color-background); + --bd-header-announcement-background: var(--pst-color-primary-highlight); + --table-hover-background: #279544; +} + + body { - font-family: 'Roboto'; + font-family: 'Open Sans'; font-weight: 400; } h1, h2, h3, h4, h5 { -font-family: 'Roboto'; +font-family: 'Open Sans'; font-weight: 700; } @@ -46,29 +75,6 @@ small {font-size: 0.833rem; /* 13.28px */} --pst-font-family-monospace: "Fira Mono"; } - -/*:root[data-theme="light"] {*/ -/* --pst-color-text: #090704;*/ -/* --pst-color-background: #faf8f5;*/ -/* --pst-color-primary: #eb9f1b;*/ -/* --pst-color-secondary: #a1d19f;*/ -/* --pst-color-primary-highlight: #83c39c;*/ -/* --pst-color-inline-code: var(--pst-color-primary-highlight);*/ -/* --bd-header-announcement-color: var(--pst-color-text);*/ -/* --bd-header-announcement-background: var(--pst-color-secondary);*/ -/*}*/ -/*:root[data-theme="dark"] {*/ -/* --pst-color-text: #faf8f4;*/ -/* --pst-color-background: #0a0805;*/ -/* --pst-color-primary: #eb9f1b;*/ -/* --pst-color-secondary: #a1d19f;*/ -/* --pst-color-primary-highlight: #83c39c;*/ -/* --pst-color-inline-code: var(--pst-color-primary-highlight);*/ -/* --bd-header-announcement-color: var(--pst-color-background);*/ -/* --bd-header-announcement-background: var(--pst-color-primary-highlight);*/ -/*}*/ - - dt:target { background-color: var(--pst-color-surface); border-radius: 10px; @@ -84,8 +90,13 @@ dt:target { background-color: var(--bd-header-announcement-background); } +.admonition { + border-radius: 10px !important; +} + /* sphinx-design */ .sd-card { + background-color: var(--pst-color-on-background); border-radius: 10px; padding: 30px 10px 20px 10px; margin: 10px 0px; @@ -116,3 +127,85 @@ dt:target { .sd-card .sd-btn { border-radius: 20px; } + +.sd-card:hover { + border-color: var(--pst-color-secondary); + transform: scale(1.05); + -webkit-transition: all .25s; + -moz-transition: all .25s; + transition: all .25s; +} + +.sd-card .sd-btn:hover { + -webkit-animation: pulse 2s infinite; + animation: pulse512 1.5s infinite; + background-size: 200% auto; +} + +.search-button-field:hover { + border-color: var(--pst-color-primary-highlight); + border-width: 2pt; + -webkit-animation: pulse 2s infinite; + animation: pulse512 1.5s infinite; + background-size: 200% auto; +} + +@keyframes pulse512 { + 0% { + box-shadow: 0 0 0 0 var(--pst-color-primary-highlight); + } + + 70% { + box-shadow: 0 0 0 10px rgb(255 255 255 / 0%); + } + + 100% { + box-shadow: 0 0 0 0 rgb(255 255 255 / 0%); + } +} + +/* sphinx gallery */ +.sphx-glr-thumbcontainer { + border-radius: 10px; + transition: 0.3s; + border-color: var(--pst-color-primary); +} + +.sphx-glr-thumbcontainer:hover { + border-color: var(--pst-color-secondary); + transform: scale(1.05); +} + +.sphx-glr-thumbcontainer::after { + border-radius: 10px !important; +} + +.reference.download.internal { + --pst-color-inline-code-links: white; + background-color: var(--pst-color-primary); + background-image: none !important; + border-radius: 40px; +} + +.reference.download.internal::before { + color: white; + text-decoration: none; +} + +.reference.download.internal:hover { + background-color: var(--pst-color-secondary) !important; + transition: 0.3s; + -webkit-animation: pulse 2s infinite; + animation: pulse512 1.5s infinite; + background-size: 200% auto; +} + +/* tables */ +.table tbody tr:hover td, .table tbody tr:hover th { + background: var(--table-hover-background) !important; +} + +/* buttons */ +#pst-back-to-top: { + background-color: var(--pst-color-secondary-highlight); +} From 8397f9ce1dd8a26e07012f2bb4ff64b6ed8639e2 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:08:59 +0100 Subject: [PATCH 11/26] Add favicon and logos --- docs/_static/favicon/favicon.ico | Bin 0 -> 1406 bytes docs/_static/pyvisgen.webp | Bin 0 -> 47938 bytes docs/_static/pyvisgen_dark.webp | Bin 0 -> 47642 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 docs/_static/favicon/favicon.ico create mode 100755 docs/_static/pyvisgen.webp create mode 100755 docs/_static/pyvisgen_dark.webp diff --git a/docs/_static/favicon/favicon.ico b/docs/_static/favicon/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..efcd29dbf3da5c9b57db7bc14f285a6f0fb4b723 GIT binary patch literal 1406 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

)bD6vwS_8?-2s} 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ℑ2l+ZBt8O+o_2?> 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 literal 0 HcmV?d00001 From 56787976ce2d807345fe2a732e222fa914cb5e2d Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:12:14 +0100 Subject: [PATCH 12/26] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4e0cbb3..51b262d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # docs docs/_build docs/api +!docs/_static/*.png pyvisgen/_version_cache.py pyvisgen/_version.py From 53e3ad14db13eaa07b97180f0203db2503a2eae7 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:12:57 +0100 Subject: [PATCH 13/26] Add logos to navbar/header --- docs/conf.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index acb81a3..b2d559b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,6 +74,7 @@ html_css_files = ["pyvisgen.css"] +html_favicon = "_static/favicon/favicon.ico" html_theme_options = { "github_url": "https://github.com/radionets-project/pyvisgen", @@ -90,6 +91,11 @@ "icon": "https://avatars.githubusercontent.com/u/77392854?s=200&v=4", # noqa: E501 }, ], + "logo": { + "image_light": "_static/pyvisgen.webp", + "image_dark": "_static/pyvisgen_dark.webp", + "alt_text": "pyvisgen", + }, "announcement": """

pyvisgen is not stable yet, so expect large and rapid changes to structure and functionality as we explore various @@ -115,6 +121,7 @@ "scipy": ("https://docs.scipy.org/doc/scipy", None), "setuptools": ("https://setuptools.pypa.io/en/stable", None), "sklearn": ("https://scikit-learn.org/stable", None), + "torch": ("https://pytorch.org/docs/stable/", None), } From fabdd6e48efb48029324ae2d8834dc6f24416e7e Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:13:16 +0100 Subject: [PATCH 14/26] Add logos to front page --- docs/index.rst | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 98c92bf..a7db1e6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,36 +3,30 @@ .. _pyvisgen: -######## -Pyvisgen -######## - .. currentmodule:: pyvisgen -| - -.. .. image:: _static/pyvisgen_logo.webp -.. :class: only-light -.. :align: center -.. :width: 90% -.. :alt: The pyvisgen logo. -.. -.. .. image:: _static/pyvisgen_logo_dark.webp -.. :class: only-dark -.. :align: center -.. :width: 90% -.. :alt: The pyvisgen logo. +.. image:: _static/pyvisgen.webp + :class: only-light + :align: center + :width: 90% + :alt: The pyvisgen logo. +.. image:: _static/pyvisgen_dark.webp + :class: only-dark + :align: center + :width: 90% + :alt: The pyvisgen logo. +| -**Version**: |version| **Date**: |today| +**Version**: |version| | **Date**: |today| **Useful links**: `Source Repository `__ | `Issue Tracker `__ | `Pull Requests `__ -**License**: MIT +**License**: `MIT `__ **Python**: |python_requires| From b52c3e5d1b25435deb32f4145f8b02dcd1f48109 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:13:57 +0100 Subject: [PATCH 15/26] Add docstring for calc_direction_cosines --- pyvisgen/simulation/observation.py | 49 +++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/pyvisgen/simulation/observation.py b/pyvisgen/simulation/observation.py index 9fb8c9e..c45b8b8 100644 --- a/pyvisgen/simulation/observation.py +++ b/pyvisgen/simulation/observation.py @@ -114,7 +114,13 @@ def get_timerange(self, t_start, t_stop): *[getattr(self, f.name).ravel() for f in fields(self)] )[(self.date >= t_start) & (self.date <= t_stop)] - def get_unique_grid(self, fov_size, ref_frequency, img_size, device): + def get_unique_grid( + self, + fov_size: float, + ref_frequency: float, + img_size: int, + device: str, + ): uv = torch.cat([self.u_valid[None], self.v_valid[None]], dim=0) fov = fov_size * pi / (3600 * 180) delta = 1 / fov * const.c.value.item() / ref_frequency @@ -389,7 +395,8 @@ def create_lm_grid(self): Returns ------- lm_grid : 3d array - Returns a 3d array with every pixel containing a l and m value + Returns a 3d array with every pixel containing an + l and an m value """ dec = torch.deg2rad(self.dec) @@ -402,8 +409,8 @@ def create_lm_grid(self): return lm_grid def get_baselines(self, times): - """Calculates baselines from source coordinates and time of observation for - every antenna station in array_layout. + """Calculates baselines from source coordinates and time + of observation for every antenna station in ``array_layout``. Parameters ---------- @@ -462,7 +469,39 @@ def get_baselines(self, times): baselines.add_baseline(base) return baselines - def calc_direction_cosines(self, ha, el_st, delta_x, delta_y, delta_z): + def calc_direction_cosines( + self, + ha: torch.tensor, + el_st: torch.tensor, + delta_x: torch.tensor, + delta_y: torch.tensor, + delta_z: torch.tensor, + ): + """Calculates direction cosines u, v, and w for + given hour angles and relative antenna positions. + + Parameters + ---------- + ha : :func:`torch.tensor` + Tensor containing hour angles for each time step. + el_st : :func:`torch.tensor` + Tensor containing station elevations. + delta_x : :func:`torch.tensor` + Tensor containing relative antenna x-postions. + delta_y : :func:`torch.tensor` + Tensor containing relative antenna y-postions. + delta_z : :func:`torch.tensor` + Tensor containing relative antenna z-postions. + + Returns + ------- + u : :func:`torch.tensor` + Tensor containing direction cosines in u-axis direction. + v : :func:`torch.tensor` + Tensor containing direction cosines in v-axis direction. + w : :func:`torch.tensor` + Tensor containing direction cosines in w-axis direction. + """ src_dec = torch.deg2rad(self.dec) ha = torch.deg2rad(ha) u = (torch.sin(ha) * delta_x + torch.cos(ha) * delta_y).reshape(-1) From b0c430ca387f2730499205346e7566380719e6e0 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Sat, 25 Jan 2025 15:18:04 +0100 Subject: [PATCH 16/26] Add changelog --- docs/changes/47.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/changes/47.feature.rst diff --git a/docs/changes/47.feature.rst b/docs/changes/47.feature.rst new file mode 100644 index 0000000..a1aff1a --- /dev/null +++ b/docs/changes/47.feature.rst @@ -0,0 +1 @@ +- Added docs From bb6f829197784a306d610236aa8d6f57491c1bee Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 09:44:00 +0100 Subject: [PATCH 17/26] Update css --- docs/_static/pyvisgen.css | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/_static/pyvisgen.css b/docs/_static/pyvisgen.css index a338664..75e5079 100644 --- a/docs/_static/pyvisgen.css +++ b/docs/_static/pyvisgen.css @@ -4,7 +4,7 @@ :root[data-theme="light"] { --pst-color-text: #090704; - --pst-color-background: #ebebeb; + --pst-color-background: #f5f5f5; --pst-color-on-background: #ffffff; --pst-color-primary: #52ba66; --pst-color-secondary: #325e8d; @@ -14,6 +14,7 @@ --bd-header-announcement-color: var(--pst-color-background); --bd-header-announcement-background: var(--pst-color-primary); --table-hover-background: var(--pst-color-primary-highlight); + --hl-pre-code-background: var(--pst-color-background); } :root[data-theme="dark"] { --pst-color-text: #faf8f4; @@ -27,6 +28,7 @@ --bd-header-announcement-color: var(--pst-color-background); --bd-header-announcement-background: var(--pst-color-primary-highlight); --table-hover-background: #279544; + --hl-pre-code-background: var(--pst-color-background); } @@ -35,6 +37,11 @@ body { font-weight: 400; } +:root { + --pst-font-family-monospace: "Fira Mono"; +} + + h1, h2, h3, h4, h5 { font-family: 'Open Sans'; font-weight: 700; @@ -70,19 +77,22 @@ h5 {font-size: 1.200rem; /* 19.2px */} small {font-size: 0.833rem; /* 13.28px */} - -:root { - --pst-font-family-monospace: "Fira Mono"; -} - dt:target { background-color: var(--pst-color-surface); border-radius: 10px; padding: 5px 5px 5px 5px; } +/* code blocks */ +div.highlight { + background-color: var(--hl-pre-code-background) !important; +} .highlight pre { border-radius: 20px; + background-color: var(--pst-color-on-background); +} +.highlight pre .gp { + color: var(--pst-color-primary); } .bd-header-announcement { @@ -131,9 +141,9 @@ dt:target { .sd-card:hover { border-color: var(--pst-color-secondary); transform: scale(1.05); - -webkit-transition: all .25s; - -moz-transition: all .25s; - transition: all .25s; + -webkit-transition: all .2s; + -moz-transition: all .2s; + transition: all .2s; } .sd-card .sd-btn:hover { From 8157426778ea00cf4274b6a09decbb615618f3a0 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 09:44:27 +0100 Subject: [PATCH 18/26] Update html title, add copybutton extension --- docs/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index b2d559b..2c0f945 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -28,6 +28,7 @@ "numpydoc", "sphinx_design", "IPython.sphinxext.ipython_console_highlighting", + "sphinx_copybutton", ] numpydoc_show_class_members = False @@ -103,7 +104,7 @@ """, } -html_title = f"{project}" +html_title = f"{project}: Visibility Simulations in Python" htmlhelp_basename = project + "docs" From e8782dd394e8ece7b76985f45d7bafae90ea0fbd Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 09:44:55 +0100 Subject: [PATCH 19/26] Add invisible title that only shows up in the browser tab title --- docs/index.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index a7db1e6..bd04ffd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,6 +3,19 @@ .. _pyvisgen: +.. show title in tab name but not on index page +.. raw:: html + +

+ +======== +Pyvisgen +======== + +.. raw:: html + +
+ .. currentmodule:: pyvisgen .. image:: _static/pyvisgen.webp From 00e6f35e4377d78d6c9c1a05d70d3e79f782660d Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 09:45:30 +0100 Subject: [PATCH 20/26] Add about section --- docs/user-guide/about.rst | 59 +++++++++++++++++++++++++++++++++++++++ docs/user-guide/index.rst | 1 + 2 files changed, 60 insertions(+) create mode 100644 docs/user-guide/about.rst diff --git a/docs/user-guide/about.rst b/docs/user-guide/about.rst new file mode 100644 index 0000000..8c5d02a --- /dev/null +++ b/docs/user-guide/about.rst @@ -0,0 +1,59 @@ +************** +About pyvisgen +************** + +`pyvisgen` is a python implementation of the VISGEN tool developed at `Haystack Observatory `__. +It uses the Radio Interferometer Measurement Equation (RIME) to simulate the measurement process +of a radio interferometer. A gridder is also implemented to process the resulting visibilities and +convert them to images suitable as input for the neural networks developed in the +`radionets project `__. + +Input Images +============ + +As input images for the RIME formalism, we use GAN-generated radio galaxies created by `Rustige et. al. `_ +and `Kummer et. al. `_ Below, you can see four example images consisting of FRI and FRII sources. + + +.. image:: https://github.com/radionets-project/pyvisgen/assets/23259659/285e36f6-74e7-45f1-9976-896a38217880 + :align: center + :width: 90% + :alt: Sources generated with a GAN. + +Any image can be used as input for the formalism, as long as they are stored in the h5 format, generated with |h5py|_. + +.. |h5py| replace:: ``h5py`` +.. _h5py: https://www.h5py.org/ + + +RIME +==== + +Currently, we use the following expression for the simulation process: + +.. math:: + + \mathbf{V}_{\mathrm{pq}}(l, m) = \sum_{l, m} \mathbf{E}_{\mathrm{p}}(l, m) \mathbf{K}_{\mathrm{p}}(l, m) \mathbf{B}(l, m) \mathbf{K}^{H}_{\mathrm{q}}(l, m) \mathbf{E}^{H}_{\mathrm{q}}(l, m) + +Here, :math:`\mathbf{B}(l, m)` corresponds to the source distribution, :math:`\mathbf{K}(l, m) = \exp(-2\pi\cdot i\cdot (ul + vm))` represents +the phase delay, and :math:`\mathbf{E}(l, m) = \mathrm{jinc}\left(\frac{2\pi}{\lambda}d\cdot \theta_{lm}\right)` the telescope properties, +with :math:`\mathrm{jinc(x)} = \frac{J_1(x)}{x}` and :math:`J_1(x)` as the first Bessel function. An exemplary result can be found below. + +.. image:: https://github.com/radionets-project/pyvisgen/assets/23259659/858a5d4b-893a-4216-8d33-41d33981354c + :alt: visibilities + + +Visualization of Jones matrices +=============================== + +In this section, you can see visualizations of the matrices :math:`\mathbf{E}(l, m)` and :math:`\mathbf{K}(l, m)`. + +Visualization of the :math:`\mathbf{E}` matrix +---------------------------------------------- +.. image:: https://github.com/radionets-project/pyvisgen/assets/23259659/194a321b-77cd-423b-9d01-c18c0741d6c5 + :alt: visualize_E + +Visualization of the :math:`\mathbf{K}` matrix +---------------------------------------------- +.. image:: https://github.com/radionets-project/pyvisgen/assets/23259659/501f487a-498b-4143-b54a-eb0e2f28e417 + :alt: visualize_K diff --git a/docs/user-guide/index.rst b/docs/user-guide/index.rst index 12eb561..c1bdf9a 100644 --- a/docs/user-guide/index.rst +++ b/docs/user-guide/index.rst @@ -8,3 +8,4 @@ User Guide :maxdepth: 2 getting-started + about From 934cef7bf21539a0f8e723742e816b3805783b51 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 09:46:00 +0100 Subject: [PATCH 21/26] Change changelog to present tense --- docs/changes/47.feature.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changes/47.feature.rst b/docs/changes/47.feature.rst index a1aff1a..cf47768 100644 --- a/docs/changes/47.feature.rst +++ b/docs/changes/47.feature.rst @@ -1 +1 @@ -- Added docs +- Add docs From 40e75c695081767f0203ae0b73c8e47134c3b56f Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 10:02:59 +0100 Subject: [PATCH 22/26] Remove Fira Sans --- docs/_static/pyvisgen.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_static/pyvisgen.css b/docs/_static/pyvisgen.css index 75e5079..eadf40b 100644 --- a/docs/_static/pyvisgen.css +++ b/docs/_static/pyvisgen.css @@ -1,5 +1,5 @@ @import url('https://fonts.googleapis.com/css?family=Open+Sans:700|Open+Sans:400'); -@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Fira+Mono:wght@400;500;700&display=swap'); :root[data-theme="light"] { From 8a97f2e3a39e5371b81c535c808b5a1cb7c51292 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 10:59:03 +0100 Subject: [PATCH 23/26] Add optional dependencies for docs and tests --- pyproject.toml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 7d88497..5228c39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,34 @@ dependencies = [ "tqdm", ] +[project.optional-dependencies] + +tests = [ + "h5py", + "pytest >= 7.0", + "pytest-cov", + "tomli", +] + +docs = [ + "graphviz", + "ipython", + "jupyter", + "nbsphinx", + "notebook", + "numpydoc", + "pydata_sphinx_theme", + "pyvisgen[all]", + "sphinx", + "sphinx-changelog", + "sphinx-copybutton" + "sphinx-design", + "sphinx-gallery >= 0.16.0", + "sphinx_automodapi", + "sphinxcontrib-bibtex", + "tomli; python_version < '3.11'", +] + [project.scripts] pyvisgen_create_dataset = "pyvisgen.simulation.scripts.create_dataset:main" From 8c89225283ae8cd03cd00599283b1755e7e302fc Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 11:18:25 +0100 Subject: [PATCH 24/26] Fix pyproject.toml --- pyproject.toml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5228c39..1bc643c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,29 +53,29 @@ dependencies = [ [project.optional-dependencies] tests = [ - "h5py", - "pytest >= 7.0", - "pytest-cov", - "tomli", + "h5py", + "pytest >= 7.0", + "pytest-cov", + "tomli", ] docs = [ - "graphviz", - "ipython", - "jupyter", - "nbsphinx", - "notebook", - "numpydoc", - "pydata_sphinx_theme", - "pyvisgen[all]", - "sphinx", - "sphinx-changelog", - "sphinx-copybutton" - "sphinx-design", - "sphinx-gallery >= 0.16.0", - "sphinx_automodapi", - "sphinxcontrib-bibtex", - "tomli; python_version < '3.11'", + "graphviz", + "ipython", + "jupyter", + "nbsphinx", + "notebook", + "numpydoc", + "pydata_sphinx_theme", + "pyvisgen[all]", + "sphinx", + "sphinx-changelog", + "sphinx-copybutton", + "sphinx-design", + "sphinx-gallery >= 0.16.0", + "sphinx_automodapi", + "sphinxcontrib-bibtex", + "tomli; python_version < '3.11'", ] [project.scripts] From a452dafc08bb4747e3394f133921df6e69126139 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 11:18:45 +0100 Subject: [PATCH 25/26] Add test for mode='grid' in vis_loop --- tests/test_simulation.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/test_simulation.py b/tests/test_simulation.py index c384951..9799823 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -5,7 +5,6 @@ from pyvisgen.utils.config import read_data_set_conf - torch.manual_seed(1) config = "tests/test_conf.toml" conf = read_data_set_conf(config) @@ -80,6 +79,45 @@ def test_vis_loop(): hdu_list.writeto(out, overwrite=True) +def test_vis_loop_grid(): + import torch + + import pyvisgen.fits.writer as writer + from pyvisgen.simulation.data_set import create_observation + from pyvisgen.simulation.visibility import vis_loop + from pyvisgen.utils.data import load_bundles, open_bundles + + bundles = load_bundles(conf["in_path"]) + obs = create_observation(conf) + # num_active_telescopes = test_opts(samp_ops) + data = open_bundles(bundles[0]) + SI = torch.tensor(data[0])[None] + vis_data = vis_loop(obs, SI, noisy=conf["noisy"], mode="grid") + + assert (vis_data[0].V_11[0]).dtype == torch.complex128 + assert (vis_data[0].V_22[0]).dtype == torch.complex128 + assert (vis_data[0].V_12[0]).dtype == torch.complex128 + assert (vis_data[0].V_21[0]).dtype == torch.complex128 + assert (vis_data[0].num).dtype == torch.float32 + assert (vis_data[0].base_num).dtype == torch.float64 + assert torch.is_tensor(vis_data[0].u) + assert torch.is_tensor(vis_data[0].v) + assert torch.is_tensor(vis_data[0].w) + assert (vis_data[0].date).dtype == torch.float64 + + # test num vis for time step 0 + # num_vis_theory = num_active_telescopes * (num_active_telescopes - 1) / 2 + # num_vis_calc = vis_data.base_num[vis_data.date == vis_data.date[0]].shape[0] + # dunno what's going on here + # assert num_vis_theory == num_vis_calc + # + + out_path = Path(conf["out_path_fits"]) + out = out_path / Path("vis_0.fits") + hdu_list = writer.create_hdu_list(vis_data, obs) + hdu_list.writeto(out, overwrite=True) + + def test_vis_loop_batch_size_auto(): import torch From ef8ca8fad16cae7f3e3bb2bca163a3f7fc53f879 Mon Sep 17 00:00:00 2001 From: Anno Knierim Date: Mon, 27 Jan 2025 11:39:05 +0100 Subject: [PATCH 26/26] Update authors --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1bc643c..5afa926 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,10 +7,10 @@ name = "pyvisgen" dynamic = ["version"] description = "Simulate radio interferometer observations and visibility generation with the RIME formalism." readme = "README.md" -authors = [{ name = "Kevin Schmidt, Felix Geyer, Stefan Fröse" }] +authors = [{ name = "Kevin Schmitz, Felix Geyer, Stefan Fröse, Anno Knierim, Tom Groß" }] maintainers = [ - { name = "Kevin Schmidt", email = "kevin3.schmidt@tu-dortmund.de" }, - { name = "Felix Geyer", email = "felix.geyer@tu-dortmund.de" }, + { name = "Kevin Schmitz", email = "kevin2.schmitz@tu-dortmund.de" }, + { name = "Anno Knierim", email = "anno.knierim@tu-dortmund.de" }, ] license = { text = "MIT" } classifiers = [