Source code for astroquery.noirlab.core
"""
Provide astroquery API access to OIR Lab Astro Data Archive (natica).
This does DB access through web-services.
"""
import astropy.table
from ..query import BaseQuery
from ..utils import async_to_sync
from ..utils.class_or_instance import class_or_instance
from . import conf
__all__ = ['Noirlab', 'NoirlabClass'] # specifies what to import
[docs]@async_to_sync
class NoirlabClass(BaseQuery):
TIMEOUT = conf.timeout
NAT_URL = conf.server
ADS_URL = f'{NAT_URL}/api/adv_search/fasearch'
SIA_URL = f'{NAT_URL}/api/sia/voimg'
def __init__(self, which='file'):
"""Return object used for searching the NOIRLab Archive.
Search either Files (which=file) or HDUs (which=hdu).
Files will always be returned. But if which=hdu,
individual HDUs must have RA,DEC fields. Typically this
is only the case with some pipeline processed files.
"""
self._api_version = None
if which == 'hdu':
self.url = f'{self.NAT_URL}/api/sia/vohdu'
elif which == 'file':
self.url = f'{self.NAT_URL}/api/sia/voimg'
else:
self.url = f'{self.NAT_URL}/api/sia/voimg'
super().__init__()
@property
def api_version(self):
"""Return version of Rest API used by this module.
If the Rest API changes such that the Major version increases,
a new version of this module will likely need to be used.
"""
if self._api_version is None:
response = self._request('GET',
f'{self.NAT_URL}/api/version',
timeout=self.TIMEOUT,
cache=True)
self._api_version = float(response.content)
return self._api_version
def _validate_version(self):
KNOWN_GOOD_API_VERSION = 2.0
if (int(self.api_version) - int(KNOWN_GOOD_API_VERSION)) >= 1:
msg = (f'The astroquery.noirlab module is expecting an older '
f'version of the {self.NAT_URL} API services. '
f'Please upgrade to latest astroquery. '
f'Expected version {KNOWN_GOOD_API_VERSION} but got '
f'{self.api_version} from the API.')
raise Exception(msg)
[docs] @class_or_instance
def query_region(self, coordinate, radius=0.1, *, cache=True):
"""Query for NOIRLab observations by region of the sky.
Given a sky coordinate and radius, returns a `~astropy.table.Table`
of NOIRLab observations.
Parameters
----------
coordinates : str or `~astropy.coordinates` object
The target region which to search. It may be specified as a
string or as the appropriate `~astropy.coordinates` object.
radius : str or `~astropy.units.Quantity` object, optional
Default 0.1 degrees.
The string must be parsable by `~astropy.coordinates.Angle`. The
appropriate `~astropy.units.Quantity` object from
`~astropy.units` may also be used.
Returns
-------
response : `~astropy.table.Table`
"""
self._validate_version()
ra, dec = coordinate.to_string('decimal').split()
url = f'{self.url}?POS={ra},{dec}&SIZE={radius}&format=json'
response = self._request('GET', url,
timeout=self.TIMEOUT,
cache=cache)
response.raise_for_status()
return astropy.table.Table(data=response.json())
Noirlab = NoirlabClass()