Source code for opihiexarata.photometry.panstarrs

"""Photometric database access using PANSTARRS data. There are a few ways and
they are implemented here."""

import astropy.io.ascii as ap_ascii
import astropy.table as ap_table
import numpy as np
import requests

import opihiexarata.library as library
import opihiexarata.library.error as error
import opihiexarata.library.hint as hint

PANSTARRS_AVAILABLE_COLUMNS = [
    "objName",
    "objAltName1",
    "objAltName2",
    "objAltName3",
    "objID",
    "uniquePspsOBid",
    "ippObjID",
    "surveyID",
    "htmID",
    "zoneID",
    "tessID",
    "projectionID",
    "skyCellID",
    "randomID",
    "batchID",
    "dvoRegionID",
    "processingVersion",
    "objInfoFlag",
    "qualityFlag",
    "raStack",
    "decStack",
    "raStackErr",
    "decStackErr",
    "raMean",
    "decMean",
    "raMeanErr",
    "decMeanErr",
    "epochMean",
    "posMeanChisq",
    "cx",
    "cy",
    "cz",
    "lambda",
    "beta",
    "l",
    "b",
    "nStackObjectRows",
    "nStackDetections",
    "nDetections",
    "ng",
    "nr",
    "ni",
    "nz",
    "ny",
    "gQfPerfect",
    "gMeanPSFMag",
    "gMeanPSFMagErr",
    "gMeanPSFMagStd",
    "gMeanPSFMagNpt",
    "gMeanPSFMagMin",
    "gMeanPSFMagMax",
    "gMeanKronMag",
    "gMeanKronMagErr",
    "gMeanKronMagStd",
    "gMeanKronMagNpt",
    "gMeanApMag",
    "gMeanApMagErr",
    "gMeanApMagStd",
    "gMeanApMagNpt",
    "gFlags",
    "rQfPerfect",
    "rMeanPSFMag",
    "rMeanPSFMagErr",
    "rMeanPSFMagStd",
    "rMeanPSFMagNpt",
    "rMeanPSFMagMin",
    "rMeanPSFMagMax",
    "rMeanKronMag",
    "rMeanKronMagErr",
    "rMeanKronMagStd",
    "rMeanKronMagNpt",
    "rMeanApMag",
    "rMeanApMagErr",
    "rMeanApMagStd",
    "rMeanApMagNpt",
    "rFlags",
    "iQfPerfect",
    "iMeanPSFMag",
    "iMeanPSFMagErr",
    "iMeanPSFMagStd",
    "iMeanPSFMagNpt",
    "iMeanPSFMagMin",
    "iMeanPSFMagMax",
    "iMeanKronMag",
    "iMeanKronMagErr",
    "iMeanKronMagStd",
    "iMeanKronMagNpt",
    "iMeanApMag",
    "iMeanApMagErr",
    "iMeanApMagStd",
    "iMeanApMagNpt",
    "iFlags",
    "zQfPerfect",
    "zMeanPSFMag",
    "zMeanPSFMagErr",
    "zMeanPSFMagStd",
    "zMeanPSFMagNpt",
    "zMeanPSFMagMin",
    "zMeanPSFMagMax",
    "zMeanKronMag",
    "zMeanKronMagErr",
    "zMeanKronMagStd",
    "zMeanKronMagNpt",
    "zMeanApMag",
    "zMeanApMagErr",
    "zMeanApMagStd",
    "zMeanApMagNpt",
    "zFlags",
    "yQfPerfect",
    "yMeanPSFMag",
    "yMeanPSFMagErr",
    "yMeanPSFMagStd",
    "yMeanPSFMagNpt",
    "yMeanPSFMagMin",
    "yMeanPSFMagMax",
    "yMeanKronMag",
    "yMeanKronMagErr",
    "yMeanKronMagStd",
    "yMeanKronMagNpt",
    "yMeanApMag",
    "yMeanApMagErr",
    "yMeanApMagStd",
    "yMeanApMagNpt",
    "yFlags",
    "distance",
]
# The column names are fine case insensitive for the MAST API call.
PANSTARRS_AVAILABLE_COLUMNS_LOWERCASE = [
    namedex.lower() for namedex in PANSTARRS_AVAILABLE_COLUMNS
]


[docs] class PanstarrsMastWebAPIEngine(library.engine.PhotometryEngine): """This is a photometric data extractor using PanSTARRS data obtained from their catalogs via the MAST API. See https://catalogs.mast.stsci.edu/docs/panstarrs.html for more information. """
[docs] def __init__(self, verify_ssl: bool = True) -> None: """Create the instance of the API. Parameters ---------- verify_ssl : boolean, default = True Connecting to the MAST API usually uses SSL verification via HTTPS, set to False to allow bypassing this. Returns ------- None """ self.verify_ssl = verify_ssl return None
[docs] def _mask_table_data(self, data_table: hint.Table) -> hint.Table: """This masks the raw data derived from PanSTARRS, implementing the masking/null value specifics of the PanSTARRS system. The point of this is to make masked or invalid data more typical to the user by abstracting the idiosyncrasies of PanSTARRS. Parameters ---------- data_table : Astropy Table The data table to be cleaned up. Return ------ masked_data_table : Astropy Table The masked table. """ # Enable masking capabilities, requires a new table. masked_data_table = ap_table.Table(data_table, masked=True) # Each column has different data types and the method which they are # flagged as masked are different. for colnamedex in data_table.colnames: column_data = np.array(data_table[colnamedex].value) # The method of masking is dependent on the kind of data contained. data_type = column_data.dtype.kind if data_type in ("U", "S"): # It is a string. The method for masking is not known. mask = np.zeros_like(column_data, dtype=bool) elif data_type in ("i", "f", "c"): # It is numerical data, unknown values are denoted by -999. mask = np.where(column_data <= -999, True, False) else: raise error.UndiscoveredError( "The data type that PanSTARRS is sending is not one which has an" " appropriate masking idiosyncrasy documented and implemented in" " this API." ) # Apply the mask to the column. masked_data_table[colnamedex].mask = mask return masked_data_table