Source code for mirar.references.ps1

"""
Module for PS1 reference image generator
"""

import logging

import numpy as np
from astropy.io import fits
from astropy.table import Table
from astropy.wcs import WCS

from mirar.data import Image
from mirar.references.base_reference_generator import BaseReferenceGenerator

logger = logging.getLogger(__name__)


[docs] class PS1Ref(BaseReferenceGenerator): """ PS1 Ref generator """ abbreviation = "ps1_ref_lookup"
[docs] def getimages(self, ra_deg: float, dec_deg: float, filters="grizy") -> Table: """ Query ps1filenames.py service to get a list of images ra, dec = position in degrees size = image size in pixels (0.25 arcsec/pixel) filters = string with filters to include Returns a table with the results """ service = "https://ps1images.stsci.edu/cgi-bin/ps1filenames.py" url = f"{service}?ra={ra_deg}&dec={dec_deg}&filters={filters}" table = Table.read(url, format="ascii") return table
[docs] def geturl( self, ra_deg: float, dec_deg: float, size: int = 240, output_size=None, filters="grizy", file_format="fits", color=False, ): """Get URL for images in the table ra, dec = position in degrees size = extracted image size in pixels (0.25 arcsec/pixel) output_size = output (display) image size in pixels (default = size). output_size has no effect for fits format images. filters = string with filters to include format = data format (options are "jpg", "png" or "fits") color = if True, creates a color image (only for jpg or png format). Default is return a list of URLs for single-filter grayscale images. Returns a string with the URL """ if color and file_format == "fits": raise ValueError("color images are available only for jpg or png formats") if file_format not in ("jpg", "png", "fits"): raise ValueError("format must be one of jpg, png, fits") table = self.getimages(ra_deg, dec_deg, filters=filters) urlbase = "https://ps1images.stsci.edu/cgi-bin/fitscut.cgi?&red=" url = [] for filename in table["filename"]: full_url = urlbase + filename full_url += ( f"&format={file_format}&x={ra_deg}&y={dec_deg}" f"&size={int(size)}&wcs=1" ) if output_size: full_url += f"&output_size={output_size}" url.append(full_url) return url
def _get_reference(self, image: Image) -> (fits.PrimaryHDU, fits.PrimaryHDU): header = image.get_header() nx, ny = header["NAXIS1"], header["NAXIS2"] dx, dy = header["CD1_1"], header["CD2_2"] img_size_deg = np.max([dx * nx, dy * ny]) img_size_arcsec = img_size_deg * 3600 wcs = WCS(header) ra_cent, dec_cent = wcs.all_pix2world(nx / 2, ny / 2, 0) ps1_img_size_pix = img_size_arcsec / 0.25 fitsurl = self.geturl( ra_cent, dec_cent, size=ps1_img_size_pix, filters=self.filter_name, file_format="fits", ) logger.debug(fitsurl) with fits.open(fitsurl[0], timeout=600) as hdul: ref_hdu = hdul[0].copy() ref_hdu.header.rename_keyword("PC001001", "PC1_1") # pylint: disable=no-member ref_hdu.header.rename_keyword("PC001002", "PC1_2") # pylint: disable=no-member ref_hdu.header.rename_keyword("PC002001", "PC2_1") # pylint: disable=no-member ref_hdu.header.rename_keyword("PC002002", "PC2_2") # pylint: disable=no-member ref_hdu.header["GAIN"] = ref_hdu.header[ # pylint: disable=no-member "CELL.GAIN" ] ref_hdu.header["ZP"] = ref_hdu.header["FPA.ZP"] # pylint: disable=no-member del ref_hdu.header["HISTORY"] # pylint: disable=no-member return ref_hdu, None