Analyzing cloud-hosted AllWISE Source Catalog in Parquet format#

Learning Goals#

  • Learn how to load data from the AllWISE parquet catalog that is partitioned by HEALPix pixel index at order 5.

  • Learn efficient methods for performing common types of searches. This includes:

    • query/load using pandas, applying basic filters

    • query/load using pyarrow, applying advanced filters that combine and/or compare columns

    • perform nearest neighbor searches using pyarrow and astropy

Introduction#

This notebook demonstrates access to the HEALPix-partitioned (order 5), Apache Parquet version of the AllWISE Source Catalog. The catalog is available through the AWS Open Data program, as part of the NASA Open-Source Science Initiative.

Parquet is convenient for large astronomical catalogs in part because the storage format supports efficient database-style queries on the files themselves, without having to load the catalog into a database (or into memory) first. The AllWISE catalog is fairly large at 340 GB. The examples below demonstrate different methods that can be used to query the catalog, filtering the data and loading only the results. Each method accesses the parquet files a bit differently and is useful for different types of queries.

Imports#

# Uncomment the next line to install dependencies if needed.
# !pip install pandas>=1.5.2 pyarrow>=10.0.1 matplotlib hpgeom astropy
import sys

import hpgeom as hp
import pandas as pd
import pyarrow.compute as pc
import pyarrow.dataset as ds
from astropy import units as u
from astropy.coordinates import SkyCoord
from matplotlib import colors
from matplotlib import pyplot as plt
from pyarrow.fs import S3FileSystem

Setup catalog paths and query filters#

This AllWISE catalog is stored in an AWS S3 bucket. To connect to an S3 bucket we just need to point the reader at S3 instead of the local filesystem, and pass in AWS credentials. (Here, a “reader” is a python library that reads parquet files.) We’ll use pyarrow.fs.S3FileSystem for this because it is recognized by every reader in examples below, and we’re already using pyarrow. s3fs is another common option. The call to S3FileSystem will look for AWS credentials in environment variables and/or the file ~/.aws/credentials. Credentials can also be passed as keyword arguments.

bucket = "nasa-irsa-wise"
folder = "wise/allwise/catalogs/p3as_psd/healpix_k5"
parquet_root = f"{bucket}/{folder}/wise-allwise.parquet"

fs = S3FileSystem(region="us-west-2")  # the bucket is in region us-west-2

These limits will be used to query the catalog using specific filters created in examples below. The Schema Access section (below) shows how to access column names and other schema information.

w1mpro_min = 10.0
ra_min, ra_max = 15, 25  # deg
dec_min, dec_max = 62, 72  # deg
polygon_corners = [(ra_min, dec_min), (ra_min, dec_max), (ra_max, dec_max), (ra_max, dec_min)]
radius = 5 * u.arcmin.to(u.deg)

The catalog is partitioned by HEALPix pixel index at order 5. Queries can be most efficient when a filter on the partition column is included, since the reader can skip those partitions entirely. Thus, for queries that include ra/dec constraints, we can usually speed up load times significantly by including a constraint on the HEALPix order 5 pixel index. The required pixel indexes can be calculated using hpgeom, as demonstrated here.

order = 5  # the catalog is partitioned by HEALPix pixel index at order 5
nside = hp.order_to_nside(order)  # number of order 5 pixels along one side of a base pixel
# polygon search: get the set of pixel indexes that overlap the ra/dec polygon
polygon_pixels = hp.query_polygon(
    nside=nside,
    a=[corner[0] for corner in polygon_corners],  # ra values
    b=[corner[1] for corner in polygon_corners],  # dec values
    nest=True,  # catalog uses nested ordering scheme for pixel index
    inclusive=True,  # return all pixels that overlap with the polygon, and maybe a few more
)

print(f"polygon_pixels contains {len(polygon_pixels)} of a possible {hp.nside_to_npixel(nside)} pixels")
polygon_pixels contains 25 of a possible 12288 pixels
# cone search: get the set of pixel indexes that overlap a 5' circle around the ra/dec min
cone_pixels = hp.query_circle(
    nside=nside,
    a=ra_min,
    b=dec_min,
    radius=radius,
    nest=True,  # catalog uses nested ordering scheme for pixel index
    inclusive=True,  # return all pixels that overlap with the disk, and maybe a few more
)

# this can reduce the number of partitions the reader needs to look at from 12288 down to 2
print(f"cone_pixels contains {len(cone_pixels)} of a possible {hp.nside_to_npixel(nside)} pixels")
cone_pixels contains 2 of a possible 12288 pixels

Example 1: Pandas with basic filters (magnitude limit and ra/dec polygon)#

Load using pandas.read_parquet. Filter for magnitudes above our w1mpro limit and a sky-area limited to the ra/dec polygon.

Pandas actually uses either pyarrow or fastparquet to interact with parquet files. We’ll choose pyarrow (the default). For filter options, see the filters arg description in ParquetDataset.

%%time
# expect this to take 40-90 seconds
pandas_df = pd.read_parquet(
    parquet_root,
    filesystem=fs,
    # columns to be returned. similar to a SQL SELECT clause.
    columns=["designation", "ra", "dec", "w1mpro", "healpix_k5"],
    # row filters. similar to a SQL WHERE clause.
    # tuple conditions are joined by AND (for OR, use a list of lists)
    # supported operators: ==, !=, <, >, <=, >=, in, not in
    filters=[
        ("w1mpro", ">", w1mpro_min),
        ("ra", ">", ra_min),
        ("ra", "<", ra_max),
        ("dec", ">", dec_min),
        ("dec", "<", dec_max),
        # include filter on partition column for most efficient loading
        ("healpix_k5", "in", polygon_pixels),
    ],
)

pandas_df.describe()
CPU times: user 5.02 s, sys: 1.72 s, total: 6.74 s
Wall time: 22.8 s
ra dec w1mpro
count 870641.000000 870641.000000 870641.000000
mean 20.014620 66.582893 14.788122
std 2.900022 2.835385 1.441931
min 15.000000 62.000001 10.001000
25% 17.489370 64.121702 14.003000
50% 20.038686 66.416329 14.992000
75% 22.525137 68.928682 15.792000
max 25.000000 71.999960 19.079000

Example 2: Pyarrow with advanced filters (color-color cuts for AGN)#

Load using pyarrow.dataset.parquet_dataset and convert to pandas. Useful for:

  1. advanced filters that combine, compare, and/or create new columns. (this example)

  2. speed. This method is more efficient at “discovering” the dataset than pandas. It also provides a persistent dataset object that can be reused for future queries, where pandas must re-discover the dataset every time. (this example and Example 3)

This example filters the catalog for AGN by making cuts in color-color space using the selection limits from Mateos et al. (2012). This is a more complicated filter than in Example 1 (it requires both constructing new columns and comparing values between columns) but this load is generally faster, demonstrating the efficiency of this method.

For basic info about the columns and filter arguments, see Scanner. The construction of columns/filters is more involved than before because they must be passed as Expressions, and all operations must be done using pyarrow.compute functions and fields. This is demonstrated below. Note that the catalog uses a file naming scheme called “hive”, which the reader uses to identify partitions. In other examples this is recognized automatically, but here we must pass it explicitly.

# define new columns for colors W1-W2 and W3-W4
w1w2 = pc.subtract(pc.field("w1mpro"), pc.field("w2mpro"))
w3w4 = pc.subtract(pc.field("w3mpro"), pc.field("w4mpro"))

# define the AGN locus, as in Mateos et al., 2012
locus = pc.multiply(pc.scalar(0.5), w3w4)
%%time
# expect this to take 20-60 seconds.
# notice this is generally faster than example 1 using pandas even though
# this filter is much more complicated, highlighting the efficiency of this method.

# load catalog metadata as a pyarrow dataset
pyarrow_ds = ds.parquet_dataset(f"{parquet_root}/_metadata", filesystem=fs, partitioning="hive")

# query for AGN using selection limits from Mateos et al., 2012
pyarrow_df = pyarrow_ds.to_table(
    # column filter. similar to a SQL SELECT clause.
    columns={
        "w1w2": w1w2,
        "w3w4": w3w4,
        "cntr": pc.field("cntr"),
        "ra": pc.field("ra"),
        "dec": pc.field("dec"),
        "healpix_k5": pc.field("healpix_k5"),
    },
    # row filter. similar to a SQL WHERE clause.
    filter=(
        # color-color cuts
        (w1w2 < pc.add(locus, pc.scalar(0.979)))
        & (w1w2 > pc.subtract(locus, pc.scalar(0.405)))
        & (w3w4 > pc.scalar(1.76))
        # to do an all-sky search, comment out the rest of the filter. expect it to take 30-60 min
        # same ra/dec polygon as before
        & (pc.field("ra") > ra_min)
        & (pc.field("ra") < ra_max)
        & (pc.field("dec") > dec_min)
        & (pc.field("dec") < dec_max)
        # same partition-column filter as before
        & (pc.field("healpix_k5").isin(polygon_pixels))
    ),
).to_pandas()
CPU times: user 4.48 s, sys: 2.25 s, total: 6.72 s
Wall time: 18 s
len(pyarrow_df.index)
3750
colorbar_norm = colors.LogNorm(vmin=1, vmax=10)  # for an all-sky search, use vmax=100_000
pyarrow_df.plot.hexbin("w3w4", "w1w2", norm=colorbar_norm)
<Axes: xlabel='w3w4', ylabel='w1w2'>
../../_images/82a51954b1fe36f5dd572870f5cc24914d4974630e888c31bdb1272e00c589e3.png

Example 3: Nearest-neighbor search (using pyarrow and astropy)#

Nearest-neighbor searches and cone searches generally use the on-sky separation distance to determine the matches. It would be cumbersome to construct the new column and filter on it using the methods shown above because the separation distance is a fairly complicated function of ra and dec. However, we can get pretty fast results by filtering down to the HEALPix pixels that cover the region, loading all the data in those partitions, and then using astropy to compute the separations and find the matches.

Here, we’ll search for the 3 nearest neighbors to each of the 4 corners of our ra/dec polygon. We’ll load the data with pyarrow because because it makes this query significantly faster than with pandas (see explanation in Example 2). (Note that astropy can also read parquet, but it can only read a single file at a time and so is less convenient.) We’ll use astropy.coordinates.SkyCoord.match_to_catalog_sky to do the actual nearest neighbor search.

# construct dictionary of pixels covering a cone around each polygon corner
# we did this once before but now we want all 4 corners
corner_cone_pixels = {
    (ra, dec): hp.query_circle(nside=nside, a=ra, b=dec, radius=radius, nest=True, inclusive=True)
    for (ra, dec) in polygon_corners
}
corner_cone_pixels
{(15, 62): array([757, 928]),
 (15, 72): array([947, 950, 953]),
 (25, 72): array([948, 949]),
 (25, 62): array([908])}

Find the 3 nearest neighbors of each corner:

%%time
# expect this to take 30-60 seconds
idcol = "cntr"
neighbor_ids = []  # store the allwise source id (cntr) of each neighbor
corner_neighbors = {}  # record neighbor info for each corner (for reference. not actually used)

# use same pyarrow dataset as before, but get it again to include the load time in this cell
pyarrow_ds = ds.parquet_dataset(f"{parquet_root}/_metadata", filesystem=fs, partitioning="hive")

for (ra, dec), cone_pixels in corner_cone_pixels.items():

    # load data from all pixels/partitions/files covering this corner
    src_tbl = pyarrow_ds.to_table(
        columns=[idcol, "ra", "dec"], filter=(pc.field("healpix_k5").isin(cone_pixels))
    )

    # get list of 3 nearest neighbors to this corner
    corner = SkyCoord(ra=ra * u.degree, dec=dec * u.degree)
    allwise_sources = SkyCoord(ra=src_tbl["ra"] * u.degree, dec=src_tbl["dec"] * u.degree)
    neighbors = [corner.match_to_catalog_sky(allwise_sources, nthneighbor=i) for i in range(1, 4)]

    # get the allwise source ids. record/report some info
    corner_neighbors[(ra, dec)] = []
    for n, (idx, sep, _) in enumerate(neighbors):
        srcid = src_tbl[idcol][idx.item()].as_py()
        neighbor_ids.append(srcid)
        corner_neighbors[(ra, dec)].append((srcid, sep))
        print(f"neighbor {n+1}, corner ({ra}, {dec}): {srcid} at on-sky dist {sep.to('arcsec')}")

neighbor_ids
neighbor 1, corner (15, 62): 157162001351035963 at on-sky dist [7.90224006] arcsec
neighbor 2, corner (15, 62): 157162001351036469 at on-sky dist [8.50715008] arcsec
neighbor 3, corner (15, 62): 157162001351035211 at on-sky dist [10.86567525] arcsec
neighbor 1, corner (15, 72): 145172601351006308 at on-sky dist [10.93439298] arcsec
neighbor 2, corner (15, 72): 145172601351005598 at on-sky dist [25.54305849] arcsec
neighbor 3, corner (15, 72): 145172601351004924 at on-sky dist [28.06138449] arcsec
neighbor 1, corner (25, 72): 243172601351002865 at on-sky dist [12.86477229] arcsec
neighbor 2, corner (25, 72): 243172601351004919 at on-sky dist [22.84314776] arcsec
neighbor 3, corner (25, 72): 243172601351003808 at on-sky dist [22.86047987] arcsec
neighbor 1, corner (25, 62): 252162001351031532 at on-sky dist [7.458129] arcsec
neighbor 2, corner (25, 62): 252162001351031550 at on-sky dist [14.2719862] arcsec
neighbor 3, corner (25, 62): 252162001351031549 at on-sky dist [18.96407889] arcsec
CPU times: user 7.38 s, sys: 10.4 s, total: 17.8 s
Wall time: 1min
[157162001351035963,
 157162001351036469,
 157162001351035211,
 145172601351006308,
 145172601351005598,
 145172601351004924,
 243172601351002865,
 243172601351004919,
 243172601351003808,
 252162001351031532,
 252162001351031550,
 252162001351031549]

Load all the data (all columns) for all nearest neighbors:

%%time
# expect this to take 15-25 seconds
cone_pixels = [pixel for cone_pixels in corner_cone_pixels.values() for pixel in cone_pixels]
neighbors_df = pyarrow_ds.to_table(
    filter=((pc.field(idcol).isin(neighbor_ids)) & (pc.field("healpix_k5").isin(cone_pixels)))
).to_pandas()

neighbors_df
CPU times: user 2.45 s, sys: 1.88 s, total: 4.33 s
Wall time: 4.5 s
designation ra dec sigra sigdec sigradec glon glat elon elat ... h_msig_2mass k_m_2mass k_msig_2mass x y z spt_ind htm20 healpix_k0 healpix_k5
0 J013958.40+620015.2 24.993333 62.004237 0.0398 0.0489 -0.0058 128.594461 -0.332646 51.412734 46.989544 ... 0.040 11.843 0.030 0.425450 0.198330 0.882982 231130002 16887982685832 0 908
1 J013958.51+620009.7 24.993832 62.002708 0.1038 0.1627 -0.0660 128.594977 -0.334105 51.411840 46.988121 ... 0.054 13.759 0.054 0.425469 0.198344 0.882970 231130002 16887982683755 0 908
2 J014000.56+615953.6 25.002354 61.998248 0.0398 0.0379 0.0094 128.599742 -0.337737 51.413364 46.982221 ... 0.032 11.662 0.019 0.425502 0.198436 0.882933 231130002 16887983158948 0 908
3 J005959.07+615955.5 14.996146 61.998757 0.0868 0.0854 -0.0219 123.934996 -0.856265 45.573400 49.619268 ... 0.162 15.280 0.162 0.453501 0.121483 0.882937 231122233 16882422834846 0 928
4 J005959.19+620006.3 14.996627 62.001754 0.1677 0.1633 -0.0432 123.935122 -0.853262 45.576424 49.621547 ... NaN NaN NaN 0.453456 0.121474 0.882962 231122233 16882422833160 0 928
5 J010001.07+620007.7 15.004480 62.002165 0.0534 0.0510 0.0053 123.938794 -0.852729 45.581382 49.619691 ... 0.055 13.940 0.059 0.453433 0.121535 0.882965 231122233 16882422783986 0 928
6 J005956.32+720019.0 14.984687 72.005287 0.0997 0.0960 -0.0153 123.596773 9.144601 56.543000 57.227891 ... 0.125 15.182 0.143 0.298424 0.079877 0.951085 231010101 16785925865144 0 947
7 J010001.48+715951.5 15.006188 71.997640 0.2109 0.2034 -0.0539 123.603758 9.137181 56.541620 57.217789 ... NaN 15.436 0.165 0.298517 0.080022 0.951044 231010101 16785926933871 0 947
8 J010002.55+720025.4 15.010649 72.007066 0.0514 0.0498 0.0083 123.604831 9.146649 56.555769 57.223452 ... 0.038 13.571 0.043 0.298359 0.080005 0.951095 231010101 16785925808192 0 947
9 J013956.82+720017.4 24.986791 72.004858 0.5317 0.5261 -0.1661 126.704895 9.489459 60.653660 55.154163 ... NaN NaN NaN 0.280022 0.130498 0.951083 231322133 17018750630425 0 949
10 J013958.03+715950.9 24.991821 71.997474 0.0579 0.0571 -0.0024 126.707862 9.482503 60.647616 55.147453 ... 0.057 14.207 0.064 0.280121 0.130574 0.951043 231322133 17018750602154 0 949
11 J013959.48+715937.2 24.997836 71.993685 0.1479 0.1445 -0.0417 126.710442 9.479135 60.645958 55.143341 ... 0.284 15.672 0.239 0.280164 0.130630 0.951022 231322133 17018750518198 0 949

12 rows × 300 columns

Schema Access#

The schema can be viewed online and also accessed from the parquet catalog itself. The example below loads it using the _common_metadata file and pyarrow.dataset.parquet_dataset. Note that the schema can also be accessed from the metadata in the footer of each Parquet file and from the _metadata file, but the method used here is generally faster and easier. In addition, this _common_metadata file has extra information (units and descriptions) stored in the custom metadata of each column.

schema = ds.parquet_dataset(f"{parquet_root}/_common_metadata", filesystem=fs).schema
# access individual columns by name or index
fld = schema.field(1)  # equivalently: fld = schema.field("ra")

# basic column information
print(fld.name)
print(fld.type)
print(fld.nullable)

# units and descriptions are in the `metadata` attribute, always as bytestrings
print(fld.metadata)
print(fld.metadata[b"units"].decode())  # use decode to get a regular string
print(fld.metadata[b"description"].decode())
ra
double
False
{b'units': b'deg', b'description': b'J2000 right ascension with respect to the 2MASS PSC reference frame from the non-moving source extraction.'}
deg
J2000 right ascension with respect to the 2MASS PSC reference frame from the non-moving source extraction.
# full list of column names
schema.names
['designation',
 'ra',
 'dec',
 'sigra',
 'sigdec',
 'sigradec',
 'glon',
 'glat',
 'elon',
 'elat',
 'wx',
 'wy',
 'cntr',
 'source_id',
 'coadd_id',
 'src',
 'w1mpro',
 'w1sigmpro',
 'w1snr',
 'w1rchi2',
 'w2mpro',
 'w2sigmpro',
 'w2snr',
 'w2rchi2',
 'w3mpro',
 'w3sigmpro',
 'w3snr',
 'w3rchi2',
 'w4mpro',
 'w4sigmpro',
 'w4snr',
 'w4rchi2',
 'rchi2',
 'nb',
 'na',
 'w1sat',
 'w2sat',
 'w3sat',
 'w4sat',
 'satnum',
 'ra_pm',
 'dec_pm',
 'sigra_pm',
 'sigdec_pm',
 'sigradec_pm',
 'pmra',
 'sigpmra',
 'pmdec',
 'sigpmdec',
 'w1rchi2_pm',
 'w2rchi2_pm',
 'w3rchi2_pm',
 'w4rchi2_pm',
 'rchi2_pm',
 'pmcode',
 'cc_flags',
 'rel',
 'ext_flg',
 'var_flg',
 'ph_qual',
 'det_bit',
 'moon_lev',
 'w1nm',
 'w1m',
 'w2nm',
 'w2m',
 'w3nm',
 'w3m',
 'w4nm',
 'w4m',
 'w1cov',
 'w2cov',
 'w3cov',
 'w4cov',
 'w1cc_map',
 'w1cc_map_str',
 'w2cc_map',
 'w2cc_map_str',
 'w3cc_map',
 'w3cc_map_str',
 'w4cc_map',
 'w4cc_map_str',
 'best_use_cntr',
 'ngrp',
 'w1flux',
 'w1sigflux',
 'w1sky',
 'w1sigsk',
 'w1conf',
 'w2flux',
 'w2sigflux',
 'w2sky',
 'w2sigsk',
 'w2conf',
 'w3flux',
 'w3sigflux',
 'w3sky',
 'w3sigsk',
 'w3conf',
 'w4flux',
 'w4sigflux',
 'w4sky',
 'w4sigsk',
 'w4conf',
 'w1mag',
 'w1sigm',
 'w1flg',
 'w1mcor',
 'w2mag',
 'w2sigm',
 'w2flg',
 'w2mcor',
 'w3mag',
 'w3sigm',
 'w3flg',
 'w3mcor',
 'w4mag',
 'w4sigm',
 'w4flg',
 'w4mcor',
 'w1mag_1',
 'w1sigm_1',
 'w1flg_1',
 'w2mag_1',
 'w2sigm_1',
 'w2flg_1',
 'w3mag_1',
 'w3sigm_1',
 'w3flg_1',
 'w4mag_1',
 'w4sigm_1',
 'w4flg_1',
 'w1mag_2',
 'w1sigm_2',
 'w1flg_2',
 'w2mag_2',
 'w2sigm_2',
 'w2flg_2',
 'w3mag_2',
 'w3sigm_2',
 'w3flg_2',
 'w4mag_2',
 'w4sigm_2',
 'w4flg_2',
 'w1mag_3',
 'w1sigm_3',
 'w1flg_3',
 'w2mag_3',
 'w2sigm_3',
 'w2flg_3',
 'w3mag_3',
 'w3sigm_3',
 'w3flg_3',
 'w4mag_3',
 'w4sigm_3',
 'w4flg_3',
 'w1mag_4',
 'w1sigm_4',
 'w1flg_4',
 'w2mag_4',
 'w2sigm_4',
 'w2flg_4',
 'w3mag_4',
 'w3sigm_4',
 'w3flg_4',
 'w4mag_4',
 'w4sigm_4',
 'w4flg_4',
 'w1mag_5',
 'w1sigm_5',
 'w1flg_5',
 'w2mag_5',
 'w2sigm_5',
 'w2flg_5',
 'w3mag_5',
 'w3sigm_5',
 'w3flg_5',
 'w4mag_5',
 'w4sigm_5',
 'w4flg_5',
 'w1mag_6',
 'w1sigm_6',
 'w1flg_6',
 'w2mag_6',
 'w2sigm_6',
 'w2flg_6',
 'w3mag_6',
 'w3sigm_6',
 'w3flg_6',
 'w4mag_6',
 'w4sigm_6',
 'w4flg_6',
 'w1mag_7',
 'w1sigm_7',
 'w1flg_7',
 'w2mag_7',
 'w2sigm_7',
 'w2flg_7',
 'w3mag_7',
 'w3sigm_7',
 'w3flg_7',
 'w4mag_7',
 'w4sigm_7',
 'w4flg_7',
 'w1mag_8',
 'w1sigm_8',
 'w1flg_8',
 'w2mag_8',
 'w2sigm_8',
 'w2flg_8',
 'w3mag_8',
 'w3sigm_8',
 'w3flg_8',
 'w4mag_8',
 'w4sigm_8',
 'w4flg_8',
 'w1magp',
 'w1sigp1',
 'w1sigp2',
 'w1k',
 'w1ndf',
 'w1mlq',
 'w1mjdmin',
 'w1mjdmax',
 'w1mjdmean',
 'w2magp',
 'w2sigp1',
 'w2sigp2',
 'w2k',
 'w2ndf',
 'w2mlq',
 'w2mjdmin',
 'w2mjdmax',
 'w2mjdmean',
 'w3magp',
 'w3sigp1',
 'w3sigp2',
 'w3k',
 'w3ndf',
 'w3mlq',
 'w3mjdmin',
 'w3mjdmax',
 'w3mjdmean',
 'w4magp',
 'w4sigp1',
 'w4sigp2',
 'w4k',
 'w4ndf',
 'w4mlq',
 'w4mjdmin',
 'w4mjdmax',
 'w4mjdmean',
 'rho12',
 'rho23',
 'rho34',
 'q12',
 'q23',
 'q34',
 'xscprox',
 'w1rsemi',
 'w1ba',
 'w1pa',
 'w1gmag',
 'w1gerr',
 'w1gflg',
 'w2rsemi',
 'w2ba',
 'w2pa',
 'w2gmag',
 'w2gerr',
 'w2gflg',
 'w3rsemi',
 'w3ba',
 'w3pa',
 'w3gmag',
 'w3gerr',
 'w3gflg',
 'w4rsemi',
 'w4ba',
 'w4pa',
 'w4gmag',
 'w4gerr',
 'w4gflg',
 'tmass_key',
 'r_2mass',
 'pa_2mass',
 'n_2mass',
 'j_m_2mass',
 'j_msig_2mass',
 'h_m_2mass',
 'h_msig_2mass',
 'k_m_2mass',
 'k_msig_2mass',
 'x',
 'y',
 'z',
 'spt_ind',
 'htm20',
 'healpix_k0',
 'healpix_k5']

About this notebook#

Author: Troy Raen (IRSA Developer) in conjunction with David Shupe, Jessica Krick and the IPAC Science Platform team

Updated: 2023-07-27

Contact: the IRSA Helpdesk with questions or reporting problems.