# Licensed under a 3-clause BSD style license - see LICENSE.rst
from io import BytesIO
import astropy.units as u
import astropy.coordinates as coord
from astropy.io import fits
from ..query import BaseQuery
from ..utils import commons, prepend_docstr_nosections
from . import conf
from ..exceptions import InvalidQueryError
__all__ = ['Magpis', 'MagpisClass']
[docs]
class MagpisClass(BaseQuery):
URL = conf.server
TIMEOUT = conf.timeout
surveys = ["gps6",
"gps6epoch2",
"gps6epoch3",
"gps6epoch4",
"gps20",
"gps20new",
"gps90",
"gpsmsx",
"gpsmsx2",
"gpsglimpse36",
"gpsglimpse45",
"gpsglimpse58",
"gpsglimpse80",
"mipsgal",
"atlasgal",
"bolocam"]
maximsize = 1024
def _args_to_payload(self, coordinates, *, image_size=1 * u.arcmin,
survey='bolocam', maximsize=None):
"""
Fetches image cutouts from MAGPIS surveys.
Parameters
----------
coordinates : str or `astropy.coordinates` object
The target around which to search. It may be specified as a
string in which case it is resolved using online services or as
the appropriate `astropy.coordinates` object. ICRS coordinates
may also be entered as strings as specified in the
`astropy.coordinates` module.
image_size : str or `~astropy.units.Quantity` object, optional
The string must be parsable by `astropy.coordinates.Angle`. The
appropriate `~astropy.units.Quantity` object from `astropy.units`
may also be used. Specifies the symmetric size of the
image. Defaults to 1 arcmin.
survey : str, optional
The MAGPIS survey you want to cut out. Defaults to
'bolocam'. The other surveys that can be used can be listed via
:meth:`~astroquery.magpis.MagpisClass.list_surveys`.
maximsize : int, optional
Specify the maximum image size (in pixels on each dimension) that
will be returned. Max is 2048.
"""
request_payload = {}
request_payload["Survey"] = survey
galactic_coords = commons.parse_coordinates(coordinates).transform_to('galactic')
ra_dec_str = str(galactic_coords.l.degree) + ' ' + str(galactic_coords.b.degree)
request_payload["RA"] = ra_dec_str
request_payload["Equinox"] = "Galactic"
request_payload["ImageSize"] = coord.Angle(image_size).arcmin
request_payload["ImageType"] = "FITS File"
request_payload["MaxImSize"] = self.maximsize if maximsize is None else maximsize
return request_payload
[docs]
@prepend_docstr_nosections("\n" + _args_to_payload.__doc__)
def get_images(self, coordinates, *, image_size=1 * u.arcmin,
survey='bolocam', get_query_payload=False):
"""
get_query_payload : bool, optional
if set to `True` then returns the dictionary sent as the HTTP
request. Defaults to `False`
Returns
-------
A list of `~astropy.io.fits.HDUList` objects
"""
response = self.get_images_async(coordinates, image_size=image_size,
survey=survey,
get_query_payload=get_query_payload)
if get_query_payload:
return response
content_buffer = BytesIO(response.content)
try:
return fits.open(content_buffer, ignore_missing_end=True)
except OSError:
raise InvalidQueryError(response.content)
[docs]
@prepend_docstr_nosections("\n" + _args_to_payload.__doc__)
def get_images_async(self, coordinates, *, image_size=1 * u.arcmin,
survey='bolocam', get_query_payload=False):
"""
get_query_payload : bool, optional
if set to `True` then returns the dictionary sent as the HTTP
request. Defaults to `False`
Returns
-------
response : `requests.Response`
The HTTP response returned from the service
"""
if survey not in self.surveys:
raise InvalidQueryError("Survey must be one of "
+ (",".join(self.list_surveys())))
request_payload = self._args_to_payload(
coordinates, image_size=image_size, survey=survey)
if get_query_payload:
return request_payload
response = self._request("POST", url=self.URL, data=request_payload,
timeout=self.TIMEOUT)
return response
[docs]
def list_surveys(self):
"""Return a list of surveys for MAGPIS"""
return self.surveys
Magpis = MagpisClass()