diff --git a/.gitignore b/.gitignore index 1bdc56e8..9ac14a0e 100644 --- a/.gitignore +++ b/.gitignore @@ -156,8 +156,6 @@ _html/ # Project initialization script .initialize_new_project.sh -# large, unused fits files -point_map.fits - # test notebook -dev/test.ipynb \ No newline at end of file +dev/test.ipynb +docs/tutorials/pre_executed/data \ No newline at end of file diff --git a/README.md b/README.md index 587fb597..fd47988a 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,17 @@ A framework to facilitate and enable spatial analysis for extremely large astronomical databases (i.e. querying and crossmatching O(1B) sources). This package uses dask to parallelize operations across -multiple HiPSCat partitioned surveys. +multiple HATS partitioned surveys. Check out our [ReadTheDocs site](https://lsdb.readthedocs.io/en/stable/) for more information on partitioning, installation, and contributing. See related projects: -* HiPSCat ([on GitHub](https://github.com/astronomy-commons/hipscat)) - ([on ReadTheDocs](https://hipscat.readthedocs.io/en/stable/)) -* HiPSCat Import ([on GitHub](https://github.com/astronomy-commons/hipscat-import)) - ([on ReadTheDocs](https://hipscat-import.readthedocs.io/en/stable/)) +* HATS ([on GitHub](https://github.com/astronomy-commons/hats)) + ([on ReadTheDocs](https://hats.readthedocs.io/en/stable/)) +* HATS Import ([on GitHub](https://github.com/astronomy-commons/hats-import)) + ([on ReadTheDocs](https://hats-import.readthedocs.io/en/stable/)) ## Contributing diff --git a/benchmarks/benchmarks.py b/benchmarks/benchmarks.py index b056febb..1d3ac5a2 100644 --- a/benchmarks/benchmarks.py +++ b/benchmarks/benchmarks.py @@ -22,15 +22,15 @@ def load_small_sky(): - return lsdb.read_hipscat(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_DIR_NAME, catalog_type=lsdb.Catalog) + return lsdb.read_hats(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_DIR_NAME, catalog_type=lsdb.Catalog) def load_small_sky_order1(): - return lsdb.read_hipscat(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_ORDER1, catalog_type=lsdb.Catalog) + return lsdb.read_hats(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_ORDER1, catalog_type=lsdb.Catalog) def load_small_sky_xmatch(): - return lsdb.read_hipscat(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_XMATCH_NAME, catalog_type=lsdb.Catalog) + return lsdb.read_hats(TEST_DIR / DATA_DIR_NAME / SMALL_SKY_XMATCH_NAME, catalog_type=lsdb.Catalog) def time_kdtree_crossmatch(): @@ -63,8 +63,8 @@ def time_box_filter_on_partition(): def time_create_midsize_catalog(): - return lsdb.read_hipscat(BENCH_DATA_DIR / "midsize_catalog") + return lsdb.read_hats(BENCH_DATA_DIR / "midsize_catalog") def time_create_large_catalog(): - return lsdb.read_hipscat(BENCH_DATA_DIR / "large_catalog") + return lsdb.read_hats(BENCH_DATA_DIR / "large_catalog") diff --git a/docs/_static/lazy_diagram.svg b/docs/_static/lazy_diagram.svg index 524668de..673ce247 100644 --- a/docs/_static/lazy_diagram.svg +++ b/docs/_static/lazy_diagram.svg @@ -24,26 +24,26 @@ Read data / Do compute - + -read_hipscat -read_hipscat, from_dataframe, ... +read_hats +read_hats, from_dataframe, ... crossmatch crossmatch, cone_search, ... - + -read_hipscat->crossmatch +read_hats->crossmatch compute -compute, to_hipscat, ... +compute, to_hats, ... diff --git a/docs/conf.py b/docs/conf.py index 3991f0a6..0e410eb4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -74,8 +74,8 @@ pygments_style = "sphinx" -# Cross-link hipscat documentation from the API reference: +# Cross-link hats documentation from the API reference: # https://docs.readthedocs.io/en/stable/guides/intersphinx.html intersphinx_mapping = { - "hipscat": ("http://hipscat.readthedocs.io/en/stable/", None), + "hats": ("http://hats.readthedocs.io/en/stable/", None), } diff --git a/docs/developer/contributing.rst b/docs/developer/contributing.rst index 586904b3..161a66ba 100644 --- a/docs/developer/contributing.rst +++ b/docs/developer/contributing.rst @@ -55,7 +55,7 @@ the GitHub repository. The next steps assume the creation of branches and PRs ar If you are (or expect to be) a frequent contributor, you should consider requesting access to the `hipscat-friends `_ working group. Members of this GitHub group should be able to create branches and PRs directly - on LSDB, hipscat and hipscat-import, without the need of a fork. + on LSDB, hats and hats-import, without the need of a fork. Create a branch ------------------------------------------------------------------------------- diff --git a/docs/getting-started.rst b/docs/getting-started.rst index 2eb7fa41..fa5db7aa 100644 --- a/docs/getting-started.rst +++ b/docs/getting-started.rst @@ -62,14 +62,14 @@ for more information. Loading a Catalog ~~~~~~~~~~~~~~~~~~~~~~~~~~ -Let's start by loading a HiPSCat formatted Catalog into LSDB. Use the :func:`lsdb.read_hipscat` function to +Let's start by loading a HATS formatted Catalog into LSDB. Use the :func:`lsdb.read_hats` function to lazy load a catalog object. We'll pass in the URL to load the Zwicky Transient Facility Data Release 14 Catalog, and specify which columns we want to use from it. .. code-block:: python import lsdb - ztf = lsdb.read_hipscat( + ztf = lsdb.read_hats( 'https://data.lsdb.io/unstable/ztf/ztf_dr14/', columns=["ra", "dec", "ps1_objid", "nobs_r", "mean_mag_r"], ) @@ -94,7 +94,7 @@ usually see values). Where to get Catalogs ~~~~~~~~~~~~~~~~~~~~~~~~~~ -LSDB can load any catalogs in the HiPSCat format, locally or from remote sources. There are a number of +LSDB can load any catalogs in the HATS format, locally or from remote sources. There are a number of catalogs available publicly to use from the cloud. You can see them with their URLs to load in LSDB at our website `data.lsdb.io `_ @@ -107,7 +107,7 @@ If you have your own data not in this format, you can import it by following the Performing Filters ~~~~~~~~~~~~~~~~~~~~~~~~~~ -LSDB can perform spatial filters fast, taking advantage of HiPSCat's spatial partitioning. These optimized +LSDB can perform spatial filters fast, taking advantage of HATS's spatial partitioning. These optimized filters have their own methods, such as :func:`cone_search `. For the list of these methods see the full docs for the :func:`Catalog ` class. @@ -132,7 +132,7 @@ get accurate results. This should be provided with the catalog by the catalog's .. code-block:: python - gaia = lsdb.read_hipscat( + gaia = lsdb.read_hats( 'https://data.lsdb.io/unstable/gaia_dr3/gaia/', columns=["ra", "dec", "phot_g_n_obs", "phot_g_mean_flux", "pm"], margin_cache="https://data.lsdb.io/unstable/gaia_dr3/gaia_10arcs/", @@ -166,13 +166,13 @@ Saving the Result ~~~~~~~~~~~~~~~~~~~~~~~~~~ For large results, it won't be possible to ``compute()`` since the full result won't be able to fit into memory. -So instead, we can run the computation and save the results directly to disk in hipscat format. +So instead, we can run the computation and save the results directly to disk in hats format. .. code-block:: python - ztf_x_gaia.to_hipscat("./ztf_x_gaia") + ztf_x_gaia.to_hats("./ztf_x_gaia") -This creates the following HiPSCat Catalog on disk: +This creates the following HATS Catalog on disk: .. code-block:: @@ -182,11 +182,10 @@ This creates the following HiPSCat Catalog on disk: │ │ ├── Npix=57.parquet │ │ └── ... │ └── ... - ├── _metadata ├── _common_metadata - ├── catalog_info.json - ├── partition_info.csv - └── provenance_info.json + ├── _metadata + ├── properties + └── partition_info.csv Creation of Jupyter Kernel -------------------------- diff --git a/docs/index.rst b/docs/index.rst index 063a14bd..629a5e09 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -11,7 +11,7 @@ large astronomical catalogs (e.g. querying and crossmatching O(1B) sources). It data processing challenges, in particular those brought up by `LSST `_. Built on top of Dask to efficiently scale and parallelize operations across multiple distributed workers, it -uses the `HiPSCat `_ data format to efficiently perform spatial +uses the `HATS `_ data format to efficiently perform spatial operations. .. figure:: _static/gaia.png diff --git a/docs/requirements.txt b/docs/requirements.txt index 260d801a..6a734805 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -10,4 +10,5 @@ sphinx-autoapi sphinx-copybutton sphinx-book-theme sphinx-design -git+https://github.com/astronomy-commons/hipscat.git@main +git+https://github.com/astronomy-commons/hats.git@main +git+https://github.com/astronomy-commons/hats-import.git@main diff --git a/docs/tutorials/exporting_results.ipynb b/docs/tutorials/exporting_results.ipynb index dfadf34f..c8ea142c 100644 --- a/docs/tutorials/exporting_results.ipynb +++ b/docs/tutorials/exporting_results.ipynb @@ -6,16 +6,16 @@ "source": [ "# Exporting results\n", "\n", - "You can save the catalogs that result from running your workflow to disk, in parquet format, using the `to_hipscat` call. \n", + "You can save the catalogs that result from running your workflow to disk, in parquet format, using the `to_hats` call. \n", "\n", "You must provide a `base_catalog_path`, which is the output path for your catalog directory, and (optionally) a name for your catalog, `catalog_name`. The `catalog_name` is the catalog's internal name and therefore may differ from the catalog's base directory name. If the directory already exists and you want to overwrite its content set the `overwrite` flag to True. Do not forget to provide the necessary credentials, as `storage_options` to the UPath construction, when trying to export the catalog to protected remote storage.\n", "\n", "For example, to save a catalog that contains the results of crossmatching Gaia with ZTF to `\"./my_catalogs/gaia_x_ztf\"` one could run:\n", "```python\n", - "gaia_x_ztf_catalog.to_hipscat(base_catalog_path=\"./my_catalogs/gaia_x_ztf\", catalog_name=\"gaia_x_ztf\")\n", + "gaia_x_ztf_catalog.to_hats(base_catalog_path=\"./my_catalogs/gaia_x_ztf\", catalog_name=\"gaia_x_ztf\")\n", "```\n", "\n", - "The HiPSCat catalogs on disk follow a well-defined directory structure:\n", + "The HATS catalogs on disk follow a well-defined directory structure:\n", "\n", "```\n", "gaia_x_ztf/\n", diff --git a/docs/tutorials/filtering_large_catalogs.ipynb b/docs/tutorials/filtering_large_catalogs.ipynb index 705cfb5f..bb8845fe 100644 --- a/docs/tutorials/filtering_large_catalogs.ipynb +++ b/docs/tutorials/filtering_large_catalogs.ipynb @@ -9,7 +9,7 @@ "source": [ "# Filtering large catalogs\n", "\n", - "Large astronomical surveys contain a massive volume of data. Billion object, multi-terabyte sized catalogs are challenging to store and manipulate because they demand state-of-the-art hardware. Processing them is expensive, both in terms of runtime and memory consumption, and performing it in a single machine has become impractical. LSDB is a solution that enables scalable algorithm execution. It handles loading, querying, filtering and crossmatching astronomical data (of HiPSCat format) in a distributed environment. \n", + "Large astronomical surveys contain a massive volume of data. Billion object, multi-terabyte sized catalogs are challenging to store and manipulate because they demand state-of-the-art hardware. Processing them is expensive, both in terms of runtime and memory consumption, and performing it in a single machine has become impractical. LSDB is a solution that enables scalable algorithm execution. It handles loading, querying, filtering and crossmatching astronomical data (of HATS format) in a distributed environment. \n", "\n", "In this tutorial, we will demonstrate how to:\n", "\n", @@ -93,7 +93,7 @@ "outputs": [], "source": [ "ztf_object_path = f\"{surveys_path}/ztf/ztf_dr14\"\n", - "ztf_object = lsdb.read_hipscat(ztf_object_path, columns=[\"ps1_objid\", \"ra\", \"dec\"])\n", + "ztf_object = lsdb.read_hats(ztf_object_path, columns=[\"ps1_objid\", \"ra\", \"dec\"])\n", "ztf_object" ] }, @@ -318,7 +318,7 @@ "id": "9a887b31", "metadata": {}, "source": [ - "We can stack a several number of filters, which are applied in sequence. For example, `catalog.box_search().polygon_search()` should result in a perfectly valid HiPSCat catalog containing the objects that match both filters." + "We can stack a several number of filters, which are applied in sequence. For example, `catalog.box_search().polygon_search()` should result in a perfectly valid HATS catalog containing the objects that match both filters." ] }, { diff --git a/docs/tutorials/getting_data.ipynb b/docs/tutorials/getting_data.ipynb index cca12f8b..eb471a57 100644 --- a/docs/tutorials/getting_data.ipynb +++ b/docs/tutorials/getting_data.ipynb @@ -6,7 +6,7 @@ "source": [ "# Getting data into LSDB\n", "\n", - "The most practical way to load data into LSDB is from catalogs in HiPSCat format, hosted locally or on a remote source. We recommend you to visit our own cloud repository, [data.lsdb.io](https://data.lsdb.io), where you are able to find large surveys publicly available to use." + "The most practical way to load data into LSDB is from catalogs in HATS format, hosted locally or on a remote source. We recommend you to visit our own cloud repository, [data.lsdb.io](https://data.lsdb.io), where you are able to find large surveys publicly available to use." ] }, { @@ -24,7 +24,7 @@ "source": [ "### Example: Loading Gaia DR3\n", "\n", - "Let's get Gaia DR3 into our workflow, as an example. It is as simple as invoking `read_hipscat` with the respective catalog URL, which you can copy directly from our website." + "Let's get Gaia DR3 into our workflow, as an example. It is as simple as invoking `read_hats` with the respective catalog URL, which you can copy directly from our website." ] }, { @@ -33,7 +33,7 @@ "metadata": {}, "outputs": [], "source": [ - "gaia_dr3 = lsdb.read_hipscat(\"https://data.lsdb.io/unstable/gaia_dr3/gaia/\")\n", + "gaia_dr3 = lsdb.read_hats(\"https://data.lsdb.io/unstable/gaia_dr3/gaia/\")\n", "gaia_dr3" ] }, @@ -59,11 +59,11 @@ "source": [ "Note that it's important (and highly recommended) to:\n", "\n", - "- **Pre-select a small subset of columns** that satisfies your scientific needs. Loading an unnecessarily large amount of data leads to computationally expensive and inefficient workflows. To see which columns are available before even having to invoke `read_hipscat`, please refer to the column descriptions in each catalog's section on [data.lsdb.io](https://data.lsdb.io).\n", + "- **Pre-select a small subset of columns** that satisfies your scientific needs. Loading an unnecessarily large amount of data leads to computationally expensive and inefficient workflows. To see which columns are available before even having to invoke `read_hats`, please refer to the column descriptions in each catalog's section on [data.lsdb.io](https://data.lsdb.io).\n", "\n", "- **Load catalogs with their respective margin caches**, when available. These margins are necessary to obtain accurate results in several operations such as joining and crossmatching. For more information about margins please visit our [Margins](margins.ipynb) topic notebook.\n", "\n", - "Let's define the set of columns we need and add the margin catalog's path to our `read_hipscat` call." + "Let's define the set of columns we need and add the margin catalog's path to our `read_hats` call." ] }, { @@ -72,7 +72,7 @@ "metadata": {}, "outputs": [], "source": [ - "gaia_dr3 = lsdb.read_hipscat(\n", + "gaia_dr3 = lsdb.read_hats(\n", " \"https://data.lsdb.io/unstable/gaia_dr3/gaia/\",\n", " margin_cache=\"https://data.lsdb.io/unstable/gaia_dr3/gaia_10arcs/\",\n", " columns=[\n", @@ -99,7 +99,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "When invoking `read_hipscat` only metadata information about that catalog (e.g. sky coverage, number of total rows and column schema) is loaded into memory! Notice that the ellipses in the previous catalog representation are just placeholders.\n", + "When invoking `read_hats` only metadata information about that catalog (e.g. sky coverage, number of total rows and column schema) is loaded into memory! Notice that the ellipses in the previous catalog representation are just placeholders.\n", "\n", "You will find that most use cases start with **LAZY** loading and planning operations, followed by more expensive **COMPUTE** operations. The data is only loaded into memory when we trigger the workflow computations, usually with a `compute` call.\n", "\n", diff --git a/docs/tutorials/import_catalogs.ipynb b/docs/tutorials/import_catalogs.ipynb index 4fe5b377..e7f26d8f 100644 --- a/docs/tutorials/import_catalogs.ipynb +++ b/docs/tutorials/import_catalogs.ipynb @@ -7,12 +7,12 @@ "collapsed": false }, "source": [ - "# Importing catalogs to HiPSCat format\n", + "# Importing catalogs to HATS format\n", "\n", - "This notebook presents two modes of importing catalogs to HiPSCat format:\n", + "This notebook presents two modes of importing catalogs to HATS format:\n", "\n", "1. `lsdb.from_dataframe()` method: helpful to load smaller catalogs from a single dataframe. data should have fewer than 1-2 million rows and the pandas dataframe should be less than 1-2G in-memory. if your data is larger, the format is complicated, you need more flexibility, or you notice any performance issues when importing with this mode, use the next mode.\n", - "2. `hipscat-import` package: for large datasets (1G - 100s of TB). this is a purpose-built map-reduce pipeline for creating hipscat catalogs from various datasets. in this notebook, we use a very basic dataset and basic import options. please see [the full package documentation](https://hipscat-import.readthedocs.io/) if you need to do anything more complicated." + "2. `hats-import` package: for large datasets (1G - 100s of TB). this is a purpose-built map-reduce pipeline for creating HATS catalogs from various datasets. in this notebook, we use a very basic dataset and basic import options. please see [the full package documentation](https://hats-import.readthedocs.io/) if you need to do anything more complicated." ] }, { @@ -119,8 +119,8 @@ " threshold=100,\n", ")\n", "\n", - "# Save it to disk in HiPSCat format\n", - "catalog.to_hipscat(f\"{tmp_dir.name}/from_dataframe\")" + "# Save it to disk in HATS format\n", + "catalog.to_hats(f\"{tmp_dir.name}/from_dataframe\")" ] }, { @@ -130,7 +130,7 @@ "collapsed": false }, "source": [ - "## HiPSCat import pipeline" + "## HATS import pipeline" ] }, { @@ -138,7 +138,7 @@ "id": "3842520c", "metadata": {}, "source": [ - "Let's install the latest release of hipscat-import:" + "Let's install the latest release of hats-import:" ] }, { @@ -153,7 +153,7 @@ }, "outputs": [], "source": [ - "!pip install git+https://github.com/astronomy-commons/hipscat-import.git@main --quiet" + "!pip install git+https://github.com/astronomy-commons/hats-import.git@main --quiet" ] }, { @@ -169,8 +169,8 @@ "outputs": [], "source": [ "from dask.distributed import Client\n", - "from hipscat_import.catalog.arguments import ImportArguments\n", - "from hipscat_import.pipeline import pipeline_with_client" + "from hats_import.catalog.arguments import ImportArguments\n", + "from hats_import.pipeline import pipeline_with_client" ] }, { @@ -226,7 +226,7 @@ }, "outputs": [], "source": [ - "from_dataframe_catalog = lsdb.read_hipscat(f\"{tmp_dir.name}/from_dataframe\")\n", + "from_dataframe_catalog = lsdb.read_hats(f\"{tmp_dir.name}/from_dataframe\")\n", "from_dataframe_catalog" ] }, @@ -242,7 +242,7 @@ }, "outputs": [], "source": [ - "from_import_pipeline_catalog = lsdb.read_hipscat(f\"{tmp_dir.name}/from_import_pipeline\")\n", + "from_import_pipeline_catalog = lsdb.read_hats(f\"{tmp_dir.name}/from_import_pipeline\")\n", "from_import_pipeline_catalog" ] }, diff --git a/docs/tutorials/margins.ipynb b/docs/tutorials/margins.ipynb index 71cc3d9a..98ca1d4c 100644 --- a/docs/tutorials/margins.ipynb +++ b/docs/tutorials/margins.ipynb @@ -6,7 +6,7 @@ "source": [ "# Margins\n", "\n", - "LSDB can handle datasets larger than memory by breaking them down into smaller spatially-connected parts and working on each part one at a time. One of the main tasks enabled by LSDB are spatial queries such as cross-matching; To ensure accurate comparisons, all nearby data points need to be loaded simultaneously. LSDB uses HiPSCat's method of organizing data spatially to achieve this. However, there's a limitation: at the boundaries of each divided section, some data points are going to be missed. This means that for operations requiring comparisons with neighboring points, such as cross-matching, the process might miss some matches for points near these boundaries because not all nearby points are included when analyzing one section at a time.\n", + "LSDB can handle datasets larger than memory by breaking them down into smaller spatially-connected parts and working on each part one at a time. One of the main tasks enabled by LSDB are spatial queries such as cross-matching; To ensure accurate comparisons, all nearby data points need to be loaded simultaneously. LSDB uses HATS' method of organizing data spatially to achieve this. However, there's a limitation: at the boundaries of each divided section, some data points are going to be missed. This means that for operations requiring comparisons with neighboring points, such as cross-matching, the process might miss some matches for points near these boundaries because not all nearby points are included when analyzing one section at a time.\n", "\n", "![Margin Boundary Example](_static/pixel-boundary-example.png)\n", "*Here we see an example of a boundary between HEALPix pixels, where the green points are in one partition and the red points in another. Working with one partition at a time, we would miss potential matches with points close to the boundary*\n", @@ -25,9 +25,9 @@ "source": [ "## Loading a Margin Catalog\n", "\n", - "The margin cache is stored as a separate HiPSCat catalog with the same partitioning as the main catalog.\n", + "The margin cache is stored as a separate HATS catalog with the same partitioning as the main catalog.\n", "\n", - "To load a margin cache, we first load the margin catalog the same as other HiPSCat catalogs with a `lsdb.read_hipscat` call." + "To load a margin cache, we first load the margin catalog the same as other HATS catalogs with a `lsdb.read_hats` call." ] }, { @@ -58,7 +58,7 @@ "outputs": [], "source": [ "ztf_margin_path = f\"{surveys_path}/ztf/ztf_object_margin\"\n", - "ztf_margin = lsdb.read_hipscat(ztf_margin_path)\n", + "ztf_margin = lsdb.read_hats(ztf_margin_path)\n", "print(f\"Margin size: {ztf_margin.hc_structure.catalog_info.margin_threshold} arcsec\")\n", "ztf_margin" ] @@ -93,7 +93,7 @@ "outputs": [], "source": [ "ztf_object_path = f\"{surveys_path}/ztf/ztf_object\"\n", - "ztf_object = lsdb.read_hipscat(ztf_object_path, margin_cache=ztf_margin)\n", + "ztf_object = lsdb.read_hats(ztf_object_path, margin_cache=ztf_margin)\n", "ztf_object" ] }, @@ -224,7 +224,7 @@ }, "outputs": [], "source": [ - "gaia = lsdb.read_hipscat(f\"{surveys_path}/gaia\")\n", + "gaia = lsdb.read_hats(f\"{surveys_path}/gaia\")\n", "gaia" ] }, diff --git a/docs/tutorials/performance.rst b/docs/tutorials/performance.rst index 5be43d29..3c94a8f1 100644 --- a/docs/tutorials/performance.rst +++ b/docs/tutorials/performance.rst @@ -4,7 +4,7 @@ Performance LSDB is a high-performance package built to support the analysis of large-scale astronomical datasets. One of the performance goals of LSDB is to add as little overhead over the input-output operations as possible. We achieve this aim for catalog cross-matching, spatial and data filtering operations by using -the `HiPSCat `_ data format, +the `HATS `_ data format, efficient algorithms, and `Dask `_ framework for parallel computing. @@ -44,7 +44,7 @@ increasing the radius from 1 arcminute to 25 degrees. The analysis has the following steps: -* Load the data from the HiPSCat format, selecting the subset of the data with ``lsdb.read_hipscat(PATH, columns=[RA_COL, DEC_COL]).cone_search(ra, dec, radius).compute()``. +* Load the data from the HATS format, selecting the subset of the data with ``lsdb.read_hats(PATH, columns=[RA_COL, DEC_COL]).cone_search(ra, dec, radius).compute()``. * Perform the cross-matching with the selected algorithm * LSDB: ``ztf.crossmatch(gaia, radius_arcsec=1, n_neighbors=1).compute()`` diff --git a/docs/tutorials/pre_executed/des-gaia.ipynb b/docs/tutorials/pre_executed/des-gaia.ipynb index 9c9c693b..0a255926 100644 --- a/docs/tutorials/pre_executed/des-gaia.ipynb +++ b/docs/tutorials/pre_executed/des-gaia.ipynb @@ -12,8 +12,8 @@ "In this tutorial we cross-match nain tables of Dark Energy Survey (DES) DR2 and Gaia DR3 catalogs. The outline of the tutorial is as follows:\n", "\n", "1. Get original data files\n", - "2. Convert the data to HiPSCat format using [hipscat-import](https://github.com/astronomy-commons/hipscat-import/)\n", - "3. Cross-match the catalogs using LSDB and save to a new HiPSCat catalog" + "2. Convert the data to HATS format using [hats-import](https://github.com/astronomy-commons/hats-import/)\n", + "3. Cross-match the catalogs using LSDB and save to a new HATS catalog" ] }, { @@ -28,21 +28,13 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "dbf9a727fa9682a1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "outputs": [], "source": [ - "# Comment to skip hipscat-import installation\n", - "%pip install --quiet hipscat-import\n", + "# Comment to skip hats-import installation\n", + "%pip install --quiet hats-import\n", "\n", "# Uncomment to install lsdb\n", "# %pip install --quiet lsdb" @@ -50,19 +42,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "a37c4b45dede404c", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/delucchi/git/smoke/lsdb/src/lsdb/__init__.py:8: UserWarning: This version of lsdb does not support dataframe query-planning, which has been disabled.\n", - " warnings.warn(\"This version of lsdb does not support dataframe query-planning, which has been disabled.\")\n" - ] - } - ], + "outputs": [], "source": [ "# For files and directories manipulation\n", "from pathlib import Path\n", @@ -84,17 +67,17 @@ "# Numpy is always useful!\n", "import numpy as np\n", "\n", - "# Explore the HiPSCat catalogs and plot sky maps\n", - "from hipscat.catalog import Catalog\n", - "from hipscat.inspection import plot_pixels\n", + "# Explore the HATS catalogs and plot sky maps\n", + "from hats.catalog import Catalog\n", + "from hats.inspection import plot_pixels\n", "\n", - "# For reading the HiPSCat catalogs and performing the cross-match\n", + "# For reading the HATS catalogs and performing the cross-match\n", "import lsdb\n", "\n", - "# For converting the data to HiPSCat format and generate margin caches\n", - "from hipscat_import.catalog.file_readers import CsvReader\n", - "from hipscat_import.margin_cache.margin_cache_arguments import MarginCacheArguments\n", - "from hipscat_import.pipeline import ImportArguments, pipeline_with_client" + "# For converting the data to HATS format and generate margin caches\n", + "from hats_import.catalog.file_readers import CsvReader\n", + "from hats_import.margin_cache.margin_cache_arguments import MarginCacheArguments\n", + "from hats_import.pipeline import ImportArguments, pipeline_with_client" ] }, { @@ -111,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "2828441463c81505", "metadata": {}, "outputs": [], @@ -122,17 +105,17 @@ "\n", "GAIA_SCHEMA_FILE = GAIA_DIR / \"schema.parquet\"\n", "\n", - "DES_HIPSCAT_NAME = \"des_dr2\"\n", - "GAIA_HIPSCAT_NAME = \"gaia_dr3\"\n", + "DES_HATS_NAME = \"des_dr2\"\n", + "GAIA_HATS_NAME = \"gaia_dr3\"\n", "GAIA_MARGIN_CACHE_NAME = \"gaia_dr3_1arcsec\"\n", "XMATCH_NAME = \"des_dr2_x_gaia_dr3\"\n", "\n", - "HIPSCAT_DIR = Path(\"hipscat\")\n", - "DES_HIPSCAT_DIR = HIPSCAT_DIR / DES_HIPSCAT_NAME\n", - "GAIA_HIPSCAT_DIR = HIPSCAT_DIR / GAIA_HIPSCAT_NAME\n", - "GAIA_MARGIN_CACHE_DIR = HIPSCAT_DIR / GAIA_MARGIN_CACHE_NAME\n", + "HATS_DIR = Path(\"catalogs\")\n", + "DES_HATS_DIR = HATS_DIR / DES_HATS_NAME\n", + "GAIA_HATS_DIR = HATS_DIR / GAIA_HATS_NAME\n", + "GAIA_MARGIN_CACHE_DIR = HATS_DIR / GAIA_MARGIN_CACHE_NAME\n", "\n", - "OUTPUT_HIPSCAT_DIR = HIPSCAT_DIR / XMATCH_NAME" + "XMATCH_DIR = HATS_DIR / XMATCH_NAME" ] }, { @@ -153,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "3678ae0f1ab1e8e1", "metadata": {}, "outputs": [], @@ -197,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "1b5f72a701f38dbb", "metadata": {}, "outputs": [], @@ -230,15 +213,26 @@ "source": [ "## Create Dask client\n", "\n", - "Both `hipscat-import` and `lsdb` use [Dask](https://dask.org) for parallel processing. We create a Dask client here to be used in all the following pipelines steps. We destroy the client at the end of the notebook." + "Both `hats-import` and `lsdb` use [Dask](https://dask.org) for parallel processing. We create a Dask client here to be used in all the following pipelines steps. We destroy the client at the end of the notebook." ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "id": "c1ae24c75a169106", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/delucchi/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use.\n", + "Perhaps you already have a cluster running?\n", + "Hosting the HTTP server on port 33731 instead\n", + " warnings.warn(\n" + ] + } + ], "source": [ "# See Dask documentation for the options, e.g. https://distributed.dask.org/en/latest/local-cluster.html\n", "# You would likely want to change `n_workers` to have an optimal performance while not going out of memory.\n", @@ -252,9 +246,9 @@ "collapsed": false }, "source": [ - "## Convert the data to HiPSCat format\n", + "## Convert the data to HATS format\n", "\n", - "We use the [hipscat-import](https://github.com/astronomy-commons/hipscat-import/) tool to create HiPSCat catalogs from the original data files." + "We use the [hats-import](https://github.com/astronomy-commons/hats-import/) tool to create HATS catalogs from the original data files." ] }, { @@ -264,7 +258,7 @@ "collapsed": false }, "source": [ - "### Convert DES DR2 to HiPSCat\n", + "### Convert DES DR2 to HATS\n", "\n", "- Plan the pipeline specifying all parameters of the conversion\n", "- Run the pipeline with [Dask](https://dask.org)" @@ -272,19 +266,19 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "id": "6c4a751793a5b9d5", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4afc15e216754f92b2b06b819edb74fb", + "model_id": "ea0a7843fcd5423db4e741b375db16a5", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Planning : 0%| | 0/5 [00:00" + "
" ] }, "metadata": {}, @@ -405,12 +397,9 @@ } ], "source": [ - "# Read the HiPSCat catalog metadata, it does not load any data, just healpix pixels and other metadata\n", - "des_hipscat_catalog = Catalog.read_from_hipscat(DES_HIPSCAT_DIR)\n", - "plot_pixels(des_hipscat_catalog)\n", - "\n", - "# TODO: add DES footprint to this plot\n", - "# https://des.ncsa.illinois.edu/static/images/dr2/dr2_footprint.png" + "# Read the HATS catalog metadata, it does not load any data, just healpix pixels and other metadata\n", + "des_catalog = Catalog.read_hats(DES_HATS_DIR)\n", + "plot_pixels(des_catalog)" ] }, { @@ -420,7 +409,7 @@ "collapsed": false }, "source": [ - "This is what you would get for the full catalog, it would have many healpix tiles instead of just a single one. The reason is that `hipscat-import` splits the data into multiple files to have no more than a million rows per healpix tile / HiPSCat parquet file.\n", + "This is what you would get for the full catalog, it would have many healpix tiles instead of just a single one. The reason is that `hats-import` splits the data into multiple files to have no more than a million rows per healpix tile / HATS parquet file.\n", "\n", "![DES Full Catalog Tile map](data:image/png;base64,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)" ] @@ -443,19 +432,34 @@ "collapsed": false }, "source": [ - "### Convert Gaia DR3 to HiPSCat\n", + "### Convert Gaia DR3 to HATS\n", "\n", - "For Gaia we need to specify schema of the input data, because currently `hipscat-import` cannot infer column data types properly from this dataset.\n", + "For Gaia we need to specify schema of the input data, because currently `hats-import` cannot infer column data types properly from this dataset.\n", "\n", - "See this GitHub issue for more details: " + "See this GitHub issue for more details: " ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "87db92f82a8f046f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "OSError", + "evalue": "File data/Gaia_DR3/schema.parquet already exists. If you mean to replace it then use the argument \"overwrite=True\".", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m gaia_file \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(GAIA_DIR\u001b[38;5;241m.\u001b[39mglob(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m*.csv.gz\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n\u001b[1;32m 2\u001b[0m empty_astropy_table \u001b[38;5;241m=\u001b[39m ascii\u001b[38;5;241m.\u001b[39mread(gaia_file, \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mecsv\u001b[39m\u001b[38;5;124m\"\u001b[39m, data_end\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m \u001b[43mempty_astropy_table\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwrite\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[43m \u001b[49m\u001b[43mGAIA_SCHEMA_FILE\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# Uncomment to overwrite existing schema file\u001b[39;49;00m\n\u001b[1;32m 6\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# overwrite=True,\u001b[39;49;00m\n\u001b[1;32m 7\u001b[0m \u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/astropy/table/connect.py:130\u001b[0m, in \u001b[0;36mTableWrite.__call__\u001b[0;34m(self, serialize_method, *args, **kwargs)\u001b[0m\n\u001b[1;32m 128\u001b[0m instance \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_instance\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m serialize_method_as(instance, serialize_method):\n\u001b[0;32m--> 130\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mregistry\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwrite\u001b[49m\u001b[43m(\u001b[49m\u001b[43minstance\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/astropy/io/registry/core.py:386\u001b[0m, in \u001b[0;36mUnifiedOutputRegistry.write\u001b[0;34m(self, data, format, *args, **kwargs)\u001b[0m\n\u001b[1;32m 381\u001b[0m \u001b[38;5;28mformat\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_valid_format(\n\u001b[1;32m 382\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mwrite\u001b[39m\u001b[38;5;124m\"\u001b[39m, data\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m, path, fileobj, args, kwargs\n\u001b[1;32m 383\u001b[0m )\n\u001b[1;32m 385\u001b[0m writer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_writer(\u001b[38;5;28mformat\u001b[39m, data\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__class__\u001b[39m)\n\u001b[0;32m--> 386\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mwriter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/astropy/io/misc/parquet.py:435\u001b[0m, in \u001b[0;36mwrite_table_parquet\u001b[0;34m(table, output, overwrite)\u001b[0m\n\u001b[1;32m 433\u001b[0m os\u001b[38;5;241m.\u001b[39mremove(output)\n\u001b[1;32m 434\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 435\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(NOT_OVERWRITING_MSG\u001b[38;5;241m.\u001b[39mformat(output))\n\u001b[1;32m 437\u001b[0m \u001b[38;5;66;03m# We use version='2.0' for full support of datatypes including uint32.\u001b[39;00m\n\u001b[1;32m 438\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m parquet\u001b[38;5;241m.\u001b[39mParquetWriter(output, schema, version\u001b[38;5;241m=\u001b[39mwriter_version) \u001b[38;5;28;01mas\u001b[39;00m writer:\n\u001b[1;32m 439\u001b[0m \u001b[38;5;66;03m# Convert each Table column to a pyarrow array\u001b[39;00m\n", + "\u001b[0;31mOSError\u001b[0m: File data/Gaia_DR3/schema.parquet already exists. If you mean to replace it then use the argument \"overwrite=True\"." + ] + } + ], "source": [ "gaia_file = next(GAIA_DIR.glob(\"*.csv.gz\"))\n", "empty_astropy_table = ascii.read(gaia_file, format=\"ecsv\", data_end=1)\n", @@ -468,28 +472,35 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "54857141a690eb58", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "841ee1dce38a4a85b433f68301ac3fa6", + "model_id": "99ab154793884704bbbe42775432c8ea", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Planning : 0%| | 0/5 [00:00" + "
" ] }, "metadata": {}, @@ -609,8 +635,8 @@ ], "source": [ "# It should be full sky for the whole catalog\n", - "gaia_hipscat_catalog = Catalog.read_from_hipscat(GAIA_HIPSCAT_DIR)\n", - "plot_pixels(gaia_hipscat_catalog)" + "gaia_catalog = Catalog.read_hats(GAIA_HATS_DIR)\n", + "plot_pixels(gaia_catalog)" ] }, { @@ -621,7 +647,7 @@ }, "source": [ "And this is how it would look like for the entire Gaia catalog.\n", - "Notice how Milky Way region is denser and thus has higher healpix order (smaller tiles), since `hipscat-import` limits the maximum number of objects per pixel to be 1 million.\n", + "Notice how Milky Way region is denser and thus has higher healpix order (smaller tiles), since `hats-import` limits the maximum number of objects per pixel to be 1 million.\n", "\n", "![Entire Gaia Sky map](data:image/png;base64,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\n", ")" @@ -634,7 +660,7 @@ "collapsed": false }, "source": [ - "#### Generate margin cache for the Gaia HiPSCat catalog\n", + "#### Generate margin cache for the Gaia HATS catalog\n", "\n", "LSDB requires right-catalog margin cache to generate the complete cross-match result.\n", "Without the margin cache, the objects located near the edges of Healpix tiles may be missed in the cross-match." @@ -649,54 +675,60 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9267ca50fcdf4bc9b49bb5bd31728b09", + "model_id": "b81c66ea9b3848189d273e6d5251cb2a", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Mapping : 0%| | 0/1 [00:00 8\u001b[0m \u001b[43mpipeline_with_client\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmargin_cache_args\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclient\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/git/hats/hipscat-import/src/hats_import/pipeline.py:60\u001b[0m, in \u001b[0;36mpipeline_with_client\u001b[0;34m(args, client)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m args\u001b[38;5;241m.\u001b[39mcompletion_email_address:\n\u001b[1;32m 59\u001b[0m _send_failure_email(args, exception)\n\u001b[0;32m---> 60\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exception\n", + "File \u001b[0;32m~/git/hats/hipscat-import/src/hats_import/pipeline.py:48\u001b[0m, in \u001b[0;36mpipeline_with_client\u001b[0;34m(args, client)\u001b[0m\n\u001b[1;32m 46\u001b[0m index_runner\u001b[38;5;241m.\u001b[39mrun(args, client)\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(args, MarginCacheArguments):\n\u001b[0;32m---> 48\u001b[0m \u001b[43mmargin_runner\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate_margin_cache\u001b[49m\u001b[43m(\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclient\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(args, SoapArguments):\n\u001b[1;32m 50\u001b[0m soap_runner\u001b[38;5;241m.\u001b[39mrun(args, client)\n", + "File \u001b[0;32m~/git/hats/hipscat-import/src/hats_import/margin_cache/margin_cache.py:57\u001b[0m, in \u001b[0;36mgenerate_margin_cache\u001b[0;34m(args, client)\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m reducing_key, pix \u001b[38;5;129;01min\u001b[39;00m resume_plan\u001b[38;5;241m.\u001b[39mget_remaining_reduce_keys():\n\u001b[1;32m 45\u001b[0m futures\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 46\u001b[0m client\u001b[38;5;241m.\u001b[39msubmit(\n\u001b[1;32m 47\u001b[0m mcmr\u001b[38;5;241m.\u001b[39mreduce_margin_shards,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 55\u001b[0m )\n\u001b[1;32m 56\u001b[0m )\n\u001b[0;32m---> 57\u001b[0m \u001b[43mresume_plan\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait_for_reducing\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m resume_plan\u001b[38;5;241m.\u001b[39mprint_progress(total\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m, stage_name\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFinishing\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01mas\u001b[39;00m step_progress:\n\u001b[1;32m 60\u001b[0m total_rows \u001b[38;5;241m=\u001b[39m parquet_metadata\u001b[38;5;241m.\u001b[39mwrite_parquet_metadata(args\u001b[38;5;241m.\u001b[39mcatalog_path)\n", + "File \u001b[0;32m~/git/hats/hipscat-import/src/hats_import/margin_cache/margin_cache_resume_plan.py:136\u001b[0m, in \u001b[0;36mMarginCachePlan.wait_for_reducing\u001b[0;34m(self, futures)\u001b[0m\n\u001b[1;32m 134\u001b[0m remaining_sources_to_reduce \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_remaining_reduce_keys()\n\u001b[1;32m 135\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(remaining_sources_to_reduce) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 136\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\n\u001b[1;32m 137\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mlen\u001b[39m(remaining_sources_to_reduce)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m reducing stages did not complete successfully.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 138\u001b[0m )\n\u001b[1;32m 139\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtouch_stage_done_file(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mREDUCING_STAGE)\n", + "\u001b[0;31mRuntimeError\u001b[0m: 12 reducing stages did not complete successfully." + ] } ], "source": [ "margin_cache_args = MarginCacheArguments(\n", - " input_catalog_path=GAIA_HIPSCAT_DIR,\n", - " output_path=HIPSCAT_DIR,\n", - " margin_threshold=1.0, # arcsec\n", + " input_catalog_path=GAIA_HATS_DIR,\n", + " output_path=HATS_DIR,\n", + " margin_threshold=5.0, # arcsec\n", " output_artifact_name=GAIA_MARGIN_CACHE_NAME,\n", - " # Uncomment to overwrite existing margin cache\n", - " # overwrite=True,\n", ")\n", "\n", "pipeline_with_client(margin_cache_args, client)" @@ -721,10 +753,18 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "5bb07cbf3c1b00c8", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/delucchi/git/hats/lsdb/src/lsdb/dask/crossmatch_catalog_data.py:108: RuntimeWarning: Right catalog does not have a margin cache. Results may be incomplete and/or inaccurate.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/html": [ @@ -1190,224 +1230,224 @@ " \n", " \n", " 4611686018427387904\n", - " int64\n", - " string\n", - " int64\n", - " int64\n", - " int64\n", - " int64\n", - " int64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int16\n", - " int16\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " uint8\n", - " uint64\n", - " uint64\n", + " int64[pyarrow]\n", + " string[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " uint8[pyarrow]\n", + " uint64[pyarrow]\n", + " uint64[pyarrow]\n", " \n", " \n", " 18446744073709551615\n", @@ -1635,12 +1675,13 @@ "" ], "text/plain": [ - "Dask DataFrame Structure:\n", - " COADD_OBJECT_ID TILENAME HPIX_32 HPIX_64 HPIX_1024 HPIX_4096 HPIX_16384 RA DEC ALPHAWIN_J2000 DELTAWIN_J2000 GALACTIC_L GALACTIC_B XWIN_IMAGE YWIN_IMAGE A_IMAGE ERRA_IMAGE B_IMAGE ERRB_IMAGE THETA_J2000 ERRTHETA_IMAGE KRON_RADIUS EBV_SFD98 MAG_AUTO_G_DERED MAG_AUTO_R_DERED MAG_AUTO_I_DERED MAG_AUTO_Z_DERED MAG_AUTO_Y_DERED WAVG_MAG_PSF_G_DERED WAVG_MAG_PSF_R_DERED WAVG_MAG_PSF_I_DERED WAVG_MAG_PSF_Z_DERED WAVG_MAG_PSF_Y_DERED EXTENDED_CLASS_COADD EXTENDED_CLASS_WAVG FLAGS_G IMAFLAGS_ISO_G NEPOCHS_G FLAGS_R IMAFLAGS_ISO_R NEPOCHS_R FLAGS_I IMAFLAGS_ISO_I NEPOCHS_I FLAGS_Z IMAFLAGS_ISO_Z NEPOCHS_Z FLAGS_Y IMAFLAGS_ISO_Y NEPOCHS_Y XWIN_IMAGE_G XWIN_IMAGE_R XWIN_IMAGE_I XWIN_IMAGE_Z XWIN_IMAGE_Y YWIN_IMAGE_G YWIN_IMAGE_R YWIN_IMAGE_I YWIN_IMAGE_Z YWIN_IMAGE_Y X2WIN_IMAGE_G X2WIN_IMAGE_R X2WIN_IMAGE_I X2WIN_IMAGE_Z X2WIN_IMAGE_Y Y2WIN_IMAGE_G Y2WIN_IMAGE_R Y2WIN_IMAGE_I Y2WIN_IMAGE_Z Y2WIN_IMAGE_Y XYWIN_IMAGE_G XYWIN_IMAGE_R XYWIN_IMAGE_I XYWIN_IMAGE_Z XYWIN_IMAGE_Y ERRX2WIN_IMAGE_G ERRX2WIN_IMAGE_R ERRX2WIN_IMAGE_I ERRX2WIN_IMAGE_Z ERRX2WIN_IMAGE_Y ERRY2WIN_IMAGE_G ERRY2WIN_IMAGE_R ERRY2WIN_IMAGE_I ERRY2WIN_IMAGE_Z ERRY2WIN_IMAGE_Y ERRXYWIN_IMAGE_G ERRXYWIN_IMAGE_R ERRXYWIN_IMAGE_I ERRXYWIN_IMAGE_Z ERRXYWIN_IMAGE_Y AWIN_IMAGE_G AWIN_IMAGE_R AWIN_IMAGE_I AWIN_IMAGE_Z AWIN_IMAGE_Y BWIN_IMAGE_G BWIN_IMAGE_R BWIN_IMAGE_I BWIN_IMAGE_Z BWIN_IMAGE_Y THETAWIN_IMAGE_G THETAWIN_IMAGE_R THETAWIN_IMAGE_I THETAWIN_IMAGE_Z THETAWIN_IMAGE_Y ERRAWIN_IMAGE_G ERRAWIN_IMAGE_R ERRAWIN_IMAGE_I ERRAWIN_IMAGE_Z ERRAWIN_IMAGE_Y ERRBWIN_IMAGE_G ERRBWIN_IMAGE_R ERRBWIN_IMAGE_I ERRBWIN_IMAGE_Z ERRBWIN_IMAGE_Y ERRTHETAWIN_IMAGE_G ERRTHETAWIN_IMAGE_R ERRTHETAWIN_IMAGE_I ERRTHETAWIN_IMAGE_Z ERRTHETAWIN_IMAGE_Y FLUX_RADIUS_G FLUX_RADIUS_R FLUX_RADIUS_I FLUX_RADIUS_Z FLUX_RADIUS_Y FWHM_IMAGE_G FWHM_IMAGE_R FWHM_IMAGE_I FWHM_IMAGE_Z FWHM_IMAGE_Y ISOAREA_IMAGE_G ISOAREA_IMAGE_R ISOAREA_IMAGE_I ISOAREA_IMAGE_Z ISOAREA_IMAGE_Y BACKGROUND_G BACKGROUND_R BACKGROUND_I BACKGROUND_Z BACKGROUND_Y NITER_MODEL_G NITER_MODEL_R NITER_MODEL_I NITER_MODEL_Z NITER_MODEL_Y KRON_RADIUS_G KRON_RADIUS_R KRON_RADIUS_I KRON_RADIUS_Z KRON_RADIUS_Y MAG_AUTO_G MAG_AUTO_R MAG_AUTO_I MAG_AUTO_Z MAG_AUTO_Y MAGERR_AUTO_G MAGERR_AUTO_R MAGERR_AUTO_I MAGERR_AUTO_Z MAGERR_AUTO_Y WAVG_MAG_PSF_G WAVG_MAG_PSF_R WAVG_MAG_PSF_I WAVG_MAG_PSF_Z WAVG_MAG_PSF_Y WAVG_MAGERR_PSF_G WAVG_MAGERR_PSF_R WAVG_MAGERR_PSF_I WAVG_MAGERR_PSF_Z WAVG_MAGERR_PSF_Y FLUX_AUTO_G FLUX_AUTO_R FLUX_AUTO_I FLUX_AUTO_Z FLUX_AUTO_Y FLUXERR_AUTO_G FLUXERR_AUTO_R FLUXERR_AUTO_I FLUXERR_AUTO_Z FLUXERR_AUTO_Y WAVG_FLUX_PSF_G WAVG_FLUX_PSF_R WAVG_FLUX_PSF_I WAVG_FLUX_PSF_Z WAVG_FLUX_PSF_Y WAVG_FLUXERR_PSF_G WAVG_FLUXERR_PSF_R WAVG_FLUXERR_PSF_I WAVG_FLUXERR_PSF_Z WAVG_FLUXERR_PSF_Y CLASS_STAR_G CLASS_STAR_R CLASS_STAR_I CLASS_STAR_Z CLASS_STAR_Y SPREAD_MODEL_G SPREAD_MODEL_R SPREAD_MODEL_I SPREAD_MODEL_Z SPREAD_MODEL_Y WAVG_SPREAD_MODEL_G WAVG_SPREAD_MODEL_R WAVG_SPREAD_MODEL_I WAVG_SPREAD_MODEL_Z WAVG_SPREAD_MODEL_Y SPREADERR_MODEL_G SPREADERR_MODEL_R SPREADERR_MODEL_I SPREADERR_MODEL_Z SPREADERR_MODEL_Y WAVG_SPREADERR_MODEL_G WAVG_SPREADERR_MODEL_R WAVG_SPREADERR_MODEL_I WAVG_SPREADERR_MODEL_Z WAVG_SPREADERR_MODEL_Y Norder Dir Npix\n", - "npartitions=1 \n", - "4611686018427387904 int64 string int64 int64 int64 int64 int64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 int16 int16 int16 int32 int32 int16 int32 int32 int16 int32 int32 int16 int32 int32 int16 int32 int32 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 int32 int32 int32 int32 int32 float64 float64 float64 float64 float64 int32 int32 int32 int32 int32 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 uint8 uint64 uint64\n", - "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "Dask Name: to_pyarrow_string, 2 graph layers" + "Dask NestedFrame Structure:\n", + " COADD_OBJECT_ID TILENAME HPIX_32 HPIX_64 HPIX_1024 HPIX_4096 HPIX_16384 RA DEC ALPHAWIN_J2000 DELTAWIN_J2000 GALACTIC_L GALACTIC_B XWIN_IMAGE YWIN_IMAGE A_IMAGE ERRA_IMAGE B_IMAGE ERRB_IMAGE THETA_J2000 ERRTHETA_IMAGE KRON_RADIUS EBV_SFD98 MAG_AUTO_G_DERED MAG_AUTO_R_DERED MAG_AUTO_I_DERED MAG_AUTO_Z_DERED MAG_AUTO_Y_DERED WAVG_MAG_PSF_G_DERED WAVG_MAG_PSF_R_DERED WAVG_MAG_PSF_I_DERED WAVG_MAG_PSF_Z_DERED WAVG_MAG_PSF_Y_DERED EXTENDED_CLASS_COADD EXTENDED_CLASS_WAVG FLAGS_G IMAFLAGS_ISO_G NEPOCHS_G FLAGS_R IMAFLAGS_ISO_R NEPOCHS_R FLAGS_I IMAFLAGS_ISO_I NEPOCHS_I FLAGS_Z IMAFLAGS_ISO_Z NEPOCHS_Z FLAGS_Y IMAFLAGS_ISO_Y NEPOCHS_Y XWIN_IMAGE_G XWIN_IMAGE_R XWIN_IMAGE_I XWIN_IMAGE_Z XWIN_IMAGE_Y YWIN_IMAGE_G YWIN_IMAGE_R YWIN_IMAGE_I YWIN_IMAGE_Z YWIN_IMAGE_Y X2WIN_IMAGE_G X2WIN_IMAGE_R X2WIN_IMAGE_I X2WIN_IMAGE_Z X2WIN_IMAGE_Y Y2WIN_IMAGE_G Y2WIN_IMAGE_R Y2WIN_IMAGE_I Y2WIN_IMAGE_Z Y2WIN_IMAGE_Y XYWIN_IMAGE_G XYWIN_IMAGE_R XYWIN_IMAGE_I XYWIN_IMAGE_Z XYWIN_IMAGE_Y ERRX2WIN_IMAGE_G ERRX2WIN_IMAGE_R ERRX2WIN_IMAGE_I ERRX2WIN_IMAGE_Z ERRX2WIN_IMAGE_Y ERRY2WIN_IMAGE_G ERRY2WIN_IMAGE_R ERRY2WIN_IMAGE_I ERRY2WIN_IMAGE_Z ERRY2WIN_IMAGE_Y ERRXYWIN_IMAGE_G ERRXYWIN_IMAGE_R ERRXYWIN_IMAGE_I ERRXYWIN_IMAGE_Z ERRXYWIN_IMAGE_Y AWIN_IMAGE_G AWIN_IMAGE_R AWIN_IMAGE_I AWIN_IMAGE_Z AWIN_IMAGE_Y BWIN_IMAGE_G BWIN_IMAGE_R BWIN_IMAGE_I BWIN_IMAGE_Z BWIN_IMAGE_Y THETAWIN_IMAGE_G THETAWIN_IMAGE_R THETAWIN_IMAGE_I THETAWIN_IMAGE_Z THETAWIN_IMAGE_Y ERRAWIN_IMAGE_G ERRAWIN_IMAGE_R ERRAWIN_IMAGE_I ERRAWIN_IMAGE_Z ERRAWIN_IMAGE_Y ERRBWIN_IMAGE_G ERRBWIN_IMAGE_R ERRBWIN_IMAGE_I ERRBWIN_IMAGE_Z ERRBWIN_IMAGE_Y ERRTHETAWIN_IMAGE_G ERRTHETAWIN_IMAGE_R ERRTHETAWIN_IMAGE_I ERRTHETAWIN_IMAGE_Z ERRTHETAWIN_IMAGE_Y FLUX_RADIUS_G FLUX_RADIUS_R FLUX_RADIUS_I FLUX_RADIUS_Z FLUX_RADIUS_Y FWHM_IMAGE_G FWHM_IMAGE_R FWHM_IMAGE_I FWHM_IMAGE_Z FWHM_IMAGE_Y ISOAREA_IMAGE_G ISOAREA_IMAGE_R ISOAREA_IMAGE_I ISOAREA_IMAGE_Z ISOAREA_IMAGE_Y BACKGROUND_G BACKGROUND_R BACKGROUND_I BACKGROUND_Z BACKGROUND_Y NITER_MODEL_G NITER_MODEL_R NITER_MODEL_I NITER_MODEL_Z NITER_MODEL_Y KRON_RADIUS_G KRON_RADIUS_R KRON_RADIUS_I KRON_RADIUS_Z KRON_RADIUS_Y MAG_AUTO_G MAG_AUTO_R MAG_AUTO_I MAG_AUTO_Z MAG_AUTO_Y MAGERR_AUTO_G MAGERR_AUTO_R MAGERR_AUTO_I MAGERR_AUTO_Z MAGERR_AUTO_Y WAVG_MAG_PSF_G WAVG_MAG_PSF_R WAVG_MAG_PSF_I WAVG_MAG_PSF_Z WAVG_MAG_PSF_Y WAVG_MAGERR_PSF_G WAVG_MAGERR_PSF_R WAVG_MAGERR_PSF_I WAVG_MAGERR_PSF_Z WAVG_MAGERR_PSF_Y FLUX_AUTO_G FLUX_AUTO_R FLUX_AUTO_I FLUX_AUTO_Z FLUX_AUTO_Y FLUXERR_AUTO_G FLUXERR_AUTO_R FLUXERR_AUTO_I FLUXERR_AUTO_Z FLUXERR_AUTO_Y WAVG_FLUX_PSF_G WAVG_FLUX_PSF_R WAVG_FLUX_PSF_I WAVG_FLUX_PSF_Z WAVG_FLUX_PSF_Y WAVG_FLUXERR_PSF_G WAVG_FLUXERR_PSF_R WAVG_FLUXERR_PSF_I WAVG_FLUXERR_PSF_Z WAVG_FLUXERR_PSF_Y CLASS_STAR_G CLASS_STAR_R CLASS_STAR_I CLASS_STAR_Z CLASS_STAR_Y SPREAD_MODEL_G SPREAD_MODEL_R SPREAD_MODEL_I SPREAD_MODEL_Z SPREAD_MODEL_Y WAVG_SPREAD_MODEL_G WAVG_SPREAD_MODEL_R WAVG_SPREAD_MODEL_I WAVG_SPREAD_MODEL_Z WAVG_SPREAD_MODEL_Y SPREADERR_MODEL_G SPREADERR_MODEL_R SPREADERR_MODEL_I SPREADERR_MODEL_Z SPREADERR_MODEL_Y WAVG_SPREADERR_MODEL_G WAVG_SPREADERR_MODEL_R WAVG_SPREADERR_MODEL_I WAVG_SPREADERR_MODEL_Z WAVG_SPREADERR_MODEL_Y Norder Dir Npix\n", + "npartitions=1 \n", + "4611686018427387904 int64[pyarrow] string[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow]\n", + "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "Dask Name: nestedframe, 3 expressions\n", + "Expr=MapPartitions(NestedFrame)" ] }, "metadata": {}, @@ -1985,161 +2026,161 @@ " \n", " \n", " 4611686018427387904\n", - " int64\n", - " string\n", - " int64\n", - " int64\n", - " float64\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int8\n", - " bool\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " int8\n", - " int8\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " bool\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " int16\n", - " int8\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int8\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " string\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " bool\n", - " bool\n", - " int16\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " string\n", - " uint8\n", - " uint64\n", - " uint64\n", + " int64[pyarrow]\n", + " string[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " bool[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " int8[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " bool[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int8[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " string[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " int16[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " string[pyarrow]\n", + " uint8[pyarrow]\n", + " uint64[pyarrow]\n", + " uint64[pyarrow]\n", " \n", " \n", " 18446744073709551615\n", @@ -2304,12 +2345,13 @@ "" ], "text/plain": [ - "Dask DataFrame Structure:\n", - " solution_id designation source_id random_index ref_epoch ra ra_error dec dec_error parallax parallax_error parallax_over_error pm pmra pmra_error pmdec pmdec_error ra_dec_corr ra_parallax_corr ra_pmra_corr ra_pmdec_corr dec_parallax_corr dec_pmra_corr dec_pmdec_corr parallax_pmra_corr parallax_pmdec_corr pmra_pmdec_corr astrometric_n_obs_al astrometric_n_obs_ac astrometric_n_good_obs_al astrometric_n_bad_obs_al astrometric_gof_al astrometric_chi2_al astrometric_excess_noise astrometric_excess_noise_sig astrometric_params_solved astrometric_primary_flag nu_eff_used_in_astrometry pseudocolour pseudocolour_error ra_pseudocolour_corr dec_pseudocolour_corr parallax_pseudocolour_corr pmra_pseudocolour_corr pmdec_pseudocolour_corr astrometric_matched_transits visibility_periods_used astrometric_sigma5d_max matched_transits new_matched_transits matched_transits_removed ipd_gof_harmonic_amplitude ipd_gof_harmonic_phase ipd_frac_multi_peak ipd_frac_odd_win ruwe scan_direction_strength_k1 scan_direction_strength_k2 scan_direction_strength_k3 scan_direction_strength_k4 scan_direction_mean_k1 scan_direction_mean_k2 scan_direction_mean_k3 scan_direction_mean_k4 duplicated_source phot_g_n_obs phot_g_mean_flux phot_g_mean_flux_error phot_g_mean_flux_over_error phot_g_mean_mag phot_bp_n_obs phot_bp_mean_flux phot_bp_mean_flux_error phot_bp_mean_flux_over_error phot_bp_mean_mag phot_rp_n_obs phot_rp_mean_flux phot_rp_mean_flux_error phot_rp_mean_flux_over_error phot_rp_mean_mag phot_bp_rp_excess_factor phot_bp_n_contaminated_transits phot_bp_n_blended_transits phot_rp_n_contaminated_transits phot_rp_n_blended_transits phot_proc_mode bp_rp bp_g g_rp radial_velocity radial_velocity_error rv_method_used rv_nb_transits rv_nb_deblended_transits rv_visibility_periods_used rv_expected_sig_to_noise rv_renormalised_gof rv_chisq_pvalue rv_time_duration rv_amplitude_robust rv_template_teff rv_template_logg rv_template_fe_h rv_atm_param_origin vbroad vbroad_error vbroad_nb_transits grvs_mag grvs_mag_error grvs_mag_nb_transits rvs_spec_sig_to_noise phot_variable_flag l b ecl_lon ecl_lat in_qso_candidates in_galaxy_candidates non_single_star has_xp_continuous has_xp_sampled has_rvs has_epoch_photometry has_epoch_rv has_mcmc_gspphot has_mcmc_msc in_andromeda_survey classprob_dsc_combmod_quasar classprob_dsc_combmod_galaxy classprob_dsc_combmod_star teff_gspphot teff_gspphot_lower teff_gspphot_upper logg_gspphot logg_gspphot_lower logg_gspphot_upper mh_gspphot mh_gspphot_lower mh_gspphot_upper distance_gspphot distance_gspphot_lower distance_gspphot_upper azero_gspphot azero_gspphot_lower azero_gspphot_upper ag_gspphot ag_gspphot_lower ag_gspphot_upper ebpminrp_gspphot ebpminrp_gspphot_lower ebpminrp_gspphot_upper libname_gspphot Norder Dir Npix\n", - "npartitions=1 \n", - "4611686018427387904 int64 string int64 int64 float64 float64 float32 float64 float32 float64 float32 float32 float32 float64 float32 float64 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 int16 int16 int16 int16 float32 float32 float32 float32 int8 bool float32 float32 float32 float32 float32 float32 float32 float32 int16 int16 float32 int16 int16 int16 float32 float32 int8 int8 float32 float32 float32 float32 float32 float32 float32 float32 float32 bool int16 float64 float32 float32 float32 int16 float64 float32 float32 float32 int16 float64 float32 float32 float32 float32 int16 int16 int16 int16 int8 float32 float32 float32 float32 float32 int8 int16 int16 int16 float32 float32 float32 float32 float32 float32 float32 float32 int16 float32 float32 int16 float32 float32 int16 float32 string float64 float64 float64 float64 bool bool int16 bool bool bool bool bool bool bool bool float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 string uint8 uint64 uint64\n", - "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "Dask Name: to_pyarrow_string, 2 graph layers" + "Dask NestedFrame Structure:\n", + " solution_id designation source_id random_index ref_epoch ra ra_error dec dec_error parallax parallax_error parallax_over_error pm pmra pmra_error pmdec pmdec_error ra_dec_corr ra_parallax_corr ra_pmra_corr ra_pmdec_corr dec_parallax_corr dec_pmra_corr dec_pmdec_corr parallax_pmra_corr parallax_pmdec_corr pmra_pmdec_corr astrometric_n_obs_al astrometric_n_obs_ac astrometric_n_good_obs_al astrometric_n_bad_obs_al astrometric_gof_al astrometric_chi2_al astrometric_excess_noise astrometric_excess_noise_sig astrometric_params_solved astrometric_primary_flag nu_eff_used_in_astrometry pseudocolour pseudocolour_error ra_pseudocolour_corr dec_pseudocolour_corr parallax_pseudocolour_corr pmra_pseudocolour_corr pmdec_pseudocolour_corr astrometric_matched_transits visibility_periods_used astrometric_sigma5d_max matched_transits new_matched_transits matched_transits_removed ipd_gof_harmonic_amplitude ipd_gof_harmonic_phase ipd_frac_multi_peak ipd_frac_odd_win ruwe scan_direction_strength_k1 scan_direction_strength_k2 scan_direction_strength_k3 scan_direction_strength_k4 scan_direction_mean_k1 scan_direction_mean_k2 scan_direction_mean_k3 scan_direction_mean_k4 duplicated_source phot_g_n_obs phot_g_mean_flux phot_g_mean_flux_error phot_g_mean_flux_over_error phot_g_mean_mag phot_bp_n_obs phot_bp_mean_flux phot_bp_mean_flux_error phot_bp_mean_flux_over_error phot_bp_mean_mag phot_rp_n_obs phot_rp_mean_flux phot_rp_mean_flux_error phot_rp_mean_flux_over_error phot_rp_mean_mag phot_bp_rp_excess_factor phot_bp_n_contaminated_transits phot_bp_n_blended_transits phot_rp_n_contaminated_transits phot_rp_n_blended_transits phot_proc_mode bp_rp bp_g g_rp radial_velocity radial_velocity_error rv_method_used rv_nb_transits rv_nb_deblended_transits rv_visibility_periods_used rv_expected_sig_to_noise rv_renormalised_gof rv_chisq_pvalue rv_time_duration rv_amplitude_robust rv_template_teff rv_template_logg rv_template_fe_h rv_atm_param_origin vbroad vbroad_error vbroad_nb_transits grvs_mag grvs_mag_error grvs_mag_nb_transits rvs_spec_sig_to_noise phot_variable_flag l b ecl_lon ecl_lat in_qso_candidates in_galaxy_candidates non_single_star has_xp_continuous has_xp_sampled has_rvs has_epoch_photometry has_epoch_rv has_mcmc_gspphot has_mcmc_msc in_andromeda_survey classprob_dsc_combmod_quasar classprob_dsc_combmod_galaxy classprob_dsc_combmod_star teff_gspphot teff_gspphot_lower teff_gspphot_upper logg_gspphot logg_gspphot_lower logg_gspphot_upper mh_gspphot mh_gspphot_lower mh_gspphot_upper distance_gspphot distance_gspphot_lower distance_gspphot_upper azero_gspphot azero_gspphot_lower azero_gspphot_upper ag_gspphot ag_gspphot_lower ag_gspphot_upper ebpminrp_gspphot ebpminrp_gspphot_lower ebpminrp_gspphot_upper libname_gspphot Norder Dir Npix\n", + "npartitions=1 \n", + "4611686018427387904 int64[pyarrow] string[pyarrow] int64[pyarrow] int64[pyarrow] double[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] bool[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] int8[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] bool[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int8[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] string[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] bool[pyarrow] bool[pyarrow] int16[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] string[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow]\n", + "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "Dask Name: nestedframe, 3 expressions\n", + "Expr=MapPartitions(NestedFrame)" ] }, "metadata": {}, @@ -3092,380 +3134,380 @@ " \n", " \n", " 4611686018427387904\n", - " int64\n", - " string\n", - " int64\n", - " int64\n", - " int64\n", - " int64\n", - " int64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int16\n", - " int16\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " int16\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " int32\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " uint8\n", - " uint64\n", - " uint64\n", - " int64\n", - " string\n", - " int64\n", - " int64\n", - " float64\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float64\n", - " float32\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int8\n", - " bool\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " int8\n", - " int8\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " bool\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float64\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " int16\n", - " int16\n", - " int16\n", - " int8\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int8\n", - " int16\n", - " int16\n", - " int16\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " float32\n", - " int16\n", - " float32\n", - " string\n", - " float64\n", - " float64\n", - " float64\n", - " float64\n", - " bool\n", - " bool\n", - " int16\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " bool\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " float32\n", - " string\n", - " uint8\n", - " uint64\n", - " uint64\n", - " float64\n", + " int64[pyarrow]\n", + " string[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int16[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " int32[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " uint8[pyarrow]\n", + " uint64[pyarrow]\n", + " uint64[pyarrow]\n", + " int64[pyarrow]\n", + " string[pyarrow]\n", + " int64[pyarrow]\n", + " int64[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " bool[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " int8[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " bool[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " double[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int8[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int8[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " int16[pyarrow]\n", + " float[pyarrow]\n", + " string[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " double[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " int16[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " bool[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " float[pyarrow]\n", + " string[pyarrow]\n", + " uint8[pyarrow]\n", + " uint64[pyarrow]\n", + " uint64[pyarrow]\n", + " double[pyarrow]\n", " \n", " \n", " 18446744073709551615\n", @@ -3849,12 +3891,13 @@ "" ], "text/plain": [ - "Dask DataFrame Structure:\n", - " COADD_OBJECT_ID_des TILENAME_des HPIX_32_des HPIX_64_des HPIX_1024_des HPIX_4096_des HPIX_16384_des RA_des DEC_des ALPHAWIN_J2000_des DELTAWIN_J2000_des GALACTIC_L_des GALACTIC_B_des XWIN_IMAGE_des YWIN_IMAGE_des A_IMAGE_des ERRA_IMAGE_des B_IMAGE_des ERRB_IMAGE_des THETA_J2000_des ERRTHETA_IMAGE_des KRON_RADIUS_des EBV_SFD98_des MAG_AUTO_G_DERED_des MAG_AUTO_R_DERED_des MAG_AUTO_I_DERED_des MAG_AUTO_Z_DERED_des MAG_AUTO_Y_DERED_des WAVG_MAG_PSF_G_DERED_des WAVG_MAG_PSF_R_DERED_des WAVG_MAG_PSF_I_DERED_des WAVG_MAG_PSF_Z_DERED_des WAVG_MAG_PSF_Y_DERED_des EXTENDED_CLASS_COADD_des EXTENDED_CLASS_WAVG_des FLAGS_G_des IMAFLAGS_ISO_G_des NEPOCHS_G_des FLAGS_R_des IMAFLAGS_ISO_R_des NEPOCHS_R_des FLAGS_I_des IMAFLAGS_ISO_I_des NEPOCHS_I_des FLAGS_Z_des IMAFLAGS_ISO_Z_des NEPOCHS_Z_des FLAGS_Y_des IMAFLAGS_ISO_Y_des NEPOCHS_Y_des XWIN_IMAGE_G_des XWIN_IMAGE_R_des XWIN_IMAGE_I_des XWIN_IMAGE_Z_des XWIN_IMAGE_Y_des YWIN_IMAGE_G_des YWIN_IMAGE_R_des YWIN_IMAGE_I_des YWIN_IMAGE_Z_des YWIN_IMAGE_Y_des X2WIN_IMAGE_G_des X2WIN_IMAGE_R_des X2WIN_IMAGE_I_des X2WIN_IMAGE_Z_des X2WIN_IMAGE_Y_des Y2WIN_IMAGE_G_des Y2WIN_IMAGE_R_des Y2WIN_IMAGE_I_des Y2WIN_IMAGE_Z_des Y2WIN_IMAGE_Y_des XYWIN_IMAGE_G_des XYWIN_IMAGE_R_des XYWIN_IMAGE_I_des XYWIN_IMAGE_Z_des XYWIN_IMAGE_Y_des ERRX2WIN_IMAGE_G_des ERRX2WIN_IMAGE_R_des ERRX2WIN_IMAGE_I_des ERRX2WIN_IMAGE_Z_des ERRX2WIN_IMAGE_Y_des ERRY2WIN_IMAGE_G_des ERRY2WIN_IMAGE_R_des ERRY2WIN_IMAGE_I_des ERRY2WIN_IMAGE_Z_des ERRY2WIN_IMAGE_Y_des ERRXYWIN_IMAGE_G_des ERRXYWIN_IMAGE_R_des ERRXYWIN_IMAGE_I_des ERRXYWIN_IMAGE_Z_des ERRXYWIN_IMAGE_Y_des AWIN_IMAGE_G_des AWIN_IMAGE_R_des AWIN_IMAGE_I_des AWIN_IMAGE_Z_des AWIN_IMAGE_Y_des BWIN_IMAGE_G_des BWIN_IMAGE_R_des BWIN_IMAGE_I_des BWIN_IMAGE_Z_des BWIN_IMAGE_Y_des THETAWIN_IMAGE_G_des THETAWIN_IMAGE_R_des THETAWIN_IMAGE_I_des THETAWIN_IMAGE_Z_des THETAWIN_IMAGE_Y_des ERRAWIN_IMAGE_G_des ERRAWIN_IMAGE_R_des ERRAWIN_IMAGE_I_des ERRAWIN_IMAGE_Z_des ERRAWIN_IMAGE_Y_des ERRBWIN_IMAGE_G_des ERRBWIN_IMAGE_R_des ERRBWIN_IMAGE_I_des ERRBWIN_IMAGE_Z_des ERRBWIN_IMAGE_Y_des ERRTHETAWIN_IMAGE_G_des ERRTHETAWIN_IMAGE_R_des ERRTHETAWIN_IMAGE_I_des ERRTHETAWIN_IMAGE_Z_des ERRTHETAWIN_IMAGE_Y_des FLUX_RADIUS_G_des FLUX_RADIUS_R_des FLUX_RADIUS_I_des FLUX_RADIUS_Z_des FLUX_RADIUS_Y_des FWHM_IMAGE_G_des FWHM_IMAGE_R_des FWHM_IMAGE_I_des FWHM_IMAGE_Z_des FWHM_IMAGE_Y_des ISOAREA_IMAGE_G_des ISOAREA_IMAGE_R_des ISOAREA_IMAGE_I_des ISOAREA_IMAGE_Z_des ISOAREA_IMAGE_Y_des BACKGROUND_G_des BACKGROUND_R_des BACKGROUND_I_des BACKGROUND_Z_des BACKGROUND_Y_des NITER_MODEL_G_des NITER_MODEL_R_des NITER_MODEL_I_des NITER_MODEL_Z_des NITER_MODEL_Y_des KRON_RADIUS_G_des KRON_RADIUS_R_des KRON_RADIUS_I_des KRON_RADIUS_Z_des KRON_RADIUS_Y_des MAG_AUTO_G_des MAG_AUTO_R_des MAG_AUTO_I_des MAG_AUTO_Z_des MAG_AUTO_Y_des MAGERR_AUTO_G_des MAGERR_AUTO_R_des MAGERR_AUTO_I_des MAGERR_AUTO_Z_des MAGERR_AUTO_Y_des WAVG_MAG_PSF_G_des WAVG_MAG_PSF_R_des WAVG_MAG_PSF_I_des WAVG_MAG_PSF_Z_des WAVG_MAG_PSF_Y_des WAVG_MAGERR_PSF_G_des WAVG_MAGERR_PSF_R_des WAVG_MAGERR_PSF_I_des WAVG_MAGERR_PSF_Z_des WAVG_MAGERR_PSF_Y_des FLUX_AUTO_G_des FLUX_AUTO_R_des FLUX_AUTO_I_des FLUX_AUTO_Z_des FLUX_AUTO_Y_des FLUXERR_AUTO_G_des FLUXERR_AUTO_R_des FLUXERR_AUTO_I_des FLUXERR_AUTO_Z_des FLUXERR_AUTO_Y_des WAVG_FLUX_PSF_G_des WAVG_FLUX_PSF_R_des WAVG_FLUX_PSF_I_des WAVG_FLUX_PSF_Z_des WAVG_FLUX_PSF_Y_des WAVG_FLUXERR_PSF_G_des WAVG_FLUXERR_PSF_R_des WAVG_FLUXERR_PSF_I_des WAVG_FLUXERR_PSF_Z_des WAVG_FLUXERR_PSF_Y_des CLASS_STAR_G_des CLASS_STAR_R_des CLASS_STAR_I_des CLASS_STAR_Z_des CLASS_STAR_Y_des SPREAD_MODEL_G_des SPREAD_MODEL_R_des SPREAD_MODEL_I_des SPREAD_MODEL_Z_des SPREAD_MODEL_Y_des WAVG_SPREAD_MODEL_G_des WAVG_SPREAD_MODEL_R_des WAVG_SPREAD_MODEL_I_des WAVG_SPREAD_MODEL_Z_des WAVG_SPREAD_MODEL_Y_des SPREADERR_MODEL_G_des SPREADERR_MODEL_R_des SPREADERR_MODEL_I_des SPREADERR_MODEL_Z_des SPREADERR_MODEL_Y_des WAVG_SPREADERR_MODEL_G_des WAVG_SPREADERR_MODEL_R_des WAVG_SPREADERR_MODEL_I_des WAVG_SPREADERR_MODEL_Z_des WAVG_SPREADERR_MODEL_Y_des Norder_des Dir_des Npix_des solution_id_gaia designation_gaia source_id_gaia random_index_gaia ref_epoch_gaia ra_gaia ra_error_gaia dec_gaia dec_error_gaia parallax_gaia parallax_error_gaia parallax_over_error_gaia pm_gaia pmra_gaia pmra_error_gaia pmdec_gaia pmdec_error_gaia ra_dec_corr_gaia ra_parallax_corr_gaia ra_pmra_corr_gaia ra_pmdec_corr_gaia dec_parallax_corr_gaia dec_pmra_corr_gaia dec_pmdec_corr_gaia parallax_pmra_corr_gaia parallax_pmdec_corr_gaia pmra_pmdec_corr_gaia astrometric_n_obs_al_gaia astrometric_n_obs_ac_gaia astrometric_n_good_obs_al_gaia astrometric_n_bad_obs_al_gaia astrometric_gof_al_gaia astrometric_chi2_al_gaia astrometric_excess_noise_gaia astrometric_excess_noise_sig_gaia astrometric_params_solved_gaia astrometric_primary_flag_gaia nu_eff_used_in_astrometry_gaia pseudocolour_gaia pseudocolour_error_gaia ra_pseudocolour_corr_gaia dec_pseudocolour_corr_gaia parallax_pseudocolour_corr_gaia pmra_pseudocolour_corr_gaia pmdec_pseudocolour_corr_gaia astrometric_matched_transits_gaia visibility_periods_used_gaia astrometric_sigma5d_max_gaia matched_transits_gaia new_matched_transits_gaia matched_transits_removed_gaia ipd_gof_harmonic_amplitude_gaia ipd_gof_harmonic_phase_gaia ipd_frac_multi_peak_gaia ipd_frac_odd_win_gaia ruwe_gaia scan_direction_strength_k1_gaia scan_direction_strength_k2_gaia scan_direction_strength_k3_gaia scan_direction_strength_k4_gaia scan_direction_mean_k1_gaia scan_direction_mean_k2_gaia scan_direction_mean_k3_gaia scan_direction_mean_k4_gaia duplicated_source_gaia phot_g_n_obs_gaia phot_g_mean_flux_gaia phot_g_mean_flux_error_gaia phot_g_mean_flux_over_error_gaia phot_g_mean_mag_gaia phot_bp_n_obs_gaia phot_bp_mean_flux_gaia phot_bp_mean_flux_error_gaia phot_bp_mean_flux_over_error_gaia phot_bp_mean_mag_gaia phot_rp_n_obs_gaia phot_rp_mean_flux_gaia phot_rp_mean_flux_error_gaia phot_rp_mean_flux_over_error_gaia phot_rp_mean_mag_gaia phot_bp_rp_excess_factor_gaia phot_bp_n_contaminated_transits_gaia phot_bp_n_blended_transits_gaia phot_rp_n_contaminated_transits_gaia phot_rp_n_blended_transits_gaia phot_proc_mode_gaia bp_rp_gaia bp_g_gaia g_rp_gaia radial_velocity_gaia radial_velocity_error_gaia rv_method_used_gaia rv_nb_transits_gaia rv_nb_deblended_transits_gaia rv_visibility_periods_used_gaia rv_expected_sig_to_noise_gaia rv_renormalised_gof_gaia rv_chisq_pvalue_gaia rv_time_duration_gaia rv_amplitude_robust_gaia rv_template_teff_gaia rv_template_logg_gaia rv_template_fe_h_gaia rv_atm_param_origin_gaia vbroad_gaia vbroad_error_gaia vbroad_nb_transits_gaia grvs_mag_gaia grvs_mag_error_gaia grvs_mag_nb_transits_gaia rvs_spec_sig_to_noise_gaia phot_variable_flag_gaia l_gaia b_gaia ecl_lon_gaia ecl_lat_gaia in_qso_candidates_gaia in_galaxy_candidates_gaia non_single_star_gaia has_xp_continuous_gaia has_xp_sampled_gaia has_rvs_gaia has_epoch_photometry_gaia has_epoch_rv_gaia has_mcmc_gspphot_gaia has_mcmc_msc_gaia in_andromeda_survey_gaia classprob_dsc_combmod_quasar_gaia classprob_dsc_combmod_galaxy_gaia classprob_dsc_combmod_star_gaia teff_gspphot_gaia teff_gspphot_lower_gaia teff_gspphot_upper_gaia logg_gspphot_gaia logg_gspphot_lower_gaia logg_gspphot_upper_gaia mh_gspphot_gaia mh_gspphot_lower_gaia mh_gspphot_upper_gaia distance_gspphot_gaia distance_gspphot_lower_gaia distance_gspphot_upper_gaia azero_gspphot_gaia azero_gspphot_lower_gaia azero_gspphot_upper_gaia ag_gspphot_gaia ag_gspphot_lower_gaia ag_gspphot_upper_gaia ebpminrp_gspphot_gaia ebpminrp_gspphot_lower_gaia ebpminrp_gspphot_upper_gaia libname_gspphot_gaia Norder_gaia Dir_gaia Npix_gaia _dist_arcsec\n", - "npartitions=1 \n", - "4611686018427387904 int64 string int64 int64 int64 int64 int64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 int16 int16 int16 int32 int32 int16 int32 int32 int16 int32 int32 int16 int32 int32 int16 int32 int32 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 int32 int32 int32 int32 int32 float64 float64 float64 float64 float64 int32 int32 int32 int32 int32 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 float64 uint8 uint64 uint64 int64 string int64 int64 float64 float64 float32 float64 float32 float64 float32 float32 float32 float64 float32 float64 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 int16 int16 int16 int16 float32 float32 float32 float32 int8 bool float32 float32 float32 float32 float32 float32 float32 float32 int16 int16 float32 int16 int16 int16 float32 float32 int8 int8 float32 float32 float32 float32 float32 float32 float32 float32 float32 bool int16 float64 float32 float32 float32 int16 float64 float32 float32 float32 int16 float64 float32 float32 float32 float32 int16 int16 int16 int16 int8 float32 float32 float32 float32 float32 int8 int16 int16 int16 float32 float32 float32 float32 float32 float32 float32 float32 int16 float32 float32 int16 float32 float32 int16 float32 string float64 float64 float64 float64 bool bool int16 bool bool bool bool bool bool bool bool float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 float32 string uint8 uint64 uint64 float64\n", - "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "Dask Name: from-delayed, 4 graph layers" + "Dask NestedFrame Structure:\n", + " COADD_OBJECT_ID_des TILENAME_des HPIX_32_des HPIX_64_des HPIX_1024_des HPIX_4096_des HPIX_16384_des RA_des DEC_des ALPHAWIN_J2000_des DELTAWIN_J2000_des GALACTIC_L_des GALACTIC_B_des XWIN_IMAGE_des YWIN_IMAGE_des A_IMAGE_des ERRA_IMAGE_des B_IMAGE_des ERRB_IMAGE_des THETA_J2000_des ERRTHETA_IMAGE_des KRON_RADIUS_des EBV_SFD98_des MAG_AUTO_G_DERED_des MAG_AUTO_R_DERED_des MAG_AUTO_I_DERED_des MAG_AUTO_Z_DERED_des MAG_AUTO_Y_DERED_des WAVG_MAG_PSF_G_DERED_des WAVG_MAG_PSF_R_DERED_des WAVG_MAG_PSF_I_DERED_des WAVG_MAG_PSF_Z_DERED_des WAVG_MAG_PSF_Y_DERED_des EXTENDED_CLASS_COADD_des EXTENDED_CLASS_WAVG_des FLAGS_G_des IMAFLAGS_ISO_G_des NEPOCHS_G_des FLAGS_R_des IMAFLAGS_ISO_R_des NEPOCHS_R_des FLAGS_I_des IMAFLAGS_ISO_I_des NEPOCHS_I_des FLAGS_Z_des IMAFLAGS_ISO_Z_des NEPOCHS_Z_des FLAGS_Y_des IMAFLAGS_ISO_Y_des NEPOCHS_Y_des XWIN_IMAGE_G_des XWIN_IMAGE_R_des XWIN_IMAGE_I_des XWIN_IMAGE_Z_des XWIN_IMAGE_Y_des YWIN_IMAGE_G_des YWIN_IMAGE_R_des YWIN_IMAGE_I_des YWIN_IMAGE_Z_des YWIN_IMAGE_Y_des X2WIN_IMAGE_G_des X2WIN_IMAGE_R_des X2WIN_IMAGE_I_des X2WIN_IMAGE_Z_des X2WIN_IMAGE_Y_des Y2WIN_IMAGE_G_des Y2WIN_IMAGE_R_des Y2WIN_IMAGE_I_des Y2WIN_IMAGE_Z_des Y2WIN_IMAGE_Y_des XYWIN_IMAGE_G_des XYWIN_IMAGE_R_des XYWIN_IMAGE_I_des XYWIN_IMAGE_Z_des XYWIN_IMAGE_Y_des ERRX2WIN_IMAGE_G_des ERRX2WIN_IMAGE_R_des ERRX2WIN_IMAGE_I_des ERRX2WIN_IMAGE_Z_des ERRX2WIN_IMAGE_Y_des ERRY2WIN_IMAGE_G_des ERRY2WIN_IMAGE_R_des ERRY2WIN_IMAGE_I_des ERRY2WIN_IMAGE_Z_des ERRY2WIN_IMAGE_Y_des ERRXYWIN_IMAGE_G_des ERRXYWIN_IMAGE_R_des ERRXYWIN_IMAGE_I_des ERRXYWIN_IMAGE_Z_des ERRXYWIN_IMAGE_Y_des AWIN_IMAGE_G_des AWIN_IMAGE_R_des AWIN_IMAGE_I_des AWIN_IMAGE_Z_des AWIN_IMAGE_Y_des BWIN_IMAGE_G_des BWIN_IMAGE_R_des BWIN_IMAGE_I_des BWIN_IMAGE_Z_des BWIN_IMAGE_Y_des THETAWIN_IMAGE_G_des THETAWIN_IMAGE_R_des THETAWIN_IMAGE_I_des THETAWIN_IMAGE_Z_des THETAWIN_IMAGE_Y_des ERRAWIN_IMAGE_G_des ERRAWIN_IMAGE_R_des ERRAWIN_IMAGE_I_des ERRAWIN_IMAGE_Z_des ERRAWIN_IMAGE_Y_des ERRBWIN_IMAGE_G_des ERRBWIN_IMAGE_R_des ERRBWIN_IMAGE_I_des ERRBWIN_IMAGE_Z_des ERRBWIN_IMAGE_Y_des ERRTHETAWIN_IMAGE_G_des ERRTHETAWIN_IMAGE_R_des ERRTHETAWIN_IMAGE_I_des ERRTHETAWIN_IMAGE_Z_des ERRTHETAWIN_IMAGE_Y_des FLUX_RADIUS_G_des FLUX_RADIUS_R_des FLUX_RADIUS_I_des FLUX_RADIUS_Z_des FLUX_RADIUS_Y_des FWHM_IMAGE_G_des FWHM_IMAGE_R_des FWHM_IMAGE_I_des FWHM_IMAGE_Z_des FWHM_IMAGE_Y_des ISOAREA_IMAGE_G_des ISOAREA_IMAGE_R_des ISOAREA_IMAGE_I_des ISOAREA_IMAGE_Z_des ISOAREA_IMAGE_Y_des BACKGROUND_G_des BACKGROUND_R_des BACKGROUND_I_des BACKGROUND_Z_des BACKGROUND_Y_des NITER_MODEL_G_des NITER_MODEL_R_des NITER_MODEL_I_des NITER_MODEL_Z_des NITER_MODEL_Y_des KRON_RADIUS_G_des KRON_RADIUS_R_des KRON_RADIUS_I_des KRON_RADIUS_Z_des KRON_RADIUS_Y_des MAG_AUTO_G_des MAG_AUTO_R_des MAG_AUTO_I_des MAG_AUTO_Z_des MAG_AUTO_Y_des MAGERR_AUTO_G_des MAGERR_AUTO_R_des MAGERR_AUTO_I_des MAGERR_AUTO_Z_des MAGERR_AUTO_Y_des WAVG_MAG_PSF_G_des WAVG_MAG_PSF_R_des WAVG_MAG_PSF_I_des WAVG_MAG_PSF_Z_des WAVG_MAG_PSF_Y_des WAVG_MAGERR_PSF_G_des WAVG_MAGERR_PSF_R_des WAVG_MAGERR_PSF_I_des WAVG_MAGERR_PSF_Z_des WAVG_MAGERR_PSF_Y_des FLUX_AUTO_G_des FLUX_AUTO_R_des FLUX_AUTO_I_des FLUX_AUTO_Z_des FLUX_AUTO_Y_des FLUXERR_AUTO_G_des FLUXERR_AUTO_R_des FLUXERR_AUTO_I_des FLUXERR_AUTO_Z_des FLUXERR_AUTO_Y_des WAVG_FLUX_PSF_G_des WAVG_FLUX_PSF_R_des WAVG_FLUX_PSF_I_des WAVG_FLUX_PSF_Z_des WAVG_FLUX_PSF_Y_des WAVG_FLUXERR_PSF_G_des WAVG_FLUXERR_PSF_R_des WAVG_FLUXERR_PSF_I_des WAVG_FLUXERR_PSF_Z_des WAVG_FLUXERR_PSF_Y_des CLASS_STAR_G_des CLASS_STAR_R_des CLASS_STAR_I_des CLASS_STAR_Z_des CLASS_STAR_Y_des SPREAD_MODEL_G_des SPREAD_MODEL_R_des SPREAD_MODEL_I_des SPREAD_MODEL_Z_des SPREAD_MODEL_Y_des WAVG_SPREAD_MODEL_G_des WAVG_SPREAD_MODEL_R_des WAVG_SPREAD_MODEL_I_des WAVG_SPREAD_MODEL_Z_des WAVG_SPREAD_MODEL_Y_des SPREADERR_MODEL_G_des SPREADERR_MODEL_R_des SPREADERR_MODEL_I_des SPREADERR_MODEL_Z_des SPREADERR_MODEL_Y_des WAVG_SPREADERR_MODEL_G_des WAVG_SPREADERR_MODEL_R_des WAVG_SPREADERR_MODEL_I_des WAVG_SPREADERR_MODEL_Z_des WAVG_SPREADERR_MODEL_Y_des Norder_des Dir_des Npix_des solution_id_gaia designation_gaia source_id_gaia random_index_gaia ref_epoch_gaia ra_gaia ra_error_gaia dec_gaia dec_error_gaia parallax_gaia parallax_error_gaia parallax_over_error_gaia pm_gaia pmra_gaia pmra_error_gaia pmdec_gaia pmdec_error_gaia ra_dec_corr_gaia ra_parallax_corr_gaia ra_pmra_corr_gaia ra_pmdec_corr_gaia dec_parallax_corr_gaia dec_pmra_corr_gaia dec_pmdec_corr_gaia parallax_pmra_corr_gaia parallax_pmdec_corr_gaia pmra_pmdec_corr_gaia astrometric_n_obs_al_gaia astrometric_n_obs_ac_gaia astrometric_n_good_obs_al_gaia astrometric_n_bad_obs_al_gaia astrometric_gof_al_gaia astrometric_chi2_al_gaia astrometric_excess_noise_gaia astrometric_excess_noise_sig_gaia astrometric_params_solved_gaia astrometric_primary_flag_gaia nu_eff_used_in_astrometry_gaia pseudocolour_gaia pseudocolour_error_gaia ra_pseudocolour_corr_gaia dec_pseudocolour_corr_gaia parallax_pseudocolour_corr_gaia pmra_pseudocolour_corr_gaia pmdec_pseudocolour_corr_gaia astrometric_matched_transits_gaia visibility_periods_used_gaia astrometric_sigma5d_max_gaia matched_transits_gaia new_matched_transits_gaia matched_transits_removed_gaia ipd_gof_harmonic_amplitude_gaia ipd_gof_harmonic_phase_gaia ipd_frac_multi_peak_gaia ipd_frac_odd_win_gaia ruwe_gaia scan_direction_strength_k1_gaia scan_direction_strength_k2_gaia scan_direction_strength_k3_gaia scan_direction_strength_k4_gaia scan_direction_mean_k1_gaia scan_direction_mean_k2_gaia scan_direction_mean_k3_gaia scan_direction_mean_k4_gaia duplicated_source_gaia phot_g_n_obs_gaia phot_g_mean_flux_gaia phot_g_mean_flux_error_gaia phot_g_mean_flux_over_error_gaia phot_g_mean_mag_gaia phot_bp_n_obs_gaia phot_bp_mean_flux_gaia phot_bp_mean_flux_error_gaia phot_bp_mean_flux_over_error_gaia phot_bp_mean_mag_gaia phot_rp_n_obs_gaia phot_rp_mean_flux_gaia phot_rp_mean_flux_error_gaia phot_rp_mean_flux_over_error_gaia phot_rp_mean_mag_gaia phot_bp_rp_excess_factor_gaia phot_bp_n_contaminated_transits_gaia phot_bp_n_blended_transits_gaia phot_rp_n_contaminated_transits_gaia phot_rp_n_blended_transits_gaia phot_proc_mode_gaia bp_rp_gaia bp_g_gaia g_rp_gaia radial_velocity_gaia radial_velocity_error_gaia rv_method_used_gaia rv_nb_transits_gaia rv_nb_deblended_transits_gaia rv_visibility_periods_used_gaia rv_expected_sig_to_noise_gaia rv_renormalised_gof_gaia rv_chisq_pvalue_gaia rv_time_duration_gaia rv_amplitude_robust_gaia rv_template_teff_gaia rv_template_logg_gaia rv_template_fe_h_gaia rv_atm_param_origin_gaia vbroad_gaia vbroad_error_gaia vbroad_nb_transits_gaia grvs_mag_gaia grvs_mag_error_gaia grvs_mag_nb_transits_gaia rvs_spec_sig_to_noise_gaia phot_variable_flag_gaia l_gaia b_gaia ecl_lon_gaia ecl_lat_gaia in_qso_candidates_gaia in_galaxy_candidates_gaia non_single_star_gaia has_xp_continuous_gaia has_xp_sampled_gaia has_rvs_gaia has_epoch_photometry_gaia has_epoch_rv_gaia has_mcmc_gspphot_gaia has_mcmc_msc_gaia in_andromeda_survey_gaia classprob_dsc_combmod_quasar_gaia classprob_dsc_combmod_galaxy_gaia classprob_dsc_combmod_star_gaia teff_gspphot_gaia teff_gspphot_lower_gaia teff_gspphot_upper_gaia logg_gspphot_gaia logg_gspphot_lower_gaia logg_gspphot_upper_gaia mh_gspphot_gaia mh_gspphot_lower_gaia mh_gspphot_upper_gaia distance_gspphot_gaia distance_gspphot_lower_gaia distance_gspphot_upper_gaia azero_gspphot_gaia azero_gspphot_lower_gaia azero_gspphot_upper_gaia ag_gspphot_gaia ag_gspphot_lower_gaia ag_gspphot_upper_gaia ebpminrp_gspphot_gaia ebpminrp_gspphot_lower_gaia ebpminrp_gspphot_upper_gaia libname_gspphot_gaia Norder_gaia Dir_gaia Npix_gaia _dist_arcsec\n", + "npartitions=1 \n", + "4611686018427387904 int64[pyarrow] string[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] int64[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] int16[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] int32[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow] int64[pyarrow] string[pyarrow] int64[pyarrow] int64[pyarrow] double[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] bool[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] int8[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] bool[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] double[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] int8[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int8[pyarrow] int16[pyarrow] int16[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] float[pyarrow] int16[pyarrow] float[pyarrow] string[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] bool[pyarrow] bool[pyarrow] int16[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] bool[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] float[pyarrow] string[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow] double[pyarrow]\n", + "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "Dask Name: nestedframe, 3 expressions\n", + "Expr=MapPartitions(NestedFrame)" ] }, "metadata": {}, @@ -3862,10 +3905,10 @@ } ], "source": [ - "des_catalog = lsdb.read_hipscat(DES_HIPSCAT_DIR)\n", + "des_catalog = lsdb.read_hats(DES_HATS_DIR)\n", "\n", - "gaia_margin_cache_catalog = lsdb.read_hipscat(GAIA_MARGIN_CACHE_DIR)\n", - "gaia_catalog = lsdb.read_hipscat(GAIA_HIPSCAT_DIR, margin_cache=gaia_margin_cache_catalog)\n", + "# gaia_margin_cache_catalog = lsdb.read_hats(GAIA_MARGIN_CACHE_DIR)\n", + "gaia_catalog = lsdb.read_hats(GAIA_HATS_DIR)\n", "\n", "xmatched = des_catalog.crossmatch(\n", " gaia_catalog,\n", @@ -3873,7 +3916,7 @@ " radius_arcsec=1.0,\n", " # Single closest object, it is the default\n", " n_neighbors=1,\n", - " # Default would be to use names of the HiPSCat catalogs\n", + " # Default would be to use names of the HATS catalogs\n", " suffixes=(\"_des\", \"_gaia\"),\n", ")\n", "\n", @@ -3884,18 +3927,18 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "id": "6883784e9316b49", "metadata": {}, "outputs": [], "source": [ "# Run the pipeline with Dask client, it will take a while\n", - "xmatched.to_hipscat(OUTPUT_HIPSCAT_DIR)" + "xmatched.to_hats(XMATCH_DIR)" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "id": "2e1a3fab1c6dad5f", "metadata": {}, "outputs": [ @@ -3943,7 +3986,7 @@ " _dist_arcsec\n", " \n", " \n", - " _hipscat_index\n", + " _healpix_29\n", " \n", " \n", " \n", @@ -4029,11 +4072,11 @@ " 1.816329\n", " 0.310521\n", " ...\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", " <NA>\n", " 0\n", " 0\n", @@ -4050,14 +4093,14 @@ " 79705703\n", " 1275291259\n", " 0.234549\n", - " 1.802340\n", + " 1.80234\n", " 0.234549\n", " ...\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", " <NA>\n", " 0\n", " 0\n", @@ -4077,11 +4120,11 @@ " 1.805816\n", " 0.224895\n", " ...\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", - " NaN\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", + " <NA>\n", " <NA>\n", " 0\n", " 0\n", @@ -4095,7 +4138,7 @@ ], "text/plain": [ " COADD_OBJECT_ID_des TILENAME_des HPIX_32_des \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 1033365960 DES0000+0209 4864 \n", "5477333571859382272 1033367823 DES0000+0209 4864 \n", "5477333673311207424 1033367955 DES0000+0209 4864 \n", @@ -4103,7 +4146,7 @@ "5477334650319798272 1033369151 DES0000+0209 4864 \n", "\n", " HPIX_64_des HPIX_1024_des HPIX_4096_des \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 19459 4981605 79705693 \n", "5477333571859382272 19459 4981605 79705693 \n", "5477333673311207424 19459 4981605 79705695 \n", @@ -4111,39 +4154,39 @@ "5477334650319798272 19459 4981606 79705709 \n", "\n", " HPIX_16384_des RA_des DEC_des ALPHAWIN_J2000_des \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 1275291097 0.315738 1.807978 0.315738 \n", "5477333571859382272 1275291101 0.321042 1.812476 0.321042 \n", "5477333673311207424 1275291124 0.310521 1.816329 0.310521 \n", - "5477334253035323392 1275291259 0.234549 1.802340 0.234549 \n", + "5477334253035323392 1275291259 0.234549 1.80234 0.234549 \n", "5477334650319798272 1275291352 0.224895 1.805816 0.224895 \n", "\n", " ... ag_gspphot_lower_gaia ag_gspphot_upper_gaia \\\n", - "_hipscat_index ... \n", + "_healpix_29 ... \n", "5477333554734039040 ... 0.1502 0.1595 \n", "5477333571859382272 ... 0.1019 0.1442 \n", - "5477333673311207424 ... NaN NaN \n", - "5477334253035323392 ... NaN NaN \n", - "5477334650319798272 ... NaN NaN \n", + "5477333673311207424 ... \n", + "5477334253035323392 ... \n", + "5477334650319798272 ... \n", "\n", " ebpminrp_gspphot_gaia ebpminrp_gspphot_lower_gaia \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 0.0839 0.0812 \n", "5477333571859382272 0.0686 0.0556 \n", - "5477333673311207424 NaN NaN \n", - "5477334253035323392 NaN NaN \n", - "5477334650319798272 NaN NaN \n", + "5477333673311207424 \n", + "5477334253035323392 \n", + "5477334650319798272 \n", "\n", " ebpminrp_gspphot_upper_gaia libname_gspphot_gaia \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 0.0863 MARCS \n", "5477333571859382272 0.0787 A \n", - "5477333673311207424 NaN \n", - "5477334253035323392 NaN \n", - "5477334650319798272 NaN \n", + "5477333673311207424 \n", + "5477334253035323392 \n", + "5477334650319798272 \n", "\n", " Norder_gaia Dir_gaia Npix_gaia _dist_arcsec \n", - "_hipscat_index \n", + "_healpix_29 \n", "5477333554734039040 0 0 4 0.217639 \n", "5477333571859382272 0 0 4 0.003322 \n", "5477333673311207424 0 0 4 0.007574 \n", @@ -4153,14 +4196,14 @@ "[5 rows x 374 columns]" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Look into the data\n", - "lsdb.read_hipscat(OUTPUT_HIPSCAT_DIR).head()" + "lsdb.read_hats(XMATCH_DIR).head()" ] }, { @@ -4180,17 +4223,17 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "id": "1f82e600605a8a0b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, @@ -4240,17 +4283,27 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "id": "a20f1614ec634a49", "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/delucchi/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/dask/dataframe/core.py:3930: UserWarning: Dask currently has limited support for converting pandas extension dtypes to arrays. Converting double[pyarrow] to object dtype.\n", + " warnings.warn(\n", + "/home/delucchi/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/dask/dataframe/core.py:3930: UserWarning: Dask currently has limited support for converting pandas extension dtypes to arrays. Converting double[pyarrow] to object dtype.\n", + " warnings.warn(\n" + ] + }, { "data": { "text/plain": [ "Text(0.5, 1.0, 'Absolute magnitude — color diagram')" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, @@ -4268,8 +4321,8 @@ "source": [ "# Read the cross-matched catalog, just like we did before for Gaia and DES,\n", "# but keeping few columns only.\n", - "xmatched_from_disk = lsdb.read_hipscat(\n", - " OUTPUT_HIPSCAT_DIR,\n", + "xmatched_from_disk = lsdb.read_hats(\n", + " XMATCH_DIR,\n", " columns=[\n", " \"parallax_gaia\",\n", " \"parallax_over_error_gaia\",\n", @@ -4342,9 +4395,6 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "nbsphinx": { - "execute": "never" - }, "pygments_lexer": "ipython3", "version": "3.10.14" } diff --git a/docs/tutorials/pre_executed/ztf_bts-ngc.ipynb b/docs/tutorials/pre_executed/ztf_bts-ngc.ipynb index 5d4735a0..3c9c3dae 100644 --- a/docs/tutorials/pre_executed/ztf_bts-ngc.ipynb +++ b/docs/tutorials/pre_executed/ztf_bts-ngc.ipynb @@ -37,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "id": "cedde7185bbd9650", "metadata": { "ExecuteTime": { @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "id": "533f35ae2822a422", "metadata": { "ExecuteTime": { @@ -80,8 +80,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 865 ms, sys: 8.06 ms, total: 873 ms\n", - "Wall time: 2.93 s\n" + "CPU times: user 1.36 s, sys: 13 ms, total: 1.37 s\n", + "Wall time: 3.77 s\n" ] }, { @@ -252,7 +252,7 @@ "4 0.305 345.657208 41.091833 " ] }, - "execution_count": 3, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -281,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "f27f3c3054bb72e2", "metadata": { "ExecuteTime": { @@ -294,8 +294,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 1.29 s, sys: 6.98 ms, total: 1.29 s\n", - "Wall time: 1.31 s\n" + "CPU times: user 2.36 s, sys: 11.3 ms, total: 2.38 s\n", + "Wall time: 3.94 s\n" ] }, { @@ -435,7 +435,7 @@ "4 pB, S, R, stell N 0.100 32.783333 " ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -465,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "6b1b2ebb1c023bca", "metadata": { "ExecuteTime": { @@ -478,8 +478,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 23.2 s, sys: 16.2 ms, total: 23.3 s\n", - "Wall time: 23.4 s\n" + "CPU times: user 36.3 s, sys: 14.1 ms, total: 36.3 s\n", + "Wall time: 36.3 s\n" ] }, { @@ -788,7 +788,7 @@ "" ], "text/plain": [ - "Dask DataFrame Structure:\n", + "Dask NestedFrame Structure:\n", " ZTFID_ztf IAUID_ztf RA_ztf Dec_ztf peakt_ztf peakfilt_ztf peakmag_ztf peakabs_ztf duration_ztf rise_ztf fade_ztf type_ztf redshift_ztf b_ztf A_V_ztf ra_deg_ztf dec_deg_ztf Norder_ztf Dir_ztf Npix_ztf Name_ngc Type_ngc RAB2000_ngc DEB2000_ngc Source_ngc Const_ngc l_size_ngc size_ngc mag_ngc n_mag_ngc Desc_ngc ra_deg_ngc dec_deg_ngc Norder_ngc Dir_ngc Npix_ngc _dist_arcsec\n", "npartitions=12 \n", "0 string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] double[pyarrow] string[pyarrow] double[pyarrow] double[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] double[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] string[pyarrow] float[pyarrow] float[pyarrow] string[pyarrow] string[pyarrow] double[pyarrow] double[pyarrow] uint8[pyarrow] uint64[pyarrow] uint64[pyarrow] double[pyarrow]\n", @@ -796,10 +796,11 @@ "... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", "12682136550675316736 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", "18446744073709551615 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...\n", - "Dask Name: from-delayed, 16 graph layers" + "Dask Name: nestedframe, 14 expressions\n", + "Expr=MapPartitions(NestedFrame)" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -826,7 +827,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "40085244f8f1c8b", "metadata": { "ExecuteTime": { @@ -835,12 +836,22 @@ } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/delucchi/anaconda3/envs/hipscatenv/lib/python3.10/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use.\n", + "Perhaps you already have a cluster running?\n", + "Hosting the HTTP server on port 35493 instead\n", + " warnings.warn(\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 609 ms, sys: 140 ms, total: 748 ms\n", - "Wall time: 4.91 s\n" + "CPU times: user 876 ms, sys: 66.9 ms, total: 943 ms\n", + "Wall time: 5.83 s\n" ] }, { @@ -871,7 +882,7 @@ " Dec_ztf\n", " \n", " \n", - " _hipscat_index\n", + " _healpix_29\n", " \n", " \n", " \n", @@ -889,10 +900,18 @@ " +09:16:57.2\n", " \n", " \n", + " 7310464818845057024\n", + " SN2024jlf\n", + " 5690\n", + " 6.309787\n", + " 14:37:42.32\n", + " +02:17:04.1\n", + " \n", + " \n", " 7200132046067335168\n", " SN2020vg\n", " I 738\n", - " 8.931140\n", + " 8.93114\n", " 11:48:54.43\n", " -04:40:53.8\n", " \n", @@ -913,14 +932,6 @@ " +73:23:51.0\n", " \n", " \n", - " 5025854519720804352\n", - " AT2019udc\n", - " 718\n", - " 17.743683\n", - " 01:53:11.20\n", - " +04:11:46.9\n", - " \n", - " \n", " ...\n", " ...\n", " ...\n", @@ -932,7 +943,7 @@ " 738303264008699904\n", " AT2020tvc\n", " 221\n", - " 762.960030\n", + " 762.96003\n", " 00:41:35.40\n", " +40:50:14.6\n", " \n", @@ -956,7 +967,7 @@ " 762249159737606144\n", " AT2020aabh\n", " 206\n", - " 1081.998220\n", + " 1081.99822\n", " 00:39:30.06\n", " +40:31:00.8\n", " \n", @@ -970,31 +981,31 @@ " \n", " \n", "\n", - "

72 rows × 5 columns

\n", + "

75 rows × 5 columns

\n", "" ], "text/plain": [ " IAUID_ztf Name_ngc _dist_arcsec RA_ztf \\\n", - "_hipscat_index \n", + "_healpix_29 \n", "7828968065004994560 SN2022xxf 3705 2.985601 11:30:05.93 \n", - "7200132046067335168 SN2020vg I 738 8.931140 11:48:54.43 \n", + "7310464818845057024 SN2024jlf 5690 6.309787 14:37:42.32 \n", + "7200132046067335168 SN2020vg I 738 8.93114 11:48:54.43 \n", "3231460713012658176 SN2022pgf 5894 12.223285 15:11:41.90 \n", "2156065960006516736 SN2021do 3147 14.058304 10:16:56.52 \n", - "5025854519720804352 AT2019udc 718 17.743683 01:53:11.20 \n", "... ... ... ... ... \n", - "738303264008699904 AT2020tvc 221 762.960030 00:41:35.40 \n", + "738303264008699904 AT2020tvc 221 762.96003 00:41:35.40 \n", "7802041901716078592 SN2021hiz I 789 963.643556 12:25:41.67 \n", "3161730388984856576 SN2018hna 4362 964.142774 12:26:12.08 \n", - "762249159737606144 AT2020aabh 206 1081.998220 00:39:30.06 \n", + "762249159737606144 AT2020aabh 206 1081.99822 00:39:30.06 \n", "738559375127347200 AT2022qpg 224 1193.179125 00:44:20.78 \n", "\n", " Dec_ztf \n", - "_hipscat_index \n", + "_healpix_29 \n", "7828968065004994560 +09:16:57.2 \n", + "7310464818845057024 +02:17:04.1 \n", "7200132046067335168 -04:40:53.8 \n", "3231460713012658176 +59:49:12.2 \n", "2156065960006516736 +73:23:51.0 \n", - "5025854519720804352 +04:11:46.9 \n", "... ... \n", "738303264008699904 +40:50:14.6 \n", "7802041901716078592 +07:13:42.2 \n", @@ -1002,10 +1013,10 @@ "762249159737606144 +40:31:00.8 \n", "738559375127347200 +41:23:10.8 \n", "\n", - "[72 rows x 5 columns]" + "[75 rows x 5 columns]" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -1046,7 +1057,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "id": "ab85642e-e0fb-4879-b69d-4d20536d5e68", "metadata": {}, "outputs": [], @@ -1085,13 +1096,13 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "c9bf1773-ea55-42e5-90e9-f69c59ab7963", "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "
" ] @@ -1122,6 +1133,14 @@ " ax.set_title(oid)\n", " plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7c4cff89", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1140,7 +1159,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.14" } }, "nbformat": 4, diff --git a/docs/tutorials/remote_data.ipynb b/docs/tutorials/remote_data.ipynb index eea88abd..f5f4ddb5 100644 --- a/docs/tutorials/remote_data.ipynb +++ b/docs/tutorials/remote_data.ipynb @@ -6,7 +6,7 @@ "source": [ "# Accessing Remote Data\n", "\n", - "If you're accessing hipscat catalogs on a local file system, a typical path string like `\"/path/to/catalogs\"` will be sufficient. This tutorial will help you get started if you need to access data over HTTP/S, cloud storage, or have some additional parameters for connecting to your data.\n", + "If you're accessing HATS catalogs on a local file system, a typical path string like `\"/path/to/catalogs\"` will be sufficient. This tutorial will help you get started if you need to access data over HTTP/S, cloud storage, or have some additional parameters for connecting to your data.\n", "\n", "We use [`fsspec`](https://github.com/fsspec/filesystem_spec) and [`universal_pathlib`](https://github.com/fsspec/universal_pathlib) to create connections to remote sources for data. Please refer to their documentation for a list of supported filesystems and any filesystem-specific parameters.\n", "\n", @@ -56,7 +56,7 @@ "source": [ "import lsdb\n", "\n", - "cat = lsdb.read_hipscat(\"https://data.lsdb.io/unstable/gaia_dr3/gaia/\")\n", + "cat = lsdb.read_hats(\"https://data.lsdb.io/unstable/gaia_dr3/gaia/\")\n", "cat" ] }, @@ -102,17 +102,22 @@ "metadata": {}, "outputs": [], "source": [ - "cat = lsdb.read_hipscat(panstarrs_path / \"otmo\")\n", + "cat = lsdb.read_hats(panstarrs_path / \"otmo\")\n", "cat" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "cat = lsdb.read_hipscat(panstarrs_path / \"detection\")\n", + "cat = lsdb.read_hats(panstarrs_path / \"detection\")\n", "cat" ] } diff --git a/pyproject.toml b/pyproject.toml index 5b073ac5..25d97e37 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ # dask diagnostics is required to spin up the dashboard for profiling. "dask[complete]", "deprecated", - "hipscat>=0.3.8", + "hats>=0.4", "lsst-sphgeom", # To handle spherical sky polygons "nested-dask", "nested-pandas", @@ -79,3 +79,7 @@ line_length = 110 [tool.coverage.run] omit=["src/lsdb/_version.py"] + +[tool.mypy] +plugins = "pydantic.mypy" +disable_error_code = ["operator"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 124b2043..d405b240 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -git+https://github.com/astronomy-commons/hipscat.git@main \ No newline at end of file +git+https://github.com/astronomy-commons/hats.git@main \ No newline at end of file diff --git a/src/.pylintrc b/src/.pylintrc index deff53e4..76485c9a 100644 --- a/src/.pylintrc +++ b/src/.pylintrc @@ -280,6 +280,8 @@ ignored-parents= # Maximum number of arguments for function / method. max-args=10 +max-positional-arguments=15 + # Maximum number of attributes for a class (see R0902). max-attributes=20 diff --git a/src/lsdb/__init__.py b/src/lsdb/__init__.py index 2364508c..ea7166e9 100644 --- a/src/lsdb/__init__.py +++ b/src/lsdb/__init__.py @@ -1,4 +1,4 @@ from ._version import __version__ from .catalog import Catalog, MarginCatalog from .loaders.dataframe.from_dataframe import from_dataframe -from .loaders.hipscat.read_hipscat import read_hipscat +from .loaders.hats.read_hats import read_hats diff --git a/src/lsdb/catalog/association_catalog.py b/src/lsdb/catalog/association_catalog.py index 50d0d1fb..fed8cd4c 100644 --- a/src/lsdb/catalog/association_catalog.py +++ b/src/lsdb/catalog/association_catalog.py @@ -1,4 +1,4 @@ -import hipscat as hc +import hats as hc import nested_dask as nd from lsdb.catalog.dataset.healpix_dataset import HealpixDataset @@ -10,8 +10,8 @@ class AssociationCatalog(HealpixDataset): spatial operations. Attributes: - hc_structure: `hipscat.AssociationCatalog` object representing the structure - and metadata of the HiPSCat catalog + hc_structure: `hats.AssociationCatalog` object representing the structure + and metadata of the HATS catalog """ hc_structure: hc.catalog.AssociationCatalog diff --git a/src/lsdb/catalog/catalog.py b/src/lsdb/catalog/catalog.py index c318d340..9798f7b9 100644 --- a/src/lsdb/catalog/catalog.py +++ b/src/lsdb/catalog/catalog.py @@ -1,14 +1,13 @@ from __future__ import annotations -import dataclasses from typing import List, Tuple, Type -import hipscat as hc +import hats as hc import nested_dask as nd import nested_pandas as npd import pandas as pd -from hipscat.catalog.index.index_catalog import IndexCatalog as HCIndexCatalog -from hipscat.pixel_math.polygon_filter import SphericalCoordinates +from hats.catalog.index.index_catalog import IndexCatalog as HCIndexCatalog +from hats.pixel_math.polygon_filter import SphericalCoordinates from pandas._libs import lib from pandas._typing import AnyAll, Axis, IndexLabel from pandas.api.extensions import no_default @@ -39,8 +38,8 @@ class Catalog(HealpixDataset): spatial operations. Attributes: - hc_structure: `hipscat.Catalog` object representing the structure - and metadata of the HiPSCat catalog + hc_structure: `hats.Catalog` object representing the structure + and metadata of the HATS catalog """ hc_structure: hc.catalog.Catalog @@ -60,7 +59,7 @@ def __init__( Args: ddf: Dask DataFrame with the source data of the catalog ddf_pixel_map: Dictionary mapping HEALPix order and pixel to partition index of ddf - hc_structure: `hipscat.Catalog` object with hipscat metadata of the catalog + hc_structure: `hats.Catalog` object with hats metadata of the catalog """ super().__init__(ddf, ddf_pixel_map, hc_structure) self.margin = margin @@ -203,8 +202,7 @@ def crossmatch( ddf, ddf_map, alignment = crossmatch_catalog_data( self, other, suffixes, algorithm=algorithm, **kwargs ) - new_catalog_info = dataclasses.replace( - self.hc_structure.catalog_info, + new_catalog_info = self.hc_structure.catalog_info.copy_and_update( catalog_name=output_catalog_name, ra_column=self.hc_structure.catalog_info.ra_column + suffixes[0], dec_column=self.hc_structure.catalog_info.dec_column + suffixes[0], @@ -279,7 +277,7 @@ def index_search(self, ids, catalog_index: HCIndexCatalog, fine: bool = True) -> Args: ids: Values to search for. - catalog_index (HCIndexCatalog): A pre-computed hipscat index catalog. + catalog_index (HCIndexCatalog): A pre-computed hats index catalog. fine (bool): True if points are to be filtered, False if not. Defaults to True. Returns: @@ -420,12 +418,12 @@ def merge_asof( f"{other.hc_structure.catalog_info.catalog_name}" ) - new_catalog_info = dataclasses.replace( - self.hc_structure.catalog_info, + new_catalog_info = self.hc_structure.catalog_info.copy_and_update( catalog_name=output_catalog_name, ra_column=self.hc_structure.catalog_info.ra_column + suffixes[0], dec_column=self.hc_structure.catalog_info.dec_column + suffixes[0], ) + hc_catalog = hc.catalog.Catalog(new_catalog_info, alignment.pixel_tree, schema=get_arrow_schema(ddf)) return Catalog(ddf, ddf_map, hc_catalog) @@ -469,12 +467,12 @@ def join( if output_catalog_name is None: output_catalog_name = self.hc_structure.catalog_info.catalog_name - new_catalog_info = dataclasses.replace( - self.hc_structure.catalog_info, + new_catalog_info = self.hc_structure.catalog_info.copy_and_update( catalog_name=output_catalog_name, ra_column=self.hc_structure.catalog_info.ra_column + suffixes[0], dec_column=self.hc_structure.catalog_info.dec_column + suffixes[0], ) + hc_catalog = hc.catalog.Catalog( new_catalog_info, alignment.pixel_tree, schema=get_arrow_schema(ddf) ) @@ -492,12 +490,12 @@ def join( if output_catalog_name is None: output_catalog_name = self.hc_structure.catalog_info.catalog_name - new_catalog_info = dataclasses.replace( - self.hc_structure.catalog_info, + new_catalog_info = self.hc_structure.catalog_info.copy_and_update( catalog_name=output_catalog_name, ra_column=self.hc_structure.catalog_info.ra_column + suffixes[0], dec_column=self.hc_structure.catalog_info.dec_column + suffixes[0], ) + hc_catalog = hc.catalog.Catalog(new_catalog_info, alignment.pixel_tree, schema=get_arrow_schema(ddf)) return Catalog(ddf, ddf_map, hc_catalog) @@ -551,10 +549,8 @@ def join_nested( if output_catalog_name is None: output_catalog_name = self.hc_structure.catalog_info.catalog_name - new_catalog_info = dataclasses.replace( - self.hc_structure.catalog_info, - catalog_name=output_catalog_name, - ) + new_catalog_info = self.hc_structure.catalog_info.copy_and_update(catalog_name=output_catalog_name) + hc_catalog = hc.catalog.Catalog(new_catalog_info, alignment.pixel_tree) return Catalog(ddf, ddf_map, hc_catalog) diff --git a/src/lsdb/catalog/dataset/dataset.py b/src/lsdb/catalog/dataset/dataset.py index 70d9d91e..75530742 100644 --- a/src/lsdb/catalog/dataset/dataset.py +++ b/src/lsdb/catalog/dataset/dataset.py @@ -1,13 +1,13 @@ from typing import List -import hipscat as hc +import hats as hc import nested_dask as nd import nested_pandas as npd from dask.delayed import Delayed class Dataset: - """Base HiPSCat Dataset""" + """Base HATS Dataset""" def __init__( self, @@ -21,7 +21,7 @@ def __init__( Args: ddf: Dask DataFrame with the source data of the catalog - hc_structure: `hipscat.Catalog` object with hipscat metadata of the catalog + hc_structure: `hats.Catalog` object with hats metadata of the catalog """ self._ddf = ddf self.hc_structure = hc_structure diff --git a/src/lsdb/catalog/dataset/healpix_dataset.py b/src/lsdb/catalog/dataset/healpix_dataset.py index 552d2817..1c105a41 100644 --- a/src/lsdb/catalog/dataset/healpix_dataset.py +++ b/src/lsdb/catalog/dataset/healpix_dataset.py @@ -2,22 +2,23 @@ import warnings from pathlib import Path -from typing import Any, Callable, Dict, Iterable, List, Tuple +from typing import Any, Callable, Dict, Iterable, List, Tuple, cast import dask import dask.dataframe as dd -import hipscat as hc -import hipscat.pixel_math.healpix_shim as hp +import hats as hc +import hats.pixel_math.healpix_shim as hp import nested_dask as nd import nested_pandas as npd import numpy as np import pandas as pd from dask.delayed import Delayed, delayed -from hipscat.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset -from hipscat.inspection import plot_pixel_list -from hipscat.inspection.visualize_catalog import get_projection_method -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset +from hats.inspection import plot_pixel_list +from hats.inspection.visualize_catalog import get_projection_method +from hats.pixel_math import HealpixPixel +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN from pandas._libs import lib from pandas._typing import AnyAll, Axis, IndexLabel from pandas.api.extensions import no_default @@ -37,8 +38,8 @@ class HealpixDataset(Dataset): spatial operations. Attributes: - hc_structure: `hipscat.Dataset` object representing the structure - and metadata of the HiPSCat catalog + hc_structure: `hats.Dataset` object representing the structure + and metadata of the HATS catalog """ hc_structure: HCHealpixDataset @@ -57,7 +58,7 @@ def __init__( Args: ddf: Dask DataFrame with the source data of the catalog ddf_pixel_map: Dictionary mapping HEALPix order and pixel to partition index of ddf - hc_structure: `hipscat.Catalog` object with hipscat metadata of the catalog + hc_structure: `hats.Catalog` object with hats metadata of the catalog """ super().__init__(ddf, hc_structure) self._ddf_pixel_map = ddf_pixel_map @@ -143,7 +144,7 @@ def _perform_search( Args: metadata (hc.catalog.Catalog | hc.catalog.MarginCatalog): The metadata of - the hipscat catalog after the coarse filtering is applied. The partitions + the hats catalog after the coarse filtering is applied. The partitions it contains are only those that overlap with the spatial region. search (AbstractSearch): Instance of AbstractSearch. @@ -411,14 +412,14 @@ def plot_pixels(self, projection: str = "moll", **kwargs): """ plot_pixel_list(self.get_healpix_pixels(), projection, **kwargs) - def to_hipscat( + def to_hats( self, base_catalog_path: str | Path | UPath, catalog_name: str | None = None, overwrite: bool = False, **kwargs, ): - """Saves the catalog to disk in HiPSCat format + """Saves the catalog to disk in HATS format Args: base_catalog_path (str): Location where catalog is saved to @@ -426,7 +427,7 @@ def to_hipscat( overwrite (bool): If True existing catalog is overwritten **kwargs: Arguments to pass to the parquet write operations """ - io.to_hipscat(self, base_catalog_path, catalog_name, overwrite, **kwargs) + io.to_hats(self, base_catalog_path, catalog_name, overwrite, **kwargs) def dropna( self, @@ -491,7 +492,24 @@ def dropna( to a single layer, multi-layer operations are not supported at this time. """ - ndf = self._ddf.dropna( - axis=axis, how=how, thresh=thresh, on_nested=on_nested, subset=subset, ignore_index=ignore_index - ) + + def drop_na_part(df: npd.NestedFrame): + if df.index.name == SPATIAL_INDEX_COLUMN: + df = df.reset_index() + df = cast( + npd.NestedFrame, + df.dropna( + axis=axis, + how=how, + thresh=thresh, + on_nested=on_nested, + subset=subset, + ignore_index=ignore_index, + ), + ) + if SPATIAL_INDEX_COLUMN in df.columns: + df = df.set_index(SPATIAL_INDEX_COLUMN) + return df + + ndf = self._ddf.map_partitions(drop_na_part, meta=self._ddf._meta) return self.__class__(ndf, self._ddf_pixel_map, self.hc_structure) diff --git a/src/lsdb/catalog/margin_catalog.py b/src/lsdb/catalog/margin_catalog.py index 7c390c63..f7332a50 100644 --- a/src/lsdb/catalog/margin_catalog.py +++ b/src/lsdb/catalog/margin_catalog.py @@ -1,4 +1,4 @@ -import hipscat as hc +import hats as hc import nested_dask as nd from lsdb.catalog.dataset.healpix_dataset import HealpixDataset @@ -7,12 +7,12 @@ class MarginCatalog(HealpixDataset): - """LSDB Catalog DataFrame to contain the "margin" of another HiPSCat catalog. + """LSDB Catalog DataFrame to contain the "margin" of another HATS catalog. spatial operations. Attributes: - hc_structure: `hipscat.MarginCatalog` object representing the structure - and metadata of the HiPSCat catalog + hc_structure: `hats.MarginCatalog` object representing the structure + and metadata of the HATS catalog """ hc_structure: hc.catalog.MarginCatalog diff --git a/src/lsdb/core/crossmatch/abstract_crossmatch_algorithm.py b/src/lsdb/core/crossmatch/abstract_crossmatch_algorithm.py index 5d8a6d8e..5ae8f249 100644 --- a/src/lsdb/core/crossmatch/abstract_crossmatch_algorithm.py +++ b/src/lsdb/core/crossmatch/abstract_crossmatch_algorithm.py @@ -7,9 +7,8 @@ import numpy as np import numpy.typing as npt import pandas as pd -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.catalog.margin_cache import MarginCacheCatalogInfo -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN +from hats.catalog import TableProperties +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN if TYPE_CHECKING: from lsdb.catalog import Catalog @@ -63,9 +62,9 @@ def __init__( left_pixel: int, right_order: int, right_pixel: int, - left_catalog_info: CatalogInfo, - right_catalog_info: CatalogInfo, - right_margin_catalog_info: MarginCacheCatalogInfo | None, + left_catalog_info: TableProperties, + right_catalog_info: TableProperties, + right_margin_catalog_info: TableProperties | None, suffixes: Tuple[str, str], ): """Initializes a crossmatch algorithm @@ -77,11 +76,11 @@ def __init__( left_pixel (int): The HEALPix pixel number in NESTED ordering of the left pixel right_order (int): The HEALPix order of the right pixel right_pixel (int): The HEALPix pixel number in NESTED ordering of the right pixel - left_catalog_info (hipscat.CatalogInfo): The hipscat CatalogInfo object with the metadata of the - left catalog - right_catalog_info (hipscat.CatalogInfo): The hipscat CatalogInfo object with the metadata of the - right catalog - right_margin_catalog_info (hipscat.MarginCacheCatalogInfo): The hipscat MarginCacheCatalogInfo + left_catalog_info (hats.TableProperties): The hats TableProperties object with the + metadata of the left catalog + right_catalog_info (hats.TableProperties): The hats TableProperties object with the + metadata of the right catalog + right_margin_catalog_info (hats.TableProperties): The hats TableProperties objects with the metadata of the right **margin** catalog suffixes (Tuple[str,str]): A pair of suffixes to be appended to the end of each column name, with the first appended to the left columns and the second to the right @@ -138,10 +137,10 @@ def validate(cls, left: Catalog, right: Catalog): This must accept any additional arguments the `crossmatch` method accepts. """ # Check that we have the appropriate columns in our dataset. - if left._ddf.index.name != HIPSCAT_ID_COLUMN: - raise ValueError(f"index of left table must be {HIPSCAT_ID_COLUMN}") - if right._ddf.index.name != HIPSCAT_ID_COLUMN: - raise ValueError(f"index of right table must be {HIPSCAT_ID_COLUMN}") + if left._ddf.index.name != SPATIAL_INDEX_COLUMN: + raise ValueError(f"index of left table must be {SPATIAL_INDEX_COLUMN}") + if right._ddf.index.name != SPATIAL_INDEX_COLUMN: + raise ValueError(f"index of right table must be {SPATIAL_INDEX_COLUMN}") column_names = left._ddf.columns if left.hc_structure.catalog_info.ra_column not in column_names: raise ValueError(f"left table must have column {left.hc_structure.catalog_info.ra_column}") @@ -204,7 +203,7 @@ def _create_crossmatch_df( self._rename_columns_with_suffix(self.left, self.suffixes[0]) self._rename_columns_with_suffix(self.right, self.suffixes[1]) # concat dataframes together - self.left.index.name = HIPSCAT_ID_COLUMN + self.left.index.name = SPATIAL_INDEX_COLUMN left_join_part = self.left.iloc[left_idx].reset_index() right_join_part = self.right.iloc[right_idx].reset_index(drop=True) out = pd.concat( @@ -214,7 +213,7 @@ def _create_crossmatch_df( ], axis=1, ) - out.set_index(HIPSCAT_ID_COLUMN, inplace=True) + out.set_index(SPATIAL_INDEX_COLUMN, inplace=True) extra_cols.index = out.index self._append_extra_columns(out, extra_cols) return npd.NestedFrame(out) diff --git a/src/lsdb/core/crossmatch/kdtree_match.py b/src/lsdb/core/crossmatch/kdtree_match.py index 31dc0602..3406515f 100644 --- a/src/lsdb/core/crossmatch/kdtree_match.py +++ b/src/lsdb/core/crossmatch/kdtree_match.py @@ -6,7 +6,7 @@ import numpy.typing as npt import pandas as pd import pyarrow as pa -from hipscat.pixel_math.validators import validate_radius +from hats.pixel_math.validators import validate_radius from lsdb.core.crossmatch.abstract_crossmatch_algorithm import AbstractCrossmatchAlgorithm from lsdb.core.crossmatch.kdtree_utils import _find_crossmatch_indices, _get_chord_distance, _lon_lat_to_xyz diff --git a/src/lsdb/core/plotting/skymap.py b/src/lsdb/core/plotting/skymap.py index 4a464967..ef32d64b 100644 --- a/src/lsdb/core/plotting/skymap.py +++ b/src/lsdb/core/plotting/skymap.py @@ -2,11 +2,11 @@ from typing import Any, Callable, Dict -import hipscat.pixel_math.healpix_shim as hp +import hats.pixel_math.healpix_shim as hp import nested_pandas as npd import numpy as np from dask import delayed -from hipscat.pixel_math import HealpixPixel, hipscat_id_to_healpix +from hats.pixel_math import HealpixPixel, spatial_index_to_healpix @delayed @@ -19,12 +19,12 @@ def perform_inner_skymap( **kwargs, ) -> np.ndarray: """Splits a partition into pixels at a target order and performs a given function on the new pixels""" - hipscat_index = partition.index.to_numpy() - order_pixels = hipscat_id_to_healpix(hipscat_index, target_order=target_order) + spatial_index = partition.index.to_numpy() + order_pixels = spatial_index_to_healpix(spatial_index, target_order=target_order) def apply_func(df): - # gets the healpix pixel of the partition using the hipscat_id - p = hipscat_id_to_healpix([df.index.to_numpy()[0]], target_order=target_order)[0] + # gets the healpix pixel of the partition using the spatial index + p = spatial_index_to_healpix([df.index.to_numpy()[0]], target_order=target_order)[0] return func(df, HealpixPixel(target_order, p), **kwargs) gb = partition.groupby(order_pixels, sort=False).apply(apply_func) diff --git a/src/lsdb/core/search/abstract_search.py b/src/lsdb/core/search/abstract_search.py index 4237f517..8924a1e4 100644 --- a/src/lsdb/core/search/abstract_search.py +++ b/src/lsdb/core/search/abstract_search.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING import nested_pandas as npd -from hipscat.catalog.catalog_info import CatalogInfo +from hats.catalog import TableProperties from mocpy import MOC if TYPE_CHECKING: @@ -26,7 +26,7 @@ def __init__(self, fine: bool = True): self.fine = fine def filter_hc_catalog(self, hc_structure: HCCatalogTypeVar) -> HCCatalogTypeVar: - """Filters the hispcat catalog object to the partitions included in the search""" + """Filters the hats catalog object to the partitions included in the search""" if len(hc_structure.get_healpix_pixels()) == 0: return hc_structure max_order = hc_structure.get_max_coverage_order() @@ -40,5 +40,5 @@ def generate_search_moc(self, max_order: int) -> MOC: ) @abstractmethod - def search_points(self, frame: npd.NestedFrame, metadata: CatalogInfo) -> npd.NestedFrame: + def search_points(self, frame: npd.NestedFrame, metadata: TableProperties) -> npd.NestedFrame: """Determine the search results within a data frame""" diff --git a/src/lsdb/core/search/box_search.py b/src/lsdb/core/search/box_search.py index db594fbd..1ede1c62 100644 --- a/src/lsdb/core/search/box_search.py +++ b/src/lsdb/core/search/box_search.py @@ -4,9 +4,9 @@ import nested_pandas as npd import numpy as np -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.pixel_math.box_filter import generate_box_moc, wrap_ra_angles -from hipscat.pixel_math.validators import validate_box_search +from hats.catalog import TableProperties +from hats.pixel_math.box_filter import generate_box_moc, wrap_ra_angles +from hats.pixel_math.validators import validate_box_search from mocpy import MOC from lsdb.core.search.abstract_search import AbstractSearch @@ -34,7 +34,7 @@ def __init__( def generate_search_moc(self, max_order: int) -> MOC: return generate_box_moc(self.ra, self.dec, max_order) - def search_points(self, frame: npd.NestedFrame, metadata: CatalogInfo) -> npd.NestedFrame: + def search_points(self, frame: npd.NestedFrame, metadata: TableProperties) -> npd.NestedFrame: """Determine the search results within a data frame""" return box_filter(frame, self.ra, self.dec, metadata) @@ -43,7 +43,7 @@ def box_filter( data_frame: npd.NestedFrame, ra: Tuple[float, float] | None, dec: Tuple[float, float] | None, - metadata: CatalogInfo, + metadata: TableProperties, ) -> npd.NestedFrame: """Filters a dataframe to only include points within the specified box region. @@ -51,7 +51,7 @@ def box_filter( data_frame (npd.NestedFrame): DataFrame containing points in the sky ra (Tuple[float, float]): Right ascension range, in degrees dec (Tuple[float, float]): Declination range, in degrees - metadata (hc.catalog.Catalog): hipscat `Catalog` with catalog_info that matches `data_frame` + metadata (hc.catalog.Catalog): hats `Catalog` with catalog_info that matches `data_frame` Returns: A new DataFrame with the rows from `data_frame` filtered to only the points inside the box region. diff --git a/src/lsdb/core/search/cone_search.py b/src/lsdb/core/search/cone_search.py index d37734c8..e08e84f7 100644 --- a/src/lsdb/core/search/cone_search.py +++ b/src/lsdb/core/search/cone_search.py @@ -1,8 +1,8 @@ import nested_pandas as npd from astropy.coordinates import SkyCoord -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.pixel_math.cone_filter import generate_cone_moc -from hipscat.pixel_math.validators import validate_declination_values, validate_radius +from hats.catalog import TableProperties +from hats.pixel_math.cone_filter import generate_cone_moc +from hats.pixel_math.validators import validate_declination_values, validate_radius from mocpy import MOC from lsdb.core.search.abstract_search import AbstractSearch @@ -26,12 +26,12 @@ def __init__(self, ra: float, dec: float, radius_arcsec: float, fine: bool = Tru def generate_search_moc(self, max_order: int) -> MOC: return generate_cone_moc(self.ra, self.dec, self.radius_arcsec, max_order) - def search_points(self, frame: npd.NestedFrame, metadata: CatalogInfo) -> npd.NestedFrame: + def search_points(self, frame: npd.NestedFrame, metadata: TableProperties) -> npd.NestedFrame: """Determine the search results within a data frame""" return cone_filter(frame, self.ra, self.dec, self.radius_arcsec, metadata) -def cone_filter(data_frame: npd.NestedFrame, ra, dec, radius_arcsec, metadata: CatalogInfo): +def cone_filter(data_frame: npd.NestedFrame, ra, dec, radius_arcsec, metadata: TableProperties): """Filters a dataframe to only include points within the specified cone Args: @@ -39,7 +39,7 @@ def cone_filter(data_frame: npd.NestedFrame, ra, dec, radius_arcsec, metadata: C ra (float): Right Ascension of the center of the cone in degrees dec (float): Declination of the center of the cone in degrees radius_arcsec (float): Radius of the cone in arcseconds - metadata (hc.CatalogInfo): hipscat `CatalogInfo` with metadata that matches `data_frame` + metadata (hc.TableProperties): hats `TableProperties` with metadata that matches `data_frame` Returns: A new DataFrame with the rows from `data_frame` filtered to only the points inside the cone diff --git a/src/lsdb/core/search/index_search.py b/src/lsdb/core/search/index_search.py index cc2f0c8d..7a29016a 100644 --- a/src/lsdb/core/search/index_search.py +++ b/src/lsdb/core/search/index_search.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING import nested_pandas as npd -from hipscat.catalog.index.index_catalog import IndexCatalog +from hats.catalog.index.index_catalog import IndexCatalog from lsdb.core.search.abstract_search import AbstractSearch diff --git a/src/lsdb/core/search/pixel_search.py b/src/lsdb/core/search/pixel_search.py index 1bb6abde..b99a823c 100644 --- a/src/lsdb/core/search/pixel_search.py +++ b/src/lsdb/core/search/pixel_search.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, List, Tuple import nested_pandas as npd -from hipscat.pixel_math import HealpixPixel +from hats.pixel_math import HealpixPixel from lsdb.core.search.abstract_search import AbstractSearch diff --git a/src/lsdb/core/search/polygon_search.py b/src/lsdb/core/search/polygon_search.py index ab5befcb..5fb6d5fa 100644 --- a/src/lsdb/core/search/polygon_search.py +++ b/src/lsdb/core/search/polygon_search.py @@ -1,11 +1,11 @@ from typing import List, Tuple -import hipscat.pixel_math.healpix_shim as hp +import hats.pixel_math.healpix_shim as hp import nested_pandas as npd import numpy as np -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.pixel_math.polygon_filter import CartesianCoordinates, SphericalCoordinates, generate_polygon_moc -from hipscat.pixel_math.validators import validate_declination_values, validate_polygon +from hats.catalog import TableProperties +from hats.pixel_math.polygon_filter import CartesianCoordinates, SphericalCoordinates, generate_polygon_moc +from hats.pixel_math.validators import validate_declination_values, validate_polygon from lsst.sphgeom import ConvexPolygon, UnitVector3d from mocpy import MOC @@ -29,20 +29,20 @@ def __init__(self, vertices: List[SphericalCoordinates], fine: bool = True): def generate_search_moc(self, max_order: int) -> MOC: return generate_polygon_moc(self.vertices_xyz, max_order) - def search_points(self, frame: npd.NestedFrame, metadata: CatalogInfo) -> npd.NestedFrame: + def search_points(self, frame: npd.NestedFrame, metadata: TableProperties) -> npd.NestedFrame: """Determine the search results within a data frame""" return polygon_filter(frame, self.polygon, metadata) def polygon_filter( - data_frame: npd.NestedFrame, polygon: ConvexPolygon, metadata: CatalogInfo + data_frame: npd.NestedFrame, polygon: ConvexPolygon, metadata: TableProperties ) -> npd.NestedFrame: """Filters a dataframe to only include points within the specified polygon. Args: data_frame (npd.NestedFrame): DataFrame containing points in the sky polygon (ConvexPolygon): Convex spherical polygon of interest, used to filter points - metadata (hc.catalog.Catalog): hipscat `Catalog` with catalog_info that matches `dataframe` + metadata (hc.catalog.Catalog): hats `Catalog` with catalog_info that matches `dataframe` Returns: A new DataFrame with the rows from `dataframe` filtered to only the pixels inside the polygon. diff --git a/src/lsdb/dask/crossmatch_catalog_data.py b/src/lsdb/dask/crossmatch_catalog_data.py index cd90b070..0d8e7ada 100644 --- a/src/lsdb/dask/crossmatch_catalog_data.py +++ b/src/lsdb/dask/crossmatch_catalog_data.py @@ -5,7 +5,7 @@ import dask import nested_dask as nd -from hipscat.pixel_tree import PixelAlignment +from hats.pixel_tree import PixelAlignment from lsdb.core.crossmatch.abstract_crossmatch_algorithm import AbstractCrossmatchAlgorithm from lsdb.core.crossmatch.crossmatch_algorithms import ( @@ -17,7 +17,7 @@ align_catalogs, concat_partition_and_margin, construct_catalog_args, - filter_by_hipscat_index_to_pixel, + filter_by_spatial_index_to_pixel, generate_meta_df_for_joined_tables, get_healpix_pixels_from_alignment, ) @@ -51,7 +51,7 @@ def perform_crossmatch( the result. """ if right_pix.order > left_pix.order: - left_df = filter_by_hipscat_index_to_pixel(left_df, right_pix.order, right_pix.pixel) + left_df = filter_by_spatial_index_to_pixel(left_df, right_pix.order, right_pix.pixel) if len(left_df) == 0: return meta_df diff --git a/src/lsdb/dask/divisions.py b/src/lsdb/dask/divisions.py index b41825f3..b6f509ee 100644 --- a/src/lsdb/dask/divisions.py +++ b/src/lsdb/dask/divisions.py @@ -3,20 +3,21 @@ from typing import List, Tuple import numpy as np -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_MAX, healpix_to_hipscat_id +from hats.pixel_math import HealpixPixel +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.pixel_math.spatial_index import healpix_to_spatial_index def get_pixels_divisions(healpix_pixels: List[HealpixPixel]) -> Tuple[int, ...] | None: """Calculates the Dask Dataframe divisions for a list of HEALPix pixels. - Divisions include the minimum value of every HEALPix pixel hipscat_id - and the maximum value of the last HEALPix pixel hipscat_id. In practice - they represent the bounds of hipscat_id values for the target pixels. + Divisions include the minimum value of every HEALPix pixel spatial_index + and the maximum value of the last HEALPix pixel spatial_index. In practice + they represent the bounds of spatial_index values for the target pixels. Args: healpix_pixels (List[HealpixPixel]): The list of HEALPix pixels to - calculate the hipscat_id bounds for. + calculate the spatial_index bounds for. Returns: The Dask Dataframe divisions, as a tuple of integer. @@ -25,6 +26,7 @@ def get_pixels_divisions(healpix_pixels: List[HealpixPixel]) -> Tuple[int, ...] return None orders = [pix.order for pix in healpix_pixels] pixels = [pix.pixel for pix in healpix_pixels] - divisions = healpix_to_hipscat_id(orders, pixels) - divisions = np.append(divisions, HIPSCAT_ID_MAX) + divisions = healpix_to_spatial_index(orders, pixels) + last_pixel = healpix_pixels[get_pixel_argsort(healpix_pixels)[-1]] + divisions = np.append(divisions, healpix_to_spatial_index(last_pixel.order, last_pixel.pixel + 1)) return tuple(np.sort(divisions)) diff --git a/src/lsdb/dask/join_catalog_data.py b/src/lsdb/dask/join_catalog_data.py index b3db46fc..6ae4750e 100644 --- a/src/lsdb/dask/join_catalog_data.py +++ b/src/lsdb/dask/join_catalog_data.py @@ -8,12 +8,10 @@ import nested_dask as nd import nested_pandas as npd import pandas as pd -from hipscat.catalog.association_catalog import AssociationCatalogInfo -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.catalog.margin_cache import MarginCacheCatalogInfo -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN -from hipscat.pixel_tree import PixelAlignment +from hats.catalog import TableProperties +from hats.pixel_math import HealpixPixel +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN +from hats.pixel_tree import PixelAlignment from nested_pandas.series.packer import pack_flat from lsdb.catalog.association_catalog import AssociationCatalog @@ -22,7 +20,7 @@ align_catalogs, concat_partition_and_margin, construct_catalog_args, - filter_by_hipscat_index_to_pixel, + filter_by_spatial_index_to_pixel, generate_meta_df_for_joined_tables, generate_meta_df_for_nested_tables, get_healpix_pixels_from_alignment, @@ -63,9 +61,9 @@ def perform_join_on( left_pixel: HealpixPixel, right_pixel: HealpixPixel, right_margin_pixel: HealpixPixel, - left_catalog_info: CatalogInfo, - right_catalog_info: CatalogInfo, - right_margin_catalog_info: MarginCacheCatalogInfo, + left_catalog_info: TableProperties, + right_catalog_info: TableProperties, + right_margin_catalog_info: TableProperties, left_on: str, right_on: str, suffixes: Tuple[str, str], @@ -80,9 +78,9 @@ def perform_join_on( left_pixel (HealpixPixel): the HEALPix pixel of the left partition right_pixel (HealpixPixel): the HEALPix pixel of the right partition right_margin_pixel (HealpixPixel): the HEALPix pixel of the right margin partition - left_catalog_info (hc.CatalogInfo): the catalog info of the left catalog - right_catalog_info (hc.CatalogInfo): the catalog info of the right catalog - right_margin_catalog_info (hc.MarginCacheCatalogInfo): the catalog info of the right margin catalog + left_catalog_info (hc.TableProperties): the catalog info of the left catalog + right_catalog_info (hc.TableProperties): the catalog info of the right catalog + right_margin_catalog_info (hc.TableProperties): the catalog info of the right margin catalog left_on (str): the column to join on from the left partition right_on (str): the column to join on from the right partition suffixes (Tuple[str,str]): the suffixes to apply to each partition's column names @@ -92,7 +90,7 @@ def perform_join_on( A dataframe with the result of merging the left and right partitions on the specified columns """ if right_pixel.order > left_pixel.order: - left = filter_by_hipscat_index_to_pixel(left, right_pixel.order, right_pixel.pixel) + left = filter_by_spatial_index_to_pixel(left, right_pixel.order, right_pixel.pixel) right_joined_df = concat_partition_and_margin(right, right_margin, right_columns) @@ -100,7 +98,7 @@ def perform_join_on( merged = left.reset_index().merge( right_joined_df, left_on=left_on + suffixes[0], right_on=right_on + suffixes[1] ) - merged.set_index(HIPSCAT_ID_COLUMN, inplace=True) + merged.set_index(SPATIAL_INDEX_COLUMN, inplace=True) return merged @@ -113,9 +111,9 @@ def perform_join_nested( left_pixel: HealpixPixel, right_pixel: HealpixPixel, right_margin_pixel: HealpixPixel, - left_catalog_info: CatalogInfo, - right_catalog_info: CatalogInfo, - right_margin_catalog_info: MarginCacheCatalogInfo, + left_catalog_info: TableProperties, + right_catalog_info: TableProperties, + right_margin_catalog_info: TableProperties, left_on: str, right_on: str, right_columns: List[str], @@ -131,9 +129,9 @@ def perform_join_nested( left_pixel (HealpixPixel): the HEALPix pixel of the left partition right_pixel (HealpixPixel): the HEALPix pixel of the right partition right_margin_pixel (HealpixPixel): the HEALPix pixel of the right margin partition - left_catalog_info (hc.CatalogInfo): the catalog info of the left catalog - right_catalog_info (hc.CatalogInfo): the catalog info of the right catalog - right_margin_catalog_info (hc.MarginCacheCatalogInfo): the catalog info of the right margin catalog + left_catalog_info (hc.TableProperties): the catalog info of the left catalog + right_catalog_info (hc.TableProperties): the catalog info of the right catalog + right_margin_catalog_info (hc.TableProperties): the catalog info of the right margin catalog left_on (str): the column to join on from the left partition right_on (str): the column to join on from the right partition right_columns (List[str]): the columns to include from the right margin partition @@ -143,14 +141,14 @@ def perform_join_nested( A dataframe with the result of merging the left and right partitions on the specified columns """ if right_pixel.order > left_pixel.order: - left = filter_by_hipscat_index_to_pixel(left, right_pixel.order, right_pixel.pixel) + left = filter_by_spatial_index_to_pixel(left, right_pixel.order, right_pixel.pixel) right_joined_df = concat_partition_and_margin(right, right_margin, right_columns) right_joined_df = pack_flat(npd.NestedFrame(right_joined_df.set_index(right_on))).rename(right_name) merged = left.reset_index().merge(right_joined_df, left_on=left_on, right_index=True) - merged.set_index(HIPSCAT_ID_COLUMN, inplace=True) + merged.set_index(SPATIAL_INDEX_COLUMN, inplace=True) return merged @@ -165,10 +163,10 @@ def perform_join_through( right_pixel: HealpixPixel, right_margin_pixel: HealpixPixel, through_pixel: HealpixPixel, - left_catalog_info: CatalogInfo, - right_catalog_info: CatalogInfo, - right_margin_catalog_info: MarginCacheCatalogInfo, - assoc_catalog_info: AssociationCatalogInfo, + left_catalog_info: TableProperties, + right_catalog_info: TableProperties, + right_margin_catalog_info: TableProperties, + assoc_catalog_info: TableProperties, suffixes: Tuple[str, str], right_columns: List[str], ): @@ -183,11 +181,11 @@ def perform_join_through( right_pixel (HealpixPixel): the HEALPix pixel of the right partition right_margin_pixel (HealpixPixel): the HEALPix pixel of the right margin partition through_pixel (HealpixPixel): the HEALPix pixel of the association partition - left_catalog_info (hc.CatalogInfo): the hipscat structure of the left catalog - right_catalog_info (hc.CatalogInfo): the hipscat structure of the right catalog - right_margin_catalog_info (hc.MarginCacheCatalogInfo): the hipscat structure of the right margin + left_catalog_info (hc.TableProperties): the hats structure of the left catalog + right_catalog_info (hc.TableProperties): the hats structure of the right catalog + right_margin_catalog_info (hc.TableProperties): the hats structure of the right margin catalog - assoc_catalog_info (hc.AssociationCatalogInfo): the hipscat structure of the association catalog + assoc_catalog_info (hc.TableProperties): the hats structure of the association catalog suffixes (Tuple[str,str]): the suffixes to apply to each partition's column names right_columns (List[str]): the columns to include from the right margin partition @@ -197,7 +195,7 @@ def perform_join_through( if assoc_catalog_info.primary_column is None or assoc_catalog_info.join_column is None: raise ValueError("Invalid catalog_info") if right_pixel.order > left_pixel.order: - left = filter_by_hipscat_index_to_pixel(left, right_pixel.order, right_pixel.pixel) + left = filter_by_spatial_index_to_pixel(left, right_pixel.order, right_pixel.pixel) right_joined_df = concat_partition_and_margin(right, right_margin, right_columns) @@ -223,7 +221,7 @@ def perform_join_through( ) ) - merged.set_index(HIPSCAT_ID_COLUMN, inplace=True) + merged.set_index(SPATIAL_INDEX_COLUMN, inplace=True) merged.drop(join_columns, axis=1, inplace=True) return merged @@ -235,8 +233,8 @@ def perform_merge_asof( right: npd.NestedFrame, left_pixel: HealpixPixel, right_pixel: HealpixPixel, - left_catalog_info: CatalogInfo, - right_catalog_info: CatalogInfo, + left_catalog_info: TableProperties, + right_catalog_info: TableProperties, suffixes: Tuple[str, str], direction: str, ): @@ -247,8 +245,8 @@ def perform_merge_asof( right (npd.NestedFrame): the right partition to merge left_pixel (HealpixPixel): the HEALPix pixel of the left partition right_pixel (HealpixPixel): the HEALPix pixel of the right partition - left_catalog_info (hc.CatalogInfo): the catalog info of the left catalog - right_catalog_info (hc.CatalogInfo): the catalog info of the right catalog + left_catalog_info (hc.TableProperties): the catalog info of the left catalog + right_catalog_info (hc.TableProperties): the catalog info of the right catalog suffixes (Tuple[str,str]): the suffixes to apply to each partition's column names direction (str): The direction to perform the merge_asof @@ -257,7 +255,7 @@ def perform_merge_asof( `merge_asof` """ if right_pixel.order > left_pixel.order: - left = filter_by_hipscat_index_to_pixel(left, right_pixel.order, right_pixel.pixel) + left = filter_by_spatial_index_to_pixel(left, right_pixel.order, right_pixel.pixel) left, right = rename_columns_with_suffixes(left, right, suffixes) left.sort_index(inplace=True) diff --git a/src/lsdb/dask/merge_catalog_functions.py b/src/lsdb/dask/merge_catalog_functions.py index 2e79eb79..9f766b9a 100644 --- a/src/lsdb/dask/merge_catalog_functions.py +++ b/src/lsdb/dask/merge_catalog_functions.py @@ -2,19 +2,19 @@ from typing import TYPE_CHECKING, Callable, List, Sequence, Tuple -import hipscat.pixel_math.healpix_shim as hp +import hats.pixel_math.healpix_shim as hp import nested_dask as nd import nested_pandas as npd import numpy as np import numpy.typing as npt import pandas as pd from dask.delayed import Delayed, delayed -from hipscat.catalog import PartitionInfo -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN, healpix_to_hipscat_id -from hipscat.pixel_tree import PixelAlignment, PixelAlignmentType, align_trees -from hipscat.pixel_tree.moc_utils import copy_moc -from hipscat.pixel_tree.pixel_alignment import align_with_mocs +from hats.io import paths +from hats.pixel_math import HealpixPixel +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN, healpix_to_spatial_index +from hats.pixel_tree import PixelAlignment, PixelAlignmentType, align_trees +from hats.pixel_tree.moc_utils import copy_moc +from hats.pixel_tree.pixel_alignment import align_with_mocs from lsdb.dask.divisions import get_pixels_divisions from lsdb.types import DaskDFPixelMap @@ -39,18 +39,14 @@ def concat_partition_and_margin( if margin is None: return partition - hive_columns = [ - PartitionInfo.METADATA_ORDER_COLUMN_NAME, - PartitionInfo.METADATA_DIR_COLUMN_NAME, - PartitionInfo.METADATA_PIXEL_COLUMN_NAME, - ] + hive_columns = [paths.PARTITION_ORDER, paths.PARTITION_DIR, paths.PARTITION_PIXEL] # Remove the Norder/Dir/Npix columns (used only for partitioning the margin itself), # and rename the margin_Norder/Dir/Npix to take their place. margin_columns_no_hive = [col for col in margin.columns if col not in hive_columns] rename_columns = { - f"margin_{PartitionInfo.METADATA_ORDER_COLUMN_NAME}": PartitionInfo.METADATA_ORDER_COLUMN_NAME, - f"margin_{PartitionInfo.METADATA_DIR_COLUMN_NAME}": PartitionInfo.METADATA_DIR_COLUMN_NAME, - f"margin_{PartitionInfo.METADATA_PIXEL_COLUMN_NAME}": PartitionInfo.METADATA_PIXEL_COLUMN_NAME, + f"margin_{paths.PARTITION_ORDER}": paths.PARTITION_ORDER, + f"margin_{paths.PARTITION_DIR}": paths.PARTITION_DIR, + f"margin_{paths.PARTITION_PIXEL}": paths.PARTITION_PIXEL, } margin_renamed = margin[margin_columns_no_hive].rename(columns=rename_columns) margin_filtered = margin_renamed[right_columns] @@ -159,8 +155,8 @@ def apply_func(*partitions_and_pixels): return resulting_partitions -def filter_by_hipscat_index_to_pixel(dataframe: npd.NestedFrame, order: int, pixel: int) -> npd.NestedFrame: - """Filters a catalog dataframe to the points within a specified HEALPix pixel using the hipscat index +def filter_by_spatial_index_to_pixel(dataframe: npd.NestedFrame, order: int, pixel: int) -> npd.NestedFrame: + """Filters a catalog dataframe to the points within a specified HEALPix pixel using the spatial index Args: dataframe (npd.NestedFrame): The dataframe to filter @@ -170,8 +166,8 @@ def filter_by_hipscat_index_to_pixel(dataframe: npd.NestedFrame, order: int, pix Returns: The filtered dataframe with only the rows that are within the specified HEALPix pixel """ - lower_bound = healpix_to_hipscat_id(order, pixel) - upper_bound = healpix_to_hipscat_id(order, pixel + 1) + lower_bound = healpix_to_spatial_index(order, pixel) + upper_bound = healpix_to_spatial_index(order, pixel + 1) filtered_df = dataframe[(dataframe.index >= lower_bound) & (dataframe.index < upper_bound)] return filtered_df @@ -227,8 +223,8 @@ def generate_meta_df_for_joined_tables( catalogs: Sequence[Catalog], suffixes: Sequence[str], extra_columns: pd.DataFrame | None = None, - index_name: str = HIPSCAT_ID_COLUMN, - index_type: npt.DTypeLike = np.uint64, + index_name: str = SPATIAL_INDEX_COLUMN, + index_type: npt.DTypeLike = np.int64, ) -> npd.NestedFrame: """Generates a Dask meta DataFrame that would result from joining two catalogs @@ -265,8 +261,8 @@ def generate_meta_df_for_nested_tables( nested_column_name: str, join_column_name: str, extra_columns: pd.DataFrame | None = None, - index_name: str = HIPSCAT_ID_COLUMN, - index_type: npt.DTypeLike = np.uint64, + index_name: str = SPATIAL_INDEX_COLUMN, + index_type: npt.DTypeLike = np.int64, ) -> npd.NestedFrame: """Generates a Dask meta DataFrame that would result from joining two catalogs, adding the right as a nested frame diff --git a/src/lsdb/io/__init__.py b/src/lsdb/io/__init__.py index a6e35065..e01a486a 100644 --- a/src/lsdb/io/__init__.py +++ b/src/lsdb/io/__init__.py @@ -1 +1 @@ -from .to_hipscat import to_hipscat +from .to_hats import to_hats diff --git a/src/lsdb/io/to_hipscat.py b/src/lsdb/io/to_hats.py similarity index 63% rename from src/lsdb/io/to_hipscat.py rename to src/lsdb/io/to_hats.py index 34995c72..092150a8 100644 --- a/src/lsdb/io/to_hipscat.py +++ b/src/lsdb/io/to_hats.py @@ -1,20 +1,17 @@ from __future__ import annotations -import dataclasses from copy import copy -from importlib.metadata import version from pathlib import Path from typing import TYPE_CHECKING, Dict, Union import dask -import hipscat as hc +import hats as hc import nested_pandas as npd -from hipscat.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset -from hipscat.pixel_math import HealpixPixel +from hats.catalog import PartitionInfo +from hats.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset +from hats.pixel_math import HealpixPixel from upath import UPath -from lsdb.types import HealpixInfo - if TYPE_CHECKING: from lsdb.catalog.dataset.healpix_dataset import HealpixDataset @@ -26,7 +23,7 @@ def perform_write( base_catalog_dir: str | Path | UPath, **kwargs, ) -> int: - """Performs a write of a pandas dataframe to a single parquet file, following the hipscat structure. + """Performs a write of a pandas dataframe to a single parquet file, following the hats structure. To be used as a dask delayed method as part of a dask task graph. @@ -49,14 +46,14 @@ def perform_write( # pylint: disable=W0212 -def to_hipscat( +def to_hats( catalog: HealpixDataset, base_catalog_path: str | Path | UPath, catalog_name: Union[str, None] = None, overwrite: bool = False, **kwargs, ): - """Writes a catalog to disk, in HiPSCat format. The output catalog comprises + """Writes a catalog to disk, in HATS format. The output catalog comprises partition parquet files and respective metadata, as well as JSON files detailing partition, catalog and provenance info. @@ -81,22 +78,16 @@ def to_hipscat( # Save parquet metadata hc.io.write_parquet_metadata(base_catalog_path) # Save partition info - partition_info = _get_partition_info_dict(pixel_to_partition_size_map) - hc.io.write_partition_info(base_catalog_path, partition_info) + partition_info = PartitionInfo(list(pixel_to_partition_size_map.keys())) + partition_info.write_to_file(base_catalog_path / "partition_info.csv") # Save catalog info new_hc_structure = create_modified_catalog_structure( catalog.hc_structure, base_catalog_path, catalog_name if catalog_name else catalog.hc_structure.catalog_name, - total_rows=sum(pi[0] for pi in partition_info.values()), - ) - hc.io.write_catalog_info(catalog_base_dir=base_catalog_path, dataset_info=new_hc_structure.catalog_info) - # Save provenance info - hc.io.write_metadata.write_provenance_info( - catalog_base_dir=base_catalog_path, - dataset_info=new_hc_structure.catalog_info, - tool_args=_get_provenance_info(new_hc_structure), + total_rows=sum(pixel_to_partition_size_map.values()), ) + new_hc_structure.catalog_info.to_properties_file(base_catalog_path) def write_partitions( @@ -142,68 +133,26 @@ def write_partitions( return pixel_to_partition_size_map -def _get_partition_info_dict(ddf_points_map: Dict[HealpixPixel, int]) -> Dict[HealpixPixel, HealpixInfo]: - """Creates the partition info dictionary - - Args: - ddf_points_map (Dict[HealpixPix,int]): Dictionary mapping each HealpixPixel - to the respective number of points inside its partition - - Returns: - A partition info dictionary, where the keys are the HEALPix pixels and - the values are pairs where the first element is the number of points - inside the pixel, and the second is the list of destination pixel numbers. - """ - return {pixel: (length, [pixel.pixel]) for pixel, length in ddf_points_map.items()} - - def create_modified_catalog_structure( catalog_structure: HCHealpixDataset, catalog_base_dir: str | Path | UPath, catalog_name: str, **kwargs ) -> HCHealpixDataset: - """Creates a modified version of the HiPSCat catalog structure + """Creates a modified version of the HATS catalog structure Args: - catalog_structure (hc.catalog.Catalog): HiPSCat catalog structure + catalog_structure (hc.catalog.Catalog): HATS catalog structure catalog_base_dir (UPath): Base location for the catalog catalog_name (str): The name of the catalog to be saved **kwargs: The remaining parameters to be updated in the catalog info object Returns: - A HiPSCat structure, modified with the parameters provided. + A HATS structure, modified with the parameters provided. """ new_hc_structure = copy(catalog_structure) new_hc_structure.catalog_name = catalog_name new_hc_structure.catalog_path = catalog_base_dir new_hc_structure.catalog_base_dir = hc.io.file_io.get_upath(catalog_base_dir) new_hc_structure.on_disk = True - new_hc_structure.catalog_info = dataclasses.replace( - new_hc_structure.catalog_info, catalog_name=catalog_name, **kwargs - ) - return new_hc_structure - -def _get_provenance_info(catalog_structure: HCHealpixDataset) -> dict: - """Fill all known information in a dictionary for provenance tracking. - - Args: - catalog_structure (HCHealpixDataset): The catalog structure - - Returns: - dictionary with all argument_name -> argument_value as key -> value pairs. - """ - structure_args = { - "catalog_name": catalog_structure.catalog_name, - "output_path": catalog_structure.catalog_path, - "output_catalog_name": catalog_structure.catalog_name, - "catalog_path": catalog_structure.catalog_path, - } - args = { - **structure_args, - **dataclasses.asdict(catalog_structure.catalog_info), - } - provenance_info = { - "tool_name": "lsdb", - "version": version("lsdb"), - "runtime_args": args, - } - return provenance_info + new_hc_structure.catalog_info = new_hc_structure.catalog_info.copy_and_update(**kwargs) + new_hc_structure.catalog_info.catalog_name = catalog_name + return new_hc_structure diff --git a/src/lsdb/loaders/__init__.py b/src/lsdb/loaders/__init__.py index 7aa20684..a020bce7 100644 --- a/src/lsdb/loaders/__init__.py +++ b/src/lsdb/loaders/__init__.py @@ -1,2 +1,2 @@ from .dataframe import from_dataframe -from .hipscat import read_hipscat +from .hats import read_hats diff --git a/src/lsdb/loaders/dataframe/dataframe_catalog_loader.py b/src/lsdb/loaders/dataframe/dataframe_catalog_loader.py index e9a86590..f843de1f 100644 --- a/src/lsdb/loaders/dataframe/dataframe_catalog_loader.py +++ b/src/lsdb/loaders/dataframe/dataframe_catalog_loader.py @@ -1,28 +1,31 @@ from __future__ import annotations -import dataclasses import math import warnings from typing import Dict, List, Tuple import astropy.units as u -import hipscat as hc +import hats as hc import nested_dask as nd import nested_pandas as npd import numpy as np import pandas as pd import pyarrow as pa -from hipscat.catalog import CatalogType -from hipscat.catalog.catalog_info import CatalogInfo -from hipscat.pixel_math import HealpixPixel, generate_histogram -from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN, compute_hipscat_id, healpix_to_hipscat_id +from hats.catalog import CatalogType, TableProperties +from hats.pixel_math import HealpixPixel, generate_histogram +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.pixel_math.spatial_index import ( + SPATIAL_INDEX_COLUMN, + compute_spatial_index, + healpix_to_spatial_index, +) from mocpy import MOC from lsdb.catalog.catalog import Catalog from lsdb.io.schema import get_arrow_schema from lsdb.loaders.dataframe.from_dataframe_utils import ( _append_partition_information_to_dataframe, + _extra_property_dict, _generate_dask_dataframe, ) from lsdb.types import DaskDFPixelMap @@ -31,7 +34,7 @@ class DataframeCatalogLoader: - """Creates a HiPSCat formatted Catalog from a Pandas Dataframe""" + """Creates a HATS formatted Catalog from a Pandas Dataframe""" # pylint: disable=too-many-arguments def __init__( @@ -60,7 +63,7 @@ def __init__( threshold (int): The maximum number of data points per pixel. should_generate_moc (bool): should we generate a MOC (multi-order coverage map) of the data. can improve performance when joining/crossmatching to - other hipscatted datasets. + other hats-sharded datasets. moc_max_order (int): if generating a MOC, what to use as the max order. Defaults to 10. use_pyarrow_types (bool): If True, the data is backed by pyarrow, otherwise we keep the original data types. Defaults to True. @@ -73,7 +76,7 @@ def __init__( self.highest_order = highest_order self.drop_empty_siblings = drop_empty_siblings self.threshold = self._calculate_threshold(partition_size, threshold) - self.catalog_info = self._create_catalog_info(**kwargs) + self.catalog_info = self._create_catalog_info(total_rows=len(self.dataframe), **kwargs) self.should_generate_moc = should_generate_moc self.moc_max_order = moc_max_order self.use_pyarrow_types = use_pyarrow_types @@ -90,11 +93,11 @@ def _calculate_threshold(self, partition_size: int | None = None, threshold: int Returns: The HEALPix pixel threshold """ - df_total_memory = self.dataframe.memory_usage(deep=True).sum() - if df_total_memory > (1 << 30) or len(self.dataframe) > 1_000_000: + self.df_total_memory = self.dataframe.memory_usage(deep=True).sum() + if self.df_total_memory > (1 << 30) or len(self.dataframe) > 1_000_000: warnings.warn( "from_dataframe is not intended for large datasets. " - "Consider using hipscat-import: https://hipscat-import.readthedocs.io/", + "Consider using hats-import: https://hats-import.readthedocs.io/", RuntimeWarning, ) if threshold is not None and partition_size is not None: @@ -107,25 +110,40 @@ def _calculate_threshold(self, partition_size: int | None = None, threshold: int threshold = len(self.dataframe) // num_partitions else: # Each partition in memory will be of roughly 1Gib - partition_memory = df_total_memory / len(self.dataframe) + partition_memory = self.df_total_memory / len(self.dataframe) threshold = math.ceil((1 << 30) / partition_memory) return threshold - @staticmethod - def _create_catalog_info(**kwargs) -> CatalogInfo: + def _create_catalog_info( + self, + catalog_name: str = "from_lsdb_dataframe", + ra_column: str = "ra", + dec_column: str = "dec", + catalog_type: CatalogType = CatalogType.OBJECT, + **kwargs, + ) -> TableProperties: """Creates the catalog info object Args: + catalog_name: it is recommended to provide a new name for your catalog + ra_column: column to find right ascension coordinate + dec_column: column to find declination coordinate + catalog_type: type of table being created (e.g. OBJECT, MARGIN, INDEX) **kwargs: Arguments to pass to the creation of the catalog info Returns: The catalog info object """ - valid_catalog_types = [CatalogType.OBJECT, CatalogType.SOURCE] - catalog_info = CatalogInfo(**kwargs) - if catalog_info.catalog_type not in valid_catalog_types: - raise ValueError("Catalog must be of type OBJECT or SOURCE") - return catalog_info + if kwargs is None: + kwargs = {} + kwargs = kwargs | _extra_property_dict(self.df_total_memory) + return TableProperties( + catalog_name=catalog_name, + ra_column=ra_column, + dec_column=dec_column, + catalog_type=catalog_type, + **kwargs, + ) def load_catalog(self) -> Catalog: """Load a catalog from a Pandas Dataframe, in CSV format @@ -133,27 +151,27 @@ def load_catalog(self) -> Catalog: Returns: Catalog object with data from the source given at loader initialization """ - self._set_hipscat_index() + self._set_spatial_index() pixel_list = self._compute_pixel_list() ddf, ddf_pixel_map, total_rows = self._generate_dask_df_and_map(pixel_list) - self.catalog_info = dataclasses.replace(self.catalog_info, total_rows=total_rows) + self.catalog_info.total_rows = total_rows moc = self._generate_moc() if self.should_generate_moc else None schema = self.schema if self.schema is not None else get_arrow_schema(ddf) hc_structure = hc.catalog.Catalog(self.catalog_info, pixel_list, moc=moc, schema=schema) return Catalog(ddf, ddf_pixel_map, hc_structure) - def _set_hipscat_index(self): - """Generates the hipscat indices for each data point and assigns - the hipscat index column as the Dataframe index.""" - self.dataframe[HIPSCAT_ID_COLUMN] = compute_hipscat_id( + def _set_spatial_index(self): + """Generates the spatial indices for each data point and assigns + the spatial index column as the Dataframe index.""" + self.dataframe[SPATIAL_INDEX_COLUMN] = compute_spatial_index( ra_values=self.dataframe[self.catalog_info.ra_column].to_numpy(), dec_values=self.dataframe[self.catalog_info.dec_column].to_numpy(), ) - self.dataframe.set_index(HIPSCAT_ID_COLUMN, inplace=True) + self.dataframe.set_index(SPATIAL_INDEX_COLUMN, inplace=True) def _compute_pixel_list(self) -> List[HealpixPixel]: """Compute object histogram and generate the sorted list of - HEALPix pixels. The pixels are sorted by ascending hipscat_id. + HEALPix pixels. The pixels are sorted by ascending spatial index. Returns: List of HEALPix pixels for the final partitioning. @@ -199,8 +217,8 @@ def _generate_dask_df_and_map( # Store HEALPix pixel in map ddf_pixel_map[hp_pixel] = hp_pixel_index # Obtain Dataframe for current HEALPix pixel, using NESTED characteristics. - left_bound = healpix_to_hipscat_id(hp_pixel.order, hp_pixel.pixel) - right_bound = healpix_to_hipscat_id(hp_pixel.order, hp_pixel.pixel + 1) + left_bound = healpix_to_spatial_index(hp_pixel.order, hp_pixel.pixel) + right_bound = healpix_to_spatial_index(hp_pixel.order, hp_pixel.pixel + 1) pixel_df = self.dataframe.loc[ (self.dataframe.index >= left_bound) & (self.dataframe.index < right_bound) ] diff --git a/src/lsdb/loaders/dataframe/from_dataframe.py b/src/lsdb/loaders/dataframe/from_dataframe.py index 64898b4e..53b14939 100644 --- a/src/lsdb/loaders/dataframe/from_dataframe.py +++ b/src/lsdb/loaders/dataframe/from_dataframe.py @@ -29,7 +29,7 @@ def from_dataframe( Note that this is only suitable for small datasets (< 1million rows and < 1GB dataframe in-memory). If you need to deal with large datasets, consider - using the hipscat-import package: https://hipscat-import.readthedocs.io/ + using the hats-import package: https://hats-import.readthedocs.io/ Args: dataframe (pd.Dataframe): The catalog Pandas Dataframe. @@ -44,7 +44,7 @@ def from_dataframe( the margin cache is not generated. Defaults to 5 arcseconds. should_generate_moc (bool): should we generate a MOC (multi-order coverage map) of the data. can improve performance when joining/crossmatching to - other hipscatted datasets. + other hats-sharded datasets. moc_max_order (int): if generating a MOC, what to use as the max order. Defaults to 10. use_pyarrow_types (bool): If True, the data is backed by pyarrow, otherwise we keep the original data types. Defaults to True. @@ -74,5 +74,6 @@ def from_dataframe( margin_order, margin_threshold, use_pyarrow_types, + **kwargs, ).create_catalog() return catalog diff --git a/src/lsdb/loaders/dataframe/from_dataframe_utils.py b/src/lsdb/loaders/dataframe/from_dataframe_utils.py index 1e584cd0..a7f30a6d 100644 --- a/src/lsdb/loaders/dataframe/from_dataframe_utils.py +++ b/src/lsdb/loaders/dataframe/from_dataframe_utils.py @@ -1,3 +1,4 @@ +from datetime import datetime, timezone from typing import List, Tuple import nested_dask as nd @@ -6,10 +7,11 @@ import pandas as pd import pyarrow as pa from dask import delayed -from hipscat.catalog import PartitionInfo -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN +from hats.io import paths +from hats.pixel_math import HealpixPixel +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN +import lsdb from lsdb.dask.divisions import get_pixels_divisions @@ -45,7 +47,7 @@ def _convert_dtypes_to_pyarrow(df: pd.DataFrame) -> pd.DataFrame: shallow copy of the initial DataFrame to avoid copying the data. """ new_series = {} - df_index = df.index.astype(pd.ArrowDtype(pa.uint64())) + df_index = df.index.astype(pd.ArrowDtype(pa.int64())) for column in df.columns: pa_array = pa.array(df[column], from_pandas=True) series = pd.Series(pa_array, dtype=pd.ArrowDtype(pa_array.type), copy=False, index=df_index) @@ -66,14 +68,14 @@ def _append_partition_information_to_dataframe( The dataframe for a HEALPix, with data points and respective partition information. """ columns_to_assign = { - PartitionInfo.METADATA_ORDER_COLUMN_NAME: pixel.order, - PartitionInfo.METADATA_DIR_COLUMN_NAME: pixel.dir, - PartitionInfo.METADATA_PIXEL_COLUMN_NAME: pixel.pixel, + paths.PARTITION_ORDER: pixel.order, + paths.PARTITION_DIR: pixel.dir, + paths.PARTITION_PIXEL: pixel.pixel, } column_types = { - PartitionInfo.METADATA_ORDER_COLUMN_NAME: np.uint8, - PartitionInfo.METADATA_DIR_COLUMN_NAME: np.uint64, - PartitionInfo.METADATA_PIXEL_COLUMN_NAME: np.uint64, + paths.PARTITION_ORDER: np.uint8, + paths.PARTITION_DIR: np.uint64, + paths.PARTITION_PIXEL: np.uint64, } dataframe = dataframe.assign(**columns_to_assign).astype(column_types) return _order_partition_dataframe_columns(dataframe) @@ -91,25 +93,23 @@ def _format_margin_partition_dataframe(dataframe: npd.NestedFrame) -> npd.Nested """ dataframe = dataframe.drop(columns=["margin_pixel"]) rename_columns = { - PartitionInfo.METADATA_ORDER_COLUMN_NAME: f"margin_{PartitionInfo.METADATA_ORDER_COLUMN_NAME}", - PartitionInfo.METADATA_DIR_COLUMN_NAME: f"margin_{PartitionInfo.METADATA_DIR_COLUMN_NAME}", - PartitionInfo.METADATA_PIXEL_COLUMN_NAME: f"margin_{PartitionInfo.METADATA_PIXEL_COLUMN_NAME}", - "partition_order": PartitionInfo.METADATA_ORDER_COLUMN_NAME, - "partition_pixel": PartitionInfo.METADATA_PIXEL_COLUMN_NAME, + paths.PARTITION_ORDER: f"margin_{paths.PARTITION_ORDER}", + paths.PARTITION_DIR: f"margin_{paths.PARTITION_DIR}", + paths.PARTITION_PIXEL: f"margin_{paths.PARTITION_PIXEL}", + "partition_order": paths.PARTITION_ORDER, + "partition_pixel": paths.PARTITION_PIXEL, } dataframe.rename(columns=rename_columns, inplace=True) - dir_column = ( - np.floor_divide(dataframe[PartitionInfo.METADATA_PIXEL_COLUMN_NAME].to_numpy(), 10000) * 10000 - ) - dataframe[PartitionInfo.METADATA_DIR_COLUMN_NAME] = dir_column + dir_column = np.floor_divide(dataframe[paths.PARTITION_PIXEL].to_numpy(), 10000) * 10000 + dataframe[paths.PARTITION_DIR] = dir_column dataframe = dataframe.astype( { - PartitionInfo.METADATA_ORDER_COLUMN_NAME: np.uint8, - PartitionInfo.METADATA_DIR_COLUMN_NAME: np.uint64, - PartitionInfo.METADATA_PIXEL_COLUMN_NAME: np.uint64, + paths.PARTITION_ORDER: np.uint8, + paths.PARTITION_DIR: np.uint64, + paths.PARTITION_PIXEL: np.uint64, } ) - dataframe = dataframe.set_index(HIPSCAT_ID_COLUMN).sort_index() + dataframe = dataframe.set_index(SPATIAL_INDEX_COLUMN).sort_index() return _order_partition_dataframe_columns(dataframe) @@ -124,13 +124,27 @@ def _order_partition_dataframe_columns(dataframe: npd.NestedFrame) -> npd.Nested The partition dataframe with the columns in the correct order. """ order_of_columns = [ - f"margin_{PartitionInfo.METADATA_ORDER_COLUMN_NAME}", - f"margin_{PartitionInfo.METADATA_DIR_COLUMN_NAME}", - f"margin_{PartitionInfo.METADATA_PIXEL_COLUMN_NAME}", - PartitionInfo.METADATA_ORDER_COLUMN_NAME, - PartitionInfo.METADATA_DIR_COLUMN_NAME, - PartitionInfo.METADATA_PIXEL_COLUMN_NAME, + f"margin_{paths.PARTITION_ORDER}", + f"margin_{paths.PARTITION_DIR}", + f"margin_{paths.PARTITION_PIXEL}", + paths.PARTITION_ORDER, + paths.PARTITION_DIR, + paths.PARTITION_PIXEL, ] unordered_columns = [col for col in dataframe.columns if col not in order_of_columns] ordered_columns = [col for col in order_of_columns if col in dataframe.columns] return dataframe[unordered_columns + ordered_columns] + + +def _extra_property_dict(est_size_bytes: int): + """Create a dictionary of additional fields to store in the properties file.""" + properties = {} + properties["hats_builder"] = f"lsdb v{lsdb.__version__}" + + now = datetime.now(tz=timezone.utc) + properties["hats_creation_date"] = now.strftime("%Y-%m-%dT%H:%M%Z") + properties["hats_estsize"] = f"{int(est_size_bytes / 1024)}" + properties["hats_release_date"] = "2024-09-18" + properties["hats_version"] = "v0.1" + + return properties diff --git a/src/lsdb/loaders/dataframe/margin_catalog_generator.py b/src/lsdb/loaders/dataframe/margin_catalog_generator.py index 30a62097..36a19d49 100644 --- a/src/lsdb/loaders/dataframe/margin_catalog_generator.py +++ b/src/lsdb/loaders/dataframe/margin_catalog_generator.py @@ -2,28 +2,28 @@ from typing import Dict, List, Tuple -import hipscat as hc -import hipscat.pixel_math.healpix_shim as hp +import hats as hc +import hats.pixel_math.healpix_shim as hp import nested_dask as nd import nested_pandas as npd import numpy as np import pandas as pd -from hipscat import pixel_math -from hipscat.catalog import CatalogType -from hipscat.catalog.margin_cache import MarginCacheCatalogInfo -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats import pixel_math +from hats.catalog import CatalogType, TableProperties +from hats.pixel_math import HealpixPixel +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort from lsdb import Catalog from lsdb.catalog.margin_catalog import MarginCatalog from lsdb.loaders.dataframe.from_dataframe_utils import ( + _extra_property_dict, _format_margin_partition_dataframe, _generate_dask_dataframe, ) class MarginCatalogGenerator: - """Creates a HiPSCat formatted margin catalog""" + """Creates a HATS formatted margin catalog""" def __init__( self, @@ -31,6 +31,7 @@ def __init__( margin_order: int | None = -1, margin_threshold: float = 5.0, use_pyarrow_types: bool = True, + **kwargs, ) -> None: """Initialize a MarginCatalogGenerator @@ -39,12 +40,14 @@ def __init__( margin_order (int): The order at which to generate the margin cache margin_threshold (float): The size of the margin cache boundary, in arcseconds use_pyarrow_types (bool): If True, use pyarrow types. Defaults to True. + **kwargs: Arguments to pass to the creation of the catalog info. """ self.dataframe: npd.NestedFrame = catalog.compute().copy() self.hc_structure = catalog.hc_structure self.margin_threshold = margin_threshold self.margin_order = self._set_margin_order(margin_order) self.use_pyarrow_types = use_pyarrow_types + self.catalog_info = self._create_catalog_info(**kwargs) self.schema = catalog.hc_structure.schema def _set_margin_order(self, margin_order: int | None) -> int: @@ -79,9 +82,9 @@ def create_catalog(self) -> MarginCatalog | None: if len(pixels) == 0: return None ddf, ddf_pixel_map, total_rows = self._generate_dask_df_and_map(pixels, partitions) + self.catalog_info.total_rows = total_rows margin_pixels = list(ddf_pixel_map.keys()) - margin_catalog_info = self._create_catalog_info(total_rows) - margin_structure = hc.catalog.MarginCatalog(margin_catalog_info, margin_pixels, schema=self.schema) + margin_structure = hc.catalog.MarginCatalog(self.catalog_info, margin_pixels, schema=self.schema) return MarginCatalog(ddf, ddf_pixel_map, margin_structure) def _get_margins(self) -> Tuple[List[HealpixPixel], List[npd.NestedFrame]]: @@ -115,7 +118,7 @@ def _generate_dask_df_and_map( Tuple containing the Dask Dataframe, the mapping of margin HEALPix to the respective partitions and the total number of rows. """ - # Generate pixel map ordered by _hipscat_index + # Generate pixel map ordered by _healpix_29 pixel_order = get_pixel_argsort(pixels) ordered_pixels = np.asarray(pixels)[pixel_order] ordered_partitions = [partitions[i] for i in pixel_order] @@ -207,20 +210,29 @@ def _get_data_in_margin( ) return partition_df.iloc[margin_mask] - def _create_catalog_info(self, total_rows: int) -> MarginCacheCatalogInfo: + def _create_catalog_info(self, catalog_name: str | None = None, **kwargs) -> TableProperties: """Create the margin catalog info object Args: - total_rows (int): The number of elements in the margin catalog + catalog_name (str): name of the PRIMARY catalog being created. this margin + catalog will take on a name like `_margin`. + **kwargs: Arguments to pass to the creation of the catalog info Returns: The margin catalog info object. """ - catalog_name = self.hc_structure.catalog_info.catalog_name - return MarginCacheCatalogInfo( + if kwargs is None: + kwargs = {} + kwargs.pop("catalog_type", None) + kwargs = kwargs | _extra_property_dict(0) + if not catalog_name: + catalog_name = self.hc_structure.catalog_info.catalog_name + + return TableProperties( catalog_name=f"{catalog_name}_margin", catalog_type=CatalogType.MARGIN, - total_rows=total_rows, + total_rows=self.hc_structure.catalog_info.total_rows, primary_catalog=catalog_name, margin_threshold=self.margin_threshold, + **kwargs, ) diff --git a/src/lsdb/loaders/hats/__init__.py b/src/lsdb/loaders/hats/__init__.py new file mode 100644 index 00000000..54719dc0 --- /dev/null +++ b/src/lsdb/loaders/hats/__init__.py @@ -0,0 +1 @@ +from .read_hats import read_hats diff --git a/src/lsdb/loaders/hipscat/abstract_catalog_loader.py b/src/lsdb/loaders/hats/abstract_catalog_loader.py similarity index 72% rename from src/lsdb/loaders/hipscat/abstract_catalog_loader.py rename to src/lsdb/loaders/hats/abstract_catalog_loader.py index ed10f8f0..b8246d94 100644 --- a/src/lsdb/loaders/hipscat/abstract_catalog_loader.py +++ b/src/lsdb/loaders/hats/abstract_catalog_loader.py @@ -4,32 +4,32 @@ from pathlib import Path from typing import Generic, List, Tuple, Type -import hipscat as hc +import hats as hc import nested_dask as nd import nested_pandas as npd import numpy as np import pyarrow as pa -from hipscat.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset -from hipscat.io.file_io import file_io -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN +from hats.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset +from hats.io.file_io import file_io +from hats.pixel_math import HealpixPixel +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN from upath import UPath from lsdb.catalog.catalog import DaskDFPixelMap from lsdb.dask.divisions import get_pixels_divisions -from lsdb.loaders.hipscat.hipscat_loading_config import HipscatLoadingConfig +from lsdb.loaders.hats.hats_loading_config import HatsLoadingConfig from lsdb.types import CatalogTypeVar, HCCatalogTypeVar class AbstractCatalogLoader(Generic[CatalogTypeVar]): - """Loads a HiPSCat Dataset with the type specified by the type variable""" + """Loads a HATS Dataset with the type specified by the type variable""" - def __init__(self, path: str | Path | UPath, config: HipscatLoadingConfig) -> None: - """Initializes a HipscatCatalogLoader + def __init__(self, path: str | Path | UPath, config: HatsLoadingConfig) -> None: + """Initializes a HatsCatalogLoader Args: - path: path to the root of the HiPSCat catalog + path: path to the root of the HATS catalog config: options to configure how the catalog is loaded """ self.path = path @@ -45,9 +45,9 @@ def load_catalog(self) -> CatalogTypeVar | None: """ pass - def _load_hipscat_catalog(self, catalog_type: Type[HCCatalogTypeVar]) -> HCCatalogTypeVar: - """Load `hipscat` library catalog object with catalog metadata and partition data""" - hc_catalog = catalog_type.read_from_hipscat(self.path) + def _load_hats_catalog(self, catalog_type: Type[HCCatalogTypeVar]) -> HCCatalogTypeVar: + """Load `hats` library catalog object with catalog metadata and partition data""" + hc_catalog = catalog_type.read_hats(self.path) if hc_catalog.schema is None: raise ValueError( "The catalog schema could not be loaded from metadata." @@ -83,13 +83,16 @@ def _load_df_from_pixels( return nd.NestedFrame.from_pandas(dask_meta_schema, npartitions=1) def _create_dask_meta_schema(self, schema: pa.Schema) -> npd.NestedFrame: - """Creates the Dask meta DataFrame from the HiPSCat catalog schema.""" + """Creates the Dask meta DataFrame from the HATS catalog schema.""" dask_meta_schema = schema.empty_table().to_pandas(types_mapper=self.config.get_dtype_mapper()) if self.config.columns is not None: dask_meta_schema = dask_meta_schema[self.config.columns] - if dask_meta_schema.index.name != HIPSCAT_ID_COLUMN and HIPSCAT_ID_COLUMN in dask_meta_schema.columns: - dask_meta_schema = dask_meta_schema.set_index(HIPSCAT_ID_COLUMN) + if ( + dask_meta_schema.index.name != SPATIAL_INDEX_COLUMN + and SPATIAL_INDEX_COLUMN in dask_meta_schema.columns + ): + dask_meta_schema = dask_meta_schema.set_index(SPATIAL_INDEX_COLUMN) return npd.NestedFrame(dask_meta_schema) def _get_kwargs(self) -> dict: @@ -112,7 +115,7 @@ def read_pixel( hc.io.pixel_catalog_file(catalog.catalog_base_dir, pixel, query_url_params), columns=columns, **kwargs ) - if dataframe.index.name != HIPSCAT_ID_COLUMN and HIPSCAT_ID_COLUMN in dataframe.columns: - dataframe = dataframe.set_index(HIPSCAT_ID_COLUMN) + if dataframe.index.name != SPATIAL_INDEX_COLUMN and SPATIAL_INDEX_COLUMN in dataframe.columns: + dataframe = dataframe.set_index(SPATIAL_INDEX_COLUMN) return dataframe diff --git a/src/lsdb/loaders/hipscat/association_catalog_loader.py b/src/lsdb/loaders/hats/association_catalog_loader.py similarity index 80% rename from src/lsdb/loaders/hipscat/association_catalog_loader.py rename to src/lsdb/loaders/hats/association_catalog_loader.py index a91eac4e..0895c50d 100644 --- a/src/lsdb/loaders/hipscat/association_catalog_loader.py +++ b/src/lsdb/loaders/hats/association_catalog_loader.py @@ -1,12 +1,12 @@ -import hipscat as hc +import hats as hc import nested_dask as nd from lsdb.catalog.association_catalog import AssociationCatalog -from lsdb.loaders.hipscat.abstract_catalog_loader import AbstractCatalogLoader +from lsdb.loaders.hats.abstract_catalog_loader import AbstractCatalogLoader class AssociationCatalogLoader(AbstractCatalogLoader[AssociationCatalog]): - """Loads an HiPSCat AssociationCatalog""" + """Loads an HATS AssociationCatalog""" def load_catalog(self) -> AssociationCatalog: """Load a catalog from the configuration specified when the loader was created @@ -14,7 +14,7 @@ def load_catalog(self) -> AssociationCatalog: Returns: Catalog object with data from the source given at loader initialization """ - hc_catalog = self._load_hipscat_catalog(hc.catalog.AssociationCatalog) + hc_catalog = self._load_hats_catalog(hc.catalog.AssociationCatalog) if hc_catalog.catalog_info.contains_leaf_files: dask_df, dask_df_pixel_map = self._load_dask_df_and_map(hc_catalog) else: diff --git a/src/lsdb/loaders/hipscat/hipscat_catalog_loader.py b/src/lsdb/loaders/hats/hats_catalog_loader.py similarity index 80% rename from src/lsdb/loaders/hipscat/hipscat_catalog_loader.py rename to src/lsdb/loaders/hats/hats_catalog_loader.py index 5234fdab..b684dc90 100644 --- a/src/lsdb/loaders/hipscat/hipscat_catalog_loader.py +++ b/src/lsdb/loaders/hats/hats_catalog_loader.py @@ -1,15 +1,15 @@ from __future__ import annotations -import hipscat as hc +import hats as hc from lsdb.catalog.catalog import Catalog, MarginCatalog -from lsdb.loaders.hipscat.abstract_catalog_loader import AbstractCatalogLoader -from lsdb.loaders.hipscat.hipscat_loading_config import HipscatLoadingConfig -from lsdb.loaders.hipscat.margin_catalog_loader import MarginCatalogLoader +from lsdb.loaders.hats.abstract_catalog_loader import AbstractCatalogLoader +from lsdb.loaders.hats.hats_loading_config import HatsLoadingConfig +from lsdb.loaders.hats.margin_catalog_loader import MarginCatalogLoader -class HipscatCatalogLoader(AbstractCatalogLoader[Catalog]): - """Loads a HiPSCat formatted Catalog""" +class HatsCatalogLoader(AbstractCatalogLoader[Catalog]): + """Loads a HATS formatted Catalog""" def load_catalog(self) -> Catalog: """Load a catalog from the configuration specified when the loader was created @@ -17,8 +17,8 @@ def load_catalog(self) -> Catalog: Returns: Catalog object with data from the source given at loader initialization """ - hc_catalog = self._load_hipscat_catalog(hc.catalog.Catalog) - filtered_hc_catalog = self._filter_hipscat_catalog(hc_catalog) + hc_catalog = self._load_hats_catalog(hc.catalog.Catalog) + filtered_hc_catalog = self._filter_hats_catalog(hc_catalog) dask_df, dask_df_pixel_map = self._load_dask_df_and_map(filtered_hc_catalog) catalog = Catalog(dask_df, dask_df_pixel_map, filtered_hc_catalog) if self.config.search_filter is not None: @@ -26,7 +26,7 @@ def load_catalog(self) -> Catalog: catalog.margin = self._load_margin_catalog() return catalog - def _filter_hipscat_catalog(self, hc_catalog: hc.catalog.Catalog) -> hc.catalog.Catalog: + def _filter_hats_catalog(self, hc_catalog: hc.catalog.Catalog) -> hc.catalog.Catalog: """Filter the catalog pixels according to the spatial filter provided at loading time. Object and source catalogs are not allowed to be filtered to an empty catalog. If the resulting catalog is empty an error is issued indicating that the catalog does not have @@ -56,7 +56,7 @@ def _load_margin_catalog(self) -> MarginCatalog | None: elif self.config.margin_cache is not None: margin_catalog = MarginCatalogLoader( str(self.config.margin_cache), - HipscatLoadingConfig( + HatsLoadingConfig( search_filter=self.config.search_filter, columns=self.config.columns, margin_cache=None, diff --git a/src/lsdb/loaders/hipscat/hipscat_loader_factory.py b/src/lsdb/loaders/hats/hats_loader_factory.py similarity index 69% rename from src/lsdb/loaders/hipscat/hipscat_loader_factory.py rename to src/lsdb/loaders/hats/hats_loader_factory.py index 00771755..39a34c3a 100644 --- a/src/lsdb/loaders/hipscat/hipscat_loader_factory.py +++ b/src/lsdb/loaders/hats/hats_loader_factory.py @@ -9,21 +9,21 @@ from lsdb.catalog.catalog import Catalog from lsdb.catalog.dataset.dataset import Dataset from lsdb.catalog.margin_catalog import MarginCatalog -from lsdb.loaders.hipscat.abstract_catalog_loader import AbstractCatalogLoader, CatalogTypeVar -from lsdb.loaders.hipscat.association_catalog_loader import AssociationCatalogLoader -from lsdb.loaders.hipscat.hipscat_catalog_loader import HipscatCatalogLoader -from lsdb.loaders.hipscat.hipscat_loading_config import HipscatLoadingConfig -from lsdb.loaders.hipscat.margin_catalog_loader import MarginCatalogLoader +from lsdb.loaders.hats.abstract_catalog_loader import AbstractCatalogLoader, CatalogTypeVar +from lsdb.loaders.hats.association_catalog_loader import AssociationCatalogLoader +from lsdb.loaders.hats.hats_catalog_loader import HatsCatalogLoader +from lsdb.loaders.hats.hats_loading_config import HatsLoadingConfig +from lsdb.loaders.hats.margin_catalog_loader import MarginCatalogLoader loader_class_for_catalog_type: Dict[Type[Dataset], Type[AbstractCatalogLoader]] = { - Catalog: HipscatCatalogLoader, + Catalog: HatsCatalogLoader, AssociationCatalog: AssociationCatalogLoader, MarginCatalog: MarginCatalogLoader, } def get_loader_for_type( - catalog_type_to_use: Type[CatalogTypeVar], path: str | Path | UPath, config: HipscatLoadingConfig + catalog_type_to_use: Type[CatalogTypeVar], path: str | Path | UPath, config: HatsLoadingConfig ) -> AbstractCatalogLoader: """Constructs a CatalogLoader that loads a Dataset of the specified type @@ -31,7 +31,7 @@ def get_loader_for_type( catalog_type_to_use (Type[Dataset]): the type of catalog to be loaded. Uses the actual type as the input, not a string or enum value path (UPath): the path to load the catalog from - config (HipscatLoadingConfig): Additional configuration for loading the catalog + config (HatsLoadingConfig): Additional configuration for loading the catalog Returns: An initialized CatalogLoader object with the path and config specified diff --git a/src/lsdb/loaders/hipscat/hipscat_loading_config.py b/src/lsdb/loaders/hats/hats_loading_config.py similarity index 91% rename from src/lsdb/loaders/hipscat/hipscat_loading_config.py rename to src/lsdb/loaders/hats/hats_loading_config.py index 5b6af5ec..7121e39a 100644 --- a/src/lsdb/loaders/hipscat/hipscat_loading_config.py +++ b/src/lsdb/loaders/hats/hats_loading_config.py @@ -13,10 +13,10 @@ @dataclass -class HipscatLoadingConfig: - """Configuration for loading a HiPSCat catalog in lsdb. +class HatsLoadingConfig: + """Configuration for loading a HATS catalog in lsdb. - Contains all parameters needed for a user to specify how to correctly read a hipscat catalog. + Contains all parameters needed for a user to specify how to correctly read a hats-sharded catalog. """ search_filter: AbstractSearch | None = None @@ -61,7 +61,7 @@ def make_query_url_params(self) -> dict: if "filters" in self.kwargs: url_params["filters"] = [] for filtr in self.kwargs["filters"]: - # This is how hipscat expects the filters to add to the url + # This is how HATS expects the filters to add to the url url_params["filters"].append(f"{filtr[0]}{filtr[1]}{filtr[2]}") return url_params diff --git a/src/lsdb/loaders/hipscat/margin_catalog_loader.py b/src/lsdb/loaders/hats/margin_catalog_loader.py similarity index 78% rename from src/lsdb/loaders/hipscat/margin_catalog_loader.py rename to src/lsdb/loaders/hats/margin_catalog_loader.py index 1b58f6dc..5678ee66 100644 --- a/src/lsdb/loaders/hipscat/margin_catalog_loader.py +++ b/src/lsdb/loaders/hats/margin_catalog_loader.py @@ -1,13 +1,13 @@ from __future__ import annotations -import hipscat as hc +import hats as hc from lsdb.catalog.margin_catalog import MarginCatalog -from lsdb.loaders.hipscat.abstract_catalog_loader import AbstractCatalogLoader +from lsdb.loaders.hats.abstract_catalog_loader import AbstractCatalogLoader class MarginCatalogLoader(AbstractCatalogLoader[MarginCatalog]): - """Loads an HiPSCat MarginCatalog""" + """Loads an HATS MarginCatalog""" def load_catalog(self) -> MarginCatalog | None: """Load a catalog from the configuration specified when the loader was created @@ -15,15 +15,15 @@ def load_catalog(self) -> MarginCatalog | None: Returns: Catalog object with data from the source given at loader initialization """ - hc_catalog = self._load_hipscat_catalog(hc.catalog.MarginCatalog) - filtered_hc_catalog = self._filter_hipscat_catalog(hc_catalog) + hc_catalog = self._load_hats_catalog(hc.catalog.MarginCatalog) + filtered_hc_catalog = self._filter_hats_catalog(hc_catalog) dask_df, dask_df_pixel_map = self._load_dask_df_and_map(filtered_hc_catalog) margin = MarginCatalog(dask_df, dask_df_pixel_map, filtered_hc_catalog) if self.config.search_filter is not None: margin = margin.search(self.config.search_filter) return margin - def _filter_hipscat_catalog(self, hc_catalog: hc.catalog.MarginCatalog) -> hc.catalog.MarginCatalog: + def _filter_hats_catalog(self, hc_catalog: hc.catalog.MarginCatalog) -> hc.catalog.MarginCatalog: """Filter the catalog pixels according to the spatial filter provided at loading time. Margin catalogs, unlike object and source catalogs, are allowed to be filtered to an empty catalog. In that case, the margin catalog is considered None.""" diff --git a/src/lsdb/loaders/hipscat/read_hipscat.py b/src/lsdb/loaders/hats/read_hats.py similarity index 81% rename from src/lsdb/loaders/hipscat/read_hipscat.py rename to src/lsdb/loaders/hats/read_hats.py index 5ff9fd5d..d189b620 100644 --- a/src/lsdb/loaders/hipscat/read_hipscat.py +++ b/src/lsdb/loaders/hats/read_hats.py @@ -4,9 +4,8 @@ from pathlib import Path from typing import Dict, List, Type -import hipscat as hc -from hipscat.catalog import CatalogType -from hipscat.catalog.dataset import BaseCatalogInfo +import hats as hc +from hats.catalog import CatalogType, TableProperties from upath import UPath from lsdb.catalog.association_catalog import AssociationCatalog @@ -14,9 +13,9 @@ from lsdb.catalog.dataset.dataset import Dataset from lsdb.catalog.margin_catalog import MarginCatalog from lsdb.core.search.abstract_search import AbstractSearch -from lsdb.loaders.hipscat.abstract_catalog_loader import CatalogTypeVar -from lsdb.loaders.hipscat.hipscat_loader_factory import get_loader_for_type -from lsdb.loaders.hipscat.hipscat_loading_config import HipscatLoadingConfig +from lsdb.loaders.hats.abstract_catalog_loader import CatalogTypeVar +from lsdb.loaders.hats.hats_loader_factory import get_loader_for_type +from lsdb.loaders.hats.hats_loading_config import HatsLoadingConfig dataset_class_for_catalog_type: Dict[CatalogType, Type[Dataset]] = { CatalogType.OBJECT: Catalog, @@ -27,7 +26,7 @@ # pylint: disable=unused-argument -def read_hipscat( +def read_hats( path: str | Path | UPath, catalog_type: Type[CatalogTypeVar] | None = None, search_filter: AbstractSearch | None = None, @@ -36,15 +35,15 @@ def read_hipscat( dtype_backend: str | None = "pyarrow", **kwargs, ) -> CatalogTypeVar | None: - """Load a catalog from a HiPSCat formatted catalog. + """Load a catalog from a HATS formatted catalog. Typical usage example, where we load a catalog with a subset of columns:: - lsdb.read_hipscat(path="./my_catalog_dir", columns=["ra","dec"]) + lsdb.read_hats(path="./my_catalog_dir", columns=["ra","dec"]) Typical usage example, where we load a catalog from a cone search:: - lsdb.read_hipscat_subset( + lsdb.read_hats( path="./my_catalog_dir", catalog_type=lsdb.Catalog, columns=["ra","dec"], @@ -52,7 +51,7 @@ def read_hipscat( ) Args: - path (UPath | Path): The path that locates the root of the HiPSCat catalog + path (UPath | Path): The path that locates the root of the HATS catalog catalog_type (Type[Dataset]): Default `None`. By default, the type of the catalog is loaded from the catalog info and the corresponding object type is returned. Python's type hints cannot allow a return type specified by a loaded value, so to use the correct return @@ -71,8 +70,8 @@ def read_hipscat( """ # Creates a config object to store loading parameters from all keyword arguments. kwd_args = locals().copy() - config_args = {field.name: kwd_args[field.name] for field in dataclasses.fields(HipscatLoadingConfig)} - config = HipscatLoadingConfig(**config_args) + config_args = {field.name: kwd_args[field.name] for field in dataclasses.fields(HatsLoadingConfig)} + config = HatsLoadingConfig(**config_args) catalog_type_to_use = _get_dataset_class_from_catalog_info(path) @@ -85,8 +84,7 @@ def read_hipscat( def _get_dataset_class_from_catalog_info(base_catalog_path: str | Path | UPath) -> Type[Dataset]: base_catalog_dir = hc.io.file_io.get_upath(base_catalog_path) - catalog_info_path = hc.io.paths.get_catalog_info_pointer(base_catalog_dir) - catalog_info = BaseCatalogInfo.read_from_metadata_file(catalog_info_path) + catalog_info = TableProperties.read_from_dir(base_catalog_dir) catalog_type = catalog_info.catalog_type if catalog_type not in dataset_class_for_catalog_type: raise NotImplementedError(f"Cannot load catalog of type {catalog_type}") diff --git a/src/lsdb/loaders/hipscat/read_hipscat.pyi b/src/lsdb/loaders/hats/read_hats.pyi similarity index 82% rename from src/lsdb/loaders/hipscat/read_hipscat.pyi rename to src/lsdb/loaders/hats/read_hats.pyi index cfa39687..68cfb2b5 100644 --- a/src/lsdb/loaders/hipscat/read_hipscat.pyi +++ b/src/lsdb/loaders/hats/read_hats.pyi @@ -1,8 +1,8 @@ -"""Read Hipscat +"""Read HATS -Stub file containing typing for the read_hipscat function. +Stub file containing typing for the read_hats function. -The read_hipscat method can either be used without specifying a catalog type, by default reading +The read_hats method can either be used without specifying a catalog type, by default reading from the catalog info the correct catalog type, however type checkers can't use the value from the catalog info to infer the type. So there is also the option to specify the catalog type to ensure correct type checking. This file specifies this typing of the function for the type checker to use. @@ -21,10 +21,10 @@ from upath import UPath from lsdb.catalog.dataset.dataset import Dataset from lsdb.catalog.margin_catalog import MarginCatalog from lsdb.core.search.abstract_search import AbstractSearch -from lsdb.loaders.hipscat.abstract_catalog_loader import CatalogTypeVar +from lsdb.loaders.hats.abstract_catalog_loader import CatalogTypeVar @overload -def read_hipscat( +def read_hats( path: str | Path | UPath, search_filter: AbstractSearch | None = None, columns: List[str] | None = None, @@ -33,7 +33,7 @@ def read_hipscat( **kwargs, ) -> Dataset | None: ... @overload -def read_hipscat( +def read_hats( path: str | Path | UPath, catalog_type: Type[CatalogTypeVar], search_filter: AbstractSearch | None = None, diff --git a/src/lsdb/loaders/hipscat/__init__.py b/src/lsdb/loaders/hipscat/__init__.py deleted file mode 100644 index b4ac710a..00000000 --- a/src/lsdb/loaders/hipscat/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .read_hipscat import read_hipscat diff --git a/src/lsdb/types.py b/src/lsdb/types.py index df697b81..fe33c751 100644 --- a/src/lsdb/types.py +++ b/src/lsdb/types.py @@ -1,16 +1,10 @@ -from typing import Dict, List, Tuple, TypeVar +from typing import Dict, TypeVar -from hipscat.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset -from hipscat.pixel_math import HealpixPixel -from typing_extensions import TypeAlias +from hats.catalog.healpix_dataset.healpix_dataset import HealpixDataset as HCHealpixDataset +from hats.pixel_math import HealpixPixel from lsdb.catalog.dataset.dataset import Dataset -# Compute pixel map returns a tuple. The first element is -# the number of data points within the HEALPix pixel, the -# second element is the list of pixels it contains. -HealpixInfo: TypeAlias = Tuple[int, List[int]] - DaskDFPixelMap = Dict[HealpixPixel, int] CatalogTypeVar = TypeVar("CatalogTypeVar", bound=Dataset) diff --git a/tests/conftest.py b/tests/conftest.py index 06240c7c..410e8543 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,10 @@ from pathlib import Path -import hipscat as hc +import hats as hc import pandas as pd import pytest -from hipscat.pixel_math import hipscat_id_to_healpix -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN, healpix_to_hipscat_id +from hats.pixel_math import spatial_index_to_healpix +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN, healpix_to_spatial_index import lsdb @@ -23,7 +23,6 @@ SMALL_SKY_ORDER1_SOURCE_MARGIN_NAME = "small_sky_order1_source_margin" SMALL_SKY_TO_ORDER1_SOURCE_NAME = "small_sky_to_o1source" SMALL_SKY_TO_ORDER1_SOURCE_SOFT_NAME = "small_sky_to_o1source_soft" -SMALL_SKY_ORDER1_CSV = "small_sky_order1.csv" SMALL_SKY_NO_METADATA = "small_sky_no_metadata" XMATCH_CORRECT_FILE = "xmatch_correct.csv" XMATCH_CORRECT_005_FILE = "xmatch_correct_0_005.csv" @@ -88,7 +87,7 @@ def small_sky_source_dir(test_data_dir): @pytest.fixture def small_sky_source_catalog(small_sky_source_dir): - return lsdb.read_hipscat(small_sky_source_dir) + return lsdb.read_hats(small_sky_source_dir) @pytest.fixture @@ -107,8 +106,8 @@ def small_sky_to_order1_source_soft_dir(test_data_dir): @pytest.fixture -def small_sky_hipscat_catalog(small_sky_dir): - return hc.catalog.Catalog.read_from_hipscat(small_sky_dir) +def small_sky_hats_catalog(small_sky_dir): + return hc.catalog.Catalog.read_hats(small_sky_dir) @pytest.fixture @@ -118,72 +117,72 @@ def small_sky_order1_id_index_dir(test_data_dir): @pytest.fixture def small_sky_catalog(small_sky_dir): - return lsdb.read_hipscat(small_sky_dir, catalog_type=lsdb.catalog.Catalog) + return lsdb.read_hats(small_sky_dir, catalog_type=lsdb.catalog.Catalog) @pytest.fixture def small_sky_left_xmatch_catalog(small_sky_left_xmatch_dir): - return lsdb.read_hipscat(small_sky_left_xmatch_dir) + return lsdb.read_hats(small_sky_left_xmatch_dir) @pytest.fixture def small_sky_xmatch_catalog(small_sky_xmatch_dir): - return lsdb.read_hipscat(small_sky_xmatch_dir) + return lsdb.read_hats(small_sky_xmatch_dir) @pytest.fixture def small_sky_xmatch_margin_catalog(small_sky_xmatch_margin_dir): - return lsdb.read_hipscat(small_sky_xmatch_margin_dir) + return lsdb.read_hats(small_sky_xmatch_margin_dir) @pytest.fixture def small_sky_xmatch_with_margin(small_sky_xmatch_dir, small_sky_xmatch_margin_catalog): - return lsdb.read_hipscat(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog) + return lsdb.read_hats(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog) @pytest.fixture def small_sky_to_xmatch_catalog(small_sky_to_xmatch_dir): - return lsdb.read_hipscat(small_sky_to_xmatch_dir) + return lsdb.read_hats(small_sky_to_xmatch_dir) @pytest.fixture def small_sky_to_xmatch_soft_catalog(small_sky_to_xmatch_soft_dir): - return lsdb.read_hipscat(small_sky_to_xmatch_soft_dir) + return lsdb.read_hats(small_sky_to_xmatch_soft_dir) @pytest.fixture -def small_sky_order1_hipscat_catalog(small_sky_order1_dir): - return hc.catalog.Catalog.read_from_hipscat(small_sky_order1_dir) +def small_sky_order1_hats_catalog(small_sky_order1_dir): + return hc.catalog.Catalog.read_hats(small_sky_order1_dir) @pytest.fixture def small_sky_order1_catalog(small_sky_order1_dir): - return lsdb.read_hipscat(small_sky_order1_dir) + return lsdb.read_hats(small_sky_order1_dir) @pytest.fixture def small_sky_order1_source_with_margin(small_sky_order1_source_dir, small_sky_order1_source_margin_catalog): - return lsdb.read_hipscat(small_sky_order1_source_dir, margin_cache=small_sky_order1_source_margin_catalog) + return lsdb.read_hats(small_sky_order1_source_dir, margin_cache=small_sky_order1_source_margin_catalog) @pytest.fixture def small_sky_order1_source_margin_catalog(small_sky_order1_source_margin_dir): - return lsdb.read_hipscat(small_sky_order1_source_margin_dir) + return lsdb.read_hats(small_sky_order1_source_margin_dir) @pytest.fixture def small_sky_to_o1source_catalog(small_sky_to_order1_source_dir): - return lsdb.read_hipscat(small_sky_to_order1_source_dir) + return lsdb.read_hats(small_sky_to_order1_source_dir) @pytest.fixture def small_sky_to_o1source_soft_catalog(small_sky_to_order1_source_soft_dir): - return lsdb.read_hipscat(small_sky_to_order1_source_soft_dir) + return lsdb.read_hats(small_sky_to_order1_source_soft_dir) @pytest.fixture -def small_sky_order1_df(small_sky_order1_dir): - return pd.read_csv(small_sky_order1_dir / SMALL_SKY_ORDER1_CSV) +def small_sky_order1_df(test_data_dir): + return pd.read_csv(test_data_dir / "raw" / "small_sky" / "small_sky.csv") @pytest.fixture @@ -193,12 +192,12 @@ def small_sky_source_df(test_data_dir): @pytest.fixture def small_sky_source_margin_catalog(test_data_dir): - return lsdb.read_hipscat(test_data_dir / SMALL_SKY_SOURCE_MARGIN_NAME) + return lsdb.read_hats(test_data_dir / SMALL_SKY_SOURCE_MARGIN_NAME) @pytest.fixture def small_sky_order3_source_margin_catalog(test_data_dir): - return lsdb.read_hipscat(test_data_dir / SMALL_SKY_ORDER3_SOURCE_MARGIN_NAME) + return lsdb.read_hats(test_data_dir / SMALL_SKY_ORDER3_SOURCE_MARGIN_NAME) @pytest.fixture @@ -265,12 +264,12 @@ def cone_search_expected_dir(test_data_dir): @pytest.fixture def cone_search_expected(cone_search_expected_dir): - return pd.read_csv(cone_search_expected_dir / "catalog.csv", index_col=HIPSCAT_ID_COLUMN) + return pd.read_csv(cone_search_expected_dir / "catalog.csv", index_col=SPATIAL_INDEX_COLUMN) @pytest.fixture def cone_search_margin_expected(cone_search_expected_dir): - return pd.read_csv(cone_search_expected_dir / "margin.csv", index_col=HIPSCAT_ID_COLUMN) + return pd.read_csv(cone_search_expected_dir / "margin.csv", index_col=SPATIAL_INDEX_COLUMN) @pytest.fixture @@ -289,10 +288,10 @@ def assert_divisions_are_correct(catalog): assert None not in catalog._ddf.divisions # Check that divisions belong to the correct pixel for division, hp_pixel in zip(catalog._ddf.divisions, hp_pixels): - div_pixel = hipscat_id_to_healpix([division], target_order=hp_pixel.order) + div_pixel = spatial_index_to_healpix([division], target_order=hp_pixel.order) assert hp_pixel.pixel == div_pixel - # The last division corresponds to the HIPSCAT_ID_MAX - assert catalog._ddf.divisions[-1] >= healpix_to_hipscat_id( + # The last division corresponds to the largest healpix value + assert catalog._ddf.divisions[-1] == healpix_to_spatial_index( hp_pixels[-1].order, hp_pixels[-1].pixel + 1 ) diff --git a/tests/data/generate_data.ipynb b/tests/data/generate_data.ipynb index 6f55ccd8..712edcaf 100644 --- a/tests/data/generate_data.ipynb +++ b/tests/data/generate_data.ipynb @@ -20,14 +20,19 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:48.302610Z", + "start_time": "2024-10-03T20:47:43.684052Z" + } + }, "outputs": [], "source": [ - "import hipscat_import.pipeline as runner\n", - "from hipscat_import.catalog.arguments import ImportArguments\n", - "from hipscat_import.index.arguments import IndexArguments\n", - "from hipscat_import.margin_cache.margin_cache_arguments import MarginCacheArguments\n", - "from hipscat_import.soap import SoapArguments\n", + "import hats_import.pipeline as runner\n", + "from hats_import.catalog.arguments import ImportArguments\n", + "from hats_import.index.arguments import IndexArguments\n", + "from hats_import.margin_cache.margin_cache_arguments import MarginCacheArguments\n", + "from hats_import.soap import SoapArguments\n", "import tempfile\n", "from dask.distributed import Client\n", "\n", @@ -57,19 +62,24 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:51.037190Z", + "start_time": "2024-10-03T20:47:48.303875Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"small_sky_order1/small_sky_order1.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " output_artifact_name=\"small_sky_order1\",\n", - " constant_healpix_order=1,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/small_sky/small_sky.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " output_artifact_name=\"small_sky_order1\",\n", + " constant_healpix_order=1,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -89,18 +99,24 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:51.121973Z", + "start_time": "2024-10-03T20:47:51.038544Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"small_sky_order1/small_sky_order1.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " output_artifact_name=\"small_sky\",\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/small_sky/small_sky.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " output_artifact_name=\"small_sky\",\n", + " tmp_dir=pipeline_tmp,\n", + " highest_healpix_order=5,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -113,20 +129,25 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:51.997575Z", + "start_time": "2024-10-03T20:47:51.124508Z" + } + }, "outputs": [], "source": [ - "args = IndexArguments(\n", - " input_catalog_path=\"./small_sky_order1\",\n", - " indexing_column=\"id\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_order1_id_index\",\n", - " include_hipscat_index=False,\n", - " compute_partition_size=200_000,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = IndexArguments(\n", + " input_catalog_path=\"./small_sky_order1\",\n", + " indexing_column=\"id\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_order1_id_index\",\n", + " include_healpix_29=False,\n", + " compute_partition_size=200_000,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -151,22 +172,27 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:52.145198Z", + "start_time": "2024-10-03T20:47:51.998275Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " ra_column=\"source_ra\",\n", - " dec_column=\"source_dec\",\n", - " catalog_type=\"source\",\n", - " output_artifact_name=\"small_sky_order1_source\",\n", - " constant_healpix_order=1,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " ra_column=\"source_ra\",\n", + " dec_column=\"source_dec\",\n", + " catalog_type=\"source\",\n", + " output_artifact_name=\"small_sky_order1_source\",\n", + " constant_healpix_order=1,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -179,23 +205,28 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:52.362271Z", + "start_time": "2024-10-03T20:47:52.146230Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " ra_column=\"source_ra\",\n", - " dec_column=\"source_dec\",\n", - " catalog_type=\"source\",\n", - " output_artifact_name=\"small_sky_source\",\n", - " highest_healpix_order=2,\n", - " pixel_threshold=3000,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " ra_column=\"source_ra\",\n", + " dec_column=\"source_dec\",\n", + " catalog_type=\"source\",\n", + " output_artifact_name=\"small_sky_source\",\n", + " highest_healpix_order=2,\n", + " pixel_threshold=3000,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -208,19 +239,24 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:53.573491Z", + "start_time": "2024-10-03T20:47:52.362998Z" + } + }, "outputs": [], "source": [ - "args = MarginCacheArguments(\n", - " input_catalog_path=\"small_sky_source\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_source_margin\",\n", - " margin_threshold=180,\n", - " margin_order=8,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = MarginCacheArguments(\n", + " input_catalog_path=\"small_sky_source\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_source_margin\",\n", + " margin_threshold=180,\n", + " margin_order=8,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -233,19 +269,24 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:47:56.531771Z", + "start_time": "2024-10-03T20:47:53.574055Z" + } + }, "outputs": [], "source": [ - "args = MarginCacheArguments(\n", - " input_catalog_path=\"small_sky_order1_source\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_order1_source_margin\",\n", - " margin_threshold=7200,\n", - " margin_order=4,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = MarginCacheArguments(\n", + " input_catalog_path=\"small_sky_order1_source\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_order1_source_margin\",\n", + " margin_threshold=7200,\n", + " margin_order=4,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -260,33 +301,38 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.070056Z", + "start_time": "2024-10-03T20:47:56.532554Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " ra_column=\"source_ra\",\n", - " dec_column=\"source_dec\",\n", - " catalog_type=\"source\",\n", - " output_artifact_name=\"small_sky_order3_source\",\n", - " constant_healpix_order=3,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)\n", + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/small_sky_source/small_sky_source.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " ra_column=\"source_ra\",\n", + " dec_column=\"source_dec\",\n", + " catalog_type=\"source\",\n", + " output_artifact_name=\"small_sky_order3_source\",\n", + " constant_healpix_order=3,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)\n", "\n", - "args = MarginCacheArguments(\n", - " input_catalog_path=\"small_sky_order3_source\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_order3_source_margin\",\n", - " margin_threshold=300,\n", - " margin_order=7,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = MarginCacheArguments(\n", + " input_catalog_path=\"small_sky_order3_source\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_order3_source_margin\",\n", + " margin_threshold=300,\n", + " margin_order=7,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -301,21 +347,26 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.180200Z", + "start_time": "2024-10-03T20:48:00.072426Z" + } + }, "outputs": [], "source": [ - "args = SoapArguments(\n", - " object_catalog_dir=\"small_sky\",\n", - " object_id_column=\"id\",\n", - " source_catalog_dir=\"small_sky_order1_source\",\n", - " source_object_id_column=\"object_id\",\n", - " source_id_column=\"source_id\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_to_o1source\",\n", - " write_leaf_files=True,\n", - " overwrite=True,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = SoapArguments(\n", + " object_catalog_dir=\"small_sky\",\n", + " object_id_column=\"id\",\n", + " source_catalog_dir=\"small_sky_order1_source\",\n", + " source_object_id_column=\"object_id\",\n", + " source_id_column=\"source_id\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_to_o1source\",\n", + " write_leaf_files=True,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -328,21 +379,26 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.258359Z", + "start_time": "2024-10-03T20:48:00.180935Z" + } + }, "outputs": [], "source": [ - "args = SoapArguments(\n", - " object_catalog_dir=\"small_sky\",\n", - " object_id_column=\"id\",\n", - " source_catalog_dir=\"small_sky_order1_source\",\n", - " source_object_id_column=\"object_id\",\n", - " source_id_column=\"source_id\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_to_o1source_soft\",\n", - " write_leaf_files=False,\n", - " overwrite=True,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = SoapArguments(\n", + " object_catalog_dir=\"small_sky\",\n", + " object_id_column=\"id\",\n", + " source_catalog_dir=\"small_sky_order1_source\",\n", + " source_object_id_column=\"object_id\",\n", + " source_id_column=\"source_id\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_to_o1source_soft\",\n", + " write_leaf_files=False,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -361,19 +417,25 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.363489Z", + "start_time": "2024-10-03T20:48:00.259302Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"raw/xmatch/small_sky_xmatch.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " output_artifact_name=\"small_sky_xmatch\",\n", - " pixel_threshold=100,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/xmatch/small_sky_xmatch.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " output_artifact_name=\"small_sky_xmatch\",\n", + " pixel_threshold=100,\n", + " tmp_dir=pipeline_tmp,\n", + " highest_healpix_order=4,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -390,21 +452,26 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.440522Z", + "start_time": "2024-10-03T20:48:00.364315Z" + } + }, "outputs": [], "source": [ - "args = SoapArguments(\n", - " object_catalog_dir=\"small_sky\",\n", - " object_id_column=\"id\",\n", - " source_catalog_dir=\"small_sky_xmatch\",\n", - " source_object_id_column=\"id\",\n", - " source_id_column=\"id\",\n", - " output_path=\".\",\n", - " write_leaf_files=True,\n", - " output_artifact_name=\"small_sky_to_xmatch\",\n", - " overwrite=True,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = SoapArguments(\n", + " object_catalog_dir=\"small_sky\",\n", + " object_id_column=\"id\",\n", + " source_catalog_dir=\"small_sky_xmatch\",\n", + " source_object_id_column=\"id\",\n", + " source_id_column=\"id\",\n", + " output_path=\".\",\n", + " write_leaf_files=True,\n", + " output_artifact_name=\"small_sky_to_xmatch\",\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -419,21 +486,26 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.507660Z", + "start_time": "2024-10-03T20:48:00.441393Z" + } + }, "outputs": [], "source": [ - "args = SoapArguments(\n", - " object_catalog_dir=\"small_sky\",\n", - " object_id_column=\"id\",\n", - " source_catalog_dir=\"small_sky_xmatch\",\n", - " source_object_id_column=\"id\",\n", - " source_id_column=\"id\",\n", - " output_path=\".\",\n", - " write_leaf_files=False,\n", - " output_artifact_name=\"small_sky_to_xmatch_soft\",\n", - " overwrite=True,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = SoapArguments(\n", + " object_catalog_dir=\"small_sky\",\n", + " object_id_column=\"id\",\n", + " source_catalog_dir=\"small_sky_xmatch\",\n", + " source_object_id_column=\"id\",\n", + " source_id_column=\"id\",\n", + " output_path=\".\",\n", + " write_leaf_files=False,\n", + " output_artifact_name=\"small_sky_to_xmatch_soft\",\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -448,19 +520,24 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.694676Z", + "start_time": "2024-10-03T20:48:00.508540Z" + } + }, "outputs": [], "source": [ - "args = MarginCacheArguments(\n", - " input_catalog_path=\"small_sky_xmatch\",\n", - " output_path=\".\",\n", - " output_artifact_name=\"small_sky_xmatch_margin\",\n", - " margin_threshold=7200,\n", - " margin_order=4,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = MarginCacheArguments(\n", + " input_catalog_path=\"small_sky_xmatch\",\n", + " output_path=\".\",\n", + " output_artifact_name=\"small_sky_xmatch_margin\",\n", + " margin_threshold=7200,\n", + " margin_order=4,\n", + " tmp_dir=pipeline_tmp,\n", + " )\n", + " runner.pipeline_with_client(args, client)" ] }, { @@ -475,30 +552,182 @@ { "cell_type": "code", "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.878810Z", + "start_time": "2024-10-03T20:48:00.696977Z" + } + }, + "outputs": [], + "source": [ + "with tempfile.TemporaryDirectory() as pipeline_tmp:\n", + " args = ImportArguments(\n", + " input_file_list=[\"raw/xmatch/small_sky_left_xmatch.csv\"],\n", + " output_path=\".\",\n", + " file_reader=\"csv\",\n", + " output_artifact_name=\"small_sky_left_xmatch\",\n", + " pixel_threshold=100,\n", + " tmp_dir=pipeline_tmp,\n", + " highest_healpix_order=5,\n", + " )\n", + " runner.pipeline_with_client(args, client)" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "# Generate Expected Results Files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.881472Z", + "start_time": "2024-10-03T20:48:00.879573Z" + } + }, "outputs": [], "source": [ - "args = ImportArguments(\n", - " input_file_list=[\"raw/xmatch/small_sky_left_xmatch.csv\"],\n", - " output_path=\".\",\n", - " file_reader=\"csv\",\n", - " output_artifact_name=\"small_sky_left_xmatch\",\n", - " pixel_threshold=100,\n", - " overwrite=True,\n", - " tmp_dir=tmp_dir,\n", - ")\n", - "runner.pipeline_with_client(args, client)" + "import hats\n", + "import pandas as pd\n", + "from astropy.coordinates import SkyCoord\n", + "import astropy.units as u" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Small Sky Source Cone Search" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.888314Z", + "start_time": "2024-10-03T20:48:00.882342Z" + } + }, + "outputs": [], + "source": [ + "ss_source = hats.read_hats(\"small_sky_order1_source\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.891302Z", + "start_time": "2024-10-03T20:48:00.889229Z" + } + }, + "outputs": [], + "source": [ + "ra = -35\n", + "dec = -55\n", + "radius_degrees = 2" ] }, { "cell_type": "code", "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.915271Z", + "start_time": "2024-10-03T20:48:00.892006Z" + } + }, + "outputs": [], + "source": [ + "paths = [hats.io.pixel_catalog_file(ss_source.catalog_base_dir, p) for p in ss_source.get_healpix_pixels()]\n", + "ss_source_df = pd.concat([pd.read_parquet(p) for p in paths])\n", + "coords = SkyCoord(\n", + " ss_source_df[\"source_ra\"].to_numpy() * u.deg, ss_source_df[\"source_dec\"].to_numpy() * u.deg, frame=\"icrs\"\n", + ")\n", + "center_coord = SkyCoord(ra * u.deg, dec * u.deg, frame=\"icrs\")\n", + "cone_search_output = ss_source_df.iloc[coords.separation(center_coord).deg < radius_degrees]\n", + "cone_search_output.to_csv(\"raw/cone_search_expected/catalog.csv\")" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "### Small Sky Source Margin Cone Search" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.921743Z", + "start_time": "2024-10-03T20:48:00.916331Z" + } + }, + "outputs": [], + "source": [ + "ss_source_margin = hats.read_hats(\"small_sky_order1_source_margin\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:00.938571Z", + "start_time": "2024-10-03T20:48:00.922642Z" + } + }, + "outputs": [], + "source": [ + "paths = [\n", + " hats.io.pixel_catalog_file(ss_source_margin.catalog_base_dir, p)\n", + " for p in ss_source_margin.get_healpix_pixels()\n", + "]\n", + "ss_source_margin_df = pd.concat([pd.read_parquet(p) for p in paths])\n", + "coords = SkyCoord(\n", + " ss_source_margin_df[\"source_ra\"].to_numpy() * u.deg,\n", + " ss_source_margin_df[\"source_dec\"].to_numpy() * u.deg,\n", + " frame=\"icrs\",\n", + ")\n", + "center_coord = SkyCoord(ra * u.deg, dec * u.deg, frame=\"icrs\")\n", + "cone_search_output = ss_source_margin_df.iloc[coords.separation(center_coord).deg < radius_degrees]\n", + "cone_search_output.to_csv(\"raw/cone_search_expected/margin.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:01.524993Z", + "start_time": "2024-10-03T20:48:00.940037Z" + } + }, "outputs": [], "source": [ "tmp_path.cleanup()\n", "client.close()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2024-10-03T20:48:01.528211Z", + "start_time": "2024-10-03T20:48:01.526125Z" + } + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -517,7 +746,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.9.12" } }, "nbformat": 4, diff --git a/tests/data/raw/cone_search_expected/catalog.csv b/tests/data/raw/cone_search_expected/catalog.csv index 4b9e91e6..aa47cc6a 100644 --- a/tests/data/raw/cone_search_expected/catalog.csv +++ b/tests/data/raw/cone_search_expected/catalog.csv @@ -1,153 +1,153 @@ -_hipscat_index,source_id,source_ra,source_dec,mjd,mag,band,object_id,object_ra,object_dec,Norder,Dir,Npix -12924379856753393664,74393,325.7612847064375,-53.47216729436138,58672.67873350513,19.09735842991942,i,758,325.5,-53.5,1,0,44 -12924380375668490240,73177,325.76964233775635,-53.41545382621511,58584.12253095591,17.348350142263595,i,758,325.5,-53.5,1,0,44 -12924380910060568576,82866,325.74406904926553,-53.3930566419519,59264.309530415616,18.55425003020008,g,758,325.5,-53.5,1,0,44 -12924380944047013888,85495,325.7351847305723,-53.38781504603176,59448.62111878577,20.81422266217071,z,758,325.5,-53.5,1,0,44 -12924399810546499584,75452,325.58491781018284,-53.499286122945925,58745.4737162212,18.08701433645721,u,758,325.5,-53.5,1,0,44 -12924399859473055744,79771,325.59429412221266,-53.49516018904445,59044.92588469439,20.08019426434949,g,758,325.5,-53.5,1,0,44 -12924399995947319296,81215,325.6389729830111,-53.48053692345315,59144.54944024879,15.225820061507676,g,758,325.5,-53.5,1,0,44 -12924400081544675328,72093,325.6170994427331,-53.474757349722566,58505.90839148664,20.71969170499344,z,758,325.5,-53.5,1,0,44 -12924400443093680128,70106,325.54978159951366,-53.46663206563081,58370.76012417132,15.64596815275773,g,758,325.5,-53.5,1,0,44 -12924400603831992320,70153,325.5972754207557,-53.44260598018785,58374.29236678393,17.439995016888133,i,758,325.5,-53.5,1,0,44 -12924401847866753024,80904,325.5379346143558,-53.47170302714972,59123.21163015216,18.623335457868464,z,758,325.5,-53.5,1,0,44 -12924402414995374080,83852,325.50613370041657,-53.44209761943318,59331.35730159552,15.520634989121303,r,758,325.5,-53.5,1,0,44 -12924402419923681280,78029,325.501961786786,-53.440676219975,58923.71341620144,15.076647551429534,z,758,325.5,-53.5,1,0,44 -12924402765240729600,75466,325.5294984618788,-53.40370190374638,58746.41845959629,18.347612120542813,u,758,325.5,-53.5,1,0,44 -12924402826007805952,86209,325.5085223827457,-53.405739311476886,59497.528748281446,18.49637558743748,y,758,325.5,-53.5,1,0,44 -12924403069810114560,70738,325.6576846483176,-53.44610814461365,58416.93241444813,15.03876487001622,z,758,325.5,-53.5,1,0,44 -12924403414896476160,82934,325.649846743077,-53.42001222150392,59269.00088071255,15.243998318642,i,758,325.5,-53.5,1,0,44 -12924403570203164672,70820,325.6208911587941,-53.43515348686121,58421.58173823744,17.168262806972372,i,758,325.5,-53.5,1,0,44 -12924403815314096128,83494,325.6231424662905,-53.41440559961841,59306.85221916856,18.74760783656708,r,758,325.5,-53.5,1,0,44 -12924404234534780928,87145,325.6711262028145,-53.40022849374365,59561.26939081595,16.163282119132703,r,758,325.5,-53.5,1,0,44 -12924404245855207424,76297,325.67012526238057,-53.394537264053405,58801.06444716565,18.486449950607877,i,758,325.5,-53.5,1,0,44 -12924405024372555776,72755,325.6627005823713,-53.358704661651146,58554.57781637238,18.83839628124948,u,758,325.5,-53.5,1,0,44 -12924405721793036288,84403,325.54632314697943,-53.39094318834111,59371.84310890227,20.4279381265997,i,758,325.5,-53.5,1,0,44 -12924406276204527616,85078,325.6116382341916,-53.37273549135322,59418.12809069652,18.659657014552582,z,758,325.5,-53.5,1,0,44 -12924406369804615680,72825,325.6301212952571,-53.34789704028818,58559.91088842041,17.63371463969415,u,758,325.5,-53.5,1,0,44 -12924417676788367360,73410,326.0656749649625,-53.476708155233474,58601.55751035136,17.18644121959771,u,758,325.5,-53.5,1,0,44 -12924417773316079616,82744,326.0773519434002,-53.46049173301488,59256.77389735356,16.299085024309168,u,758,325.5,-53.5,1,0,44 -12924417811433914368,78293,326.0340454386088,-53.48666065686281,58942.6113525598,18.630058904227283,y,758,325.5,-53.5,1,0,44 -12924418257414258688,83688,326.027810388888,-53.44514007408695,59319.04053271364,19.23325633861809,z,758,325.5,-53.5,1,0,44 -12924419120211951616,77221,325.90548385883284,-53.46384581580615,58865.94468987716,15.08561008963453,r,758,325.5,-53.5,1,0,44 -12924420270583709696,75200,325.9751586222098,-53.42137000915289,58728.013731322935,18.02505027447662,y,758,325.5,-53.5,1,0,44 -12924420522820763648,80864,325.96886668822066,-53.38695349404869,59120.59428240979,17.93172574231246,r,758,325.5,-53.5,1,0,44 -12924421185524989952,76154,326.0855465093048,-53.42404236063275,58792.0528821335,19.35772962792332,u,758,325.5,-53.5,1,0,44 -12924421319117766656,81944,326.0637850907387,-53.41588933630612,59199.97463482008,19.07543041818625,y,758,325.5,-53.5,1,0,44 -12924421380383965184,70733,326.09754814940374,-53.41733628824939,58416.76510278134,20.9684463784397,u,758,325.5,-53.5,1,0,44 -12924422875590426624,72667,326.01550565998565,-53.410614472283285,58548.03942102606,20.18414121892804,u,758,325.5,-53.5,1,0,44 -12924424097215021056,70472,326.07069082698985,-53.337745136693776,58397.94341496712,19.8366158306472,u,758,325.5,-53.5,1,0,44 -12924424525528956928,81938,326.0264790077982,-53.33961989236353,59199.35813814182,19.3714250032334,r,758,325.5,-53.5,1,0,44 -12924425559802380288,78305,325.854365024426,-53.43216071995659,58943.28316426004,17.115025922458983,z,758,325.5,-53.5,1,0,44 -12924425663502352384,79736,325.81209516929067,-53.42932385003106,59042.28176742738,18.86975218808749,i,758,325.5,-53.5,1,0,44 -12924425713297129472,82285,325.83998217473726,-53.415455551412784,59223.67225858066,19.70996012152604,z,758,325.5,-53.5,1,0,44 -12924426654981292032,76891,325.89422553473474,-53.38666584769471,58843.75999321824,19.937788280041293,i,758,325.5,-53.5,1,0,44 -12924426794035052544,72485,325.8834202424334,-53.37445191623237,58534.39771275177,16.37746117331356,r,758,325.5,-53.5,1,0,44 -12924427308126699520,71722,325.7828179293452,-53.40652053998704,58481.93486622177,17.50636730465716,u,758,325.5,-53.5,1,0,44 -12924427565438861312,83433,325.813779239575,-53.38113275621632,59303.020252109,20.840823137152228,g,758,325.5,-53.5,1,0,44 -12924428276897677312,85137,325.8355156490824,-53.36813946145619,59422.53471898148,17.576938279587523,i,758,325.5,-53.5,1,0,44 -12924429428045381632,72988,325.9749994305709,-53.35556505312154,58570.43993439432,17.101430741597298,z,758,325.5,-53.5,1,0,44 -12924429534832361472,74710,325.9429065289537,-53.34614709786219,58693.74548174684,15.779086628365114,i,758,325.5,-53.5,1,0,44 -12924430985595977728,76428,325.9740318207902,-53.30213967688099,58810.18886321588,18.19924875806168,i,758,325.5,-53.5,1,0,44 -12924431178529767424,70895,325.9449775702452,-53.27921221929533,58426.61793872539,19.399081122415996,g,758,325.5,-53.5,1,0,44 -12924431301775196160,72658,325.9795048612243,-53.270016705957104,58547.44037508546,18.21377866522714,r,758,325.5,-53.5,1,0,44 -12924431529202941952,72589,325.9800350095617,-53.23736261071722,58542.29258376296,20.891547292692223,i,758,325.5,-53.5,1,0,44 -12924432280859967488,75608,325.83257541781853,-53.27659808642977,58756.67784351645,18.089455907939705,z,758,325.5,-53.5,1,0,44 -12924432411227324416,77258,325.877064433464,-53.26690445677436,58868.117353033,15.492928190811485,i,758,325.5,-53.5,1,0,44 -12924436929511948288,86395,326.08194679803546,-53.26096557150122,59510.90179533646,18.503466721953988,r,758,325.5,-53.5,1,0,44 -12924437026614280192,76374,326.0950581091129,-53.237684156003056,58806.42532181016,15.826551495117064,i,758,325.5,-53.5,1,0,44 -12924443145990569984,82808,326.02326776366465,-53.24499212580126,59260.74385286073,18.81263573514724,z,758,325.5,-53.5,1,0,44 -12924444209426989056,83923,326.0482648260294,-53.20378207583531,59336.07701833901,20.078470816185067,u,758,325.5,-53.5,1,0,44 -12924444520451407872,77753,326.0886842815208,-53.17269383409335,58904.09942695024,16.43790742575683,r,758,325.5,-53.5,1,0,44 -12924445122426306560,73407,326.0055440030482,-53.18353912899672,58601.1795273136,18.001813160373498,r,758,325.5,-53.5,1,0,44 -12924451794133712896,73883,325.7320830928922,-53.32723552953679,58633.82601997437,20.758858790570343,r,758,325.5,-53.5,1,0,44 -12924451914313105408,75128,325.68873487262937,-53.34523838085536,58722.49731930132,16.648220757035407,r,758,325.5,-53.5,1,0,44 -12924451915227463680,81289,325.6880755696467,-53.34421249919178,59150.53749606953,16.599572378141612,u,758,325.5,-53.5,1,0,44 -12924451934768726016,72967,325.6919457943198,-53.33638949444591,58569.47059273607,20.97191977705083,i,758,325.5,-53.5,1,0,44 -12924452709087576064,82680,325.7983393924228,-53.300460005523874,59251.65915091927,15.271323075615149,i,758,325.5,-53.5,1,0,44 -12924452984443633664,84115,325.74152745226377,-53.29913136663376,59350.365729308745,16.31851618591933,i,758,325.5,-53.5,1,0,44 -12924453217982480384,77303,325.72919684570866,-53.27118971604231,58872.1468842128,18.03998478402543,r,758,325.5,-53.5,1,0,44 -12924453436002402304,84986,325.7452338895242,-53.25695520115608,59412.36273285025,16.951956720762322,g,758,325.5,-53.5,1,0,44 -12924454724010246144,84124,325.7126974167209,-53.26340776129423,59350.854745443336,19.31577032794084,z,758,325.5,-53.5,1,0,44 -12924454822819659776,72997,325.68794425749263,-53.25107178394243,58571.02635902176,16.06553519240877,r,758,325.5,-53.5,1,0,44 -12924455031024910336,77898,325.733258083903,-53.22492350812667,58914.35982132937,20.29165412990203,z,758,325.5,-53.5,1,0,44 -12924455252643545088,73501,325.68451995490835,-53.23844106138672,58607.59868864432,17.078306245780773,i,758,325.5,-53.5,1,0,44 -12924455506247942144,80615,325.6883621527016,-53.217335016453305,59103.29472325393,17.087490362377334,u,758,325.5,-53.5,1,0,44 -12924455649852522496,80265,325.6728387678245,-53.20087944542272,59078.95591802469,15.994882664806733,g,758,325.5,-53.5,1,0,44 -12924455960755306496,83332,325.806178634454,-53.25151252327419,59296.95452077674,16.584078772435372,i,758,325.5,-53.5,1,0,44 -12924456006620020736,80241,325.8384854866551,-53.251942248828286,59077.05614371103,20.776793433480613,g,758,325.5,-53.5,1,0,44 -12924456143274639360,82813,325.8199201450415,-53.24051898696548,59260.81368428733,15.158276283801454,z,758,325.5,-53.5,1,0,44 -12924456156247621632,76615,325.8320648435714,-53.23452343586965,58822.42906461483,19.28368076659012,g,758,325.5,-53.5,1,0,44 -12924456357972672512,77750,325.80139190630376,-53.23802654862261,58904.06170913502,18.238548828182296,g,758,325.5,-53.5,1,0,44 -12924456627683196928,80566,325.8160089215852,-53.21577764277768,59099.87887849765,16.984352449335482,y,758,325.5,-53.5,1,0,44 -12924456842121183232,73117,325.87406037553654,-53.2229732329679,58580.65152577448,16.02230111089344,y,758,325.5,-53.5,1,0,44 -12924456860630646784,76213,325.85697377401203,-53.2223688732311,58795.47422852765,19.84724468202113,y,758,325.5,-53.5,1,0,44 -12924458679700291584,76779,325.7147144297658,-53.18193419068136,58835.448668452,20.844453212535107,i,758,325.5,-53.5,1,0,44 -12924459949383221248,70930,325.7821106267577,-53.11665838621638,58428.77420585338,16.876557977677468,g,758,325.5,-53.5,1,0,44 -12924460925011886080,84838,325.5494938853333,-53.22227505116596,59400.977536500206,18.80856762577463,r,758,325.5,-53.5,1,0,44 -12924461659170275328,71345,325.6421185318692,-53.18486270631792,58455.47117177463,20.871084540295055,g,758,325.5,-53.5,1,0,44 -12924463425643347968,80595,325.5652424842884,-53.18207656337819,59102.168274689066,19.982744182794026,r,758,325.5,-53.5,1,0,44 -12924463817416507392,73509,325.6008889733441,-53.13192731237795,58608.58615140361,19.234424360921096,y,758,325.5,-53.5,1,0,44 -12924464306484936704,73577,325.5517315586158,-53.117834021390834,58613.43405449034,19.812224734194384,z,758,325.5,-53.5,1,0,44 -12924464455823130624,81406,325.5427380485216,-53.11088880461367,59159.785147578135,18.715897575272905,u,758,325.5,-53.5,1,0,44 -12924464850452611072,85909,325.69564545890586,-53.14750400542725,59477.21997929389,17.637010696518203,i,758,325.5,-53.5,1,0,44 -12924465017436241920,75914,325.70054057512334,-53.12879275517909,58776.2230604801,19.048488448702017,u,758,325.5,-53.5,1,0,44 -12924465876744273920,86473,325.71386183365047,-53.09756786923459,59515.46948206408,17.799417561270324,u,758,325.5,-53.5,1,0,44 -12924466360402051072,76420,325.6702368117087,-53.0851004047989,58809.82200202354,15.340516847844349,r,758,325.5,-53.5,1,0,44 -12924467947891589120,81732,325.66046786646825,-53.059093619255,59184.16446821887,19.015753672778786,y,758,325.5,-53.5,1,0,44 -12924467983589310464,73742,325.6388240938062,-53.065101517763104,58624.29577237071,15.881518980603005,g,758,325.5,-53.5,1,0,44 -12924469216068763648,71138,325.93257425476907,-53.150393493177496,58442.85004388903,17.73823308857657,u,758,325.5,-53.5,1,0,44 -12924470056552759296,74224,325.9379344589995,-53.12844615233486,58659.67471279533,15.910684849670709,u,758,325.5,-53.5,1,0,44 -12924470374673940480,86198,325.9884604643789,-53.09486000402106,59496.45202710757,15.98404539140078,g,758,325.5,-53.5,1,0,44 -12924470697153003520,81402,325.9235966466717,-53.08219834474573,59159.686145530126,17.806549802289886,i,758,325.5,-53.5,1,0,44 -12924471625922904064,81320,325.8544800876428,-53.07643524727416,59152.09623347744,18.278537203692995,i,758,325.5,-53.5,1,0,44 -12924472369010966528,83020,325.86792477015933,-53.0704077528948,59274.66127682682,16.77642379631016,y,758,325.5,-53.5,1,0,44 -12924477941705867264,79622,325.7619634790705,-53.05666198868984,59035.33726574715,20.34119881198327,z,758,325.5,-53.5,1,0,44 -12926797634395439104,83614,321.77663877519234,-54.496893467774704,59314.93115622887,20.73280044095313,r,775,321.5,-54.5,1,0,44 -12926799317573828608,84396,321.7370472846209,-54.46563858404945,59371.261633648,15.957410535671798,y,775,321.5,-54.5,1,0,44 -12926799375379726336,73718,321.6678166696297,-54.49478787177072,58622.98744339219,19.580823775022218,y,775,321.5,-54.5,1,0,44 -12926821127262568448,78939,321.98808973412054,-54.48705485888608,58987.03991137552,16.733400616440747,z,775,321.5,-54.5,1,0,44 -12926824217147604992,86185,321.97724592729145,-54.465802835048194,59495.98184431321,17.21470873451685,u,775,321.5,-54.5,1,0,44 -12926825516186468352,82699,322.0926610082254,-54.39482945054385,59252.823815298696,17.626576641881197,u,775,321.5,-54.5,1,0,44 -12926825655533830144,78959,322.072448650518,-54.38195896200882,58988.44618945937,19.55608682090094,z,775,321.5,-54.5,1,0,44 -12926825917338091520,75472,321.9896212448569,-54.38197231942464,58746.59092674625,18.003269622697985,g,775,321.5,-54.5,1,0,44 -12926838317483294720,71275,322.09418405736574,-54.30302050047701,58451.18794204853,17.749398533626355,z,775,321.5,-54.5,1,0,44 -12926844727818452992,80090,321.81189910695457,-54.47306392533005,59067.41246495355,17.31613491439375,u,775,321.5,-54.5,1,0,44 -12926844796412100608,82999,321.8255065603988,-54.46056085018053,59273.42087552088,17.808937424169017,i,775,321.5,-54.5,1,0,44 -12926844861272817664,81803,321.8025980933217,-54.45995452838184,59190.87511531672,19.55664827515076,u,775,321.5,-54.5,1,0,44 -12926846358186360832,79917,321.79821979723374,-54.44622295575043,59053.85405350459,18.949752543738843,r,775,321.5,-54.5,1,0,44 -12926847274528538624,84787,321.81932411395894,-54.410139742771925,59398.14778122631,20.80636882427185,r,775,321.5,-54.5,1,0,44 -12926847652280139776,76973,321.8348847320665,-54.38043624814964,58849.06001680163,16.088788630567702,i,775,321.5,-54.5,1,0,44 -12926847979536515072,79391,321.77433881551207,-54.36672640868015,59017.43775883939,15.675200108409442,u,775,321.5,-54.5,1,0,44 -12926848061367386112,80575,321.8112564949995,-54.371479308433805,59100.51510750611,18.63506117795286,z,775,321.5,-54.5,1,0,44 -12926849023653969920,76016,321.8876535466516,-54.38322890973363,58783.30159756239,17.636397303731865,r,775,321.5,-54.5,1,0,44 -12926849199076540416,86637,321.927105665723,-54.36185910000352,59527.10005124642,15.199521214994691,y,775,321.5,-54.5,1,0,44 -12926849579701239808,83229,321.98311883777404,-54.35766005459436,59290.183923283934,16.963594205908798,u,775,321.5,-54.5,1,0,44 -12926850588230025216,84793,321.8688493189887,-54.3580640359336,59398.53968988892,17.698689435639086,z,775,321.5,-54.5,1,0,44 -12926851115223351296,80858,321.83640883548964,-54.341152111485954,59119.97090392401,20.47907684098493,u,775,321.5,-54.5,1,0,44 -12926857095004815360,79528,321.79094607286964,-54.32746552529519,59028.23635648044,17.044148982467533,i,775,321.5,-54.5,1,0,44 -12926857488522805248,72231,321.81493319403666,-54.29212567051647,58515.04286227904,15.716568569900211,r,775,321.5,-54.5,1,0,44 -12926857624934154240,85915,321.77224831769047,-54.30547534094452,59477.85945390731,17.989995516162676,i,775,321.5,-54.5,1,0,44 -12926857679351054336,78716,321.77744003492955,-54.2971430309454,58973.23492215567,20.63018785060757,u,775,321.5,-54.5,1,0,44 -12926858223754936320,74882,321.8551938147569,-54.27801634581648,58704.60234742793,17.955722818715593,u,775,321.5,-54.5,1,0,44 -12926858712282300416,79462,321.8095396821148,-54.26270227905944,59022.67034313727,16.721390226113332,g,775,321.5,-54.5,1,0,44 -12926858859208769536,79500,321.80067851737664,-54.24763462617549,59025.962903831685,15.191297906709838,u,775,321.5,-54.5,1,0,44 -12926858922270130176,84440,321.80812162725874,-54.23648088985817,59374.17909730772,16.333257621343936,r,775,321.5,-54.5,1,0,44 -12926862425860341760,76984,322.003635167479,-54.27406127270631,58849.858352965566,20.59193106209044,r,775,321.5,-54.5,1,0,44 -12926863178280730624,81633,322.05410174464413,-54.25172827759936,59175.78201711943,17.93184654107691,i,775,321.5,-54.5,1,0,44 -12926863697476845568,76076,321.9545583543322,-54.27932807854465,58787.241272528685,15.145377481442692,y,775,321.5,-54.5,1,0,44 -12926864530360762368,73265,321.9556389978099,-54.22881062342039,58590.53219485352,20.06164265588968,y,775,321.5,-54.5,1,0,44 -12926865041763860480,85064,322.0441560950752,-54.21330393892011,59417.38447094291,16.25891586284328,i,775,321.5,-54.5,1,0,44 -12926869894779109376,70088,322.05383054933344,-54.097386564726975,58370.02548109953,15.05622077016195,i,775,321.5,-54.5,1,0,44 -12926871037169106944,78360,321.849512179946,-54.19026293816768,58946.95199637691,16.904849677951148,i,775,321.5,-54.5,1,0,44 -12926871610262028288,75684,321.94286444508714,-54.15446572393382,58761.7074513838,19.616337982607806,y,775,321.5,-54.5,1,0,44 -12926871624409415680,79837,321.9674096122941,-54.16892719007446,59048.66415124292,18.90870088389537,z,775,321.5,-54.5,1,0,44 -12926871810217082880,84268,321.9512445992036,-54.14864009546897,59361.29016396793,15.327595775530144,r,775,321.5,-54.5,1,0,44 -12926873614434697216,77235,321.8916970408228,-54.13547851418717,58866.747318096976,20.88329535515804,i,775,321.5,-54.5,1,0,44 -12926874815767248896,78995,321.98204547396426,-54.121075501177465,58990.41396614678,20.90000323319758,i,775,321.5,-54.5,1,0,44 -12926875345277157376,86815,321.9438461185633,-54.10565846651749,59539.84121248063,19.03425432165205,u,775,321.5,-54.5,1,0,44 -12926875838028185600,76339,322.0650975500027,-54.07572643573555,58803.81580340712,20.76717601878376,i,775,321.5,-54.5,1,0,44 -12926876185824067584,71254,322.0531475759683,-54.05191722791157,58450.048299167145,18.150636806049054,g,775,321.5,-54.5,1,0,44 -12926876577806942208,78642,322.0299413703144,-54.04886970216323,58967.35040486448,17.998958624332534,g,775,321.5,-54.5,1,0,44 -12926877121183219712,76914,321.94998122707386,-54.07409074372694,58845.030500472,17.1681393344753,i,775,321.5,-54.5,1,0,44 -12929879259601698816,82202,322.03683068644006,-53.99914680322094,59218.46913081202,19.02044776424656,y,775,321.5,-54.5,1,0,44 -12929880736651018240,81686,322.02882420663656,-53.99375454007375,59179.89285854334,16.40947752750436,y,775,321.5,-54.5,1,0,44 +_healpix_29,source_id,source_ra,source_dec,mjd,mag,band,object_id,object_ra,object_dec,Norder,Dir,Npix +3231094964189059133,74393,325.7612847064375,-53.47216729436138,58672.67873350513,19.09735842991942,i,758,325.5,-53.5,1,0,44 +3231095093917394701,73177,325.76964233775635,-53.41545382621511,58584.12253095591,17.348350142263595,i,758,325.5,-53.5,1,0,44 +3231095227515549143,82866,325.74406904926553,-53.3930566419519,59264.309530415616,18.55425003020008,g,758,325.5,-53.5,1,0,44 +3231095236011966097,85495,325.7351847305723,-53.38781504603176,59448.62111878577,20.81422266217071,z,758,325.5,-53.5,1,0,44 +3231099952636690317,75452,325.58491781018284,-53.499286122945925,58745.4737162212,18.087014336457212,u,758,325.5,-53.5,1,0,44 +3231099964868362366,79771,325.59429412221266,-53.49516018904445,59044.925884694385,20.080194264349498,g,758,325.5,-53.5,1,0,44 +3231099998987513516,81215,325.6389729830111,-53.48053692345315,59144.54944024879,15.225820061507676,g,758,325.5,-53.5,1,0,44 +3231100020386274783,72093,325.6170994427331,-53.474757349722566,58505.90839148664,20.71969170499344,z,758,325.5,-53.5,1,0,44 +3231100110773836899,70106,325.54978159951366,-53.46663206563081,58370.76012417132,15.64596815275773,g,758,325.5,-53.5,1,0,44 +3231100150958537862,70153,325.5972754207557,-53.44260598018785,58374.29236678393,17.439995016888133,i,758,325.5,-53.5,1,0,44 +3231100461967308971,80904,325.5379346143558,-53.47170302714972,59123.21163015216,18.623335457868464,z,758,325.5,-53.5,1,0,44 +3231100603749639322,83852,325.50613370041657,-53.44209761943318,59331.35730159552,15.520634989121303,r,758,325.5,-53.5,1,0,44 +3231100604980943024,78029,325.501961786786,-53.44067621997499,58923.71341620144,15.076647551429534,z,758,325.5,-53.5,1,0,44 +3231100691310377507,75466,325.5294984618788,-53.40370190374638,58746.41845959629,18.347612120542813,u,758,325.5,-53.5,1,0,44 +3231100706502317737,86209,325.50852238274575,-53.405739311476886,59497.528748281446,18.49637558743748,y,758,325.5,-53.5,1,0,44 +3231100767452611549,70738,325.6576846483176,-53.44610814461365,58416.93241444813,15.03876487001622,z,758,325.5,-53.5,1,0,44 +3231100853724128919,82934,325.649846743077,-53.42001222150392,59269.00088071255,15.243998318642,i,758,325.5,-53.5,1,0,44 +3231100892551161633,70820,325.6208911587941,-53.43515348686121,58421.58173823744,17.168262806972372,i,758,325.5,-53.5,1,0,44 +3231100953828766329,83494,325.6231424662905,-53.41440559961841,59306.852219168555,18.747607836567077,r,758,325.5,-53.5,1,0,44 +3231101058633967356,87145,325.6711262028145,-53.400228493743654,59561.26939081595,16.163282119132703,r,758,325.5,-53.5,1,0,44 +3231101061464623886,76297,325.67012526238057,-53.394537264053405,58801.06444716565,18.486449950607874,i,758,325.5,-53.5,1,0,44 +3231101256093304467,72755,325.6627005823713,-53.358704661651146,58554.57781637238,18.838396281249477,u,758,325.5,-53.5,1,0,44 +3231101430448338489,84403,325.54632314697943,-53.39094318834111,59371.84310890227,20.4279381265997,i,758,325.5,-53.5,1,0,44 +3231101569051624031,85078,325.61163823419156,-53.37273549135322,59418.12809069652,18.659657014552582,z,758,325.5,-53.5,1,0,44 +3231101592451675203,72825,325.6301212952571,-53.34789704028818,58559.91088842041,17.63371463969415,u,758,325.5,-53.5,1,0,44 +3231104419197332900,73410,326.0656749649625,-53.476708155233474,58601.55751035136,17.18644121959771,u,758,325.5,-53.5,1,0,44 +3231104443329160307,82744,326.0773519434002,-53.46049173301488,59256.77389735356,16.299085024309168,u,758,325.5,-53.5,1,0,44 +3231104452859514788,78293,326.03404543860876,-53.48666065686281,58942.6113525598,18.630058904227283,y,758,325.5,-53.5,1,0,44 +3231104564354115688,83688,326.027810388888,-53.44514007408695,59319.04053271364,19.233256338618094,z,758,325.5,-53.5,1,0,44 +3231104780053524276,77221,325.90548385883284,-53.46384581580615,58865.94468987716,15.08561008963453,r,758,325.5,-53.5,1,0,44 +3231105067646925096,75200,325.9751586222098,-53.42137000915289,58728.013731322935,18.02505027447662,y,758,325.5,-53.5,1,0,44 +3231105130705447643,80864,325.96886668822066,-53.38695349404869,59120.59428240979,17.93172574231246,r,758,325.5,-53.5,1,0,44 +3231105296381994212,76154,326.0855465093048,-53.42404236063275,58792.0528821335,19.35772962792332,u,758,325.5,-53.5,1,0,44 +3231105329780140432,81944,326.0637850907387,-53.41588933630612,59199.97463482008,19.07543041818625,y,758,325.5,-53.5,1,0,44 +3231105345096966883,70733,326.09754814940374,-53.41733628824939,58416.76510278134,20.9684463784397,u,758,325.5,-53.5,1,0,44 +3231105718898054746,72667,326.01550565998565,-53.410614472283285,58548.03942102606,20.18414121892804,u,758,325.5,-53.5,1,0,44 +3231106024304275296,70472,326.07069082698985,-53.337745136693776,58397.94341496712,19.836615830647197,u,758,325.5,-53.5,1,0,44 +3231106131382386366,81938,326.0264790077982,-53.33961989236353,59199.35813814182,19.3714250032334,r,758,325.5,-53.5,1,0,44 +3231106389950915611,78305,325.85436502442593,-53.43216071995659,58943.28316426003,17.115025922458983,z,758,325.5,-53.5,1,0,44 +3231106415876293084,79736,325.81209516929067,-53.42932385003106,59042.28176742738,18.86975218808749,i,758,325.5,-53.5,1,0,44 +3231106428324551172,82285,325.83998217473726,-53.415455551412784,59223.67225858066,19.70996012152604,z,758,325.5,-53.5,1,0,44 +3231106663745648083,76891,325.89422553473474,-53.38666584769471,58843.75999321824,19.937788280041293,i,758,325.5,-53.5,1,0,44 +3231106698509451491,72485,325.8834202424334,-53.374451916232374,58534.39771275177,16.37746117331356,r,758,325.5,-53.5,1,0,44 +3231106827031803541,71722,325.7828179293452,-53.406520539987035,58481.93486622177,17.50636730465716,u,758,325.5,-53.5,1,0,44 +3231106891360008884,83433,325.813779239575,-53.38113275621632,59303.020252109,20.840823137152228,g,758,325.5,-53.5,1,0,44 +3231107069224798515,85137,325.8355156490824,-53.36813946145619,59422.53471898148,17.576938279587523,i,758,325.5,-53.5,1,0,44 +3231107357011742964,72988,325.9749994305709,-53.35556505312154,58570.439934394315,17.101430741597298,z,758,325.5,-53.5,1,0,44 +3231107383708467637,74710,325.9429065289537,-53.34614709786219,58693.74548174684,15.779086628365114,i,758,325.5,-53.5,1,0,44 +3231107746399451452,76428,325.9740318207902,-53.30213967688099,58810.18886321588,18.19924875806168,i,758,325.5,-53.5,1,0,44 +3231107794632902233,70895,325.94497757024516,-53.27921221929533,58426.61793872539,19.399081122415993,g,758,325.5,-53.5,1,0,44 +3231107825444133442,72658,325.9795048612243,-53.270016705957104,58547.44037508546,18.21377866522714,r,758,325.5,-53.5,1,0,44 +3231107882301453461,72589,325.9800350095617,-53.23736261071722,58542.29258376296,20.891547292692223,i,758,325.5,-53.5,1,0,44 +3231108070215325913,75608,325.83257541781853,-53.27659808642977,58756.67784351645,18.089455907939705,z,758,325.5,-53.5,1,0,44 +3231108102807196340,77258,325.877064433464,-53.266904456774355,58868.117353033,15.492928190811485,i,758,325.5,-53.5,1,0,44 +3231109232378713934,86395,326.08194679803546,-53.260965571501224,59510.90179533646,18.503466721953988,r,758,325.5,-53.5,1,0,44 +3231109256653858481,76374,326.0950581091129,-53.237684156003056,58806.42532181016,15.826551495117064,i,758,325.5,-53.5,1,0,44 +3231110786498320375,82808,326.02326776366465,-53.24499212580126,59260.74385286073,18.81263573514724,z,758,325.5,-53.5,1,0,44 +3231111052357583606,83923,326.0482648260294,-53.20378207583531,59336.07701833901,20.078470816185067,u,758,325.5,-53.5,1,0,44 +3231111130113170118,77753,326.0886842815208,-53.17269383409335,58904.09942695024,16.43790742575683,r,758,325.5,-53.5,1,0,44 +3231111280606738972,73407,326.0055440030482,-53.18353912899672,58601.1795273136,18.001813160373498,r,758,325.5,-53.5,1,0,44 +3231112948534250954,73883,325.7320830928922,-53.327235529536786,58633.82601997437,20.758858790570343,r,758,325.5,-53.5,1,0,44 +3231112978578406287,75128,325.68873487262937,-53.34523838085536,58722.49731930132,16.648220757035407,r,758,325.5,-53.5,1,0,44 +3231112978807073315,81289,325.6880755696467,-53.344212499191784,59150.53749606953,16.599572378141612,u,758,325.5,-53.5,1,0,44 +3231112983692754231,72967,325.6919457943198,-53.33638949444591,58569.47059273607,20.97191977705083,i,758,325.5,-53.5,1,0,44 +3231113177272334537,82680,325.7983393924228,-53.300460005523874,59251.659150919266,15.271323075615149,i,758,325.5,-53.5,1,0,44 +3231113246110922128,84115,325.74152745226377,-53.29913136663376,59350.365729308745,16.31851618591933,i,758,325.5,-53.5,1,0,44 +3231113304496505011,77303,325.72919684570866,-53.27118971604231,58872.146884212794,18.03998478402543,r,758,325.5,-53.5,1,0,44 +3231113359000914053,84986,325.7452338895242,-53.25695520115608,59412.36273285025,16.951956720762322,g,758,325.5,-53.5,1,0,44 +3231113681003034650,84124,325.7126974167209,-53.263407761294225,59350.854745443336,19.31577032794084,z,758,325.5,-53.5,1,0,44 +3231113705705757207,72997,325.68794425749263,-53.25107178394243,58571.02635902176,16.06553519240877,r,758,325.5,-53.5,1,0,44 +3231113757757078769,77898,325.733258083903,-53.22492350812667,58914.35982132937,20.29165412990203,z,758,325.5,-53.5,1,0,44 +3231113813161102504,73501,325.68451995490835,-53.23844106138672,58607.59868864432,17.078306245780773,i,758,325.5,-53.5,1,0,44 +3231113876562785051,80615,325.6883621527016,-53.217335016453305,59103.29472325393,17.087490362377334,u,758,325.5,-53.5,1,0,44 +3231113912463520459,80265,325.6728387678245,-53.20087944542272,59078.95591802469,15.994882664806733,g,758,325.5,-53.5,1,0,44 +3231113990189102384,83332,325.806178634454,-53.25151252327419,59296.954520776744,16.584078772435372,i,758,325.5,-53.5,1,0,44 +3231114001655010816,80241,325.8384854866551,-53.251942248828286,59077.05614371103,20.776793433480613,g,758,325.5,-53.5,1,0,44 +3231114035819567149,82813,325.8199201450415,-53.24051898696547,59260.81368428733,15.158276283801454,z,758,325.5,-53.5,1,0,44 +3231114039061965013,76615,325.8320648435714,-53.23452343586965,58822.42906461483,19.283680766590116,g,758,325.5,-53.5,1,0,44 +3231114089493178471,77750,325.80139190630376,-53.238026548622614,58904.06170913502,18.238548828182296,g,758,325.5,-53.5,1,0,44 +3231114156921102823,80566,325.8160089215852,-53.21577764277768,59099.87887849765,16.984352449335482,y,758,325.5,-53.5,1,0,44 +3231114210531041435,73117,325.87406037553654,-53.2229732329679,58580.65152577448,16.02230111089344,y,758,325.5,-53.5,1,0,44 +3231114215157783310,76213,325.85697377401203,-53.2223688732311,58795.47422852765,19.847244682021135,y,758,325.5,-53.5,1,0,44 +3231114669925280135,76779,325.7147144297658,-53.18193419068136,58835.448668451994,20.844453212535107,i,758,325.5,-53.5,1,0,44 +3231114987346346906,70930,325.7821106267577,-53.11665838621638,58428.774205853384,16.876557977677468,g,758,325.5,-53.5,1,0,44 +3231115231253879161,84838,325.5494938853333,-53.22227505116596,59400.977536500206,18.80856762577463,r,758,325.5,-53.5,1,0,44 +3231115414793447520,71345,325.6421185318692,-53.18486270631792,58455.47117177463,20.871084540295055,g,758,325.5,-53.5,1,0,44 +3231115856411304788,80595,325.5652424842884,-53.18207656337819,59102.168274689066,19.982744182794026,r,758,325.5,-53.5,1,0,44 +3231115954354983183,73509,325.6008889733441,-53.13192731237795,58608.58615140361,19.234424360921096,y,758,325.5,-53.5,1,0,44 +3231116076622055536,73577,325.5517315586158,-53.117834021390834,58613.43405449034,19.812224734194384,z,758,325.5,-53.5,1,0,44 +3231116113956394883,81406,325.5427380485216,-53.110888804613666,59159.785147578135,18.715897575272905,u,758,325.5,-53.5,1,0,44 +3231116212614160795,85909,325.69564545890586,-53.14750400542725,59477.21997929389,17.637010696518203,i,758,325.5,-53.5,1,0,44 +3231116254359598097,75914,325.70054057512334,-53.12879275517909,58776.2230604801,19.048488448702017,u,758,325.5,-53.5,1,0,44 +3231116469187041731,86473,325.71386183365047,-53.09756786923459,59515.46948206408,17.799417561270324,u,758,325.5,-53.5,1,0,44 +3231116590100967224,76420,325.6702368117087,-53.0851004047989,58809.82200202354,15.340516847844349,r,758,325.5,-53.5,1,0,44 +3231116986973170084,81732,325.66046786646825,-53.059093619254995,59184.16446821887,19.015753672778786,y,758,325.5,-53.5,1,0,44 +3231116995897880632,73742,325.6388240938062,-53.065101517763104,58624.29577237071,15.881518980603005,g,758,325.5,-53.5,1,0,44 +3231117304017806752,71138,325.93257425476907,-53.150393493177496,58442.85004388903,17.73823308857657,u,758,325.5,-53.5,1,0,44 +3231117514139034294,74224,325.9379344589995,-53.12844615233486,58659.67471279533,15.910684849670709,u,758,325.5,-53.5,1,0,44 +3231117593669370608,86198,325.9884604643789,-53.09486000402106,59496.45202710757,15.98404539140078,g,758,325.5,-53.5,1,0,44 +3231117674288869554,81402,325.9235966466717,-53.082198344745734,59159.686145530126,17.806549802289886,i,758,325.5,-53.5,1,0,44 +3231117906480755353,81320,325.8544800876428,-53.07643524727416,59152.09623347744,18.278537203692995,i,758,325.5,-53.5,1,0,44 +3231118092253582472,83020,325.86792477015933,-53.070407752894795,59274.661276826824,16.77642379631016,y,758,325.5,-53.5,1,0,44 +3231119485426548163,79622,325.7619634790705,-53.05666198868984,59035.33726574715,20.34119881198327,z,758,325.5,-53.5,1,0,44 +3231699408599034518,83614,321.77663877519234,-54.496893467774704,59314.93115622887,20.73280044095313,r,775,321.5,-54.5,1,0,44 +3231699829394246583,84396,321.7370472846209,-54.46563858404945,59371.261633648,15.957410535671798,y,775,321.5,-54.5,1,0,44 +3231699843845542922,73718,321.6678166696297,-54.49478787177072,58622.98744339219,19.580823775022218,y,775,321.5,-54.5,1,0,44 +3231705281816599608,78939,321.98808973412054,-54.48705485888608,58987.03991137552,16.733400616440747,z,775,321.5,-54.5,1,0,44 +3231706054287674232,86185,321.97724592729145,-54.465802835048194,59495.98184431321,17.21470873451685,u,775,321.5,-54.5,1,0,44 +3231706379046851004,82699,322.0926610082254,-54.39482945054385,59252.823815298696,17.626576641881197,u,775,321.5,-54.5,1,0,44 +3231706413883897126,78959,322.072448650518,-54.38195896200882,58988.44618945937,19.55608682090094,z,775,321.5,-54.5,1,0,44 +3231706479335189949,75472,321.98962124485695,-54.38197231942464,58746.59092674625,18.003269622697985,g,775,321.5,-54.5,1,0,44 +3231709579371305163,71275,322.09418405736574,-54.30302050047701,58451.18794204853,17.749398533626355,z,775,321.5,-54.5,1,0,44 +3231711181954945236,80090,321.81189910695457,-54.47306392533005,59067.41246495355,17.31613491439375,u,775,321.5,-54.5,1,0,44 +3231711199103511517,82999,321.8255065603988,-54.46056085018053,59273.42087552088,17.808937424169017,i,775,321.5,-54.5,1,0,44 +3231711215319225655,81803,321.8025980933217,-54.45995452838184,59190.87511531672,19.55664827515076,u,775,321.5,-54.5,1,0,44 +3231711589546640264,79917,321.79821979723374,-54.44622295575043,59053.85405350459,18.949752543738843,r,775,321.5,-54.5,1,0,44 +3231711818632990443,84787,321.81932411395894,-54.410139742771925,59398.14778122631,20.80636882427185,r,775,321.5,-54.5,1,0,44 +3231711913070065851,76973,321.8348847320665,-54.380436248149636,58849.06001680163,16.088788630567702,i,775,321.5,-54.5,1,0,44 +3231711994884308497,79391,321.77433881551207,-54.36672640868015,59017.43775883939,15.675200108409442,u,775,321.5,-54.5,1,0,44 +3231712015342508364,80575,321.8112564949995,-54.371479308433805,59100.51510750611,18.63506117795286,z,775,321.5,-54.5,1,0,44 +3231712255913597626,76016,321.88765354665156,-54.38322890973363,58783.301597562386,17.636397303731865,r,775,321.5,-54.5,1,0,44 +3231712299769310298,86637,321.927105665723,-54.36185910000352,59527.10005124642,15.199521214994691,y,775,321.5,-54.5,1,0,44 +3231712394926230204,83229,321.98311883777404,-54.357660054594355,59290.183923283934,16.963594205908798,u,775,321.5,-54.5,1,0,44 +3231712647057855955,84793,321.8688493189887,-54.3580640359336,59398.53968988892,17.698689435639086,z,775,321.5,-54.5,1,0,44 +3231712778805944326,80858,321.83640883548964,-54.341152111485954,59119.97090392401,20.47907684098493,u,775,321.5,-54.5,1,0,44 +3231714273752140747,79528,321.79094607286964,-54.32746552529519,59028.23635648044,17.044148982467533,i,775,321.5,-54.5,1,0,44 +3231714372131655190,72231,321.81493319403666,-54.29212567051647,58515.04286227904,15.716568569900211,r,775,321.5,-54.5,1,0,44 +3231714406233917964,85915,321.77224831769047,-54.30547534094452,59477.85945390731,17.989995516162676,i,775,321.5,-54.5,1,0,44 +3231714419838090240,78716,321.77744003492955,-54.2971430309454,58973.234922155665,20.63018785060757,u,775,321.5,-54.5,1,0,44 +3231714555939348734,74882,321.8551938147569,-54.27801634581648,58704.60234742793,17.955722818715593,u,775,321.5,-54.5,1,0,44 +3231714678071408098,79462,321.8095396821148,-54.26270227905944,59022.670343137266,16.721390226113332,g,775,321.5,-54.5,1,0,44 +3231714714802827972,79500,321.80067851737664,-54.24763462617549,59025.962903831685,15.191297906709838,u,775,321.5,-54.5,1,0,44 +3231714730568147965,84440,321.80812162725874,-54.23648088985817,59374.179097307715,16.333257621343936,r,775,321.5,-54.5,1,0,44 +3231715606465736099,76984,322.003635167479,-54.274061272706305,58849.858352965566,20.59193106209044,r,775,321.5,-54.5,1,0,44 +3231715794570318815,81633,322.05410174464413,-54.25172827759936,59175.782017119425,17.93184654107691,i,775,321.5,-54.5,1,0,44 +3231715924369886671,76076,321.9545583543322,-54.27932807854465,58787.241272528685,15.145377481442692,y,775,321.5,-54.5,1,0,44 +3231716132591203884,73265,321.9556389978099,-54.22881062342039,58590.53219485352,20.06164265588968,y,775,321.5,-54.5,1,0,44 +3231716260441786800,85064,322.0441560950752,-54.21330393892011,59417.38447094291,16.25891586284328,i,775,321.5,-54.5,1,0,44 +3231717473695273978,70088,322.05383054933344,-54.097386564726975,58370.02548109953,15.05622077016195,i,775,321.5,-54.5,1,0,44 +3231717759292595944,78360,321.849512179946,-54.19026293816768,58946.95199637691,16.904849677951148,i,775,321.5,-54.5,1,0,44 +3231717902565781730,75684,321.94286444508714,-54.15446572393382,58761.7074513838,19.616337982607806,y,775,321.5,-54.5,1,0,44 +3231717906102453593,79837,321.9674096122941,-54.16892719007446,59048.66415124292,18.908700883895374,z,775,321.5,-54.5,1,0,44 +3231717952554818666,84268,321.9512445992036,-54.14864009546897,59361.29016396793,15.327595775530144,r,775,321.5,-54.5,1,0,44 +3231718403609116492,77235,321.8916970408228,-54.13547851418717,58866.747318096976,20.88329535515804,i,775,321.5,-54.5,1,0,44 +3231718703942043836,78995,321.98204547396426,-54.121075501177465,58990.41396614678,20.90000323319758,i,775,321.5,-54.5,1,0,44 +3231718836319974692,86815,321.9438461185633,-54.10565846651749,59539.84121248063,19.03425432165205,u,775,321.5,-54.5,1,0,44 +3231718959507436624,76339,322.0650975500027,-54.07572643573555,58803.81580340712,20.76717601878376,i,775,321.5,-54.5,1,0,44 +3231719046456694941,71254,322.0531475759683,-54.051917227911574,58450.048299167145,18.150636806049057,g,775,321.5,-54.5,1,0,44 +3231719144452624071,78642,322.02994137031436,-54.04886970216323,58967.350404864475,17.998958624332534,g,775,321.5,-54.5,1,0,44 +3231719280295924811,76914,321.94998122707386,-54.07409074372694,58845.030500472,17.1681393344753,i,775,321.5,-54.5,1,0,44 +3232469814901381212,82202,322.03683068644006,-53.99914680322094,59218.46913081202,19.02044776424656,y,775,321.5,-54.5,1,0,44 +3232470184163014608,81686,322.02882420663656,-53.99375454007375,59179.89285854334,16.40947752750436,y,775,321.5,-54.5,1,0,44 diff --git a/tests/data/raw/cone_search_expected/margin.csv b/tests/data/raw/cone_search_expected/margin.csv index e148758d..82058379 100644 --- a/tests/data/raw/cone_search_expected/margin.csv +++ b/tests/data/raw/cone_search_expected/margin.csv @@ -1,104 +1,104 @@ -_hipscat_index,source_id,source_ra,source_dec,mjd,mag,band,object_id,object_ra,object_dec,Norder,Dir,Npix,margin_Norder,margin_Dir,margin_Npix -12924379856753393664,74393,325.7612847064375,-53.47216729436138,58672.67873350513,19.09735842991942,i,758,325.5,-53.5,1,0,45,1,0,44 -12924380375668490240,73177,325.76964233775635,-53.41545382621511,58584.12253095591,17.348350142263595,i,758,325.5,-53.5,1,0,45,1,0,44 -12924380910060568576,82866,325.74406904926553,-53.3930566419519,59264.309530415616,18.55425003020008,g,758,325.5,-53.5,1,0,45,1,0,44 -12924380944047013888,85495,325.7351847305723,-53.38781504603176,59448.62111878577,20.81422266217071,z,758,325.5,-53.5,1,0,45,1,0,44 -12924399810546499584,75452,325.58491781018284,-53.499286122945925,58745.4737162212,18.08701433645721,u,758,325.5,-53.5,1,0,45,1,0,44 -12924399859473055744,79771,325.59429412221266,-53.49516018904445,59044.92588469439,20.08019426434949,g,758,325.5,-53.5,1,0,45,1,0,44 -12924399995947319296,81215,325.6389729830111,-53.48053692345315,59144.54944024879,15.225820061507676,g,758,325.5,-53.5,1,0,45,1,0,44 -12924400081544675328,72093,325.6170994427331,-53.474757349722566,58505.90839148664,20.71969170499344,z,758,325.5,-53.5,1,0,45,1,0,44 -12924400443093680128,70106,325.54978159951366,-53.46663206563081,58370.76012417132,15.64596815275773,g,758,325.5,-53.5,1,0,45,1,0,44 -12924400603831992320,70153,325.5972754207557,-53.44260598018785,58374.29236678393,17.439995016888133,i,758,325.5,-53.5,1,0,45,1,0,44 -12924401847866753024,80904,325.5379346143558,-53.47170302714972,59123.21163015216,18.623335457868464,z,758,325.5,-53.5,1,0,45,1,0,44 -12924402414995374080,83852,325.50613370041657,-53.44209761943318,59331.35730159552,15.520634989121303,r,758,325.5,-53.5,1,0,45,1,0,44 -12924402419923681280,78029,325.501961786786,-53.440676219975,58923.71341620144,15.076647551429534,z,758,325.5,-53.5,1,0,45,1,0,44 -12924402765240729600,75466,325.5294984618788,-53.40370190374638,58746.41845959629,18.347612120542813,u,758,325.5,-53.5,1,0,45,1,0,44 -12924402826007805952,86209,325.5085223827457,-53.405739311476886,59497.528748281446,18.49637558743748,y,758,325.5,-53.5,1,0,45,1,0,44 -12924403069810114560,70738,325.6576846483176,-53.44610814461365,58416.93241444813,15.03876487001622,z,758,325.5,-53.5,1,0,45,1,0,44 -12924403414896476160,82934,325.649846743077,-53.42001222150392,59269.00088071255,15.243998318642,i,758,325.5,-53.5,1,0,45,1,0,44 -12924403570203164672,70820,325.6208911587941,-53.43515348686121,58421.58173823744,17.168262806972372,i,758,325.5,-53.5,1,0,45,1,0,44 -12924403815314096128,83494,325.6231424662905,-53.41440559961841,59306.85221916856,18.74760783656708,r,758,325.5,-53.5,1,0,45,1,0,44 -12924404234534780928,87145,325.6711262028145,-53.40022849374365,59561.26939081595,16.163282119132703,r,758,325.5,-53.5,1,0,45,1,0,44 -12924404245855207424,76297,325.67012526238057,-53.394537264053405,58801.06444716565,18.486449950607877,i,758,325.5,-53.5,1,0,45,1,0,44 -12924405024372555776,72755,325.6627005823713,-53.358704661651146,58554.57781637238,18.83839628124948,u,758,325.5,-53.5,1,0,45,1,0,44 -12924405721793036288,84403,325.54632314697943,-53.39094318834111,59371.84310890227,20.4279381265997,i,758,325.5,-53.5,1,0,45,1,0,44 -12924406276204527616,85078,325.6116382341916,-53.37273549135322,59418.12809069652,18.659657014552582,z,758,325.5,-53.5,1,0,45,1,0,44 -12924406369804615680,72825,325.6301212952571,-53.34789704028818,58559.91088842041,17.63371463969415,u,758,325.5,-53.5,1,0,45,1,0,44 -12924417676788367360,73410,326.0656749649625,-53.476708155233474,58601.55751035136,17.18644121959771,u,758,325.5,-53.5,1,0,45,1,0,44 -12924417773316079616,82744,326.0773519434002,-53.46049173301488,59256.77389735356,16.299085024309168,u,758,325.5,-53.5,1,0,45,1,0,44 -12924417811433914368,78293,326.0340454386088,-53.48666065686281,58942.6113525598,18.630058904227283,y,758,325.5,-53.5,1,0,45,1,0,44 -12924418257414258688,83688,326.027810388888,-53.44514007408695,59319.04053271364,19.23325633861809,z,758,325.5,-53.5,1,0,45,1,0,44 -12924419120211951616,77221,325.90548385883284,-53.46384581580615,58865.94468987716,15.08561008963453,r,758,325.5,-53.5,1,0,45,1,0,44 -12924420270583709696,75200,325.9751586222098,-53.42137000915289,58728.013731322935,18.02505027447662,y,758,325.5,-53.5,1,0,45,1,0,44 -12924420522820763648,80864,325.96886668822066,-53.38695349404869,59120.59428240979,17.93172574231246,r,758,325.5,-53.5,1,0,45,1,0,44 -12924421185524989952,76154,326.0855465093048,-53.42404236063275,58792.0528821335,19.35772962792332,u,758,325.5,-53.5,1,0,45,1,0,44 -12924421319117766656,81944,326.0637850907387,-53.41588933630612,59199.97463482008,19.07543041818625,y,758,325.5,-53.5,1,0,45,1,0,44 -12924421380383965184,70733,326.09754814940374,-53.41733628824939,58416.76510278134,20.9684463784397,u,758,325.5,-53.5,1,0,45,1,0,44 -12924422875590426624,72667,326.01550565998565,-53.410614472283285,58548.03942102606,20.18414121892804,u,758,325.5,-53.5,1,0,45,1,0,44 -12924424097215021056,70472,326.07069082698985,-53.337745136693776,58397.94341496712,19.8366158306472,u,758,325.5,-53.5,1,0,45,1,0,44 -12924424525528956928,81938,326.0264790077982,-53.33961989236353,59199.35813814182,19.3714250032334,r,758,325.5,-53.5,1,0,45,1,0,44 -12924425559802380288,78305,325.854365024426,-53.43216071995659,58943.28316426004,17.115025922458983,z,758,325.5,-53.5,1,0,45,1,0,44 -12924425663502352384,79736,325.81209516929067,-53.42932385003106,59042.28176742738,18.86975218808749,i,758,325.5,-53.5,1,0,45,1,0,44 -12924425713297129472,82285,325.83998217473726,-53.415455551412784,59223.67225858066,19.70996012152604,z,758,325.5,-53.5,1,0,45,1,0,44 -12924426654981292032,76891,325.89422553473474,-53.38666584769471,58843.75999321824,19.937788280041293,i,758,325.5,-53.5,1,0,45,1,0,44 -12924426794035052544,72485,325.8834202424334,-53.37445191623237,58534.39771275177,16.37746117331356,r,758,325.5,-53.5,1,0,45,1,0,44 -12924427308126699520,71722,325.7828179293452,-53.40652053998704,58481.93486622177,17.50636730465716,u,758,325.5,-53.5,1,0,45,1,0,44 -12924427565438861312,83433,325.813779239575,-53.38113275621632,59303.020252109,20.840823137152228,g,758,325.5,-53.5,1,0,45,1,0,44 -12924428276897677312,85137,325.8355156490824,-53.36813946145619,59422.53471898148,17.576938279587523,i,758,325.5,-53.5,1,0,45,1,0,44 -12924429428045381632,72988,325.9749994305709,-53.35556505312154,58570.43993439432,17.101430741597298,z,758,325.5,-53.5,1,0,45,1,0,44 -12924429534832361472,74710,325.9429065289537,-53.34614709786219,58693.74548174684,15.779086628365114,i,758,325.5,-53.5,1,0,45,1,0,44 -12924430985595977728,76428,325.9740318207902,-53.30213967688099,58810.18886321588,18.19924875806168,i,758,325.5,-53.5,1,0,45,1,0,44 -12924431178529767424,70895,325.9449775702452,-53.27921221929533,58426.61793872539,19.399081122415996,g,758,325.5,-53.5,1,0,45,1,0,44 -12924431301775196160,72658,325.9795048612243,-53.270016705957104,58547.44037508546,18.21377866522714,r,758,325.5,-53.5,1,0,45,1,0,44 -12924431529202941952,72589,325.9800350095617,-53.23736261071722,58542.29258376296,20.891547292692223,i,758,325.5,-53.5,1,0,45,1,0,44 -12924432280859967488,75608,325.83257541781853,-53.27659808642977,58756.67784351645,18.089455907939705,z,758,325.5,-53.5,1,0,45,1,0,44 -12924432411227324416,77258,325.877064433464,-53.26690445677436,58868.117353033,15.492928190811485,i,758,325.5,-53.5,1,0,45,1,0,44 -12924436929511948288,86395,326.08194679803546,-53.26096557150122,59510.90179533646,18.503466721953988,r,758,325.5,-53.5,1,0,45,1,0,44 -12924437026614280192,76374,326.0950581091129,-53.237684156003056,58806.42532181016,15.826551495117064,i,758,325.5,-53.5,1,0,45,1,0,44 -12924443145990569984,82808,326.02326776366465,-53.24499212580126,59260.74385286073,18.81263573514724,z,758,325.5,-53.5,1,0,45,1,0,44 -12924444209426989056,83923,326.0482648260294,-53.20378207583531,59336.07701833901,20.078470816185067,u,758,325.5,-53.5,1,0,45,1,0,44 -12924444520451407872,77753,326.0886842815208,-53.17269383409335,58904.09942695024,16.43790742575683,r,758,325.5,-53.5,1,0,45,1,0,44 -12924445122426306560,73407,326.0055440030482,-53.18353912899672,58601.1795273136,18.001813160373498,r,758,325.5,-53.5,1,0,45,1,0,44 -12924451794133712896,73883,325.7320830928922,-53.32723552953679,58633.82601997437,20.758858790570343,r,758,325.5,-53.5,1,0,45,1,0,44 -12924451914313105408,75128,325.68873487262937,-53.34523838085536,58722.49731930132,16.648220757035407,r,758,325.5,-53.5,1,0,45,1,0,44 -12924451915227463680,81289,325.6880755696467,-53.34421249919178,59150.53749606953,16.599572378141612,u,758,325.5,-53.5,1,0,45,1,0,44 -12924451934768726016,72967,325.6919457943198,-53.33638949444591,58569.47059273607,20.97191977705083,i,758,325.5,-53.5,1,0,45,1,0,44 -12924452709087576064,82680,325.7983393924228,-53.300460005523874,59251.65915091927,15.271323075615149,i,758,325.5,-53.5,1,0,45,1,0,44 -12924452984443633664,84115,325.74152745226377,-53.29913136663376,59350.365729308745,16.31851618591933,i,758,325.5,-53.5,1,0,45,1,0,44 -12924453217982480384,77303,325.72919684570866,-53.27118971604231,58872.1468842128,18.03998478402543,r,758,325.5,-53.5,1,0,45,1,0,44 -12924453436002402304,84986,325.7452338895242,-53.25695520115608,59412.36273285025,16.951956720762322,g,758,325.5,-53.5,1,0,45,1,0,44 -12924454724010246144,84124,325.7126974167209,-53.26340776129423,59350.854745443336,19.31577032794084,z,758,325.5,-53.5,1,0,45,1,0,44 -12924454822819659776,72997,325.68794425749263,-53.25107178394243,58571.02635902176,16.06553519240877,r,758,325.5,-53.5,1,0,45,1,0,44 -12924455031024910336,77898,325.733258083903,-53.22492350812667,58914.35982132937,20.29165412990203,z,758,325.5,-53.5,1,0,45,1,0,44 -12924455252643545088,73501,325.68451995490835,-53.23844106138672,58607.59868864432,17.078306245780773,i,758,325.5,-53.5,1,0,45,1,0,44 -12924455506247942144,80615,325.6883621527016,-53.217335016453305,59103.29472325393,17.087490362377334,u,758,325.5,-53.5,1,0,45,1,0,44 -12924455649852522496,80265,325.6728387678245,-53.20087944542272,59078.95591802469,15.994882664806733,g,758,325.5,-53.5,1,0,45,1,0,44 -12924455960755306496,83332,325.806178634454,-53.25151252327419,59296.95452077674,16.584078772435372,i,758,325.5,-53.5,1,0,45,1,0,44 -12924456006620020736,80241,325.8384854866551,-53.251942248828286,59077.05614371103,20.776793433480613,g,758,325.5,-53.5,1,0,45,1,0,44 -12924456143274639360,82813,325.8199201450415,-53.24051898696548,59260.81368428733,15.158276283801454,z,758,325.5,-53.5,1,0,45,1,0,44 -12924456156247621632,76615,325.8320648435714,-53.23452343586965,58822.42906461483,19.28368076659012,g,758,325.5,-53.5,1,0,45,1,0,44 -12924456357972672512,77750,325.80139190630376,-53.23802654862261,58904.06170913502,18.238548828182296,g,758,325.5,-53.5,1,0,45,1,0,44 -12924456627683196928,80566,325.8160089215852,-53.21577764277768,59099.87887849765,16.984352449335482,y,758,325.5,-53.5,1,0,45,1,0,44 -12924456842121183232,73117,325.87406037553654,-53.2229732329679,58580.65152577448,16.02230111089344,y,758,325.5,-53.5,1,0,45,1,0,44 -12924456860630646784,76213,325.85697377401203,-53.2223688732311,58795.47422852765,19.84724468202113,y,758,325.5,-53.5,1,0,45,1,0,44 -12924458679700291584,76779,325.7147144297658,-53.18193419068136,58835.448668452,20.844453212535107,i,758,325.5,-53.5,1,0,45,1,0,44 -12924459949383221248,70930,325.7821106267577,-53.11665838621638,58428.77420585338,16.876557977677468,g,758,325.5,-53.5,1,0,45,1,0,44 -12924460925011886080,84838,325.5494938853333,-53.22227505116596,59400.977536500206,18.80856762577463,r,758,325.5,-53.5,1,0,45,1,0,44 -12924461659170275328,71345,325.6421185318692,-53.18486270631792,58455.47117177463,20.871084540295055,g,758,325.5,-53.5,1,0,45,1,0,44 -12924463425643347968,80595,325.5652424842884,-53.18207656337819,59102.168274689066,19.982744182794026,r,758,325.5,-53.5,1,0,45,1,0,44 -12924463817416507392,73509,325.6008889733441,-53.13192731237795,58608.58615140361,19.234424360921096,y,758,325.5,-53.5,1,0,45,1,0,44 -12924464306484936704,73577,325.5517315586158,-53.117834021390834,58613.43405449034,19.812224734194384,z,758,325.5,-53.5,1,0,45,1,0,44 -12924464455823130624,81406,325.5427380485216,-53.11088880461367,59159.785147578135,18.715897575272905,u,758,325.5,-53.5,1,0,45,1,0,44 -12924464850452611072,85909,325.69564545890586,-53.14750400542725,59477.21997929389,17.637010696518203,i,758,325.5,-53.5,1,0,45,1,0,44 -12924465017436241920,75914,325.70054057512334,-53.12879275517909,58776.2230604801,19.048488448702017,u,758,325.5,-53.5,1,0,45,1,0,44 -12924465876744273920,86473,325.71386183365047,-53.09756786923459,59515.46948206408,17.799417561270324,u,758,325.5,-53.5,1,0,45,1,0,44 -12924466360402051072,76420,325.6702368117087,-53.0851004047989,58809.82200202354,15.340516847844349,r,758,325.5,-53.5,1,0,45,1,0,44 -12924467947891589120,81732,325.66046786646825,-53.059093619255,59184.16446821887,19.015753672778786,y,758,325.5,-53.5,1,0,45,1,0,44 -12924467983589310464,73742,325.6388240938062,-53.065101517763104,58624.29577237071,15.881518980603005,g,758,325.5,-53.5,1,0,45,1,0,44 -12924469216068763648,71138,325.93257425476907,-53.150393493177496,58442.85004388903,17.73823308857657,u,758,325.5,-53.5,1,0,45,1,0,44 -12924470056552759296,74224,325.9379344589995,-53.12844615233486,58659.67471279533,15.910684849670709,u,758,325.5,-53.5,1,0,45,1,0,44 -12924470374673940480,86198,325.9884604643789,-53.09486000402106,59496.45202710757,15.98404539140078,g,758,325.5,-53.5,1,0,45,1,0,44 -12924470697153003520,81402,325.9235966466717,-53.08219834474573,59159.686145530126,17.806549802289886,i,758,325.5,-53.5,1,0,45,1,0,44 -12924471625922904064,81320,325.8544800876428,-53.07643524727416,59152.09623347744,18.278537203692995,i,758,325.5,-53.5,1,0,45,1,0,44 -12924472369010966528,83020,325.86792477015933,-53.0704077528948,59274.66127682682,16.77642379631016,y,758,325.5,-53.5,1,0,45,1,0,44 -12924477941705867264,79622,325.7619634790705,-53.05666198868984,59035.33726574715,20.34119881198327,z,758,325.5,-53.5,1,0,45,1,0,44 +_healpix_29,source_id,source_ra,source_dec,mjd,mag,band,object_id,object_ra,object_dec,Norder,Dir,Npix,margin_Norder,margin_Dir,margin_Npix +3231094964189059133,74393,325.7612847064375,-53.47216729436138,58672.67873350513,19.09735842991942,i,758,325.5,-53.5,1,0,45,1,0,44 +3231095093917394701,73177,325.76964233775635,-53.41545382621511,58584.12253095591,17.348350142263595,i,758,325.5,-53.5,1,0,45,1,0,44 +3231095227515549143,82866,325.74406904926553,-53.3930566419519,59264.309530415616,18.55425003020008,g,758,325.5,-53.5,1,0,45,1,0,44 +3231095236011966097,85495,325.7351847305723,-53.38781504603176,59448.62111878577,20.81422266217071,z,758,325.5,-53.5,1,0,45,1,0,44 +3231099952636690317,75452,325.58491781018284,-53.499286122945925,58745.4737162212,18.087014336457212,u,758,325.5,-53.5,1,0,45,1,0,44 +3231099964868362366,79771,325.59429412221266,-53.49516018904445,59044.925884694385,20.080194264349498,g,758,325.5,-53.5,1,0,45,1,0,44 +3231099998987513516,81215,325.6389729830111,-53.48053692345315,59144.54944024879,15.225820061507676,g,758,325.5,-53.5,1,0,45,1,0,44 +3231100020386274783,72093,325.6170994427331,-53.474757349722566,58505.90839148664,20.71969170499344,z,758,325.5,-53.5,1,0,45,1,0,44 +3231100110773836899,70106,325.54978159951366,-53.46663206563081,58370.76012417132,15.64596815275773,g,758,325.5,-53.5,1,0,45,1,0,44 +3231100150958537862,70153,325.5972754207557,-53.44260598018785,58374.29236678393,17.439995016888133,i,758,325.5,-53.5,1,0,45,1,0,44 +3231100461967308971,80904,325.5379346143558,-53.47170302714972,59123.21163015216,18.623335457868464,z,758,325.5,-53.5,1,0,45,1,0,44 +3231100603749639322,83852,325.50613370041657,-53.44209761943318,59331.35730159552,15.520634989121303,r,758,325.5,-53.5,1,0,45,1,0,44 +3231100604980943024,78029,325.501961786786,-53.44067621997499,58923.71341620144,15.076647551429534,z,758,325.5,-53.5,1,0,45,1,0,44 +3231100691310377507,75466,325.5294984618788,-53.40370190374638,58746.41845959629,18.347612120542813,u,758,325.5,-53.5,1,0,45,1,0,44 +3231100706502317737,86209,325.50852238274575,-53.405739311476886,59497.528748281446,18.49637558743748,y,758,325.5,-53.5,1,0,45,1,0,44 +3231100767452611549,70738,325.6576846483176,-53.44610814461365,58416.93241444813,15.03876487001622,z,758,325.5,-53.5,1,0,45,1,0,44 +3231100853724128919,82934,325.649846743077,-53.42001222150392,59269.00088071255,15.243998318642,i,758,325.5,-53.5,1,0,45,1,0,44 +3231100892551161633,70820,325.6208911587941,-53.43515348686121,58421.58173823744,17.168262806972372,i,758,325.5,-53.5,1,0,45,1,0,44 +3231100953828766329,83494,325.6231424662905,-53.41440559961841,59306.852219168555,18.747607836567077,r,758,325.5,-53.5,1,0,45,1,0,44 +3231101058633967356,87145,325.6711262028145,-53.400228493743654,59561.26939081595,16.163282119132703,r,758,325.5,-53.5,1,0,45,1,0,44 +3231101061464623886,76297,325.67012526238057,-53.394537264053405,58801.06444716565,18.486449950607874,i,758,325.5,-53.5,1,0,45,1,0,44 +3231101256093304467,72755,325.6627005823713,-53.358704661651146,58554.57781637238,18.838396281249477,u,758,325.5,-53.5,1,0,45,1,0,44 +3231101430448338489,84403,325.54632314697943,-53.39094318834111,59371.84310890227,20.4279381265997,i,758,325.5,-53.5,1,0,45,1,0,44 +3231101569051624031,85078,325.61163823419156,-53.37273549135322,59418.12809069652,18.659657014552582,z,758,325.5,-53.5,1,0,45,1,0,44 +3231101592451675203,72825,325.6301212952571,-53.34789704028818,58559.91088842041,17.63371463969415,u,758,325.5,-53.5,1,0,45,1,0,44 +3231104419197332900,73410,326.0656749649625,-53.476708155233474,58601.55751035136,17.18644121959771,u,758,325.5,-53.5,1,0,45,1,0,44 +3231104443329160307,82744,326.0773519434002,-53.46049173301488,59256.77389735356,16.299085024309168,u,758,325.5,-53.5,1,0,45,1,0,44 +3231104452859514788,78293,326.03404543860876,-53.48666065686281,58942.6113525598,18.630058904227283,y,758,325.5,-53.5,1,0,45,1,0,44 +3231104564354115688,83688,326.027810388888,-53.44514007408695,59319.04053271364,19.233256338618094,z,758,325.5,-53.5,1,0,45,1,0,44 +3231104780053524276,77221,325.90548385883284,-53.46384581580615,58865.94468987716,15.08561008963453,r,758,325.5,-53.5,1,0,45,1,0,44 +3231105067646925096,75200,325.9751586222098,-53.42137000915289,58728.013731322935,18.02505027447662,y,758,325.5,-53.5,1,0,45,1,0,44 +3231105130705447643,80864,325.96886668822066,-53.38695349404869,59120.59428240979,17.93172574231246,r,758,325.5,-53.5,1,0,45,1,0,44 +3231105296381994212,76154,326.0855465093048,-53.42404236063275,58792.0528821335,19.35772962792332,u,758,325.5,-53.5,1,0,45,1,0,44 +3231105329780140432,81944,326.0637850907387,-53.41588933630612,59199.97463482008,19.07543041818625,y,758,325.5,-53.5,1,0,45,1,0,44 +3231105345096966883,70733,326.09754814940374,-53.41733628824939,58416.76510278134,20.9684463784397,u,758,325.5,-53.5,1,0,45,1,0,44 +3231105718898054746,72667,326.01550565998565,-53.410614472283285,58548.03942102606,20.18414121892804,u,758,325.5,-53.5,1,0,45,1,0,44 +3231106024304275296,70472,326.07069082698985,-53.337745136693776,58397.94341496712,19.836615830647197,u,758,325.5,-53.5,1,0,45,1,0,44 +3231106131382386366,81938,326.0264790077982,-53.33961989236353,59199.35813814182,19.3714250032334,r,758,325.5,-53.5,1,0,45,1,0,44 +3231106389950915611,78305,325.85436502442593,-53.43216071995659,58943.28316426003,17.115025922458983,z,758,325.5,-53.5,1,0,45,1,0,44 +3231106415876293084,79736,325.81209516929067,-53.42932385003106,59042.28176742738,18.86975218808749,i,758,325.5,-53.5,1,0,45,1,0,44 +3231106428324551172,82285,325.83998217473726,-53.415455551412784,59223.67225858066,19.70996012152604,z,758,325.5,-53.5,1,0,45,1,0,44 +3231106663745648083,76891,325.89422553473474,-53.38666584769471,58843.75999321824,19.937788280041293,i,758,325.5,-53.5,1,0,45,1,0,44 +3231106698509451491,72485,325.8834202424334,-53.374451916232374,58534.39771275177,16.37746117331356,r,758,325.5,-53.5,1,0,45,1,0,44 +3231106827031803541,71722,325.7828179293452,-53.406520539987035,58481.93486622177,17.50636730465716,u,758,325.5,-53.5,1,0,45,1,0,44 +3231106891360008884,83433,325.813779239575,-53.38113275621632,59303.020252109,20.840823137152228,g,758,325.5,-53.5,1,0,45,1,0,44 +3231107069224798515,85137,325.8355156490824,-53.36813946145619,59422.53471898148,17.576938279587523,i,758,325.5,-53.5,1,0,45,1,0,44 +3231107357011742964,72988,325.9749994305709,-53.35556505312154,58570.439934394315,17.101430741597298,z,758,325.5,-53.5,1,0,45,1,0,44 +3231107383708467637,74710,325.9429065289537,-53.34614709786219,58693.74548174684,15.779086628365114,i,758,325.5,-53.5,1,0,45,1,0,44 +3231107746399451452,76428,325.9740318207902,-53.30213967688099,58810.18886321588,18.19924875806168,i,758,325.5,-53.5,1,0,45,1,0,44 +3231107794632902233,70895,325.94497757024516,-53.27921221929533,58426.61793872539,19.399081122415993,g,758,325.5,-53.5,1,0,45,1,0,44 +3231107825444133442,72658,325.9795048612243,-53.270016705957104,58547.44037508546,18.21377866522714,r,758,325.5,-53.5,1,0,45,1,0,44 +3231107882301453461,72589,325.9800350095617,-53.23736261071722,58542.29258376296,20.891547292692223,i,758,325.5,-53.5,1,0,45,1,0,44 +3231108070215325913,75608,325.83257541781853,-53.27659808642977,58756.67784351645,18.089455907939705,z,758,325.5,-53.5,1,0,45,1,0,44 +3231108102807196340,77258,325.877064433464,-53.266904456774355,58868.117353033,15.492928190811485,i,758,325.5,-53.5,1,0,45,1,0,44 +3231109232378713934,86395,326.08194679803546,-53.260965571501224,59510.90179533646,18.503466721953988,r,758,325.5,-53.5,1,0,45,1,0,44 +3231109256653858481,76374,326.0950581091129,-53.237684156003056,58806.42532181016,15.826551495117064,i,758,325.5,-53.5,1,0,45,1,0,44 +3231110786498320375,82808,326.02326776366465,-53.24499212580126,59260.74385286073,18.81263573514724,z,758,325.5,-53.5,1,0,45,1,0,44 +3231111052357583606,83923,326.0482648260294,-53.20378207583531,59336.07701833901,20.078470816185067,u,758,325.5,-53.5,1,0,45,1,0,44 +3231111130113170118,77753,326.0886842815208,-53.17269383409335,58904.09942695024,16.43790742575683,r,758,325.5,-53.5,1,0,45,1,0,44 +3231111280606738972,73407,326.0055440030482,-53.18353912899672,58601.1795273136,18.001813160373498,r,758,325.5,-53.5,1,0,45,1,0,44 +3231112948534250954,73883,325.7320830928922,-53.327235529536786,58633.82601997437,20.758858790570343,r,758,325.5,-53.5,1,0,45,1,0,44 +3231112978578406287,75128,325.68873487262937,-53.34523838085536,58722.49731930132,16.648220757035407,r,758,325.5,-53.5,1,0,45,1,0,44 +3231112978807073315,81289,325.6880755696467,-53.344212499191784,59150.53749606953,16.599572378141612,u,758,325.5,-53.5,1,0,45,1,0,44 +3231112983692754231,72967,325.6919457943198,-53.33638949444591,58569.47059273607,20.97191977705083,i,758,325.5,-53.5,1,0,45,1,0,44 +3231113177272334537,82680,325.7983393924228,-53.300460005523874,59251.659150919266,15.271323075615149,i,758,325.5,-53.5,1,0,45,1,0,44 +3231113246110922128,84115,325.74152745226377,-53.29913136663376,59350.365729308745,16.31851618591933,i,758,325.5,-53.5,1,0,45,1,0,44 +3231113304496505011,77303,325.72919684570866,-53.27118971604231,58872.146884212794,18.03998478402543,r,758,325.5,-53.5,1,0,45,1,0,44 +3231113359000914053,84986,325.7452338895242,-53.25695520115608,59412.36273285025,16.951956720762322,g,758,325.5,-53.5,1,0,45,1,0,44 +3231113681003034650,84124,325.7126974167209,-53.263407761294225,59350.854745443336,19.31577032794084,z,758,325.5,-53.5,1,0,45,1,0,44 +3231113705705757207,72997,325.68794425749263,-53.25107178394243,58571.02635902176,16.06553519240877,r,758,325.5,-53.5,1,0,45,1,0,44 +3231113757757078769,77898,325.733258083903,-53.22492350812667,58914.35982132937,20.29165412990203,z,758,325.5,-53.5,1,0,45,1,0,44 +3231113813161102504,73501,325.68451995490835,-53.23844106138672,58607.59868864432,17.078306245780773,i,758,325.5,-53.5,1,0,45,1,0,44 +3231113876562785051,80615,325.6883621527016,-53.217335016453305,59103.29472325393,17.087490362377334,u,758,325.5,-53.5,1,0,45,1,0,44 +3231113912463520459,80265,325.6728387678245,-53.20087944542272,59078.95591802469,15.994882664806733,g,758,325.5,-53.5,1,0,45,1,0,44 +3231113990189102384,83332,325.806178634454,-53.25151252327419,59296.954520776744,16.584078772435372,i,758,325.5,-53.5,1,0,45,1,0,44 +3231114001655010816,80241,325.8384854866551,-53.251942248828286,59077.05614371103,20.776793433480613,g,758,325.5,-53.5,1,0,45,1,0,44 +3231114035819567149,82813,325.8199201450415,-53.24051898696547,59260.81368428733,15.158276283801454,z,758,325.5,-53.5,1,0,45,1,0,44 +3231114039061965013,76615,325.8320648435714,-53.23452343586965,58822.42906461483,19.283680766590116,g,758,325.5,-53.5,1,0,45,1,0,44 +3231114089493178471,77750,325.80139190630376,-53.238026548622614,58904.06170913502,18.238548828182296,g,758,325.5,-53.5,1,0,45,1,0,44 +3231114156921102823,80566,325.8160089215852,-53.21577764277768,59099.87887849765,16.984352449335482,y,758,325.5,-53.5,1,0,45,1,0,44 +3231114210531041435,73117,325.87406037553654,-53.2229732329679,58580.65152577448,16.02230111089344,y,758,325.5,-53.5,1,0,45,1,0,44 +3231114215157783310,76213,325.85697377401203,-53.2223688732311,58795.47422852765,19.847244682021135,y,758,325.5,-53.5,1,0,45,1,0,44 +3231114669925280135,76779,325.7147144297658,-53.18193419068136,58835.448668451994,20.844453212535107,i,758,325.5,-53.5,1,0,45,1,0,44 +3231114987346346906,70930,325.7821106267577,-53.11665838621638,58428.774205853384,16.876557977677468,g,758,325.5,-53.5,1,0,45,1,0,44 +3231115231253879161,84838,325.5494938853333,-53.22227505116596,59400.977536500206,18.80856762577463,r,758,325.5,-53.5,1,0,45,1,0,44 +3231115414793447520,71345,325.6421185318692,-53.18486270631792,58455.47117177463,20.871084540295055,g,758,325.5,-53.5,1,0,45,1,0,44 +3231115856411304788,80595,325.5652424842884,-53.18207656337819,59102.168274689066,19.982744182794026,r,758,325.5,-53.5,1,0,45,1,0,44 +3231115954354983183,73509,325.6008889733441,-53.13192731237795,58608.58615140361,19.234424360921096,y,758,325.5,-53.5,1,0,45,1,0,44 +3231116076622055536,73577,325.5517315586158,-53.117834021390834,58613.43405449034,19.812224734194384,z,758,325.5,-53.5,1,0,45,1,0,44 +3231116113956394883,81406,325.5427380485216,-53.110888804613666,59159.785147578135,18.715897575272905,u,758,325.5,-53.5,1,0,45,1,0,44 +3231116212614160795,85909,325.69564545890586,-53.14750400542725,59477.21997929389,17.637010696518203,i,758,325.5,-53.5,1,0,45,1,0,44 +3231116254359598097,75914,325.70054057512334,-53.12879275517909,58776.2230604801,19.048488448702017,u,758,325.5,-53.5,1,0,45,1,0,44 +3231116469187041731,86473,325.71386183365047,-53.09756786923459,59515.46948206408,17.799417561270324,u,758,325.5,-53.5,1,0,45,1,0,44 +3231116590100967224,76420,325.6702368117087,-53.0851004047989,58809.82200202354,15.340516847844349,r,758,325.5,-53.5,1,0,45,1,0,44 +3231116986973170084,81732,325.66046786646825,-53.059093619254995,59184.16446821887,19.015753672778786,y,758,325.5,-53.5,1,0,45,1,0,44 +3231116995897880632,73742,325.6388240938062,-53.065101517763104,58624.29577237071,15.881518980603005,g,758,325.5,-53.5,1,0,45,1,0,44 +3231117304017806752,71138,325.93257425476907,-53.150393493177496,58442.85004388903,17.73823308857657,u,758,325.5,-53.5,1,0,45,1,0,44 +3231117514139034294,74224,325.9379344589995,-53.12844615233486,58659.67471279533,15.910684849670709,u,758,325.5,-53.5,1,0,45,1,0,44 +3231117593669370608,86198,325.9884604643789,-53.09486000402106,59496.45202710757,15.98404539140078,g,758,325.5,-53.5,1,0,45,1,0,44 +3231117674288869554,81402,325.9235966466717,-53.082198344745734,59159.686145530126,17.806549802289886,i,758,325.5,-53.5,1,0,45,1,0,44 +3231117906480755353,81320,325.8544800876428,-53.07643524727416,59152.09623347744,18.278537203692995,i,758,325.5,-53.5,1,0,45,1,0,44 +3231118092253582472,83020,325.86792477015933,-53.070407752894795,59274.661276826824,16.77642379631016,y,758,325.5,-53.5,1,0,45,1,0,44 +3231119485426548163,79622,325.7619634790705,-53.05666198868984,59035.33726574715,20.34119881198327,z,758,325.5,-53.5,1,0,45,1,0,44 diff --git a/tests/data/small_sky_order1/small_sky_order1.csv b/tests/data/raw/small_sky/small_sky.csv similarity index 100% rename from tests/data/small_sky_order1/small_sky_order1.csv rename to tests/data/raw/small_sky/small_sky.csv diff --git a/tests/data/raw/small_sky_no_metadata/catalog_info.json b/tests/data/raw/small_sky_no_metadata/catalog_info.json deleted file mode 100644 index b3fd9a27..00000000 --- a/tests/data/raw/small_sky_no_metadata/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec" -} diff --git a/tests/data/raw/small_sky_no_metadata/properties b/tests/data/raw/small_sky_no_metadata/properties new file mode 100644 index 00000000..dc4cbf0f --- /dev/null +++ b/tests/data/raw/small_sky_no_metadata/properties @@ -0,0 +1,6 @@ +#HATS catalog +obs_collection=small_sky +dataproduct_type=object +hats_nrows=131 +hats_col_ra=ra +hats_col_dec=dec diff --git a/tests/data/raw/small_sky_no_metadata/provenance_info.json b/tests/data/raw/small_sky_no_metadata/provenance_info.json deleted file mode 100644 index 6a07ab42..00000000 --- a/tests/data/raw/small_sky_no_metadata/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev5+g0733afb", - "runtime_args": { - "catalog_name": "small_sky", - "output_path": ".", - "output_artifact_name": "small_sky", - "tmp_dir": "/tmp/user/11115/tmphywoxno9", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky", - "tmp_path": "/tmp/user/11115/tmphywoxno9/small_sky/intermediate", - "epoch": "J2000", - "catalog_type": "object", - "input_path": null, - "input_paths": [ - "small_sky_order1/small_sky_order1.csv" - ], - "input_file_list": [ - "small_sky_order1/small_sky_order1.csv" - ], - "ra_column": "ra", - "dec_column": "dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": -1, - "highest_healpix_order": 7, - "pixel_threshold": 1000000, - "mapping_healpix_order": 7, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky/Norder=0/Dir=0/Npix=11.parquet b/tests/data/small_sky/Norder=0/Dir=0/Npix=11.parquet deleted file mode 100644 index e4aa453a..00000000 Binary files a/tests/data/small_sky/Norder=0/Dir=0/Npix=11.parquet and /dev/null differ diff --git a/tests/data/small_sky/_common_metadata b/tests/data/small_sky/_common_metadata deleted file mode 100644 index 8b9d1c75..00000000 Binary files a/tests/data/small_sky/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky/_metadata b/tests/data/small_sky/_metadata deleted file mode 100644 index 7134c142..00000000 Binary files a/tests/data/small_sky/_metadata and /dev/null differ diff --git a/tests/data/small_sky/catalog_info.json b/tests/data/small_sky/catalog_info.json deleted file mode 100644 index b3fd9a27..00000000 --- a/tests/data/small_sky/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec" -} diff --git a/tests/data/small_sky/dataset/Norder=0/Dir=0/Npix=11.parquet b/tests/data/small_sky/dataset/Norder=0/Dir=0/Npix=11.parquet new file mode 100644 index 00000000..af44a761 Binary files /dev/null and b/tests/data/small_sky/dataset/Norder=0/Dir=0/Npix=11.parquet differ diff --git a/tests/data/small_sky/dataset/_common_metadata b/tests/data/small_sky/dataset/_common_metadata new file mode 100644 index 00000000..b473e52c Binary files /dev/null and b/tests/data/small_sky/dataset/_common_metadata differ diff --git a/tests/data/small_sky/dataset/_metadata b/tests/data/small_sky/dataset/_metadata new file mode 100644 index 00000000..b3372769 Binary files /dev/null and b/tests/data/small_sky/dataset/_metadata differ diff --git a/tests/data/small_sky/partition_info.csv b/tests/data/small_sky/partition_info.csv index 7c5eaac4..bf77935e 100644 --- a/tests/data/small_sky/partition_info.csv +++ b/tests/data/small_sky/partition_info.csv @@ -1,2 +1,2 @@ -Norder,Npix,Dir -0,11,0 +Norder,Npix +0,11 diff --git a/tests/data/small_sky/point_map.fits b/tests/data/small_sky/point_map.fits new file mode 100644 index 00000000..1b6b6291 Binary files /dev/null and b/tests/data/small_sky/point_map.fits differ diff --git a/tests/data/small_sky/properties b/tests/data/small_sky/properties new file mode 100644 index 00000000..9ed22a8e --- /dev/null +++ b/tests/data/small_sky/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky +dataproduct_type=object +hats_nrows=131 +hats_col_ra=ra +hats_col_dec=dec +hats_max_rows=1000000 +hats_order=0 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=17 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky/provenance_info.json b/tests/data/small_sky/provenance_info.json deleted file mode 100644 index 6a07ab42..00000000 --- a/tests/data/small_sky/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev5+g0733afb", - "runtime_args": { - "catalog_name": "small_sky", - "output_path": ".", - "output_artifact_name": "small_sky", - "tmp_dir": "/tmp/user/11115/tmphywoxno9", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky", - "tmp_path": "/tmp/user/11115/tmphywoxno9/small_sky/intermediate", - "epoch": "J2000", - "catalog_type": "object", - "input_path": null, - "input_paths": [ - "small_sky_order1/small_sky_order1.csv" - ], - "input_file_list": [ - "small_sky_order1/small_sky_order1.csv" - ], - "ra_column": "ra", - "dec_column": "dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": -1, - "highest_healpix_order": 7, - "pixel_threshold": 1000000, - "mapping_healpix_order": 7, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_left_xmatch/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_left_xmatch/Norder=0/Dir=0/Npix=4.parquet deleted file mode 100644 index 56fc08e2..00000000 Binary files a/tests/data/small_sky_left_xmatch/Norder=0/Dir=0/Npix=4.parquet and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=44.parquet deleted file mode 100644 index fb1e07a7..00000000 Binary files a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=44.parquet and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=45.parquet deleted file mode 100644 index 0f691583..00000000 Binary files a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=45.parquet and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=46.parquet deleted file mode 100644 index fcef8363..00000000 Binary files a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=46.parquet and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=47.parquet deleted file mode 100644 index 527d15d0..00000000 Binary files a/tests/data/small_sky_left_xmatch/Norder=1/Dir=0/Npix=47.parquet and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/_common_metadata b/tests/data/small_sky_left_xmatch/_common_metadata deleted file mode 100644 index 4cf7a744..00000000 Binary files a/tests/data/small_sky_left_xmatch/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/_metadata b/tests/data/small_sky_left_xmatch/_metadata deleted file mode 100644 index b1a42e8e..00000000 Binary files a/tests/data/small_sky_left_xmatch/_metadata and /dev/null differ diff --git a/tests/data/small_sky_left_xmatch/catalog_info.json b/tests/data/small_sky_left_xmatch/catalog_info.json deleted file mode 100644 index 7a5bec17..00000000 --- a/tests/data/small_sky_left_xmatch/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_left_xmatch", - "catalog_type": "object", - "total_rows": 132, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec" -} diff --git a/tests/data/small_sky_left_xmatch/dataset/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_left_xmatch/dataset/Norder=0/Dir=0/Npix=4.parquet new file mode 100644 index 00000000..489bfd6a Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/Norder=0/Dir=0/Npix=4.parquet differ diff --git a/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet new file mode 100644 index 00000000..8db73883 Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet new file mode 100644 index 00000000..20fd5f89 Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet new file mode 100644 index 00000000..a4c4ce79 Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=47.parquet new file mode 100644 index 00000000..d94822ca Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_left_xmatch/dataset/_common_metadata b/tests/data/small_sky_left_xmatch/dataset/_common_metadata new file mode 100644 index 00000000..b473e52c Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/_common_metadata differ diff --git a/tests/data/small_sky_left_xmatch/dataset/_metadata b/tests/data/small_sky_left_xmatch/dataset/_metadata new file mode 100644 index 00000000..978fe3d5 Binary files /dev/null and b/tests/data/small_sky_left_xmatch/dataset/_metadata differ diff --git a/tests/data/small_sky_left_xmatch/partition_info.csv b/tests/data/small_sky_left_xmatch/partition_info.csv index cb6b0535..04179b4d 100644 --- a/tests/data/small_sky_left_xmatch/partition_info.csv +++ b/tests/data/small_sky_left_xmatch/partition_info.csv @@ -1,6 +1,6 @@ -Norder,Npix,Dir -0,4,0 -1,44,0 -1,45,0 -1,46,0 -1,47,0 +Norder,Npix +0,4 +1,44 +1,45 +1,46 +1,47 diff --git a/tests/data/small_sky_left_xmatch/point_map.fits b/tests/data/small_sky_left_xmatch/point_map.fits new file mode 100644 index 00000000..e85005a5 Binary files /dev/null and b/tests/data/small_sky_left_xmatch/point_map.fits differ diff --git a/tests/data/small_sky_left_xmatch/properties b/tests/data/small_sky_left_xmatch/properties new file mode 100644 index 00000000..7970d8af --- /dev/null +++ b/tests/data/small_sky_left_xmatch/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_left_xmatch +dataproduct_type=object +hats_nrows=132 +hats_col_ra=ra +hats_col_dec=dec +hats_max_rows=100 +hats_order=1 +moc_sky_fraction=0.16667 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=47 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_left_xmatch/provenance_info.json b/tests/data/small_sky_left_xmatch/provenance_info.json deleted file mode 100644 index dc4c5316..00000000 --- a/tests/data/small_sky_left_xmatch/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_left_xmatch", - "catalog_type": "object", - "total_rows": 132, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_left_xmatch", - "output_path": ".", - "output_artifact_name": "small_sky_left_xmatch", - "tmp_dir": "/tmp/user/11115/tmpkxlmq_3u", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_left_xmatch", - "tmp_path": "/tmp/user/11115/tmpkxlmq_3u/small_sky_left_xmatch/intermediate", - "epoch": "J2000", - "catalog_type": "object", - "input_path": null, - "input_paths": [ - "raw/xmatch/small_sky_left_xmatch.csv" - ], - "input_file_list": [ - "raw/xmatch/small_sky_left_xmatch.csv" - ], - "ra_column": "ra", - "dec_column": "dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": -1, - "highest_healpix_order": 7, - "pixel_threshold": 100, - "mapping_healpix_order": 7, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=44.parquet deleted file mode 100644 index fb1e07a7..00000000 Binary files a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=44.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=45.parquet deleted file mode 100644 index 0f691583..00000000 Binary files a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=45.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=46.parquet deleted file mode 100644 index fcef8363..00000000 Binary files a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=46.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=47.parquet deleted file mode 100644 index 527d15d0..00000000 Binary files a/tests/data/small_sky_order1/Norder=1/Dir=0/Npix=47.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1/_common_metadata b/tests/data/small_sky_order1/_common_metadata deleted file mode 100644 index 4cf7a744..00000000 Binary files a/tests/data/small_sky_order1/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1/_metadata b/tests/data/small_sky_order1/_metadata deleted file mode 100644 index 3ec7ff01..00000000 Binary files a/tests/data/small_sky_order1/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1/catalog_info.json b/tests/data/small_sky_order1/catalog_info.json deleted file mode 100644 index a61f882a..00000000 --- a/tests/data/small_sky_order1/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_order1", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec" -} diff --git a/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=44.parquet new file mode 100644 index 00000000..8db73883 Binary files /dev/null and b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=45.parquet new file mode 100644 index 00000000..20fd5f89 Binary files /dev/null and b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=46.parquet new file mode 100644 index 00000000..a4c4ce79 Binary files /dev/null and b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=47.parquet new file mode 100644 index 00000000..d94822ca Binary files /dev/null and b/tests/data/small_sky_order1/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_order1/dataset/_common_metadata b/tests/data/small_sky_order1/dataset/_common_metadata new file mode 100644 index 00000000..b473e52c Binary files /dev/null and b/tests/data/small_sky_order1/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order1/dataset/_metadata b/tests/data/small_sky_order1/dataset/_metadata new file mode 100644 index 00000000..20f6d958 Binary files /dev/null and b/tests/data/small_sky_order1/dataset/_metadata differ diff --git a/tests/data/small_sky_order1/partition_info.csv b/tests/data/small_sky_order1/partition_info.csv index f8dac6dc..5771586c 100644 --- a/tests/data/small_sky_order1/partition_info.csv +++ b/tests/data/small_sky_order1/partition_info.csv @@ -1,5 +1,5 @@ -Norder,Npix,Dir -1,44,0 -1,45,0 -1,46,0 -1,47,0 +Norder,Npix +1,44 +1,45 +1,46 +1,47 diff --git a/tests/data/small_sky_order1/point_map.fits b/tests/data/small_sky_order1/point_map.fits new file mode 100644 index 00000000..c6dd7b1a Binary files /dev/null and b/tests/data/small_sky_order1/point_map.fits differ diff --git a/tests/data/small_sky_order1/properties b/tests/data/small_sky_order1/properties new file mode 100644 index 00000000..976b22f2 --- /dev/null +++ b/tests/data/small_sky_order1/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_order1 +dataproduct_type=object +hats_nrows=131 +hats_col_ra=ra +hats_col_dec=dec +hats_max_rows=1000000 +hats_order=1 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=39 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order1/provenance_info.json b/tests/data/small_sky_order1/provenance_info.json deleted file mode 100644 index b0317e31..00000000 --- a/tests/data/small_sky_order1/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_order1", - "catalog_type": "object", - "total_rows": 131, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev5+g0733afb", - "runtime_args": { - "catalog_name": "small_sky_order1", - "output_path": ".", - "output_artifact_name": "small_sky_order1", - "tmp_dir": "/tmp/user/11115/tmphywoxno9", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order1", - "tmp_path": "/tmp/user/11115/tmphywoxno9/small_sky_order1/intermediate", - "epoch": "J2000", - "catalog_type": "object", - "input_path": null, - "input_paths": [ - "small_sky_order1/small_sky_order1.csv" - ], - "input_file_list": [ - "small_sky_order1/small_sky_order1.csv" - ], - "ra_column": "ra", - "dec_column": "dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": 1, - "highest_healpix_order": 7, - "pixel_threshold": 1000000, - "mapping_healpix_order": 1, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_order1_id_index/_common_metadata b/tests/data/small_sky_order1_id_index/_common_metadata deleted file mode 100644 index b4e35f47..00000000 Binary files a/tests/data/small_sky_order1_id_index/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_id_index/_metadata b/tests/data/small_sky_order1_id_index/_metadata deleted file mode 100644 index 70a5932f..00000000 Binary files a/tests/data/small_sky_order1_id_index/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_id_index/catalog_info.json b/tests/data/small_sky_order1_id_index/catalog_info.json deleted file mode 100644 index 9c26ed14..00000000 --- a/tests/data/small_sky_order1_id_index/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_order1_id_index", - "catalog_type": "index", - "total_rows": 131, - "primary_catalog": "./small_sky_order1", - "indexing_column": "id", - "extra_columns": [] -} diff --git a/tests/data/small_sky_order1_id_index/dataset/_common_metadata b/tests/data/small_sky_order1_id_index/dataset/_common_metadata new file mode 100644 index 00000000..185e41ea Binary files /dev/null and b/tests/data/small_sky_order1_id_index/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order1_id_index/dataset/_metadata b/tests/data/small_sky_order1_id_index/dataset/_metadata new file mode 100644 index 00000000..dd4e8614 Binary files /dev/null and b/tests/data/small_sky_order1_id_index/dataset/_metadata differ diff --git a/tests/data/small_sky_order1_id_index/index/part.0.parquet b/tests/data/small_sky_order1_id_index/dataset/index/part.0.parquet similarity index 70% rename from tests/data/small_sky_order1_id_index/index/part.0.parquet rename to tests/data/small_sky_order1_id_index/dataset/index/part.0.parquet index 05395152..0a4f46bd 100644 Binary files a/tests/data/small_sky_order1_id_index/index/part.0.parquet and b/tests/data/small_sky_order1_id_index/dataset/index/part.0.parquet differ diff --git a/tests/data/small_sky_order1_id_index/properties b/tests/data/small_sky_order1_id_index/properties new file mode 100644 index 00000000..c639cb98 --- /dev/null +++ b/tests/data/small_sky_order1_id_index/properties @@ -0,0 +1,11 @@ +#HATS catalog +obs_collection=small_sky_order1_id_index +dataproduct_type=index +hats_nrows=131 +hats_primary_table_url=./small_sky_order1 +hats_index_column=id +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=3 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order1_id_index/provenance_info.json b/tests/data/small_sky_order1_id_index/provenance_info.json deleted file mode 100644 index 8d5cec1f..00000000 --- a/tests/data/small_sky_order1_id_index/provenance_info.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "catalog_name": "small_sky_order1_id_index", - "catalog_type": "index", - "total_rows": 131, - "primary_catalog": "./small_sky_order1", - "indexing_column": "id", - "extra_columns": [], - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev5+g0733afb", - "runtime_args": { - "catalog_name": "small_sky_order1_id_index", - "output_path": ".", - "output_artifact_name": "small_sky_order1_id_index", - "tmp_dir": "/tmp/user/11115/tmphywoxno9", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order1_id_index", - "tmp_path": "/tmp/user/11115/tmphywoxno9/small_sky_order1_id_index/intermediate", - "input_catalog_path": "./small_sky_order1", - "indexing_column": "id", - "extra_columns": [], - "include_hipscat_index": false, - "include_order_pixel": true - } - } -} diff --git a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=16.parquet b/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=16.parquet deleted file mode 100644 index b7173c7d..00000000 Binary files a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=16.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1_source/_common_metadata b/tests/data/small_sky_order1_source/_common_metadata deleted file mode 100644 index 3f78df69..00000000 Binary files a/tests/data/small_sky_order1_source/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_source/_metadata b/tests/data/small_sky_order1_source/_metadata deleted file mode 100644 index ef9430ea..00000000 Binary files a/tests/data/small_sky_order1_source/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_source/catalog_info.json b/tests/data/small_sky_order1_source/catalog_info.json deleted file mode 100644 index 4923b5df..00000000 --- a/tests/data/small_sky_order1_source/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_order1_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec" -} diff --git a/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=16.parquet b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=16.parquet new file mode 100644 index 00000000..ad0c33b2 Binary files /dev/null and b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=16.parquet differ diff --git a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=44.parquet similarity index 83% rename from tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=44.parquet rename to tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=44.parquet index 38fcd8bc..a5bff161 100644 Binary files a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=44.parquet and b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=45.parquet similarity index 83% rename from tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=45.parquet rename to tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=45.parquet index 4cc684e4..200bc630 100644 Binary files a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=45.parquet and b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=46.parquet similarity index 83% rename from tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=46.parquet rename to tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=46.parquet index b1759181..fcc60293 100644 Binary files a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=46.parquet and b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=47.parquet similarity index 81% rename from tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=47.parquet rename to tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=47.parquet index bb20f73d..ce27aded 100644 Binary files a/tests/data/small_sky_order1_source/Norder=1/Dir=0/Npix=47.parquet and b/tests/data/small_sky_order1_source/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_order1_source/dataset/_common_metadata b/tests/data/small_sky_order1_source/dataset/_common_metadata new file mode 100644 index 00000000..2aa9b2e5 Binary files /dev/null and b/tests/data/small_sky_order1_source/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order1_source/dataset/_metadata b/tests/data/small_sky_order1_source/dataset/_metadata new file mode 100644 index 00000000..ae4d03e3 Binary files /dev/null and b/tests/data/small_sky_order1_source/dataset/_metadata differ diff --git a/tests/data/small_sky_order1_source/partition_info.csv b/tests/data/small_sky_order1_source/partition_info.csv index 9245d30b..994e67ad 100644 --- a/tests/data/small_sky_order1_source/partition_info.csv +++ b/tests/data/small_sky_order1_source/partition_info.csv @@ -1,6 +1,6 @@ -Norder,Npix,Dir -1,16,0 -1,44,0 -1,45,0 -1,46,0 -1,47,0 +Norder,Npix +1,16 +1,44 +1,45 +1,46 +1,47 diff --git a/tests/data/small_sky_order1_source/point_map.fits b/tests/data/small_sky_order1_source/point_map.fits new file mode 100644 index 00000000..66f59340 Binary files /dev/null and b/tests/data/small_sky_order1_source/point_map.fits differ diff --git a/tests/data/small_sky_order1_source/properties b/tests/data/small_sky_order1_source/properties new file mode 100644 index 00000000..78322a00 --- /dev/null +++ b/tests/data/small_sky_order1_source/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_order1_source +dataproduct_type=source +hats_nrows=17161 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_max_rows=1000000 +hats_order=1 +moc_sky_fraction=0.10417 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=970 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order1_source/provenance_info.json b/tests/data/small_sky_order1_source/provenance_info.json deleted file mode 100644 index f41e5c32..00000000 --- a/tests/data/small_sky_order1_source/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_order1_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "version": "0.2.9.dev2+g014342d", - "generation_date": "2024.03.19", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.6.dev6+gf95440a.d20240318", - "runtime_args": { - "catalog_name": "small_sky_order1_source", - "output_path": ".", - "output_artifact_name": "small_sky_order1_source", - "tmp_dir": "/tmp/user/11115/tmp5796xcj5", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order1_source", - "tmp_path": "/tmp/user/11115/tmp5796xcj5/small_sky_order1_source/intermediate", - "epoch": "J2000", - "catalog_type": "source", - "input_path": null, - "input_paths": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "input_file_list": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "ra_column": "source_ra", - "dec_column": "source_dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": 1, - "lowest_healpix_order": 0, - "highest_healpix_order": 7, - "pixel_threshold": 1000000, - "mapping_healpix_order": 1, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "schema_file": null, - "column_names": null, - "parquet_kwargs": null, - "kwargs": {} - } - } - } -} diff --git a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=16.parquet b/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=16.parquet deleted file mode 100644 index 14f45970..00000000 Binary files a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=16.parquet and /dev/null differ diff --git a/tests/data/small_sky_order1_source_margin/_common_metadata b/tests/data/small_sky_order1_source_margin/_common_metadata deleted file mode 100644 index 6fd175d8..00000000 Binary files a/tests/data/small_sky_order1_source_margin/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_source_margin/_metadata b/tests/data/small_sky_order1_source_margin/_metadata deleted file mode 100644 index ee6636a0..00000000 Binary files a/tests/data/small_sky_order1_source_margin/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order1_source_margin/catalog_info.json b/tests/data/small_sky_order1_source_margin/catalog_info.json deleted file mode 100644 index 1ea28b1c..00000000 --- a/tests/data/small_sky_order1_source_margin/catalog_info.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "catalog_name": "small_sky_order1_source_margin", - "catalog_type": "margin", - "total_rows": 3948, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "primary_catalog": "small_sky_order1_source", - "margin_threshold": 7200 -} diff --git a/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=16.parquet b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=16.parquet new file mode 100644 index 00000000..e4c7654d Binary files /dev/null and b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=16.parquet differ diff --git a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=44.parquet similarity index 77% rename from tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=44.parquet rename to tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=44.parquet index 8c16d7b8..562fc245 100644 Binary files a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=44.parquet and b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=45.parquet similarity index 77% rename from tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=45.parquet rename to tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=45.parquet index d8dfc3cc..efeeccc7 100644 Binary files a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=45.parquet and b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=46.parquet similarity index 73% rename from tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=46.parquet rename to tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=46.parquet index 3b7278ce..26672953 100644 Binary files a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=46.parquet and b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet similarity index 72% rename from tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=47.parquet rename to tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet index 9cebc8d7..cc86ccef 100644 Binary files a/tests/data/small_sky_order1_source_margin/Norder=1/Dir=0/Npix=47.parquet and b/tests/data/small_sky_order1_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_order1_source_margin/dataset/_common_metadata b/tests/data/small_sky_order1_source_margin/dataset/_common_metadata new file mode 100644 index 00000000..a4ec06ac Binary files /dev/null and b/tests/data/small_sky_order1_source_margin/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order1_source_margin/dataset/_metadata b/tests/data/small_sky_order1_source_margin/dataset/_metadata new file mode 100644 index 00000000..98925ad7 Binary files /dev/null and b/tests/data/small_sky_order1_source_margin/dataset/_metadata differ diff --git a/tests/data/small_sky_order1_source_margin/partition_info.csv b/tests/data/small_sky_order1_source_margin/partition_info.csv index 9245d30b..994e67ad 100644 --- a/tests/data/small_sky_order1_source_margin/partition_info.csv +++ b/tests/data/small_sky_order1_source_margin/partition_info.csv @@ -1,6 +1,6 @@ -Norder,Npix,Dir -1,16,0 -1,44,0 -1,45,0 -1,46,0 -1,47,0 +Norder,Npix +1,16 +1,44 +1,45 +1,46 +1,47 diff --git a/tests/data/small_sky_order1_source_margin/properties b/tests/data/small_sky_order1_source_margin/properties new file mode 100644 index 00000000..d7fd5582 --- /dev/null +++ b/tests/data/small_sky_order1_source_margin/properties @@ -0,0 +1,15 @@ +#HATS catalog +obs_collection=small_sky_order1_source_margin +dataproduct_type=margin +hats_nrows=3948 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_primary_table_url=small_sky_order1_source +hats_margin_threshold=7200.0 +hats_order=1 +moc_sky_fraction=0.10417 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=279 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order1_source_margin/provenance_info.json b/tests/data/small_sky_order1_source_margin/provenance_info.json deleted file mode 100644 index 20f315fd..00000000 --- a/tests/data/small_sky_order1_source_margin/provenance_info.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "catalog_name": "small_sky_order1_source_margin", - "catalog_type": "margin", - "total_rows": 3948, - "primary_catalog": "small_sky_order1_source", - "margin_threshold": 7200, - "version": "0.2.9.dev2+g014342d", - "generation_date": "2024.03.19", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.6.dev6+gf95440a.d20240318", - "runtime_args": { - "catalog_name": "small_sky_order1_source_margin", - "output_path": ".", - "output_artifact_name": "small_sky_order1_source_margin", - "tmp_dir": "/tmp/user/11115/tmp7mnrek44", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order1_source_margin", - "tmp_path": "/tmp/user/11115/tmp7mnrek44/small_sky_order1_source_margin/intermediate", - "input_catalog_path": "small_sky_order1_source", - "margin_threshold": 7200, - "margin_order": 4 - } - } -} diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=264.parquet b/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=264.parquet deleted file mode 100644 index e9e9ab5a..00000000 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=264.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source/_common_metadata b/tests/data/small_sky_order3_source/_common_metadata deleted file mode 100644 index 5d6359eb..00000000 Binary files a/tests/data/small_sky_order3_source/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order3_source/_metadata b/tests/data/small_sky_order3_source/_metadata deleted file mode 100644 index 593caed2..00000000 Binary files a/tests/data/small_sky_order3_source/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order3_source/catalog_info.json b/tests/data/small_sky_order3_source/catalog_info.json deleted file mode 100644 index e51c0c29..00000000 --- a/tests/data/small_sky_order3_source/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_order3_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec" -} diff --git a/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=264.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=264.parquet new file mode 100644 index 00000000..0b3e7f0e Binary files /dev/null and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=264.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=707.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=707.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=707.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=707.parquet index a4977976..8c1fd729 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=707.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=707.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=708.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=708.parquet similarity index 63% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=708.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=708.parquet index 21057576..33a253f8 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=708.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=708.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=709.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=709.parquet similarity index 74% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=709.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=709.parquet index 90038c5d..522f34fd 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=709.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=709.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=710.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=710.parquet similarity index 66% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=710.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=710.parquet index d1473bda..3de3bde0 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=710.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=710.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=711.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=711.parquet similarity index 63% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=711.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=711.parquet index bd468933..02b8b90a 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=711.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=711.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=712.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=712.parquet similarity index 63% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=712.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=712.parquet index ab0532b9..4fa777a6 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=712.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=712.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=713.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=713.parquet similarity index 67% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=713.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=713.parquet index b6e228b9..c06396d7 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=713.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=713.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=714.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=714.parquet similarity index 55% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=714.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=714.parquet index 7662498c..9847805c 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=714.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=714.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=715.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=715.parquet similarity index 76% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=715.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=715.parquet index 1f8ae6c6..45092c47 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=715.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=715.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=716.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=716.parquet similarity index 67% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=716.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=716.parquet index c8259aa5..aad33f38 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=716.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=716.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=717.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=717.parquet similarity index 70% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=717.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=717.parquet index ae239cac..447bf6e5 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=717.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=717.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=718.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=718.parquet similarity index 76% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=718.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=718.parquet index b997223e..7cb1df5e 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=718.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=718.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=719.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=719.parquet similarity index 56% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=719.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=719.parquet index dc823f81..3936cfba 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=719.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=719.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=720.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=720.parquet similarity index 64% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=720.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=720.parquet index 78b45ed6..40bed8ec 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=720.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=720.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=723.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=723.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=723.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=723.parquet index 9d40eea1..c9345d4b 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=723.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=723.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=724.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=724.parquet similarity index 55% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=724.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=724.parquet index 0fc446ee..fc3b2550 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=724.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=724.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=726.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=726.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=726.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=726.parquet index 01a79d6b..2e1e1cf6 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=726.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=726.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=727.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=727.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=727.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=727.parquet index d32cf4cb..b061f9a0 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=727.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=727.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=728.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=728.parquet similarity index 75% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=728.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=728.parquet index a3b70329..64d3a6ad 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=728.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=728.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=729.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=729.parquet similarity index 55% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=729.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=729.parquet index c2aac2aa..92e045de 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=729.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=729.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=730.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=730.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=730.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=730.parquet index 02607770..798b2e51 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=730.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=730.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=732.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=732.parquet similarity index 74% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=732.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=732.parquet index a365e798..cdd444a7 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=732.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=732.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=733.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=733.parquet similarity index 50% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=733.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=733.parquet index 366ff44f..2da73347 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=733.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=733.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=734.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=734.parquet similarity index 63% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=734.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=734.parquet index 7dfbc66a..bcdfd2ad 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=734.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=734.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=735.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=735.parquet similarity index 55% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=735.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=735.parquet index 2f64ffdc..6c5d308b 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=735.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=735.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=736.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=736.parquet similarity index 63% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=736.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=736.parquet index 991491a1..1a5deec4 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=736.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=736.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=737.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=737.parquet similarity index 72% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=737.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=737.parquet index 34f1bcdf..94f5cd95 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=737.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=737.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=738.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=738.parquet similarity index 55% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=738.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=738.parquet index 48b4c810..7ca9131b 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=738.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=738.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=739.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=739.parquet similarity index 70% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=739.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=739.parquet index e3692f5d..c8ef906c 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=739.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=739.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=740.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=740.parquet similarity index 74% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=740.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=740.parquet index 392c7544..263405e3 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=740.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=740.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=741.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=741.parquet similarity index 75% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=741.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=741.parquet index fcd858c3..5456bb4f 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=741.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=741.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=742.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=742.parquet similarity index 74% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=742.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=742.parquet index 8620cdb3..9e1787d7 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=742.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=742.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=743.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=743.parquet similarity index 77% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=743.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=743.parquet index b7f25d5d..a9bfd514 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=743.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=743.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=745.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=745.parquet similarity index 60% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=745.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=745.parquet index a177a2ed..07175550 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=745.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=745.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=747.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=747.parquet similarity index 64% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=747.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=747.parquet index e0555795..6788da87 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=747.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=747.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=748.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=748.parquet similarity index 65% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=748.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=748.parquet index 285d898b..5e5f42cd 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=748.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=748.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=750.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=750.parquet similarity index 68% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=750.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=750.parquet index bd780352..3e0a9eea 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=750.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=750.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=752.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=752.parquet similarity index 78% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=752.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=752.parquet index 91b9ff7d..bd4eba8c 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=752.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=752.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=753.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=753.parquet similarity index 64% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=753.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=753.parquet index fbe8b1ac..a3cc7e42 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=753.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=753.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=754.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=754.parquet similarity index 75% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=754.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=754.parquet index 3fd53664..ea5dd968 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=754.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=754.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=755.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=755.parquet similarity index 57% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=755.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=755.parquet index 1d347762..a5538411 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=755.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=755.parquet differ diff --git a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=760.parquet b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=760.parquet similarity index 59% rename from tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=760.parquet rename to tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=760.parquet index 5bbe41ed..4c1b2113 100644 Binary files a/tests/data/small_sky_order3_source/Norder=3/Dir=0/Npix=760.parquet and b/tests/data/small_sky_order3_source/dataset/Norder=3/Dir=0/Npix=760.parquet differ diff --git a/tests/data/small_sky_order3_source/dataset/_common_metadata b/tests/data/small_sky_order3_source/dataset/_common_metadata new file mode 100644 index 00000000..2aa9b2e5 Binary files /dev/null and b/tests/data/small_sky_order3_source/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order3_source/dataset/_metadata b/tests/data/small_sky_order3_source/dataset/_metadata new file mode 100644 index 00000000..1c4ddcdb Binary files /dev/null and b/tests/data/small_sky_order3_source/dataset/_metadata differ diff --git a/tests/data/small_sky_order3_source/partition_info.csv b/tests/data/small_sky_order3_source/partition_info.csv index 21091ba3..fb8323cb 100644 --- a/tests/data/small_sky_order3_source/partition_info.csv +++ b/tests/data/small_sky_order3_source/partition_info.csv @@ -1,44 +1,44 @@ -Norder,Npix,Dir -3,264,0 -3,707,0 -3,708,0 -3,709,0 -3,710,0 -3,711,0 -3,712,0 -3,713,0 -3,714,0 -3,715,0 -3,716,0 -3,717,0 -3,718,0 -3,719,0 -3,720,0 -3,723,0 -3,724,0 -3,726,0 -3,727,0 -3,728,0 -3,729,0 -3,730,0 -3,732,0 -3,733,0 -3,734,0 -3,735,0 -3,736,0 -3,737,0 -3,738,0 -3,739,0 -3,740,0 -3,741,0 -3,742,0 -3,743,0 -3,745,0 -3,747,0 -3,748,0 -3,750,0 -3,752,0 -3,753,0 -3,754,0 -3,755,0 -3,760,0 +Norder,Npix +3,264 +3,707 +3,708 +3,709 +3,710 +3,711 +3,712 +3,713 +3,714 +3,715 +3,716 +3,717 +3,718 +3,719 +3,720 +3,723 +3,724 +3,726 +3,727 +3,728 +3,729 +3,730 +3,732 +3,733 +3,734 +3,735 +3,736 +3,737 +3,738 +3,739 +3,740 +3,741 +3,742 +3,743 +3,745 +3,747 +3,748 +3,750 +3,752 +3,753 +3,754 +3,755 +3,760 diff --git a/tests/data/small_sky_order3_source/point_map.fits b/tests/data/small_sky_order3_source/point_map.fits new file mode 100644 index 00000000..98f611ac Binary files /dev/null and b/tests/data/small_sky_order3_source/point_map.fits differ diff --git a/tests/data/small_sky_order3_source/properties b/tests/data/small_sky_order3_source/properties new file mode 100644 index 00000000..e843edd8 --- /dev/null +++ b/tests/data/small_sky_order3_source/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_order3_source +dataproduct_type=source +hats_nrows=17161 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_max_rows=1000000 +hats_order=3 +moc_sky_fraction=0.05599 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=1336 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order3_source/provenance_info.json b/tests/data/small_sky_order3_source/provenance_info.json deleted file mode 100644 index 53988eef..00000000 --- a/tests/data/small_sky_order3_source/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_order3_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.08", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev8+g9d0bfc4", - "runtime_args": { - "catalog_name": "small_sky_order3_source", - "output_path": ".", - "output_artifact_name": "small_sky_order3_source", - "tmp_dir": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpuqum4py3", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order3_source", - "tmp_path": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpuqum4py3/small_sky_order3_source/intermediate", - "epoch": "J2000", - "catalog_type": "source", - "input_path": null, - "input_paths": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "input_file_list": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "ra_column": "source_ra", - "dec_column": "source_dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": 3, - "highest_healpix_order": 7, - "pixel_threshold": 1000000, - "mapping_healpix_order": 3, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_order3_source_margin/Norder=2/Dir=0/Npix=189.parquet b/tests/data/small_sky_order3_source_margin/Norder=2/Dir=0/Npix=189.parquet deleted file mode 100644 index 8330c3df..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=2/Dir=0/Npix=189.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=264.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=264.parquet deleted file mode 100644 index 4d41cddc..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=264.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=707.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=707.parquet deleted file mode 100644 index 49403e4e..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=707.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=708.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=708.parquet deleted file mode 100644 index b94fd1fc..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=708.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=709.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=709.parquet deleted file mode 100644 index f8f4666a..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=709.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=710.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=710.parquet deleted file mode 100644 index 468478b3..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=710.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=713.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=713.parquet deleted file mode 100644 index 3f625c89..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=713.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=715.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=715.parquet deleted file mode 100644 index aade981a..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=715.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=716.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=716.parquet deleted file mode 100644 index 78efb13e..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=716.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=717.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=717.parquet deleted file mode 100644 index ebaf16a7..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=717.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=718.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=718.parquet deleted file mode 100644 index c4cb1f40..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=718.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=719.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=719.parquet deleted file mode 100644 index c905563e..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=719.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=726.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=726.parquet deleted file mode 100644 index a4276a91..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=726.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=728.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=728.parquet deleted file mode 100644 index f37bcd5e..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=728.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=729.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=729.parquet deleted file mode 100644 index 73e36a81..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=729.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=730.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=730.parquet deleted file mode 100644 index ff7a6268..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=730.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=732.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=732.parquet deleted file mode 100644 index dd2ac86a..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=732.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=733.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=733.parquet deleted file mode 100644 index a94b0da2..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=733.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=734.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=734.parquet deleted file mode 100644 index 4f4a2384..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=734.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=739.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=739.parquet deleted file mode 100644 index 351be5c2..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=739.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=740.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=740.parquet deleted file mode 100644 index c8e3d62d..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=740.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=741.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=741.parquet deleted file mode 100644 index 1f9da088..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=741.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=742.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=742.parquet deleted file mode 100644 index 35fe7c3c..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=742.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=743.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=743.parquet deleted file mode 100644 index 5869992d..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=743.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=745.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=745.parquet deleted file mode 100644 index 7690b434..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=745.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=747.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=747.parquet deleted file mode 100644 index 5cfbede4..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=747.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=748.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=748.parquet deleted file mode 100644 index 4ee34f14..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=748.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=750.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=750.parquet deleted file mode 100644 index 8ab22eb8..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=750.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=752.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=752.parquet deleted file mode 100644 index 07e23006..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=752.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=753.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=753.parquet deleted file mode 100644 index 14cacf36..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=753.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=754.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=754.parquet deleted file mode 100644 index 03462ea9..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=754.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=755.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=755.parquet deleted file mode 100644 index 97b07a13..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=755.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=760.parquet b/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=760.parquet deleted file mode 100644 index 6f9cb8f3..00000000 Binary files a/tests/data/small_sky_order3_source_margin/Norder=3/Dir=0/Npix=760.parquet and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/_common_metadata b/tests/data/small_sky_order3_source_margin/_common_metadata deleted file mode 100644 index 340931ce..00000000 Binary files a/tests/data/small_sky_order3_source_margin/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/_metadata b/tests/data/small_sky_order3_source_margin/_metadata deleted file mode 100644 index 9178e54b..00000000 Binary files a/tests/data/small_sky_order3_source_margin/_metadata and /dev/null differ diff --git a/tests/data/small_sky_order3_source_margin/catalog_info.json b/tests/data/small_sky_order3_source_margin/catalog_info.json deleted file mode 100644 index eee2ea33..00000000 --- a/tests/data/small_sky_order3_source_margin/catalog_info.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "catalog_name": "small_sky_order3_source_margin", - "catalog_type": "margin", - "total_rows": 1025, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "primary_catalog": "small_sky_order3_source", - "margin_threshold": 300 -} diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=2/Dir=0/Npix=189.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=2/Dir=0/Npix=189.parquet new file mode 100644 index 00000000..2442bfc7 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=2/Dir=0/Npix=189.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=264.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=264.parquet new file mode 100644 index 00000000..48dfa590 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=264.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=707.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=707.parquet new file mode 100644 index 00000000..2e61a2aa Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=707.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=708.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=708.parquet new file mode 100644 index 00000000..2a027d10 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=708.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=709.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=709.parquet new file mode 100644 index 00000000..f40b28a1 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=709.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=710.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=710.parquet new file mode 100644 index 00000000..cbae9072 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=710.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=713.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=713.parquet new file mode 100644 index 00000000..8c4cc59a Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=713.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=715.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=715.parquet new file mode 100644 index 00000000..77e3c592 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=715.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=716.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=716.parquet new file mode 100644 index 00000000..d861295c Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=716.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=717.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=717.parquet new file mode 100644 index 00000000..1751ad85 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=717.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=718.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=718.parquet new file mode 100644 index 00000000..1c9cf4e6 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=718.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=719.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=719.parquet new file mode 100644 index 00000000..9804a73c Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=719.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=726.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=726.parquet new file mode 100644 index 00000000..70351a35 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=726.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=728.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=728.parquet new file mode 100644 index 00000000..47064b60 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=728.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=729.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=729.parquet new file mode 100644 index 00000000..0ae1340b Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=729.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=730.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=730.parquet new file mode 100644 index 00000000..40c5f708 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=730.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=732.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=732.parquet new file mode 100644 index 00000000..40ef7c1c Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=732.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=733.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=733.parquet new file mode 100644 index 00000000..425fdde7 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=733.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=734.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=734.parquet new file mode 100644 index 00000000..95cdf175 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=734.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=739.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=739.parquet new file mode 100644 index 00000000..74886140 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=739.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=740.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=740.parquet new file mode 100644 index 00000000..5d87018e Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=740.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=741.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=741.parquet new file mode 100644 index 00000000..ccb55acd Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=741.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=742.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=742.parquet new file mode 100644 index 00000000..9eb6e50c Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=742.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=743.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=743.parquet new file mode 100644 index 00000000..49839905 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=743.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=745.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=745.parquet new file mode 100644 index 00000000..6a47f1fe Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=745.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=747.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=747.parquet new file mode 100644 index 00000000..4a86e559 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=747.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=748.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=748.parquet new file mode 100644 index 00000000..f3240776 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=748.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=750.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=750.parquet new file mode 100644 index 00000000..a9d9cc54 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=750.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=752.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=752.parquet new file mode 100644 index 00000000..71edd923 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=752.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=753.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=753.parquet new file mode 100644 index 00000000..e2002e37 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=753.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=754.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=754.parquet new file mode 100644 index 00000000..f3bac5f6 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=754.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=755.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=755.parquet new file mode 100644 index 00000000..4a96433d Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=755.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=760.parquet b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=760.parquet new file mode 100644 index 00000000..fe02123b Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/Norder=3/Dir=0/Npix=760.parquet differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/_common_metadata b/tests/data/small_sky_order3_source_margin/dataset/_common_metadata new file mode 100644 index 00000000..a4ec06ac Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/_common_metadata differ diff --git a/tests/data/small_sky_order3_source_margin/dataset/_metadata b/tests/data/small_sky_order3_source_margin/dataset/_metadata new file mode 100644 index 00000000..a79b8e90 Binary files /dev/null and b/tests/data/small_sky_order3_source_margin/dataset/_metadata differ diff --git a/tests/data/small_sky_order3_source_margin/partition_info.csv b/tests/data/small_sky_order3_source_margin/partition_info.csv index 9f79990e..ba0c301d 100644 --- a/tests/data/small_sky_order3_source_margin/partition_info.csv +++ b/tests/data/small_sky_order3_source_margin/partition_info.csv @@ -1,34 +1,34 @@ -Norder,Npix,Dir -3,264,0 -3,707,0 -3,708,0 -3,709,0 -3,710,0 -3,713,0 -3,715,0 -3,716,0 -3,717,0 -3,718,0 -3,719,0 -3,726,0 -3,728,0 -3,729,0 -3,730,0 -3,732,0 -3,733,0 -3,734,0 -3,739,0 -3,740,0 -3,741,0 -3,742,0 -3,743,0 -3,745,0 -3,747,0 -3,748,0 -3,750,0 -3,752,0 -3,753,0 -3,754,0 -3,755,0 -2,189,0 -3,760,0 +Norder,Npix +3,264 +3,707 +3,708 +3,709 +3,710 +3,713 +3,715 +3,716 +3,717 +3,718 +3,719 +3,726 +3,728 +3,729 +3,730 +3,732 +3,733 +3,734 +3,739 +3,740 +3,741 +3,742 +3,743 +3,745 +3,747 +3,748 +3,750 +3,752 +3,753 +3,754 +3,755 +2,189 +3,760 diff --git a/tests/data/small_sky_order3_source_margin/properties b/tests/data/small_sky_order3_source_margin/properties new file mode 100644 index 00000000..32dc97b5 --- /dev/null +++ b/tests/data/small_sky_order3_source_margin/properties @@ -0,0 +1,15 @@ +#HATS catalog +obs_collection=small_sky_order3_source_margin +dataproduct_type=margin +hats_nrows=1025 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_primary_table_url=small_sky_order3_source +hats_margin_threshold=300.0 +hats_order=3 +moc_sky_fraction=0.04687 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=477 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_order3_source_margin/provenance_info.json b/tests/data/small_sky_order3_source_margin/provenance_info.json deleted file mode 100644 index 62211d14..00000000 --- a/tests/data/small_sky_order3_source_margin/provenance_info.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "catalog_name": "small_sky_order3_source_margin", - "catalog_type": "margin", - "total_rows": 1025, - "primary_catalog": "small_sky_order3_source", - "margin_threshold": 300, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.08", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev8+g9d0bfc4", - "runtime_args": { - "catalog_name": "small_sky_order3_source_margin", - "output_path": ".", - "output_artifact_name": "small_sky_order3_source_margin", - "tmp_dir": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpuqum4py3", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_order3_source_margin", - "tmp_path": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpuqum4py3/small_sky_order3_source_margin/intermediate", - "input_catalog_path": "small_sky_order3_source", - "margin_threshold": 300, - "margin_order": 7 - } - } -} diff --git a/tests/data/small_sky_source/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_source/Norder=0/Dir=0/Npix=4.parquet deleted file mode 100644 index b30f05ed..00000000 Binary files a/tests/data/small_sky_source/Norder=0/Dir=0/Npix=4.parquet and /dev/null differ diff --git a/tests/data/small_sky_source/_common_metadata b/tests/data/small_sky_source/_common_metadata deleted file mode 100644 index 5d6359eb..00000000 Binary files a/tests/data/small_sky_source/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_source/_metadata b/tests/data/small_sky_source/_metadata deleted file mode 100644 index ab2d06bb..00000000 Binary files a/tests/data/small_sky_source/_metadata and /dev/null differ diff --git a/tests/data/small_sky_source/catalog_info.json b/tests/data/small_sky_source/catalog_info.json deleted file mode 100644 index 97e68711..00000000 --- a/tests/data/small_sky_source/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec" -} diff --git a/tests/data/small_sky_source/dataset/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_source/dataset/Norder=0/Dir=0/Npix=4.parquet new file mode 100644 index 00000000..e52f7e2e Binary files /dev/null and b/tests/data/small_sky_source/dataset/Norder=0/Dir=0/Npix=4.parquet differ diff --git a/tests/data/small_sky_source/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_source/dataset/Norder=1/Dir=0/Npix=47.parquet similarity index 81% rename from tests/data/small_sky_source/Norder=1/Dir=0/Npix=47.parquet rename to tests/data/small_sky_source/dataset/Norder=1/Dir=0/Npix=47.parquet index 62081204..ce27aded 100644 Binary files a/tests/data/small_sky_source/Norder=1/Dir=0/Npix=47.parquet and b/tests/data/small_sky_source/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=176.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=176.parquet similarity index 68% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=176.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=176.parquet index 822eb36a..b2503107 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=176.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=176.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=177.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=177.parquet similarity index 79% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=177.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=177.parquet index 1b94613b..c49db625 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=177.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=177.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=178.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=178.parquet similarity index 80% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=178.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=178.parquet index 96832d80..fc6d65db 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=178.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=178.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=179.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=179.parquet similarity index 80% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=179.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=179.parquet index 8c875905..a8a6fea2 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=179.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=179.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=180.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=180.parquet similarity index 74% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=180.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=180.parquet index 69aa9f7b..fb92ec4c 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=180.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=180.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=181.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=181.parquet similarity index 76% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=181.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=181.parquet index b783a0a9..a124074a 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=181.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=181.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=182.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=182.parquet similarity index 78% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=182.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=182.parquet index 325a75f1..7693c764 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=182.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=182.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=183.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=183.parquet similarity index 78% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=183.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=183.parquet index d28c219d..d53d7d38 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=183.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=183.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=184.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=184.parquet similarity index 79% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=184.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=184.parquet index 4b87714c..df02fae2 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=184.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=184.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=185.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=185.parquet similarity index 82% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=185.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=185.parquet index b3576459..d112aca5 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=185.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=185.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=186.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=186.parquet similarity index 70% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=186.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=186.parquet index d769ab8d..3964dc93 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=186.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=186.parquet differ diff --git a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=187.parquet b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=187.parquet similarity index 74% rename from tests/data/small_sky_source/Norder=2/Dir=0/Npix=187.parquet rename to tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=187.parquet index e8f52446..d1ef8c78 100644 Binary files a/tests/data/small_sky_source/Norder=2/Dir=0/Npix=187.parquet and b/tests/data/small_sky_source/dataset/Norder=2/Dir=0/Npix=187.parquet differ diff --git a/tests/data/small_sky_source/dataset/_common_metadata b/tests/data/small_sky_source/dataset/_common_metadata new file mode 100644 index 00000000..2aa9b2e5 Binary files /dev/null and b/tests/data/small_sky_source/dataset/_common_metadata differ diff --git a/tests/data/small_sky_source/dataset/_metadata b/tests/data/small_sky_source/dataset/_metadata new file mode 100644 index 00000000..e0c0930c Binary files /dev/null and b/tests/data/small_sky_source/dataset/_metadata differ diff --git a/tests/data/small_sky_source/partition_info.csv b/tests/data/small_sky_source/partition_info.csv index 3a67166b..02b94f10 100644 --- a/tests/data/small_sky_source/partition_info.csv +++ b/tests/data/small_sky_source/partition_info.csv @@ -1,15 +1,15 @@ -Norder,Npix,Dir -0,4,0 -1,47,0 -2,176,0 -2,177,0 -2,178,0 -2,179,0 -2,180,0 -2,181,0 -2,182,0 -2,183,0 -2,184,0 -2,185,0 -2,186,0 -2,187,0 +Norder,Npix +0,4 +1,47 +2,176 +2,177 +2,178 +2,179 +2,180 +2,181 +2,182 +2,183 +2,184 +2,185 +2,186 +2,187 diff --git a/tests/data/small_sky_source/point_map.fits b/tests/data/small_sky_source/point_map.fits new file mode 100644 index 00000000..0aafa48a Binary files /dev/null and b/tests/data/small_sky_source/point_map.fits differ diff --git a/tests/data/small_sky_source/properties b/tests/data/small_sky_source/properties new file mode 100644 index 00000000..38156a25 --- /dev/null +++ b/tests/data/small_sky_source/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_source +dataproduct_type=source +hats_nrows=17161 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_max_rows=3000 +hats_order=2 +moc_sky_fraction=0.16667 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=1047 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_source/provenance_info.json b/tests/data/small_sky_source/provenance_info.json deleted file mode 100644 index 4424f019..00000000 --- a/tests/data/small_sky_source/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_source", - "catalog_type": "source", - "total_rows": 17161, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "version": "0.2.8", - "generation_date": "2024.03.15", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev8+g9d0bfc4", - "runtime_args": { - "catalog_name": "small_sky_source", - "output_path": ".", - "output_artifact_name": "small_sky_source", - "tmp_dir": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpax37bk_h", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_source", - "tmp_path": "/var/folders/x4/rmzh8l_s0zxc74nwr72z12340000gn/T/tmpax37bk_h/small_sky_source/intermediate", - "epoch": "J2000", - "catalog_type": "source", - "input_path": null, - "input_paths": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "input_file_list": [ - "raw/small_sky_source/small_sky_source.csv" - ], - "ra_column": "source_ra", - "dec_column": "source_dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": -1, - "highest_healpix_order": 2, - "pixel_threshold": 3000, - "mapping_healpix_order": 2, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_source_margin/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_source_margin/Norder=0/Dir=0/Npix=4.parquet deleted file mode 100644 index b215d052..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=0/Dir=0/Npix=4.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_source_margin/Norder=1/Dir=0/Npix=47.parquet deleted file mode 100644 index d1fade9f..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=1/Dir=0/Npix=47.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=176.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=176.parquet deleted file mode 100644 index bdf00b6b..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=176.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=177.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=177.parquet deleted file mode 100644 index 724ef9d4..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=177.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=178.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=178.parquet deleted file mode 100644 index dcf3cb35..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=178.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=179.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=179.parquet deleted file mode 100644 index 6ba80809..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=179.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=181.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=181.parquet deleted file mode 100644 index 0603070e..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=181.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=182.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=182.parquet deleted file mode 100644 index c15c4721..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=182.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=183.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=183.parquet deleted file mode 100644 index 42b85b11..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=183.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=184.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=184.parquet deleted file mode 100644 index decbfdbf..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=184.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=185.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=185.parquet deleted file mode 100644 index c0e39431..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=185.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=186.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=186.parquet deleted file mode 100644 index b4c00cda..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=186.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=187.parquet b/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=187.parquet deleted file mode 100644 index 4d0aec21..00000000 Binary files a/tests/data/small_sky_source_margin/Norder=2/Dir=0/Npix=187.parquet and /dev/null differ diff --git a/tests/data/small_sky_source_margin/_common_metadata b/tests/data/small_sky_source_margin/_common_metadata deleted file mode 100644 index 6fd175d8..00000000 Binary files a/tests/data/small_sky_source_margin/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_source_margin/_metadata b/tests/data/small_sky_source_margin/_metadata deleted file mode 100644 index f8c73472..00000000 Binary files a/tests/data/small_sky_source_margin/_metadata and /dev/null differ diff --git a/tests/data/small_sky_source_margin/catalog_info.json b/tests/data/small_sky_source_margin/catalog_info.json deleted file mode 100644 index a20f2c75..00000000 --- a/tests/data/small_sky_source_margin/catalog_info.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "catalog_name": "small_sky_source_margin", - "catalog_type": "margin", - "total_rows": 395, - "epoch": "J2000", - "ra_column": "source_ra", - "dec_column": "source_dec", - "primary_catalog": "../../../hipscat-import/tests/hipscat_import/data/small_sky_source_catalog", - "margin_threshold": 180 -} diff --git a/tests/data/small_sky_source_margin/dataset/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_source_margin/dataset/Norder=0/Dir=0/Npix=4.parquet new file mode 100644 index 00000000..b1ccfefd Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=0/Dir=0/Npix=4.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet new file mode 100644 index 00000000..99d8c671 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=176.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=176.parquet new file mode 100644 index 00000000..a1ad482d Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=176.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=177.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=177.parquet new file mode 100644 index 00000000..bb27144f Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=177.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=178.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=178.parquet new file mode 100644 index 00000000..d97f0608 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=178.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=179.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=179.parquet new file mode 100644 index 00000000..6243292a Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=179.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=181.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=181.parquet new file mode 100644 index 00000000..0594e330 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=181.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=182.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=182.parquet new file mode 100644 index 00000000..b1b8fb25 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=182.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=183.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=183.parquet new file mode 100644 index 00000000..2581c714 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=183.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=184.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=184.parquet new file mode 100644 index 00000000..5932f039 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=184.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=185.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=185.parquet new file mode 100644 index 00000000..9cbb6170 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=185.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=186.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=186.parquet new file mode 100644 index 00000000..03a081d4 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=186.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=187.parquet b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=187.parquet new file mode 100644 index 00000000..e1742ce8 Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/Norder=2/Dir=0/Npix=187.parquet differ diff --git a/tests/data/small_sky_source_margin/dataset/_common_metadata b/tests/data/small_sky_source_margin/dataset/_common_metadata new file mode 100644 index 00000000..a4ec06ac Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/_common_metadata differ diff --git a/tests/data/small_sky_source_margin/dataset/_metadata b/tests/data/small_sky_source_margin/dataset/_metadata new file mode 100644 index 00000000..1481b4fe Binary files /dev/null and b/tests/data/small_sky_source_margin/dataset/_metadata differ diff --git a/tests/data/small_sky_source_margin/partition_info.csv b/tests/data/small_sky_source_margin/partition_info.csv index 5d7ec0a1..9c7e0041 100644 --- a/tests/data/small_sky_source_margin/partition_info.csv +++ b/tests/data/small_sky_source_margin/partition_info.csv @@ -1,14 +1,14 @@ -Norder,Npix,Dir -0,4,0 -2,176,0 -2,177,0 -2,178,0 -2,179,0 -2,181,0 -2,182,0 -2,183,0 -2,184,0 -2,185,0 -2,186,0 -2,187,0 -1,47,0 +Norder,Npix +0,4 +2,176 +2,177 +2,178 +2,179 +2,181 +2,182 +2,183 +2,184 +2,185 +2,186 +2,187 +1,47 diff --git a/tests/data/small_sky_source_margin/properties b/tests/data/small_sky_source_margin/properties new file mode 100644 index 00000000..d953023a --- /dev/null +++ b/tests/data/small_sky_source_margin/properties @@ -0,0 +1,15 @@ +#HATS catalog +obs_collection=small_sky_source_margin +dataproduct_type=margin +hats_nrows=395 +hats_col_ra=source_ra +hats_col_dec=source_dec +hats_primary_table_url=small_sky_source +hats_margin_threshold=180.0 +hats_order=2 +moc_sky_fraction=0.16146 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:47UTC +hats_estsize=195 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_source_margin/provenance_info.json b/tests/data/small_sky_source_margin/provenance_info.json deleted file mode 100644 index 63b6ad4d..00000000 --- a/tests/data/small_sky_source_margin/provenance_info.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "catalog_name": "small_sky_source_margin", - "catalog_type": "margin", - "total_rows": 395, - "primary_catalog": "../../../hipscat-import/tests/hipscat_import/data/small_sky_source_catalog", - "margin_threshold": 180, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev5+g0733afb", - "runtime_args": { - "catalog_name": "small_sky_source_margin", - "output_path": ".", - "output_artifact_name": "small_sky_source_margin", - "tmp_dir": "/tmp/user/11115/tmphywoxno9", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_source_margin", - "tmp_path": "/tmp/user/11115/tmphywoxno9/small_sky_source_margin/intermediate", - "input_catalog_path": "../../../hipscat-import/tests/hipscat_import/data/small_sky_source_catalog", - "margin_threshold": 180, - "margin_order": 8 - } - } -} diff --git a/tests/data/small_sky_to_o1source/Norder=0/Dir=0/Npix=11.parquet b/tests/data/small_sky_to_o1source/Norder=0/Dir=0/Npix=11.parquet deleted file mode 100644 index 0c98fb8f..00000000 Binary files a/tests/data/small_sky_to_o1source/Norder=0/Dir=0/Npix=11.parquet and /dev/null differ diff --git a/tests/data/small_sky_to_o1source/_metadata b/tests/data/small_sky_to_o1source/_metadata deleted file mode 100644 index c6a100a2..00000000 Binary files a/tests/data/small_sky_to_o1source/_metadata and /dev/null differ diff --git a/tests/data/small_sky_to_o1source/catalog_info.json b/tests/data/small_sky_to_o1source/catalog_info.json deleted file mode 100644 index 1e424e48..00000000 --- a/tests/data/small_sky_to_o1source/catalog_info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "catalog_name": "small_sky_to_o1source", - "catalog_type": "association", - "total_rows": 17161, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_order1_source", - "join_column": "source_id", - "join_column_association": "source_id", - "contains_leaf_files": true -} diff --git a/tests/data/small_sky_to_o1source/dataset/Norder=0/Dir=0/Npix=11.parquet b/tests/data/small_sky_to_o1source/dataset/Norder=0/Dir=0/Npix=11.parquet new file mode 100644 index 00000000..99f122a4 Binary files /dev/null and b/tests/data/small_sky_to_o1source/dataset/Norder=0/Dir=0/Npix=11.parquet differ diff --git a/tests/data/small_sky_to_o1source/_common_metadata b/tests/data/small_sky_to_o1source/dataset/_common_metadata similarity index 51% rename from tests/data/small_sky_to_o1source/_common_metadata rename to tests/data/small_sky_to_o1source/dataset/_common_metadata index 0e44bde4..5e9196cd 100644 Binary files a/tests/data/small_sky_to_o1source/_common_metadata and b/tests/data/small_sky_to_o1source/dataset/_common_metadata differ diff --git a/tests/data/small_sky_to_o1source/dataset/_metadata b/tests/data/small_sky_to_o1source/dataset/_metadata new file mode 100644 index 00000000..ffbdbe17 Binary files /dev/null and b/tests/data/small_sky_to_o1source/dataset/_metadata differ diff --git a/tests/data/small_sky_to_o1source/partition_info.csv b/tests/data/small_sky_to_o1source/partition_info.csv index 7c5eaac4..bf77935e 100644 --- a/tests/data/small_sky_to_o1source/partition_info.csv +++ b/tests/data/small_sky_to_o1source/partition_info.csv @@ -1,2 +1,2 @@ -Norder,Npix,Dir -0,11,0 +Norder,Npix +0,11 diff --git a/tests/data/small_sky_to_o1source/properties b/tests/data/small_sky_to_o1source/properties new file mode 100644 index 00000000..b8fcad8e --- /dev/null +++ b/tests/data/small_sky_to_o1source/properties @@ -0,0 +1,18 @@ +#HATS catalog +obs_collection=small_sky_to_o1source +dataproduct_type=association +hats_nrows=17161 +hats_primary_table_url=small_sky +hats_col_assn_primary=id +hats_col_assn_primary_assn=object_id +hats_assn_join_table_url=small_sky_order1_source +hats_col_assn_join=source_id +hats_col_assn_join_assn=source_id +hats_assn_leaf_files=True +hats_order=0 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=121 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_to_o1source/provenance_info.json b/tests/data/small_sky_to_o1source/provenance_info.json deleted file mode 100644 index 892a782b..00000000 --- a/tests/data/small_sky_to_o1source/provenance_info.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "catalog_name": "small_sky_to_o1source", - "catalog_type": "association", - "total_rows": 17161, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_order1_source", - "join_column": "object_id", - "join_column_association": "source_id", - "contains_leaf_files": true, - "version": "0.2.9.dev2+g014342d", - "generation_date": "2024.03.19", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.6.dev6+gf95440a.d20240318", - "runtime_args": { - "catalog_name": "small_sky_to_o1source", - "output_path": ".", - "output_artifact_name": "small_sky_to_o1source", - "tmp_dir": "", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_to_o1source", - "tmp_path": "./small_sky_to_o1source/intermediate", - "object_catalog_dir": "small_sky", - "object_id_column": "id", - "source_catalog_dir": "small_sky_order1_source", - "source_object_id_column": "object_id", - "source_id_column": "source_id", - "compute_partition_size": 1000000000, - "write_leaf_files": true - } - } -} diff --git a/tests/data/small_sky_to_o1source_soft/_metadata b/tests/data/small_sky_to_o1source_soft/_metadata deleted file mode 100644 index d02d6aff..00000000 Binary files a/tests/data/small_sky_to_o1source_soft/_metadata and /dev/null differ diff --git a/tests/data/small_sky_to_o1source_soft/catalog_info.json b/tests/data/small_sky_to_o1source_soft/catalog_info.json deleted file mode 100644 index 931233bf..00000000 --- a/tests/data/small_sky_to_o1source_soft/catalog_info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "catalog_name": "small_sky_to_o1source_soft", - "catalog_type": "association", - "total_rows": 17161, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_order1_source", - "join_column": "object_id", - "join_column_association": "source_id", - "contains_leaf_files": false -} diff --git a/tests/data/small_sky_to_o1source_soft/_common_metadata b/tests/data/small_sky_to_o1source_soft/dataset/_common_metadata similarity index 92% rename from tests/data/small_sky_to_o1source_soft/_common_metadata rename to tests/data/small_sky_to_o1source_soft/dataset/_common_metadata index 45e3dbab..c2980bc1 100644 Binary files a/tests/data/small_sky_to_o1source_soft/_common_metadata and b/tests/data/small_sky_to_o1source_soft/dataset/_common_metadata differ diff --git a/tests/data/small_sky_to_o1source_soft/dataset/_metadata b/tests/data/small_sky_to_o1source_soft/dataset/_metadata new file mode 100644 index 00000000..1fa8bb11 Binary files /dev/null and b/tests/data/small_sky_to_o1source_soft/dataset/_metadata differ diff --git a/tests/data/small_sky_to_o1source_soft/partition_join_info.csv b/tests/data/small_sky_to_o1source_soft/partition_join_info.csv index 38415e8f..7a7555ed 100644 --- a/tests/data/small_sky_to_o1source_soft/partition_join_info.csv +++ b/tests/data/small_sky_to_o1source_soft/partition_join_info.csv @@ -1,5 +1,5 @@ Norder,Dir,Npix,join_Norder,join_Dir,join_Npix,num_rows -0,0,11,1,0,44,5502 -0,0,11,1,0,45,3799 -0,0,11,1,0,46,5502 -0,0,11,1,0,47,2358 +0,0,11,1,0,44,5302 +0,0,11,1,0,45,3947 +0,0,11,1,0,46,5467 +0,0,11,1,0,47,2395 diff --git a/tests/data/small_sky_to_o1source_soft/properties b/tests/data/small_sky_to_o1source_soft/properties new file mode 100644 index 00000000..72a54a6a --- /dev/null +++ b/tests/data/small_sky_to_o1source_soft/properties @@ -0,0 +1,18 @@ +#HATS catalog +obs_collection=small_sky_to_o1source_soft +dataproduct_type=association +hats_nrows=17161 +hats_primary_table_url=small_sky +hats_col_assn_primary=id +hats_col_assn_primary_assn=object_id +hats_assn_join_table_url=small_sky_order1_source +hats_col_assn_join=source_id +hats_col_assn_join_assn=source_id +hats_assn_leaf_files=False +hats_order=0 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=5 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_to_o1source_soft/provenance_info.json b/tests/data/small_sky_to_o1source_soft/provenance_info.json deleted file mode 100644 index 45aad854..00000000 --- a/tests/data/small_sky_to_o1source_soft/provenance_info.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "catalog_name": "small_sky_to_o1source_soft", - "catalog_type": "association", - "total_rows": 17161, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_order1_source", - "join_column": "object_id", - "join_column_association": "source_id", - "contains_leaf_files": false, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_to_o1source_soft", - "output_path": ".", - "output_artifact_name": "small_sky_to_o1source_soft", - "tmp_dir": "", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_to_o1source_soft", - "tmp_path": "./small_sky_to_o1source_soft/intermediate", - "object_catalog_dir": "small_sky", - "object_id_column": "id", - "source_catalog_dir": "small_sky_order1_source", - "source_object_id_column": "object_id", - "source_id_column": "source_id", - "compute_partition_size": 1000000000, - "write_leaf_files": false - } - } -} diff --git a/tests/data/small_sky_to_xmatch/_metadata b/tests/data/small_sky_to_xmatch/_metadata deleted file mode 100644 index 7b413d4a..00000000 Binary files a/tests/data/small_sky_to_xmatch/_metadata and /dev/null differ diff --git a/tests/data/small_sky_to_xmatch/catalog_info.json b/tests/data/small_sky_to_xmatch/catalog_info.json deleted file mode 100644 index 54178090..00000000 --- a/tests/data/small_sky_to_xmatch/catalog_info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "catalog_name": "small_sky_to_xmatch", - "catalog_type": "association", - "total_rows": 111, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_xmatch", - "join_column": "id", - "join_column_association": "source_id", - "contains_leaf_files": true -} diff --git a/tests/data/small_sky_to_xmatch/Norder=0/Dir=0/Npix=11.parquet b/tests/data/small_sky_to_xmatch/dataset/Norder=0/Dir=0/Npix=11.parquet similarity index 84% rename from tests/data/small_sky_to_xmatch/Norder=0/Dir=0/Npix=11.parquet rename to tests/data/small_sky_to_xmatch/dataset/Norder=0/Dir=0/Npix=11.parquet index 43806968..90ae99d2 100644 Binary files a/tests/data/small_sky_to_xmatch/Norder=0/Dir=0/Npix=11.parquet and b/tests/data/small_sky_to_xmatch/dataset/Norder=0/Dir=0/Npix=11.parquet differ diff --git a/tests/data/small_sky_to_xmatch/_common_metadata b/tests/data/small_sky_to_xmatch/dataset/_common_metadata similarity index 51% rename from tests/data/small_sky_to_xmatch/_common_metadata rename to tests/data/small_sky_to_xmatch/dataset/_common_metadata index 0e44bde4..5e9196cd 100644 Binary files a/tests/data/small_sky_to_xmatch/_common_metadata and b/tests/data/small_sky_to_xmatch/dataset/_common_metadata differ diff --git a/tests/data/small_sky_to_xmatch/dataset/_metadata b/tests/data/small_sky_to_xmatch/dataset/_metadata new file mode 100644 index 00000000..05c79dec Binary files /dev/null and b/tests/data/small_sky_to_xmatch/dataset/_metadata differ diff --git a/tests/data/small_sky_to_xmatch/partition_info.csv b/tests/data/small_sky_to_xmatch/partition_info.csv index 7c5eaac4..bf77935e 100644 --- a/tests/data/small_sky_to_xmatch/partition_info.csv +++ b/tests/data/small_sky_to_xmatch/partition_info.csv @@ -1,2 +1,2 @@ -Norder,Npix,Dir -0,11,0 +Norder,Npix +0,11 diff --git a/tests/data/small_sky_to_xmatch/properties b/tests/data/small_sky_to_xmatch/properties new file mode 100644 index 00000000..87b74d92 --- /dev/null +++ b/tests/data/small_sky_to_xmatch/properties @@ -0,0 +1,18 @@ +#HATS catalog +obs_collection=small_sky_to_xmatch +dataproduct_type=association +hats_nrows=111 +hats_primary_table_url=small_sky +hats_col_assn_primary=id +hats_col_assn_primary_assn=object_id +hats_assn_join_table_url=small_sky_xmatch +hats_col_assn_join=id +hats_col_assn_join_assn=source_id +hats_assn_leaf_files=True +hats_order=0 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=20 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_to_xmatch/provenance_info.json b/tests/data/small_sky_to_xmatch/provenance_info.json deleted file mode 100644 index 5e620356..00000000 --- a/tests/data/small_sky_to_xmatch/provenance_info.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "catalog_name": "small_sky_to_xmatch", - "catalog_type": "association", - "total_rows": 111, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_xmatch", - "join_column": "id", - "join_column_association": "source_id", - "contains_leaf_files": true, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_to_xmatch", - "output_path": ".", - "output_artifact_name": "small_sky_to_xmatch", - "tmp_dir": "", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_to_xmatch", - "tmp_path": "./small_sky_to_xmatch/intermediate", - "object_catalog_dir": "small_sky", - "object_id_column": "id", - "source_catalog_dir": "small_sky_xmatch", - "source_object_id_column": "id", - "source_id_column": "id", - "compute_partition_size": 1000000000, - "write_leaf_files": true - } - } -} diff --git a/tests/data/small_sky_to_xmatch_soft/_metadata b/tests/data/small_sky_to_xmatch_soft/_metadata deleted file mode 100644 index fde92ef4..00000000 Binary files a/tests/data/small_sky_to_xmatch_soft/_metadata and /dev/null differ diff --git a/tests/data/small_sky_to_xmatch_soft/catalog_info.json b/tests/data/small_sky_to_xmatch_soft/catalog_info.json deleted file mode 100644 index 4b3ed8d8..00000000 --- a/tests/data/small_sky_to_xmatch_soft/catalog_info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "catalog_name": "small_sky_to_xmatch_soft", - "catalog_type": "association", - "total_rows": 111, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_xmatch", - "join_column": "id", - "join_column_association": "source_id", - "contains_leaf_files": false -} diff --git a/tests/data/small_sky_to_xmatch_soft/_common_metadata b/tests/data/small_sky_to_xmatch_soft/dataset/_common_metadata similarity index 92% rename from tests/data/small_sky_to_xmatch_soft/_common_metadata rename to tests/data/small_sky_to_xmatch_soft/dataset/_common_metadata index 45e3dbab..c2980bc1 100644 Binary files a/tests/data/small_sky_to_xmatch_soft/_common_metadata and b/tests/data/small_sky_to_xmatch_soft/dataset/_common_metadata differ diff --git a/tests/data/small_sky_to_xmatch_soft/dataset/_metadata b/tests/data/small_sky_to_xmatch_soft/dataset/_metadata new file mode 100644 index 00000000..dd16a561 Binary files /dev/null and b/tests/data/small_sky_to_xmatch_soft/dataset/_metadata differ diff --git a/tests/data/small_sky_to_xmatch_soft/properties b/tests/data/small_sky_to_xmatch_soft/properties new file mode 100644 index 00000000..9efc8682 --- /dev/null +++ b/tests/data/small_sky_to_xmatch_soft/properties @@ -0,0 +1,18 @@ +#HATS catalog +obs_collection=small_sky_to_xmatch_soft +dataproduct_type=association +hats_nrows=111 +hats_primary_table_url=small_sky +hats_col_assn_primary=id +hats_col_assn_primary_assn=object_id +hats_assn_join_table_url=small_sky_xmatch +hats_col_assn_join=id +hats_col_assn_join_assn=source_id +hats_assn_leaf_files=False +hats_order=0 +moc_sky_fraction=0.08333 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=3 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_to_xmatch_soft/provenance_info.json b/tests/data/small_sky_to_xmatch_soft/provenance_info.json deleted file mode 100644 index 44d6567e..00000000 --- a/tests/data/small_sky_to_xmatch_soft/provenance_info.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "catalog_name": "small_sky_to_xmatch_soft", - "catalog_type": "association", - "total_rows": 111, - "primary_catalog": "small_sky", - "primary_column": "id", - "primary_column_association": "object_id", - "join_catalog": "small_sky_xmatch", - "join_column": "id", - "join_column_association": "source_id", - "contains_leaf_files": false, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_to_xmatch_soft", - "output_path": ".", - "output_artifact_name": "small_sky_to_xmatch_soft", - "tmp_dir": "", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_to_xmatch_soft", - "tmp_path": "./small_sky_to_xmatch_soft/intermediate", - "object_catalog_dir": "small_sky", - "object_id_column": "id", - "source_catalog_dir": "small_sky_xmatch", - "source_object_id_column": "id", - "source_id_column": "id", - "compute_partition_size": 1000000000, - "write_leaf_files": false - } - } -} diff --git a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=44.parquet deleted file mode 100644 index e1548333..00000000 Binary files a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=44.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=45.parquet deleted file mode 100644 index 482c1e86..00000000 Binary files a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=45.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=46.parquet deleted file mode 100644 index 64ea3428..00000000 Binary files a/tests/data/small_sky_xmatch/Norder=1/Dir=0/Npix=46.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch/_common_metadata b/tests/data/small_sky_xmatch/_common_metadata deleted file mode 100644 index 0e042fab..00000000 Binary files a/tests/data/small_sky_xmatch/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_xmatch/_metadata b/tests/data/small_sky_xmatch/_metadata deleted file mode 100644 index 90a25010..00000000 Binary files a/tests/data/small_sky_xmatch/_metadata and /dev/null differ diff --git a/tests/data/small_sky_xmatch/catalog_info.json b/tests/data/small_sky_xmatch/catalog_info.json deleted file mode 100644 index be8e6358..00000000 --- a/tests/data/small_sky_xmatch/catalog_info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "catalog_name": "small_sky_xmatch", - "catalog_type": "object", - "total_rows": 111, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec" -} diff --git a/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet new file mode 100644 index 00000000..48780a67 Binary files /dev/null and b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet new file mode 100644 index 00000000..e07b925e Binary files /dev/null and b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet new file mode 100644 index 00000000..69345ab6 Binary files /dev/null and b/tests/data/small_sky_xmatch/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_xmatch/dataset/_common_metadata b/tests/data/small_sky_xmatch/dataset/_common_metadata new file mode 100644 index 00000000..32a66606 Binary files /dev/null and b/tests/data/small_sky_xmatch/dataset/_common_metadata differ diff --git a/tests/data/small_sky_xmatch/dataset/_metadata b/tests/data/small_sky_xmatch/dataset/_metadata new file mode 100644 index 00000000..669c1475 Binary files /dev/null and b/tests/data/small_sky_xmatch/dataset/_metadata differ diff --git a/tests/data/small_sky_xmatch/partition_info.csv b/tests/data/small_sky_xmatch/partition_info.csv index 71e5a5b9..4732c589 100644 --- a/tests/data/small_sky_xmatch/partition_info.csv +++ b/tests/data/small_sky_xmatch/partition_info.csv @@ -1,4 +1,4 @@ -Norder,Npix,Dir -1,44,0 -1,45,0 -1,46,0 +Norder,Npix +1,44 +1,45 +1,46 diff --git a/tests/data/small_sky_xmatch/point_map.fits b/tests/data/small_sky_xmatch/point_map.fits new file mode 100644 index 00000000..9413f2f1 Binary files /dev/null and b/tests/data/small_sky_xmatch/point_map.fits differ diff --git a/tests/data/small_sky_xmatch/properties b/tests/data/small_sky_xmatch/properties new file mode 100644 index 00000000..252e3ae6 --- /dev/null +++ b/tests/data/small_sky_xmatch/properties @@ -0,0 +1,14 @@ +#HATS catalog +obs_collection=small_sky_xmatch +dataproduct_type=object +hats_nrows=111 +hats_col_ra=ra +hats_col_dec=dec +hats_max_rows=100 +hats_order=1 +moc_sky_fraction=0.06250 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=37 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_xmatch/provenance_info.json b/tests/data/small_sky_xmatch/provenance_info.json deleted file mode 100644 index 098f6251..00000000 --- a/tests/data/small_sky_xmatch/provenance_info.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "catalog_name": "small_sky_xmatch", - "catalog_type": "object", - "total_rows": 111, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_xmatch", - "output_path": ".", - "output_artifact_name": "small_sky_xmatch", - "tmp_dir": "/tmp/user/11115/tmpkxlmq_3u", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_xmatch", - "tmp_path": "/tmp/user/11115/tmpkxlmq_3u/small_sky_xmatch/intermediate", - "epoch": "J2000", - "catalog_type": "object", - "input_path": null, - "input_paths": [ - "raw/xmatch/small_sky_xmatch.csv" - ], - "input_file_list": [ - "raw/xmatch/small_sky_xmatch.csv" - ], - "ra_column": "ra", - "dec_column": "dec", - "use_hipscat_index": false, - "sort_columns": null, - "constant_healpix_order": -1, - "highest_healpix_order": 7, - "pixel_threshold": 100, - "mapping_healpix_order": 7, - "debug_stats_only": false, - "file_reader_info": { - "input_reader_type": "CsvReader", - "chunksize": 500000, - "header": "infer", - "schema_file": null, - "separator": ",", - "column_names": null, - "type_map": {} - } - } - } -} diff --git a/tests/data/small_sky_xmatch_margin/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_xmatch_margin/Norder=0/Dir=0/Npix=4.parquet deleted file mode 100644 index b8027a03..00000000 Binary files a/tests/data/small_sky_xmatch_margin/Norder=0/Dir=0/Npix=4.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=44.parquet deleted file mode 100644 index 98ead377..00000000 Binary files a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=44.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=45.parquet deleted file mode 100644 index 0181fe26..00000000 Binary files a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=45.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=46.parquet deleted file mode 100644 index 190e5268..00000000 Binary files a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=46.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=47.parquet deleted file mode 100644 index a3a1eb05..00000000 Binary files a/tests/data/small_sky_xmatch_margin/Norder=1/Dir=0/Npix=47.parquet and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/_common_metadata b/tests/data/small_sky_xmatch_margin/_common_metadata deleted file mode 100644 index 921a7c88..00000000 Binary files a/tests/data/small_sky_xmatch_margin/_common_metadata and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/_metadata b/tests/data/small_sky_xmatch_margin/_metadata deleted file mode 100644 index b075d3da..00000000 Binary files a/tests/data/small_sky_xmatch_margin/_metadata and /dev/null differ diff --git a/tests/data/small_sky_xmatch_margin/catalog_info.json b/tests/data/small_sky_xmatch_margin/catalog_info.json deleted file mode 100644 index b5dcfd9a..00000000 --- a/tests/data/small_sky_xmatch_margin/catalog_info.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "catalog_name": "small_sky_xmatch_margin", - "catalog_type": "margin", - "total_rows": 26, - "epoch": "J2000", - "ra_column": "ra", - "dec_column": "dec", - "primary_catalog": "small_sky_xmatch", - "margin_threshold": 7200 -} diff --git a/tests/data/small_sky_xmatch_margin/dataset/Norder=0/Dir=0/Npix=4.parquet b/tests/data/small_sky_xmatch_margin/dataset/Norder=0/Dir=0/Npix=4.parquet new file mode 100644 index 00000000..b068a99a Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/Norder=0/Dir=0/Npix=4.parquet differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=44.parquet b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=44.parquet new file mode 100644 index 00000000..c432c40f Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=44.parquet differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=45.parquet b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=45.parquet new file mode 100644 index 00000000..e57697ec Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=45.parquet differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=46.parquet b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=46.parquet new file mode 100644 index 00000000..e9a02ba6 Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=46.parquet differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=47.parquet b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=47.parquet new file mode 100644 index 00000000..91cf49cb Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/Norder=1/Dir=0/Npix=47.parquet differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/_common_metadata b/tests/data/small_sky_xmatch_margin/dataset/_common_metadata new file mode 100644 index 00000000..9c393856 Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/_common_metadata differ diff --git a/tests/data/small_sky_xmatch_margin/dataset/_metadata b/tests/data/small_sky_xmatch_margin/dataset/_metadata new file mode 100644 index 00000000..042291b0 Binary files /dev/null and b/tests/data/small_sky_xmatch_margin/dataset/_metadata differ diff --git a/tests/data/small_sky_xmatch_margin/partition_info.csv b/tests/data/small_sky_xmatch_margin/partition_info.csv index cb6b0535..04179b4d 100644 --- a/tests/data/small_sky_xmatch_margin/partition_info.csv +++ b/tests/data/small_sky_xmatch_margin/partition_info.csv @@ -1,6 +1,6 @@ -Norder,Npix,Dir -0,4,0 -1,44,0 -1,45,0 -1,46,0 -1,47,0 +Norder,Npix +0,4 +1,44 +1,45 +1,46 +1,47 diff --git a/tests/data/small_sky_xmatch_margin/properties b/tests/data/small_sky_xmatch_margin/properties new file mode 100644 index 00000000..2c555a54 --- /dev/null +++ b/tests/data/small_sky_xmatch_margin/properties @@ -0,0 +1,15 @@ +#HATS catalog +obs_collection=small_sky_xmatch_margin +dataproduct_type=margin +hats_nrows=26 +hats_col_ra=ra +hats_col_dec=dec +hats_primary_table_url=small_sky_xmatch +hats_margin_threshold=7200.0 +hats_order=1 +moc_sky_fraction=0.16667 +hats_builder=hats-import v0.3.6.dev26+g40366b4 +hats_creation_date=2024-10-15T14\:48UTC +hats_estsize=63 +hats_release_date=2024-09-18 +hats_version=v0.1 diff --git a/tests/data/small_sky_xmatch_margin/provenance_info.json b/tests/data/small_sky_xmatch_margin/provenance_info.json deleted file mode 100644 index 339093fc..00000000 --- a/tests/data/small_sky_xmatch_margin/provenance_info.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "catalog_name": "small_sky_xmatch_margin", - "catalog_type": "margin", - "total_rows": 26, - "primary_catalog": "small_sky_xmatch", - "margin_threshold": 7200, - "version": "0.2.7.dev15+g85ec4a0", - "generation_date": "2024.03.06", - "tool_args": { - "tool_name": "hipscat_import", - "version": "0.2.5.dev7+gea60042", - "runtime_args": { - "catalog_name": "small_sky_xmatch_margin", - "output_path": ".", - "output_artifact_name": "small_sky_xmatch_margin", - "tmp_dir": "/tmp/user/11115/tmpkxlmq_3u", - "overwrite": true, - "dask_tmp": "", - "dask_n_workers": 1, - "dask_threads_per_worker": 1, - "catalog_path": "./small_sky_xmatch_margin", - "tmp_path": "/tmp/user/11115/tmpkxlmq_3u/small_sky_xmatch_margin/intermediate", - "input_catalog_path": "small_sky_xmatch", - "margin_threshold": 7200, - "margin_order": 4 - } - } -} diff --git a/tests/lsdb/catalog/test_association_catalog.py b/tests/lsdb/catalog/test_association_catalog.py index b4b41e52..08260975 100644 --- a/tests/lsdb/catalog/test_association_catalog.py +++ b/tests/lsdb/catalog/test_association_catalog.py @@ -1,4 +1,4 @@ -import hipscat as hc +import hats as hc import nested_dask as nd import pandas as pd @@ -7,7 +7,7 @@ def test_load_association(small_sky_to_xmatch_dir): - small_sky_to_xmatch = lsdb.read_hipscat(small_sky_to_xmatch_dir) + small_sky_to_xmatch = lsdb.read_hats(small_sky_to_xmatch_dir) assert isinstance(small_sky_to_xmatch, AssociationCatalog) assert isinstance(small_sky_to_xmatch._ddf, nd.NestedFrame) assert small_sky_to_xmatch.get_healpix_pixels() == small_sky_to_xmatch.hc_structure.get_healpix_pixels() @@ -25,7 +25,7 @@ def test_load_association(small_sky_to_xmatch_dir): def test_load_soft_association(small_sky_to_xmatch_soft_dir): - small_sky_to_xmatch_soft = lsdb.read_hipscat(small_sky_to_xmatch_soft_dir) + small_sky_to_xmatch_soft = lsdb.read_hats(small_sky_to_xmatch_soft_dir) assert isinstance(small_sky_to_xmatch_soft, AssociationCatalog) assert isinstance(small_sky_to_xmatch_soft._ddf, nd.NestedFrame) assert len(small_sky_to_xmatch_soft.compute()) == 0 diff --git a/tests/lsdb/catalog/test_box_search.py b/tests/lsdb/catalog/test_box_search.py index f40f1f8a..5dee4241 100644 --- a/tests/lsdb/catalog/test_box_search.py +++ b/tests/lsdb/catalog/test_box_search.py @@ -2,7 +2,7 @@ import nested_pandas as npd import numpy as np import pytest -from hipscat.pixel_math.validators import ValidatorsErrors +from hats.pixel_math.validators import ValidatorsErrors def test_box_search_ra_filters_correct_points(small_sky_order1_catalog, assert_divisions_are_correct): diff --git a/tests/lsdb/catalog/test_catalog.py b/tests/lsdb/catalog/test_catalog.py index fcd400a8..34e2b97d 100644 --- a/tests/lsdb/catalog/test_catalog.py +++ b/tests/lsdb/catalog/test_catalog.py @@ -2,24 +2,22 @@ import dask.array as da import dask.dataframe as dd +import hats.pixel_math.healpix_shim as hp import healpy -import hipscat.pixel_math.healpix_shim as hp import nested_dask as nd import nested_pandas as npd import numpy as np import pandas as pd import pytest -from hipscat.pixel_math import HealpixPixel, hipscat_id_to_healpix +from hats.pixel_math import HealpixPixel, spatial_index_to_healpix import lsdb from lsdb import Catalog -from lsdb.dask.merge_catalog_functions import filter_by_hipscat_index_to_pixel +from lsdb.dask.merge_catalog_functions import filter_by_spatial_index_to_pixel -def test_catalog_pixels_equals_hc_catalog_pixels(small_sky_order1_catalog, small_sky_order1_hipscat_catalog): - assert ( - small_sky_order1_catalog.get_healpix_pixels() == small_sky_order1_hipscat_catalog.get_healpix_pixels() - ) +def test_catalog_pixels_equals_hc_catalog_pixels(small_sky_order1_catalog, small_sky_order1_hats_catalog): + assert small_sky_order1_catalog.get_healpix_pixels() == small_sky_order1_hats_catalog.get_healpix_pixels() def test_catalog_repr_equals_ddf_repr(small_sky_order1_catalog): @@ -29,8 +27,8 @@ def test_catalog_repr_equals_ddf_repr(small_sky_order1_catalog): def test_catalog_html_repr_equals_ddf_html_repr(small_sky_order1_catalog): full_html = small_sky_order1_catalog._repr_html_() assert small_sky_order1_catalog.name in full_html - # this is a _hipscat_index that's in the data - assert "12682136550675316736" in full_html + # this is a _healpix_29 that's in the data + assert "3170534137668829184" in full_html def test_catalog_compute_equals_ddf_compute(small_sky_order1_catalog): @@ -194,8 +192,8 @@ def test_assign_with_invalid_arguments(small_sky_order1_catalog): def test_save_catalog(small_sky_catalog, tmp_path): new_catalog_name = "small_sky" base_catalog_path = Path(tmp_path) / new_catalog_name - small_sky_catalog.to_hipscat(base_catalog_path, catalog_name=new_catalog_name) - expected_catalog = lsdb.read_hipscat(base_catalog_path) + small_sky_catalog.to_hats(base_catalog_path, catalog_name=new_catalog_name) + expected_catalog = lsdb.read_hats(base_catalog_path) assert expected_catalog.hc_structure.catalog_name == new_catalog_name assert expected_catalog.hc_structure.catalog_info == small_sky_catalog.hc_structure.catalog_info assert expected_catalog.get_healpix_pixels() == small_sky_catalog.get_healpix_pixels() @@ -205,13 +203,13 @@ def test_save_catalog(small_sky_catalog, tmp_path): def test_save_catalog_overwrite(small_sky_catalog, tmp_path): base_catalog_path = tmp_path / "small_sky" # Saving a catalog to disk when the directory does not yet exist - small_sky_catalog.to_hipscat(base_catalog_path) + small_sky_catalog.to_hats(base_catalog_path) # The output directory exists and it has content. Overwrite is # set to False and, as such, the operation fails. with pytest.raises(ValueError, match="set overwrite to True"): - small_sky_catalog.to_hipscat(base_catalog_path) + small_sky_catalog.to_hats(base_catalog_path) # With overwrite it succeeds because the directory is recreated - small_sky_catalog.to_hipscat(base_catalog_path, overwrite=True) + small_sky_catalog.to_hats(base_catalog_path, overwrite=True) def test_save_catalog_when_catalog_is_empty(small_sky_order1_catalog, tmp_path): @@ -229,7 +227,7 @@ def test_save_catalog_when_catalog_is_empty(small_sky_order1_catalog, tmp_path): # The catalog is not written to disk with pytest.raises(RuntimeError, match="The output catalog is empty"): - cone_search_catalog.to_hipscat(base_catalog_path) + cone_search_catalog.to_hats(base_catalog_path) def test_save_catalog_with_some_empty_partitions(small_sky_order1_catalog, tmp_path): @@ -245,11 +243,11 @@ def test_save_catalog_with_some_empty_partitions(small_sky_order1_catalog, tmp_p non_empty_pixels.append(pixel) assert len(non_empty_pixels) == 1 - cone_search_catalog.to_hipscat(base_catalog_path) + cone_search_catalog.to_hats(base_catalog_path) # Confirm that we can read the catalog from disk, and that it was # written with no empty partitions - catalog = lsdb.read_hipscat(base_catalog_path) + catalog = lsdb.read_hats(base_catalog_path) assert catalog._ddf.npartitions == 1 assert len(catalog._ddf.partitions[0]) > 0 assert list(catalog._ddf_pixel_map.keys()) == non_empty_pixels @@ -328,7 +326,7 @@ def func(df, healpix): for i in range(expected_array_length): p = pixels[i] expected_value = func( - filter_by_hipscat_index_to_pixel(partition, order, p), HealpixPixel(order, p) + filter_by_spatial_index_to_pixel(partition, order, p), HealpixPixel(order, p) ) assert value[i] == expected_value @@ -377,7 +375,7 @@ def func(df, _): return len(df) / hp.nside2pixarea(hp.order2nside(order), degrees=True) computed_catalog = small_sky_order1_catalog.compute() - order_3_pixels = hipscat_id_to_healpix(computed_catalog.index.to_numpy(), order) + order_3_pixels = spatial_index_to_healpix(computed_catalog.index.to_numpy(), order) pixel_map = computed_catalog.groupby(order_3_pixels).apply(lambda x: func(x, None)) img = np.full(hp.order2npix(order), default) diff --git a/tests/lsdb/catalog/test_cone_search.py b/tests/lsdb/catalog/test_cone_search.py index 188d556d..2be0e6ee 100644 --- a/tests/lsdb/catalog/test_cone_search.py +++ b/tests/lsdb/catalog/test_cone_search.py @@ -3,7 +3,7 @@ import pandas as pd import pytest from astropy.coordinates import SkyCoord -from hipscat.pixel_math.validators import ValidatorsErrors +from hats.pixel_math.validators import ValidatorsErrors def test_cone_search_filters_correct_points(small_sky_order1_catalog, assert_divisions_are_correct): diff --git a/tests/lsdb/catalog/test_crossmatch.py b/tests/lsdb/catalog/test_crossmatch.py index c942ea84..2c5ba410 100644 --- a/tests/lsdb/catalog/test_crossmatch.py +++ b/tests/lsdb/catalog/test_crossmatch.py @@ -4,8 +4,8 @@ import pandas as pd import pyarrow as pa import pytest -from hipscat.pixel_math import HealpixPixel -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN +from hats.pixel_math import HealpixPixel +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN import lsdb from lsdb import Catalog @@ -72,7 +72,7 @@ def test_kdtree_crossmatch_multiple_neighbors( def test_kdtree_crossmatch_multiple_neighbors_margin( algo, small_sky_catalog, small_sky_xmatch_dir, small_sky_xmatch_margin_catalog, xmatch_correct_3n_2t ): - small_sky_xmatch_catalog = lsdb.read_hipscat( + small_sky_xmatch_catalog = lsdb.read_hats( small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog ) xmatched = small_sky_catalog.crossmatch( @@ -96,7 +96,7 @@ def test_crossmatch_negative_margin( small_sky_xmatch_margin_catalog, xmatch_correct_3n_2t_negative, ): - small_sky_xmatch_catalog = lsdb.read_hipscat( + small_sky_xmatch_catalog = lsdb.read_hats( small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog ) xmatched = small_sky_left_xmatch_catalog.crossmatch( @@ -152,7 +152,7 @@ def test_kdtree_crossmatch_min_thresh_multiple_neighbors_margin( small_sky_xmatch_margin_catalog, xmatch_correct_05_2_3n_margin, ): - small_sky_xmatch_catalog = lsdb.read_hipscat( + small_sky_xmatch_catalog = lsdb.read_hats( small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog ) xmatched = small_sky_catalog.crossmatch( @@ -212,7 +212,7 @@ def test_crossmatch_more_neighbors_than_points_available( @staticmethod def test_self_crossmatch(algo, small_sky_catalog, small_sky_dir): # Read a second small sky catalog to not have duplicate labels - small_sky_catalog_2 = lsdb.read_hipscat(small_sky_dir) + small_sky_catalog_2 = lsdb.read_hats(small_sky_dir) small_sky_catalog_2.hc_structure.catalog_name = "small_sky_2" with pytest.warns(RuntimeWarning, match="Results may be incomplete and/or inaccurate"): xmatched = small_sky_catalog.crossmatch( @@ -245,7 +245,7 @@ def test_crossmatch_empty_left_partition(algo, small_sky_order1_catalog, small_s def test_crossmatch_empty_right_partition(algo, small_sky_order1_catalog, small_sky_xmatch_catalog): ra = 300 dec = -60 - radius_arcsec = 3 * 3600 + radius_arcsec = 3.4 * 3600 cone = small_sky_xmatch_catalog.cone_search(ra, dec, radius_arcsec) assert len(cone.get_healpix_pixels()) == 2 assert len(cone.get_partition(1, 44)) == 5 @@ -337,7 +337,7 @@ def crossmatch(self, mock_results: pd.DataFrame = None): # type: ignore ], axis=1, ) - out.set_index(HIPSCAT_ID_COLUMN, inplace=True) + out.set_index(SPATIAL_INDEX_COLUMN, inplace=True) extra_columns = pd.DataFrame({"_DIST": mock_results["dist"]}) self._append_extra_columns(out, extra_columns) return out diff --git a/tests/lsdb/catalog/test_index_search.py b/tests/lsdb/catalog/test_index_search.py index 20481703..eb6ce357 100644 --- a/tests/lsdb/catalog/test_index_search.py +++ b/tests/lsdb/catalog/test_index_search.py @@ -1,10 +1,10 @@ import nested_dask as nd import nested_pandas as npd -from hipscat.catalog.index.index_catalog import IndexCatalog +from hats.catalog.index.index_catalog import IndexCatalog def test_index_search(small_sky_order1_catalog, small_sky_order1_id_index_dir, assert_divisions_are_correct): - catalog_index = IndexCatalog.read_from_hipscat(small_sky_order1_id_index_dir) + catalog_index = IndexCatalog.read_hats(small_sky_order1_id_index_dir) # Searching for an object that does not exist index_search_catalog = small_sky_order1_catalog.index_search([900], catalog_index) assert isinstance(index_search_catalog._ddf, nd.NestedFrame) @@ -20,7 +20,7 @@ def test_index_search(small_sky_order1_catalog, small_sky_order1_id_index_dir, a def test_index_search_coarse_versus_fine(small_sky_order1_catalog, small_sky_order1_id_index_dir): - catalog_index = IndexCatalog.read_from_hipscat(small_sky_order1_id_index_dir) + catalog_index = IndexCatalog.read_hats(small_sky_order1_id_index_dir) coarse_index_search = small_sky_order1_catalog.index_search([700], catalog_index, fine=False) fine_index_search = small_sky_order1_catalog.index_search([700], catalog_index) assert coarse_index_search.get_healpix_pixels() == fine_index_search.get_healpix_pixels() diff --git a/tests/lsdb/catalog/test_join.py b/tests/lsdb/catalog/test_join.py index a147142e..7f9c13cd 100644 --- a/tests/lsdb/catalog/test_join.py +++ b/tests/lsdb/catalog/test_join.py @@ -3,7 +3,7 @@ import numpy as np import pandas as pd import pytest -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN, hipscat_id_to_healpix +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN, spatial_index_to_healpix def test_small_sky_join_small_sky_order1( @@ -19,8 +19,8 @@ def test_small_sky_join_small_sky_order1( assert (col_name + suffixes[0], dtype) in joined.dtypes.items() for col_name, dtype in small_sky_order1_catalog.dtypes.items(): assert (col_name + suffixes[1], dtype) in joined.dtypes.items() - assert joined._ddf.index.name == HIPSCAT_ID_COLUMN - assert joined._ddf.index.dtype == np.uint64 + assert joined._ddf.index.name == SPATIAL_INDEX_COLUMN + assert joined._ddf.index.dtype == np.int64 joined_compute = joined.compute() assert isinstance(joined_compute, npd.NestedFrame) @@ -83,8 +83,8 @@ def test_join_association(small_sky_catalog, small_sky_xmatch_catalog, small_sky assert col + suffixes[0] in joined._ddf.columns for col in small_sky_xmatch_catalog._ddf.columns: assert col + suffixes[1] in joined._ddf.columns - assert joined._ddf.index.name == HIPSCAT_ID_COLUMN - assert joined._ddf.index.dtype == np.uint64 + assert joined._ddf.index.name == SPATIAL_INDEX_COLUMN + assert joined._ddf.index.dtype == np.int64 small_sky_compute = small_sky_catalog.compute() small_sky_xmatch_compute = small_sky_xmatch_catalog.compute() @@ -229,7 +229,7 @@ def test_merge_asof(small_sky_catalog, small_sky_xmatch_catalog, assert_division small_sky_compute = small_sky_catalog.compute().rename( columns={c: c + suffixes[0] for c in small_sky_catalog.columns} ) - order_1_partition = hipscat_id_to_healpix(small_sky_compute.index.to_numpy(), 1) + order_1_partition = spatial_index_to_healpix(small_sky_compute.index.to_numpy(), 1) left_partitions = [ small_sky_compute[order_1_partition == p.pixel] for p in small_sky_xmatch_catalog.get_healpix_pixels() diff --git a/tests/lsdb/catalog/test_margin_catalog.py b/tests/lsdb/catalog/test_margin_catalog.py index 0487f65c..ff4583da 100644 --- a/tests/lsdb/catalog/test_margin_catalog.py +++ b/tests/lsdb/catalog/test_margin_catalog.py @@ -1,6 +1,6 @@ from pathlib import Path -import hipscat as hc +import hats as hc import nested_dask as nd import pandas as pd @@ -9,10 +9,10 @@ def test_read_margin_catalog(small_sky_xmatch_margin_dir): - margin = lsdb.read_hipscat(small_sky_xmatch_margin_dir) + margin = lsdb.read_hats(small_sky_xmatch_margin_dir) assert isinstance(margin, MarginCatalog) assert isinstance(margin._ddf, nd.NestedFrame) - hc_margin = hc.catalog.MarginCatalog.read_from_hipscat(small_sky_xmatch_margin_dir) + hc_margin = hc.catalog.MarginCatalog.read_hats(small_sky_xmatch_margin_dir) assert margin.hc_structure.catalog_info == hc_margin.catalog_info assert margin.hc_structure.get_healpix_pixels() == hc_margin.get_healpix_pixels() assert margin.get_healpix_pixels() == margin.hc_structure.get_healpix_pixels() @@ -21,7 +21,7 @@ def test_read_margin_catalog(small_sky_xmatch_margin_dir): def test_margin_catalog_partitions_correct(small_sky_xmatch_margin_dir): - margin = lsdb.read_hipscat(small_sky_xmatch_margin_dir) + margin = lsdb.read_hats(small_sky_xmatch_margin_dir) assert isinstance(margin, MarginCatalog) for healpix_pixel in margin.get_healpix_pixels(): hp_order = healpix_pixel.order @@ -38,8 +38,8 @@ def test_margin_catalog_partitions_correct(small_sky_xmatch_margin_dir): def test_save_margin_catalog(small_sky_xmatch_margin_catalog, tmp_path): new_catalog_name = "small_sky_xmatch_margin" base_catalog_path = Path(tmp_path) / new_catalog_name - small_sky_xmatch_margin_catalog.to_hipscat(base_catalog_path, catalog_name=new_catalog_name) - expected_catalog = lsdb.read_hipscat(base_catalog_path) + small_sky_xmatch_margin_catalog.to_hats(base_catalog_path, catalog_name=new_catalog_name) + expected_catalog = lsdb.read_hats(base_catalog_path) assert expected_catalog.hc_structure.catalog_name == new_catalog_name assert ( expected_catalog.hc_structure.catalog_info diff --git a/tests/lsdb/catalog/test_nested.py b/tests/lsdb/catalog/test_nested.py index c6216dd6..8dde0048 100644 --- a/tests/lsdb/catalog/test_nested.py +++ b/tests/lsdb/catalog/test_nested.py @@ -21,7 +21,7 @@ def add_na_values_nested(df): """replaces the first source_ra value in each nested df with NaN""" for i in range(len(df)): first_ra_value = df.iloc[i]["sources"].iloc[0]["source_ra"] - df["sources"].array[i] = df["sources"].array[i].replace(first_ra_value, np.NaN) + df["sources"].array[i] = df["sources"].array[i].replace(first_ra_value, np.nan) return df filtered_cat = small_sky_with_nested_sources.map_partitions(add_na_values_nested) @@ -32,6 +32,3 @@ def add_na_values_nested(df): filtered_sources_compute = filtered_cat["sources"].compute() assert len(drop_na_sources_compute) == len(filtered_sources_compute) assert sum(map(len, drop_na_sources_compute)) < sum(map(len, filtered_sources_compute)) - pd.testing.assert_frame_equal( - drop_na_cat.compute(), filtered_cat._ddf.dropna(on_nested="sources").compute() - ) diff --git a/tests/lsdb/catalog/test_pixel_search.py b/tests/lsdb/catalog/test_pixel_search.py index 41c4e1ba..124cdb9e 100644 --- a/tests/lsdb/catalog/test_pixel_search.py +++ b/tests/lsdb/catalog/test_pixel_search.py @@ -1,6 +1,6 @@ import nested_dask as nd import pandas as pd -from hipscat.pixel_math import HealpixPixel +from hats.pixel_math import HealpixPixel from lsdb.core.search.pixel_search import PixelSearch diff --git a/tests/lsdb/catalog/test_polygon_search.py b/tests/lsdb/catalog/test_polygon_search.py index 4dd775c9..c1f6086f 100644 --- a/tests/lsdb/catalog/test_polygon_search.py +++ b/tests/lsdb/catalog/test_polygon_search.py @@ -3,7 +3,7 @@ import numpy as np import numpy.testing as npt import pytest -from hipscat.pixel_math.validators import ValidatorsErrors +from hats.pixel_math.validators import ValidatorsErrors from lsdb.core.search.polygon_search import get_cartesian_polygon diff --git a/tests/lsdb/core/test_kdtree_validation.py b/tests/lsdb/core/test_kdtree_validation.py index d47efabb..51c4ef16 100644 --- a/tests/lsdb/core/test_kdtree_validation.py +++ b/tests/lsdb/core/test_kdtree_validation.py @@ -31,7 +31,7 @@ def test_bounded_kdtree_radius_invalid(small_sky_catalog, small_sky_order1_sourc def test_kdtree_left_columns(small_sky_catalog, small_sky_order1_source_with_margin): original_df = small_sky_catalog._ddf small_sky_catalog._ddf = original_df.reset_index() - with pytest.raises(ValueError, match="index of left table must be _hipscat_index"): + with pytest.raises(ValueError, match="index of left table must be _healpix_29"): KdTreeCrossmatch.validate( small_sky_catalog, small_sky_order1_source_with_margin, @@ -55,7 +55,7 @@ def test_kdtree_left_columns(small_sky_catalog, small_sky_order1_source_with_mar def test_kdtree_right_columns(small_sky_catalog, small_sky_order1_source_with_margin): original_df = small_sky_order1_source_with_margin._ddf small_sky_order1_source_with_margin._ddf = original_df.reset_index() - with pytest.raises(ValueError, match="index of right table must be _hipscat_index"): + with pytest.raises(ValueError, match="index of right table must be _healpix_29"): KdTreeCrossmatch.validate(small_sky_catalog, small_sky_order1_source_with_margin) small_sky_order1_source_with_margin._ddf = original_df.drop(columns=["source_ra"]) diff --git a/tests/lsdb/dask/test_divisions.py b/tests/lsdb/dask/test_divisions.py index c5649762..d3213d31 100644 --- a/tests/lsdb/dask/test_divisions.py +++ b/tests/lsdb/dask/test_divisions.py @@ -1,4 +1,4 @@ -import hipscat as hc +import hats as hc import numpy.testing as npt from lsdb.dask.divisions import get_pixels_divisions @@ -8,7 +8,7 @@ def test_divisions_are_independent_of_pixel_order(small_sky_order1_catalog): hp_pixels = small_sky_order1_catalog.get_ordered_healpix_pixels() order = [p.order for p in hp_pixels] pixel = [p.pixel for p in hp_pixels] - pixels = hc.pixel_math.hipscat_id.healpix_to_hipscat_id(order, pixel) + pixels = hc.pixel_math.spatial_index.healpix_to_spatial_index(order, pixel) npt.assert_array_equal(pixels, sorted(pixels)) # Calculate divisions for ordered pixels divisions = get_pixels_divisions(hp_pixels) diff --git a/tests/lsdb/loaders/dataframe/test_from_dataframe.py b/tests/lsdb/loaders/dataframe/test_from_dataframe.py index 0a9da329..39eab9ee 100644 --- a/tests/lsdb/loaders/dataframe/test_from_dataframe.py +++ b/tests/lsdb/loaders/dataframe/test_from_dataframe.py @@ -1,17 +1,17 @@ import math import astropy.units as u -import hipscat as hc -import hipscat.pixel_math.healpix_shim as hp +import hats as hc +import hats.pixel_math.healpix_shim as hp import nested_dask as nd import nested_pandas as npd import numpy as np import numpy.testing as npt import pandas as pd import pytest -from hipscat.catalog import CatalogType -from hipscat.pixel_math.healpix_pixel_function import get_pixel_argsort -from hipscat.pixel_math.hipscat_id import HIPSCAT_ID_COLUMN +from hats.catalog import CatalogType +from hats.pixel_math.healpix_pixel_function import get_pixel_argsort +from hats.pixel_math.spatial_index import SPATIAL_INDEX_COLUMN from mocpy import MOC import lsdb @@ -44,17 +44,21 @@ def test_from_dataframe( assert isinstance(catalog, lsdb.Catalog) assert isinstance(catalog._ddf, nd.NestedFrame) # Catalogs have the same information - assert catalog.hc_structure.catalog_info == small_sky_order1_catalog.hc_structure.catalog_info - # Index is set to hipscat index - assert catalog._ddf.index.name == HIPSCAT_ID_COLUMN + assert ( + catalog.hc_structure.catalog_info.explicit_dict() + == small_sky_order1_catalog.hc_structure.catalog_info.explicit_dict() + ) + # Index is set to spatial index + assert catalog._ddf.index.name == SPATIAL_INDEX_COLUMN # Dataframes have the same data (column data types may differ) pd.testing.assert_frame_equal( - catalog.compute().sort_index(), small_sky_order1_catalog.compute().sort_index() + catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), + small_sky_order1_catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), ) # Divisions belong to the respective HEALPix pixels assert_divisions_are_correct(catalog) # The arrow schema was automatically inferred - expected_schema = hc.read_from_hipscat(small_sky_order1_dir).schema + expected_schema = hc.read_hats(small_sky_order1_dir).schema assert catalog.hc_structure.schema.equals(expected_schema) assert isinstance(catalog.compute(), npd.NestedFrame) @@ -68,9 +72,9 @@ def test_from_dataframe_catalog_of_invalid_type(small_sky_order1_df, small_sky_o if catalog_type in valid_catalog_types: lsdb.from_dataframe(small_sky_order1_df, margin_threshold=None, **kwargs) else: - with pytest.raises(ValueError, match="Catalog must be of type OBJECT or SOURCE"): + with pytest.raises(ValueError): lsdb.from_dataframe(small_sky_order1_df, margin_threshold=None, **kwargs) - # Drop hipscat_index that might have been created in place + # Drop spatial_index that might have been created in place small_sky_order1_df.reset_index(drop=True, inplace=True) @@ -155,6 +159,7 @@ def test_from_dataframe_large_input(small_sky_order1_catalog, assert_divisions_a kwargs = { "catalog_name": original_catalog_info.catalog_name, "catalog_type": original_catalog_info.catalog_type, + "obs_regime": "Optical", } rng = np.random.default_rng() @@ -166,9 +171,11 @@ def test_from_dataframe_large_input(small_sky_order1_catalog, assert_divisions_a assert isinstance(catalog, lsdb.Catalog) # Catalogs have the same information original_catalog_info.total_rows = 1_500_000 - assert catalog.hc_structure.catalog_info == original_catalog_info - # Index is set to hipscat index - assert catalog._ddf.index.name == HIPSCAT_ID_COLUMN + assert catalog.hc_structure.catalog_info.explicit_dict() == original_catalog_info.explicit_dict() + assert catalog.hc_structure.catalog_info.__pydantic_extra__["obs_regime"] == "Optical" + assert catalog.hc_structure.catalog_info.__pydantic_extra__["hats_builder"].startswith("lsdb") + # Index is set to spatial index + assert catalog._ddf.index.name == SPATIAL_INDEX_COLUMN # Divisions belong to the respective HEALPix pixels assert_divisions_are_correct(catalog) @@ -211,6 +218,11 @@ def test_catalog_pixels_nested_ordering(small_sky_source_df): def test_from_dataframe_small_sky_source_with_margins(small_sky_source_df, small_sky_source_margin_catalog): + kwargs = { + "catalog_name": "small_sky_source", + "catalog_type": "source", + "obs_regime": "Optical", + } catalog = lsdb.from_dataframe( small_sky_source_df, ra_column="source_ra", @@ -220,6 +232,7 @@ def test_from_dataframe_small_sky_source_with_margins(small_sky_source_df, small threshold=3000, margin_order=8, margin_threshold=180, + **kwargs, ) assert catalog.margin is not None @@ -236,6 +249,11 @@ def test_from_dataframe_small_sky_source_with_margins(small_sky_source_df, small ) assert isinstance(catalog.margin.compute(), npd.NestedFrame) + assert catalog.hc_structure.catalog_info.__pydantic_extra__["obs_regime"] == "Optical" + assert catalog.margin.hc_structure.catalog_info.__pydantic_extra__["obs_regime"] == "Optical" + + assert catalog.hc_structure.catalog_info.__pydantic_extra__["hats_builder"].startswith("lsdb") + assert catalog.margin.hc_structure.catalog_info.__pydantic_extra__["hats_builder"].startswith("lsdb") # The margin and main catalog's schemas are the same assert catalog.margin.hc_structure.schema is catalog.hc_structure.schema @@ -304,23 +322,29 @@ def test_from_dataframe_without_moc(small_sky_order1_catalog): def test_from_dataframe_with_backend(small_sky_order1_df, small_sky_order1_dir): """Tests that we can initialize a catalog from a Pandas Dataframe with the desired backend""" - # Read the catalog from hipscat format using pyarrow, import it from a CSV using + # Read the catalog from hats format using pyarrow, import it from a CSV using # the same backend and assert that we obtain the same catalog - expected_catalog = lsdb.read_hipscat(small_sky_order1_dir) + expected_catalog = lsdb.read_hats(small_sky_order1_dir) kwargs = get_catalog_kwargs(expected_catalog) catalog = lsdb.from_dataframe(small_sky_order1_df, **kwargs) assert all(isinstance(col_type, pd.ArrowDtype) for col_type in catalog.dtypes) - pd.testing.assert_frame_equal(catalog.compute().sort_index(), expected_catalog.compute().sort_index()) + pd.testing.assert_frame_equal( + catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), + expected_catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), + ) # Test that we can also keep the original types if desired - expected_catalog = lsdb.read_hipscat(small_sky_order1_dir, dtype_backend=None) + expected_catalog = lsdb.read_hats(small_sky_order1_dir, dtype_backend=None) kwargs = get_catalog_kwargs(expected_catalog) catalog = lsdb.from_dataframe(small_sky_order1_df, use_pyarrow_types=False, **kwargs) assert all(isinstance(col_type, np.dtype) for col_type in catalog.dtypes) - pd.testing.assert_frame_equal(catalog.compute().sort_index(), expected_catalog.compute().sort_index()) + pd.testing.assert_frame_equal( + catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), + expected_catalog.compute().sort_values([SPATIAL_INDEX_COLUMN, "id"]), + ) def test_from_dataframe_with_arrow_schema(small_sky_order1_df, small_sky_order1_dir): - expected_schema = hc.read_from_hipscat(small_sky_order1_dir).schema + expected_schema = hc.read_hats(small_sky_order1_dir).schema catalog = lsdb.from_dataframe(small_sky_order1_df, schema=expected_schema) assert catalog.hc_structure.schema is expected_schema diff --git a/tests/lsdb/loaders/hipscat/test_read_hipscat.py b/tests/lsdb/loaders/hats/test_read_hats.py similarity index 67% rename from tests/lsdb/loaders/hipscat/test_read_hipscat.py rename to tests/lsdb/loaders/hats/test_read_hats.py index c1de547a..66edc730 100644 --- a/tests/lsdb/loaders/hipscat/test_read_hipscat.py +++ b/tests/lsdb/loaders/hats/test_read_hats.py @@ -1,72 +1,72 @@ from pathlib import Path -import hipscat as hc +import hats as hc import nested_dask as nd import nested_pandas as npd import numpy as np import numpy.testing as npt import pandas as pd import pytest -from hipscat.catalog.index.index_catalog import IndexCatalog -from hipscat.pixel_math import HealpixPixel +from hats.catalog.index.index_catalog import IndexCatalog +from hats.pixel_math import HealpixPixel from pandas.core.dtypes.base import ExtensionDtype import lsdb from lsdb.core.search import BoxSearch, ConeSearch, IndexSearch, OrderSearch, PolygonSearch -def test_read_hipscat(small_sky_order1_dir, small_sky_order1_hipscat_catalog, assert_divisions_are_correct): - catalog = lsdb.read_hipscat(small_sky_order1_dir) +def test_read_hats(small_sky_order1_dir, small_sky_order1_hats_catalog, assert_divisions_are_correct): + catalog = lsdb.read_hats(small_sky_order1_dir) assert isinstance(catalog, lsdb.Catalog) assert isinstance(catalog._ddf, nd.NestedFrame) - assert catalog.hc_structure.catalog_base_dir == small_sky_order1_hipscat_catalog.catalog_base_dir - assert catalog.get_healpix_pixels() == small_sky_order1_hipscat_catalog.get_healpix_pixels() + assert catalog.hc_structure.catalog_base_dir == small_sky_order1_hats_catalog.catalog_base_dir + assert catalog.get_healpix_pixels() == small_sky_order1_hats_catalog.get_healpix_pixels() assert len(catalog.compute().columns) == 8 assert isinstance(catalog.compute(), npd.NestedFrame) assert_divisions_are_correct(catalog) -def test_read_hipscat_with_columns(small_sky_order1_dir): +def test_read_hats_with_columns(small_sky_order1_dir): filter_columns = ["ra", "dec"] - catalog = lsdb.read_hipscat(small_sky_order1_dir, columns=filter_columns) + catalog = lsdb.read_hats(small_sky_order1_dir, columns=filter_columns) assert isinstance(catalog, lsdb.Catalog) npt.assert_array_equal(catalog.compute().columns.to_numpy(), filter_columns) -def test_read_hipscat_with_extra_kwargs(small_sky_order1_dir): - catalog = lsdb.read_hipscat(small_sky_order1_dir, filters=[("ra", ">", 300)], engine="pyarrow") +def test_read_hats_with_extra_kwargs(small_sky_order1_dir): + catalog = lsdb.read_hats(small_sky_order1_dir, filters=[("ra", ">", 300)], engine="pyarrow") assert isinstance(catalog, lsdb.Catalog) assert np.greater(catalog.compute()["ra"].to_numpy(), 300).all() -def test_pixels_in_map_equal_catalog_pixels(small_sky_order1_dir, small_sky_order1_hipscat_catalog): - catalog = lsdb.read_hipscat(small_sky_order1_dir) - for healpix_pixel in small_sky_order1_hipscat_catalog.get_healpix_pixels(): +def test_pixels_in_map_equal_catalog_pixels(small_sky_order1_dir, small_sky_order1_hats_catalog): + catalog = lsdb.read_hats(small_sky_order1_dir) + for healpix_pixel in small_sky_order1_hats_catalog.get_healpix_pixels(): catalog.get_partition(healpix_pixel.order, healpix_pixel.pixel) def test_wrong_pixel_raises_value_error(small_sky_order1_dir): - catalog = lsdb.read_hipscat(small_sky_order1_dir) + catalog = lsdb.read_hats(small_sky_order1_dir) with pytest.raises(ValueError): catalog.get_partition(-1, -1) -def test_parquet_data_in_partitions_match_files(small_sky_order1_dir, small_sky_order1_hipscat_catalog): - catalog = lsdb.read_hipscat(small_sky_order1_dir) - for healpix_pixel in small_sky_order1_hipscat_catalog.get_healpix_pixels(): +def test_parquet_data_in_partitions_match_files(small_sky_order1_dir, small_sky_order1_hats_catalog): + catalog = lsdb.read_hats(small_sky_order1_dir) + for healpix_pixel in small_sky_order1_hats_catalog.get_healpix_pixels(): hp_order = healpix_pixel.order hp_pixel = healpix_pixel.pixel partition = catalog.get_partition(hp_order, hp_pixel) partition_df = partition.compute() parquet_path = hc.io.paths.pixel_catalog_file( - small_sky_order1_hipscat_catalog.catalog_base_dir, healpix_pixel + small_sky_order1_hats_catalog.catalog_base_dir, healpix_pixel ) loaded_df = pd.read_parquet(parquet_path, dtype_backend="pyarrow") pd.testing.assert_frame_equal(partition_df, loaded_df) -def test_read_hipscat_specify_catalog_type(small_sky_catalog, small_sky_dir): - catalog = lsdb.read_hipscat(small_sky_dir, catalog_type=lsdb.Catalog) +def test_read_hats_specify_catalog_type(small_sky_catalog, small_sky_dir): + catalog = lsdb.read_hats(small_sky_dir, catalog_type=lsdb.Catalog) assert isinstance(catalog, lsdb.Catalog) assert isinstance(catalog._ddf, nd.NestedFrame) pd.testing.assert_frame_equal(catalog.compute(), small_sky_catalog.compute()) @@ -75,13 +75,13 @@ def test_read_hipscat_specify_catalog_type(small_sky_catalog, small_sky_dir): assert isinstance(catalog.compute(), npd.NestedFrame) -def test_read_hipscat_specify_wrong_catalog_type(small_sky_dir): +def test_read_hats_specify_wrong_catalog_type(small_sky_dir): with pytest.raises(ValueError): - lsdb.read_hipscat(small_sky_dir, catalog_type=int) + lsdb.read_hats(small_sky_dir, catalog_type=int) def test_catalog_with_margin_object(small_sky_xmatch_dir, small_sky_xmatch_margin_catalog): - catalog = lsdb.read_hipscat(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog) + catalog = lsdb.read_hats(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_catalog) assert isinstance(catalog, lsdb.Catalog) assert isinstance(catalog.margin, lsdb.MarginCatalog) assert isinstance(catalog._ddf, nd.NestedFrame) @@ -93,7 +93,7 @@ def test_catalog_with_margin_path( small_sky_xmatch_dir, small_sky_xmatch_margin_dir, small_sky_xmatch_margin_catalog ): assert isinstance(small_sky_xmatch_margin_dir, Path) - catalog = lsdb.read_hipscat(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_dir) + catalog = lsdb.read_hats(small_sky_xmatch_dir, margin_cache=small_sky_xmatch_margin_dir) assert isinstance(catalog, lsdb.Catalog) assert isinstance(catalog.margin, lsdb.MarginCatalog) assert isinstance(catalog._ddf, nd.NestedFrame) @@ -106,90 +106,90 @@ def test_catalog_with_margin_path( def test_catalog_without_margin_is_none(small_sky_xmatch_dir): - catalog = lsdb.read_hipscat(small_sky_xmatch_dir) + catalog = lsdb.read_hats(small_sky_xmatch_dir) assert isinstance(catalog, lsdb.Catalog) assert catalog.margin is None -def test_read_hipscat_subset_with_cone_search(small_sky_order1_dir, small_sky_order1_catalog): +def test_read_hats_subset_with_cone_search(small_sky_order1_dir, small_sky_order1_catalog): cone_search = ConeSearch(ra=0, dec=-80, radius_arcsec=20 * 3600) # Filtering using catalog's cone_search cone_search_catalog = small_sky_order1_catalog.cone_search(ra=0, dec=-80, radius_arcsec=20 * 3600) - # Filtering when calling `read_hipscat` - cone_search_catalog_2 = lsdb.read_hipscat(small_sky_order1_dir, search_filter=cone_search) + # Filtering when calling `read_hats` + cone_search_catalog_2 = lsdb.read_hats(small_sky_order1_dir, search_filter=cone_search) assert isinstance(cone_search_catalog_2, lsdb.Catalog) # The partitions of the catalogs are equivalent assert cone_search_catalog.get_healpix_pixels() == cone_search_catalog_2.get_healpix_pixels() pd.testing.assert_frame_equal(cone_search_catalog.compute(), cone_search_catalog_2.compute()) -def test_read_hipscat_subset_with_box_search(small_sky_order1_dir, small_sky_order1_catalog): +def test_read_hats_subset_with_box_search(small_sky_order1_dir, small_sky_order1_catalog): box_search = BoxSearch(ra=(0, 10), dec=(-20, 10)) # Filtering using catalog's box_search box_search_catalog = small_sky_order1_catalog.box_search(ra=(0, 10), dec=(-20, 10)) - # Filtering when calling `read_hipscat` - box_search_catalog_2 = lsdb.read_hipscat(small_sky_order1_dir, search_filter=box_search) + # Filtering when calling `read_hats` + box_search_catalog_2 = lsdb.read_hats(small_sky_order1_dir, search_filter=box_search) assert isinstance(box_search_catalog_2, lsdb.Catalog) # The partitions of the catalogs are equivalent assert box_search_catalog.get_healpix_pixels() == box_search_catalog_2.get_healpix_pixels() pd.testing.assert_frame_equal(box_search_catalog.compute(), box_search_catalog_2.compute()) -def test_read_hipscat_subset_with_polygon_search(small_sky_order1_dir, small_sky_order1_catalog): +def test_read_hats_subset_with_polygon_search(small_sky_order1_dir, small_sky_order1_catalog): vertices = [(300, -50), (300, -55), (272, -55), (272, -50)] polygon_search = PolygonSearch(vertices) # Filtering using catalog's polygon_search polygon_search_catalog = small_sky_order1_catalog.polygon_search(vertices) - # Filtering when calling `read_hipscat` - polygon_search_catalog_2 = lsdb.read_hipscat(small_sky_order1_dir, search_filter=polygon_search) + # Filtering when calling `read_hats` + polygon_search_catalog_2 = lsdb.read_hats(small_sky_order1_dir, search_filter=polygon_search) assert isinstance(polygon_search_catalog_2, lsdb.Catalog) # The partitions of the catalogs are equivalent assert polygon_search_catalog.get_healpix_pixels() == polygon_search_catalog_2.get_healpix_pixels() pd.testing.assert_frame_equal(polygon_search_catalog.compute(), polygon_search_catalog_2.compute()) -def test_read_hipscat_subset_with_index_search( +def test_read_hats_subset_with_index_search( small_sky_order1_dir, small_sky_order1_catalog, small_sky_order1_id_index_dir, ): - catalog_index = IndexCatalog.read_from_hipscat(small_sky_order1_id_index_dir) + catalog_index = IndexCatalog.read_hats(small_sky_order1_id_index_dir) # Filtering using catalog's index_search index_search_catalog = small_sky_order1_catalog.index_search([700], catalog_index) - # Filtering when calling `read_hipscat` + # Filtering when calling `read_hats` index_search = IndexSearch([700], catalog_index) - index_search_catalog_2 = lsdb.read_hipscat(small_sky_order1_dir, search_filter=index_search) + index_search_catalog_2 = lsdb.read_hats(small_sky_order1_dir, search_filter=index_search) assert isinstance(index_search_catalog_2, lsdb.Catalog) # The partitions of the catalogs are equivalent assert index_search_catalog.get_healpix_pixels() == index_search_catalog_2.get_healpix_pixels() -def test_read_hipscat_subset_with_order_search(small_sky_source_catalog, small_sky_source_dir): +def test_read_hats_subset_with_order_search(small_sky_source_catalog, small_sky_source_dir): order_search = OrderSearch(min_order=1, max_order=2) # Filtering using catalog's order_search order_search_catalog = small_sky_source_catalog.order_search(min_order=1, max_order=2) - # Filtering when calling `read_hipscat` - order_search_catalog_2 = lsdb.read_hipscat(small_sky_source_dir, search_filter=order_search) + # Filtering when calling `read_hats` + order_search_catalog_2 = lsdb.read_hats(small_sky_source_dir, search_filter=order_search) assert isinstance(order_search_catalog_2, lsdb.Catalog) # The partitions of the catalogs are equivalent assert order_search_catalog.get_healpix_pixels() == order_search_catalog_2.get_healpix_pixels() -def test_read_hipscat_subset_no_partitions(small_sky_order1_dir, small_sky_order1_id_index_dir): +def test_read_hats_subset_no_partitions(small_sky_order1_dir, small_sky_order1_id_index_dir): with pytest.raises(ValueError, match="no coverage"): - catalog_index = IndexCatalog.read_from_hipscat(small_sky_order1_id_index_dir) + catalog_index = IndexCatalog.read_hats(small_sky_order1_id_index_dir) index_search = IndexSearch([900], catalog_index) - lsdb.read_hipscat(small_sky_order1_dir, search_filter=index_search) + lsdb.read_hats(small_sky_order1_dir, search_filter=index_search) -def test_read_hipscat_with_margin_subset( +def test_read_hats_with_margin_subset( small_sky_order1_source_dir, small_sky_order1_source_with_margin, small_sky_order1_source_margin_catalog ): cone_search = ConeSearch(ra=315, dec=-66, radius_arcsec=20) # Filtering using catalog's cone_search cone_search_catalog = small_sky_order1_source_with_margin.cone_search(ra=315, dec=-66, radius_arcsec=20) - # Filtering when calling `read_hipscat` - cone_search_catalog_2 = lsdb.read_hipscat( + # Filtering when calling `read_hats` + cone_search_catalog_2 = lsdb.read_hats( small_sky_order1_source_dir, search_filter=cone_search, margin_cache=small_sky_order1_source_margin_catalog, @@ -202,34 +202,34 @@ def test_read_hipscat_with_margin_subset( ) -def test_read_hipscat_with_backend(small_sky_dir): +def test_read_hats_with_backend(small_sky_dir): # By default, the schema is backed by pyarrow - default_catalog = lsdb.read_hipscat(small_sky_dir) + default_catalog = lsdb.read_hats(small_sky_dir) assert all(isinstance(col_type, pd.ArrowDtype) for col_type in default_catalog.dtypes) # We can also pass it explicitly as an argument - catalog = lsdb.read_hipscat(small_sky_dir, dtype_backend="pyarrow") + catalog = lsdb.read_hats(small_sky_dir, dtype_backend="pyarrow") assert catalog.dtypes.equals(default_catalog.dtypes) # Load data using a numpy-nullable types. - catalog = lsdb.read_hipscat(small_sky_dir, dtype_backend="numpy_nullable") + catalog = lsdb.read_hats(small_sky_dir, dtype_backend="numpy_nullable") assert all(isinstance(col_type, ExtensionDtype) for col_type in catalog.dtypes) # The other option is to keep the original types. In this case they are numpy-backed. - catalog = lsdb.read_hipscat(small_sky_dir, dtype_backend=None) + catalog = lsdb.read_hats(small_sky_dir, dtype_backend=None) assert all(isinstance(col_type, np.dtype) for col_type in catalog.dtypes) assert isinstance(catalog._ddf, nd.NestedFrame) assert isinstance(catalog.compute(), npd.NestedFrame) -def test_read_hipscat_with_invalid_backend(small_sky_dir): +def test_read_hats_with_invalid_backend(small_sky_dir): with pytest.raises(ValueError, match="data type backend must be either"): - lsdb.read_hipscat(small_sky_dir, dtype_backend="abc") + lsdb.read_hats(small_sky_dir, dtype_backend="abc") -def test_read_hipscat_margin_catalog_subset( +def test_read_hats_margin_catalog_subset( small_sky_order1_source_margin_dir, small_sky_order1_source_margin_catalog, assert_divisions_are_correct ): search_filter = ConeSearch(ra=315, dec=-60, radius_arcsec=10) - margin = lsdb.read_hipscat(small_sky_order1_source_margin_dir, search_filter=search_filter) + margin = lsdb.read_hats(small_sky_order1_source_margin_dir, search_filter=search_filter) margin_info = margin.hc_structure.catalog_info small_sky_order1_source_margin_info = small_sky_order1_source_margin_catalog.hc_structure.catalog_info @@ -247,15 +247,15 @@ def test_read_hipscat_margin_catalog_subset( assert_divisions_are_correct(margin) -def test_read_hipscat_margin_catalog_subset_is_empty(small_sky_order1_source_margin_dir): +def test_read_hats_margin_catalog_subset_is_empty(small_sky_order1_source_margin_dir): search_filter = ConeSearch(ra=100, dec=80, radius_arcsec=1) - margin_catalog = lsdb.read_hipscat(small_sky_order1_source_margin_dir, search_filter=search_filter) + margin_catalog = lsdb.read_hats(small_sky_order1_source_margin_dir, search_filter=search_filter) assert len(margin_catalog.get_healpix_pixels()) == 0 assert len(margin_catalog._ddf_pixel_map) == 0 assert len(margin_catalog.compute()) == 0 assert len(margin_catalog.hc_structure.pixel_tree) == 0 -def test_read_hipscat_schema_not_found(small_sky_no_metadata_dir): +def test_read_hats_schema_not_found(small_sky_no_metadata_dir): with pytest.raises(ValueError, match="catalog schema could not be loaded"): - lsdb.read_hipscat(small_sky_no_metadata_dir) + lsdb.read_hats(small_sky_no_metadata_dir)