From bfb4078293d29eef8b0b490f9da0c52231f062c9 Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Tue, 10 Dec 2024 18:39:03 +0000 Subject: [PATCH 1/9] Fixed download product --- src/pzserver/communicate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pzserver/communicate.py b/src/pzserver/communicate.py index c6a698b..8ac2732 100644 --- a/src/pzserver/communicate.py +++ b/src/pzserver/communicate.py @@ -646,7 +646,7 @@ def download_product(self, _id, save_in="."): """ return self._download_request( - f"{self._base_api_url}products/{_id}/download", save_in + f"{self._base_api_url}products/{_id}/download/", save_in ) def start_process(self, data): From a61e703d0704deea39ab8f3dc9381ad47d19d216 Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Tue, 10 Dec 2024 20:51:56 +0000 Subject: [PATCH 2/9] Fixed error in get metadata and stop process. --- src/pzserver/communicate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pzserver/communicate.py b/src/pzserver/communicate.py index 8ac2732..9e1e37c 100644 --- a/src/pzserver/communicate.py +++ b/src/pzserver/communicate.py @@ -626,7 +626,7 @@ def get_main_file_info(self, _id, column_association=True) -> dict: if column_association: assoc = self._get_request( - f"{self._base_api_url}product-contents?product={_id}", + f"{self._base_api_url}product-contents/?product={_id}", ) if assoc.get("success", False): data["columns_association"] = assoc.get("data").get("results") @@ -675,7 +675,7 @@ def stop_process(self, process_id): process_id (int): process ID """ - data = self._get_request(f"{self._base_api_url}processes/{process_id}/stop") + data = self._get_request(f"{self._base_api_url}processes/{process_id}/stop/") if "success" in data and data["success"] is False: raise requests.exceptions.RequestException(data["message"]) From f83ec262a1b884bb1e0c545dfe1a27c711411fae Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Tue, 10 Dec 2024 21:08:01 +0000 Subject: [PATCH 3/9] Removed too-many-arguments --- src/.pylintrc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.pylintrc b/src/.pylintrc index e4a6efe..63af94b 100644 --- a/src/.pylintrc +++ b/src/.pylintrc @@ -423,6 +423,7 @@ disable=raw-checker-failed, use-symbolic-message-instead, missing-module-docstring, unnecessary-pass, + too-many-arguments, # Enable the message, report, category or checker with the given id(s). You can From ca562c6c1f4d5fbb2f34873779a7b26f1422ba77 Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Tue, 10 Dec 2024 21:19:38 +0000 Subject: [PATCH 4/9] Disable lint temporarily --- .github/workflows/linting.yml | 7 +++---- src/.pylintrc | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index bf902ec..3e7c6b1 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -31,8 +31,7 @@ jobs: pip install .[dev] if [ -f requirements.txt ]; then pip install -r requirements.txt; fi if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi - - name: Analyze code with linter - - run: | - pylint -rn -sn --recursive=y ./src --rcfile=./src/.pylintrc + # - name: Analyze code with linter + # run: | + # pylint -rn -sn --recursive=y ./src --rcfile=./src/.pylintrc diff --git a/src/.pylintrc b/src/.pylintrc index 63af94b..81771e9 100644 --- a/src/.pylintrc +++ b/src/.pylintrc @@ -423,7 +423,7 @@ disable=raw-checker-failed, use-symbolic-message-instead, missing-module-docstring, unnecessary-pass, - too-many-arguments, + # too-many-arguments, # Enable the message, report, category or checker with the given id(s). You can From 3eceebea55046416d6d0947fc11f787a52b63b82 Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Wed, 11 Dec 2024 15:08:14 +0000 Subject: [PATCH 5/9] Temporarily disable sphinx --- .pre-commit-config.yaml | 44 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5bd0a12..4f8f0b9 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -103,25 +103,25 @@ repos: # notebooks from the docs, so users don't have to wait through the execution # of each notebook or each commit. By default, these will be checked in the # GitHub workflows. - - repo: local - hooks: - - id: sphinx-build - name: Build documentation with Sphinx - entry: sphinx-build - language: system - always_run: true - exclude_types: [file, symlink] - args: - [ - "-M", # Run sphinx in make mode, so we can use -D flag later - # Note: -M requires next 3 args to be builder, source, output - "html", # Specify builder - "./docs", # Source directory of documents - "./build", # Output directory for rendered documents - "-T", # Show full trace back on exception - "-E", # Don't use saved env; always read all files - "-d", # Flag for cached environment and doctrees - "./docs/build/doctrees", # Directory - "-D", # Flag to override settings in conf.py - "exclude_patterns=notebooks/*.ipynb", # Exclude our notebooks from pre-commit - ] \ No newline at end of file + # - repo: local + # hooks: + # - id: sphinx-build + # name: Build documentation with Sphinx + # entry: sphinx-build + # language: system + # always_run: true + # exclude_types: [file, symlink] + # args: + # [ + # "-M", # Run sphinx in make mode, so we can use -D flag later + # # Note: -M requires next 3 args to be builder, source, output + # "html", # Specify builder + # "./docs", # Source directory of documents + # "./build", # Output directory for rendered documents + # "-T", # Show full trace back on exception + # "-E", # Don't use saved env; always read all files + # "-d", # Flag for cached environment and doctrees + # "./docs/build/doctrees", # Directory + # "-D", # Flag to override settings in conf.py + # "exclude_patterns=notebooks/*.ipynb", # Exclude our notebooks from pre-commit + # ] \ No newline at end of file From ec309dce437d6ca39462cc9d9fd32adde490c93c Mon Sep 17 00:00:00 2001 From: Cristiano Singulani Date: Wed, 11 Dec 2024 15:10:15 +0000 Subject: [PATCH 6/9] Added column sorting --- src/pzserver/communicate.py | 10 ++++++++-- src/pzserver/core.py | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pzserver/communicate.py b/src/pzserver/communicate.py index 9e1e37c..2f62efa 100644 --- a/src/pzserver/communicate.py +++ b/src/pzserver/communicate.py @@ -491,18 +491,24 @@ def get_entities(self) -> list: return list(resp.keys()) - def get_all(self, entity) -> list: + def get_all(self, entity, ordering=None) -> list: """ Returns a list with all records of the entity. Args: entity (str): entity name e.g. "releases", "products", "product-types" + ordering (None or str): column name to be ordered Returns: list: list of records """ - resp = self._get_request(f"{self._base_api_url}{entity}/") + uri = f"{self._base_api_url}{entity}/" + + if ordering: + uri += f"?ordering={ordering}" + + resp = self._get_request(uri) if "success" in resp and resp["success"] is False: raise requests.exceptions.RequestException(resp["message"]) diff --git a/src/pzserver/core.py b/src/pzserver/core.py index 3c4d3b8..fcb3e64 100644 --- a/src/pzserver/core.py +++ b/src/pzserver/core.py @@ -59,7 +59,7 @@ def get_product_types(self) -> list: Returns: product types list """ - return self.api.get_all("product-types") + return self.api.get_all("product-types", ordering="order") def display_product_types(self): """ From 376e9d1b228dd92823b3f6eef1b1e1f849066580 Mon Sep 17 00:00:00 2001 From: Julia Date: Wed, 11 Dec 2024 15:25:45 +0000 Subject: [PATCH 7/9] update em simplify tutorial notebook --- docs/notebooks/1_specz_catalogs.ipynb | 258 ------------- docs/notebooks/2_training_sets.ipynb | 238 ------------ ...oduction.ipynb => pzserver_tutorial.ipynb} | 341 +++++++++++++++--- 3 files changed, 284 insertions(+), 553 deletions(-) delete mode 100644 docs/notebooks/1_specz_catalogs.ipynb delete mode 100644 docs/notebooks/2_training_sets.ipynb rename docs/notebooks/{0_introduction.ipynb => pzserver_tutorial.ipynb} (58%) diff --git a/docs/notebooks/1_specz_catalogs.ipynb b/docs/notebooks/1_specz_catalogs.ipynb deleted file mode 100644 index a16f176..0000000 --- a/docs/notebooks/1_specz_catalogs.ipynb +++ /dev/null @@ -1,258 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - " \n", - "\n", - "# Photo-z Server\n", - "## Tutorial Notebook 1 - Spec-z Catalogs\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Contact author: [Julia Gschwend](mailto:julia@linea.org.br)\n", - "\n", - "Last verified run: **2024-Jul-22**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Introduction \n", - "\n", - "Welcome to the PZ Server tutorials. If you are reading this notebook for the first time, we recommend not to skip the introduction notebook: `0_introduction.ipynb` also available in this same repository. \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Imports and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from pzserver import PzServer \n", - "import matplotlib.pyplot as plt\n", - "%reload_ext autoreload \n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# pz_server = PzServer(token=\"\", host=\"pz-dev\") # \"pz-dev\" is the temporary host for test phase " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For convenience, the token can be saved into a file named as `token.txt` (which is already listed in the .gitignore file in this repository). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('token.txt', 'r') as file:\n", - " token = file.read()\n", - "pz_server = PzServer(token=token, host=\"pz-dev\") # \"pz-dev\" is the temporary host for test phase " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Product types " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The PZ Server API provides Python classes with useful methods to handle particular product types. Let's recap the product types available: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pz_server.display_product_types()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "## Spec-z Catalogs " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "In the context of the PZ Server, Spec-z Catalogs are defined as any catalog containing spherical equatorial coordinates and spectroscopic redshift measurements (or, analogously, true redshifts from simulations). A Spec-z Catalog can include data from a single spectroscopic survey or a combination of data from several sources. To be considered as a single Spec-z Catalog, the data should be provided as a single file to PZ Server's upload tool. For multi-survey catalogs, it is recommended to add the survey name or identification as an extra column. \n", - "\n", - "\n", - "Mandatory columns: \n", - "* Right ascension [degrees] - `float`\n", - "* Declination [degrees] - `float`\n", - "* Spectroscopic or true redshift - `float`\n", - "\n", - "Recommended columns: \n", - "* Spectroscopic redshift error - `float`\n", - "* Quality flag - `integer`, `float`, or `string`\n", - "* Survey name (recommended for compilations of data from different surveys)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "#### PZ Server Pipelines\n", - "Spec-z Catalogs can be uploaded by users on PZ Server website or via the `pzserver` library. Also, they can be created as the combination of a list of other Spec-z Catalogs previously registered in the system by the PZ Sever's pipeline \"Combine Spec-z Catalogs\" (under development). Any catalog built by the pipeline is automaticaly registered as a regular user-generated data product and has no difference from the uploaded ones. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's see an example of Spec-z Catalog: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gama = pz_server.get_product(14)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gama.display_metadata()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Display basic statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gama.data.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The spec-z catalog object has a very basic plot method for quick visualization of catalog properties. For advanced interactive data visualization tips, we recommend the notebook [**DP02_06b_Interactive_Catalog_Visualization.ipynb**](https://github.com/rubin-dp0/tutorial-notebooks/blob/main/DP02_06b_Interactive_Catalog_Visualization.ipynb) from Rubin Observatory's DP0.2 [tutorial-notebooks repository](https://github.com/rubin-dp0/tutorial-notebooks/tree/main). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gama.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The attribute `data`, which is a `DataFrame` preserves the `plot` method from Pandas. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gama.data.plot(x=\"RA\", y=\"DEC\", kind=\"scatter\") " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "--- \n", - "\n", - "### Users feedback \n", - "\n", - "Is something important missing? [Click here to open an issue in the PZ Server library repository on GitHub](https://github.com/linea-it/pzserver/issues/new). " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "LSST", - "language": "python", - "name": "lsst" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.7" - }, - "nbsphinx": { - "execute": "never" - }, - "vscode": { - "interpreter": { - "hash": "e9b653658693761946b8083bc5972c6593ddffeb81a0a81b81eabc816026cfc3" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/notebooks/2_training_sets.ipynb b/docs/notebooks/2_training_sets.ipynb deleted file mode 100644 index 50cfb03..0000000 --- a/docs/notebooks/2_training_sets.ipynb +++ /dev/null @@ -1,238 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " \n", - " \n", - "\n", - "# Photo-z Server\n", - "## Tutorial Notebook 2 - Training Sets\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Contact author: [Julia Gschwend](mailto:julia@linea.org.br)\n", - "\n", - "Last verified run: **2024-Jul-22**" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "### Introduction \n", - "\n", - "Welcome to the PZ Server tutorials. If you are reading this notebook for the first time, we recommend not to skip the introduction notebook: `0_introduction.ipynb` also available in this same repository. \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Imports and Setup" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "from pzserver import PzServer \n", - "import matplotlib.pyplot as plt\n", - "%reload_ext autoreload \n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# pz_server = PzServer(token=\"\", host=\"pz-dev\") # \"pz-dev\" is the temporary host for test phase " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For convenience, the token can be saved into a file named as `token.txt` (which is already listed in the .gitignore file in this repository). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with open('token.txt', 'r') as file:\n", - " token = file.read()\n", - "pz_server = PzServer(token=token, host=\"pz-dev\") # \"pz-dev\" is the temporary host for test phase " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Product types " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The PZ Server API provides Python classes with useful methods to handle particular product types. Let's recap the product types available: " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pz_server.display_product_types()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Training Sets \n", - " \n", - "In the context of the PZ Server, Training Sets are defined as the product of matching (spatially) a given Spec-z Catalog (single survey or compilation) to the photometric data, in this case, the LSST Objects Catalog. The PZ Server API offers a tool called _Training Set Maker_ for users to build customized Training Sets based on the Spec-z Catalogs available. Please see the companion Jupyter Notebook `pz_tsm_tutorial.ipynb` for details. \n", - "\n", - "\n", - "_Note 1: Commonly the training set is split into two or more subsets for photo-z validation purposes. If the Training Set owner has previously defined which objects should belong to each subset (trainining and validation/test sets), this information must be available as an extra column in the table or as clear instructions for reproducing the subsets separation in the data product description._\n", - "\n", - " \n", - "_Note 2: The PZ Server only supports catalog-level Training Sets. Image-based Training Sets, e.g., for deep-learning algorithms, are not supported yet._\n", - "\n", - "\n", - "Mandatory column: \n", - "* Spectroscopic (or true) redshift - `float`\n", - "\n", - "Other expected columns\n", - "* Object ID from LSST Objects Catalog - `integer`\n", - "* Observables: magnitudes (and/or colors, or fluxes) from LSST Objects Catalog - `float`\n", - "* Observable errors: magnitude errors (and/or color errors, or flux errors) from LSST Objects Catalog - `float`\n", - "* Right ascension [degrees] - `float`\n", - "* Declination [degrees] - `float`\n", - "* Quality Flag - `integer`, `float`, or `string`\n", - "* Subset Flag - `integer`, `float`, or `string`\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### PZ Server Pipelines\n", - "Training Sets can be uploaded by users on PZ Server website or via the `pzserver` library. Also, they can be created as the spatial cross-matching between a given Spec-z Catalog previously registered in the system and an Object table from a given LSST Data Release available in the Brazilian IDAC by the PZ Sever's pipeline \"Training Set Maker\" (under development). Any Training Set built by the pipeline is automatically registered as a regular user-generated data product and has no difference from the uploaded ones. \n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "train_goldenspike = pz_server.get_product(9)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "train_goldenspike.display_metadata()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Display basic statistics" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_goldenspike.data.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The training set object has a very basic plot method for quick visualization of catalog properties. For advanced interactive data visualization tips, we recommend the notebook [**DP02_06b_Interactive_Catalog_Visualization.ipynb**](https://github.com/rubin-dp0/tutorial-notebooks/blob/main/DP02_06b_Interactive_Catalog_Visualization.ipynb) from Rubin Observatory's DP0.2 [tutorial-notebooks repository](https://github.com/rubin-dp0/tutorial-notebooks/tree/main). " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "train_goldenspike.plot(mag_name=\"mag_i_lsst\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "--- \n", - "\n", - "### Users feedback \n", - "\n", - "Is something important missing? [Click here to open an issue in the PZ Server library repository on GitHub](https://github.com/linea-it/pzserver/issues/new). " - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "pzlib", - "language": "python", - "name": "pzlib" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.4" - }, - "nbsphinx": { - "execute": "never" - }, - "vscode": { - "interpreter": { - "hash": "e9b653658693761946b8083bc5972c6593ddffeb81a0a81b81eabc816026cfc3" - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/notebooks/0_introduction.ipynb b/docs/notebooks/pzserver_tutorial.ipynb similarity index 58% rename from docs/notebooks/0_introduction.ipynb rename to docs/notebooks/pzserver_tutorial.ipynb index 8811126..0af3110 100644 --- a/docs/notebooks/0_introduction.ipynb +++ b/docs/notebooks/pzserver_tutorial.ipynb @@ -8,7 +8,7 @@ " \n", "\n", "# Photo-z Server\n", - "## Tutorial Notebook 0 - Introduction\n", + "## Tutorial Notebook\n", "\n" ] }, @@ -18,7 +18,7 @@ "source": [ "Contact author: [Julia Gschwend](mailto:julia@linea.org.br)\n", "\n", - "Last verified run: **2024-Jul-22**" + "Last verified run: **2024-Dec-11**" ] }, { @@ -40,7 +40,7 @@ "tags": [] }, "source": [ - "The PZ Server is an online service available for the LSST Community to host and share lightweight photo-z (PZ) -related data products. The upload and download of data and metadata can be done at the website [pz-server.linea.org.br](https://pz-server.linea.org.br/) (during the development phase, a test environment is available at [pz-server-dev.linea.org.br](https://pz-server-dev.linea.org.br/)). There, you will find two separate pages containing a list of data products each: one for Rubin Observatory Data Management's official data products and the other for user-generated data products. **The registered data products can also be accessed directly from Python code using the PZ Server's data access API, as demonstrated below.**\n", + "The PZ Server is an online service available for the LSST Community to host and share lightweight photo-z (PZ) -related data products. The upload and download of data and metadata can be done at the website [pz-server.linea.org.br](https://pz-server.linea.org.br/) (during the development phase, a test environment is available at [pz-server-dev.linea.org.br](https://pz-server-dev.linea.org.br/)). There, you will find two pages containing a list of data products each: one for Rubin Observatory Data Management's official data products and the other for user-generated data products. **The registered data products can also be accessed directly from Python code using the PZ Server's data access API, as demonstrated below.**\n", "\n", "The PZ Server is developed and delivered as part of the in-kind contribution program BRA-LIN, from LIneA to the Rubin Observatory's LSST project. The service is hosted in the Brazilian IDAC, not directly connected to the [Rubin Science Platform (RSP)](https://data.lsst.cloud/). However, user authorization requires the same credentials as RSP. For comprehensive documentation about the PZ Server, please visit the [PZ Server's documentation page](https://linea-it.github.io/pz-lsst-inkind-doc/). There, you will also find an overview of all LIneA's contributions related to the PZ production. The internal documentation of the API functions is available on the [API's documentation page](https://linea-it.github.io/pzserver). " ] @@ -51,14 +51,7 @@ "source": [ "### How to upload a data product on the PZ Server website\n", "\n", - "To upload a data product, click on the button **NEW PRODUCT** on the top left of the **User-generated Data Products** page and fill in the Upload Form with relevant metadata. Alternatively, the user can upload files to the PZ Server programmatically via the `pzserver` Python Library (described below). \n", - "\n", - "The photo-z-related products are organized into four categories (product types):\n", - "\n", - "- **Spec-z Catalog:** Catalog of spectroscopic redshifts and positions (usually equatorial coordinates).\n", - "- **Training Set:** Sample for training photo-z algorithms (tabular data). It usually contains magnitudes, errors, and true redshifts.\n", - "- **Photo-z Validation Results:** The Results of a photo-z validation procedure (free format). They usually contain photo-z estimates (single estimates and/or PDFs) of a validation set, photo-z validation metrics, validation plots, etc.\n", - "- **Photo-z Table**: This category is for the results of a photo-z estimation procedure. Ideally, the data should be in the same format as the photo-z tables delivered by the DM as part of the LSST data releases. If the data is larger than the file upload limit (200MB), the product entry will store only the metadata, and instructions on accessing the data should be provided in the description field. Storage space can be provided exceptionally for larger tables, depending on the science project justification (to be evaluated by IDAC's management committee). " + "To upload a data product, click the button **NEW PRODUCT** on the top left of the **User-generated Data Products** page and fill in the Upload Form with relevant metadata. Alternatively, the user can programmatically upload files to the PZ Server via the `pzserver` Python Library (described below). " ] }, { @@ -92,22 +85,24 @@ "source": [ "### Installation\n", "\n", - "**For regular users**\n", - "\n", - "The PZ Server API is avalialble on **pip** as `pzserver`. To install the API and its dependencies, type, on the Terminal: \n", + "The PZ Server API is avalialble on **pip** as `pzserver`. To install the API and its dependencies, type on the Terminal: \n", "\n", "```\n", "$ pip install pzserver \n", - "``` " + "```\n", + "\n", + "Or in a notebook code cell: " ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "! pip install pzserver " + "#! pip install pzserver" ] }, { @@ -116,22 +111,8 @@ "jp-MarkdownHeadingCollapsed": true }, "source": [ - "**For developers** \n", - "\n", - "Alternatively, if you have cloned the repository with:\n", - "\n", - "```\n", - "$ git clone https://github.com/linea-it/pzserver.git \n", - "``` \n", - "\n", - "To install the API and its dependencies, type:\n", - "\n", - "```\n", - "$ pip install .[dev]\n", - "```\n", - "\n", "--- \n", - "OBS: You might need to restart the kernel on the notebook to incorporate the new library. " + "OBS: Depending on your Jupyter Lab version, you might need to restart the kernel to incorporate the new library. " ] }, { @@ -182,7 +163,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For convenience, the token can be saved into a file named as `token.txt` (which is already listed in the .gitignore file in this repository). " + "For convenience, the token can be saved as `token.txt` (which is already listed in the .gitignore file in this repository). " ] }, { @@ -207,7 +188,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The object `pz_server` just created above can provide access to data and metadata stored in the PZ Server. It also brings useful methods for users to navigate through the available contents. The methods with the preffix `get_` return the result of a query on the PZ Server database as a Python dictionary, and are most useful to be used programatically (see details on the [API documentation page](https://linea-it.github.io/pzserver/html/index.html)). Alternatively, those with the preffix `display_` show the results as a styled [_Pandas DataFrames_](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html), optimized for Jupyter Notebook (note: column names might change in the display version). For instance:\n", + "The object `pz_server` created above can provide access to data and metadata stored in the PZ Server. It also brings additional methods for users to navigate through the available content. The methods with the prefix `get_` return the result of a query on the PZ Server database as a Python dictionary and are most useful to be used programmatically (see details on the [API documentation page](https://linea-it.github.io/pzserver/html/index.html)). Alternatively, those with the prefix `display_` show the results as a styled [_Pandas DataFrames_](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html), optimized for Jupyter Notebook (note: column names might change in the display version). For instance:\n", "\n", "Display the list of product types supported with a short description;" ] @@ -231,7 +212,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "pz_server.display_users()" @@ -259,13 +242,14 @@ "source": [ "---\n", "\n", - "Display all data products available (WARNING: this list can rapidly grow during the survey's operation). " + "Display all available data products (WARNING: This list can rapidly grow during the survey's operation). " ] }, { "cell_type": "code", "execution_count": null, "metadata": { + "scrolled": true, "tags": [] }, "outputs": [], @@ -277,16 +261,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The information about product type, users, and releases shown above can be used to filter the data products of interest for your search. For that, the method `list_products` receives as argument a dictionary mapping the products attributes to their values. " + "The information about product type, users, and releases shown above can be used to filter the data products of interest for your search. For that, the method `list_products` receives as an argument a dictionary mapping the product's attributes to their values. " ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ - "pz_server.display_products_list(filters={\"release\": \"LSST DP0\", \n", + "pz_server.display_products_list(filters={\"release\": \"LSST DP0.2\", \n", " \"product_type\": \"Training Set\"})" ] }, @@ -294,13 +280,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It also works if we type a string pattern that is part of the value. For instance, just \"DP0\" instead of \"LSST DP0\": " + "It also works if we type a string pattern that is part of the value. For instance, just \"DP0\" instead of \"LSST DP0.2\": " ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [], "source": [ "pz_server.display_products_list(filters={\"release\": \"DP0\"})" @@ -310,13 +298,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "It also allows the search for multiple strings by adding the suffix `__or` (two underscores + \"or\") to the search key. For instance, to get spec-z catalogs and training sets in the same search (notice that filtering is not case sensitive):" + "It also allows the search for multiple strings by adding the suffix `__or` (two underscores + \"or\") to the search key. For instance, to get spec-z catalogs and training sets in the same search (notice that filtering is not case-sensitive):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { + "scrolled": true, "tags": [] }, "outputs": [], @@ -328,18 +317,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To fetch the results of a search and attribute to a variable, just change the preffix `display_` by `get_`, like this: " + "To fetch the results of a search and attribute to a variable, just change the prefix `display_` by `get_`, like this: " ] }, { "cell_type": "code", "execution_count": null, "metadata": { + "scrolled": true, "tags": [] }, "outputs": [], "source": [ - "search_results = pz_server.get_products_list(filters={\"product_type\": \"results\"}) # PZ Validation results\n", + "search_results = pz_server.get_products_list(filters={\"product_type\": \"results\"}) \n", "search_results" ] }, @@ -354,7 +344,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The default method to upload a data product to the PZ Server is the upload tool on PZ Server website, as shown above. Alternatively, data products can be sent to the host service using the `pzserver` Python library. \n", + "As shown above, the default method to upload a data product to the PZ Server is the upload tool on the PZ Server website. Alternatively, the `pzserver` Python library can send data products to the host service. \n", "\n", "First, prepare a dictionary with the relevant information about your data product: " ] @@ -403,7 +393,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The metadata of a given data product is the information provided by the user on the upload form. This information is attached to the data product contents and is available for consulting on the PZ Server page or using this Python API (`pzserver`). \n", + "The metadata of a given data product is the information the user provides on the upload form. This information is attached to the data product contents and is available for consulting on the PZ Server page or using this Python API (`pzserver`). \n", "\n", "All data products stored on PZ Server are identified by a unique **id** number or a unique name, a _string_ called **internal_name**, which is created automatically at the moment of the upload by concatenating the product **id** to the name given by its owner (replacing blank spaces by \"_\", lowering cases, and removing special characters). " ] @@ -444,7 +434,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To download any data product stored in the PZ Server, use the `PzServer`'s method `download_product` informing the product's **internal_name** and the path to where it will be saved (the default is the current folder). This method downloads a compressed .zip file which contais all the files uploaded by the user, including data, anciliary files and description files. The time spent to download a data product depends on the internet connection between the user and the host. Let's try it with a small data product. " + "To download any data product stored in the PZ Server, use the `PzServer`'s method `download_product` informing the product's **internal_name** and the path to where it will be saved (the default is the current folder). This method downloads a compressed .zip file, which contains all the files uploaded by the user, including data, ancillary files, and description files. The time spent downloading a data product depends on the internet connection between the user and the host. Let's try it with a small data product. " ] }, { @@ -468,7 +458,7 @@ "\n", "### How to share data products with other RSP users\n", "\n", - "All data products uploaded to the PZ Server are imediately available and visible to all PZ Server users (people with RSP credentials) through the PZ Server website or via the API. Besides informing the product **id** or **internal_name** for programatic access, another way to share a data product is providing the product's URL, which leads to the product's download page. The URL is composed by the PZ Server website address + **/products/** + **internal_name**:\n", + "All data products uploaded to the PZ Server are immediately available and visible to all PZ Server users (people with RSP credentials) through the PZ Server website or via the API. One way to share a data product is by providing the product's URL, which leads to the product's download page. The URL is composed by the PZ Server website address + **/products/** + **internal_name**:\n", "\n", "https://pz-server.linea.org.br/product/ + **internal_name** \n", "\n", @@ -501,7 +491,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Another feature of the PZ Server API is to let users retrieve the contents of a given data product to work on memory (by atributing the results of the method `get_product()` to a variable in the code). This feature is available only for tabular data (product types: **Spec-z Catalog** and **Training Set**). \n", + "The `pzserver` library allows users to retrieve the contents of a given data product to work on memory using the method `get_product()`. This feature is available only for tabular data (product types: **Spec-z Catalog** and **Training Set**). \n", "\n", "By default, the method `get_product` returns an object from a particular class, depending on the product's type. The classes `SpeczCatalog` and `TrainingSet` are simple extensions of `pandas.DataFrame` (via class composition) with a couple of additional attributes and methods, such as the attribute `metadata`, and the method `display_metadata()`. Let's see an example: " ] @@ -529,7 +519,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The tabular data is allocated in the attribute `data`, which is a `pandas.DataFrame`. " + "The tabular data is allocated in the attribute `data`, a `pandas.DataFrame`. " ] }, { @@ -579,7 +569,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the prod-types you will see details about these specific classes. For those who prefer working with `astropy.Table` or pure `pandas.DataFrame`, the method `get_product()` gives the flexibility to choose the output format (`fmt=\"pandas\"` or `fmt=\"astropy\"`). " + "For those who prefer working with `astropy.Table` or pure `pandas.DataFrame`, the method `get_product()` gives the flexibility to choose the output format (`fmt=\"pandas\"` or `fmt=\"astropy\"`). " ] }, { @@ -608,14 +598,251 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Specific features for each product type \n", + "---\n", + "\n", + "Next, let's explore specific features for each product type... " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": { + "iopub.execute_input": "2024-12-11T14:43:17.277296Z", + "iopub.status.busy": "2024-12-11T14:43:17.276646Z", + "iopub.status.idle": "2024-12-11T14:43:17.345452Z", + "shell.execute_reply": "2024-12-11T14:43:17.344690Z", + "shell.execute_reply.started": "2024-12-11T14:43:17.277264Z" + } + }, + "source": [ + "## Spec-z Catalogs " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": { + "iopub.execute_input": "2024-12-11T14:44:23.295109Z", + "iopub.status.busy": "2024-12-11T14:44:23.294100Z", + "iopub.status.idle": "2024-12-11T14:44:23.394796Z", + "shell.execute_reply": "2024-12-11T14:44:23.393752Z", + "shell.execute_reply.started": "2024-12-11T14:44:23.295078Z" + } + }, + "source": [ + "In the context of the PZ Server, Spec-z Catalogs are defined as any catalog containing spherical equatorial coordinates and spectroscopic redshift measurements (or, analogously, true redshifts from simulations). A Spec-z Catalog can include data from a single spectroscopic survey or a combination of data from several sources. To be considered a single Spec-z Catalog, the data should be provided as a single file to PZ Server's upload tool. For multi-survey catalogs, adding the survey name or identification as an extra column is recommended. \n", + "\n", + "\n", + "Mandatory columns: \n", + "* Right ascension [degrees] - `float`\n", + "* Declination [degrees] - `float`\n", + "* Spectroscopic or true redshift - `float`\n", + "\n", + "Recommended columns: \n", + "* Spectroscopic redshift error - `float`\n", + "* Quality flag - `integer`, `float`, or `string`\n", + "* Survey name (recommended for compilations of data from different surveys)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's see an example of Spec-z Catalog: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gama = pz_server.get_product(14)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gama.display_metadata()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The attribute `data`, which is a `DataFrame` preserves the `plot` method from Pandas. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display basic statistics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gama.data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gama.data.plot(x=\"RA\", y=\"DEC\", kind=\"scatter\") " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gama.data.hist('Z')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "execution": { + "iopub.execute_input": "2024-12-11T14:48:50.817530Z", + "iopub.status.busy": "2024-12-11T14:48:50.816805Z", + "iopub.status.idle": "2024-12-11T14:48:50.887900Z", + "shell.execute_reply": "2024-12-11T14:48:50.886976Z", + "shell.execute_reply.started": "2024-12-11T14:48:50.817502Z" + } + }, + "source": [ + "## Training Sets \n", + " \n", + "In the context of the PZ Server, Training Sets are defined as the product of matching (spatially) a given Spec-z Catalog (single survey or compilation) to the photometric data, in this case, the LSST Objects Catalog. The PZ Server API offers a Training Set Maker tool that allows users to build customized Training Sets based on the available Spec-z Catalogs (details below). \n", + "\n", + "\n", + "_Note 1: Training sets are commonly split into two or more subsets for photo-z validation purposes. If the Training Set owner has previously defined which objects should belong to each subset (training and validation/test sets), this information must be available as an extra column in the table or as clear instructions for reproducing the subset separation in the data product description._\n", "\n", - "Please take a look at the other tutorial notebooks with particular examples of how to use the `pzserver` library to access and manipulate data from the PZ Server. \n", + " \n", + "_Note 2: The PZ Server only supports catalog-level Training Sets. Image-based Training Sets, e.g., for deep-learning algorithms, are not supported yet._\n", + "\n", + "\n", + "Mandatory column: \n", + "* Spectroscopic (or true) redshift - `float`\n", + "\n", + "Other expected columns\n", + "* Object ID from LSST Objects Catalog - `integer`\n", + "* Observables: magnitudes (and/or colors, or fluxes) from LSST Objects Catalog - `float`\n", + "* Observable errors: magnitude errors (and/or color errors, or flux errors) from LSST Objects Catalog - `float`\n", + "* Right ascension [degrees] - `float`\n", + "* Declination [degrees] - `float`\n", + "* Quality Flag - `integer`, `float`, or `string`\n", + "* Subset Flag - `integer`, `float`, or `string`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "train_goldenspike = pz_server.get_product(9)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "train_goldenspike.display_metadata()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Display basic statistics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_goldenspike.data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_goldenspike.data.hist('redshift', bins=20)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_goldenspike.data.hist('mag_i_lsst', bins=20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training and Validation Results\n", "\n", + "The results of training or validating PZ algorithms can not be loaded into memory directly but can be downloaded to the local work directory. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pz_server.download_product(\"182_example_tpz_training_results\", save_in=\".\") " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PZ Server Pipelines (under development) \n", "\n", + "Spec-z Catalogs and Training Sets can be created using the cross-matching pipelines available on the PZ Server. Any catalog built by the pipeline is automatically registered as a regular user-generated data product and is the same as the uploaded ones. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "--- \n", "\n", - "### Users feedback \n", + "## User feedback \n", "\n", "Is something important missing? [Click here to open an issue in the PZ Server library repository on GitHub](https://github.com/linea-it/pzserver/issues/new). " ] @@ -623,9 +850,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "LSST", "language": "python", - "name": "python3" + "name": "lsst" }, "language_info": { "codemirror_mode": { @@ -637,7 +864,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.11.9" }, "nbsphinx": { "execute": "never" From 7991492e3db283149d02bf2f217410fdf9bd900b Mon Sep 17 00:00:00 2001 From: Julia Date: Wed, 11 Dec 2024 15:27:13 +0000 Subject: [PATCH 8/9] organize qa notebooks in a folder --- .../public-specz-compilation.ipynb | 0 .../public-training-set-des-dr2.ipynb | 0 docs/notebooks/rst/0_introduction.rst | 432 -- docs/notebooks/rst/1_specz_catalogs.rst | 350 -- docs/notebooks/rst/2_training_sets.rst | 397 -- docs/notebooks/rst/output_18_0.png | Bin 24587 -> 0 bytes docs/notebooks/rst/output_20_0.png | Bin 21275 -> 0 bytes docs/notebooks/rst/output_22_1.png | Bin 18320 -> 0 bytes docs/notebooks/rst/output_70_1.png | Bin 0 -> 17671 bytes docs/notebooks/rst/output_71_1.png | Bin 0 -> 12200 bytes docs/notebooks/rst/output_78_1.png | Bin 0 -> 9555 bytes docs/notebooks/rst/output_79_1.png | Bin 0 -> 10219 bytes docs/notebooks/rst/pzserver_tutorial.rst | 3522 +++++++++++++++++ 13 files changed, 3522 insertions(+), 1179 deletions(-) rename docs/notebooks/{ => qa_notebooks}/public-specz-compilation.ipynb (100%) rename docs/notebooks/{ => qa_notebooks}/public-training-set-des-dr2.ipynb (100%) delete mode 100644 docs/notebooks/rst/0_introduction.rst delete mode 100644 docs/notebooks/rst/1_specz_catalogs.rst delete mode 100644 docs/notebooks/rst/2_training_sets.rst delete mode 100644 docs/notebooks/rst/output_18_0.png delete mode 100644 docs/notebooks/rst/output_20_0.png delete mode 100644 docs/notebooks/rst/output_22_1.png create mode 100644 docs/notebooks/rst/output_70_1.png create mode 100644 docs/notebooks/rst/output_71_1.png create mode 100644 docs/notebooks/rst/output_78_1.png create mode 100644 docs/notebooks/rst/output_79_1.png create mode 100644 docs/notebooks/rst/pzserver_tutorial.rst diff --git a/docs/notebooks/public-specz-compilation.ipynb b/docs/notebooks/qa_notebooks/public-specz-compilation.ipynb similarity index 100% rename from docs/notebooks/public-specz-compilation.ipynb rename to docs/notebooks/qa_notebooks/public-specz-compilation.ipynb diff --git a/docs/notebooks/public-training-set-des-dr2.ipynb b/docs/notebooks/qa_notebooks/public-training-set-des-dr2.ipynb similarity index 100% rename from docs/notebooks/public-training-set-des-dr2.ipynb rename to docs/notebooks/qa_notebooks/public-training-set-des-dr2.ipynb diff --git a/docs/notebooks/rst/0_introduction.rst b/docs/notebooks/rst/0_introduction.rst deleted file mode 100644 index 1f93f2c..0000000 --- a/docs/notebooks/rst/0_introduction.rst +++ /dev/null @@ -1,432 +0,0 @@ -Photo-z Server -============== - -Tutorial Notebook 0 - Introduction ----------------------------------- - -Contact author: `Julia Gschwend `__ - -Last verified run: **2024-Jul-22** - -The PZ Server -------------- - -.. container:: - :name: introduction - -Introduction -~~~~~~~~~~~~ - -The PZ Server is an online service available for the LSST Community to -host and share lightweight photo-z (PZ) -related data products. The -upload and download of data and metadata can be done at the website -`pz-server.linea.org.br `__ (during the -development phase, a test environment is available at -`pz-server-dev.linea.org.br `__). -There, you will find two separate pages containing a list of data -products each: one for Rubin Observatory Data Management’s official data -products and the other for user-generated data products. **The -registered data products can also be accessed directly from Python code -using the PZ Server’s data access API, as demonstrated below.** - -The PZ Server is developed and delivered as part of the in-kind -contribution program BRA-LIN, from LIneA to the Rubin Observatory’s LSST -project. The service is hosted in the Brazilian IDAC, not directly -connected to the `Rubin Science Platform -(RSP) `__. However, user authorization -requires the same credentials as RSP. For comprehensive documentation -about the PZ Server, please visit the `PZ Server’s documentation -page `__. There, you -will also find an overview of all LIneA’s contributions related to the -PZ production. The internal documentation of the API functions is -available on the `API’s documentation -page `__. - -How to upload a data product on the PZ Server website -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To upload a data product, click on the button **NEW PRODUCT** on the top -left of the **User-generated Data Products** page and fill in the Upload -Form with relevant metadata. Alternatively, the user can upload files to -the PZ Server programmatically via the ``pzserver`` Python Library -(described below). - -The photo-z-related products are organized into four categories (product -types): - -- **Spec-z Catalog:** Catalog of spectroscopic redshifts and positions - (usually equatorial coordinates). -- **Training Set:** Sample for training photo-z algorithms (tabular - data). It usually contains magnitudes, errors, and true redshifts. -- **Photo-z Validation Results:** The Results of a photo-z validation - procedure (free format). They usually contain photo-z estimates - (single estimates and/or PDFs) of a validation set, photo-z - validation metrics, validation plots, etc. -- **Photo-z Table**: This category is for the results of a photo-z - estimation procedure. Ideally, the data should be in the same format - as the photo-z tables delivered by the DM as part of the LSST data - releases. If the data is larger than the file upload limit (200MB), - the product entry will store only the metadata, and instructions on - accessing the data should be provided in the description field. - Storage space can be provided exceptionally for larger tables, - depending on the science project justification (to be evaluated by - IDAC’s management committee). - -How to download a data product from the PZ Server website -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To download a data product available on the Photo-z Server, go to one of -the two pages by clicking on the card “Rubin Observatory PZ Data -Products” (for official products released by Rubin Data Management Team) -or “User-generated Data Products” (for products uploaded by the members -of LSST community). The **download** button is on the right side of each -data product (each row of the list). Also, there are buttons to -**share**, **remove**, and **edit** the metadata of a given data -product. - -.. raw:: html - -
- -.. raw:: html - -
- -The PZ Server API (Python library ``pzserver``) ------------------------------------------------ - -Installation -~~~~~~~~~~~~ - -**For regular users** - -The PZ Server API is avalialble on **pip** as ``pzserver``. To install -the API and its dependencies, type, on the Terminal: - -:: - - $ pip install pzserver - -.. code:: ipython3 - - ! pip install pzserver - -**For developers** - -Alternatively, if you have cloned the repository with: - -:: - - $ git clone https://github.com/linea-it/pzserver.git - -To install the API and its dependencies, type: - -:: - - $ pip install .[dev] - --------------- - -OBS: You might need to restart the kernel on the notebook to incorporate -the new library. - -Imports and Setup -~~~~~~~~~~~~~~~~~ - -.. code:: ipython3 - - from pzserver import PzServer - import matplotlib.pyplot as plt - %reload_ext autoreload - %autoreload 2 - -The connection with the PZ Server from Python code is done by an object -of the class ``PzServer``. To get authorization to define an instance of -``PzServer``, the users must provide an **API Token** generated on the -top right menu on the `PZ Server -website `__ (during the development -phase, on the `test -environment `__). - - - -.. code:: ipython3 - - # pz_server = PzServer(token="", host="pz-dev") # "pz-dev" is the temporary host for test phase - -For convenience, the token can be saved into a file named as -``token.txt`` (which is already listed in the .gitignore file in this -repository). - -.. code:: ipython3 - - with open('token.txt', 'r') as file: - token = file.read() - pz_server = PzServer(token=token, host="pz-dev") # "pz-dev" is the temporary host for test phase - -How to get general info from PZ Server -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The object ``pz_server`` just created above can provide access to data -and metadata stored in the PZ Server. It also brings useful methods for -users to navigate through the available contents. The methods with the -preffix ``get_`` return the result of a query on the PZ Server database -as a Python dictionary, and are most useful to be used programatically -(see details on the `API documentation -page `__). -Alternatively, those with the preffix ``display_`` show the results as a -styled `Pandas -DataFrames `__, -optimized for Jupyter Notebook (note: column names might change in the -display version). For instance: - -Display the list of product types supported with a short description; - -.. code:: ipython3 - - pz_server.display_product_types() - -Display the list of users who uploaded data products to the server; - -.. code:: ipython3 - - pz_server.display_users() - -Display the list of data releases available at the time; - -.. code:: ipython3 - - pz_server.display_releases() - --------------- - -Display all data products available (WARNING: this list can rapidly grow -during the survey’s operation). - -.. code:: ipython3 - - pz_server.display_products_list() - -The information about product type, users, and releases shown above can -be used to filter the data products of interest for your search. For -that, the method ``list_products`` receives as argument a dictionary -mapping the products attributes to their values. - -.. code:: ipython3 - - pz_server.display_products_list(filters={"release": "LSST DP0", - "product_type": "Training Set"}) - -It also works if we type a string pattern that is part of the value. For -instance, just “DP0” instead of “LSST DP0”: - -.. code:: ipython3 - - pz_server.display_products_list(filters={"release": "DP0"}) - -It also allows the search for multiple strings by adding the suffix -``__or`` (two underscores + “or”) to the search key. For instance, to -get spec-z catalogs and training sets in the same search (notice that -filtering is not case sensitive): - -.. code:: ipython3 - - pz_server.display_products_list(filters={"product_type__or": ["Spec-z Catalog", "training set"]}) - -To fetch the results of a search and attribute to a variable, just -change the preffix ``display_`` by ``get_``, like this: - -.. code:: ipython3 - - search_results = pz_server.get_products_list(filters={"product_type": "results"}) # PZ Validation results - search_results - -How to upload a data product to via Python API (alternative method) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The default method to upload a data product to the PZ Server is the -upload tool on PZ Server website, as shown above. Alternatively, data -products can be sent to the host service using the ``pzserver`` Python -library. - -First, prepare a dictionary with the relevant information about your -data product: - -.. code:: ipython3 - - data_to_upload = { - "name":"example upload via lib", - "product_type": "specz_catalog", # Product type - "release": None, # LSST release, use None if not LSST data - "main_file": "example.csv", # full path - "auxiliary_files": ["example.html", "example.ipynb"] # full path - } - -.. code:: ipython3 - - upload = pz_server.upload(**data_to_upload) - -.. code:: ipython3 - - upload.product_id - -How to display the metadata of a data product -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The metadata of a given data product is the information provided by the -user on the upload form. This information is attached to the data -product contents and is available for consulting on the PZ Server page -or using this Python API (``pzserver``). - -All data products stored on PZ Server are identified by a unique **id** -number or a unique name, a *string* called **internal_name**, which is -created automatically at the moment of the upload by concatenating the -product **id** to the name given by its owner (replacing blank spaces by -"_", lowering cases, and removing special characters). - -The ``PzServer``\ ’s method ``get_product_metadata()`` returns a -dictionary with the attibutes stored in the PZ Server about a given data -product identified by its **id** or **internal_name**. For use in a -Jupyter notebook, the equivalent ``display_product_metadata()`` shows -the results in a formated table. - -.. code:: ipython3 - - # pz_server.display_product_metadata() - # pz_server.display_product_metadata(6) - # pz_server.display_product_metadata("6") - pz_server.display_product_metadata("6_simple_training_set") - -.. container:: - :name: how-to-download-data-products-as-zip-files - - `back to the top <#notebook-contents>`__ - -How to download data products as .zip files -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To download any data product stored in the PZ Server, use the -``PzServer``\ ’s method ``download_product`` informing the product’s -**internal_name** and the path to where it will be saved (the default is -the current folder). This method downloads a compressed .zip file which -contais all the files uploaded by the user, including data, anciliary -files and description files. The time spent to download a data product -depends on the internet connection between the user and the host. Let’s -try it with a small data product. - -.. code:: ipython3 - - pz_server.download_product(14, save_in=".") - -.. container:: - :name: how-to-share-data-products-with-other-rsp-users - - `back to the top <#notebook-contents>`__ - -How to share data products with other RSP users -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -All data products uploaded to the PZ Server are imediately available and -visible to all PZ Server users (people with RSP credentials) through the -PZ Server website or via the API. Besides informing the product **id** -or **internal_name** for programatic access, another way to share a data -product is providing the product’s URL, which leads to the product’s -download page. The URL is composed by the PZ Server website address + -**/products/** + **internal_name**: - -https://pz-server.linea.org.br/product/ + **internal_name** - -or, if still in the development phase, - -https://pz-server-dev.linea.org.br/product/ + **internal_name** - -For example: - -https://pz-server-dev.linea.org.br/product/6_simple_training_set - -WARNING: The URL works only with the **complete internal name**, not -with just the **id** number. - -.. container:: - :name: how-to-retrieve-contents-of-data-products-work-on-memory - - `back to the top <#notebook-contents>`__ - -How to retrieve contents of data products (work on memory) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Another feature of the PZ Server API is to let users retrieve the -contents of a given data product to work on memory (by atributing the -results of the method ``get_product()`` to a variable in the code). This -feature is available only for tabular data (product types: **Spec-z -Catalog** and **Training Set**). - -By default, the method ``get_product`` returns an object from a -particular class, depending on the product’s type. The classes -``SpeczCatalog`` and ``TrainingSet`` are simple extensions of -``pandas.DataFrame`` (via class composition) with a couple of additional -attributes and methods, such as the attribute ``metadata``, and the -method ``display_metadata()``. Let’s see an example: - -.. code:: ipython3 - - catalog = pz_server.get_product(8) - catalog - -.. code:: ipython3 - - catalog.display_metadata() - -The tabular data is allocated in the attribute ``data``, which is a -``pandas.DataFrame``. - -.. code:: ipython3 - - catalog.data - -.. code:: ipython3 - - type(catalog.data) - -It preserves the useful methods from ``pandas.DataFrame``, such as: - -.. code:: ipython3 - - catalog.data.info() - -.. code:: ipython3 - - catalog.data.describe() - -In the prod-types you will see details about these specific classes. For -those who prefer working with ``astropy.Table`` or pure -``pandas.DataFrame``, the method ``get_product()`` gives the flexibility -to choose the output format (``fmt="pandas"`` or ``fmt="astropy"``). - -.. code:: ipython3 - - dataframe = pz_server.get_product(8, fmt="pandas") - print(type(dataframe)) - dataframe - -.. code:: ipython3 - - table = pz_server.get_product(8, fmt="astropy") - print(type(table)) - table - -Specific features for each product type -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Please take a look at the other tutorial notebooks with particular -examples of how to use the ``pzserver`` library to access and manipulate -data from the PZ Server. - --------------- - -Users feedback -~~~~~~~~~~~~~~ - -Is something important missing? `Click here to open an issue in the PZ -Server library repository on -GitHub `__. diff --git a/docs/notebooks/rst/1_specz_catalogs.rst b/docs/notebooks/rst/1_specz_catalogs.rst deleted file mode 100644 index f3745b7..0000000 --- a/docs/notebooks/rst/1_specz_catalogs.rst +++ /dev/null @@ -1,350 +0,0 @@ -Photo-z Server -============== - -Tutorial Notebook 1 - Spec-z Catalogs -------------------------------------- - -Contact author: `Julia Gschwend `__ - -Last verified run: **2024-Jul-22** - -Introduction -~~~~~~~~~~~~ - -Welcome to the PZ Server tutorials. If you are reading this notebook for -the first time, we recommend not to skip the introduction notebook: -``0_introduction.ipynb`` also available in this same repository. - -Imports and Setup -~~~~~~~~~~~~~~~~~ - -.. code:: ipython3 - - from pzserver import PzServer - import matplotlib.pyplot as plt - %reload_ext autoreload - %autoreload 2 - -.. code:: ipython3 - - # pz_server = PzServer(token="", host="pz-dev") # "pz-dev" is the temporary host for test phase - -For convenience, the token can be saved into a file named as -``token.txt`` (which is already listed in the .gitignore file in this -repository). - -.. code:: ipython3 - - with open('token.txt', 'r') as file: - token = file.read() - pz_server = PzServer(token=token, host="pz-dev") # "pz-dev" is the temporary host for test phase - -Product types -~~~~~~~~~~~~~ - -The PZ Server API provides Python classes with useful methods to handle -particular product types. Let’s recap the product types available: - -.. code:: ipython3 - - pz_server.display_product_types() - - - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Product typeDescription
Spec-z CatalogCatalog of spectroscopic redshifts and positions (usually equatorial coordinates).
Training SetTraining set for photo-z algorithms (tabular data). It usually contains magnitudes, errors, and true redshifts.
Validation ResultsResults of a photo-z validation procedure (free format). Usually contains photo-z estimates (single estimates and/or pdf) of a validation set and photo-z validation metrics.
Photo-z TableResults of a photo-z estimation procedure. If the data is larger than the file upload limit (200MB), the product entry stores only the metadata (instructions on accessing the data should be provided in the description field.
- - - -Spec-z Catalogs ---------------- - -In the context of the PZ Server, Spec-z Catalogs are defined as any -catalog containing spherical equatorial coordinates and spectroscopic -redshift measurements (or, analogously, true redshifts from -simulations). A Spec-z Catalog can include data from a single -spectroscopic survey or a combination of data from several sources. To -be considered as a single Spec-z Catalog, the data should be provided as -a single file to PZ Server’s upload tool. For multi-survey catalogs, it -is recommended to add the survey name or identification as an extra -column. - -Mandatory columns: \* Right ascension [degrees] - ``float`` \* -Declination [degrees] - ``float`` \* Spectroscopic or true redshift - -``float`` - -Recommended columns: \* Spectroscopic redshift error - ``float`` \* -Quality flag - ``integer``, ``float``, or ``string`` \* Survey name -(recommended for compilations of data from different surveys) - -PZ Server Pipelines -^^^^^^^^^^^^^^^^^^^ - -Spec-z Catalogs can be uploaded by users on PZ Server website or via the -``pzserver`` library. Also, they can be created as the combination of a -list of other Spec-z Catalogs previously registered in the system by the -PZ Sever’s pipeline “Combine Spec-z Catalogs” (under development). Any -catalog built by the pipeline is automaticaly registered as a regular -user-generated data product and has no difference from the uploaded -ones. - -Let’s see an example of Spec-z Catalog: - -.. code:: ipython3 - - gama = pz_server.get_product(14) - - -.. parsed-literal:: - - Connecting to PZ Server... - Done! - - -.. code:: ipython3 - - gama.display_metadata() - - - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
keyvalue
id14
releaseNone
product_typeSpec-z Catalog
uploaded_bygschwend
internal_name14_gama_specz_subsample
product_nameGAMA spec-z subsample
official_productFalse
pz_code
descriptionA small subsample of the GAMA DR3 spec-z catalog (Baldry et al. 2018) as an example of a typical spec-z catalog from the literature.
created_at2023-03-29T20:02:45.223568Z
main_filespecz_subsample_gama_example.csv
- - - -Display basic statistics - -.. code:: ipython3 - - gama.data.describe() - - - - -.. raw:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IDRADECZERR_ZFLAG_DES
count2.576000e+032576.0000002576.0000002576.0000002576.02576.000000
mean1.105526e+06154.526343-1.1018650.22481199.03.949534
std4.006668e+0470.7838682.9950360.1025710.00.218947
.....................
50%1.103558e+06180.140145-0.4808300.21780499.04.000000
75%1.140619e+06215.8365831.1703630.29181099.04.000000
max1.176440e+06223.4970802.9981800.72871799.04.000000
-

8 rows × 6 columns

-
- - - -The spec-z catalog object has a very basic plot method for quick -visualization of catalog properties. For advanced interactive data -visualization tips, we recommend the notebook -`DP02_06b_Interactive_Catalog_Visualization.ipynb `__ -from Rubin Observatory’s DP0.2 `tutorial-notebooks -repository `__. - -.. code:: ipython3 - - gama.plot() - - - -.. image:: output_20_0.png - - -The attribute ``data``, which is a ``DataFrame`` preserves the ``plot`` -method from Pandas. - -.. code:: ipython3 - - gama.data.plot(x="RA", y="DEC", kind="scatter") - - - - -.. parsed-literal:: - - - - - - -.. image:: output_22_1.png - - --------------- - -Users feedback -~~~~~~~~~~~~~~ - -Is something important missing? `Click here to open an issue in the PZ -Server library repository on -GitHub `__. diff --git a/docs/notebooks/rst/2_training_sets.rst b/docs/notebooks/rst/2_training_sets.rst deleted file mode 100644 index ab04d91..0000000 --- a/docs/notebooks/rst/2_training_sets.rst +++ /dev/null @@ -1,397 +0,0 @@ -Photo-z Server -============== - -Tutorial Notebook 2 - Training Sets ------------------------------------ - -Contact author: `Julia Gschwend `__ - -Last verified run: **2024-Jul-22** - -Introduction -~~~~~~~~~~~~ - -Welcome to the PZ Server tutorials. If you are reading this notebook for -the first time, we recommend not to skip the introduction notebook: -``0_introduction.ipynb`` also available in this same repository. - -Imports and Setup -~~~~~~~~~~~~~~~~~ - -.. code:: ipython3 - - from pzserver import PzServer - import matplotlib.pyplot as plt - %reload_ext autoreload - %autoreload 2 - -.. code:: ipython3 - - # pz_server = PzServer(token="", host="pz-dev") # "pz-dev" is the temporary host for test phase - -For convenience, the token can be saved into a file named as -``token.txt`` (which is already listed in the .gitignore file in this -repository). - -.. code:: ipython3 - - with open('token.txt', 'r') as file: - token = file.read() - pz_server = PzServer(token=token, host="pz-dev") # "pz-dev" is the temporary host for test phase - -Product types -~~~~~~~~~~~~~ - -The PZ Server API provides Python classes with useful methods to handle -particular product types. Let’s recap the product types available: - -.. code:: ipython3 - - pz_server.display_product_types() - - - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Product typeDescription
Spec-z CatalogCatalog of spectroscopic redshifts and positions (usually equatorial coordinates).
Training SetTraining set for photo-z algorithms (tabular data). It usually contains magnitudes, errors, and true redshifts.
Validation ResultsResults of a photo-z validation procedure (free format). Usually contains photo-z estimates (single estimates and/or pdf) of a validation set and photo-z validation metrics.
Photo-z TableResults of a photo-z estimation procedure. If the data is larger than the file upload limit (200MB), the product entry stores only the metadata (instructions on accessing the data should be provided in the description field.
- - - -Training Sets -------------- - -In the context of the PZ Server, Training Sets are defined as the -product of matching (spatially) a given Spec-z Catalog (single survey or -compilation) to the photometric data, in this case, the LSST Objects -Catalog. The PZ Server API offers a tool called *Training Set Maker* for -users to build customized Training Sets based on the Spec-z Catalogs -available. Please see the companion Jupyter Notebook -``pz_tsm_tutorial.ipynb`` for details. - -*Note 1: Commonly the training set is split into two or more subsets for -photo-z validation purposes. If the Training Set owner has previously -defined which objects should belong to each subset (trainining and -validation/test sets), this information must be available as an extra -column in the table or as clear instructions for reproducing the subsets -separation in the data product description.* - -*Note 2: The PZ Server only supports catalog-level Training Sets. -Image-based Training Sets, e.g., for deep-learning algorithms, are not -supported yet.* - -Mandatory column: \* Spectroscopic (or true) redshift - ``float`` - -Other expected columns \* Object ID from LSST Objects Catalog - -``integer`` \* Observables: magnitudes (and/or colors, or fluxes) from -LSST Objects Catalog - ``float`` \* Observable errors: magnitude errors -(and/or color errors, or flux errors) from LSST Objects Catalog - -``float`` \* Right ascension [degrees] - ``float`` \* Declination -[degrees] - ``float`` \* Quality Flag - ``integer``, ``float``, or -``string`` \* Subset Flag - ``integer``, ``float``, or ``string`` - -PZ Server Pipelines -^^^^^^^^^^^^^^^^^^^ - -Training Sets can be uploaded by users on PZ Server website or via the -``pzserver`` library. Also, they can be created as the spatial -cross-matching between a given Spec-z Catalog previously registered in -the system and an Object table from a given LSST Data Release available -in the Brazilian IDAC by the PZ Sever’s pipeline “Training Set Maker” -(under development). Any Training Set built by the pipeline is -automatically registered as a regular user-generated data product and -has no difference from the uploaded ones. - -.. code:: ipython3 - - train_goldenspike = pz_server.get_product(9) - - -.. parsed-literal:: - - Connecting to PZ Server... - Done! - - -.. code:: ipython3 - - train_goldenspike.display_metadata() - - - -.. raw:: html - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
keyvalue
id9
releaseNone
product_typeTraining Set
uploaded_bygschwend
internal_name9_goldenspike_train_data_hdf5
product_nameGoldenspike train data hdf5
official_productFalse
pz_code
descriptionA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. - Test upload of files in hdf5 format.
created_at2023-03-29T19:12:59.746096Z
main_filegoldenspike_train_data.hdf5
- - - -Display basic statistics - -.. code:: ipython3 - - train_goldenspike.data.describe() - - - - -.. raw:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mag_err_g_lsstmag_err_i_lsstmag_err_r_lsstmag_err_u_lsstmag_err_y_lsstmag_err_z_lsstmag_g_lsstmag_i_lsstmag_r_lsstmag_u_lsstmag_y_lsstmag_z_lsstredshift
count62.00000062.00000062.00000061.00000061.00000062.00000062.00000062.00000062.00000061.00000061.00000062.00000062.000000
mean0.0381820.0161650.0187700.1880500.0546820.02147824.82000023.38480424.00397025.44600822.93235423.0744810.780298
std0.0363980.0100690.0137500.1937470.1158750.0149611.3141121.3815871.3873581.2692771.5402841.4006730.355365
..........................................
50%0.0283090.0133900.0166600.1338150.0341990.01854025.06997023.74850624.47021525.57702923.29338423.5141850.764600
75%0.0495760.0246500.0258020.2388590.0635850.03255725.70548624.48865424.98522526.26328423.99301024.1659440.948494
max0.1981950.0369320.0653601.1540730.9092300.05188327.29615224.94964526.03695828.48239127.34215124.6931321.755764
-

8 rows × 13 columns

-
- - - -The training set object has a very basic plot method for quick -visualization of catalog properties. For advanced interactive data -visualization tips, we recommend the notebook -`DP02_06b_Interactive_Catalog_Visualization.ipynb `__ -from Rubin Observatory’s DP0.2 `tutorial-notebooks -repository `__. - -.. code:: ipython3 - - train_goldenspike.plot(mag_name="mag_i_lsst") - - - -.. image:: output_18_0.png - - --------------- - -Users feedback -~~~~~~~~~~~~~~ - -Is something important missing? `Click here to open an issue in the PZ -Server library repository on -GitHub `__. diff --git a/docs/notebooks/rst/output_18_0.png b/docs/notebooks/rst/output_18_0.png deleted file mode 100644 index 0e2f6f54b9b6730d6b96ee922b9fe8e487e9b4ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24587 zcmdqJcT|_x);0Q|Q4$r65gSDlMFde$=^$VO0g>LMst8g9l-|LHv4Dyoy(k?7L_m5` z1T0i((os};QF{O829lF=-t*pZ$N0wm=l(_#iNI5KS!=F2=i0aAWlzwpVpv5{6rGgh zaYc&yDUzaS+<#t)zlqB|XoWunt;E%>l*|pRY|mQgQ>V^aUAky)b71tmPY1g z+?)cO2lxJNXk~TDQizMo^zR?wG`G0G_51YPYh2`)OOmH8DQewW@-Iz{ShNvE>Doyh zKcZ|G)ZgN)rK~?U|9$-M)$kqeZUygx0|IUvNGE2k_wo9c}Xh@v)mV$$BSJ^z7EmuB3SA@Sm_hdV0vuZT#)G9o?l;FHD>2zVJ}( z!qU>x^o)$X6HKO@UHnwoS-^8#fBRDB14X z9PyfRvz#1}WGCZVR-I+t8?=q<^z-8n9z1AF*1M^wsK_*}nPwar6T>D~vYe_}z7y+@ zq9zUnma$5$TD{t`alR)$Y0sfUTDcCRiUtNz@7}#D{gal8p;`Jtp6r&yyLZ>nZ9Aln zpRnlL&TkgJZ=28xg@Ge&R$go~G`~ za@v|q%TD8xx9{G4czQaeIb^fjbizl~m{Ol?ef|jQjyJE6l-|RRQqLQf`<>U3D^>&? z)W2Pqs2zVQkS|uR#Iw^>_)GyM^Hb$m-2kdzuX02MNsz_q|xM z|0vV)PuiiGnfX$lZs~oQ3itC^_bBUMxWKV{_laA#ZdvECa&gId(K9n^cMQLL`Eu3T zwKn=P6e}AWr!{>S+R!q>z)%fF&KZGp4{K>-3 z!=sE;AO*IOplHslJp7t9or)_FcQga~;R|1Vt)`Mm^QH$Iks$sL4^V zBl?wcSkaT~L#p3y9QE+aqoszn`uO-{&CgBy`1!HL*T$6x3->-avF*XxE!O#4sCKnY zoLX#wWl>mP7)jw58#z=Zy{=xpntHZyWn^SztmF8=RCVZF1fyBT5%b*9M{nO=;qGOo z3rSJv*yQ}=r6r$n(Tk(LFU$v?97}k|5FBy%j`#=vt2KR9xoqF;|B#TTp`41bh|?~8 zI+{E4<9$yqz2duDr^?J-!UtNiS;<(I(YCP zkIT#iLz9}aa!f?TYa`q?M5SpYWrwDHn$31*Hk(G>YEj+#N-{sc%-!vFq|Q9QzSX=w zzU8Ih&gP)k)45}fCJv*uYGmq1`x=z&?d{*ac_S|)bC*>%NIk(>RrQfUS%CggMZYVq zC#m*e<3N|Ou?yl1Rl*uok5#d_yV$f=s7E}llJZhEZNo5aC@&ag$ZB2RyYr>40+!aq zUB`jUk^>sjUigfR*6VU`aKslsQO2H)k_#QM(^6D?^6{hky{{`MYCh1##_ViQReFA9 zpKV@cZeg~`K(=F$gra_8^S;9SaXO#x-Eri%$_)=_Op*09Zx^cdd_s>H>h0sh{(FJ_ zH~TYZ!uo6+J^HU*yS9;usqdB{MTKorsje_cELHm|XnQJ^(PEEeaPGX;-huw7QC0eL z2fa!|F9nz1<0aFn_vOt4hrZ;Jk+CN8-u9Q*-j$cvJ(LrT?M=#W?Zc(o4;8bPbQf+_ z>*3nTnK%~Ia=-j^i6+gXo@w>wY1f`?+0CUz)^UvD?AX_SVy<~Ev%R{#<-&tCMVob> zW)J3RrnlGxZnOWgJ|&!nYF8>%KYU22CT@LhxJk~#=DVL-f;asr$NClIf0kiuYOERE zd*-sg;1&6uiApVt3kUl$fZsgiTUp=*8+wXzdgNbyt33Ffn#x6nK&EJ2?cbD4|1jS) zo_P9Huhjvs(&>z8p~*rG6|#IV5dJZyLJxLt{xzvz)`EB6mzK(+g1}e4E-#Z3GCKP+ zD@uG@=cg<>t$+BY#j#=2P}E`W%X!_$L-zh;_xz*s_6l>+Fu}or2jAOthX$EjwWY*X zkM=B+GA$C({lc~4Q9wqAko~dC4Jv>A?#tAqo{$QWu&1`;0^6GC*n5My@8#wm{%l&5 zTRarK?4+rdb8t>%M&GKvR%^-gl^w6O+Og?ZvG6yliGmk4MwAz|d}zK`RKS=Rm*K>x zyN{Dwkpy8XV7+U=SgrDkqR4|ih8^)c<(*c9k292q*3pNvVGZFzGN#qHW-cdp568y- zZo#>VW#FsaicNAqd_Nz=)ZpW$%f+W1Xt{a^jaOp##>nw`=NgmMEOY7tBfiV-L{An5 zoLd~Rf|Hp~D1}fxyWVrvA#4RT%D*BpIO<<{9lHAFocx(1g=Br>!}aC%vg6M8K6%&< z|2R+ct@-Mo{F@|m(k}hXv%Kserj=w z`}5On{I*6xOR0DRjc)N`@*Yz3V9vA}`1y~*``cV?lPVHoYijUQ>NjtRH(V)Rni3ax z;k4jSw^lUUCtWGlo7zUkWMZotC;dQgbFQ24VA?p_-znGsbJxzL7jY@xu=Bdp+stZ8 zJCjXtFwIsyIYItf=f#=~@leB|AP?AkjsHtCQ!LGBqF)f!v&(AH=8C)-V285|+@hpc_YGqzQalkZZs6CK)L)xDd= z>_2nfxwLK(?YSAxB)c8^{z@!4(Rc9N;^Ye;!X8cB3u&~Weh&UQgkM#%e7C?TtcJJn3VIcsEf!Ej@ z*hf=O6PUqi;?n88n-VnA-lZJ*bWr?-g|k)I$LPU1+5-Pr@z^8RR(4-oCtB&N>%uNI zRi8f>xlU|GzVPO{q-1At@f$#xL44#6WpZX_i3C7c_o^o7=Icbu1}kc41W2De8J`x+ zZ@%sQwTX<4O{;kA$|XEBM{cdGXo$i8mU;ffbtL&iy1$UKIg;BRc6NpFftHP1w#2-9 zCoMAeQIA2)#mS>T<@s|Sle)d@qJN_7?p(kAlk@CoeeGDAeP^)7volwIxkXV1r_;@X zt2=g`e8hI}prWu%pS-m6Z9P{Vosc;^G#S3zo}Ob?G8u;-Bxw0_*a{CUGvtr(=NR_+ zz4ms zr~d4)f`Wqewrl=dTVumAY839rDH?4NQr9w&{oU?H<87b2en0j_d3tAchB)%*6|b57 z#-IOyW!J7<-N;0$$jFPS`O>9lSFc?YVctNs@7l3rN6@wkf9?~(!nSoA)wIqk?x5WG zpEdO(nO7o})yAuFmCR)iWSu171CT{6sbfEPq3|yEbX7NT*&DF{O}~6fC|$jxIyg!F zH1E|!MB%HS74dxo3@vyL%5zl&z8&PTwBE?!-`L5BP2s^LsCZ9g%sqP0)x0gzo+pXr7ox=lXpmHP5gAjy^#m?b;aaY#Z5r^Ndd`wOuB^zI*#N)@HAPfn8Ga+sgobkFOQ!OaE;C^~Y8E zoyJZTlec}I9{VOt_GPG;?s%JP{y@&Ktn+w_?d@B)s!Y>cqG-3-6_lz|)b^pzcesov zhCbmNu}hDjzr{UDHaM=Y@8Z`lU)T;DsOp~F%5BiK&UNBibsmZbkmV`)c5MePw1YD`X0Pkz;BIP}LrR!SRo3d5lb z;l=x=j*~!)|2-wNjUmd|ShwA^o>`yy;GljFNem3{%+gK1e=Z6Txcr1O!_90B6~Ixr zzsKy$)%t?`OugfDy<6>RZIh0ztUnV02p4_vaEbF=s_~hRrRd3d1@r!6)vccipD+a6R(jeC;4{ zcy_V6p$dvHw)Ej{LW^}5zP;_lLQO|iUR=tv8ynu0c`oB|lvzyKJgYfgY}{k{)vSSz zy7v+-lMsT zJlh2n$LBh^T|%CQmAorH1%nIwuE<^&g_7zKnoi~;D+-*Kz`*u1Qw@{iH#K}vEM9rU z?L)R^%87Bs?zitWPRR4p&NLUuEIs4)l4Y%<+6wjH5aeh!32uy9 zwr>-vm4jR{H-{{*?LlncNbkGnKu#KlV%v1y(vxmitzXu9X%n+?Z9#cIbG}_Y-_>^y z^Zf#^gfc3h{-5bquPty1BNUdWyQSxER@I7(TCY6k8OkV`wt2TwmW17xPPe6O`z&rn zPGH9fx7zKsX?*eL)`;=nFXfUwxKR31PU@DyF78pEI#(+8+eVHkU-nwMa7O@sg@;*; zKW2|?ISO6r!XdlMUQ3s}@{MnHP2$T6y3)O}ii=}S85WoBk$oPuIPKJ-rCd+_m#+$T z-M;vBs_Sqv{xCQ})4p82i-}A~<@x_U*+b`+Mu|u2pS5?zpX^j;5tccf*Zz)vhjbBv z3)dMR+NHba$PEY>Sh@hHxpiW&g;pu5?4dhGd*{7OX4xUCtzZ!{9e&6{!tUbqlREjQ zW$hc5W`EuH;-c5#ONH!v|97O6ZU}cgAib)<{=m|}UFYXw75%qaXOpCf*+AB%=+`Fm z{91EYkSFGCI;h>Hq@)`2oU_gyV_`=vljkDuHgR{m>x{xR+I4k^oMNOmt*B}ZiI*#={s5Pz)J93T3c0kLzx2~+}8zHIO=@_j*o~0R87gt4rMqp(% zXCRL$M}o%CR*-SNIu5Z06(I?E&eJ`0n&!1%-aZ^{wydcA_)qSo@D>d<;1w7ck0@)} zlBI(DULUIz?fvLc)Q1m>Cjwn&r;HHlrV#u`S{(=9?q5S_i|5Zjy#8{kguLd8g{j#o zB%~qYFmkEU_IuIh-ZK8Sr^(JsIea}G)qb|OF2T|v=lt8>#3dw*k*%bqq#m%eIP@lX zc5e9Xw~?;!dvS81qC$2ThHQqklAa^bqpSJp8V>2``$f%_VrYO=EsYC zQi|&8>K+xoj~*H0`J`oJltFOp27EL=g5cNAJ&@JQNnR-BLPZ@IC&B^b4!v3p0*_yq zfhstT0ouBCE5jkXXAYx1Uq_l#Dn#S?OdDfBRyiR35r%KYiWRkXOlJ3Ks1WgmYkEC= z=o1{Ap#T0+tXh(e!U`yRx!?` zK9Paj;I0eE6NY;aG2xY!@+HN8?x8Mm)sdy=tqZ(7^_9!j$Obvk*Kdh7D+}b0N6xPe zN!qht+p0=@YO=yLaWz+td_zM+R(DijTv}OaX${~B^SzVO(rhv>O%Ux>UKF_V(@D456JXw_aLdOMg%GB8T#~cP-Bu z72U)M%>=B#DahAz?^RguVjcM3D6|Ofo#9Vah(o~QK-GN0IyEL7LUvO;68r(XHC zmOJPEq|NMYyt)|RDXz|e6;av;ev68;YlA9C&#)MfgmF!)pZ`;6&@;xyv{$3UNI z;Qy>y0-a>cUj=ve6q6rb!X9Q{5+Cd>({Fr~BpW|WKd^>YS7H%cG{4bSstl-3-KQI* z+9^dp&>m0XBR=>Ic0-w_R}DzT3?DN^RdhEldy6tQFjnXR$6f>2Z~fIr zt*6DdP38FU>tp>*(byT41gL_`;#N10?GAYV1cke2<QB(##vlB`w{`XK z%S=(5BFXyShxNNz+v))#q)5x<66OFt(*PZyZ-%A|`ubpEYm)H*4gv?r)7cgOPn>CR z;)muy*0CLK!`#+WAuVQV$S}N)V;7|q@hCo_p-HHgWH;=VeOgCicXhO!?IBKf_Q(4P zB~mc>thj1xNDgC2^k$DvSy#8W;;~&_hNE3og+^_Jog)Q#@z^3wK6ZRzRQJ=FF!@{Z zAClY0P!T-m#w`<^$8R@uroSb--lz=)aqPr|-NWA&h=<95X@(PN9`wUE)6!-po88<| zFQLY=H9|-a5OI7lHrSRFdD6G%#%3LPR7Hzbd4Y17vq$(ae#?5!$?WhkRKZ+=f~OI< z-XUZat`mFu`t@f`yx{@)r2>xQH#K;lSxy_M-1nMs{MRon%y1a%+#$u%&1B{VGh&6_VM9;Do&38raRB5Tvn zZ;N$LjTGKi?d;jJ38ox-_9!bVeom#KN}(IXkT6#}Ha}Fj4tb2{4`jH#i};0R`AWmL zUb}kg5&{vg2~)68(^XWcNlHqljh#My8Y}nFFH$WWXN#LgjcqTL|IELe#?763O?V?4 zyOhx7&(}3xTr@h0g84KF3{J&Ep9-0E!9-{-U%5u!$tg$2v7fia;{Cqb#tQ}p##1BR zo+T*8Z+m!*N~%(BDRC8gcZ!}&59aHFMzJ`gcKUQI3e)4hS{ApYy4%hE#@)QOLCf2T zlGL8km}U}6}C2z&(w?MQ~-~Z zoY-t?;|o(0iyd}H{|RH0yc5^o^;=eOw3DLRE+e6H@bjzDuG?0#z$hi<>!8#pNwm~+ zB^480bZ4{h#t2Y8sm8T?pbwV3R=(u>Z&i-q70PZSd6v-cKsQ}cfo6*7W-UAhrCSIX z)l4@dVW^>sqDINzi42!=dqw>CVKF+`rVDXHK~d4G)oJ+D!|Io{B-6A9S@$nrs9@qI zS5N_q7fyDXv|tu>QU}d2g*rbK|7$(a+|Z{^xvl(|W1qsAKVu=Kh%}C6maJDYlAb?% z>YnJ7VeSH^`10lajqBG5M-(pM@d1#Dxq>XH03qu*D3Gj>rZO@F0B%k}b^F?Rz45Oq zY(BT++!7AAUgyR_00|=K5oBYmRIdmC&Te-`Gx>Pc1Rj*oEzm|sMP(NmF`uBIr-(%+ z-%9<#hE;clx+X#!?Zpxka+-J+V)ywM1fgTPuCr-o`Lj0U)y#9gyJyR;S*hiD`xh5k%E>J%K7C`sN-SF)|Q>e znveW?Y1bm(Jmd!%74S`mS=dGyvXG*Z(yn0tI!L88T^*{Y-p4cCP|*y8=&X4E=(R)n zlWx!FH1B)O+0wp*KpC4!xmL!=bsW37_U*ak7$7yT2&_hBq%f6x+eEB-6VkJIey0k? ztIXjmXa=R1)%X0p6&N)-W+7!7nhSHXtw7o<6WFc!{!P%0OFnh^ax%1(2g75+SPXG7 zF_%cVH&WgC>cfMbCwQ#7G;^ z#Jz0}U5{@Xi^zhR14YZMdGX@K@E--P^z^>(_QwsbyU*ZE`|`gaiA}!^o%Prw{k5~R z_xXFyhb%;j>#2?R6`ktZnLE`Jukrl+EskLtYK9^rzqEveyN=U$aVbT8{m8_O&#SZ@ zx+4*TRAgmkuig8b=;AZAxcf$=>3c^B@5PV%$!ZrC*4(F&8Z)Zy@9+P-;i6|h;xAqK z@_DZ;z@|Qt6@=a+e20>BH~Ud)G6u8^73IKj$>Vk*#jTIkEsoI07SDZMUiI!`=@;F z+_^M9gih=PC3*S#bx%(#bsp_O)-`T=kx=daZ6AtLD2c05gJNYMDwdjL_rBl|;_tD8 z*yDLs*(Wa6?E=ShpWg80MfCCQ;|yt0%1A(@U^9CC=X#BNmt3N*NqzWKc(XRo+0l39 zPt=4coDGM4K7T%k=a%wnweMsm2&ShoEuJukz1`8FiQ||5SM9r2;Xal?HKFcNxRx*| zpgLZ)W{uVCTl=kb`z$>E4Yk%rj6XO2Qrke-)FPuj?SxgXQf}^EHL~^udJeGEsKA&(sR&thg;j{nYXReFfX{Yc%e+SlH#d=gZ20Nb4NRT% zsZ%OeR;hZL$>(mc7)t5h7r&*h2ZQ^@lIW)#R%qU%Ym;e%K3lvI8{$)*bJS( zO{{BG)VfjJ$>ys|q6GCT_GIq$Is<)|_(fuVR32N`JwKa2AFXMgtD^bh;^n7;TR{4Q z7WE4%7pt*t+2I%c;(;3PzNan&BccVN*t^QIvYxUbhfbT$BYZ@-&JBm2T8k2%i>$$v zS&;mRFU&u`zQxM&U2gPr`p>Pg#tv?4OfWS?qy|r zdtmp>1+i)W-VaFl4A@_Xz2-pu+@But>9c$wb9cuN(>R^v3|xtU4M)z}iIcpOT~p(i%Fr?&iDvb?v&dbQRAYeNcy z$19t8V%SvV<$o{SUlXgen}i-zf|m|$2FdZ}%^QQuCMwk7*-C`L2<};$L+}eoA9#23 z*1_^nDtgdxwuxr0U8^E-NYS$$Tj_&Lhi53q^?A5YSLr(@3Z;e#L z2Ll-$Yj51V3G5}k>HYk`X`^KIiLcA3_UkSHckMIkVcW_S!fz`grN)pf(&9Lnn^?Y_ z8ahVaoU+!t;(%4QM|u{iDeHSNqjvBLsy&+AjOw|$qNgh8C!TNO{H=E3t*-OVY8Pmz z33jsNjs=UYAG#Bz7XK*oaO0Gz3J%Ac6V9ZM3*rk0n=T zn*3Lf&5AI86J>=3%nc;u4f>|JSu478@21uHS`-yThMIxYMzs|#W85iv6E~1H!hhct zoSEH(l>-^zCC>pW%2-(;E-b8|R*<4x?qU!E(vdWYdqn}*9)#7%@C)Z3Z+GvK%AY9W zID@@kv5VDV(LKxmyc21t_VV7@c$)F5`!`pm6wb_(0k96aag|5`!;@|FECl zFxhadOXsfFvNKt@rOV9s6VW9^h=XAX5Fjc(G3(u~m$>3JT(MFfOq4tXG9l}p^EUMP z`~Qe)M8X6ixvFOfE)e8+i`-w7i(P}V{h>kWvhF~~&UNTrb_8)dH zo-Rk!7kbI+rJksxQ!s8lj*My)#Zo`Y2#%^As$Uu&&>^j2(bA>$Blk)GOQ~H`WQj0H z-;?)fCk}2BqNV2RW1cAckQ${i+ct?M7GRfbZz(p)&DB^s|1uEG?Du=FHB+O#wa@k6 zJLIx*b5|SnoRN~ch02I=69aYTHi`WQ4jdpQQwG^&AQ1^Notqoae{Yt4(relB<)hhc zv$DgT6>5N*S`5EY?M+%$=6xTNkF`0E2Xp3*D3;_wIyG(0IbCsR_%6gq`Yl_!MgmY> zte~aM9y?D_r!1hJ)(h}f0FHs9>-i9Qr`Urr+N>qZ|NdI4UCJYCx)pSp54H>ZZ6`rP zRs%<;I*b~FrR$M%oq8D0y^L}S;+XOPYpaoMJE)3Pq}SV)pI>}$ds0qLj`0fkUu>a1 z)#AcwmYuTDm+=qL>xcq~?UQz{Xw_(U^$CRj1HyZ#f-(kP#U4})HH_vtkKqC<$%F8! z3i29NK^1smZ6DN#w0P6&*RRKbRFs`YeoR2ksMfTO8qz_T$pCj>i2b*%D}D-^WXxgFNSBjERz+Sq=4z9B@=1EP#mF1)D*Vgq!hq_qwad2_f z!}7;-sr~R`DzzPD6ciLBcAeF~Eu#*7#h^AqwoID^S*-vF#}bR-=S>tQSV8e z=(WwC4rXCT{RaHS!_7(+EXRI8u|_h$2+WB>bMG!!pW-)~nfU%(BY~6dXKKiqB+or^ zBBR~}d4Ms}0+jV(vF@roV%uWvJCHlBBSlnvu;>N`GL#!FPaGStN#t5)A;TYE-pWqv zI&|-v?G&58Y{g1ZlH_XhzpPnPgJctpa#apM&np7YCzN*U&K>TZAe0M%*lLi0lVD*} zYih%Ah>SN|{%h<5QnA-Gj;x|8od{kBOegk5Q&*IYDD4B7P&zMUt_zM(7Dhmw#y)!{ zzgsTE%E1h1h&6H8uDi`t;bSdM7R!F zg99YT<#jh)2(1Oj7B)HD$-%}ZNpK1w$rnq?gjQk(*F>a0w$sJy}y7 zyH6`1w#MP@pR4Z`vgz}?Q?Zh&q{q6jtq>XS0=G~PI<|X@S<`d4={{`fhj90Dk5xHPj&RYRjXE=-y)HF zFU71yD7xh2qrD2}&qvtweSGZgO)q6p`s&Twx0h9%D7V$TacnA)7&|EsdtAeH2I~wp0w+KI+ zEI?DzNL514Q>mh}BTB@ifPjaWQ*d%}N@KSl^$7_{oSAXjr<<1})iB|_oI3PA^#Sp= zR6?YSKFO6^lbrPYxgwkmb=(z)!Z8>tR<0DvWfc(c8$E%`Q`=u)d{6o9Khg%Ql?L2% z2gL-VRSxPgLj>bSuq9Y&A0sZ#Z8#|M2``df1~VS>1Q=Z?vTt6daTzu$C0M|b_@M2ULaww-+SGzGT=~oAU zlMf0n%aQ*tB;m{!lLeCB>p&Cp+@veMsFnzq{BMR$*17VU)Kg0^=Tb7zbamq?o|u@@>r98jkaXPPBoqZ=#Z zzY$^d5pD*=Ur=zts_&x$;&7GtW^Ino;-QTjFr$YT#3d(b5TD+@zPn*-Cjkgks%&Ov=5ZqyiZxck z`|IAdyMQ81@;l+f)^a%HS{YQn5$jf-3+%)F+!~2+*IwOclU+@pn*x}}At3Ov5T>{x=YKHIh0ELd7F^^zp^d=5 zr>3P9I_VCl76EIEMhv;4yrv*e4YU)1U- z7D7?Ng`*huRYrf$;tJZbYem7nB}MJhztg4k5mW}<;!bdT*d=e0dt2dOqfx{`(Jd)- zm1pq6LIX9M&pdc8vD@gPMG%}46TdDpycCb*zwLyDjtgpneo-iKTgm><7xCZlvzr|3 zq3yeVGsx-xp|=elh19`*&e1ZBHcQ)*anL+Nwxpxv%mbyfcmc9QhL6$=3I63Uk%US2 zbofJ*agstx_X9+-Hs1+eZusk>EJ!h2#Iu2rAa0`HUTG@aUsic$(WOjz{I*bsg;gyL z1x4LkQa=Cws-W{cG&ZP9B#eR*j!_6t1)USkCpJ6s5abtO%ixlb;BUTk&2yWGvEn(Z zAail#hXnuEmY&p1z@ZV?Cc0tkR|DU@cDv})s_+wmehkzlK2jDT%US*xE_w&H1#pA{ z@l~p*Y44IEdM0Py#5rO{5SyQ@DEpI+5?H-xwEDZ}=OIf!Djfjw58$MjOu!ukU^Ny9KcIP{&wbBpyZSpQ)H%7FU$0$vba$jcl6)gn|f^ z)36@s=+TwbrR__~!+-SZcv?RJ@2sDuv5|oxPSY$? z9D;)yXg6p+@gQ-H+Y7EV+pnW?ep-6`3y8H|5h%2xXW`_jL*=!1fwZFk_17@cWP{zE z^)0|;1bsdZ0_;@SLgavX8qeKxu^I@JI9OM2+Bx}qa-u>Nc*GU4UQ8uyd+Eo;xjGv$wt`Va_sD4TVixkiv z>u&OUmGTR6A%wr*Wm}3BDmte?5lN+tQ;ICQw+*}oY~Xny}!dWWoM9Y{ILD- zWF3FgVjs<{mNWCrClMMdEb}ZZ;su>D{s+b3X{n7m6^MSl5{;&REC&1iyKo=3;j=(7 z3k`snq&-L}s28yq4w+9c*6WUJ%;d-1NqQaH3c#+BWfiNMq?2&}{;vcZdC@a4?1`^6 zwh+RPfz9g~$^CCWZxaI+%5Ae|#-+y>`2wNdY-DEc|ET&@{p_N7fbM*cWGt95V$4B+ zh?WbjEA{90fwzh95g24XZd7iox4NITA*hw&JZG$6+>&K2d(U_8=_haANRmy-&dyG% zFYoo@PRc$0QUbibv6 z0s*7Y_2$7&uLzivPA8}?8S$wC4;gJG0$~1wqhHkd5d#gPVb-?3RzDB&6Z~i-HqU-_;!5-RYPzO zKA}n)8gZh|Q-&|EuBZ*+UUQ5Hr?A9F!cdOotqr$XJ)*I)hKBJ`4eIbI&ZV|lo*Gos zyiOBC4528#LQ#sup_m~JW?rc<7lYO_YIv?cRk(ew{cQ~8rm^Hc(v6LYS#ULdNap(e z_rsX0DQI&Q(^-qI!FJK520UX=&5f|ZggkNc5VBanUlG?9 z#9eew&LOy>gAds&LIq;jf5r_K9Nk_MnD9xn*-LM#GUvdei>eK2<1f!me^WZarQE`x z>+%;3258{o1r{xO{TdA*hP81j1}BzLeqUbS+VJlEdnNE`EU{r>htZ0+XYXEbmfX3i zURczt{u=hK%EzRI16F7m8KlX@elxax`&7UirJi}YY{A0)!g<<;z<+ozeOO4zMNF8> z*B$y@3c2aS^FRnW2EK-B!lCO>chKoFt~sVOEBmf&te+fJA-%tZ3UI&w{Nrt)kT z_O@4m{cxJKHJ@63Nn+`Rx=~ti5|<L6YcJ=o^hs%Mgbr96Cs<#1U9Y+aoC!`zDhg!b^Y&u%)WcdQ%So1XVkSyKupoMlxK|#0mf$eL`J5fv=1Gz8Uvm5!@Z>q=;Uex(KO(aUS~7Thg=2b(~19_drO-gWc`< zm>iDMk_XlRg5i+1)A9(mdHndX=RQ8Zx@)&+!X{w{BmtG=b?{M_`&R$_b0uQ@2m)=O zAH+kCg{R|nopT~^9bWG$VBirjF)F|)jnB>=OGtWKTIyY9V0rQ8TIL^T&Ow8b(eBF0 z$WRA;+*A4ZTJ;>^kRjdIHj>6=g2O+eOG+`g(71o2{%HB@U$yJw2dCTakGC?HSlx7= z>6;9n%9}5nb+)*f)jA#5Nmn>@oXPjQa(>mXGc&IO{cG0+d>?%ERJ5daFqvaG^I%}o zC?i5afS_g6^OO|Q*CM3|rj=-CyWuzKxURk*J^F4s;5%(_ZbL%ig)g`NS& zMI54Z4hD@6GKl@^?1vgHJ9RwSFv^VY7;U=|$Vwu58*#W3yX*21B*YA0|^6 z|2jdUIKs-KBhDopp&m3cXW6&+VjNzBoxTFJ<}U^PDwrp8liLJfcY_^q&`t|p4J0&B z#q3C=YFd|X3}kk01F9)1DIq>ESLl$V@E6ogJHCb+7^aa`zx?vJP2gtI-xn-(DXe({ z&&Pd|9M_3X90oY>vii2!oqP@866XI1eQ3w)qLRv!tT2agTldo?9TUKNsB*@%tGWBx-Xc3=Hu^ z+#|#kp(eF0-tK}1rJW{zk%qdzpl?&IXB`xzy`p6N6+2SzOaWuoVSB5a-gf8uJ-hSo z`SLQqkaSXMn$C7;biAp4_+-$v^meAw&fdwu)w=nzc_F%=nQ~Tio)P69)?A~TnZ&UW zjj0)l!!4&4zohD)EYfX%7x(!4d&99$YW@eRkgW(6xO|kzR*>;f9@d7RSVshxZ`Vam zXg467#s!+^orXX{U=Zm3C@dWR4P$$;1323g!}>tPrQ7ljj2_1 z{LNulx&hu3u00QDiM16_0VO8~!Z(awOuGWYh`EexVgb{_MOL=r?Zm6Vk9lhuP>pueRh;&q-L z0I9U3q&&!VUYwXg{1j;~wBcYN4nS?YPdBna-SeJ*bKkh%Ja6)wasAnk&(7*tu7%tX z`zQ(0o2)5fDgaR!e85=sbXyO;?srx>R{l6D)EaL9XO}>u-4CIf+VOf8Fl0oJ2hghp zDYx(R^9YSV_nh6QYAY?(Gc6+F)QS7^&z~U_s}hnBj96#QH+1~Q+0cQc7~t)^|L~zw zM@1F%te{5wVe6Rg&SuE3AUZwyLh{y@(af%#l~AfOuQd0wUTZMMD5~O(D8B^ft}=uI z*JXi4iB{9G7uR+AeuI=vq_OdIN^zl7ys)kf>KDwCGmdf4$aP2~HUlUwc%$Rcbyy>2 zLl?_C6X-9*BL$a8WNIo;v=&kMS{-`#Edb22vRa^EUWXCG4N9R3p?ym#kU@En(K*En z)?YbNInrg*OH8T4QRQ4u!6YzCTRQEzkwm?Tz_ZX~^F zu<9*V)u(_xABxUR=t11W;G7~!Q7Ic0i=g&R%%**rprj&PFu^}acd%@Q*xW?NR8!kr z6fuPp_YzTzO%gLD2;rp`RQS$^Blt&WXD7%0{qltMR}z-fzL_=GW|0UGNn|FBb>xp9 zKfJ*tiOqakCp#}_UTQu1MeriDbp+&E;lZ46;F2yxry9T((#8^PgSBgwwUQj>A^iEI z@r0mq1Iz$Q#VC?XEL&ZeLE#!j_aP^ewwyHA)gd`+=R94mxfE_BNAqYEMNiQco{&0- zj1@eFQmNW*;?vFGG2-(phNjy2^1QV$|1|i2Iw=Y0(0aO1kx_`8-K&xM=KA$CNUnox zq$EJY;TWUKeIE~m`-%=Oqskk4Ob=eBq>p znmrD8xf>StJ4s*LWK`3q&d(#G>q{Oa$pUwd-!~0n{ch-N-vtQ>?jE7X4C2|xNvH7) zd<{HY-s^~S^Dg2;Ne3oU)80OrhIvLB;i4uMIKW1EgVjt%3>JJfQv7 zGcaiMeg_$_e&a^{nYQ`aP`x$~CU=4K^-v;mzIT2RrE`<`N`C(3mjkjv0-rv1cK6Ch ziiU0`@~Q{=jJIB38~>uVFB!r_JLN;? zH%v5IzbP;0gCcf$sQpNZD0k8|u_tXYo-W}=ixbf_O&7|*uHs8P9s27@QDJg5oA+!7#vpjDu%Qn!ck_OP~Dg*?y@HNI+ISHS8p$EVP|LxT=P{eo?x( zF(|M_t!8(6nE`2XgZFl`-5%B48lT+MRAo?cs^`uJ2(t+ZSo!p6|E=GhUP0eV(<@mUU6JPIM&Y&*t)V8^zkngiX}t(O z;aGtr0^2rUzL_^a=jdyY^x>l=fdb@6Bu2(~Oo{9~kTP?{MtXWeambdefq}z~W_j}u z`@!42q_4S$KY!8#+o(UaO{xCzW3m^chkYWjsfsV>CECdyDg$hR+FU!gudgXx4rv8? z;X`5ydG+e(!{6!#yiRf|z`jVLB~&wkvFXp&L=-@f{uN1FxPSacZ~JO80i{RtKWTUI zGn6FVRwQN@WGZsz6|C?^2;!vaA6j0ir;Uz^IB6v(W-}rC9}&c0iC8az(K0Bp{P*7X z1Arnipt>{5WSf~lHR+Diu&zyL$uMeh$eK_IKhUYA{}k@ zK);-m4I`-}Toc2T-vK?Q>6L4?wEH>afq)^?48g1(KH*a`Q(}-z9RUAEaD8ILA#H+S z3W<3~Dsl4ePy`gCUKA$@W9BcLlCE(*ZVPMMzk1f))=8(zoTp#NuKw9=)&McrJi_zv zn$)q0it3P-dj|)Hv~_mo)lbA%lQzxtW{W#G2mzj?m_LrW8=_DC;F`idyR|4A@EYS; zRhpxp;v0J3Y5%*k`VeE{+Rpc)@E8zNIB|r1zO|cl5STVRk8J$xXAsLijTVnoOoQ=o zQ?8Wh;AF#!_y6Nut_yM{BaTEb{PFd@&qEx3!aW<dXb~Ez_O%m zRR~_gBtZCgt3%shq#)9S$o$MO>1LFXsS_X;A)IDp)u8Vy*grnj+b;KrQ#%eVsz#tP zWqXZL6*hl|S2~wK69Q1v>UD;1kFL+Q?v29C3T|76^+Qh8Qj!yiB+G@B)g%ZlMW-QB zR70By8grbsHk9q+&sjd}K8ZiBMNiY^Z)I1}(Mj~@zR&~lmn5CqY+G|uACm^i4RVLh z+T;ik!4SL=5h9RbQ{ez`o}V2j8?m8^Md~jy6pm1kp;gIZuzA8h^VFt33rNnPY$U4j zxnp*g#da|ltwMJ?B_Kc~BlPaB-k@0bG_en5Vpi9aJEWU{sG7vdgjS1Rq~ehsVD_?Z zFQ7ppl-;a#>55+57XlC=GCce+CwI)HoOaEY-=!M!UGsN8nG6~lx&*g^YW5vNXVH4n z1W|^gD~ODaiEwUxfn(zo?d&o%6OSpCKbA%rM1=bjd2#i;U;XH+ye&a?)nXQVN4K-s z>fCh4o5p>2LO|t+ukG>b?O`XD4zekTquzS%>@%G9Kn&k%TGtx2Y#Q`Eo${=hf&O5k zAkLT?!5s~o6R)K|X%j#$9!C7hUzzr}Ek-P#U78$VM?92=-G$QxGo*M$!}=476CAls}gRjKssjxAX zOlEz~a(D%{kXWb?!%Mqg^rQ(QjjUx7Xx~^L#)qYc!L?wH;I=hvK^sM`OVt>ndO{a} zd05-fp((oIq$8$?>;+#>MrT(c_;_Gyw!(;YkYy`5%p(~vssoUPZ%s!jbCknapV7s} z)VCAxuiXWZS5Q{|@)0MmFqx7Do1L7T+Gp{-qq5Xpt*fa z!ZxK<--wy?!NZ4oNXuJ@71Vvr)^pcy-ee?RRzP&bM*XLdDLz6!NXB~YxaT?(j{5!# zjtY5MRos+x%%=^W{bGO=<3mx=N!Rkjk(Ms4n4+7aODTVRd+V&b+{VZ_voyN_K5%k{ z`^)LKnB`3x5NK+M%u$6yEjw`dUi{hgrZPISn&4UVg76`78m1anz4{ZDMRG#Z7Es&Y z-1+V@aGyN5iA$%?5cIqmX;dmk#cPOGxOW+#=RKZ0*)e={Ud{Qr*hKp^>lfc&G^fq( zl{yHko6LLd&^}VF8~~-h6HVD@n!Qm4IHT8`ak&`iRi?~z%jmRyY&WmL=E$CR+Un|t z5fKqvpiW4DpQ=K^*%9J6Z~!%PY^L+enaN=fsNOr-*xqCizzu;;C?xyyZ4Rc;Hutkz zzJLGDt8){F3s&x5Q^>}_!3~w*E^1R!3rL`q@c<6tOrJdwaiH`5g9o1si5}hoA0;o! zu5PPC*)3+xuJf}JC{YOh?!dm|!%0!Syq#yZxF=tz*mlh8J2r%x@T2IYW7^L11kH0K zW;|&$;mrK<8+oQKln)-EM>-wlN=0wtTc30K={idL--U;Vdywja^jsXU=~LIkZa_5- z+{25*3@(yY`19)3+yEUOaFVGCC-Upk7Vf``6}MG2z82;D=7l*vW_dXONPd+vIUm&^ z_}W>&dUN$Pg?Cgxz+HjQ;goj%C7TjeV7t^C{(sNfANn1xG8}|3Y8-g~ei$m*Ox|@= z!6CZt4L#L$ivo^k36fz|h3lLpp^4G@DHU$Hj6(WeInzKm^?++QX*3R#ux&PkGytKA zgzXZITPPYWK42kr+0DR790!a}?BghP!^v4zJ9i!fal_5ULKT=)nimA(g%16`cW-GQ z1kTOEK)lEvrJj#*Mrw2kK@)$j-${=ks0da5R2RQn544p0hv@eq@-nUk8}no0^u<%e zqTYZ(QV|J0%c}bcDYU&%OvDoN0J^_H$B=f~g?d#lMATUWhh!=tO4q<9Lfof>Mw9Sh zP#KgNWwvnSgZT=^I6@;rup?(8q2+|BLTtJ(g`kBR7zT)^IDc+5X_pjfw8jyeqa)RF z@6RPe{^~-TI^EnHyu(tbPSp}OAxduG18vJPUIK2RBSJ)HBv*h`C6BJZ4qnh2Q!Rro z(Fp%+I8?(GC!WPKr@yH9u?HtskgAZhMPgV)@LV9lMCb}JOBhNA6x1M*yfG$da(W9R z)zmdh-F4KZbyIXEhkosrA!(hx{4XiYjCtkD$p=)Y=k(B4Ehk} zPh4>nXEF7{Ia^PdBm&Kll`NUe2bwb%4%I};21peLZ7VzctmP~5xD&`nJi7o6)p08E z-rn9U3n#Roc!&b&tBzwz(2vy%jI~3`0RW#Dj`CCJd_ty1R#pTuZyH|amhXt8J^PQAYQGm*qXy?uKU z-0jljTs$%qIR8t9F=RDmm_y9TAUiTxx^WPO3M6fEPC&^pSMG=x%Ii_0qTmodg5q`T zzi!k9aR!I)6EqB;I59o!{79|4B|Cka)6kKUao2DD7e-#vZZ`x0Ui$-c(0z3^r#wnS zrqFo+4AAT&wA7hpQ*`Y!P(t%-fXGYg!R#Bi<>l&Kf3V;)_Zq>NNqG?&3B$|2W5-cK zpAwrm3S%j+G6OPO%tc{wdSk$H{hgO#ZjZ~!(E|4T082MyEcjC%}t`uckSX|dLI z`9Fo6Pe@Y%9LIxpa1%QuSWq51bm>rmmoyBKZM1_PRHP&+(nCmlQ0js?4Ll`5gy5x! zMkox*2ZEVnY)dK-@(*Y^E49fO65>LbhK_uGzVj&2JC6N-@BRLMzn`6<`Fk^eu4f#a z{A8&@?X`Nx^a?`M!MOGJw;wqr44IHRI|kyKUQt$<25TcOs!|Z59%f;1AGeruH)j=~9jw#ANj2ivPYSeDG%lp~E_)4-pY6V9@ z@L16ivma3m@g0Auaepa&hb-GfUAgzu$~}~w*$AggWKY-S$!x!qQmeeXB(cR$;Vp$i zkN{2I90VeDG8y>-2e!noo2Sk_i~cYoHFSy#iz6-hsXM);PWy}ROJoJPTC*}J(Kk16 zi*zuMlgG%I25@~@{s2HljdaB#MnoC5=v#<{Kx!m>nR5bhXkJSVUC(mxtcSex4%d_R z7A~jr(gITdaX0(gvAf@1F;yWNv%&O`ncJw7Qzsr-xwtjY-EA^yZ<~C2X7|&Dp4HLV z)#jIJ^CH_+>Gp-lftGl>FoP@SanI4v%oJRWwbmq?h09=#xCITBlikt9KtR+PQcD diff --git a/docs/notebooks/rst/output_20_0.png b/docs/notebooks/rst/output_20_0.png deleted file mode 100644 index bb418b2fb3cd6f67142dca4f6f5bf999c0ddfef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21275 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 diff --git a/docs/notebooks/rst/output_22_1.png b/docs/notebooks/rst/output_22_1.png deleted file mode 100644 index 8e25d20e63f4e4e752c9475796a0c8505afa5bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18320 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 literal 0 HcmV?d00001 diff --git a/docs/notebooks/rst/output_71_1.png b/docs/notebooks/rst/output_71_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b606ec35c1c5ef9919e49abb67b3257a53ea3d7 GIT binary patch literal 12200 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 UDj>fZnk-6HNmH@t%FSQ?11C@{-~a#s literal 0 HcmV?d00001 diff --git a/docs/notebooks/rst/output_79_1.png b/docs/notebooks/rst/output_79_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d7af8aba774f1a41276c7a67d10778b38f4b0b30 GIT binary patch literal 10219 zcmd6N2UL^k)^*ewtbj9)!XQNyL_t6V#83hw9Tb$RR28KP2%*<;6cG`ERO!8!sDLy9 z6#?m;NR1F`BAo!C(NJdG$F>iJ zLNThUC}^QjJGoG(9WVDVz$fohyF1|x?WB0kN!#As$@Qk=9n|HUPWSHGJKeRqb`F+rJ$kWbbGp%&oDj4^Fc8p2~GB3dMXA`Pq>rn`wnY z@m*6@_({htZf3~WNrxIwUm);AA5aKuKX@$Qp&ahmk%I>9IWP7Ze*baAKm2fiP{fTs zGUwYT*Y;hz&M+S3RQt)Xy~pmQ;8E%_>%)iw*5EzGKQkQHl{S_ekFt#18MEiv&5IbK z>_lt;H+OaEs%Z2W?Sh4dltg0LstmsD5zEqp1y-}CaBF7*0+!(|$t>9m-f~aD0=(sK z+>JuLc(S+yh006$mmfc7#nqpvCK6KymS=|yyD~Lhy&~Vgzj*kEA1+jxqNufs9w-zC zp}@GJyU?Od1;>3_2eUFq#G|nj3LZZs4W)Xa9zTz@uR?d8Ks`p8xa{cPTTK+k)u*lw zdunQDT)OJ$_)1GlOU!lFNLN>P`tAK)Y*H?H-yb^EQ{if#Z&1wdHLx_*i<#9ONKZ?fBIn|JOC3nd3-w$jWZv-J!3nLNo*sj8r|g1? zSxM*F!RyB5P92OAgGreQ9{g`6=6vZDvz4nRcg)QjCzrAfOYGP%UZt&nDe$VY3*Fg zhfZE&v_|VxXg5ZdTDmT#aBPyfVY~6SLSqAC>e5z{pDTK_Np&k-_&bC z(XD03m6+ezsU>Lm`qI`qwTs2nD;fTb$9Nlr7P-tA40+B~u1}@nif-0C+B0-0X_pA9 z->){1<*4dJ0AE5@q4&oSZl%!E{QUdu_cJ`mfQK+&9BW{l&CSVa{N}+=qOht|^)+M^!} zaThB$A1rk^DIk!mSctOZKw=)fK&mH{`D{@MO{9fW5)u+`1cih&2qvES!JIN|!z=Z& z+gEG+nF&4mrun6%7u+jNwkCbIGq+bts{IIeiB-m0Q+*Nm4fxDLVpgqi(5dV4I>nTp z6D?|C-4rR9la*z8uVtxC7N4#jWxYB(w2$Gzch7&2V{F{r-kO${)?LQQ#f5+P@Ed1x zclPiKB$RsSlP6EaAf`xY461!9U1s{zLqoscTC103!aqxcJQolWDi{{=Se_c`thDNX z@3)^iN8g_7uk0uzRL?OH4X) z{*TX2P{bBww|+P%6ys$-J)&MsYJ+`^$CgU z>~HrUnF`aybcFJ%zo*=~b!(YO-y(WUCHogSj;k4$-uns3w{p(UuS1$czk@mV&IVm3N=SNQ)7MBwK`XJbA(yaaqKY^qz9FpPFtF! zOv=*T-DH`i=YPhmecmOrIbXvsEF2}GRL4qL-95EO`VqYxWt0q{Ipj<*UT-qpPBFBv z6z?RVEJ*;w24hHo0}ko+abM!402AR(afk|u;V90M6POCu0bW551nK^K&BE*^))nt-ShBN=aKJFP^d}&tCbou$&pML!D$3-`3 zkMRio_p*SE2%s}CvZdt~l&is42x?=tmbLjT;2E#x)sB;(PT8d0Ui9W&*PgS8h=|}9 z6zoY+4Agn8F!C^>(pc z`SeK+DVIx?9#re0aOl%R_qGgeo0^)&7u>o5(-?d?_k8oio^Re01o-)R{7l~OWq8mc zsnk+FQDBe%n0(~=!w~sB=(KO!Wgy}tuiOA(%-v8hQL3KABb&6r|9+XKsR?#`27 z4ygm?V&bd5K*%#8Zx25%^I!v{5+YY?G3^?k%eh`H^ z_N2JfD^A8!kIQH6=Gyv5jeoH{5d)xn>ck0o1o;5rs6ZLWqqTv6(P2EuR~XE2S;G#L zoQ|~v?Ngxz4&dl;6$WUDs+NyW)uvDNdE0&-Rkm}tRpJMbivj%J-AaQ{8CyEgSb;RK zdE&^2-}pkoIH9~s_WucL_1B2lUp{*DxC|6Q7Jl`YmV%j$kBtrmGZkpJiN9VRf32AQ z?9sY`P4$pdV$c`v+`j#hv@jK+Z<4))HG2w+4XDyxhP4P{M{99;&EMBv+KKx46k&AH z0g#W8Q~H`sZ=TisWUgL*C%GrL*t~@;B0T(*py1`czP|OvCSknW*Mb{0@OUsdXf!@C zaehtI?CHLJ`<4SuH!p_qX-4vF0hnv!IAwIMUCY{-t(a@f_!deUUpt;E;?K;bcl~;_ zqod>d0WVCVUGU9wsT%4sJD3fLN%;_P2mp8wz5@8LGxS8;zE|nP z7+8VGGuO53J#XGj2Glc)FAw5ejt5#^z=n4GoR38UhqAzzovX- zLePb0@}F53NKJon<;R6Zky{`3Ag7Xan@@t~m07(_#d}clOLVSWY5%+~ zcPvTn*ug53t5>;If%?O%Mbi8a%~8d$^&N|i(SWP`YKfr5&9E?ZDUG#!{O{#Svb3&a zMW~y{=0g49qepWCS%j_oUfnS$y?65gW$Tai7{|_tLY1cdV?7FU30JM9Oti#inr<&f zv7No~^UBOXCQL+@RB}&aTN}QlD%k=9%mx`lPWt1&JHVi8WR&;i%Uu|F>Sxu9{tutA zMf>017A%Y6#W!m)%U} zv1(8HNz!9EOE2$Q#|_%Q?4@af69-GD9Bhd}Lxk7Q6?rZ^dk~9DHvC)FZeJZ}Y*efL z&^=^(_wE_4VgSZaBew~&_Ye0PyuKTa&|Zk<6bzv~fWA}`7yZ+(K_7FYtx@s52xYdK zXpWY2UrYlacOrVPP7}9hh;f)7p!zOC&;Ia10m#46N@_8pNsuax{~S;IU#YSG`jd>S z(JnZQKJ-~m<;u1p6sW1Fw1f0f}HjYd*|)5*LH5X;?~5Nx7Jvo!!FE6F#q~Y)N%`f=FI`8yEE{Gx=vgz+;G93dy)QYy#3`Kx3Q8t363`IRIO*MP zu5O57u@}wJdu_y@|IC^0!Zu9q^+I#B_bKRhegL`>!)~bvfnYIl`)Sv1rfxHwOvW$2 z>_nzY4K9#36}an(OWdk3c@fqYNJF2HUg!AVLq#v70~2MmTdifwFIQ!oBBs1m)XZJ+ zzCB(l@FU|}!hG|ekt6@Zt?k!FNNB2ma#&z&!A;DfmA&L^jDF4?PfbfxXv1ve*_Dnk zNH7D9PI+uIPWsYUSWYRZSRTZ-O&=w$Ju>tMJ@x9z)_jh(7;$w{T~HT@G{vB~G!^Xs zX6L?dc77#jp=meHX5BdZDbK7Y&t`UglVTg@G$U`?+muF(jGMb$loxd^ z!lu-vqoo`)6bjYbcJa0TI^Q`+(?IvT3i6k>s%n6wGdb{Utt0Dl|sILf#>9{+Z$H)~$?uzRG{-T`RLgxxmG(r`nT8Y*~a&x?vnB z0xtjU&Kv88TmMy7Q{z9;3UP%+KVCGaJOCNP0f`@tJ70 zSejbvUI~lWGit2?mM+s~b06j&M-C1zEG|^ed27y9(|zJ?R|m1U_0>5%s5XStoX~qn z4sX0bSh0qpggSTb(Ixj6+f>dV-;9`Efa26ETe&)b_XLs1mK|n(g&hfhNm=+`Z#E9k zI8k!-ou2O|RB-M59g-65M;88j3g@e%(73Sp@>cD>AsFb@E?v?AIZGTAPmT-sfbc;Q zo*DcYY3M5qq>?&IR zMj1&g@g>KZ@1#0#$`E7yMIP9 z1(8e~1l`S^B1F`Cn>M+=lt>@^%mx}fuX<$nfCM?XTC=$qq0I%(IDw!ISADt6PS9cDE-#g>{+clK~n>T%(ZTBZ0}15~6RX;88z z6@rjXMf?tiJhjW0ZS`pPX6{67%vGDlp119U`Vlge=4qH*f>+PLEGRPU3O06KoX_O* zBX56KIyEeuq$0~{I~{jVbn+z5cqU+K!Pe%BNOdSSMdr?@j@AISD9nn+W-!vOgt_Wi zhkWT<{V#4l81`DaOr7qkpO!}gIN?TnE^ZUKZ~y*c2a*zuRj?eFLJ?Nq8ZRZ~eF56l z9d^1aCc$Uj3gE_O?Bg>vO-*J~L?-{O;|T~?fHq;oM4SPF|8Lx<|1jKxMDnw3CCgnG zTcWaFFxHm%*v>BAH4bZeNq#b3xYx4hawml7TOp6*XAi#>MNG4Ef66rb58t+t02dHL z-9(HxfHWT?hop`#4822=2)#aD5RQv7@leH1GhEy9;POG?0V!p%rvK3)vh+VKD zxzgtH5xaz=c2?v#o4`p09>?I^^N>4wMrV~+a%FmP#K;h6f^EqYuKr=wC#p6V)m1}9 zGNxP-97-%~H@g3+~RJQu@7?5hDLM z49#k`JRW7rf8s=HLosmX?rt4uOK`t=tt-&Ba+GnL)ZPs*49%-ba-bYKe2y6(FR$}d zSQf+Y#URk9HO52Y;s*1agR4ixFc=egeK!kF@i+Bt>1nykHn=j`;ZyW-L z5wV64BS~iCOQEF8m*?A5Q+iL(*Kv7NjkflV*(V7cDoTekSC2)acgFo)yUCiq>tU~6 zy&Aj_2a*-IbVhUIvB8gi)6_%c1z&+$9-=b-StJ9U7yuOI9>c$_y(c;UL=q=&ZUWtj zk@0-(vGOGw$%J(Z-ad+$HlV{q2X``ax+_xvG**yl5EmD5hN5p87yZ*_kkrcdPn5o& z9-eej#yXzj=kI(jViq0~!w*(57(|NZ*I2|OvKY%UiBueE#@~xvC9dbs!qtuvgh16IKJ_ z6e#RuBfBb^Il&yB`H%V{GiEKx#B)YG-?Z8U%oyVG=LgK>?TtA?UC>cMO>#k<}vd*(c%icCNX2^5}B;E?TAfm&8%?Gj~d9Y14SI-Jm0fR#G zAT>3$@W{xFFJHdQmk7V!-O@0EmlGON_)c}GM~CTO84FM6$69S#(H(eG+5GE; zNZtN-xoS<@(xU zrtDTjWitEP@qx!7w_&`vVlnXZj$O?#Od41WxK=H3EPXtIyB616ppLz8@AJ>kZiBtg zH4IO32Xwk-Y?}oeX)2k^sk1e5%gPc59qKuH%^&AjU}DaJNMzezqzYgWBBC_#+P3T6 zgWX`8K3Bn+Up{s)ga>q&({BXNpVtF}6j6_ki$@;*3Sr^lKd5$s91H$xMqFInJX>O0 z=74>*v6SoV(~nQj8^y>g!y>|cLADrd-HGf-$vy+PlLW=52SyI!0JU`FS)cMJldX~Z zjghcVU^u{fFuNnKe2_Lj5o@0VAWA0S6JfwkoEmEgD`;siXspNkPz7MbBx->&b{H&b zaG|WhH)RvKrI4mvnBhy`M$!rKo)IAv-VMqe)8V7#K8r*}4`~9c8M1K#adluG3{RVv z5HMZ0ZIl5CXf?lSMo}K^qyXszC1dd7#{I>`#eQl@%=yS#P)Bp%#{fp>PVh*xVLwB9 zMuw85maDOlKO!0cI;~G@`m(*7{!(Vd1fJD8p1v+zxlni1V>EzIM@uWkceCF20NtgiK7Xd0Rq0$lv&P7Ov8qn(>sn=N<$7fpv~kDlv`RU>73VR!(kiG3;z; z>gwycb|h6PsI$s@!wJGE1C%}n6o6r$4O{2AVVRv_<+;i12wjAo9%||7=`$;?@6&}` zF`J)v%kH7m0V=IOy|{@iD@bSJ?u)l4cfVZOiK}sH@Z^B;D2PB2$5*Xe$2*IfH=i}D zd-_s3UM6Z{-WfJt_#s&?QujR8uDqc+4&60+d!;!+W?=bCUzZoChR&~jmphbUUxlDx zexdj1hX8Zf18`osXw(tyWvuMhrmT&IR`u>uj9A0qy&A>|=-rW-g}La-4+LY+nPPL= z;<%9J9pbp7+hPM>P(4WmR%s-V=g^@;W&rHRMe_m;uo$l`8LWo2gm4Au9p66q2}HU| zbvQ1kpdh$i=UD`BFuS4hX)wtV`4p&ZunKPMl-W~ciNTLVB1neL5udpFFJ$?Z(gG`f z|KJof8ZK}-UQ*YeiKDYO-w-xD5cXUmSM??ws$(T2nByL1IF1da`)J>jDsgU@qB$RiY!tcAJGPBuvrokhC{(5bVSd>M3>T6&S1E&9R z(bAfj#^jtFwSVvmN5oH`KK%rT!;P&4Tk{73tFQuvIOc*w3M9HS(42hZ3cWl$T;)M#Mld1Vg|w)lQ$P`VWsl3*{w|+t*78FUO#S~Ey{Sc29{~_YBk+E z?Af!Mqa@O0*!&R<5AP1}eOwCGY>8Nx-cM4tjcrVR^{R7hZ0tFl(2qX&v8_!45CLm@ xvW?CK3gp`-E=vhu${*zTYrezpjwaK0nD0HQxXkn(s0<3Fs;Hq*aPh`3{{uz?DRBS* literal 0 HcmV?d00001 diff --git a/docs/notebooks/rst/pzserver_tutorial.rst b/docs/notebooks/rst/pzserver_tutorial.rst new file mode 100644 index 0000000..c3db545 --- /dev/null +++ b/docs/notebooks/rst/pzserver_tutorial.rst @@ -0,0 +1,3522 @@ +Photo-z Server +============== + +Tutorial Notebook +----------------- + +Contact author: `Julia Gschwend `__ + +Last verified run: **2024-Dec-11** + +The PZ Server +------------- + +.. container:: + :name: introduction + +Introduction +~~~~~~~~~~~~ + +The PZ Server is an online service available for the LSST Community to +host and share lightweight photo-z (PZ) -related data products. The +upload and download of data and metadata can be done at the website +`pz-server.linea.org.br `__ (during the +development phase, a test environment is available at +`pz-server-dev.linea.org.br `__). +There, you will find two pages containing a list of data products each: +one for Rubin Observatory Data Management’s official data products and +the other for user-generated data products. **The registered data +products can also be accessed directly from Python code using the PZ +Server’s data access API, as demonstrated below.** + +The PZ Server is developed and delivered as part of the in-kind +contribution program BRA-LIN, from LIneA to the Rubin Observatory’s LSST +project. The service is hosted in the Brazilian IDAC, not directly +connected to the `Rubin Science Platform +(RSP) `__. However, user authorization +requires the same credentials as RSP. For comprehensive documentation +about the PZ Server, please visit the `PZ Server’s documentation +page `__. There, you +will also find an overview of all LIneA’s contributions related to the +PZ production. The internal documentation of the API functions is +available on the `API’s documentation +page `__. + +How to upload a data product on the PZ Server website +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To upload a data product, click the button **NEW PRODUCT** on the top +left of the **User-generated Data Products** page and fill in the Upload +Form with relevant metadata. Alternatively, the user can +programmatically upload files to the PZ Server via the ``pzserver`` +Python Library (described below). + +How to download a data product from the PZ Server website +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To download a data product available on the Photo-z Server, go to one of +the two pages by clicking on the card “Rubin Observatory PZ Data +Products” (for official products released by Rubin Data Management Team) +or “User-generated Data Products” (for products uploaded by the members +of LSST community). The **download** button is on the right side of each +data product (each row of the list). Also, there are buttons to +**share**, **remove**, and **edit** the metadata of a given data +product. + +.. raw:: html + +
+ +.. raw:: html + +
+ +The PZ Server API (Python library ``pzserver``) +----------------------------------------------- + +Installation +~~~~~~~~~~~~ + +The PZ Server API is avalialble on **pip** as ``pzserver``. To install +the API and its dependencies, type on the Terminal: + +:: + + $ pip install pzserver + +Or in a notebook code cell: + +.. code:: ipython3 + + #! pip install pzserver + +-------------- + +OBS: Depending on your Jupyter Lab version, you might need to restart +the kernel to incorporate the new library. + +Imports and Setup +~~~~~~~~~~~~~~~~~ + +.. code:: ipython3 + + from pzserver import PzServer + import matplotlib.pyplot as plt + %reload_ext autoreload + %autoreload 2 + +The connection with the PZ Server from Python code is done by an object +of the class ``PzServer``. To get authorization to define an instance of +``PzServer``, the users must provide an **API Token** generated on the +top right menu on the `PZ Server +website `__ (during the development +phase, on the `test +environment `__). + + + +.. code:: ipython3 + + # pz_server = PzServer(token="", host="pz-dev") # "pz-dev" is the temporary host for test phase + +For convenience, the token can be saved as ``token.txt`` (which is +already listed in the .gitignore file in this repository). + +.. code:: ipython3 + + with open('token.txt', 'r') as file: + token = file.read() + pz_server = PzServer(token=token, host="pz-dev") # "pz-dev" is the temporary host for test phase + +How to get general info from PZ Server +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The object ``pz_server`` created above can provide access to data and +metadata stored in the PZ Server. It also brings additional methods for +users to navigate through the available content. The methods with the +prefix ``get_`` return the result of a query on the PZ Server database +as a Python dictionary and are most useful to be used programmatically +(see details on the `API documentation +page `__). +Alternatively, those with the prefix ``display_`` show the results as a +styled `Pandas +DataFrames `__, +optimized for Jupyter Notebook (note: column names might change in the +display version). For instance: + +Display the list of product types supported with a short description; + +.. code:: ipython3 + + pz_server.display_product_types() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Product Typeproduct_typeDescription
Spec-z Catalogspecz_catalogCatalog of spectroscopic redshifts and positions (usually equatorial coordinates).
Training Settraining_setTraining set for photo-z algorithms (tabular data). It usually contains magnitudes, errors, and true redshifts.
Training Resultstraining_resultsAny file(s) resulting from the training of machine learning algorithms (free format). E.g.: output of RAIL inform module estimator_.pkl
Validation Resultsvalidation_resultsResults of a photo-z validation procedure (free format). Usually contains photo-z estimates (single estimates and/or pdf) of a validation set and photo-z validation metrics.
Photo-z Tablephotoz_tableResults of a photo-z estimation procedure. If the data is larger than the file upload limit (200MB), the product entry stores only the metadata (instructions on accessing the data should be provided in the description field.
+ + + +Display the list of users who uploaded data products to the server; + +.. code:: ipython3 + + pz_server.display_users() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GitHub UsernameName
admin
andreiadouradoandreiadourado
Biancasilva9Silva
bruno-moraesMoraes
carlosadeancarlosadean
crisingulanicrisingulani
deborajaniniJanini
drewoldagDrew Oldag
fpcardosoCardoso
glaubervilaglaubervila
GloriaFAGloria Fonseca Alvarez
gschwendgschwend
gverde
hdanteHenrique
HeloisaMengisztkiHeloisaMengisztki
http://cilogon.org/serverE/users/189487CARDOSO
http://cilogon.org/serverE/users/190300Singulani
http://cilogon.org/serverE/users/198333Singulani
iagolopsiagolops
jandsonrjjandsonrj
leandrops19
luigilcsilvaluigilcsilva
luigisilvaluigisilva
luiz-nicolaci
MelissaGrahamMelissa Graham
saravizAviz
singulani
+ + + +Display the list of data releases available at the time; + +.. code:: ipython3 + + pz_server.display_releases() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + +
ReleaseDescription
LSST DP0.1LSST Data Preview 0.1
LSST DP0.2LSST Data Preview 0.2
+ + + +-------------- + +Display all available data products (WARNING: This list can rapidly grow +during the survey’s operation). + +.. code:: ipython3 + + pz_server.display_products_list() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
idinternal_nameproduct_nameproduct_typereleaseuploaded_byofficial_productpz_codedescriptioncreated_at
189189_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-11T15:17:18.272001Z
188188_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-11T14:36:24.417710Z
182182_example_tpz_training_resultsExample TPZ Training ResultsTraining ResultsLSST DP0.2gschwendFalseExample of RAIL inform (training) results using TPZ.2024-12-10T17:08:20.025367Z
181181_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-10T03:01:05.190194Z
180180_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-03T17:20:32.975994Z
179179_singulani_test0015singulani_test0015Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-28T16:47:00.649595Z
178178_singulani_test013singulani_test013Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-22T18:18:41.216437Z
174174_singulani_test011singulani_test011Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-18T16:43:39.346911Z
155155_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:57:29.579577Z
154154_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:48:17.833884Z
153153_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:39:00.003188Z
152152_random_training_setrandom_training_setTraining SetLSST DP0.2gschwendFalsenullTraining set created with the Training Set Maker pipeline. Science validation yet to be done!2024-10-16T00:14:33.426501Z
148148_desi_edrDESI EDRSpec-z CatalogNonegschwendTrueValue Added Redshift Summary Catalog filtered to include only galaxies. + See https://data.desi.lbl.gov/doc/releases/edr/vac/zcat/ for details.2024-10-15T19:53:27.383084Z
129129_random_truth_zrandom truth zSpec-z CatalogNonegschwendFalserandom selection of objects from the DP0.1 truth catalog2024-09-12T22:05:55.720144Z
9191_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-07-22T18:44:36.505561Z
8787_Nonetruth randomSpec-z CatalogLSST DP0.2gschwendFalsenullrandom selection of objects from the DP0.1 truth catalog2024-07-22T15:32:29.933332Z
8686_Nonemock speczsSpec-z CatalogLSST DP0.2gschwendFalseSpec-zs randomly selected (0.2 percent) from the dp01 truth catalog filtered by truth_type (only galaxies).2024-07-22T15:23:52.709801Z
8585_exampleexampleTraining SetLSST DP0.2gschwendFalseexample2024-07-22T02:21:58.128939Z
8383_example_upload_via_libexample upload via libSpec-z CatalogNoneluigilcsilvaFalseNoneNone2024-07-12T18:57:01.015290Z
7878_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-07-04T15:40:29.732156Z
7575_upload_example_1upload example 1Spec-z CatalogNonegschwendFalseNoneNone2024-06-17T19:36:50.416031Z
7373_tpz_resultsTPZ ResultsValidation ResultsNoneandreiadouradoFalseResults of photoz validation using TPZ lite on simulated training set from DC2 TruthSummary table. Files: 03_run_tpz. html -> jupyter notebook (HTML version) with algorithm train; 04_metrics.html -> jupyter notebook (HTML version) with results analysis; model.pkl -> model generated in the "inform method"; output.hdf5 -> "estimate stage" results (PDFs).2024-06-06T23:20:04.439030Z
7272_pzcompute_results_for_qa_validationPZ-Compute Results for QA ValidationValidation ResultsLSST DP0.2HeloisaMengisztkiFalseThis zip contains two files: validation_set.hdf5 with the data input to run estimate, contains the redshift values so that it can be used as the truth file. And the validation_set_output.hdf5 is the output after running estimate, with the computed photoz for fzboost algorithm.2024-06-05T18:57:27.428106Z
6464_training_set_lsst_dp02Training set LSST DP0.2Training SetNoneandreiadouradoFalseSimulated training set from DC2 TruthSummary table. Random data (random_data.hdf5): table with the true magnitudes used to create the simulated set.2024-05-21T14:42:47.340619Z
6363_specz_sampleSpec-z sample LSST DP0.2Spec-z CatalogNoneandreiadouradoFalseSpec-z sample created from a random fraction of object Ids from Object Table.2024-05-21T13:36:19.884481Z
5252_2dflens_public_specz2dFLenS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the 2dFLenS spec-z data contained in the original file Public spec-z compilation2024-04-08T14:21:46.577298Z
5151_zcosmos_public_speczzCOSMOS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the zCOSMOS spec-z data contained in the original file Public spec-z compilation2024-04-07T23:06:40.185605Z
5050_vipers_public_speczVIPERS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the VIPERS spec-z data contained in the original file Public spec-z compilation2024-04-07T23:05:10.825559Z
4949_sdss_dr16_public_speczSDSS (DR16) Public spec-zSpec-z CatalogNonesaravizFalseSample containing the SDSS spec-z data contained in the original file Public spec-z compilation2024-04-07T20:14:23.831347Z
4848_saga_public_speczSAGA Public spec-zSpec-z CatalogNonesaravizFalseSample containing the SAGA spec-z data contained in the original file Public spec-z compilation2024-04-07T19:39:01.003263Z
4747_glass_public_speczGLASS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the GLASS spec-z data contained in the original file Public spec-z compilation.2024-04-07T19:20:41.913016Z
4545_gama_public_speczGAMA Public spec-zSpec-z CatalogNonesaravizFalseSample containing the GAMA spec-z data contained in the original file Public spec-z compilation2024-04-03T10:19:00.379907Z
4444_deep2_public_speczDEEP2 Public spec-zSpec-z CatalogNonesaravizFalseSample containing the DEEP2 spec-z data contained in the original file Public spec-z compilation2024-03-31T22:10:01.314578Z
4242_3dhst_public_specz3DHST Public spec-zSpec-z CatalogLSST DP0.2HeloisaMengisztkiFalseSample containing the 3DHST spec-z data contained in the original file Public spec-z compilation.2024-03-27T23:20:29.545013Z
4141_deimos_10k_public_speczDEIMOS 10K Public spec-zSpec-z CatalogNoneluigilcsilvaFalseSample containing the DEIMOS 10K spec-z data contained in the original file Public spec-z compilation.2024-03-27T19:29:59.552926Z
3333_simple_pz_training_setSimple pz training setTraining SetLSST DP0.2GloriaFAFalseSimple training set produced by https://github.com/rubin-dp0/delegate-contributions-dp02/blob/main/photoz/Training_Set_Creation/simple_pz_training_set.ipynb, developed by Melissa Graham.2024-02-28T07:00:41.119818Z
2828_dc2_tiny_true_z_sampleDC2 Tiny true z sampleSpec-z CatalogNonegschwendFalseA small sample with 16917 redshifts retrieved from RSP cloud.2023-11-29T20:30:26.900286Z
2727_public_training_set_des_dr2Public Training Set DES DR2Training SetNonegschwendFalseResult of cross-matching the public spec-z compilation with DES DR2 coadd objects catalog.2023-10-17T21:32:21.727199Z
2626_public_specz_compilationPublic spec-z compilationSpec-z CatalogNonegschwendFalseA compilation of public spectroscopic redshift catalogs collected over the years of operation of the Dark Energy Survey (DES) and systematically grouped by a DES Science Portal tool to form the basis of a training set for photo-z algorithms based on machine learning.2023-10-17T21:29:08.341090Z
1414_gama_specz_subsampleGAMA spec-z subsampleSpec-z CatalogNonegschwendFalseA small subsample of the GAMA DR3 spec-z catalog (Baldry et al. 2018) as an example of a typical spec-z catalog from the literature.2023-03-29T20:02:45.223568Z
1313_vvds_specz_subsampleVVDS spec-z subsampleSpec-z CatalogNonegschwendFalseA small subsample of the VVDS spec-z catalog (Le Fèvre et al. 2004, Garilli et al. 2008) as an example of a typical spec-z catalog from the literature.2023-03-29T19:50:27.593735Z
1212_goldenspike_knnGoldenspike KNNValidation ResultsNonegschwendFalseKNNResults of photoz validation using KNN on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.2023-03-29T19:49:35.652295Z
1111_goldenspike_flexzboostGoldenspike FlexZBoostValidation ResultsNonegschwendFalseFlexZBoostResults of photoz validation using FlexZBoost on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.2023-03-29T19:48:34.864629Z
1010_goldenspike_bpzGoldenspike BPZValidation ResultsLSST DP0.2gschwendFalseBPZResults of photoz validation using BPZ on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.2023-03-29T19:42:04.424990Z
99_goldenspike_train_data_hdf5Goldenspike train data hdf5Training SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in hdf5 format.2023-03-29T19:12:59.746096Z
88_goldenspike_train_data_fitsGoldenspike train data fitsTraining SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in fits format.2023-03-29T19:09:12.958883Z
77_goldenspike_train_data_parquetGoldenspike train data parquetTraining SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. Test upload of files in parquet format.2023-03-29T19:06:58.473920Z
66_simple_training_setSimple training setTraining SetLSST DP0.2gschwendFalseA simple example training set created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains coordinates, redshifts, magnitudes, and errors, as an illustration of a typical training set for photo-z algorithms.2023-03-23T19:46:48.807872Z
11_simple_true_z_catalogSimple true z catalogSpec-z CatalogNonegschwendFalseA simple example of a spectroscopic (true) redshifts catalog created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains only coordinates and redshifts, as an illustration of a typical spec-z catalog.2023-03-23T13:19:32.050795Z
+ + + +The information about product type, users, and releases shown above can +be used to filter the data products of interest for your search. For +that, the method ``list_products`` receives as an argument a dictionary +mapping the product’s attributes to their values. + +.. code:: ipython3 + + pz_server.display_products_list(filters={"release": "LSST DP0.2", + "product_type": "Training Set"}) + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
idinternal_nameproduct_nameproduct_typereleaseuploaded_byofficial_productpz_codedescriptioncreated_at
179179_singulani_test0015singulani_test0015Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-28T16:47:00.649595Z
178178_singulani_test013singulani_test013Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-22T18:18:41.216437Z
174174_singulani_test011singulani_test011Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-18T16:43:39.346911Z
155155_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:57:29.579577Z
154154_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:48:17.833884Z
153153_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:39:00.003188Z
152152_random_training_setrandom_training_setTraining SetLSST DP0.2gschwendFalsenullTraining set created with the Training Set Maker pipeline. Science validation yet to be done!2024-10-16T00:14:33.426501Z
8585_exampleexampleTraining SetLSST DP0.2gschwendFalseexample2024-07-22T02:21:58.128939Z
3333_simple_pz_training_setSimple pz training setTraining SetLSST DP0.2GloriaFAFalseSimple training set produced by https://github.com/rubin-dp0/delegate-contributions-dp02/blob/main/photoz/Training_Set_Creation/simple_pz_training_set.ipynb, developed by Melissa Graham.2024-02-28T07:00:41.119818Z
66_simple_training_setSimple training setTraining SetLSST DP0.2gschwendFalseA simple example training set created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains coordinates, redshifts, magnitudes, and errors, as an illustration of a typical training set for photo-z algorithms.2023-03-23T19:46:48.807872Z
+ + + +It also works if we type a string pattern that is part of the value. For +instance, just “DP0” instead of “LSST DP0.2”: + +.. code:: ipython3 + + pz_server.display_products_list(filters={"release": "DP0"}) + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
idinternal_nameproduct_nameproduct_typereleaseuploaded_byofficial_productpz_codedescriptioncreated_at
182182_example_tpz_training_resultsExample TPZ Training ResultsTraining ResultsLSST DP0.2gschwendFalseExample of RAIL inform (training) results using TPZ.2024-12-10T17:08:20.025367Z
179179_singulani_test0015singulani_test0015Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-28T16:47:00.649595Z
178178_singulani_test013singulani_test013Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-22T18:18:41.216437Z
174174_singulani_test011singulani_test011Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-18T16:43:39.346911Z
155155_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:57:29.579577Z
154154_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:48:17.833884Z
153153_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:39:00.003188Z
152152_random_training_setrandom_training_setTraining SetLSST DP0.2gschwendFalsenullTraining set created with the Training Set Maker pipeline. Science validation yet to be done!2024-10-16T00:14:33.426501Z
8787_Nonetruth randomSpec-z CatalogLSST DP0.2gschwendFalsenullrandom selection of objects from the DP0.1 truth catalog2024-07-22T15:32:29.933332Z
8686_Nonemock speczsSpec-z CatalogLSST DP0.2gschwendFalseSpec-zs randomly selected (0.2 percent) from the dp01 truth catalog filtered by truth_type (only galaxies).2024-07-22T15:23:52.709801Z
8585_exampleexampleTraining SetLSST DP0.2gschwendFalseexample2024-07-22T02:21:58.128939Z
7272_pzcompute_results_for_qa_validationPZ-Compute Results for QA ValidationValidation ResultsLSST DP0.2HeloisaMengisztkiFalseThis zip contains two files: validation_set.hdf5 with the data input to run estimate, contains the redshift values so that it can be used as the truth file. And the validation_set_output.hdf5 is the output after running estimate, with the computed photoz for fzboost algorithm.2024-06-05T18:57:27.428106Z
4242_3dhst_public_specz3DHST Public spec-zSpec-z CatalogLSST DP0.2HeloisaMengisztkiFalseSample containing the 3DHST spec-z data contained in the original file Public spec-z compilation.2024-03-27T23:20:29.545013Z
3333_simple_pz_training_setSimple pz training setTraining SetLSST DP0.2GloriaFAFalseSimple training set produced by https://github.com/rubin-dp0/delegate-contributions-dp02/blob/main/photoz/Training_Set_Creation/simple_pz_training_set.ipynb, developed by Melissa Graham.2024-02-28T07:00:41.119818Z
1010_goldenspike_bpzGoldenspike BPZValidation ResultsLSST DP0.2gschwendFalseBPZResults of photoz validation using BPZ on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.2023-03-29T19:42:04.424990Z
66_simple_training_setSimple training setTraining SetLSST DP0.2gschwendFalseA simple example training set created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains coordinates, redshifts, magnitudes, and errors, as an illustration of a typical training set for photo-z algorithms.2023-03-23T19:46:48.807872Z
+ + + +It also allows the search for multiple strings by adding the suffix +``__or`` (two underscores + “or”) to the search key. For instance, to +get spec-z catalogs and training sets in the same search (notice that +filtering is not case-sensitive): + +.. code:: ipython3 + + pz_server.display_products_list(filters={"product_type__or": ["Spec-z Catalog", "training set"]}) + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
idinternal_nameproduct_nameproduct_typereleaseuploaded_byofficial_productpz_codedescriptioncreated_at
189189_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-11T15:17:18.272001Z
188188_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-11T14:36:24.417710Z
181181_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-10T03:01:05.190194Z
180180_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-12-03T17:20:32.975994Z
179179_singulani_test0015singulani_test0015Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-28T16:47:00.649595Z
178178_singulani_test013singulani_test013Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-22T18:18:41.216437Z
174174_singulani_test011singulani_test011Training SetLSST DP0.2crisingulaniFalseNoneNone2024-11-18T16:43:39.346911Z
155155_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:57:29.579577Z
154154_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:48:17.833884Z
153153_tsm_test_dp02_object_vs_dp01_truth_random_sampleTSM_Test_DP02_object_vs_DP01_truth_random_sampleTraining SetLSST DP0.2luigilcsilvaFalseNoneNone2024-10-17T13:39:00.003188Z
152152_random_training_setrandom_training_setTraining SetLSST DP0.2gschwendFalsenullTraining set created with the Training Set Maker pipeline. Science validation yet to be done!2024-10-16T00:14:33.426501Z
148148_desi_edrDESI EDRSpec-z CatalogNonegschwendTrueValue Added Redshift Summary Catalog filtered to include only galaxies. + See https://data.desi.lbl.gov/doc/releases/edr/vac/zcat/ for details.2024-10-15T19:53:27.383084Z
129129_random_truth_zrandom truth zSpec-z CatalogNonegschwendFalserandom selection of objects from the DP0.1 truth catalog2024-09-12T22:05:55.720144Z
9191_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-07-22T18:44:36.505561Z
8787_Nonetruth randomSpec-z CatalogLSST DP0.2gschwendFalsenullrandom selection of objects from the DP0.1 truth catalog2024-07-22T15:32:29.933332Z
8686_Nonemock speczsSpec-z CatalogLSST DP0.2gschwendFalseSpec-zs randomly selected (0.2 percent) from the dp01 truth catalog filtered by truth_type (only galaxies).2024-07-22T15:23:52.709801Z
8585_exampleexampleTraining SetLSST DP0.2gschwendFalseexample2024-07-22T02:21:58.128939Z
8383_example_upload_via_libexample upload via libSpec-z CatalogNoneluigilcsilvaFalseNoneNone2024-07-12T18:57:01.015290Z
7878_example_upload_via_libexample upload via libSpec-z CatalogNonegschwendFalseNoneNone2024-07-04T15:40:29.732156Z
7575_upload_example_1upload example 1Spec-z CatalogNonegschwendFalseNoneNone2024-06-17T19:36:50.416031Z
6464_training_set_lsst_dp02Training set LSST DP0.2Training SetNoneandreiadouradoFalseSimulated training set from DC2 TruthSummary table. Random data (random_data.hdf5): table with the true magnitudes used to create the simulated set.2024-05-21T14:42:47.340619Z
6363_specz_sampleSpec-z sample LSST DP0.2Spec-z CatalogNoneandreiadouradoFalseSpec-z sample created from a random fraction of object Ids from Object Table.2024-05-21T13:36:19.884481Z
5252_2dflens_public_specz2dFLenS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the 2dFLenS spec-z data contained in the original file Public spec-z compilation2024-04-08T14:21:46.577298Z
5151_zcosmos_public_speczzCOSMOS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the zCOSMOS spec-z data contained in the original file Public spec-z compilation2024-04-07T23:06:40.185605Z
5050_vipers_public_speczVIPERS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the VIPERS spec-z data contained in the original file Public spec-z compilation2024-04-07T23:05:10.825559Z
4949_sdss_dr16_public_speczSDSS (DR16) Public spec-zSpec-z CatalogNonesaravizFalseSample containing the SDSS spec-z data contained in the original file Public spec-z compilation2024-04-07T20:14:23.831347Z
4848_saga_public_speczSAGA Public spec-zSpec-z CatalogNonesaravizFalseSample containing the SAGA spec-z data contained in the original file Public spec-z compilation2024-04-07T19:39:01.003263Z
4747_glass_public_speczGLASS Public spec-zSpec-z CatalogNonesaravizFalseSample containing the GLASS spec-z data contained in the original file Public spec-z compilation.2024-04-07T19:20:41.913016Z
4545_gama_public_speczGAMA Public spec-zSpec-z CatalogNonesaravizFalseSample containing the GAMA spec-z data contained in the original file Public spec-z compilation2024-04-03T10:19:00.379907Z
4444_deep2_public_speczDEEP2 Public spec-zSpec-z CatalogNonesaravizFalseSample containing the DEEP2 spec-z data contained in the original file Public spec-z compilation2024-03-31T22:10:01.314578Z
4242_3dhst_public_specz3DHST Public spec-zSpec-z CatalogLSST DP0.2HeloisaMengisztkiFalseSample containing the 3DHST spec-z data contained in the original file Public spec-z compilation.2024-03-27T23:20:29.545013Z
4141_deimos_10k_public_speczDEIMOS 10K Public spec-zSpec-z CatalogNoneluigilcsilvaFalseSample containing the DEIMOS 10K spec-z data contained in the original file Public spec-z compilation.2024-03-27T19:29:59.552926Z
3333_simple_pz_training_setSimple pz training setTraining SetLSST DP0.2GloriaFAFalseSimple training set produced by https://github.com/rubin-dp0/delegate-contributions-dp02/blob/main/photoz/Training_Set_Creation/simple_pz_training_set.ipynb, developed by Melissa Graham.2024-02-28T07:00:41.119818Z
2828_dc2_tiny_true_z_sampleDC2 Tiny true z sampleSpec-z CatalogNonegschwendFalseA small sample with 16917 redshifts retrieved from RSP cloud.2023-11-29T20:30:26.900286Z
2727_public_training_set_des_dr2Public Training Set DES DR2Training SetNonegschwendFalseResult of cross-matching the public spec-z compilation with DES DR2 coadd objects catalog.2023-10-17T21:32:21.727199Z
2626_public_specz_compilationPublic spec-z compilationSpec-z CatalogNonegschwendFalseA compilation of public spectroscopic redshift catalogs collected over the years of operation of the Dark Energy Survey (DES) and systematically grouped by a DES Science Portal tool to form the basis of a training set for photo-z algorithms based on machine learning.2023-10-17T21:29:08.341090Z
1414_gama_specz_subsampleGAMA spec-z subsampleSpec-z CatalogNonegschwendFalseA small subsample of the GAMA DR3 spec-z catalog (Baldry et al. 2018) as an example of a typical spec-z catalog from the literature.2023-03-29T20:02:45.223568Z
1313_vvds_specz_subsampleVVDS spec-z subsampleSpec-z CatalogNonegschwendFalseA small subsample of the VVDS spec-z catalog (Le Fèvre et al. 2004, Garilli et al. 2008) as an example of a typical spec-z catalog from the literature.2023-03-29T19:50:27.593735Z
99_goldenspike_train_data_hdf5Goldenspike train data hdf5Training SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in hdf5 format.2023-03-29T19:12:59.746096Z
88_goldenspike_train_data_fitsGoldenspike train data fitsTraining SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in fits format.2023-03-29T19:09:12.958883Z
77_goldenspike_train_data_parquetGoldenspike train data parquetTraining SetNonegschwendFalseA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. Test upload of files in parquet format.2023-03-29T19:06:58.473920Z
66_simple_training_setSimple training setTraining SetLSST DP0.2gschwendFalseA simple example training set created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains coordinates, redshifts, magnitudes, and errors, as an illustration of a typical training set for photo-z algorithms.2023-03-23T19:46:48.807872Z
11_simple_true_z_catalogSimple true z catalogSpec-z CatalogNonegschwendFalseA simple example of a spectroscopic (true) redshifts catalog created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains only coordinates and redshifts, as an illustration of a typical spec-z catalog.2023-03-23T13:19:32.050795Z
+ + + +To fetch the results of a search and attribute to a variable, just +change the prefix ``display_`` by ``get_``, like this: + +.. code:: ipython3 + + search_results = pz_server.get_products_list(filters={"product_type": "results"}) + search_results + + + + +.. parsed-literal:: + + [{'id': 182, + 'release': 1, + 'release_name': 'LSST DP0.2', + 'product_type': 5, + 'product_type_name': 'Training Results', + 'uploaded_by': 'gschwend', + 'is_owner': True, + 'can_delete': True, + 'can_update': True, + 'internal_name': '182_example_tpz_training_results', + 'display_name': 'Example TPZ Training Results', + 'official_product': False, + 'pz_code': '', + 'description': 'Example of RAIL inform (training) results using TPZ.', + 'created_at': '2024-12-10T17:08:20.025367Z', + 'updated_at': '2024-12-10T17:08:42.097879Z', + 'status': 1}, + {'id': 73, + 'release': None, + 'release_name': None, + 'product_type': 3, + 'product_type_name': 'Validation Results', + 'uploaded_by': 'andreiadourado', + 'is_owner': False, + 'can_delete': True, + 'can_update': True, + 'internal_name': '73_tpz_results', + 'display_name': 'TPZ Results', + 'official_product': False, + 'pz_code': '', + 'description': 'Results of photoz validation using TPZ lite on simulated training set from DC2 TruthSummary table. Files: 03_run_tpz. html -> jupyter notebook (HTML version) with algorithm train; 04_metrics.html -> jupyter notebook (HTML version) with results analysis; model.pkl -> model generated in the "inform method"; output.hdf5 -> "estimate stage" results (PDFs).', + 'created_at': '2024-06-06T23:20:04.439030Z', + 'updated_at': '2024-06-13T16:25:49.052608Z', + 'status': 1}, + {'id': 72, + 'release': 1, + 'release_name': 'LSST DP0.2', + 'product_type': 3, + 'product_type_name': 'Validation Results', + 'uploaded_by': 'HeloisaMengisztki', + 'is_owner': False, + 'can_delete': True, + 'can_update': True, + 'internal_name': '72_pzcompute_results_for_qa_validation', + 'display_name': 'PZ-Compute Results for QA Validation', + 'official_product': False, + 'pz_code': '', + 'description': 'This zip contains two files: validation_set.hdf5 with the data input to run estimate, contains the redshift values so that it can be used as the truth file. And the validation_set_output.hdf5 is the output after running estimate, with the computed photoz for fzboost algorithm.', + 'created_at': '2024-06-05T18:57:27.428106Z', + 'updated_at': '2024-06-06T16:22:33.231383Z', + 'status': 1}, + {'id': 12, + 'release': None, + 'release_name': None, + 'product_type': 3, + 'product_type_name': 'Validation Results', + 'uploaded_by': 'gschwend', + 'is_owner': True, + 'can_delete': True, + 'can_update': True, + 'internal_name': '12_goldenspike_knn', + 'display_name': 'Goldenspike KNN', + 'official_product': False, + 'pz_code': 'KNN', + 'description': "Results of photoz validation using KNN on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.", + 'created_at': '2023-03-29T19:49:35.652295Z', + 'updated_at': '2023-12-18T16:46:36.422893Z', + 'status': 1}, + {'id': 11, + 'release': None, + 'release_name': None, + 'product_type': 3, + 'product_type_name': 'Validation Results', + 'uploaded_by': 'gschwend', + 'is_owner': True, + 'can_delete': True, + 'can_update': True, + 'internal_name': '11_goldenspike_flexzboost', + 'display_name': 'Goldenspike FlexZBoost', + 'official_product': False, + 'pz_code': 'FlexZBoost', + 'description': "Results of photoz validation using FlexZBoost on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.", + 'created_at': '2023-03-29T19:48:34.864629Z', + 'updated_at': '2023-12-18T16:46:36.422893Z', + 'status': 1}, + {'id': 10, + 'release': 1, + 'release_name': 'LSST DP0.2', + 'product_type': 3, + 'product_type_name': 'Validation Results', + 'uploaded_by': 'gschwend', + 'is_owner': True, + 'can_delete': True, + 'can_update': True, + 'internal_name': '10_goldenspike_bpz', + 'display_name': 'Goldenspike BPZ', + 'official_product': False, + 'pz_code': 'BPZ', + 'description': "Results of photoz validation using BPZ on a mock test set from the example notebook goldenspike.ipynb available in RAIL's repository.", + 'created_at': '2023-03-29T19:42:04.424990Z', + 'updated_at': '2023-12-18T16:46:36.422893Z', + 'status': 1}] + + + +How to upload a data product to via Python API (alternative method) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +As shown above, the default method to upload a data product to the PZ +Server is the upload tool on the PZ Server website. Alternatively, the +``pzserver`` Python library can send data products to the host service. + +First, prepare a dictionary with the relevant information about your +data product: + +.. code:: ipython3 + + data_to_upload = { + "name":"example upload via lib", + "product_type": "specz_catalog", # Product type + "release": None, # LSST release, use None if not LSST data + "main_file": "example.csv", # full path + "auxiliary_files": ["example.html", "example.ipynb"] # full path + } + +.. code:: ipython3 + + upload = pz_server.upload(**data_to_upload) + +.. code:: ipython3 + + upload.product_id + + + + +.. parsed-literal:: + + 190 + + + +How to display the metadata of a data product +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The metadata of a given data product is the information the user +provides on the upload form. This information is attached to the data +product contents and is available for consulting on the PZ Server page +or using this Python API (``pzserver``). + +All data products stored on PZ Server are identified by a unique **id** +number or a unique name, a *string* called **internal_name**, which is +created automatically at the moment of the upload by concatenating the +product **id** to the name given by its owner (replacing blank spaces by +“\_“, lowering cases, and removing special characters). + +The ``PzServer``\ ’s method ``get_product_metadata()`` returns a +dictionary with the attibutes stored in the PZ Server about a given data +product identified by its **id** or **internal_name**. For use in a +Jupyter notebook, the equivalent ``display_product_metadata()`` shows +the results in a formated table. + +.. code:: ipython3 + + # pz_server.display_product_metadata() + # pz_server.display_product_metadata(6) + # pz_server.display_product_metadata("6") + pz_server.display_product_metadata("6_simple_training_set") + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
keyvalue
id6
releaseLSST DP0.2
product_typeTraining Set
uploaded_bygschwend
internal_name6_simple_training_set
product_nameSimple training set
official_productFalse
pz_code
descriptionA simple example training set created based on the Jupyter notebook simple_pz_training_set.ipynb created by Melissa Graham, available in the repository delegate-contributions-dp02. The file contains coordinates, redshifts, magnitudes, and errors, as an illustration of a typical training set for photo-z algorithms.
created_at2023-03-23T19:46:48.807872Z
main_filesimple_pz_training_set.csv
+ + + +.. container:: + :name: how-to-download-data-products-as-zip-files + + `back to the top <#notebook-contents>`__ + +How to download data products as .zip files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To download any data product stored in the PZ Server, use the +``PzServer``\ ’s method ``download_product`` informing the product’s +**internal_name** and the path to where it will be saved (the default is +the current folder). This method downloads a compressed .zip file, which +contains all the files uploaded by the user, including data, ancillary +files, and description files. The time spent downloading a data product +depends on the internet connection between the user and the host. Let’s +try it with a small data product. + +.. code:: ipython3 + + pz_server.download_product(14, save_in=".") + + +.. parsed-literal:: + + Connecting to PZ Server... + File saved as: ./14_gama_specz_subsample_43b93.zip + Done! + + +.. container:: + :name: how-to-share-data-products-with-other-rsp-users + + `back to the top <#notebook-contents>`__ + +How to share data products with other RSP users +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +All data products uploaded to the PZ Server are immediately available +and visible to all PZ Server users (people with RSP credentials) through +the PZ Server website or via the API. One way to share a data product is +by providing the product’s URL, which leads to the product’s download +page. The URL is composed by the PZ Server website address + +**/products/** + **internal_name**: + +https://pz-server.linea.org.br/product/ + **internal_name** + +or, if still in the development phase, + +https://pz-server-dev.linea.org.br/product/ + **internal_name** + +For example: + +https://pz-server-dev.linea.org.br/product/6_simple_training_set + +WARNING: The URL works only with the **complete internal name**, not +with just the **id** number. + +.. container:: + :name: how-to-retrieve-contents-of-data-products-work-on-memory + + `back to the top <#notebook-contents>`__ + +How to retrieve contents of data products (work on memory) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``pzserver`` library allows users to retrieve the contents of a +given data product to work on memory using the method ``get_product()``. +This feature is available only for tabular data (product types: **Spec-z +Catalog** and **Training Set**). + +By default, the method ``get_product`` returns an object from a +particular class, depending on the product’s type. The classes +``SpeczCatalog`` and ``TrainingSet`` are simple extensions of +``pandas.DataFrame`` (via class composition) with a couple of additional +attributes and methods, such as the attribute ``metadata``, and the +method ``display_metadata()``. Let’s see an example: + +.. code:: ipython3 + + catalog = pz_server.get_product(8) + catalog + + +.. parsed-literal:: + + Connecting to PZ Server... + Done! + + + + +.. parsed-literal:: + + + + + +.. code:: ipython3 + + catalog.display_metadata() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
keyvalue
id8
releaseNone
product_typeTraining Set
uploaded_bygschwend
internal_name8_goldenspike_train_data_fits
product_nameGoldenspike train data fits
official_productFalse
pz_code
descriptionA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in fits format.
created_at2023-03-29T19:09:12.958883Z
main_filegoldenspike_train_data.fits
+ + + +The tabular data is allocated in the attribute ``data``, a +``pandas.DataFrame``. + +.. code:: ipython3 + + catalog.data + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
redshiftmag_u_lsstmag_err_u_lsstmag_g_lsstmag_err_g_lsstmag_r_lsstmag_err_r_lsstmag_i_lsstmag_err_i_lsstmag_z_lsstmag_err_z_lsstmag_y_lsstmag_err_y_lsst
00.76952126.4968520.28898625.8631700.05699724.7295550.02070223.6106830.01201123.1435180.01371422.9151560.024561
11.08885726.2587270.23796425.5095240.04166824.4693440.01664823.5328600.01134422.5466800.00899222.0702550.012282
21.33309825.3738550.11225724.9432930.02535924.5249980.01743124.0136490.01648623.7332740.02231523.1021230.028906
..........................................
590.98637426.0506530.20016425.6416240.04683725.1610780.03009024.4601520.02404723.9772390.02756723.8319740.055121
600.47428127.0480560.44468326.4282110.09385424.8399840.02275524.2092260.01940323.8550820.02478723.5074560.041329
610.56192324.6804800.06118223.9586090.01143022.9001350.00634622.1435810.00582021.8675630.00646521.6126920.008967
+

62 rows × 13 columns

+
+ + + +.. code:: ipython3 + + type(catalog.data) + + + + +.. parsed-literal:: + + pandas.core.frame.DataFrame + + + +It preserves the useful methods from ``pandas.DataFrame``, such as: + +.. code:: ipython3 + + catalog.data.info() + + +.. parsed-literal:: + + + RangeIndex: 62 entries, 0 to 61 + Data columns (total 13 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 redshift 62 non-null float64 + 1 mag_u_lsst 61 non-null float64 + 2 mag_err_u_lsst 61 non-null float64 + 3 mag_g_lsst 62 non-null float64 + 4 mag_err_g_lsst 62 non-null float64 + 5 mag_r_lsst 62 non-null float64 + 6 mag_err_r_lsst 62 non-null float64 + 7 mag_i_lsst 62 non-null float64 + 8 mag_err_i_lsst 62 non-null float64 + 9 mag_z_lsst 62 non-null float64 + 10 mag_err_z_lsst 62 non-null float64 + 11 mag_y_lsst 61 non-null float64 + 12 mag_err_y_lsst 61 non-null float64 + dtypes: float64(13) + memory usage: 6.4 KB + + +.. code:: ipython3 + + catalog.data.describe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
redshiftmag_u_lsstmag_err_u_lsstmag_g_lsstmag_err_g_lsstmag_r_lsstmag_err_r_lsstmag_i_lsstmag_err_i_lsstmag_z_lsstmag_err_z_lsstmag_y_lsstmag_err_y_lsst
count62.00000061.00000061.00000062.00000062.00000062.00000062.00000062.00000062.00000062.00000062.00000061.00000061.000000
mean0.78029825.4460080.18805024.8200000.03818224.0039700.01877023.3848040.01616523.0744810.02147822.9323540.054682
std0.3553651.2692770.1937471.3141120.0363981.3873580.0137501.3815870.0100691.4006730.0149611.5402840.115875
..........................................
50%0.76460025.5770290.13381525.0699700.02830924.4702150.01666023.7485060.01339023.5141850.01854023.2933840.034199
75%0.94849426.2632840.23885925.7054860.04957624.9852250.02580224.4886540.02465024.1659440.03255723.9930100.063585
max1.75576428.4823911.15407327.2961520.19819526.0369580.06536024.9496450.03693224.6931320.05188327.3421510.909230
+

8 rows × 13 columns

+
+ + + +For those who prefer working with ``astropy.Table`` or pure +``pandas.DataFrame``, the method ``get_product()`` gives the flexibility +to choose the output format (``fmt="pandas"`` or ``fmt="astropy"``). + +.. code:: ipython3 + + dataframe = pz_server.get_product(8, fmt="pandas") + print(type(dataframe)) + dataframe + + +.. parsed-literal:: + + Connecting to PZ Server... + + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
redshiftmag_u_lsstmag_err_u_lsstmag_g_lsstmag_err_g_lsstmag_r_lsstmag_err_r_lsstmag_i_lsstmag_err_i_lsstmag_z_lsstmag_err_z_lsstmag_y_lsstmag_err_y_lsst
00.76952126.4968520.28898625.8631700.05699724.7295550.02070223.6106830.01201123.1435180.01371422.9151560.024561
11.08885726.2587270.23796425.5095240.04166824.4693440.01664823.5328600.01134422.5466800.00899222.0702550.012282
21.33309825.3738550.11225724.9432930.02535924.5249980.01743124.0136490.01648623.7332740.02231523.1021230.028906
..........................................
590.98637426.0506530.20016425.6416240.04683725.1610780.03009024.4601520.02404723.9772390.02756723.8319740.055121
600.47428127.0480560.44468326.4282110.09385424.8399840.02275524.2092260.01940323.8550820.02478723.5074560.041329
610.56192324.6804800.06118223.9586090.01143022.9001350.00634622.1435810.00582021.8675630.00646521.6126920.008967
+

62 rows × 13 columns

+
+ + + +.. code:: ipython3 + + table = pz_server.get_product(8, fmt="astropy") + print(type(table)) + table + + +.. parsed-literal:: + + Connecting to PZ Server... + + + + + +.. raw:: html + +
Table length=62 + + + + + + + + + + + + + + + + + + + + + + + +
redshiftmag_u_lsstmag_err_u_lsstmag_g_lsstmag_err_g_lsstmag_r_lsstmag_err_r_lsstmag_i_lsstmag_err_i_lsstmag_z_lsstmag_err_z_lsstmag_y_lsstmag_err_y_lsst
float64float64float64float64float64float64float64float64float64float64float64float64float64
0.769521057605743426.496851733359980.2889864016451496625.8631701801485930.056996849251325224.729555232665350.02070246989947576223.6106832612475230.01201139145700786723.143517979331420.01371427288818984422.9151560685081040.02456124411372624
1.088857054710388226.258726903647150.2379635474665983725.509524228603690.04166792240955244424.469344487165970.01664762131418696323.5328599838842970.01134372952245139122.5466795031786620.00899216749772303922.0702554732436660.01228199507795122
1.333097815513610825.3738551394507040.1122566959777225624.943293290995960.02535893280119127424.524997784555430.0174305351556827724.013648955119970.01648631007044298223.733274349215570.02231531417162041523.1021233624494760.028905678864388565
0.72126543521881125.994096311189090.190882668154784625.617772381977740.04585803883130551425.0057857477996420.02626806353391610424.3712855019873050.02227392052069140624.2216706781082040.03416701480043831524.0658108028302560.06782119456710035
0.508699238300323523.455644928497680.02118364967662736422.1549834614831620.00545619765168589620.8542210729006750.00505430534507590620.251517785749910.00504324008960251219.9879329924582550.00507670072076654719.75317944869660.00522219293990742
1.65459752082824725.5770293127979930.133814541165693825.3571902346599920.03642206846621718524.9853640973173760.02580530557653081724.6198659479305140.02762942851550346424.315427059847160.0371171910364455923.993010472490680.06358486650868432
0.630211710929870626.294569730983540.2450898080861663425.6619607423793780.0476886775022480124.9703507885164240.02547068619454275624.443595409788620.02370506584090058324.382525689614610.0393880559359265524.274314551454060.08154556925795062
0.944600462913513223.044391449579790.0152005556449064822.8598270289764150.00635841610055997822.3920310802753240.00559849714596083821.7631717128332550.00544387100243714921.3156064883045420.00561125690062150221.0788536978553220.006819135385098381
0.78505992889404326.103505068889410.2092094615519172225.6405705624662370.04679350252717620625.2245729107701920.03181687681782085424.5707148149561050.02646946352912577724.442766763258990.04154746484476924.363597198979420.08821825914170406
.......................................
1.346864342689514225.7990566691117140.1618358280018550325.1727477988701940.03096962874499195324.731768967630090.02074152874695367524.245889724632090.02001374539849744623.873261845298210.02518113625053323623.3017518833514930.034452507469982616
0.949792087078094523.698825570527960.02600386075499280523.420784681996990.00811079505924310722.7108851424223380.00599830947764476621.8968588151091620.00555089139182906321.273081732643840.00557091556571719321.0407246844617970.006716225485067447
0.740395247936248825.4430204282417660.1191933891565676324.9608997858341370.02574836484474985624.377556409002050.01544710496912196823.649963692291250.01237012405335630323.5513875922433830.0191178956640090623.4470210254503750.03917395554632945
0.909494757652282723.475399963653020.02153524007063957823.3424579781672250.007781748463140330622.7617712265424430.006082322317851221.9445992106821280.005595036341919999521.4451333732897640.00575226659995192721.2300351919156720.007284651334311665
0.973186552524566724.9153227926672470.0752057326533048224.4606451278066070.01686522837711815623.6600061666947960.00914992597156648822.8933591885015770.0076167823067076922.410792868885050.0082969741205060127.342150888785180.9092302567884765
0.609932243824005124.60127263188670.0570645984782256723.093594024040720.00693258721546263621.696081313083990.00519564520756141520.695570374958980.00508274447208671120.387208468976390.00514013802410804720.127856340119390.00540364900110484
0.9768770933151245----26.846220736674640.1350618516521750725.70928911942380.0488676683278345724.8665762050749420.0343179145306803724.0488701229033670.02934960146430494823.784055887582750.052825335046252773
0.986374497413635326.0506532837846230.2001642698007547225.6416240096463350.0468371901521604125.1610781812188340.03008953675706706224.4601524141291370.02404672900351872323.9772390036210.02756678105109978323.8319736186345280.05512066706093889
0.474280714988708527.0480560874079860.444682506357735426.4282112805191750.0938543394596348124.839983603182140.0227549353128951224.20922601749360.0194026127508123923.8550822431599340.0247873017109994123.5074559295742880.041328512368478044
0.561922669410705624.6804795305431630.06118153192966563323.9586089979737020.0114295663681752622.9001349679331020.00634586977358199822.1435806332706240.00581963097081042821.8675628493294060.00646548086334226921.612691594536260.008966510628950788
+ + + +-------------- + +Next, let’s explore specific features for each product type… + +Spec-z Catalogs +--------------- + +In the context of the PZ Server, Spec-z Catalogs are defined as any +catalog containing spherical equatorial coordinates and spectroscopic +redshift measurements (or, analogously, true redshifts from +simulations). A Spec-z Catalog can include data from a single +spectroscopic survey or a combination of data from several sources. To +be considered a single Spec-z Catalog, the data should be provided as a +single file to PZ Server’s upload tool. For multi-survey catalogs, +adding the survey name or identification as an extra column is +recommended. + +Mandatory columns: \* Right ascension [degrees] - ``float`` \* +Declination [degrees] - ``float`` \* Spectroscopic or true redshift - +``float`` + +Recommended columns: \* Spectroscopic redshift error - ``float`` \* +Quality flag - ``integer``, ``float``, or ``string`` \* Survey name +(recommended for compilations of data from different surveys) + +Let’s see an example of Spec-z Catalog: + +.. code:: ipython3 + + gama = pz_server.get_product(14) + + +.. parsed-literal:: + + Connecting to PZ Server... + Done! + + +.. code:: ipython3 + + gama.display_metadata() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
keyvalue
id14
releaseNone
product_typeSpec-z Catalog
uploaded_bygschwend
internal_name14_gama_specz_subsample
product_nameGAMA spec-z subsample
official_productFalse
pz_code
descriptionA small subsample of the GAMA DR3 spec-z catalog (Baldry et al. 2018) as an example of a typical spec-z catalog from the literature.
created_at2023-03-29T20:02:45.223568Z
main_filespecz_subsample_gama_example.csv
+ + + +The attribute ``data``, which is a ``DataFrame`` preserves the ``plot`` +method from Pandas. + +Display basic statistics + +.. code:: ipython3 + + gama.data.describe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDRADECZERR_ZFLAG_DES
count2.576000e+032576.0000002576.0000002576.0000002576.02576.000000
mean1.105526e+06154.526343-1.1018650.22481199.03.949534
std4.006668e+0470.7838682.9950360.1025710.00.218947
.....................
50%1.103558e+06180.140145-0.4808300.21780499.04.000000
75%1.140619e+06215.8365831.1703630.29181099.04.000000
max1.176440e+06223.4970802.9981800.72871799.04.000000
+

8 rows × 6 columns

+
+ + + +.. code:: ipython3 + + gama.data.plot(x="RA", y="DEC", kind="scatter") + + + + +.. parsed-literal:: + + + + + + +.. image:: output_70_1.png + + +.. code:: ipython3 + + gama.data.hist('Z') + + + + +.. parsed-literal:: + + array([[]], dtype=object) + + + + +.. image:: output_71_1.png + + +Training Sets +------------- + +In the context of the PZ Server, Training Sets are defined as the +product of matching (spatially) a given Spec-z Catalog (single survey or +compilation) to the photometric data, in this case, the LSST Objects +Catalog. The PZ Server API offers a Training Set Maker tool that allows +users to build customized Training Sets based on the available Spec-z +Catalogs (details below). + +*Note 1: Training sets are commonly split into two or more subsets for +photo-z validation purposes. If the Training Set owner has previously +defined which objects should belong to each subset (training and +validation/test sets), this information must be available as an extra +column in the table or as clear instructions for reproducing the subset +separation in the data product description.* + +*Note 2: The PZ Server only supports catalog-level Training Sets. +Image-based Training Sets, e.g., for deep-learning algorithms, are not +supported yet.* + +Mandatory column: \* Spectroscopic (or true) redshift - ``float`` + +Other expected columns \* Object ID from LSST Objects Catalog - +``integer`` \* Observables: magnitudes (and/or colors, or fluxes) from +LSST Objects Catalog - ``float`` \* Observable errors: magnitude errors +(and/or color errors, or flux errors) from LSST Objects Catalog - +``float`` \* Right ascension [degrees] - ``float`` \* Declination +[degrees] - ``float`` \* Quality Flag - ``integer``, ``float``, or +``string`` \* Subset Flag - ``integer``, ``float``, or ``string`` + +For example: + +.. code:: ipython3 + + train_goldenspike = pz_server.get_product(9) + + +.. parsed-literal:: + + Connecting to PZ Server... + Done! + + +.. code:: ipython3 + + train_goldenspike.display_metadata() + + + +.. raw:: html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
keyvalue
id9
releaseNone
product_typeTraining Set
uploaded_bygschwend
internal_name9_goldenspike_train_data_hdf5
product_nameGoldenspike train data hdf5
official_productFalse
pz_code
descriptionA mock training set created using the example notebook goldenspike.ipynb available in RAIL's repository. + Test upload of files in hdf5 format.
created_at2023-03-29T19:12:59.746096Z
main_filegoldenspike_train_data.hdf5
+ + + +Display basic statistics + +.. code:: ipython3 + + train_goldenspike.data.describe() + + + + +.. raw:: html + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
mag_err_g_lsstmag_err_i_lsstmag_err_r_lsstmag_err_u_lsstmag_err_y_lsstmag_err_z_lsstmag_g_lsstmag_i_lsstmag_r_lsstmag_u_lsstmag_y_lsstmag_z_lsstredshift
count62.00000062.00000062.00000061.00000061.00000062.00000062.00000062.00000062.00000061.00000061.00000062.00000062.000000
mean0.0381820.0161650.0187700.1880500.0546820.02147824.82000023.38480424.00397025.44600822.93235423.0744810.780298
std0.0363980.0100690.0137500.1937470.1158750.0149611.3141121.3815871.3873581.2692771.5402841.4006730.355365
..........................................
50%0.0283090.0133900.0166600.1338150.0341990.01854025.06997023.74850624.47021525.57702923.29338423.5141850.764600
75%0.0495760.0246500.0258020.2388590.0635850.03255725.70548624.48865424.98522526.26328423.99301024.1659440.948494
max0.1981950.0369320.0653601.1540730.9092300.05188327.29615224.94964526.03695828.48239127.34215124.6931321.755764
+

8 rows × 13 columns

+
+ + + +.. code:: ipython3 + + train_goldenspike.data.hist('redshift', bins=20) + + + + +.. parsed-literal:: + + array([[]], dtype=object) + + + + +.. image:: output_78_1.png + + +.. code:: ipython3 + + train_goldenspike.data.hist('mag_i_lsst', bins=20) + + + + +.. parsed-literal:: + + array([[]], dtype=object) + + + + +.. image:: output_79_1.png + + +Training and Validation Results +------------------------------- + +The results of training or validating PZ algorithms can not be loaded +into memory directly but can be downloaded to the local work directory. + +.. code:: ipython3 + + pz_server.download_product("182_example_tpz_training_results", save_in=".") + + +.. parsed-literal:: + + Connecting to PZ Server... + File saved as: ./182_example_tpz_training_results_fd535.zip + Done! + + +PZ Server Pipelines (under development) +--------------------------------------- + +Spec-z Catalogs and Training Sets can be created using the +cross-matching pipelines available on the PZ Server. Any catalog built +by the pipeline is automatically registered as a regular user-generated +data product and is the same as the uploaded ones. + +-------------- + +User feedback +------------- + +Is something important missing? `Click here to open an issue in the PZ +Server library repository on +GitHub `__. From fb978326abf6a0e08105469d55d63f68839adc71 Mon Sep 17 00:00:00 2001 From: Julia Date: Wed, 11 Dec 2024 15:31:21 +0000 Subject: [PATCH 9/9] update docs files --- .pre-commit-config.yaml | 44 ++++++++++++++++++++--------------------- docs/nbs.rst | 4 +--- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4f8f0b9..2a7a9eb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -103,25 +103,25 @@ repos: # notebooks from the docs, so users don't have to wait through the execution # of each notebook or each commit. By default, these will be checked in the # GitHub workflows. - # - repo: local - # hooks: - # - id: sphinx-build - # name: Build documentation with Sphinx - # entry: sphinx-build - # language: system - # always_run: true - # exclude_types: [file, symlink] - # args: - # [ - # "-M", # Run sphinx in make mode, so we can use -D flag later - # # Note: -M requires next 3 args to be builder, source, output - # "html", # Specify builder - # "./docs", # Source directory of documents - # "./build", # Output directory for rendered documents - # "-T", # Show full trace back on exception - # "-E", # Don't use saved env; always read all files - # "-d", # Flag for cached environment and doctrees - # "./docs/build/doctrees", # Directory - # "-D", # Flag to override settings in conf.py - # "exclude_patterns=notebooks/*.ipynb", # Exclude our notebooks from pre-commit - # ] \ No newline at end of file + - repo: local + hooks: + - id: sphinx-build + name: Build documentation with Sphinx + entry: sphinx-build + language: system + always_run: true + exclude_types: [file, symlink] + args: + [ + "-M", # Run sphinx in make mode, so we can use -D flag later + # Note: -M requires next 3 args to be builder, source, output + "html", # Specify builder + "./docs", # Source directory of documents + "./build", # Output directory for rendered documents + "-T", # Show full trace back on exception + "-E", # Don't use saved env; always read all files + "-d", # Flag for cached environment and doctrees + "./docs/build/doctrees", # Directory + "-D", # Flag to override settings in conf.py + "exclude_patterns=notebooks/*.ipynb", # Exclude our notebooks from pre-commit + ] diff --git a/docs/nbs.rst b/docs/nbs.rst index 8a18491..0f49660 100644 --- a/docs/nbs.rst +++ b/docs/nbs.rst @@ -3,6 +3,4 @@ Notebooks .. toctree:: - Introducing Pz Server lib - Specz Catalogs - Training Sets + Tutorial introducing PZ Server lib