From b6d758cdbf0917a2afd46b1a380157a200a02c44 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Thu, 11 May 2017 19:18:03 +0200 Subject: [PATCH 01/10] Updating and moving LCOGT to LCO --- astroquery/lco/__init__.py | 82 ++++ astroquery/lco/core.py | 420 +++++++++++++++++ astroquery/{lcogt => lco}/tests/__init__.py | 0 astroquery/{lcogt => lco}/tests/data/Box.xml | 0 astroquery/{lcogt => lco}/tests/data/Cone.xml | 0 .../{lcogt => lco}/tests/data/Cone_coord.xml | 0 .../{lcogt => lco}/tests/data/Polygon.xml | 0 .../{lcogt => lco}/tests/setup_package.py | 0 astroquery/{lcogt => lco}/tests/test_lcogt.py | 0 .../{lcogt => lco}/tests/test_lcogt_remote.py | 0 astroquery/lcogt/__init__.py | 53 ++- astroquery/lcogt/core.py | 441 ------------------ docs/lco/lcogt.rst | 6 + 13 files changed, 551 insertions(+), 451 deletions(-) create mode 100644 astroquery/lco/__init__.py create mode 100644 astroquery/lco/core.py rename astroquery/{lcogt => lco}/tests/__init__.py (100%) rename astroquery/{lcogt => lco}/tests/data/Box.xml (100%) rename astroquery/{lcogt => lco}/tests/data/Cone.xml (100%) rename astroquery/{lcogt => lco}/tests/data/Cone_coord.xml (100%) rename astroquery/{lcogt => lco}/tests/data/Polygon.xml (100%) rename astroquery/{lcogt => lco}/tests/setup_package.py (100%) rename astroquery/{lcogt => lco}/tests/test_lcogt.py (100%) rename astroquery/{lcogt => lco}/tests/test_lcogt_remote.py (100%) delete mode 100644 astroquery/lcogt/core.py create mode 100644 docs/lco/lcogt.rst diff --git a/astroquery/lco/__init__.py b/astroquery/lco/__init__.py new file mode 100644 index 0000000000..354f9e3e65 --- /dev/null +++ b/astroquery/lco/__init__.py @@ -0,0 +1,82 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Las Cumbres Observatory public archive Query Tool +=============== + +This module contains various methods for querying +Las Cumbres Observatory data archive as hosted by IPAC. +""" +from astropy import config as _config + +class Conf(_config.ConfigNamespace): + """ + Configuration parameters for `astroquery.lco`. + """ + + _base_path = 'https://archive-api.lco.global' + + server = _config.ConfigItem( + _base_path, + 'Las Cumbres Observatory archive API base URL') + + aggregate = _config.ConfigItem( + _base_path + '/aggregate/', + 'Returns the unique values shared across all fits files for site, telescope, instrument, filter and obstype.') + + get_token = _config.ConfigItem( + _base_path + '/api-token-auth/', + 'Obtain an api token for use with authenticated requests.') + + frames = _config.ConfigItem( + _base_path + '/frames/', + 'Return a list of frames.') + + frame = _config.ConfigItem( + _base_path + '/frames/{id}/', + 'Return a single frame.') + + frames_related = _config.ConfigItem( + _base_path + '/frames/{id}/related/', + 'Return a list of frames related to this frame (calibration frames, catalogs, etc).') + + frames_headers = _config.ConfigItem( + _base_path + '/frames/{id}/headers/', + 'Return the headers for a single frame.') + + frames_zip = _config.ConfigItem( + _base_path + '/frames/zip/', + "Returns a zip file containing all of the requested frames. Note this is not the preferred method for downloading files. Use the frame's url property instead.") + + profile = _config.ConfigItem( + _base_path + '/profile/', + 'Returns information about the currently authenticated user.') + + row_limit = _config.ConfigItem( + 10, + 'Maximum number of rows to retrieve in result') + + timeout = _config.ConfigItem( + 60, + 'Time limit for connecting to the Las Cumbres Observatory archive') + + username = _config.ConfigItem( + "", + 'Optional default username for Las Cumbres Observatory archive.') + + dtypes = _config.ConfigItem( + ['i','str','str','str','str','str','str','str','str','f','str','str'], + "NumPy data types for archive response") + + names = _config.ConfigItem( + ['id','filename','url','RLEVEL','DATE_OBS','PROPID','OBJECT','SITEID','TELID','EXPTIME','FILTER','REQNUM'], + "Archive response items") + + +conf = Conf() + + +from .core import Lco, LcoClass + +__all__ = ['Lco', 'LcoClass', + 'Conf', 'conf', + ] diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py new file mode 100644 index 0000000000..3224fb6894 --- /dev/null +++ b/astroquery/lco/core.py @@ -0,0 +1,420 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +from __future__ import print_function + +""" +Las Cumbres Observatory +==== + +API from + + https://archive-api.lco.global + +The following are endpoints of the Las Cumbres Observatory archive query service, + +Endpoint Method Usage +/aggregate/ GET Returns the unique values shared accross all fits files for site, telescope, instrument, filter and obstype. +/api-token-auth/ POST Obtain an api token for use with authenticated requests. +/frames/ GET Return a list of frames. +/frames/{id}/ GET Return a single frame. +/frames/{id}/related/ GET Return a list of frames related to this frame (calibration frames, catalogs, etc). +/frames/{id}/headers/ GET Return the headers for a single frame. +/frames/zip/ POST Returns a zip file containing all of the requested frames. Note this is not the preferred method for downloading files. Use the frame's url property instead. +/profile/ GET Returns information about the currently authenticated user. + +The service accepts the following keywords, + +""" + +import json +import keyring +import getpass +import warnings + +import astropy.units as u +import astropy.coordinates as coord +import astropy.io.votable as votable +from astropy.table import Table +from astropy.io import fits +from astropy import log + +from ..query import BaseQuery, QueryWithLogin +from ..utils import commons, system_tools, prepend_docstr_noreturns, async_to_sync +from . import conf + + +# export all the public classes and methods +# __all__ = ['Lco', 'LcoClass'] + +# declare global variables and constants if any + + +# Now begin your main class +# should be decorated with the async_to_sync imported previously +@async_to_sync +class LcoClass(BaseQuery): + + """ + Not all the methods below are necessary but these cover most of the common + cases, new methods may be added if necessary, follow the guidelines at + + """ + # use the Configuration Items imported from __init__.py to set the URL, + # TIMEOUT, etc. + URL = conf.server + TIMEOUT = conf.timeout + FRAMES_URL = conf.frames + DTYPES = ['i','S39','S230','i','S19','S16','S20','S3','S4','f','S2','i'] + DATA_NAMES = ['id','filename','url','RLEVEL','DATE_OBS','PROPID','OBJECT','SITEID','TELID','EXPTIME','FILTER','REQNUM'] + TOKEN = None + + # all query methods are implemented with an "async" method that handles + # making the actual HTTP request and returns the raw HTTP response, which + # should be parsed by a separate _parse_result method. The query_object + # method is created by async_to_sync automatically. It would look like + # this: + """ + def query_object(object_name, get_query_payload=False) + response = self.query_object_async(object_name, + get_query_payload=get_query_payload) + if get_query_payload: + return response + result = self._parse_result(response, verbose=verbose) + return result + """ + + def query_object_async(self, object_name, get_query_payload=False, + cache=True): + """ + This method is for services that can parse object names. Otherwise + use :meth:`astroquery.lco.LcoClass.query_region`. + Put a brief description of what the class does here. + + Parameters + ---------- + object_name : str + name of the identifier to query. + get_query_payload : bool, optional + This should default to False. When set to `True` the method + should return the HTTP request parameters as a dict. + verbose : bool, optional + This should default to `False`, when set to `True` it displays + VOTable warnings. + any_other_param : + similarly list other parameters the method takes + + Returns + ------- + response : `requests.Response` + The HTTP response returned from the service. + All async methods should return the raw HTTP response. + + Examples + -------- + While this section is optional you may put in some examples that + show how to use the method. The examples are written similar to + standard doctests in python. + + """ + # the async method should typically have the following steps: + # 1. First construct the dictionary of the HTTP request params. + # 2. If get_query_payload is `True` then simply return this dict. + # 3. Else make the actual HTTP request and return the corresponding + # HTTP response + # All HTTP requests are made via the `BaseQuery._request` method. This + # use a generic HTTP request method internally, similar to + # `requests.Session.request` of the Python Requests library, but + # with added caching-related tools. + + # See below for an example: + + # first initialize the dictionary of HTTP request parameters + request_payload = dict() + + # Now fill up the dictionary. Here the dictionary key should match + # the exact parameter name as expected by the remote server. The + # corresponding dict value should also be in the same format as + # expected by the server. Additional parsing of the user passed + # value may be required to get it in the right units or format. + # All this parsing may be done in a separate private `_args_to_payload` + # method for cleaner code. + + request_payload['OBJECT'] = object_name + request_payload['REVEL'] = '91' + request_payload['OBSTYPE'] = 'EXPOSE' + # similarly fill up the rest of the dict ... + + if get_query_payload: + return request_payload + # BaseQuery classes come with a _request method that includes a + # built-in caching system + if not self.TOKEN: + warnings.warn("You have not authenticated and will only get results for non-proprietary data") + headers=None + else: + headers = {'Authorization': 'Token ' + self.TOKEN} + response = self._request('GET', self.FRAMES_URL, params=request_payload, + timeout=self.TIMEOUT, cache=cache, headers=headers) + if response.status_code == 200: + resp = json.loads(response.content) + return self._parse_result(resp) + else: + log.exception("Failed!") + return False + + # For services that can query coordinates, use the query_region method. + # The pattern is similar to the query_object method. The query_region + # method also has a 'radius' keyword for specifying the radius around + # the coordinates in which to search. If the region is a box, then + # the keywords 'width' and 'height' should be used instead. The coordinates + # may be accepted as an `astropy.coordinates` object or as a string, which + # may be further parsed. + + # similarly we write a query_region_async method that makes the + # actual HTTP request and returns the HTTP response + + def query_region_async(self, coordinates, radius, height, width, + get_query_payload=False, cache=True): + """ + Queries a region around the specified coordinates. + + Parameters + ---------- + coordinates : str or `astropy.coordinates`. + coordinates around which to query + radius : str or `astropy.units.Quantity`. + the radius of the cone search + width : str or `astropy.units.Quantity` + the width for a box region + height : str or `astropy.units.Quantity` + the height for a box region + get_query_payload : bool, optional + Just return the dict of HTTP request parameters. + verbose : bool, optional + Display VOTable warnings or not. + + Returns + ------- + response : `requests.Response` + The HTTP response returned from the service. + All async methods should return the raw HTTP response. + """ + request_payload = self._args_to_payload(coordinates, radius, height, + width) + if get_query_payload: + return request_payload + response = self._request('GET', self.URL, params=request_payload, + timeout=self.TIMEOUT, cache=cache) + return response + + # as we mentioned earlier use various python regular expressions, etc + # to create the dict of HTTP request parameters by parsing the user + # entered values. For cleaner code keep this as a separate private method: + + def _args_to_payload(self, *args, **kwargs): + request_payload = dict() + # code to parse input and construct the dict + # goes here. Then return the dict to the caller + return request_payload + + def _login(self, username=None, store_password=False, + reenter_password=False): + """ + Login to the LCO Archive. + + Parameters + ---------- + username : str, optional + Username to the Las Cumbres Observatory archive. If not given, it should be + specified in the config file. + store_password : bool, optional + Stores the password securely in your keyring. Default is False. + reenter_password : bool, optional + Asks for the password even if it is already stored in the + keyring. This is the way to overwrite an already stored password + on the keyring. Default is False. + """ + if username is None: + if self.USERNAME == "": + raise LoginError("If you do not pass a username to login(), " + "you should configure a default one!") + else: + username = self.USERNAME + + # Get password from keyring or prompt + if reenter_password is False: + password_from_keyring = keyring.get_password( + "astroquery:archive-api.lco.global", username) + else: + password_from_keyring = None + + if password_from_keyring is None: + if system_tools.in_ipynb(): + log.warning("You may be using an ipython notebook:" + " the password form will appear in your terminal.") + password = getpass.getpass("{0}, enter your Las Cumbres Observatory password:\n" + .format(username)) + else: + password = password_from_keyring + # Authenticate + log.info("Authenticating {0} with lco.global...".format(username)) + # Do not cache pieces of the login process + login_response = self._request("POST", conf.get_token, + cache=False, data={'username': username, + 'password': password}) + # login form: method=post action=login [no id] + + if login_response.status_code == 200: + log.info("Authentication successful!") + token = json.loads(login_response.content) + self.TOKEN = token['token'] + else: + log.exception("Authentication failed!") + token = None + # When authenticated, save password in keyring if needed + if token and password_from_keyring is None and store_password: + keyring.set_password("astroquery:archive-api.lco.global", username, password) + return + + # the methods above call the private _parse_result method. + # This should parse the raw HTTP response and return it as + # an `astropy.table.Table`. Below is the skeleton: + + def _parse_result(self, response, verbose=False): + # if verbose is False then suppress any VOTable related warnings + if not verbose: + commons.suppress_vo_warnings() + # try to parse the result into an astropy.Table, else + # return the raw result with an informative error message. + log.info(len(self.DTYPES),len(self.DATA_NAMES)) + t = Table(names=self.DATA_NAMES, dtype=self.DTYPES) + if response['count']>0: + try: + for line in response['results']: + filtered_line = { key: line[key] for key in self.DATA_NAMES } + t.add_row(filtered_line) + except ValueError: + # catch common errors here, but never use bare excepts + # return raw result/ handle in some way + pass + + return t + + # Image queries do not use the async_to_sync approach: the "synchronous" + # version must be defined explicitly. The example below therefore presents + # a complete example of how to write your own synchronous query tools if + # you prefer to avoid the automatic approach. + # + # For image queries, the results should be returned as a + # list of `astropy.fits.HDUList` objects. Typically image queries + # have the following method family: + # 1. get_images - this is the high level method that interacts with + # the user. It reads in the user input and returns the final + # list of fits images to the user. + # 2. get_images_async - This is a lazier form of the get_images function, + # in that it returns just the list of handles to the image files + # instead of actually downloading them. + # 3. extract_image_urls - This takes in the raw HTTP response and scrapes + # it to get the downloadable list of image URLs. + # 4. get_image_list - this is similar to the get_images, but it simply + # takes in the list of URLs scrapped by extract_image_urls and + # returns this list rather than the actual FITS images + # NOTE : in future support may be added to allow the user to save + # the downloaded images to a preferred location. Here we look at the + # skeleton code for image services + + def get_images(self, coordinates, radius, get_query_payload): + """ + A query function that searches for image cut-outs around coordinates + + Parameters + ---------- + coordinates : str or `astropy.coordinates`. + coordinates around which to query + radius : str or `astropy.units.Quantity`. + the radius of the cone search + get_query_payload : bool, optional + If true than returns the dictionary of query parameters, posted to + remote server. Defaults to `False`. + + Returns + ------- + A list of `astropy.fits.HDUList` objects + """ + readable_objs = self.get_images_async(coordinates, radius, + get_query_payload=get_query_payload) + if get_query_payload: + return readable_objs # simply return the dict of HTTP request params + # otherwise return the images as a list of astropy.fits.HDUList + return [obj.get_fits() for obj in readable_objs] + + @prepend_docstr_noreturns(get_images.__doc__) + def get_images_async(self, coordinates, radius, get_query_payload=False): + """ + Returns + ------- + A list of context-managers that yield readable file-like objects + """ + # As described earlier, this function should return just + # the handles to the remote image files. Use the utilities + # in commons.py for doing this: + + # first get the links to the remote image files + image_urls = self.get_image_list(coordinates, radius, + get_query_payload=get_query_payload) + if get_query_payload: # if true then return the HTTP request params dict + return image_urls + # otherwise return just the handles to the image files. + return [commons.FileContainer(U) for U in image_urls] + + # the get_image_list method, simply returns the download + # links for the images as a list + + @prepend_docstr_noreturns(get_images.__doc__) + def get_image_list(self, coordinates, radius, get_query_payload=False, + cache=True): + """ + Returns + ------- + list of image urls + """ + # This method should implement steps as outlined below: + # 1. Construct the actual dict of HTTP request params. + # 2. Check if the get_query_payload is True, in which + # case it should just return this dict. + # 3. Otherwise make the HTTP request and receive the + # HTTP response. + # 4. Pass this response to the extract_image_urls + # which scrapes it to extract the image download links. + # 5. Return the download links as a list. + request_payload = self._args_to_payload(coordinates, radius) + if get_query_payload: + return request_payload + response = self._request(method="GET", url=self.URL, + data=request_payload, + timeout=self.TIMEOUT, cache=cache) + + return self.extract_image_urls(response.text) + + # the extract_image_urls method takes in the HTML page as a string + # and uses regexps, etc to scrape the image urls: + + def extract_image_urls(self, html_str): + """ + Helper function that uses regex to extract the image urls from the + given HTML. + + Parameters + ---------- + html_str : str + source from which the urls are to be extracted + + Returns + ------- + list of image URLs + """ + # do something with regex on the HTML + # return the list of image URLs + pass + + +Lco = LcoClass() diff --git a/astroquery/lcogt/tests/__init__.py b/astroquery/lco/tests/__init__.py similarity index 100% rename from astroquery/lcogt/tests/__init__.py rename to astroquery/lco/tests/__init__.py diff --git a/astroquery/lcogt/tests/data/Box.xml b/astroquery/lco/tests/data/Box.xml similarity index 100% rename from astroquery/lcogt/tests/data/Box.xml rename to astroquery/lco/tests/data/Box.xml diff --git a/astroquery/lcogt/tests/data/Cone.xml b/astroquery/lco/tests/data/Cone.xml similarity index 100% rename from astroquery/lcogt/tests/data/Cone.xml rename to astroquery/lco/tests/data/Cone.xml diff --git a/astroquery/lcogt/tests/data/Cone_coord.xml b/astroquery/lco/tests/data/Cone_coord.xml similarity index 100% rename from astroquery/lcogt/tests/data/Cone_coord.xml rename to astroquery/lco/tests/data/Cone_coord.xml diff --git a/astroquery/lcogt/tests/data/Polygon.xml b/astroquery/lco/tests/data/Polygon.xml similarity index 100% rename from astroquery/lcogt/tests/data/Polygon.xml rename to astroquery/lco/tests/data/Polygon.xml diff --git a/astroquery/lcogt/tests/setup_package.py b/astroquery/lco/tests/setup_package.py similarity index 100% rename from astroquery/lcogt/tests/setup_package.py rename to astroquery/lco/tests/setup_package.py diff --git a/astroquery/lcogt/tests/test_lcogt.py b/astroquery/lco/tests/test_lcogt.py similarity index 100% rename from astroquery/lcogt/tests/test_lcogt.py rename to astroquery/lco/tests/test_lcogt.py diff --git a/astroquery/lcogt/tests/test_lcogt_remote.py b/astroquery/lco/tests/test_lcogt_remote.py similarity index 100% rename from astroquery/lcogt/tests/test_lcogt_remote.py rename to astroquery/lco/tests/test_lcogt_remote.py diff --git a/astroquery/lcogt/__init__.py b/astroquery/lcogt/__init__.py index b398717e23..55923a7258 100644 --- a/astroquery/lcogt/__init__.py +++ b/astroquery/lcogt/__init__.py @@ -1,41 +1,74 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst """ -LCOGT public archive Query Tool +Las Cumbres Observatory public archive Query Tool =============== This module contains various methods for querying -LCOGT data archive as hosted by IPAC. +Las Cumbres Observatory data archive as hosted by IPAC. """ from astropy import config as _config import warnings -warnings.warn("The LCOGT archive API has been changed. While we aim to " +warnings.warn("The Las Cumbres Observatory archive API has been changed. While we aim to " "accommodate the changes into astroqeury, pleased be advised " "that this module is not working at the moment.") class Conf(_config.ConfigNamespace): """ - Configuration parameters for `astroquery.irsa`. + Configuration parameters for `astroquery.lco`. """ - + _base_path = 'https://archive-api.lco.global' server = _config.ConfigItem( - 'http://lcogtarchive.ipac.caltech.edu/cgi-bin/Gator/nph-query', - 'Name of the LCOGT archive as hosted by IPAC to use.') + _base_path, + 'Las Cumbres Observatory archive API base URL') + + aggregate = _config.ConfigItem( + _base_path + '/aggregate/', + 'Returns the unique values shared across all fits files for site, telescope, instrument, filter and obstype.') + + get_token = _config.ConfigItem( + _base_path + '/api-token-auth/', + 'Obtain an api token for use with authenticated requests.') + + frames = _config.ConfigItem( + _base_path + '/frames/', + 'Return a list of frames.') + + frame = _config.ConfigItem( + _base_path + '/frames/{id}/', + 'Return a single frame.') + + frames_related = _config.ConfigItem( + _base_path + '/frames/{id}/related/', + 'Return a list of frames related to this frame (calibration frames, catalogs, etc).') + + frames_headers = _config.ConfigItem( + _base_path + '/frames/{id}/headers/', + 'Return the headers for a single frame.') + + frames_zip = _config.ConfigItem( + _base_path + '/frames/zip/', + "Returns a zip file containing all of the requested frames. Note this is not the preferred method for downloading files. Use the frame's url property instead.") + + profile = _config.ConfigItem( + _base_path + '/profile/', + 'Returns information about the currently authenticated user.') + row_limit = _config.ConfigItem( 500, 'Maximum number of rows to retrieve in result') timeout = _config.ConfigItem( 60, - 'Time limit for connecting to the LCOGT IPAC server.') + 'Time limit for connecting to the Las Cumbres Observatory archive') conf = Conf() -from .core import Lcogt, LcogtClass +from .core import Lco, LcoClass -__all__ = ['Lcogt', 'LcogtClass', +__all__ = ['Lco', 'LcoClass', 'Conf', 'conf', ] diff --git a/astroquery/lcogt/core.py b/astroquery/lcogt/core.py deleted file mode 100644 index 7c4d986a46..0000000000 --- a/astroquery/lcogt/core.py +++ /dev/null @@ -1,441 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -""" -LCOGT -==== - -API from - -http://lcogtarchive.ipac.caltech.edu/docs/catsearch.html - -The URL of the LCOGT catalog query service, CatQuery, is - - http://lcogtarchive.ipac.caltech.edu/cgi-bin/Gator/nph-query - -The service accepts the following keywords, which are analogous to the search -fields on the Gator search form: - - -spatial Required Type of spatial query: Cone, Box, Polygon, and NONE - -polygon Convex polygon of ra dec pairs, separated by comma(,) - Required if spatial=polygon - -radius Cone search radius - Optional if spatial=Cone, otherwise ignore it - (default 10 arcsec) - -radunits Units of a Cone search: arcsec, arcmin, deg. - Optional if spatial=Cone - (default='arcsec') - -size Width of a box in arcsec - Required if spatial=Box. - -objstr Target name or coordinate of the center of a spatial - search center. Target names must be resolved by - SIMBAD or NED. - - Required only when spatial=Cone or spatial=Box. - - Examples: 'M31' - '00 42 44.3 -41 16 08' - '00h42m44.3s -41d16m08s' - -catalog Required Catalog name in the LCOGT Archive. The database of - photometry can be found using lco_cat and the - database of image metadata is found using lco_img. - -outfmt Optional Defines query's output format. - 6 - returns a program interface in XML - 3 - returns a VO Table (XML) - 2 - returns SVC message - 1 - returns an ASCII table - 0 - returns Gator Status Page in HTML (default) - -desc Optional Short description of a specific catalog, which will - appear in the result page. - -order Optional Results ordered by this column. - -selcols Optional Select specific columns to be returned. The default - action is to return all columns in the queried - catalog. To find the names of the columns in the - LCOGT Archive databases, please read Photometry - Table column descriptions - [http://lcogtarchive.ipac.caltech.edu/docs/lco_cat_dd.html] - and Image Table column descriptions - [http://lcogtarchive.ipac.caltech.edu/docs/lco_img_dd.html]. - -constraint Optional User defined query constraint(s) - Note: The constraint should follow SQL syntax. - -""" -from __future__ import print_function, division - -import warnings -import logging - -from astropy.extern import six -import astropy.units as u -import astropy.coordinates as coord -import astropy.io.votable as votable - -from ..query import BaseQuery -from ..utils import commons, async_to_sync -from . import conf -from ..exceptions import TableParseError, NoResultsWarning - -__all__ = ['Lcogt', 'LcogtClass'] - - -@async_to_sync -class LcogtClass(BaseQuery): - LCOGT_URL = conf.server - TIMEOUT = conf.timeout - ROW_LIMIT = conf.row_limit - - @property - def catalogs(self): - """ immutable catalog listing """ - return {'lco_cat': 'Photometry archive from LCOGT', - 'lco_img': 'Image metadata archive from LCOGT'} - - def query_object_async(self, objstr, catalog=None, cache=True, - get_query_payload=False): - """ - Serves the same function as `query_object`, but - only collects the response from the LCOGT IPAC archive and returns. - - Parameters - ---------- - objstr : str - name of object to be queried - catalog : str - name of the catalog to use. 'lco_img' for image meta data; - 'lco_cat' for photometry. - - Returns - ------- - response : `requests.Response` - Response of the query from the server - """ - if catalog is None: - raise ValueError("Catalogue name is required!") - if catalog not in self.catalogs: - raise ValueError("Catalog name must be one of {0}" - .format(self.catalogs)) - - request_payload = self._args_to_payload(catalog) - request_payload['objstr'] = objstr - if get_query_payload: - return request_payload - - response = self._request(method='GET', url=self.LCOGT_URL, - params=request_payload, timeout=self.TIMEOUT, - cache=cache) - return response - - def query_region_async(self, coordinates=None, catalog=None, - spatial='Cone', radius=10 * u.arcsec, width=None, - polygon=None, get_query_payload=False, cache=True, - ): - """ - This function serves the same purpose as - :meth:`~astroquery.irsa.LcogtClass.query_region`, but returns the raw - HTTP response rather than the results in a `~astropy.table.Table`. - - Parameters - ---------- - coordinates : str, `astropy.coordinates` object - Gives the position of the center of the cone or box if - performing a cone or box search. The string can give coordinates - in various coordinate systems, or the name of a source that will - be resolved on the server (see `here - `_ for more - details). Required if spatial is ``'Cone'`` or ``'Box'``. Optional - if spatial is ``'Polygon'``. - catalog : str - The catalog to be used. Either ``'lco_img'`` for image metadata or - ``'lco_cat'`` for photometry. - spatial : str - Type of spatial query: ``'Cone'``, ``'Box'``, ``'Polygon'``, and - ``'All-Sky'``. If missing then defaults to ``'Cone'``. - radius : str or `~astropy.units.Quantity` object, [optional for \\ - spatial is ``'Cone'``] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from - `astropy.units` may also be used. Defaults to 10 arcsec. - width : str, `~astropy.units.Quantity` object [Required for spatial \\ - is ``'Polygon'``.] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. - polygon : list, [Required for spatial is ``'Polygon'``] - A list of ``(ra, dec)`` pairs (as tuples), in decimal degrees, - outlining the polygon to search in. It can also be a list of - `astropy.coordinates` object or strings that can be parsed by - `astropy.coordinates.ICRS`. - get_query_payload : bool, optional - If `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 catalog is None: - raise ValueError("Catalogue name is required!") - if catalog not in self.catalogs: - raise ValueError("Catalog name must be one of {0}" - .format(self.catalogs)) - - request_payload = self._args_to_payload(catalog) - request_payload.update(self._parse_spatial(spatial=spatial, - coordinates=coordinates, - radius=radius, width=width, - polygon=polygon)) - - if get_query_payload: - return request_payload - response = self._request(method='GET', url=self.LCOGT_URL, - params=request_payload, timeout=self.TIMEOUT, - cache=cache) - return response - - def _parse_spatial(self, spatial, coordinates, radius=None, width=None, - polygon=None): - """ - Parse the spatial component of a query - - Parameters - ---------- - spatial : str - The type of spatial query. Must be one of: ``'Cone'``, ``'Box'``, - ``'Polygon'``, and ``'All-Sky'``. - coordinates : str, `astropy.coordinates` object - Gives the position of the center of the cone or box if - performing a cone or box search. The string can give coordinates - in various coordinate systems, or the name of a source that will - be resolved on the server (see `here - `_ for more - details). Required if spatial is ``'Cone'`` or ``'Box'``. Optional - if spatial is ``'Polygon'``. - radius : str or `~astropy.units.Quantity` object, [optional for spatial is ``'Cone'``] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. Defaults to 10 arcsec. - width : str, `~astropy.units.Quantity` object [Required for spatial is ``'Polygon'``.] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. - polygon : list, [Required for spatial is ``'Polygon'``] - A list of ``(ra, dec)`` pairs as tuples of - `astropy.coordinates.Angle`s outlining the polygon to search in. - It can also be a list of `astropy.coordinates` object or strings - that can be parsed by `astropy.coordinates.ICRS`. - - Returns - ------- - payload_dict : dict - """ - - request_payload = {} - - if spatial == 'All-Sky': - spatial = 'NONE' - elif spatial in ['Cone', 'Box']: - if not commons._is_coordinate(coordinates): - request_payload['objstr'] = coordinates - else: - request_payload['objstr'] = _parse_coordinates(coordinates) - if spatial == 'Cone': - radius = _parse_dimension(radius) - request_payload['radius'] = radius.value - request_payload['radunits'] = radius.unit.to_string() - else: - width = _parse_dimension(width) - request_payload['size'] = width.to(u.arcsec).value - elif spatial == 'Polygon': - if coordinates is not None: - request_payload['objstr'] = ( - coordinates if not commons._is_coordinate(coordinates) - else _parse_coordinates(coordinates)) - try: - coordinates_list = [_parse_coordinates(c) for c in polygon] - except (ValueError, TypeError): - coordinates_list = [_format_decimal_coords(*_pair_to_deg(pair)) - for pair in polygon] - request_payload['polygon'] = ','.join(coordinates_list) - else: - raise ValueError("Unrecognized spatial query type. " - "Must be one of `Cone`, `Box`, " - "`Polygon`, or `All-Sky`.") - - request_payload['spatial'] = spatial - - return request_payload - - def _args_to_payload(self, catalog): - """ - Sets the common parameters for all cgi -queries - - Parameters - ---------- - catalog : str - The name of the catalog to query. - - Returns - ------- - request_payload : dict - """ - request_payload = dict(catalog=catalog, - outfmt=3, - spatial=None, - outrows=Lcogt.ROW_LIMIT) - return request_payload - - def _parse_result(self, response, verbose=False): - """ - Parses the results form the HTTP response to `~astropy.table.Table`. - - Parameters - ---------- - response : `requests.Response` - The HTTP response object - verbose : bool, optional - Defaults to `False`. When true it will display warnings whenever - the VOtable returned from the Service doesn't conform to the - standard. - - Returns - ------- - table : `~astropy.table.Table` - """ - if not verbose: - commons.suppress_vo_warnings() - - content = response.text - logging.debug(content) - - # Check if results were returned - if 'The catalog is not in the list' in content: - raise Exception("Catalogue not found") - - # Check that object name was not malformed - if 'Either wrong or missing coordinate/object name' in content: - raise Exception("Malformed coordinate/object name") - - # Check that the results are not of length zero - if len(content) == 0: - raise Exception("The LCOGT server sent back an empty reply") - - # Read it in using the astropy VO table reader - try: - first_table = votable.parse(six.BytesIO(response.content), - pedantic=False).get_first_table() - except Exception as ex: - self.response = response - self.table_parse_error = ex - raise TableParseError("Failed to parse LCOGT votable! The raw " - " response can be found in self.response," - " and the error in self.table_parse_error.") - - # Convert to astropy.table.Table instance - table = first_table.to_table() - - # Check if table is empty - if len(table) == 0: - warnings.warn("Query returned no results, so the table will " - "be empty", NoResultsWarning) - - return table - - def list_catalogs(self): - """ - Return a dictionary of the catalogs in the LCOGT Gator tool. - - Returns - ------- - catalogs : dict - A dictionary of catalogs where the key indicates the catalog - name to be used in query functions, and the value is the verbose - description of the catalog. - """ - return self.catalogs - - def print_catalogs(self): - """ - Display a table of the catalogs in the LCOGT Gator tool. - """ - for catname in self.catalogs: - print("{:30s} {:s}".format(catname, self.catalogs[catname])) - - -Lcogt = LcogtClass() - - -def _parse_coordinates(coordinates): - # borrowed from commons.parse_coordinates as from_name wasn't required - # in this case - if isinstance(coordinates, six.string_types): - try: - c = coord.SkyCoord(coordinates, frame='icrs') - warnings.warn("Coordinate string is being interpreted as an " - "ICRS coordinate.") - except u.UnitsError as ex: - warnings.warn("Only ICRS coordinates can be entered as strings\n" - "For other systems please use the appropriate " - "astropy.coordinates object") - raise ex - elif isinstance(coordinates, commons.CoordClasses): - c = coordinates - else: - raise TypeError("Argument cannot be parsed as a coordinate") - c_icrs = c.transform_to(coord.ICRS) - formatted_coords = _format_decimal_coords(c_icrs.ra.degree, - c_icrs.dec.degree) - return formatted_coords - - -def _pair_to_deg(pair): - """ - Turn a pair of floats, Angles, or Quantities into pairs of float degrees. - """ - - # unpack - lon, lat = pair - - if hasattr(lon, 'degree') and hasattr(lat, 'degree'): - pair = (lon.degree, lat.degree) - elif hasattr(lon, 'to') and hasattr(lat, 'to'): - pair = [lon, lat] - for ii, ang in enumerate((lon, lat)): - if ang.unit.is_equivalent(u.degree): - pair[ii] = ang.to(u.degree).value - else: - warnings.warn("Polygon endpoints are being interpreted as RA/Dec " - "pairs specified in decimal degree units.") - return tuple(pair) - - -def _format_decimal_coords(ra, dec): - """ - Print *decimal degree* RA/Dec values in an IPAC-parseable form - """ - return '{0} {1:+}'.format(ra, dec) - - -def _parse_dimension(dim): - if (isinstance(dim, u.Quantity) and - dim.unit in u.deg.find_equivalent_units()): - if dim.unit not in ['arcsec', 'arcmin', 'deg']: - dim = dim.to(u.degree) - # otherwise must be an Angle or be specified in hours... - else: - try: - new_dim = coord.Angle(dim) - dim = u.Quantity(new_dim.degree, u.Unit('degree')) - except (u.UnitsError, coord.errors.UnitsError, AttributeError): - raise u.UnitsError("Dimension not in proper units") - return dim diff --git a/docs/lco/lcogt.rst b/docs/lco/lcogt.rst new file mode 100644 index 0000000000..203b89c1f6 --- /dev/null +++ b/docs/lco/lcogt.rst @@ -0,0 +1,6 @@ +********************************** +LCO Queries (`astroquery.lco`) +********************************** + +Getting started +=============== From 09c9d3bfd44fe8165fc1b385488f6e64a42797f9 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Fri, 12 May 2017 00:14:43 +0200 Subject: [PATCH 02/10] Look up named object, filter by date and auth --- astroquery/lco/core.py | 227 ++---------------- astroquery/lco/tests/setup_package.py | 2 +- .../lco/tests/{test_lcogt.py => test_lco.py} | 0 astroquery/lco/tests/test_lcogt_remote.py | 2 +- 4 files changed, 28 insertions(+), 203 deletions(-) rename astroquery/lco/tests/{test_lcogt.py => test_lco.py} (100%) diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py index 3224fb6894..62130066d3 100644 --- a/astroquery/lco/core.py +++ b/astroquery/lco/core.py @@ -29,6 +29,7 @@ import keyring import getpass import warnings +from datetime import datetime import astropy.units as u import astropy.coordinates as coord @@ -51,7 +52,7 @@ # Now begin your main class # should be decorated with the async_to_sync imported previously @async_to_sync -class LcoClass(BaseQuery): +class LcoClass(QueryWithLogin): """ Not all the methods below are necessary but these cover most of the common @@ -83,7 +84,7 @@ def query_object(object_name, get_query_payload=False) """ def query_object_async(self, object_name, get_query_payload=False, - cache=True): + cache=True, start=None, end=None): """ This method is for services that can parse object names. Otherwise use :meth:`astroquery.lco.LcoClass.query_region`. @@ -96,12 +97,12 @@ def query_object_async(self, object_name, get_query_payload=False, get_query_payload : bool, optional This should default to False. When set to `True` the method should return the HTTP request parameters as a dict. - verbose : bool, optional - This should default to `False`, when set to `True` it displays - VOTable warnings. - any_other_param : - similarly list other parameters the method takes - + start: str, optional + Default is `None`. When set this must be in iso E8601Dw.d datestamp format + YYYY-MM-DD HH:MM + end: str, optional + Default is `None`. When set this must be in iso E8601Dw.d datestamp format + YYYY-MM-DD HH:MM Returns ------- response : `requests.Response` @@ -115,32 +116,8 @@ def query_object_async(self, object_name, get_query_payload=False, standard doctests in python. """ - # the async method should typically have the following steps: - # 1. First construct the dictionary of the HTTP request params. - # 2. If get_query_payload is `True` then simply return this dict. - # 3. Else make the actual HTTP request and return the corresponding - # HTTP response - # All HTTP requests are made via the `BaseQuery._request` method. This - # use a generic HTTP request method internally, similar to - # `requests.Session.request` of the Python Requests library, but - # with added caching-related tools. - - # See below for an example: - - # first initialize the dictionary of HTTP request parameters - request_payload = dict() - # Now fill up the dictionary. Here the dictionary key should match - # the exact parameter name as expected by the remote server. The - # corresponding dict value should also be in the same format as - # expected by the server. Additional parsing of the user passed - # value may be required to get it in the right units or format. - # All this parsing may be done in a separate private `_args_to_payload` - # method for cleaner code. - - request_payload['OBJECT'] = object_name - request_payload['REVEL'] = '91' - request_payload['OBSTYPE'] = 'EXPOSE' + request_payload = self._args_to_payload(**{'object_name':object_name,'start':start, 'end':end}) # similarly fill up the rest of the dict ... if get_query_payload: @@ -161,59 +138,15 @@ def query_object_async(self, object_name, get_query_payload=False, log.exception("Failed!") return False - # For services that can query coordinates, use the query_region method. - # The pattern is similar to the query_object method. The query_region - # method also has a 'radius' keyword for specifying the radius around - # the coordinates in which to search. If the region is a box, then - # the keywords 'width' and 'height' should be used instead. The coordinates - # may be accepted as an `astropy.coordinates` object or as a string, which - # may be further parsed. - - # similarly we write a query_region_async method that makes the - # actual HTTP request and returns the HTTP response - - def query_region_async(self, coordinates, radius, height, width, - get_query_payload=False, cache=True): - """ - Queries a region around the specified coordinates. - - Parameters - ---------- - coordinates : str or `astropy.coordinates`. - coordinates around which to query - radius : str or `astropy.units.Quantity`. - the radius of the cone search - width : str or `astropy.units.Quantity` - the width for a box region - height : str or `astropy.units.Quantity` - the height for a box region - get_query_payload : bool, optional - Just return the dict of HTTP request parameters. - verbose : bool, optional - Display VOTable warnings or not. - - Returns - ------- - response : `requests.Response` - The HTTP response returned from the service. - All async methods should return the raw HTTP response. - """ - request_payload = self._args_to_payload(coordinates, radius, height, - width) - if get_query_payload: - return request_payload - response = self._request('GET', self.URL, params=request_payload, - timeout=self.TIMEOUT, cache=cache) - return response - - # as we mentioned earlier use various python regular expressions, etc - # to create the dict of HTTP request parameters by parsing the user - # entered values. For cleaner code keep this as a separate private method: - def _args_to_payload(self, *args, **kwargs): request_payload = dict() - # code to parse input and construct the dict - # goes here. Then return the dict to the caller + request_payload['OBJECT'] = kwargs['object_name'] + request_payload['REVEL'] = '91' + request_payload['OBSTYPE'] = 'EXPOSE' + if kwargs['start']: + request_payload['start'] = validate_datetime(kwargs['start']) + if kwargs['end']: + request_payload['end'] = validate_datetime(kwargs['end']) return request_payload def _login(self, username=None, store_password=False, @@ -299,122 +232,14 @@ def _parse_result(self, response, verbose=False): return t - # Image queries do not use the async_to_sync approach: the "synchronous" - # version must be defined explicitly. The example below therefore presents - # a complete example of how to write your own synchronous query tools if - # you prefer to avoid the automatic approach. - # - # For image queries, the results should be returned as a - # list of `astropy.fits.HDUList` objects. Typically image queries - # have the following method family: - # 1. get_images - this is the high level method that interacts with - # the user. It reads in the user input and returns the final - # list of fits images to the user. - # 2. get_images_async - This is a lazier form of the get_images function, - # in that it returns just the list of handles to the image files - # instead of actually downloading them. - # 3. extract_image_urls - This takes in the raw HTTP response and scrapes - # it to get the downloadable list of image URLs. - # 4. get_image_list - this is similar to the get_images, but it simply - # takes in the list of URLs scrapped by extract_image_urls and - # returns this list rather than the actual FITS images - # NOTE : in future support may be added to allow the user to save - # the downloaded images to a preferred location. Here we look at the - # skeleton code for image services - - def get_images(self, coordinates, radius, get_query_payload): - """ - A query function that searches for image cut-outs around coordinates - - Parameters - ---------- - coordinates : str or `astropy.coordinates`. - coordinates around which to query - radius : str or `astropy.units.Quantity`. - the radius of the cone search - get_query_payload : bool, optional - If true than returns the dictionary of query parameters, posted to - remote server. Defaults to `False`. - - Returns - ------- - A list of `astropy.fits.HDUList` objects - """ - readable_objs = self.get_images_async(coordinates, radius, - get_query_payload=get_query_payload) - if get_query_payload: - return readable_objs # simply return the dict of HTTP request params - # otherwise return the images as a list of astropy.fits.HDUList - return [obj.get_fits() for obj in readable_objs] - - @prepend_docstr_noreturns(get_images.__doc__) - def get_images_async(self, coordinates, radius, get_query_payload=False): - """ - Returns - ------- - A list of context-managers that yield readable file-like objects - """ - # As described earlier, this function should return just - # the handles to the remote image files. Use the utilities - # in commons.py for doing this: - - # first get the links to the remote image files - image_urls = self.get_image_list(coordinates, radius, - get_query_payload=get_query_payload) - if get_query_payload: # if true then return the HTTP request params dict - return image_urls - # otherwise return just the handles to the image files. - return [commons.FileContainer(U) for U in image_urls] - - # the get_image_list method, simply returns the download - # links for the images as a list - - @prepend_docstr_noreturns(get_images.__doc__) - def get_image_list(self, coordinates, radius, get_query_payload=False, - cache=True): - """ - Returns - ------- - list of image urls - """ - # This method should implement steps as outlined below: - # 1. Construct the actual dict of HTTP request params. - # 2. Check if the get_query_payload is True, in which - # case it should just return this dict. - # 3. Otherwise make the HTTP request and receive the - # HTTP response. - # 4. Pass this response to the extract_image_urls - # which scrapes it to extract the image download links. - # 5. Return the download links as a list. - request_payload = self._args_to_payload(coordinates, radius) - if get_query_payload: - return request_payload - response = self._request(method="GET", url=self.URL, - data=request_payload, - timeout=self.TIMEOUT, cache=cache) - - return self.extract_image_urls(response.text) - - # the extract_image_urls method takes in the HTML page as a string - # and uses regexps, etc to scrape the image urls: - - def extract_image_urls(self, html_str): - """ - Helper function that uses regex to extract the image urls from the - given HTML. - - Parameters - ---------- - html_str : str - source from which the urls are to be extracted - - Returns - ------- - list of image URLs - """ - # do something with regex on the HTML - # return the list of image URLs - pass - Lco = LcoClass() + +def validate_datetime(input): + format_string = '%Y-%m-%d %H:%M' + try: + datetime.strptime(input, format_string) + return input + except ValueError: + warning.warning('Input {} is not in format {} for ignoring'.format(input, format_string)) + return '' diff --git a/astroquery/lco/tests/setup_package.py b/astroquery/lco/tests/setup_package.py index 539b55e840..15d0e6352e 100644 --- a/astroquery/lco/tests/setup_package.py +++ b/astroquery/lco/tests/setup_package.py @@ -7,4 +7,4 @@ def get_package_data(): paths = [os.path.join('data', '*.xml'), ] - return {'astroquery.lcogt.tests': paths} + return {'astroquery.lco.tests': paths} diff --git a/astroquery/lco/tests/test_lcogt.py b/astroquery/lco/tests/test_lco.py similarity index 100% rename from astroquery/lco/tests/test_lcogt.py rename to astroquery/lco/tests/test_lco.py diff --git a/astroquery/lco/tests/test_lcogt_remote.py b/astroquery/lco/tests/test_lcogt_remote.py index 58c98ee57f..7c33c613bb 100644 --- a/astroquery/lco/tests/test_lcogt_remote.py +++ b/astroquery/lco/tests/test_lcogt_remote.py @@ -9,7 +9,7 @@ import requests import imp -from ... import lcogt +from ... import lco imp.reload(requests) From a62ef94b5098cc06252c8a41f0c9b1daf06369f3 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Fri, 12 May 2017 09:39:28 +0200 Subject: [PATCH 03/10] Removing template comments --- astroquery/lco/core.py | 31 +------------------------------ astroquery/lco/tests/test_lco.py | 4 ++-- 2 files changed, 3 insertions(+), 32 deletions(-) diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py index 62130066d3..1da1229675 100644 --- a/astroquery/lco/core.py +++ b/astroquery/lco/core.py @@ -42,23 +42,9 @@ from ..utils import commons, system_tools, prepend_docstr_noreturns, async_to_sync from . import conf - -# export all the public classes and methods -# __all__ = ['Lco', 'LcoClass'] - -# declare global variables and constants if any - - -# Now begin your main class -# should be decorated with the async_to_sync imported previously @async_to_sync class LcoClass(QueryWithLogin): - """ - Not all the methods below are necessary but these cover most of the common - cases, new methods may be added if necessary, follow the guidelines at - - """ # use the Configuration Items imported from __init__.py to set the URL, # TIMEOUT, etc. URL = conf.server @@ -68,21 +54,6 @@ class LcoClass(QueryWithLogin): DATA_NAMES = ['id','filename','url','RLEVEL','DATE_OBS','PROPID','OBJECT','SITEID','TELID','EXPTIME','FILTER','REQNUM'] TOKEN = None - # all query methods are implemented with an "async" method that handles - # making the actual HTTP request and returns the raw HTTP response, which - # should be parsed by a separate _parse_result method. The query_object - # method is created by async_to_sync automatically. It would look like - # this: - """ - def query_object(object_name, get_query_payload=False) - response = self.query_object_async(object_name, - get_query_payload=get_query_payload) - if get_query_payload: - return response - result = self._parse_result(response, verbose=verbose) - return result - """ - def query_object_async(self, object_name, get_query_payload=False, cache=True, start=None, end=None): """ @@ -241,5 +212,5 @@ def validate_datetime(input): datetime.strptime(input, format_string) return input except ValueError: - warning.warning('Input {} is not in format {} for ignoring'.format(input, format_string)) + warning.warning('Input {} is not in format {} - ignoring input'.format(input, format_string)) return '' diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py index 5ae8b157f9..7ba937ab47 100644 --- a/astroquery/lco/tests/test_lco.py +++ b/astroquery/lco/tests/test_lco.py @@ -11,8 +11,8 @@ from ...utils.testing_tools import MockResponse from ...utils import commons -from ... import lcogt -from ...lcogt import conf +from ... import lco +from ...lco import conf DATA_FILES = {'Cone': 'Cone.xml', 'Box': 'Box.xml', From 4c7b368173ced8abf18d517f290bf963e18acc86 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Fri, 12 May 2017 12:22:51 +0200 Subject: [PATCH 04/10] Adding helpful text --- astroquery/lco/__init__.py | 4 ++-- astroquery/lco/core.py | 23 +++++++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/astroquery/lco/__init__.py b/astroquery/lco/__init__.py index 354f9e3e65..fac2e044b4 100644 --- a/astroquery/lco/__init__.py +++ b/astroquery/lco/__init__.py @@ -1,10 +1,10 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Las Cumbres Observatory public archive Query Tool -=============== +================================================= This module contains various methods for querying -Las Cumbres Observatory data archive as hosted by IPAC. +Las Cumbres Observatory data archive. """ from astropy import config as _config diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py index 1da1229675..d71a9f83be 100644 --- a/astroquery/lco/core.py +++ b/astroquery/lco/core.py @@ -3,7 +3,7 @@ """ Las Cumbres Observatory -==== +======================= API from @@ -77,14 +77,25 @@ def query_object_async(self, object_name, get_query_payload=False, Returns ------- response : `requests.Response` - The HTTP response returned from the service. - All async methods should return the raw HTTP response. + Returns an astropy Table with results. See below for table headers + id - ID of each Frame + filename - Name of Frame file + url - Download URL + RLEVEL + DATE_OBS - Observation data + PROPID - LCO proposal code + OBJECT - Object Name + SITEID - LCO 3-letter site ID of where observation was made + TELID - LCO 4-letter telescope ID of where observation was made + EXPTIME - Exposure time in seconds + FILTER - Filter name + REQNUM - LCO ID of the observing request which originated this frame Examples -------- - While this section is optional you may put in some examples that - show how to use the method. The examples are written similar to - standard doctests in python. + # from astroquery.lco import Lco + # Lco.login(username='mpalin') + # Lco.query_object_async('M15', start='2016-01-01 00:00', end='2017-02-01 00:00') """ From e0cdef971e93429c4eddae32a426f071709e0bcd Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 09:22:50 +0100 Subject: [PATCH 05/10] Adding test data --- astroquery/lco/__init__.py | 82 ++++++ astroquery/lco/core.py | 317 +++++++++++++++++++++++ astroquery/lco/tests/__init__.py | 0 astroquery/lco/tests/data/Box.xml | 70 +++++ astroquery/lco/tests/data/Cone.xml | 72 +++++ astroquery/lco/tests/data/Cone_coord.xml | 72 +++++ astroquery/lco/tests/data/Polygon.xml | 76 ++++++ astroquery/lco/tests/data/response.json | 1 + astroquery/lco/tests/setup_package.py | 10 + astroquery/lco/tests/test_lco.py | 177 +++++++++++++ astroquery/lco/tests/test_lco_remote.py | 73 ++++++ 11 files changed, 950 insertions(+) create mode 100644 astroquery/lco/__init__.py create mode 100644 astroquery/lco/core.py create mode 100644 astroquery/lco/tests/__init__.py create mode 100644 astroquery/lco/tests/data/Box.xml create mode 100644 astroquery/lco/tests/data/Cone.xml create mode 100644 astroquery/lco/tests/data/Cone_coord.xml create mode 100644 astroquery/lco/tests/data/Polygon.xml create mode 100644 astroquery/lco/tests/data/response.json create mode 100644 astroquery/lco/tests/setup_package.py create mode 100644 astroquery/lco/tests/test_lco.py create mode 100644 astroquery/lco/tests/test_lco_remote.py diff --git a/astroquery/lco/__init__.py b/astroquery/lco/__init__.py new file mode 100644 index 0000000000..fac2e044b4 --- /dev/null +++ b/astroquery/lco/__init__.py @@ -0,0 +1,82 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Las Cumbres Observatory public archive Query Tool +================================================= + +This module contains various methods for querying +Las Cumbres Observatory data archive. +""" +from astropy import config as _config + +class Conf(_config.ConfigNamespace): + """ + Configuration parameters for `astroquery.lco`. + """ + + _base_path = 'https://archive-api.lco.global' + + server = _config.ConfigItem( + _base_path, + 'Las Cumbres Observatory archive API base URL') + + aggregate = _config.ConfigItem( + _base_path + '/aggregate/', + 'Returns the unique values shared across all fits files for site, telescope, instrument, filter and obstype.') + + get_token = _config.ConfigItem( + _base_path + '/api-token-auth/', + 'Obtain an api token for use with authenticated requests.') + + frames = _config.ConfigItem( + _base_path + '/frames/', + 'Return a list of frames.') + + frame = _config.ConfigItem( + _base_path + '/frames/{id}/', + 'Return a single frame.') + + frames_related = _config.ConfigItem( + _base_path + '/frames/{id}/related/', + 'Return a list of frames related to this frame (calibration frames, catalogs, etc).') + + frames_headers = _config.ConfigItem( + _base_path + '/frames/{id}/headers/', + 'Return the headers for a single frame.') + + frames_zip = _config.ConfigItem( + _base_path + '/frames/zip/', + "Returns a zip file containing all of the requested frames. Note this is not the preferred method for downloading files. Use the frame's url property instead.") + + profile = _config.ConfigItem( + _base_path + '/profile/', + 'Returns information about the currently authenticated user.') + + row_limit = _config.ConfigItem( + 10, + 'Maximum number of rows to retrieve in result') + + timeout = _config.ConfigItem( + 60, + 'Time limit for connecting to the Las Cumbres Observatory archive') + + username = _config.ConfigItem( + "", + 'Optional default username for Las Cumbres Observatory archive.') + + dtypes = _config.ConfigItem( + ['i','str','str','str','str','str','str','str','str','f','str','str'], + "NumPy data types for archive response") + + names = _config.ConfigItem( + ['id','filename','url','RLEVEL','DATE_OBS','PROPID','OBJECT','SITEID','TELID','EXPTIME','FILTER','REQNUM'], + "Archive response items") + + +conf = Conf() + + +from .core import Lco, LcoClass + +__all__ = ['Lco', 'LcoClass', + 'Conf', 'conf', + ] diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py new file mode 100644 index 0000000000..57799a3aff --- /dev/null +++ b/astroquery/lco/core.py @@ -0,0 +1,317 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +from __future__ import print_function + +""" +Las Cumbres Observatory +======================= + +API from + + https://archive-api.lco.global + +The following are endpoints of the Las Cumbres Observatory archive query service, + +Endpoint Method Usage +/aggregate/ GET Returns the unique values shared accross all fits files for site, telescope, instrument, filter and obstype. +/api-token-auth/ POST Obtain an api token for use with authenticated requests. +/frames/ GET Return a list of frames. +/frames/{id}/ GET Return a single frame. +/frames/{id}/related/ GET Return a list of frames related to this frame (calibration frames, catalogs, etc). +/frames/{id}/headers/ GET Return the headers for a single frame. +/frames/zip/ POST Returns a zip file containing all of the requested frames. Note this is not the preferred method for downloading files. Use the frame's url property instead. +/profile/ GET Returns information about the currently authenticated user. + +The service accepts the following optional keywords, + +DATE_OBS: The UTC time at the start of exposure. +PROPID: The name of the proposal for which this frame was taken. Not including this will show public data only +INSTRUME: The instrument that produced this frame. +OBJECT: The name of the object given by the user as the target of the observation. Note this is not the same as searching by on sky position - the OBJECT header is free-form text which may or may not match the actual contents of the file. +SITEID: The site that produced this frame. +TELID: The telescope that produced this frame. +EXPTIME: The exposure time of the frame. +FILTER: The filter used to produce this frame. +L1PUBDAT: The date this frame become public. +OBSTYPE: The type of exposure: EXPOSE, BIAS, SPECTRUM, CATALOG, etc. +BLKUID: The Block ID of the frame +REQNUM: The Request number of the frame +RLEVEL: The reduction level of the frame. Currently, there are 3 reduction levels: Some of the meta-data fields are derived and not found in the FITS headers. 0 (Raw), 11 (Quicklook), 91 (Final reduced). + +""" + +import json +import keyring +import getpass +import warnings +from datetime import datetime + +import astropy.units as u +import astropy.coordinates as coord +import astropy.io.votable as votable +from astropy.table import Table +from astropy.io import fits +from astropy import log + +from ..query import BaseQuery, QueryWithLogin +# has common functions required by most modules +from ..utils import commons +# prepend_docstr is a way to copy docstrings between methods +from ..utils import prepend_docstr_nosections +# async_to_sync generates the relevant query tools from _async methods +from ..utils import async_to_sync + +from ..utils import system_tools +from . import conf + +@async_to_sync +class LcoClass(QueryWithLogin): + + # use the Configuration Items imported from __init__.py to set the URL, + # TIMEOUT, etc. + URL = conf.server + TIMEOUT = conf.timeout + FRAMES_URL = conf.frames + DTYPES = ['i','S39','S230','i','S19','S16','S20','S3','S4','f','S2','i'] + DATA_NAMES = ['id','filename','url','RLEVEL','DATE_OBS','PROPID','OBJECT','SITEID','TELID','EXPTIME','FILTER','REQNUM'] + TOKEN = None + + def query_object_async(self, object_name, + start='', end='', rlevel='', + get_query_payload=False, cache=True): + """ + This method is for services that can parse object names. Otherwise + use :meth:`astroquery.lco.LcoClass.query_region`. + Put a brief description of what the class does here. + + Parameters + ---------- + object_name : str + name of the identifier to query. + get_query_payload : bool, optional + This should default to False. When set to `True` the method + should return the HTTP request parameters as a dict. + start: str, optional + Default is `None`. When set this must be in iso E8601Dw.d datestamp format + YYYY-MM-DD HH:MM + end: str, optional + Default is `None`. When set this must be in iso E8601Dw.d datestamp format + YYYY-MM-DD HH:MM + rlevel: str, optional + Pipeline reduction level of the data. Default is `None`, and will + return all data products. Options are 0 (Raw), 11 (Quicklook), 91 (Final reduced). + Returns + ------- + response : `requests.Response` + Returns an astropy Table with results. See below for table headers + id - ID of each Frame + filename - Name of Frame file + url - Download URL + RLEVEL - 0 (Raw), 11 (Quicklook), 91 (Final reduced). + DATE_OBS - Observation data + PROPID - LCO proposal code + OBJECT - Object Name + SITEID - LCO 3-letter site ID of where observation was made + TELID - LCO 4-letter telescope ID of where observation was made + EXPTIME - Exposure time in seconds + FILTER - Filter name + REQNUM - LCO ID of the observing request which originated this frame + + Examples + -------- + # from astroquery.lco import Lco + # Lco.login(username='jdowland') + # Lco.query_object_async('M15', start='2016-01-01 00:00', end='2017-02-01 00:00') + + """ + kwargs = { + 'object_name' : object_name, + 'start' : start, + 'end' : end, + 'rlevel' : rlevel + } + + request_payload = self._args_to_payload(**kwargs) + # similarly fill up the rest of the dict ... + + if get_query_payload: + return request_payload + + return self._parse_response(request_payload, cache) + + def query_region_async(self, coordinates, + start='', end='', rlevel='', + get_query_payload=False, cache=True): + """ + Queries a region around the specified coordinates. + + Parameters + ---------- + coordinates : str or `astropy.coordinates`. + coordinates around which to query + get_query_payload : bool, optional + Just return the dict of HTTP request parameters. + verbose : bool, optional + Display VOTable warnings or not. + + Returns + ------- + response : `requests.Response` + The HTTP response returned from the service. + All async methods should return the raw HTTP response. + """ + kwargs = { + 'coordinates' : coordinates, + 'start' : start, + 'end' : end, + 'rlevel' : rlevel + } + request_payload = self._args_to_payload(**kwargs) + if get_query_payload: + return request_payload + + return self._parse_response(request_payload, cache) + + def _args_to_payload(self, *args, **kwargs): + request_payload = dict() + + request_payload['OBSTYPE'] = 'EXPOSE' + if kwargs.get('start',''): + request_payload['start'] = validate_datetime(kwargs['start']) + if kwargs.get('end',''): + request_payload['end'] = validate_datetime(kwargs['end']) + if kwargs.get('rlevel',''): + request_payload['rlevel'] = validate_rlevel(kwargs['rlevel']) + if kwargs.get('coordinates',''): + request_payload['coordinates'] = validate_coordinates(kwargs['coordinates']) + elif kwargs.get('object_name',''): + request_payload['OBJECT'] = kwargs['object_name'] + return request_payload + + def _login(self, username=None, store_password=False, + reenter_password=False): + """ + Login to the LCO Archive. + + Parameters + ---------- + username : str, optional + Username to the Las Cumbres Observatory archive. If not given, it should be + specified in the config file. + store_password : bool, optional + Stores the password securely in your keyring. Default is False. + reenter_password : bool, optional + Asks for the password even if it is already stored in the + keyring. This is the way to overwrite an already stored password + on the keyring. Default is False. + """ + if username is None: + if self.USERNAME == "": + raise LoginError("If you do not pass a username to login(), " + "you should configure a default one!") + else: + username = self.USERNAME + + # Get password from keyring or prompt + if reenter_password is False: + password_from_keyring = keyring.get_password( + "astroquery:archive-api.lco.global", username) + else: + password_from_keyring = None + + if password_from_keyring is None: + if system_tools.in_ipynb(): + log.warning("You may be using an ipython notebook:" + " the password form will appear in your terminal.") + password = getpass.getpass("{0}, enter your Las Cumbres Observatory password:\n" + .format(username)) + else: + password = password_from_keyring + # Authenticate + log.info("Authenticating {0} with lco.global...".format(username)) + # Do not cache pieces of the login process + login_response = self._request("POST", conf.get_token, + cache=False, data={'username': username, + 'password': password}) + # login form: method=post action=login [no id] + + if login_response.status_code == 200: + log.info("Authentication successful!") + token = json.loads(login_response.content) + self.TOKEN = token['token'] + else: + log.exception("Authentication failed!") + token = None + # When authenticated, save password in keyring if needed + if token and password_from_keyring is None and store_password: + keyring.set_password("astroquery:archive-api.lco.global", username, password) + return + + # the methods above call the private _parse_result method. + # This should parse the raw HTTP response and return it as + # an `astropy.table.Table`. Below is the skeleton: + + def _parse_result(self, response, verbose=False): + # if verbose is False then suppress any VOTable related warnings + if not verbose: + commons.suppress_vo_warnings() + # try to parse the result into an astropy.Table, else + # return the raw result with an informative error message. + log.info(len(self.DTYPES),len(self.DATA_NAMES)) + t = Table(names=self.DATA_NAMES, dtype=self.DTYPES) + if response['count']>0: + try: + for line in response['results']: + filtered_line = { key: line[key] for key in self.DATA_NAMES } + t.add_row(filtered_line) + except ValueError: + # catch common errors here, but never use bare excepts + # return raw result/ handle in some way + pass + + return t + + def _parse_response(self, request_payload, cache): + if not self.TOKEN: + warnings.warn("You have not authenticated and will only get results for non-proprietary data") + headers=None + else: + headers = {'Authorization': 'Token ' + self.TOKEN} + + response = self._request('GET', self.FRAMES_URL, params=request_payload, + timeout=self.TIMEOUT, cache=cache, headers=headers) + if response.status_code == 200: + resp = json.loads(response.content) + return self._parse_result(resp) + else: + log.exception("Failed!") + return False + + +Lco = LcoClass() + +def validate_datetime(input): + format_string = '%Y-%m-%d %H:%M' + try: + datetime.strptime(input, format_string) + return input + except ValueError: + warning.warning('Input {} is not in format {} - ignoring input'.format(input, format_string)) + return '' + +def validate_rlevel(input): + excepted_vals = ['0','00','11','91'] + if str(input) in excepted_vals: + return input + else: + warning.warning('Input {} is not one of {} - ignoring'.format(input,','.join(excepted_vals))) + return '' + +def validate_coordinates(coordinates): + c = commons.parse_coordinates(coordinates) + if c.frame.name == 'galactic': + coords = "POINT({} {})".format(c.icrs.ra.degree, c.icrs.dec.degree) + # for any other, convert to ICRS and send + else: + ra, dec = commons.coord_to_radec(c) + coords = "POINT({} {})".format(ra, dec) + return coords diff --git a/astroquery/lco/tests/__init__.py b/astroquery/lco/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/astroquery/lco/tests/data/Box.xml b/astroquery/lco/tests/data/Box.xml new file mode 100644 index 0000000000..063788931a --- /dev/null +++ b/astroquery/lco/tests/data/Box.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.78500.19300.97800
+
+
diff --git a/astroquery/lco/tests/data/Cone.xml b/astroquery/lco/tests/data/Cone.xml new file mode 100644 index 0000000000..d9d8537846 --- /dev/null +++ b/astroquery/lco/tests/data/Cone.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.169298237.8886720.78500.19300.97800
+
+
diff --git a/astroquery/lco/tests/data/Cone_coord.xml b/astroquery/lco/tests/data/Cone_coord.xml new file mode 100644 index 0000000000..97a1c67d8e --- /dev/null +++ b/astroquery/lco/tests/data/Cone_coord.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.12843098.0560100.78500.19300.97800
+
+
diff --git a/astroquery/lco/tests/data/Polygon.xml b/astroquery/lco/tests/data/Polygon.xml new file mode 100644 index 0000000000..3c0f7cfedd --- /dev/null +++ b/astroquery/lco/tests/data/Polygon.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
10.01569610.09922800h40m03.77s10d05m57.22s0.100.079000400376+100557215.2370.0520.05428.014.6350.0660.06722.414.4810.0940.09514.6AAA22211100066350500n2000-09-2164118.312-52.670U0.225019.2017.2010.60200.15400.75600
10.03101610.06308200h40m07.44s10d03m47.10s0.190.1811400400744+100347016.4120.1170.1179.515.6030.1100.1109.215.3120.1580.1586.8BBC22211100006060600n2000-09-2164118.332-52.707U0.67319.9018.6010.80900.29101.10001
10.03677610.06027800h40m08.83s10d03m37.00s0.110.069000400882+100337015.3540.0450.04625.214.8860.0730.07317.814.5140.0890.08914.2AAA22211100066260600n2000-09-2164118.341-52.711U0.55018.4017.0010.46800.37200.84002
10.05996410.08544500h40m14.39s10d05m07.60s0.230.209600401439+100507616.3400.1030.10410.215.6430.1310.1318.815.3700.1730.1736.4ABC22211100016060500n2000-09-2164118.382-52.687U0.69819.4018.5010.69700.27300.97003
10.01583910.03806100h40m03.80s10d02m17.02s0.090.069000400380+100217014.6620.0260.02947.614.1100.0390.04036.313.7970.0500.05127.4AAA22211100066666600n2000-09-2164118.305-52.731000.55200.31300.86504
10.01117010.09390300h40m02.68s10d05m38.05s0.230.2116700400268+100538016.3730.1260.1279.815.9950.1690.1696.415.3930.1790.1796.3BCC22211100006060500n2000-09-2164118.304-52.675U2.411119.7018.5010.37800.60200.98005
10.00554910.01840100h40m01.33s10d01m06.24s0.160.1410800400133+100106216.1730.0970.09811.815.5110.1350.13510.014.9450.1120.1139.5ABB22211100016160600n2000-09-2164118.286-52.750000.66200.56601.22806
+
+
diff --git a/astroquery/lco/tests/data/response.json b/astroquery/lco/tests/data/response.json new file mode 100644 index 0000000000..a65f3ca967 --- /dev/null +++ b/astroquery/lco/tests/data/response.json @@ -0,0 +1 @@ +{"count":452,"next":"https://archive-api.lco.global/frames/?OBSTYPE=EXPOSE&covers=POINT%28322.493+12.167%29&format=json&limit=100&offset=100","previous":null,"results":[{"id":7454701,"basename":"elp0m414-kb80-20171114-0109-e91","area":{"type":"Polygon","coordinates":[[[-37.340251950427955,11.922942000226557],[-37.67482119455218,11.922941320017376],[-37.675131852061725,12.414291195725657],[-37.339943425890965,12.414291904845172],[-37.340251950427955,11.922942000226557]]]},"related_frames":[7203968,7453013,7454630,7454629,7380277],"version_set":[{"id":7768130,"created":"2017-11-15T14:49:44.246558Z","key":"inzM0m7pEqU2cDp.Yc7Mmzz59BdUmdSQ","md5":"98bfa68d943de2000940158e2c380fb2","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c80b/elp0m414-kb80-20171114-0109-e91?versionId=inzM0m7pEqU2cDp.Yc7Mmzz59BdUmdSQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=228FTb%2FsqmplF%2BrHyqE%2BENb12tw%3D&Expires=1528984033"}],"filename":"elp0m414-kb80-20171114-0109-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c80b/elp0m414-kb80-20171114-0109-e91?versionId=inzM0m7pEqU2cDp.Yc7Mmzz59BdUmdSQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=228FTb%2FsqmplF%2BrHyqE%2BENb12tw%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-15T03:32:49.363000Z","PROPID":"LCOEPO2017AB-003","INSTRUME":"kb80","OBJECT":"M15","SITEID":"elp","TELID":"0m4a","EXPTIME":"10.234","FILTER":"V","L1PUBDAT":"2017-11-15T03:32:49.363000Z","OBSTYPE":"EXPOSE","BLKUID":198291360,"REQNUM":1325314},{"id":7453013,"basename":"elp0m414-kb80-20171114-0109-e00","area":{"type":"Polygon","coordinates":[[[-37.33860749693463,11.91971910019777],[-37.676794928386755,11.919718216421098],[-37.67711419055746,12.41880066324957],[-37.338291020328256,12.418801585190383],[-37.33860749693463,11.91971910019777]]]},"related_frames":[7454701],"version_set":[{"id":7766442,"created":"2017-11-15T03:33:06.744496Z","key":"o.qNIVoLXXQp8u84dvYjeRMzI1ehhTBc","md5":"aa1700fbac7d8c2310c09a8d2ec04f9b","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/105a/elp0m414-kb80-20171114-0109-e00?versionId=o.qNIVoLXXQp8u84dvYjeRMzI1ehhTBc&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=uUpgKrm1vPMe9z7yFRJSrIHRzw8%3D&Expires=1528984033"}],"filename":"elp0m414-kb80-20171114-0109-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/105a/elp0m414-kb80-20171114-0109-e00?versionId=o.qNIVoLXXQp8u84dvYjeRMzI1ehhTBc&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=uUpgKrm1vPMe9z7yFRJSrIHRzw8%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-15T03:32:49.363000Z","PROPID":"LCOEPO2017AB-003","INSTRUME":"kb80","OBJECT":"M15","SITEID":"elp","TELID":"0m4a","EXPTIME":"10.234","FILTER":"V","L1PUBDAT":"2017-11-15T03:32:49.363000Z","OBSTYPE":"EXPOSE","BLKUID":198291360,"REQNUM":1325314},{"id":7406212,"basename":"lsc0m412-kb26-20171108-0062-e00","area":{"type":"Polygon","coordinates":[[[-37.33860759736882,11.919718400200797],[-37.67679502794874,11.919717516424173],[-37.67711429009972,12.418799963252658],[-37.33829112078206,12.418800885193418],[-37.33860759736882,11.919718400200797]]]},"related_frames":[7409268],"version_set":[{"id":7719632,"created":"2017-11-09T00:15:30.787590Z","key":"37nurjiUOcqnvtskM0_xzAWLP72u9wkb","md5":"39fc8d35929615935a25b34cfe2e1247","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/64a2/lsc0m412-kb26-20171108-0062-e00?versionId=37nurjiUOcqnvtskM0_xzAWLP72u9wkb&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=xTGYNCKTsOO4xGiCziououOhylk%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171108-0062-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/64a2/lsc0m412-kb26-20171108-0062-e00?versionId=37nurjiUOcqnvtskM0_xzAWLP72u9wkb&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=xTGYNCKTsOO4xGiCziououOhylk%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-09T00:14:44.367000Z","PROPID":"LCOEPO2017AB-003","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"30.283","FILTER":"V","L1PUBDAT":"2017-11-09T00:14:44.367000Z","OBSTYPE":"EXPOSE","BLKUID":196272042,"REQNUM":1320738},{"id":7409268,"basename":"lsc0m412-kb26-20171108-0062-e91","area":{"type":"Polygon","coordinates":[[[-37.340252050858055,11.922941300229525],[-37.67482129411917,11.92294062002038],[-37.6751319516095,12.414290495728672],[-37.339943526340164,12.414291204848148],[-37.340252050858055,11.922941300229525]]]},"related_frames":[7224439,7409259,7409258,7406212,7351617],"version_set":[{"id":7722688,"created":"2017-11-09T17:07:18.873117Z","key":"gU50gdlPXMtgdQZILXeQkefxB3pm7F.8","md5":"98e425b51c482ce3051c086206b2c401","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/0653/lsc0m412-kb26-20171108-0062-e91?versionId=gU50gdlPXMtgdQZILXeQkefxB3pm7F.8&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=okak%2BUBOoJG3Q6qChhxjMA6qtpc%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171108-0062-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/0653/lsc0m412-kb26-20171108-0062-e91?versionId=gU50gdlPXMtgdQZILXeQkefxB3pm7F.8&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=okak%2BUBOoJG3Q6qChhxjMA6qtpc%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-09T00:14:44.367000Z","PROPID":"LCOEPO2017AB-003","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"30.283","FILTER":"V","L1PUBDAT":"2017-11-09T00:14:44.367000Z","OBSTYPE":"EXPOSE","BLKUID":196272042,"REQNUM":1320738},{"id":7348407,"basename":"coj0m403-kb98-20171102-0063-e00","area":{"type":"Polygon","coordinates":[[[-37.338781986652464,11.919896899430235],[-37.68618988694095,11.919890342481963],[-37.68653040564118,12.424772001271883],[-37.33846182043078,12.42477884465547],[-37.338781986652464,11.919896899430235]]]},"related_frames":[7359798],"version_set":[{"id":7661831,"created":"2017-11-02T09:49:08.744306Z","key":"b.grD5VSn344znHs0oJam2.XaOPr2Qms","md5":"b0c2308cd2e43ebe8aafb2ecc6a8383d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/06c0/coj0m403-kb98-20171102-0063-e00?versionId=b.grD5VSn344znHs0oJam2.XaOPr2Qms&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Py3IhWfmWDY90jt0Dr8qNKEfdOM%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0063-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/06c0/coj0m403-kb98-20171102-0063-e00?versionId=b.grD5VSn344znHs0oJam2.XaOPr2Qms&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Py3IhWfmWDY90jt0Dr8qNKEfdOM%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-02T09:48:13.106000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.293","FILTER":"B","L1PUBDAT":"2017-11-02T09:48:13.106000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7359798,"basename":"coj0m403-kb98-20171102-0063-e91","area":{"type":"Polygon","coordinates":[[[-37.686514022990195,12.402432565523778],[-37.35419999220812,12.411311847700045],[-37.34094804407937,11.926542999749124],[-37.6726570079594,11.917679896721124],[-37.686514022990195,12.402432565523778]]]},"related_frames":[6445720,7359757,7359743,7359735,7348407],"version_set":[{"id":7673221,"created":"2017-11-03T03:09:46.878487Z","key":"wnrj5uY4nbx7gB6xsLbrPkPCKPOnPbZC","md5":"cf9773ea319cf174bffdcbc14d5b9205","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/515b/coj0m403-kb98-20171102-0063-e91?versionId=wnrj5uY4nbx7gB6xsLbrPkPCKPOnPbZC&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=mahjS7US1wPLcaeOtqkQhNlSflQ%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0063-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/515b/coj0m403-kb98-20171102-0063-e91?versionId=wnrj5uY4nbx7gB6xsLbrPkPCKPOnPbZC&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=mahjS7US1wPLcaeOtqkQhNlSflQ%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-02T09:48:13.106000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.293","FILTER":"B","L1PUBDAT":"2017-11-02T09:48:13.106000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7359795,"basename":"coj0m403-kb98-20171102-0062-e91","area":{"type":"Polygon","coordinates":[[[-37.3397162384768,11.92296561200702],[-37.675273407968916,11.922965124707735],[-37.67558406209935,12.413348414238078],[-37.339407104898555,12.413348922207842],[-37.3397162384768,11.92296561200702]]]},"related_frames":[6445720,7359743,7359735,7348397,7338923],"version_set":[{"id":7673218,"created":"2017-11-03T03:09:39.660142Z","key":"XB.nWUS3AP0zl1xaQAZZgMcyA_g573KI","md5":"67492152b88d791f99b601499d70302c","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2d0f/coj0m403-kb98-20171102-0062-e91?versionId=XB.nWUS3AP0zl1xaQAZZgMcyA_g573KI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=JMwBNDS0eIKU1HWpPl%2BP2ON9gVI%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0062-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2d0f/coj0m403-kb98-20171102-0062-e91?versionId=XB.nWUS3AP0zl1xaQAZZgMcyA_g573KI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=JMwBNDS0eIKU1HWpPl%2BP2ON9gVI%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-02T09:46:56.787000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.283","FILTER":"V","L1PUBDAT":"2017-11-02T09:46:56.787000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7348397,"basename":"coj0m403-kb98-20171102-0062-e00","area":{"type":"Polygon","coordinates":[[[-37.33873038204854,11.919743100094161],[-37.68613808548082,11.919736543232982],[-37.68647859954723,12.424618202025766],[-37.338410220183675,12.424625045321925],[-37.33873038204854,11.919743100094161]]]},"related_frames":[7359795],"version_set":[{"id":7661821,"created":"2017-11-02T09:47:51.806929Z","key":"rz6kPxY3dbfuH9Ay_RV4Kn8cfG57wLXA","md5":"5375a7174a0aec0000ba405a4defd2f0","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1134/coj0m403-kb98-20171102-0062-e00?versionId=rz6kPxY3dbfuH9Ay_RV4Kn8cfG57wLXA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Ml7DqK1ikU8yhMs8vRrjUQbcppg%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0062-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1134/coj0m403-kb98-20171102-0062-e00?versionId=rz6kPxY3dbfuH9Ay_RV4Kn8cfG57wLXA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Ml7DqK1ikU8yhMs8vRrjUQbcppg%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-02T09:46:56.787000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.283","FILTER":"V","L1PUBDAT":"2017-11-02T09:46:56.787000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7348388,"basename":"coj0m403-kb98-20171102-0061-e00","area":{"type":"Polygon","coordinates":[[[-37.33873038204854,11.919743100094161],[-37.68613808548082,11.919736543232982],[-37.68647859954723,12.424618202025766],[-37.338410220183675,12.424625045321925],[-37.33873038204854,11.919743100094161]]]},"related_frames":[7359793],"version_set":[{"id":7661812,"created":"2017-11-02T09:46:41.116839Z","key":"5cLIgzNO8BXoVADaiO1rS_dXhK9n2kz4","md5":"c6a04ecdf1fba1d79525f5acf0431b09","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f581/coj0m403-kb98-20171102-0061-e00?versionId=5cLIgzNO8BXoVADaiO1rS_dXhK9n2kz4&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=v8mxe0gzMFNhVyKVFvB5y0V7OM4%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0061-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f581/coj0m403-kb98-20171102-0061-e00?versionId=5cLIgzNO8BXoVADaiO1rS_dXhK9n2kz4&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=v8mxe0gzMFNhVyKVFvB5y0V7OM4%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-02T09:45:47.583000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.295","FILTER":"rp","L1PUBDAT":"2017-11-02T09:45:47.583000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7359793,"basename":"coj0m403-kb98-20171102-0061-e91","area":{"type":"Polygon","coordinates":[[[-37.3397162384768,11.92296561200702],[-37.675273407968916,11.922965124707735],[-37.67558406209935,12.413348414238078],[-37.339407104898555,12.413348922207842],[-37.3397162384768,11.92296561200702]]]},"related_frames":[6445720,7359743,7359735,7348388,7307101],"version_set":[{"id":7673216,"created":"2017-11-03T03:09:31.654201Z","key":"tNzBMNLtWVETc_hMmQXUI6fyG9hKJaK5","md5":"7d73fbe834ec720e8ce446ed116c35b0","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/91cd/coj0m403-kb98-20171102-0061-e91?versionId=tNzBMNLtWVETc_hMmQXUI6fyG9hKJaK5&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ftHIfJrMtuFKghwf1BbE%2B7x24lg%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20171102-0061-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/91cd/coj0m403-kb98-20171102-0061-e91?versionId=tNzBMNLtWVETc_hMmQXUI6fyG9hKJaK5&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ftHIfJrMtuFKghwf1BbE%2B7x24lg%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-02T09:45:47.583000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.295","FILTER":"rp","L1PUBDAT":"2017-11-02T09:45:47.583000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":7342955,"basename":"lsc0m412-kb26-20171031-0068-e91","area":{"type":"Polygon","coordinates":[[[-37.67422155531062,12.408069279540976],[-37.342643930813324,12.409713529604964],[-37.3404244844055,11.923645163745748],[-37.671396250989915,11.922003918120776],[-37.67422155531062,12.408069279540976]]]},"related_frames":[7224439,7342932,7342931,7338479,7331034],"version_set":[{"id":7656379,"created":"2017-11-01T16:49:40.059512Z","key":"3J0GzLYE9OmH52ZUwzAFiatupHj3e3p4","md5":"eb7f5a373fdebed55629aa5560e6148a","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bc88/lsc0m412-kb26-20171031-0068-e91?versionId=3J0GzLYE9OmH52ZUwzAFiatupHj3e3p4&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Paq%2F0XrjY77%2BZSV2sos%2FY%2FzPFQI%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0068-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bc88/lsc0m412-kb26-20171031-0068-e91?versionId=3J0GzLYE9OmH52ZUwzAFiatupHj3e3p4&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Paq%2F0XrjY77%2BZSV2sos%2FY%2FzPFQI%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-01T00:20:01.473000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.280","FILTER":"B","L1PUBDAT":"2017-11-01T00:20:01.473000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7338479,"basename":"lsc0m412-kb26-20171031-0068-e00","area":{"type":"Polygon","coordinates":[[[-37.33860538204851,11.919743100094161],[-37.67679284340386,11.919742216315656],[-37.67711210625254,12.41882466314373],[-37.33828890477008,12.418825585086383],[-37.33860538204851,11.919743100094161]]]},"related_frames":[7342955],"version_set":[{"id":7651901,"created":"2017-11-01T00:20:53.863053Z","key":"HGPxm7gJyA8UCF.kpfxe5jq2YmWKvWwQ","md5":"35310ec2cb824979a74a61088c66c695","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c2d7/lsc0m412-kb26-20171031-0068-e00?versionId=HGPxm7gJyA8UCF.kpfxe5jq2YmWKvWwQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fiQpX%2FxUElw02YBj%2FUACVqKpyWQ%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0068-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c2d7/lsc0m412-kb26-20171031-0068-e00?versionId=HGPxm7gJyA8UCF.kpfxe5jq2YmWKvWwQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fiQpX%2FxUElw02YBj%2FUACVqKpyWQ%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-01T00:20:01.473000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.280","FILTER":"B","L1PUBDAT":"2017-11-01T00:20:01.473000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7338477,"basename":"lsc0m412-kb26-20171031-0067-e00","area":{"type":"Polygon","coordinates":[[[-37.3386053819865,11.919743200093727],[-37.676792843466444,11.919742316315213],[-37.67711210631796,12.41882476314329],[-37.33828890470528,12.418825685085947],[-37.3386053819865,11.919743200093727]]]},"related_frames":[7342954],"version_set":[{"id":7651899,"created":"2017-11-01T00:19:56.636858Z","key":"Tjk7sGrFPqSuj3Id7V_QKbhgCiMxit.l","md5":"f067ef6fd07672b15af56d1385cc939b","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/82da/lsc0m412-kb26-20171031-0067-e00?versionId=Tjk7sGrFPqSuj3Id7V_QKbhgCiMxit.l&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=kGzl7tUFK24Gr2h1PRbTY76Poic%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0067-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/82da/lsc0m412-kb26-20171031-0067-e00?versionId=Tjk7sGrFPqSuj3Id7V_QKbhgCiMxit.l&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=kGzl7tUFK24Gr2h1PRbTY76Poic%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-01T00:19:04.560000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.287","FILTER":"V","L1PUBDAT":"2017-11-01T00:19:04.560000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7342954,"basename":"lsc0m412-kb26-20171031-0067-e91","area":{"type":"Polygon","coordinates":[[[-37.340249835621705,11.922966100124537],[-37.67481910946077,11.92296541991394],[-37.67512976763277,12.414315295621833],[-37.33994131042681,12.414316004742773],[-37.340249835621705,11.922966100124537]]]},"related_frames":[7224439,7342935,7342932,7342931,7338477],"version_set":[{"id":7656378,"created":"2017-11-01T16:49:33.458495Z","key":".1XXJod_r3tpOlM5.xDvg5baf8UV5wel","md5":"9e9ed625db625e12905d777f33fd6983","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f619/lsc0m412-kb26-20171031-0067-e91?versionId=.1XXJod_r3tpOlM5.xDvg5baf8UV5wel&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=h7vzLNjsLjAkzLR9UZGGKu7QHNk%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0067-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f619/lsc0m412-kb26-20171031-0067-e91?versionId=.1XXJod_r3tpOlM5.xDvg5baf8UV5wel&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=h7vzLNjsLjAkzLR9UZGGKu7QHNk%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-01T00:19:04.560000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.287","FILTER":"V","L1PUBDAT":"2017-11-01T00:19:04.560000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7338474,"basename":"lsc0m412-kb26-20171031-0066-e00","area":{"type":"Polygon","coordinates":[[[-37.3386053819865,11.919743200093727],[-37.676792843466444,11.919742316315213],[-37.67711210631796,12.41882476314329],[-37.33828890470528,12.418825685085947],[-37.3386053819865,11.919743200093727]]]},"related_frames":[7342953],"version_set":[{"id":7651896,"created":"2017-11-01T00:19:00.477370Z","key":"D5XExanpKApTGBTzinn8_Zu0J0BQx7oD","md5":"7096533befc47cfaa481b150ddef47b3","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e384/lsc0m412-kb26-20171031-0066-e00?versionId=D5XExanpKApTGBTzinn8_Zu0J0BQx7oD&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=w5FBjzhn7%2BfnmvxBD%2FaAy6DfNBo%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0066-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e384/lsc0m412-kb26-20171031-0066-e00?versionId=D5XExanpKApTGBTzinn8_Zu0J0BQx7oD&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=w5FBjzhn7%2BfnmvxBD%2FaAy6DfNBo%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-11-01T00:18:08.071000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.283","FILTER":"rp","L1PUBDAT":"2017-11-01T00:18:08.071000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7342953,"basename":"lsc0m412-kb26-20171031-0066-e91","area":{"type":"Polygon","coordinates":[[[-37.340249835621705,11.922966100124537],[-37.67481910946077,11.92296541991394],[-37.67512976763277,12.414315295621833],[-37.33994131042681,12.414316004742773],[-37.340249835621705,11.922966100124537]]]},"related_frames":[7224439,7342932,7342931,7338474,7303946],"version_set":[{"id":7656377,"created":"2017-11-01T16:49:22.806909Z","key":"LZQ.LlJdyYOk1QwfU7V3ScAknwc7ARno","md5":"6ec9b5e21272c840e575c7831611f0f1","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/33a9/lsc0m412-kb26-20171031-0066-e91?versionId=LZQ.LlJdyYOk1QwfU7V3ScAknwc7ARno&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Y0tfCueWRC0hIZ%2FWBKJCsFab8Iw%3D&Expires=1528984033"}],"filename":"lsc0m412-kb26-20171031-0066-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/33a9/lsc0m412-kb26-20171031-0066-e91?versionId=LZQ.LlJdyYOk1QwfU7V3ScAknwc7ARno&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Y0tfCueWRC0hIZ%2FWBKJCsFab8Iw%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-11-01T00:18:08.071000Z","PROPID":"LCOEPO2014B-010","INSTRUME":"kb26","OBJECT":"M15","SITEID":"lsc","TELID":"0m4a","EXPTIME":"40.283","FILTER":"rp","L1PUBDAT":"2017-11-01T00:18:08.071000Z","OBSTYPE":"EXPOSE","BLKUID":193764648,"REQNUM":1309306},{"id":7196789,"basename":"coj2m002-fs01-20171012-0119-e00","area":{"type":"Polygon","coordinates":[[[-37.418642485471935,12.080598735001697],[-37.4185850493526,12.253365198714269],[-37.59814288675403,12.253364286507068],[-37.59808362638398,12.080597836048245],[-37.418642485471935,12.080598735001697]]]},"related_frames":[7199401],"version_set":[{"id":7509254,"created":"2017-10-12T11:00:02.925969Z","key":"uO4bzJ_f3XrOtpg63D1.jNenx2W2Ng8g","md5":"df1b1e56bba9af26297e2b11acb01248","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/813f/coj2m002-fs01-20171012-0119-e00?versionId=uO4bzJ_f3XrOtpg63D1.jNenx2W2Ng8g&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qpXVUPysw64BuEw3%2F%2F0HT7Uia0I%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0119-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/813f/coj2m002-fs01-20171012-0119-e00?versionId=uO4bzJ_f3XrOtpg63D1.jNenx2W2Ng8g&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qpXVUPysw64BuEw3%2F%2F0HT7Uia0I%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-10-12T10:59:18.411000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"rp","L1PUBDAT":"2017-10-12T10:59:18.411000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7199401,"basename":"coj2m002-fs01-20171012-0119-e91","area":{"type":"Polygon","coordinates":[[[-37.419505097099716,12.082118200786349],[-37.419449194727406,12.251930678537311],[-37.59598322436801,12.251930195676204],[-37.59592635650171,12.082117724821751],[-37.419505097099716,12.082118200786349]]]},"related_frames":[7199319,7199315,7196789,7178236,3536541],"version_set":[{"id":7511871,"created":"2017-10-13T00:00:51.605264Z","key":"BKz70Z4RpWkUpxI5VJOsI.IYxV7hAe6G","md5":"d384f8470e7a7c34452e2dca76e54a8d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a46b/coj2m002-fs01-20171012-0119-e91?versionId=BKz70Z4RpWkUpxI5VJOsI.IYxV7hAe6G&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=M9%2BBMfViXu3SSXllMq9TtwIb9%2B4%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0119-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a46b/coj2m002-fs01-20171012-0119-e91?versionId=BKz70Z4RpWkUpxI5VJOsI.IYxV7hAe6G&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=M9%2BBMfViXu3SSXllMq9TtwIb9%2B4%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-12T10:59:18.411000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"rp","L1PUBDAT":"2017-10-12T10:59:18.411000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7199400,"basename":"coj2m002-fs01-20171012-0118-e91","area":{"type":"Polygon","coordinates":[[[-37.42239599380025,12.082326014868164],[-37.423148788455535,12.250466691407441],[-37.597943346228305,12.249663952573203],[-37.59708000312207,12.081523783735223],[-37.42239599380025,12.082326014868164]]]},"related_frames":[7199319,7199315,7196787,7199324,3536541],"version_set":[{"id":7511870,"created":"2017-10-13T00:00:30.500244Z","key":"vaYp6CMo1EeblEaGzeUWw0U7e.6G3yh7","md5":"234f1a0de775b79437fa0363dce41f8d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/acaa/coj2m002-fs01-20171012-0118-e91?versionId=vaYp6CMo1EeblEaGzeUWw0U7e.6G3yh7&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=aC1wd4rMvS9j%2B%2BlPpRHdqa5aQOY%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0118-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/acaa/coj2m002-fs01-20171012-0118-e91?versionId=vaYp6CMo1EeblEaGzeUWw0U7e.6G3yh7&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=aC1wd4rMvS9j%2B%2BlPpRHdqa5aQOY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-12T10:58:21.504000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"V","L1PUBDAT":"2017-10-12T10:58:21.504000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7196787,"basename":"coj2m002-fs01-20171012-0118-e00","area":{"type":"Polygon","coordinates":[[[-37.418642485471935,12.080598735001697],[-37.4185850493526,12.253365198714269],[-37.59814288675403,12.253364286507068],[-37.59808362638398,12.080597836048245],[-37.418642485471935,12.080598735001697]]]},"related_frames":[7199400],"version_set":[{"id":7509252,"created":"2017-10-12T10:59:05.109470Z","key":"kpVON4VoB2pd8_SCMThCg_CVop2x1gIP","md5":"2a9deafad6bb250ed5cabf0bec211515","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8022/coj2m002-fs01-20171012-0118-e00?versionId=kpVON4VoB2pd8_SCMThCg_CVop2x1gIP&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=RQZDu9lzmB6sp6Gri8yJJAp3ZSE%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0118-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8022/coj2m002-fs01-20171012-0118-e00?versionId=kpVON4VoB2pd8_SCMThCg_CVop2x1gIP&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=RQZDu9lzmB6sp6Gri8yJJAp3ZSE%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-10-12T10:58:21.504000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"V","L1PUBDAT":"2017-10-12T10:58:21.504000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7196785,"basename":"coj2m002-fs01-20171012-0117-e00","area":{"type":"Polygon","coordinates":[[[-37.418642485471935,12.080598735001697],[-37.4185850493526,12.253365198714269],[-37.59814288675403,12.253364286507068],[-37.59808362638398,12.080597836048245],[-37.418642485471935,12.080598735001697]]]},"related_frames":[7199399],"version_set":[{"id":7509250,"created":"2017-10-12T10:58:12.657715Z","key":"W64yZAcc9A6SNs6ZbBNzaqRs2k0XYeKK","md5":"abd3d671aa3aa1a18563fa30f66fc3d5","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3554/coj2m002-fs01-20171012-0117-e00?versionId=W64yZAcc9A6SNs6ZbBNzaqRs2k0XYeKK&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ot%2FljR9eS1o8Rt3utniaKAE8NOg%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0117-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3554/coj2m002-fs01-20171012-0117-e00?versionId=W64yZAcc9A6SNs6ZbBNzaqRs2k0XYeKK&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ot%2FljR9eS1o8Rt3utniaKAE8NOg%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-10-12T10:57:28.381000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"B","L1PUBDAT":"2017-10-12T10:57:28.381000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7199399,"basename":"coj2m002-fs01-20171012-0117-e91","area":{"type":"Polygon","coordinates":[[[-37.42275077843021,12.081717120307784],[-37.423529754794345,12.249818754066295],[-37.59828327844701,12.248990032992115],[-37.59739381140895,12.080888923217508],[-37.42275077843021,12.081717120307784]]]},"related_frames":[7199319,7199315,7196785,7199322,3536541],"version_set":[{"id":7511869,"created":"2017-10-13T00:00:21.300720Z","key":"LMwABgqoJ0VE16eLqqJ9j2TrLjx.3Wlt","md5":"3921b56f0b919d15141c6d7f6b500c00","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/25c6/coj2m002-fs01-20171012-0117-e91?versionId=LMwABgqoJ0VE16eLqqJ9j2TrLjx.3Wlt&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=LXObsox4OwIlpPvf%2FWgXECRHVlk%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20171012-0117-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/25c6/coj2m002-fs01-20171012-0117-e91?versionId=LMwABgqoJ0VE16eLqqJ9j2TrLjx.3Wlt&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=LXObsox4OwIlpPvf%2FWgXECRHVlk%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-12T10:57:28.381000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"M15","SITEID":"coj","TELID":"2m0a","EXPTIME":"20.000","FILTER":"B","L1PUBDAT":"2017-10-12T10:57:28.381000Z","OBSTYPE":"EXPOSE","BLKUID":188558964,"REQNUM":1292674},{"id":7172931,"basename":"tfn0m414-kb99-20171008-0204-e00","area":{"type":"Polygon","coordinates":[[[-37.48865322415338,11.76151778273311],[-37.83585984912958,11.761511315420174],[-37.83619560288622,12.266392977133],[-37.488337538079634,12.266399730542293],[-37.48865322415338,11.76151778273311]]]},"related_frames":[7191009],"version_set":[{"id":7485286,"created":"2017-10-09T00:51:14.918492Z","key":".wzqA1lA05klins2a5qEWzrN6tZs5cHC","md5":"3d642a75c98f63b67a6d05b409ff41ac","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1be7/tfn0m414-kb99-20171008-0204-e00?versionId=.wzqA1lA05klins2a5qEWzrN6tZs5cHC&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=T%2BWTDZ%2F1l26ZaOaUSk2g1koFtWg%3D&Expires=1528984033"}],"filename":"tfn0m414-kb99-20171008-0204-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1be7/tfn0m414-kb99-20171008-0204-e00?versionId=.wzqA1lA05klins2a5qEWzrN6tZs5cHC&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=T%2BWTDZ%2F1l26ZaOaUSk2g1koFtWg%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-10-09T00:50:46.845000Z","PROPID":"calibrate","INSTRUME":"kb99","OBJECT":"TPT(3.428,12.090)","SITEID":"tfn","TELID":"0m4a","EXPTIME":"15.282","FILTER":"rp","L1PUBDAT":"2017-10-09T00:50:46.845000Z","OBSTYPE":"EXPOSE","BLKUID":187261444,"REQNUM":null},{"id":7191009,"basename":"tfn0m414-kb99-20171008-0204-e91","area":{"type":"Polygon","coordinates":[[[-37.8217354889307,12.250003261967683],[-37.491666552794925,12.249312635589165],[-37.49301514338066,11.76753901796256],[-37.82249423106566,11.768228410157567],[-37.8217354889307,12.250003261967683]]]},"related_frames":[7155100,7183092,7172931,7182973,7179927],"version_set":[{"id":7503474,"created":"2017-10-11T15:30:51.754696Z","key":"IeKDrgFz.O0mM9K.3JOib72hoc0CogZH","md5":"80cc66fdf847bea66782c0b4407f0519","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e4de/tfn0m414-kb99-20171008-0204-e91?versionId=IeKDrgFz.O0mM9K.3JOib72hoc0CogZH&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HR6AFX8i2q3W6jw9Vh1UGEBprB8%3D&Expires=1528984033"}],"filename":"tfn0m414-kb99-20171008-0204-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e4de/tfn0m414-kb99-20171008-0204-e91?versionId=IeKDrgFz.O0mM9K.3JOib72hoc0CogZH&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HR6AFX8i2q3W6jw9Vh1UGEBprB8%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-09T00:50:46.845000Z","PROPID":"calibrate","INSTRUME":"kb99","OBJECT":"TPT(3.428,12.090)","SITEID":"tfn","TELID":"0m4a","EXPTIME":"15.282","FILTER":"rp","L1PUBDAT":"2017-10-09T00:50:46.845000Z","OBSTYPE":"EXPOSE","BLKUID":187261444,"REQNUM":null},{"id":7165571,"basename":"tfn0m414-kb99-20171007-0081-e00","area":{"type":"Polygon","coordinates":[[[-37.34333802758971,11.96150911976868],[-37.69079928982501,11.961502539252495],[-37.691141062728036,12.46638419726733],[-37.3430166821276,12.466391064308713],[-37.34333802758971,11.96150911976868]]]},"related_frames":[7186703],"version_set":[{"id":7477924,"created":"2017-10-07T20:49:31.011860Z","key":"VY2dqtHfSjgPRUu6OEB4PwvQZUF01ZC.","md5":"42fa936868656a0c7c48e02e9518921d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a603/tfn0m414-kb99-20171007-0081-e00?versionId=VY2dqtHfSjgPRUu6OEB4PwvQZUF01ZC.&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=WVSrOSaEbiBIm8JW1HLd518H4L8%3D&Expires=1528984033"}],"filename":"tfn0m414-kb99-20171007-0081-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a603/tfn0m414-kb99-20171007-0081-e00?versionId=VY2dqtHfSjgPRUu6OEB4PwvQZUF01ZC.&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=WVSrOSaEbiBIm8JW1HLd518H4L8%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-10-07T20:49:00.500000Z","PROPID":"calibrate","INSTRUME":"kb99","OBJECT":"TPT(-0.688,12.290)","SITEID":"tfn","TELID":"0m4a","EXPTIME":"15.285","FILTER":"rp","L1PUBDAT":"2017-10-07T20:49:00.500000Z","OBSTYPE":"EXPOSE","BLKUID":187261432,"REQNUM":null},{"id":7186703,"basename":"tfn0m414-kb99-20171007-0081-e91","area":{"type":"Polygon","coordinates":[[[-37.67965421075007,12.451137033941652],[-37.35010267528281,12.450127474823532],[-37.35194291986494,11.969478653558413],[-37.6808967542521,11.970486381646257],[-37.67965421075007,12.451137033941652]]]},"related_frames":[7155100,7182938,7179920,7165571,7183078],"version_set":[{"id":7499168,"created":"2017-10-11T05:53:54.398830Z","key":"Lybff3ZrJeltcuigMcbVTSMwV3WhN3oM","md5":"b1144f179ec22aa4afb6597d5f4954f5","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6692/tfn0m414-kb99-20171007-0081-e91?versionId=Lybff3ZrJeltcuigMcbVTSMwV3WhN3oM&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=pI9qiR5L7KvzJHNA7RzrUnQcx%2Fk%3D&Expires=1528984033"}],"filename":"tfn0m414-kb99-20171007-0081-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6692/tfn0m414-kb99-20171007-0081-e91?versionId=Lybff3ZrJeltcuigMcbVTSMwV3WhN3oM&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=pI9qiR5L7KvzJHNA7RzrUnQcx%2Fk%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-07T20:49:00.500000Z","PROPID":"calibrate","INSTRUME":"kb99","OBJECT":"TPT(-0.688,12.290)","SITEID":"tfn","TELID":"0m4a","EXPTIME":"15.285","FILTER":"rp","L1PUBDAT":"2017-10-07T20:49:00.500000Z","OBSTYPE":"EXPOSE","BLKUID":187261432,"REQNUM":null},{"id":7150463,"basename":"cpt1m012-fl06-20171004-0143-e91","area":{"type":"Polygon","coordinates":[[[-37.73351299087227,12.388160445789469],[-37.733135924335386,11.945496602467829],[-37.28067378544824,11.945496514123539],[-37.28029653471265,12.388160354068988],[-37.73351299087227,12.388160445789469]]]},"related_frames":[5467169,7150373,7149227,7150372,7150380],"version_set":[{"id":7462814,"created":"2017-10-05T08:00:37.085967Z","key":"6Gb82fTZYPGn_fvyrNfXL9BwZVBt8pVa","md5":"aca0582eef8112cfea8f19250576a998","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7863/cpt1m012-fl06-20171004-0143-e91?versionId=6Gb82fTZYPGn_fvyrNfXL9BwZVBt8pVa&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=M2On%2F4eS6JnC2iqMVZu8MyjSOX0%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20171004-0143-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7863/cpt1m012-fl06-20171004-0143-e91?versionId=6Gb82fTZYPGn_fvyrNfXL9BwZVBt8pVa&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=M2On%2F4eS6JnC2iqMVZu8MyjSOX0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-04T21:15:58.621000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fl06","OBJECT":"M15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"90.000","FILTER":"rp","L1PUBDAT":"2017-10-04T21:15:58.621000Z","OBSTYPE":"EXPOSE","BLKUID":186437290,"REQNUM":1292679},{"id":7150461,"basename":"cpt1m012-fl06-20171004-0142-e91","area":{"type":"Polygon","coordinates":[[[-37.73351299087227,12.388160445789469],[-37.733135924335386,11.945496602467829],[-37.28067378544824,11.945496514123539],[-37.28029653471265,12.388160354068988],[-37.73351299087227,12.388160445789469]]]},"related_frames":[5467169,7150373,7149226,7150372,7135848],"version_set":[{"id":7462812,"created":"2017-10-05T08:00:11.277577Z","key":"TkkFvAiwmAp.b3jHgJ9vBMurNWPNtOTe","md5":"3984e64514ed95c409ebcc199fea63cf","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e524/cpt1m012-fl06-20171004-0142-e91?versionId=TkkFvAiwmAp.b3jHgJ9vBMurNWPNtOTe&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=YVK9s94Hp9fkyY6ncT%2FI5ux29ss%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20171004-0142-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e524/cpt1m012-fl06-20171004-0142-e91?versionId=TkkFvAiwmAp.b3jHgJ9vBMurNWPNtOTe&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=YVK9s94Hp9fkyY6ncT%2FI5ux29ss%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-04T21:13:29.776000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fl06","OBJECT":"M15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"90.000","FILTER":"V","L1PUBDAT":"2017-10-04T21:13:29.776000Z","OBSTYPE":"EXPOSE","BLKUID":186437290,"REQNUM":1292679},{"id":7150460,"basename":"cpt1m012-fl06-20171004-0141-e91","area":{"type":"Polygon","coordinates":[[[-37.733513090872236,12.388160445789469],[-37.73313602433535,11.945496602467829],[-37.28067388544821,11.945496514123539],[-37.28029663471261,12.388160354068988],[-37.733513090872236,12.388160445789469]]]},"related_frames":[5467169,7150373,7149195,7150372,7150376],"version_set":[{"id":7462811,"created":"2017-10-05T07:59:38.372728Z","key":"BJcLlecG.VQrGk46A4VASAHqw5_mZnCr","md5":"237f3b2f9346f8b1a98cf26c6e75c411","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/86d2/cpt1m012-fl06-20171004-0141-e91?versionId=BJcLlecG.VQrGk46A4VASAHqw5_mZnCr&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UWQO4MILwQFQ9YQd1%2FaF0QALA98%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20171004-0141-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/86d2/cpt1m012-fl06-20171004-0141-e91?versionId=BJcLlecG.VQrGk46A4VASAHqw5_mZnCr&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UWQO4MILwQFQ9YQd1%2FaF0QALA98%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-10-04T21:11:02.734000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fl06","OBJECT":"M15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"90.000","FILTER":"B","L1PUBDAT":"2017-10-04T21:11:02.734000Z","OBSTYPE":"EXPOSE","BLKUID":186437290,"REQNUM":1292679},{"id":7107381,"basename":"coj2m002-fs01-20170926-0046-e91","area":{"type":"Polygon","coordinates":[[[-37.435778179267004,12.106174435798561],[-37.43646799347465,12.274686117088358],[-37.611664374005045,12.273945649152486],[-37.61086328606558,12.105434438169816],[-37.435778179267004,12.106174435798561]]]},"related_frames":[7107374,7107365,7107362,7104302,3536541],"version_set":[{"id":7419732,"created":"2017-09-26T23:53:28.817838Z","key":"3S408B7Ylh4LDNq0hQVJx47l8zk1BUUT","md5":"f311068270041b3a0f9287bfda566a20","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/289b/coj2m002-fs01-20170926-0046-e91?versionId=3S408B7Ylh4LDNq0hQVJx47l8zk1BUUT&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=rACGMv1dQpUSEmTTjwiYmnibFFs%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0046-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/289b/coj2m002-fs01-20170926-0046-e91?versionId=3S408B7Ylh4LDNq0hQVJx47l8zk1BUUT&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=rACGMv1dQpUSEmTTjwiYmnibFFs%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-26T09:55:11.399000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"2.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:55:11.399000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7104302,"basename":"coj2m002-fs01-20170926-0046-e00","area":{"type":"Polygon","coordinates":[[[-37.429465381640284,12.106345404411186],[-37.429407814651995,12.279111868083916],[-37.60898319570475,12.279110953900084],[-37.608923800309185,12.106344503483674],[-37.429465381640284,12.106345404411186]]]},"related_frames":[7107381],"version_set":[{"id":7416653,"created":"2017-09-26T09:55:35.953634Z","key":"ZFeoCuHWFk1QYFfx8HHial06ahhb.mKV","md5":"94ee6c7b59f8a99bae265ce9a318d2b6","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9803/coj2m002-fs01-20170926-0046-e00?versionId=ZFeoCuHWFk1QYFfx8HHial06ahhb.mKV&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=u58ldJNhTTkV0y63u99d28CRUmI%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0046-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9803/coj2m002-fs01-20170926-0046-e00?versionId=ZFeoCuHWFk1QYFfx8HHial06ahhb.mKV&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=u58ldJNhTTkV0y63u99d28CRUmI%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-26T09:55:11.399000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"2.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:55:11.399000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7107379,"basename":"coj2m002-fs01-20170926-0045-e91","area":{"type":"Polygon","coordinates":[[[-37.435817105008766,12.106155017466502],[-37.43637528672576,12.274444831376934],[-37.611340925245486,12.27383526150317],[-37.610671762533684,12.105545834248527],[-37.435817105008766,12.106155017466502]]]},"related_frames":[7107374,7107365,7107362,7104300,3536541],"version_set":[{"id":7419730,"created":"2017-09-26T23:53:20.928689Z","key":"luc1ttHdeZnhqx.pFTqm_p367uZeH9j5","md5":"3ba7c8a965205147bd04555bb3abf299","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f7ef/coj2m002-fs01-20170926-0045-e91?versionId=luc1ttHdeZnhqx.pFTqm_p367uZeH9j5&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=DKvpAY7nIstlZJwroIYKlyWFdHI%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0045-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f7ef/coj2m002-fs01-20170926-0045-e91?versionId=luc1ttHdeZnhqx.pFTqm_p367uZeH9j5&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=DKvpAY7nIstlZJwroIYKlyWFdHI%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-26T09:54:52.945000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"2.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:54:52.945000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7104300,"basename":"coj2m002-fs01-20170926-0045-e00","area":{"type":"Polygon","coordinates":[[[-37.429465381640284,12.106345404411186],[-37.429407814651995,12.279111868083916],[-37.60898319570475,12.279110953900084],[-37.608923800309185,12.106344503483674],[-37.429465381640284,12.106345404411186]]]},"related_frames":[7107379],"version_set":[{"id":7416651,"created":"2017-09-26T09:55:22.146911Z","key":"O13VE.NfBeofWeKlvbZ1Tlg2spijWd88","md5":"416f224ed41177fa9ae968bdccc18919","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/940b/coj2m002-fs01-20170926-0045-e00?versionId=O13VE.NfBeofWeKlvbZ1Tlg2spijWd88&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=hXrm%2BvX2kqRYVeX1ua2htzmAUSA%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0045-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/940b/coj2m002-fs01-20170926-0045-e00?versionId=O13VE.NfBeofWeKlvbZ1Tlg2spijWd88&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=hXrm%2BvX2kqRYVeX1ua2htzmAUSA%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-26T09:54:52.945000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"2.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:54:52.945000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7104292,"basename":"coj2m002-fs01-20170926-0044-e00","area":{"type":"Polygon","coordinates":[[[-37.420928814386116,12.269959925211747],[-37.59690132053106,12.287365032457243],[-37.61492306129935,12.112723635526095],[-37.43906522434577,12.09532998706973],[-37.420928814386116,12.269959925211747]]]},"related_frames":[7107378],"version_set":[{"id":7416643,"created":"2017-09-26T09:54:04.604302Z","key":"s8DVUc9lk8KxLeQwoMTjMABol8i8tQPU","md5":"42320c681696ead1b060b930b7ee098b","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2d91/coj2m002-fs01-20170926-0044-e00?versionId=s8DVUc9lk8KxLeQwoMTjMABol8i8tQPU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2FgLjMOhgtqTDI2kSmNieznu1ehE%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0044-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2d91/coj2m002-fs01-20170926-0044-e00?versionId=s8DVUc9lk8KxLeQwoMTjMABol8i8tQPU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2FgLjMOhgtqTDI2kSmNieznu1ehE%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-26T09:53:34.893000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"5.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:53:34.893000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7107378,"basename":"coj2m002-fs01-20170926-0044-e91","area":{"type":"Polygon","coordinates":[[[-37.42901081386799,12.26465456480928],[-37.60055254357195,12.281044938654633],[-37.617527545682094,12.110751832800267],[-37.4460948453264,12.094371976890901],[-37.42901081386799,12.26465456480928]]]},"related_frames":[7107374,7107365,7107362,7104292,3536541],"version_set":[{"id":7419729,"created":"2017-09-26T23:53:13.257861Z","key":"QA9Rt3HU.aMfAyCq5llD4qC7p77U6Kfv","md5":"5d73d97b0540caf6253d4ccb1a0caefa","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6b6a/coj2m002-fs01-20170926-0044-e91?versionId=QA9Rt3HU.aMfAyCq5llD4qC7p77U6Kfv&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=mSFgCvrBEj6b4W%2BaoH%2Bf%2FPddJkg%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0044-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6b6a/coj2m002-fs01-20170926-0044-e91?versionId=QA9Rt3HU.aMfAyCq5llD4qC7p77U6Kfv&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=mSFgCvrBEj6b4W%2BaoH%2Bf%2FPddJkg%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-26T09:53:34.893000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"5.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:53:34.893000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7107377,"basename":"coj2m002-fs01-20170926-0043-e91","area":{"type":"Polygon","coordinates":[[[-37.428756016846364,12.264618014546093],[-37.60040457486059,12.281149725770549],[-37.61752636176732,12.11075053715523],[-37.445986951833675,12.094229441151635],[-37.428756016846364,12.264618014546093]]]},"related_frames":[7107374,7107365,7107362,7104291,3536541],"version_set":[{"id":7419728,"created":"2017-09-26T23:53:04.723546Z","key":"GBx_CDcNAT_rxa2hkyOKzSpxU0uQToy0","md5":"04f3352487fbe158edeb708e2bc98fcf","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6c5b/coj2m002-fs01-20170926-0043-e91?versionId=GBx_CDcNAT_rxa2hkyOKzSpxU0uQToy0&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=JJyuLyoyF9czriqp2Ua2u%2BYGnIE%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0043-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6c5b/coj2m002-fs01-20170926-0043-e91?versionId=GBx_CDcNAT_rxa2hkyOKzSpxU0uQToy0&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=JJyuLyoyF9czriqp2Ua2u%2BYGnIE%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-26T09:53:13.717000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"5.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:53:13.717000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7104291,"basename":"coj2m002-fs01-20170926-0043-e00","area":{"type":"Polygon","coordinates":[[[-37.420928814386116,12.269959925211747],[-37.59690132053106,12.287365032457243],[-37.61492306129935,12.112723635526095],[-37.43906522434577,12.09532998706973],[-37.420928814386116,12.269959925211747]]]},"related_frames":[7107377],"version_set":[{"id":7416642,"created":"2017-09-26T09:53:45.871684Z","key":"HjTnSFVcJsyVdGeuF549akMuIBCivTkv","md5":"61d4fb9a58401c3d8763cc13eb737e3d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/56b9/coj2m002-fs01-20170926-0043-e00?versionId=HjTnSFVcJsyVdGeuF549akMuIBCivTkv&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=zBWrUpYYFSepwgnfwtssYGdZNi0%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170926-0043-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/56b9/coj2m002-fs01-20170926-0043-e00?versionId=HjTnSFVcJsyVdGeuF549akMuIBCivTkv&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=zBWrUpYYFSepwgnfwtssYGdZNi0%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-26T09:53:13.717000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"MAA 1","SITEID":"coj","TELID":"2m0a","EXPTIME":"5.000","FILTER":"V","L1PUBDAT":"2017-09-26T09:53:13.717000Z","OBSTYPE":"EXPOSE","BLKUID":184297282,"REQNUM":1284924},{"id":7042159,"basename":"ogg2m001-fs02-20170917-0088-e91","area":{"type":"Polygon","coordinates":[[[-37.422488984805625,12.264527903736132],[-37.59304216295732,12.284288271502932],[-37.61319923817416,12.11762689736715],[-37.4427516981209,12.097878943227022],[-37.422488984805625,12.264527903736132]]]},"related_frames":[7039796,7042134,7042130,7025322,3519536],"version_set":[{"id":7354491,"created":"2017-09-18T18:54:24.693563Z","key":"GF7b.QArOW69IUmKBYyDYr2oPXHUeFFp","md5":"bb2eb9a5d96d508aab17909b3189e6e3","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9d2e/ogg2m001-fs02-20170917-0088-e91?versionId=GF7b.QArOW69IUmKBYyDYr2oPXHUeFFp&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=o8qfGsIJiRnIOszbmmyhQQruxR8%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0088-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9d2e/ogg2m001-fs02-20170917-0088-e91?versionId=GF7b.QArOW69IUmKBYyDYr2oPXHUeFFp&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=o8qfGsIJiRnIOszbmmyhQQruxR8%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-18T10:54:41.042000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:54:41.042000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7039796,"basename":"ogg2m001-fs02-20170917-0088-e00","area":{"type":"Polygon","coordinates":[[[-37.42051034874834,12.26750468570263],[-37.59438706038287,12.287776441250974],[-37.61538812014709,12.115213165219094],[-37.441622912832884,12.094954596954063],[-37.42051034874834,12.26750468570263]]]},"related_frames":[7042159],"version_set":[{"id":7352128,"created":"2017-09-18T10:55:14.181635Z","key":"RMY5_EPN97IiCBOmI1mzBh7Vtbzp3jzG","md5":"f0599b3a83ab5259124a43713ef20503","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/da04/ogg2m001-fs02-20170917-0088-e00?versionId=RMY5_EPN97IiCBOmI1mzBh7Vtbzp3jzG&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2B%2F9XMkHYR%2FFjlUjuagrQfNrK9ns%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0088-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/da04/ogg2m001-fs02-20170917-0088-e00?versionId=RMY5_EPN97IiCBOmI1mzBh7Vtbzp3jzG&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2B%2F9XMkHYR%2FFjlUjuagrQfNrK9ns%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-18T10:54:41.042000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:54:41.042000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7042158,"basename":"ogg2m001-fs02-20170917-0087-e91","area":{"type":"Polygon","coordinates":[[[-37.42231718810217,12.266116420813681],[-37.592880151863994,12.286001862221637],[-37.613165267506645,12.1193319210071],[-37.442707948851194,12.099458974332885],[-37.42231718810217,12.266116420813681]]]},"related_frames":[7039795,7042134,7042130,7025322,3519536],"version_set":[{"id":7354490,"created":"2017-09-18T18:54:19.254550Z","key":"CCrJ83CXLnE8R8SuZTL85tLFL68ehget","md5":"6409f970505033439c9a7233d8323933","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/08ff/ogg2m001-fs02-20170917-0087-e91?versionId=CCrJ83CXLnE8R8SuZTL85tLFL68ehget&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=CtfCVT2y%2FCBF%2FoWziIykr0aGThs%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0087-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/08ff/ogg2m001-fs02-20170917-0087-e91?versionId=CCrJ83CXLnE8R8SuZTL85tLFL68ehget&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=CtfCVT2y%2FCBF%2FoWziIykr0aGThs%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-18T10:54:15.474000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:54:15.474000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7039795,"basename":"ogg2m001-fs02-20170917-0087-e00","area":{"type":"Polygon","coordinates":[[[-37.42051034874834,12.26750468570263],[-37.59438706038287,12.287776441250974],[-37.61538812014709,12.115213165219094],[-37.441622912832884,12.094954596954063],[-37.42051034874834,12.26750468570263]]]},"related_frames":[7042158],"version_set":[{"id":7352127,"created":"2017-09-18T10:54:48.063799Z","key":"fbU6Ehp8tYX0u7mCRkqvpecGCj3iJ2ee","md5":"1101367ae3eee3553a04f0ad6508fe30","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/694e/ogg2m001-fs02-20170917-0087-e00?versionId=fbU6Ehp8tYX0u7mCRkqvpecGCj3iJ2ee&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2F%2BuUEssPuMRETTN53uKGF60nqc4%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0087-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/694e/ogg2m001-fs02-20170917-0087-e00?versionId=fbU6Ehp8tYX0u7mCRkqvpecGCj3iJ2ee&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2F%2BuUEssPuMRETTN53uKGF60nqc4%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-18T10:54:15.474000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:54:15.474000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7039794,"basename":"ogg2m001-fs02-20170917-0086-e00","area":{"type":"Polygon","coordinates":[[[-37.42051034874834,12.26750468570263],[-37.59438706038287,12.287776441250974],[-37.61538812014709,12.115213165219094],[-37.441622912832884,12.094954596954063],[-37.42051034874834,12.26750468570263]]]},"related_frames":[7042156],"version_set":[{"id":7352126,"created":"2017-09-18T10:54:21.183885Z","key":"UPexkCTEnMpv49yR6pTfrBljD9QhOHYA","md5":"18e2999f983d7f4aa941f18ef007583c","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/42d4/ogg2m001-fs02-20170917-0086-e00?versionId=UPexkCTEnMpv49yR6pTfrBljD9QhOHYA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HN1%2BACkJxUhoYiSWX6mDKZGTJ5c%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0086-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/42d4/ogg2m001-fs02-20170917-0086-e00?versionId=UPexkCTEnMpv49yR6pTfrBljD9QhOHYA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HN1%2BACkJxUhoYiSWX6mDKZGTJ5c%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-18T10:53:49.910000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:53:49.910000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7042156,"basename":"ogg2m001-fs02-20170917-0086-e91","area":{"type":"Polygon","coordinates":[[[-37.42231718810217,12.266116420813681],[-37.592880151863994,12.286001862221637],[-37.613165267506645,12.1193319210071],[-37.442707948851194,12.099458974332885],[-37.42231718810217,12.266116420813681]]]},"related_frames":[7039794,7042134,7042130,7025322,3519536],"version_set":[{"id":7354488,"created":"2017-09-18T18:54:06.070612Z","key":"kPTqQiWzN1rGVBqETQaSuL2yqzVd1hc0","md5":"987e8811a4669360b70389d56db17133","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a232/ogg2m001-fs02-20170917-0086-e91?versionId=kPTqQiWzN1rGVBqETQaSuL2yqzVd1hc0&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=eIt3Ofew1z6xKljgBIgA8%2BFvdog%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0086-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a232/ogg2m001-fs02-20170917-0086-e91?versionId=kPTqQiWzN1rGVBqETQaSuL2yqzVd1hc0&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=eIt3Ofew1z6xKljgBIgA8%2BFvdog%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-18T10:53:49.910000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:53:49.910000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7042154,"basename":"ogg2m001-fs02-20170917-0085-e91","area":{"type":"Polygon","coordinates":[[[-37.422523890561024,12.264726558631988],[-37.593132568097815,12.284694312731652],[-37.613501746257896,12.11797881638325],[-37.4429987471417,12.098023610551465],[-37.422523890561024,12.264726558631988]]]},"related_frames":[7039793,7042134,7042130,7025322,3519536],"version_set":[{"id":7354486,"created":"2017-09-18T18:53:38.619156Z","key":"cvr3WI.Nj8bobQcuyZ1mmLPDabXVkSJl","md5":"f76fc94ae7f4139d5ecebf56d6101c24","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/938d/ogg2m001-fs02-20170917-0085-e91?versionId=cvr3WI.Nj8bobQcuyZ1mmLPDabXVkSJl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=3yulbpCQgW17YVD8J651N3pr53o%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0085-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/938d/ogg2m001-fs02-20170917-0085-e91?versionId=cvr3WI.Nj8bobQcuyZ1mmLPDabXVkSJl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=3yulbpCQgW17YVD8J651N3pr53o%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-18T10:53:24.322000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:53:24.322000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7039793,"basename":"ogg2m001-fs02-20170917-0085-e00","area":{"type":"Polygon","coordinates":[[[-37.42051034874834,12.26750468570263],[-37.59438706038287,12.287776441250974],[-37.61538812014709,12.115213165219094],[-37.441622912832884,12.094954596954063],[-37.42051034874834,12.26750468570263]]]},"related_frames":[7042154],"version_set":[{"id":7352125,"created":"2017-09-18T10:53:54.603459Z","key":"rYg7vGdt6yrhQTjH_QG8DnNDxjtZnBqS","md5":"a41c7878d951c105d92002063f877e28","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/cdeb/ogg2m001-fs02-20170917-0085-e00?versionId=rYg7vGdt6yrhQTjH_QG8DnNDxjtZnBqS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=phSfJaOhOXiojyoO9xzLesnEzPM%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0085-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/cdeb/ogg2m001-fs02-20170917-0085-e00?versionId=rYg7vGdt6yrhQTjH_QG8DnNDxjtZnBqS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=phSfJaOhOXiojyoO9xzLesnEzPM%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-18T10:53:24.322000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:53:24.322000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7039792,"basename":"ogg2m001-fs02-20170917-0084-e00","area":{"type":"Polygon","coordinates":[[[-37.42051034874834,12.26750468570263],[-37.59438706038287,12.287776441250974],[-37.61538812014709,12.115213165219094],[-37.441622912832884,12.094954596954063],[-37.42051034874834,12.26750468570263]]]},"related_frames":[7042153],"version_set":[{"id":7352124,"created":"2017-09-18T10:53:29.411781Z","key":"2H6fWy7C07Cfkk_X3U7TpaPFxkxpqWYL","md5":"99fd137e2d5fe16d8684549130298162","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/959e/ogg2m001-fs02-20170917-0084-e00?versionId=2H6fWy7C07Cfkk_X3U7TpaPFxkxpqWYL&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=m0hnlLvhQ4lzwAwhN34jmmLZFzE%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0084-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/959e/ogg2m001-fs02-20170917-0084-e00?versionId=2H6fWy7C07Cfkk_X3U7TpaPFxkxpqWYL&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=m0hnlLvhQ4lzwAwhN34jmmLZFzE%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-09-18T10:52:58.671000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:52:58.671000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":7042153,"basename":"ogg2m001-fs02-20170917-0084-e91","area":{"type":"Polygon","coordinates":[[[-37.422552953174375,12.264643664608462],[-37.59287497166025,12.284423049944984],[-37.61305166931527,12.117987631322377],[-37.44283499790771,12.098220654967932],[-37.422552953174375,12.264643664608462]]]},"related_frames":[7039792,7042134,7042130,7025322,3519536],"version_set":[{"id":7354485,"created":"2017-09-18T18:53:29.099759Z","key":"YAMqXIOKf7JDLOq9E5pROmHiUxh_Z4PR","md5":"50a35e6a90d623d30f3d85af1fc662d2","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b1e4/ogg2m001-fs02-20170917-0084-e91?versionId=YAMqXIOKf7JDLOq9E5pROmHiUxh_Z4PR&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=h6UoPGsN35iSlmbLrHSFnBrpBV8%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170917-0084-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b1e4/ogg2m001-fs02-20170917-0084-e91?versionId=YAMqXIOKf7JDLOq9E5pROmHiUxh_Z4PR&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=h6UoPGsN35iSlmbLrHSFnBrpBV8%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-09-18T10:52:58.671000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"MAA 1","SITEID":"ogg","TELID":"2m0a","EXPTIME":"10.000","FILTER":"V","L1PUBDAT":"2017-09-18T10:52:58.671000Z","OBSTYPE":"EXPOSE","BLKUID":181648984,"REQNUM":1281128},{"id":6854262,"basename":"ogg2m001-fs02-20170819-0108-e91","area":{"type":"Polygon","coordinates":[[[-37.41149590524799,12.240369856555295],[-37.58204221183212,12.26025528432975],[-37.60232547505251,12.09358535667367],[-37.431884573409036,12.07371239643791],[-37.41149590524799,12.240369856555295]]]},"related_frames":[6854208,6854204,6850661,6846642,3519536],"version_set":[{"id":7167434,"created":"2017-08-20T18:57:00.238736Z","key":"MWTyqc63zgSeLPZJHLHtJtQZrBxJc4dI","md5":"f1c8a7f7f4d47802c5dd4d444c7d29e9","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9aa2/ogg2m001-fs02-20170819-0108-e91?versionId=MWTyqc63zgSeLPZJHLHtJtQZrBxJc4dI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=dmsrHKrSlum%2FYd%2FBroHOkfOsoXs%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170819-0108-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9aa2/ogg2m001-fs02-20170819-0108-e91?versionId=MWTyqc63zgSeLPZJHLHtJtQZrBxJc4dI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=dmsrHKrSlum%2FYd%2FBroHOkfOsoXs%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-20T07:57:33.654000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"B","L1PUBDAT":"2017-08-20T07:57:33.654000Z","OBSTYPE":"EXPOSE","BLKUID":171502798,"REQNUM":1259098},{"id":6850661,"basename":"ogg2m001-fs02-20170819-0108-e00","area":{"type":"Polygon","coordinates":[[[-37.40968924332901,12.241758122809857],[-37.58354897193226,12.262029864255341],[-37.60454811674447,12.089466602567578],[-37.43079963897935,12.069208019702588],[-37.40968924332901,12.241758122809857]]]},"related_frames":[6854262],"version_set":[{"id":7163830,"created":"2017-08-20T08:00:32.038608Z","key":"X5WnCWPMU_REznZPkD_P8XLzK3_rcVJm","md5":"3062e40f312722b8a8daf98c51d4387d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e902/ogg2m001-fs02-20170819-0108-e00?versionId=X5WnCWPMU_REznZPkD_P8XLzK3_rcVJm&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=BalI5rOm5HurxqD2EI%2F5XeCZ7eI%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170819-0108-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e902/ogg2m001-fs02-20170819-0108-e00?versionId=X5WnCWPMU_REznZPkD_P8XLzK3_rcVJm&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=BalI5rOm5HurxqD2EI%2F5XeCZ7eI%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-20T07:57:33.654000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"B","L1PUBDAT":"2017-08-20T07:57:33.654000Z","OBSTYPE":"EXPOSE","BLKUID":171502798,"REQNUM":1259098},{"id":6848131,"basename":"coj2m002-fs01-20170819-0086-e91","area":{"type":"Polygon","coordinates":[[[-37.41174158365658,12.243527031882033],[-37.58468785132618,12.260634450910292],[-37.602405620145134,12.08893324334531],[-37.42956991216789,12.0718368731291],[-37.41174158365658,12.243527031882033]]]},"related_frames":[6845391,6848103,6848080,6848073,3536541],"version_set":[{"id":7161299,"created":"2017-08-19T23:53:31.953442Z","key":"rxP49InfhxYB2zhTyhkSSVivZi7A22lo","md5":"c7c7e8767172e6cdd902acf97a3db6e7","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/980c/coj2m002-fs01-20170819-0086-e91?versionId=rxP49InfhxYB2zhTyhkSSVivZi7A22lo&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=VoEgxpOUvCzOEdVYQ3pEZHCd99s%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170819-0086-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/980c/coj2m002-fs01-20170819-0086-e91?versionId=rxP49InfhxYB2zhTyhkSSVivZi7A22lo&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=VoEgxpOUvCzOEdVYQ3pEZHCd99s%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-19T12:47:05.080000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"Messier 15","SITEID":"coj","TELID":"2m0a","EXPTIME":"90.000","FILTER":"B","L1PUBDAT":"2017-08-19T12:47:05.080000Z","OBSTYPE":"EXPOSE","BLKUID":171208387,"REQNUM":1259098},{"id":6845391,"basename":"coj2m002-fs01-20170819-0086-e00","area":{"type":"Polygon","coordinates":[[[-37.41010717008993,12.244213462000667],[-37.586062486617664,12.261618556996241],[-37.604082604772884,12.086977172518973],[-37.428241696760495,12.069583511371896],[-37.41010717008993,12.244213462000667]]]},"related_frames":[6848131],"version_set":[{"id":7158554,"created":"2017-08-19T12:50:31.781482Z","key":".mWIatPSxscPMxKI4ICagOtGpiDYg_jO","md5":"77d7ede7ad807be61d7f564ad233c8fb","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bce7/coj2m002-fs01-20170819-0086-e00?versionId=.mWIatPSxscPMxKI4ICagOtGpiDYg_jO&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Q%2F%2BSlF3fiCWuCMIuG7BD%2BmeOeSY%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170819-0086-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bce7/coj2m002-fs01-20170819-0086-e00?versionId=.mWIatPSxscPMxKI4ICagOtGpiDYg_jO&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Q%2F%2BSlF3fiCWuCMIuG7BD%2BmeOeSY%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-19T12:47:05.080000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"Messier 15","SITEID":"coj","TELID":"2m0a","EXPTIME":"90.000","FILTER":"B","L1PUBDAT":"2017-08-19T12:47:05.080000Z","OBSTYPE":"EXPOSE","BLKUID":171208387,"REQNUM":1259098},{"id":6844486,"basename":"ogg2m001-fs02-20170818-0132-e00","area":{"type":"Polygon","coordinates":[[[-37.409689043329024,12.241758122809857],[-37.58354877193227,12.262029864255341],[-37.60454791674448,12.089466602567578],[-37.43079943897936,12.069208019702588],[-37.409689043329024,12.241758122809857]]]},"related_frames":[6846713],"version_set":[{"id":7157649,"created":"2017-08-19T10:10:28.623029Z","key":"jhjbEE6qX6TD78piCVn3kOqlCCW1.Dvu","md5":"528f6d8df6a3b7d242a3916f7a7aaca1","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/100d/ogg2m001-fs02-20170818-0132-e00?versionId=jhjbEE6qX6TD78piCVn3kOqlCCW1.Dvu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=KA0RJaONt9FH%2FJswWyNbbOlDomU%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170818-0132-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/100d/ogg2m001-fs02-20170818-0132-e00?versionId=jhjbEE6qX6TD78piCVn3kOqlCCW1.Dvu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=KA0RJaONt9FH%2FJswWyNbbOlDomU%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-19T10:08:24.758000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"rp","L1PUBDAT":"2017-08-19T10:08:24.758000Z","OBSTYPE":"EXPOSE","BLKUID":171168691,"REQNUM":1259104},{"id":6846713,"basename":"ogg2m001-fs02-20170818-0132-e91","area":{"type":"Polygon","coordinates":[[[-37.411495705248,12.240369856555295],[-37.58204201183213,12.26025528432975],[-37.60232527505252,12.09358535667367],[-37.43188437340905,12.07371239643791],[-37.411495705248,12.240369856555295]]]},"related_frames":[6844486,6846640,6846638,6832163,3519536],"version_set":[{"id":7159876,"created":"2017-08-19T18:57:22.551769Z","key":"U11hIAQAWx1mg1SwH0xYhVPTrdNCN36I","md5":"c3b6bb0471894976325c3cd2665a0e03","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/dda2/ogg2m001-fs02-20170818-0132-e91?versionId=U11hIAQAWx1mg1SwH0xYhVPTrdNCN36I&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qRO33R9KRhItOH2JBQPjL8AR2k0%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170818-0132-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/dda2/ogg2m001-fs02-20170818-0132-e91?versionId=U11hIAQAWx1mg1SwH0xYhVPTrdNCN36I&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qRO33R9KRhItOH2JBQPjL8AR2k0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-19T10:08:24.758000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"rp","L1PUBDAT":"2017-08-19T10:08:24.758000Z","OBSTYPE":"EXPOSE","BLKUID":171168691,"REQNUM":1259104},{"id":6839172,"basename":"ogg2m001-fs02-20170817-0187-e00","area":{"type":"Polygon","coordinates":[[[-37.40968854329219,12.241758222809725],[-37.58354827196132,12.262029964255259],[-37.604547416780974,12.089466702567444],[-37.43079893895094,12.06920811970251],[-37.40968854329219,12.241758222809725]]]},"related_frames":[6840095],"version_set":[{"id":7152332,"created":"2017-08-18T13:30:32.911182Z","key":"8dlpllKCgAXuo7.NUnQ1xWpln8i7f5aX","md5":"ef13e73d8d04ab38703914f61026fff0","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c77f/ogg2m001-fs02-20170817-0187-e00?versionId=8dlpllKCgAXuo7.NUnQ1xWpln8i7f5aX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XXme3VtT1W3fwddC6xx9zA5XodQ%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0187-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/c77f/ogg2m001-fs02-20170817-0187-e00?versionId=8dlpllKCgAXuo7.NUnQ1xWpln8i7f5aX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XXme3VtT1W3fwddC6xx9zA5XodQ%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T13:26:18.063000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"V","L1PUBDAT":"2017-08-18T13:26:18.063000Z","OBSTYPE":"EXPOSE","BLKUID":170835214,"REQNUM":1259101},{"id":6840095,"basename":"ogg2m001-fs02-20170817-0187-e91","area":{"type":"Polygon","coordinates":[[[-37.41149520521185,12.240369956555167],[-37.58204151186061,12.260255384329673],[-37.60232477508822,12.09358545667354],[-37.431883873381025,12.073712496437834],[-37.41149520521185,12.240369956555167]]]},"related_frames":[6839172,6840028,6840024,6840022,3519536],"version_set":[{"id":7153255,"created":"2017-08-18T19:01:11.678483Z","key":"g_h03q.VGjGGEIy8o0Ov3Im5kbr4NmX7","md5":"3ad913b246489c2a8a71e71bd3f5ed5e","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/cbbb/ogg2m001-fs02-20170817-0187-e91?versionId=g_h03q.VGjGGEIy8o0Ov3Im5kbr4NmX7&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=CwiPVDSRyCmEKtW%2BkE176D%2FO7mw%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0187-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/cbbb/ogg2m001-fs02-20170817-0187-e91?versionId=g_h03q.VGjGGEIy8o0Ov3Im5kbr4NmX7&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=CwiPVDSRyCmEKtW%2BkE176D%2FO7mw%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T13:26:18.063000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"90.000","FILTER":"V","L1PUBDAT":"2017-08-18T13:26:18.063000Z","OBSTYPE":"EXPOSE","BLKUID":170835214,"REQNUM":1259101},{"id":6838748,"basename":"ogg2m001-fs02-20170817-0155-e00","area":{"type":"Polygon","coordinates":[[[-37.409688943329,12.241758122809857],[-37.58354867193225,12.262029864255341],[-37.60454781674446,12.089466602567578],[-37.43079933897934,12.069208019702588],[-37.409688943329,12.241758122809857]]]},"related_frames":[6840083],"version_set":[{"id":7151908,"created":"2017-08-18T11:30:29.840035Z","key":"GmHQb0kRbCDp.DqLs8M7hY3k7IybzM9y","md5":"efd35b4cc70db562a834850d7bf91d9c","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/d826/ogg2m001-fs02-20170817-0155-e00?versionId=GmHQb0kRbCDp.DqLs8M7hY3k7IybzM9y&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=TPro5ktaQgdG5QyxYOZq%2B1Wifgw%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0155-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/d826/ogg2m001-fs02-20170817-0155-e00?versionId=GmHQb0kRbCDp.DqLs8M7hY3k7IybzM9y&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=TPro5ktaQgdG5QyxYOZq%2B1Wifgw%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T11:24:16.595000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"B","L1PUBDAT":"2017-08-18T11:24:16.595000Z","OBSTYPE":"EXPOSE","BLKUID":170796463,"REQNUM":1259097},{"id":6840083,"basename":"ogg2m001-fs02-20170817-0155-e91","area":{"type":"Polygon","coordinates":[[[-37.41149560524798,12.240369856555295],[-37.58204191183211,12.26025528432975],[-37.6023251750525,12.09358535667367],[-37.431884273409025,12.07371239643791],[-37.41149560524798,12.240369856555295]]]},"related_frames":[6838748,6840024,6840022,6822090,3519536],"version_set":[{"id":7153243,"created":"2017-08-18T18:59:47.715019Z","key":"jWrDjhl2Nq31AJNHsbKCyO8HNwS9I3Dl","md5":"d6a34a35b7393bb04ef4db980e8129ef","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8908/ogg2m001-fs02-20170817-0155-e91?versionId=jWrDjhl2Nq31AJNHsbKCyO8HNwS9I3Dl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=45V%2FPa2ylXonfOgPcCNSYtCjngA%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0155-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8908/ogg2m001-fs02-20170817-0155-e91?versionId=jWrDjhl2Nq31AJNHsbKCyO8HNwS9I3Dl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=45V%2FPa2ylXonfOgPcCNSYtCjngA%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T11:24:16.595000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"B","L1PUBDAT":"2017-08-18T11:24:16.595000Z","OBSTYPE":"EXPOSE","BLKUID":170796463,"REQNUM":1259097},{"id":6840081,"basename":"ogg2m001-fs02-20170817-0154-e91","area":{"type":"Polygon","coordinates":[[[-37.421103311710965,12.083007292664167],[-37.421049059348945,12.250875783989125],[-37.59282936673429,12.250875797285289],[-37.59277514138347,12.083007305772588],[-37.421103311710965,12.083007292664167]]]},"related_frames":[6840028,6837886,6840024,6840022,3519536],"version_set":[{"id":7153241,"created":"2017-08-18T18:59:37.520056Z","key":"zJwJE00bmtRePEVG4gk6iwm1iI0CanNN","md5":"b3ba704def2500c504c579beb64aa41c","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1783/ogg2m001-fs02-20170817-0154-e91?versionId=zJwJE00bmtRePEVG4gk6iwm1iI0CanNN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HJ1%2F%2BKtmqt5o2PCafRzr27IZhYY%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0154-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1783/ogg2m001-fs02-20170817-0154-e91?versionId=zJwJE00bmtRePEVG4gk6iwm1iI0CanNN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HJ1%2F%2BKtmqt5o2PCafRzr27IZhYY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T10:19:55.873000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"V","L1PUBDAT":"2017-08-18T10:19:55.873000Z","OBSTYPE":"EXPOSE","BLKUID":170784547,"REQNUM":1259099},{"id":6837886,"basename":"ogg2m001-fs02-20170817-0154-e00","area":{"type":"Polygon","coordinates":[[[-37.419479452093015,12.081418395035179],[-37.41942309964338,12.25254726822004],[-37.59727842199965,12.25254637328544],[-37.59722027971799,12.081417512980996],[-37.419479452093015,12.081418395035179]]]},"related_frames":[6840081],"version_set":[{"id":7151046,"created":"2017-08-18T10:30:31.572758Z","key":"86HsdswB89MOrZhNDoHbDc2sZgna.CAS","md5":"4a14b09741315ac5faae4c2fa43f5909","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/5de0/ogg2m001-fs02-20170817-0154-e00?versionId=86HsdswB89MOrZhNDoHbDc2sZgna.CAS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fDU%2BUqz6bCEjwDbOtNZeJ8L04IY%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0154-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/5de0/ogg2m001-fs02-20170817-0154-e00?versionId=86HsdswB89MOrZhNDoHbDc2sZgna.CAS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fDU%2BUqz6bCEjwDbOtNZeJ8L04IY%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T10:19:55.873000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"V","L1PUBDAT":"2017-08-18T10:19:55.873000Z","OBSTYPE":"EXPOSE","BLKUID":170784547,"REQNUM":1259099},{"id":6837594,"basename":"ogg2m001-fs02-20170817-0143-e00","area":{"type":"Polygon","coordinates":[[[-37.419479452093015,12.081418395035179],[-37.41942309964338,12.25254726822004],[-37.59727842199965,12.25254637328544],[-37.59722027971799,12.081417512980996],[-37.419479452093015,12.081418395035179]]]},"related_frames":[6840078],"version_set":[{"id":7150754,"created":"2017-08-18T10:10:35.099235Z","key":"qwLNjVEg.McAM97m88mr3I0R9kIDabo9","md5":"473a4269ab1050a88658b95391f5c0dc","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b3f4/ogg2m001-fs02-20170817-0143-e00?versionId=qwLNjVEg.McAM97m88mr3I0R9kIDabo9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=dHP%2FlxaekCScQSFDKnrnrrJxWp8%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0143-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b3f4/ogg2m001-fs02-20170817-0143-e00?versionId=qwLNjVEg.McAM97m88mr3I0R9kIDabo9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=dHP%2FlxaekCScQSFDKnrnrrJxWp8%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T10:04:09.864000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"60.000","FILTER":"V","L1PUBDAT":"2017-08-18T10:04:09.864000Z","OBSTYPE":"EXPOSE","BLKUID":170778514,"REQNUM":1259100},{"id":6840078,"basename":"ogg2m001-fs02-20170817-0143-e91","area":{"type":"Polygon","coordinates":[[[-37.421103311710965,12.083007292664167],[-37.421049059348945,12.250875783989125],[-37.59282936673429,12.250875797285289],[-37.59277514138347,12.083007305772588],[-37.421103311710965,12.083007292664167]]]},"related_frames":[6840028,6837594,6840024,6840022,3519536],"version_set":[{"id":7153238,"created":"2017-08-18T18:59:13.001572Z","key":"49w556Tl0DVzW8tLJtYREmPA9G13VF5R","md5":"8f265ee9f9c39a79b5745d8adf3bd0f7","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7663/ogg2m001-fs02-20170817-0143-e91?versionId=49w556Tl0DVzW8tLJtYREmPA9G13VF5R&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XTGlkhRcFV4sebChPewQ%2BbJUCII%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0143-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7663/ogg2m001-fs02-20170817-0143-e91?versionId=49w556Tl0DVzW8tLJtYREmPA9G13VF5R&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XTGlkhRcFV4sebChPewQ%2BbJUCII%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T10:04:09.864000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"60.000","FILTER":"V","L1PUBDAT":"2017-08-18T10:04:09.864000Z","OBSTYPE":"EXPOSE","BLKUID":170778514,"REQNUM":1259100},{"id":6837446,"basename":"ogg2m001-fs02-20170817-0138-e00","area":{"type":"Polygon","coordinates":[[[-37.419479452093015,12.081418395035179],[-37.41942309964338,12.25254726822004],[-37.59727842199965,12.25254637328544],[-37.59722027971799,12.081417512980996],[-37.419479452093015,12.081418395035179]]]},"related_frames":[6840071],"version_set":[{"id":7150606,"created":"2017-08-18T09:50:46.298123Z","key":"45XvygQ6aCQUAILt_lmK52xS0EaaZF1I","md5":"3ef2919332519b44ec602dc71a84dea2","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/92f9/ogg2m001-fs02-20170817-0138-e00?versionId=45XvygQ6aCQUAILt_lmK52xS0EaaZF1I&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=5uiuN%2BMphE94wthxstI4JORBop4%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0138-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/92f9/ogg2m001-fs02-20170817-0138-e00?versionId=45XvygQ6aCQUAILt_lmK52xS0EaaZF1I&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=5uiuN%2BMphE94wthxstI4JORBop4%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T09:40:46.837000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"rp","L1PUBDAT":"2017-08-18T09:40:46.837000Z","OBSTYPE":"EXPOSE","BLKUID":170766577,"REQNUM":1259102},{"id":6840071,"basename":"ogg2m001-fs02-20170817-0138-e91","area":{"type":"Polygon","coordinates":[[[-37.421103311710965,12.083007292664167],[-37.421049059348945,12.250875783989125],[-37.59282936673429,12.250875797285289],[-37.59277514138347,12.083007305772588],[-37.421103311710965,12.083007292664167]]]},"related_frames":[6840024,6837446,6840022,6832163,3519536],"version_set":[{"id":7153231,"created":"2017-08-18T18:58:31.956976Z","key":"ituRK.kw48ZuwhNA77hZUlrr8LF0EExr","md5":"e1d6ab1bc247103fd787c0c25e8d838c","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2fc9/ogg2m001-fs02-20170817-0138-e91?versionId=ituRK.kw48ZuwhNA77hZUlrr8LF0EExr&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=G49mO4P16vmYkwAthsCW6yBlj%2B4%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0138-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2fc9/ogg2m001-fs02-20170817-0138-e91?versionId=ituRK.kw48ZuwhNA77hZUlrr8LF0EExr&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=G49mO4P16vmYkwAthsCW6yBlj%2B4%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T09:40:46.837000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"30.000","FILTER":"rp","L1PUBDAT":"2017-08-18T09:40:46.837000Z","OBSTYPE":"EXPOSE","BLKUID":170766577,"REQNUM":1259102},{"id":6837318,"basename":"ogg2m001-fs02-20170817-0128-e00","area":{"type":"Polygon","coordinates":[[[-37.40968914332899,12.241758122809857],[-37.58354887193224,12.262029864255341],[-37.604548016744445,12.089466602567578],[-37.43079953897933,12.069208019702588],[-37.40968914332899,12.241758122809857]]]},"related_frames":[6840070],"version_set":[{"id":7150478,"created":"2017-08-18T09:30:48.237332Z","key":"FbBelTc9ioPAuK.zIhMLD1lVlYStYzVU","md5":"27b682a56527af96f81eaff2d9e4222a","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3c9d/ogg2m001-fs02-20170817-0128-e00?versionId=FbBelTc9ioPAuK.zIhMLD1lVlYStYzVU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XYTOL5EVj1lnbUjwRiJE5Ywj%2BV8%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0128-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3c9d/ogg2m001-fs02-20170817-0128-e00?versionId=FbBelTc9ioPAuK.zIhMLD1lVlYStYzVU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=XYTOL5EVj1lnbUjwRiJE5Ywj%2BV8%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-18T09:22:52.351000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"60.000","FILTER":"rp","L1PUBDAT":"2017-08-18T09:22:52.351000Z","OBSTYPE":"EXPOSE","BLKUID":170760763,"REQNUM":1259103},{"id":6840070,"basename":"ogg2m001-fs02-20170817-0128-e91","area":{"type":"Polygon","coordinates":[[[-37.41149580524797,12.240369856555295],[-37.582042111832095,12.26025528432975],[-37.60232537505249,12.09358535667367],[-37.43188447340901,12.07371239643791],[-37.41149580524797,12.240369856555295]]]},"related_frames":[6840024,6837318,6840022,6832163,3519536],"version_set":[{"id":7153230,"created":"2017-08-18T18:58:13.698798Z","key":"91Z7MavMDSq1ZDsNtdyuklLxIVdtzY8G","md5":"201b2c783181e32e6b98263edf91ea05","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/de49/ogg2m001-fs02-20170817-0128-e91?versionId=91Z7MavMDSq1ZDsNtdyuklLxIVdtzY8G&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=wgoeq87EPyzYNJJMS1%2B6N7WXlWk%3D&Expires=1528984033"}],"filename":"ogg2m001-fs02-20170817-0128-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/de49/ogg2m001-fs02-20170817-0128-e91?versionId=91Z7MavMDSq1ZDsNtdyuklLxIVdtzY8G&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=wgoeq87EPyzYNJJMS1%2B6N7WXlWk%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-18T09:22:52.351000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs02","OBJECT":"Messier 15","SITEID":"ogg","TELID":"2m0a","EXPTIME":"60.000","FILTER":"rp","L1PUBDAT":"2017-08-18T09:22:52.351000Z","OBSTYPE":"EXPOSE","BLKUID":170760763,"REQNUM":1259103},{"id":6830266,"basename":"coj2m002-fs01-20170817-0081-e00","area":{"type":"Polygon","coordinates":[[[-37.41864268540593,12.080598935001456],[-37.41858524928557,12.253365398714026],[-37.59814308682314,12.25336448650681],[-37.59808382645201,12.080598036047986],[-37.41864268540593,12.080598935001456]]]},"related_frames":[6834171],"version_set":[{"id":7143421,"created":"2017-08-17T13:20:44.574828Z","key":"LRGKTWQiKe8BtM9ZDl5ohnV9XSrSIFA9","md5":"d7dd6b9d537e11e54fb5e3fe371da0b7","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/4fd2/coj2m002-fs01-20170817-0081-e00?versionId=LRGKTWQiKe8BtM9ZDl5ohnV9XSrSIFA9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=xCeVa6Op4PKXnIAT4iz2EiLEbtw%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170817-0081-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/4fd2/coj2m002-fs01-20170817-0081-e00?versionId=LRGKTWQiKe8BtM9ZDl5ohnV9XSrSIFA9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=xCeVa6Op4PKXnIAT4iz2EiLEbtw%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-17T13:10:51.075000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"Messier 15","SITEID":"coj","TELID":"2m0a","EXPTIME":"60.000","FILTER":"B","L1PUBDAT":"2017-08-17T13:10:51.075000Z","OBSTYPE":"EXPOSE","BLKUID":170423143,"REQNUM":1258475},{"id":6834171,"basename":"coj2m002-fs01-20170817-0081-e91","area":{"type":"Polygon","coordinates":[[[-37.41950529703439,12.082118400786113],[-37.41944939466106,12.25193087853707],[-37.59598342443553,12.251930395675958],[-37.595926556568145,12.082117924821508],[-37.41950529703439,12.082118400786113]]]},"related_frames":[6834130,6834084,6830266,6823796,3536541],"version_set":[{"id":7147331,"created":"2017-08-17T23:56:50.509787Z","key":"SAeXxgbIzBR7RrywT_bsAwNzh_ZgTQtX","md5":"32c40edaa7d20730ef189051079027ff","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b16a/coj2m002-fs01-20170817-0081-e91?versionId=SAeXxgbIzBR7RrywT_bsAwNzh_ZgTQtX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HouqfX%2FennYKy7n7oQAXXW1fTS0%3D&Expires=1528984033"}],"filename":"coj2m002-fs01-20170817-0081-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b16a/coj2m002-fs01-20170817-0081-e91?versionId=SAeXxgbIzBR7RrywT_bsAwNzh_ZgTQtX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=HouqfX%2FennYKy7n7oQAXXW1fTS0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-08-17T13:10:51.075000Z","PROPID":"FTPEPO2014A-004","INSTRUME":"fs01","OBJECT":"Messier 15","SITEID":"coj","TELID":"2m0a","EXPTIME":"60.000","FILTER":"B","L1PUBDAT":"2017-08-17T13:10:51.075000Z","OBSTYPE":"EXPOSE","BLKUID":170423143,"REQNUM":1258475},{"id":6767935,"basename":"coj0m403-kb98-20170809-0397-e00","area":{"type":"Polygon","coordinates":[[[-37.33852290947516,11.919662403047582],[-37.6860951547161,11.919655843124746],[-37.68643593403641,12.424698595727312],[-37.33820248884973,12.42470544231231],[-37.33852290947516,11.919662403047582]]]},"related_frames":[],"version_set":[{"id":7081089,"created":"2017-08-09T16:02:54.142721Z","key":"6WVdcv9i7RsF2IELJm_ja3.icTh5uZQA","md5":"dc7863082beea8bec0e0ecb8822a04e9","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1403/coj0m403-kb98-20170809-0397-e00?versionId=6WVdcv9i7RsF2IELJm_ja3.icTh5uZQA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=v7ueVFML9q4uJoPRlIWvM9CFsxc%3D&Expires=1528984033"}],"filename":"coj0m403-kb98-20170809-0397-e00.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/1403/coj0m403-kb98-20170809-0397-e00?versionId=6WVdcv9i7RsF2IELJm_ja3.icTh5uZQA&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=v7ueVFML9q4uJoPRlIWvM9CFsxc%3D&Expires=1528984033","RLEVEL":0,"DATE_OBS":"2017-08-09T16:01:33.097000Z","PROPID":"FTPEPO2017AB-002","INSTRUME":"kb98","OBJECT":"M15","SITEID":"coj","TELID":"0m4a","EXPTIME":"40.280","FILTER":"rp","L1PUBDAT":"2017-08-09T16:01:33.097000Z","OBSTYPE":"EXPOSE","BLKUID":null,"REQNUM":null},{"id":6670556,"basename":"cpt1m012-fl06-20170728-0171-e91","area":{"type":"Polygon","coordinates":[[[-37.733513391306474,12.38816094578556],[-37.733136324752934,11.945497102463934],[-37.28067418503048,11.94549701411964],[-37.28029693427817,12.38816085406508],[-37.733513391306474,12.38816094578556]]]},"related_frames":[5467169,6666779,6669374,6669255,6669277],"version_set":[{"id":6983416,"created":"2017-07-29T10:15:43.500691Z","key":"t7ECbFpTH_g9P2uGg5wHIUg3kwBXr_ge","md5":"a491e77f7de6f91d5144878e016aa283","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/d989/cpt1m012-fl06-20170728-0171-e91?versionId=t7ECbFpTH_g9P2uGg5wHIUg3kwBXr_ge&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=V25%2BsXLZmVGLmY13MKTeiWB13fY%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20170728-0171-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/d989/cpt1m012-fl06-20170728-0171-e91?versionId=t7ECbFpTH_g9P2uGg5wHIUg3kwBXr_ge&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=V25%2BsXLZmVGLmY13MKTeiWB13fY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-29T00:00:36.500000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl06","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-29T00:00:36.500000Z","OBSTYPE":"EXPOSE","BLKUID":164146492,"REQNUM":1182744},{"id":6671428,"basename":"cpt1m010-fl16-20170728-0164-e91","area":{"type":"Polygon","coordinates":[[[-37.733513391306474,12.38816094578556],[-37.733136324752934,11.945497102463934],[-37.28067418503048,11.94549701411964],[-37.28029693427817,12.38816085406508],[-37.733513391306474,12.38816094578556]]]},"related_frames":[5467161,6671217,6666601,6671187,6671186],"version_set":[{"id":6984288,"created":"2017-07-29T12:24:30.674416Z","key":"XvmaIqIglIvJwChnnO73OzI3v14zFk3j","md5":"d1994dc6b8d7bee8d6efcc4cf4c8bb16","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3a47/cpt1m010-fl16-20170728-0164-e91?versionId=XvmaIqIglIvJwChnnO73OzI3v14zFk3j&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=id%2FfMm5xGfS9cLcpWqZDUtX1aB0%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170728-0164-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3a47/cpt1m010-fl16-20170728-0164-e91?versionId=XvmaIqIglIvJwChnnO73OzI3v14zFk3j&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=id%2FfMm5xGfS9cLcpWqZDUtX1aB0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T23:59:35.835000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-28T23:59:35.835000Z","OBSTYPE":"EXPOSE","BLKUID":164147392,"REQNUM":1183005},{"id":6671427,"basename":"cpt1m010-fl16-20170728-0163-e91","area":{"type":"Polygon","coordinates":[[[-37.733513491306496,12.38816094578556],[-37.733136424752956,11.945497102463934],[-37.2806742850305,11.94549701411964],[-37.28029703427819,12.38816085406508],[-37.733513491306496,12.38816094578556]]]},"related_frames":[5467161,6666600,6671187,6671186,6662553],"version_set":[{"id":6984287,"created":"2017-07-29T12:23:33.743519Z","key":"SvtJuG8f2M2nFuCNux8uqnVAWJi2lFa1","md5":"944eba68324b549e37ea76e3b7610aa1","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/05f4/cpt1m010-fl16-20170728-0163-e91?versionId=SvtJuG8f2M2nFuCNux8uqnVAWJi2lFa1&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=hRbpG1v8w3Be3hrzaoZCwIgmZ%2Bw%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170728-0163-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/05f4/cpt1m010-fl16-20170728-0163-e91?versionId=SvtJuG8f2M2nFuCNux8uqnVAWJi2lFa1&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=hRbpG1v8w3Be3hrzaoZCwIgmZ%2Bw%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T23:55:36.373000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-28T23:55:36.373000Z","OBSTYPE":"EXPOSE","BLKUID":164147392,"REQNUM":1183005},{"id":6667339,"basename":"coj1m011-fl12-20170728-0204-e91","area":{"type":"Polygon","coordinates":[[[-37.73351359130646,12.38816094578556],[-37.73313652475292,11.945497102463934],[-37.280674385030466,11.94549701411964],[-37.28029713427816,12.38816085406508],[-37.73351359130646,12.38816094578556]]]},"related_frames":[5467260,6664011,6666754,6666777,6666703],"version_set":[{"id":6980199,"created":"2017-07-29T02:04:25.951887Z","key":"FupKShsu_fAGtViVLag4Nd1yAnD.BvxB","md5":"22eb093b66fa712e71a6fbef9fb5d50e","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e6e6/coj1m011-fl12-20170728-0204-e91?versionId=FupKShsu_fAGtViVLag4Nd1yAnD.BvxB&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=9oujJrkC6dbq2VSB3NAJYN7SGfQ%3D&Expires=1528984033"}],"filename":"coj1m011-fl12-20170728-0204-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e6e6/coj1m011-fl12-20170728-0204-e91?versionId=FupKShsu_fAGtViVLag4Nd1yAnD.BvxB&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=9oujJrkC6dbq2VSB3NAJYN7SGfQ%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T14:29:35.510000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl12","OBJECT":"Messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-28T14:29:35.510000Z","OBSTYPE":"EXPOSE","BLKUID":164023921,"REQNUM":1183254},{"id":6667337,"basename":"coj1m011-fl12-20170728-0203-e91","area":{"type":"Polygon","coordinates":[[[-37.73351359130646,12.38816094578556],[-37.73313652475292,11.945497102463934],[-37.280674385030466,11.94549701411964],[-37.28029713427816,12.38816085406508],[-37.73351359130646,12.38816094578556]]]},"related_frames":[5467260,6664010,6666774,6666754,6666703],"version_set":[{"id":6980197,"created":"2017-07-29T02:03:39.114468Z","key":"7NoHNL1HtsG6fzGHisPu1nQdQQcsR8Sl","md5":"764bccfe0b394ad4d00f89e92fa13624","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3976/coj1m011-fl12-20170728-0203-e91?versionId=7NoHNL1HtsG6fzGHisPu1nQdQQcsR8Sl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=riEz0MdO82cLkI8MKVp4pGaKcA0%3D&Expires=1528984033"}],"filename":"coj1m011-fl12-20170728-0203-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3976/coj1m011-fl12-20170728-0203-e91?versionId=7NoHNL1HtsG6fzGHisPu1nQdQQcsR8Sl&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=riEz0MdO82cLkI8MKVp4pGaKcA0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T14:25:38.635000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl12","OBJECT":"Messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-28T14:25:38.635000Z","OBSTYPE":"EXPOSE","BLKUID":164023921,"REQNUM":1183254},{"id":6662218,"basename":"cpt1m012-fl06-20170727-0215-e91","area":{"type":"Polygon","coordinates":[[[-37.73351319121963,12.388160845786343],[-37.733136124669386,11.945497002464712],[-37.28067398511405,11.945496914120424],[-37.280296734365095,12.388160754065861],[-37.73351319121963,12.388160845786343]]]},"related_frames":[5467169,6658436,6661168,6661169,6650679],"version_set":[{"id":6975079,"created":"2017-07-28T10:33:11.082754Z","key":"G7qP1rPTNHIPFbVE2eAAXhDP.sCzxxaq","md5":"cb701cb89e7013e0ae80d095c2dc8888","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/5bac/cpt1m012-fl06-20170727-0215-e91?versionId=G7qP1rPTNHIPFbVE2eAAXhDP.sCzxxaq&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UEL8VsaSyDQvz9fPnC5obbUq1J0%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20170727-0215-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/5bac/cpt1m012-fl06-20170727-0215-e91?versionId=G7qP1rPTNHIPFbVE2eAAXhDP.sCzxxaq&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UEL8VsaSyDQvz9fPnC5obbUq1J0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T01:17:23.462000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl06","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-28T01:17:23.462000Z","OBSTYPE":"EXPOSE","BLKUID":163849192,"REQNUM":1182741},{"id":6663323,"basename":"cpt1m010-fl16-20170727-0215-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329121965,12.388160845786343],[-37.73313622466941,11.945497002464712],[-37.28067408511407,11.945496914120424],[-37.28029683436512,12.388160754065861],[-37.73351329121965,12.388160845786343]]]},"related_frames":[5467161,6658334,6662551,6662510,6662507],"version_set":[{"id":6976184,"created":"2017-07-28T12:33:51.197831Z","key":"6VuigXsxh8WZig4PVamExtdf9bY1Zg6f","md5":"86ee44a7b48cace8c33f4e0b25df57f0","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bc20/cpt1m010-fl16-20170727-0215-e91?versionId=6VuigXsxh8WZig4PVamExtdf9bY1Zg6f&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=G7lTSVhhmbqFbnFKA%2FkSFLVDbRo%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170727-0215-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bc20/cpt1m010-fl16-20170727-0215-e91?versionId=6VuigXsxh8WZig4PVamExtdf9bY1Zg6f&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=G7lTSVhhmbqFbnFKA%2FkSFLVDbRo%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T00:50:10.427000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"Messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-28T00:50:10.427000Z","OBSTYPE":"EXPOSE","BLKUID":163845538,"REQNUM":1183251},{"id":6663320,"basename":"cpt1m010-fl16-20170727-0214-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329121965,12.388160845786343],[-37.73313622466941,11.945497002464712],[-37.28067408511407,11.945496914120424],[-37.28029683436512,12.388160754065861],[-37.73351329121965,12.388160845786343]]]},"related_frames":[5467161,6658331,6662510,6662507,6625149],"version_set":[{"id":6976181,"created":"2017-07-28T12:33:27.834679Z","key":"TtJIiVA1xj5xm20f42Nqjs0E0b6tTEsu","md5":"eaed47adc7839f199cf005b01a115fda","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/630f/cpt1m010-fl16-20170727-0214-e91?versionId=TtJIiVA1xj5xm20f42Nqjs0E0b6tTEsu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=l%2FeSr7OOt8qDymCXLLudb9bPlYA%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170727-0214-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/630f/cpt1m010-fl16-20170727-0214-e91?versionId=TtJIiVA1xj5xm20f42Nqjs0E0b6tTEsu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=l%2FeSr7OOt8qDymCXLLudb9bPlYA%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-28T00:46:12.529000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"Messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-28T00:46:12.529000Z","OBSTYPE":"EXPOSE","BLKUID":163845538,"REQNUM":1183251},{"id":6658524,"basename":"coj1m011-fl12-20170727-0174-e91","area":{"type":"Polygon","coordinates":[[[-37.733513391306474,12.38816094578556],[-37.733136324752934,11.945497102463934],[-37.28067418503048,11.94549701411964],[-37.28029693427817,12.38816085406508],[-37.733513391306474,12.38816094578556]]]},"related_frames":[5467260,6655280,6657969,6657975,6647416],"version_set":[{"id":6971385,"created":"2017-07-28T01:47:16.218799Z","key":"YIURKyg2bFt4jks.ZlLDzkphvq.hEeem","md5":"65d614059cc4fcc9ba032bb32534b05f","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9c13/coj1m011-fl12-20170727-0174-e91?versionId=YIURKyg2bFt4jks.ZlLDzkphvq.hEeem&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fQirJ08p1NgQkZnXkfmsBhZwEoE%3D&Expires=1528984033"}],"filename":"coj1m011-fl12-20170727-0174-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9c13/coj1m011-fl12-20170727-0174-e91?versionId=YIURKyg2bFt4jks.ZlLDzkphvq.hEeem&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=fQirJ08p1NgQkZnXkfmsBhZwEoE%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-27T15:53:46.677000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl12","OBJECT":"messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-27T15:53:46.677000Z","OBSTYPE":"EXPOSE","BLKUID":163708123,"REQNUM":1183002},{"id":6658523,"basename":"coj1m011-fl12-20170727-0173-e91","area":{"type":"Polygon","coordinates":[[[-37.733513391306474,12.38816094578556],[-37.733136324752934,11.945497102463934],[-37.28067418503048,11.94549701411964],[-37.28029693427817,12.38816085406508],[-37.733513391306474,12.38816094578556]]]},"related_frames":[5467260,6658040,6655282,6657969,6657975],"version_set":[{"id":6971384,"created":"2017-07-28T01:47:11.513501Z","key":"xYGTo1bwaOkmcGFtmwscrcxtl7U1M7AW","md5":"5002cac76e37243bba280a8f519f249d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b886/coj1m011-fl12-20170727-0173-e91?versionId=xYGTo1bwaOkmcGFtmwscrcxtl7U1M7AW&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qV%2FIl9VdCAqDFByhw5gXgQDBkV4%3D&Expires=1528984033"}],"filename":"coj1m011-fl12-20170727-0173-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b886/coj1m011-fl12-20170727-0173-e91?versionId=xYGTo1bwaOkmcGFtmwscrcxtl7U1M7AW&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=qV%2FIl9VdCAqDFByhw5gXgQDBkV4%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-27T15:49:50.198000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl12","OBJECT":"messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-27T15:49:50.198000Z","OBSTYPE":"EXPOSE","BLKUID":163708123,"REQNUM":1183002},{"id":6656024,"basename":"lsc1m005-fl15-20170726-0155-e91","area":{"type":"Polygon","coordinates":[[[-37.73351349139335,12.388161045784774],[-37.73313642483646,11.945497202463152],[-37.28067428494694,11.945497114118856],[-37.280297034191335,12.388160954064295],[-37.73351349139335,12.388161045784774]]]},"related_frames":[6649861,6655647,6655641,6655622,5630779],"version_set":[{"id":6968885,"created":"2017-07-27T18:29:34.666466Z","key":"Ut12oNV4NSr1f0xwOgW.wm..IkSBL8xx","md5":"f71541ecb27f4c2742df082018ba4a5d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/085f/lsc1m005-fl15-20170726-0155-e91?versionId=Ut12oNV4NSr1f0xwOgW.wm..IkSBL8xx&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=8jf%2F%2BRSv5pfo8JRGHUbpuTw2k68%3D&Expires=1528984033"}],"filename":"lsc1m005-fl15-20170726-0155-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/085f/lsc1m005-fl15-20170726-0155-e91?versionId=Ut12oNV4NSr1f0xwOgW.wm..IkSBL8xx&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=8jf%2F%2BRSv5pfo8JRGHUbpuTw2k68%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-27T05:37:30.024000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl15","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-27T05:37:30.024000Z","OBSTYPE":"EXPOSE","BLKUID":163567729,"REQNUM":1182738},{"id":6654026,"basename":"cpt1m010-fl16-20170726-0210-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329121965,12.388160845786343],[-37.73313622466941,11.945497002464712],[-37.28067408511407,11.945496914120424],[-37.28029683436512,12.388160754065861],[-37.73351329121965,12.388160845786343]]]},"related_frames":[5467161,6647920,6652972,6652878,6652857],"version_set":[{"id":6966887,"created":"2017-07-27T12:29:46.513930Z","key":"Rd5ndiFtaqOGbcSmILYOmhHPfsnZxlbi","md5":"a7b5825226542e1e0e37ea3d7d345473","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bcb2/cpt1m010-fl16-20170726-0210-e91?versionId=Rd5ndiFtaqOGbcSmILYOmhHPfsnZxlbi&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=416lA0Amsdn1HCiVXeYxvBchKao%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170726-0210-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bcb2/cpt1m010-fl16-20170726-0210-e91?versionId=Rd5ndiFtaqOGbcSmILYOmhHPfsnZxlbi&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=416lA0Amsdn1HCiVXeYxvBchKao%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-27T00:49:27.532000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"Messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-27T00:49:27.532000Z","OBSTYPE":"EXPOSE","BLKUID":163502587,"REQNUM":1183248},{"id":6654025,"basename":"cpt1m010-fl16-20170726-0209-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329130651,12.38816094578556],[-37.73313622475297,11.945497102463934],[-37.28067408503051,11.94549701411964],[-37.280296834278204,12.38816085406508],[-37.73351329130651,12.38816094578556]]]},"related_frames":[5467161,6647919,6652878,6652857,6625149],"version_set":[{"id":6966886,"created":"2017-07-27T12:29:19.731478Z","key":".p_5I0.oob8pjDnmhj3lDHTQ03FYq1tf","md5":"bd49d8f4b5f58a2a7e85e569038e0be3","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/10af/cpt1m010-fl16-20170726-0209-e91?versionId=.p_5I0.oob8pjDnmhj3lDHTQ03FYq1tf&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=w9D1Tjs8uBXhqJjqvzydC6TUWYA%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170726-0209-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/10af/cpt1m010-fl16-20170726-0209-e91?versionId=.p_5I0.oob8pjDnmhj3lDHTQ03FYq1tf&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=w9D1Tjs8uBXhqJjqvzydC6TUWYA%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-27T00:45:29.971000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"Messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-27T00:45:29.971000Z","OBSTYPE":"EXPOSE","BLKUID":163502587,"REQNUM":1183248},{"id":6653959,"basename":"cpt1m010-fl16-20170726-0186-e91","area":{"type":"Polygon","coordinates":[[[-37.733513491306496,12.38816094578556],[-37.733136424752956,11.945497102463934],[-37.2806742850305,11.94549701411964],[-37.28029703427819,12.38816085406508],[-37.733513491306496,12.38816094578556]]]},"related_frames":[5467161,6647425,6652878,6652857,6625150],"version_set":[{"id":6966820,"created":"2017-07-27T12:20:22.506864Z","key":"q.lQkXMF5bCOqa2Ei1_1CeH9l_0kO5lV","md5":"ccbfb2b18297c5bb9f85c5d44de1d649","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9f84/cpt1m010-fl16-20170726-0186-e91?versionId=q.lQkXMF5bCOqa2Ei1_1CeH9l_0kO5lV&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ksIpHX%2Fad8uhZSfyL5sbcGco3xA%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170726-0186-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/9f84/cpt1m010-fl16-20170726-0186-e91?versionId=q.lQkXMF5bCOqa2Ei1_1CeH9l_0kO5lV&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ksIpHX%2Fad8uhZSfyL5sbcGco3xA%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T23:59:30.184000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-26T23:59:30.184000Z","OBSTYPE":"EXPOSE","BLKUID":163493419,"REQNUM":1182999},{"id":6653954,"basename":"cpt1m010-fl16-20170726-0185-e91","area":{"type":"Polygon","coordinates":[[[-37.733513491306496,12.38816094578556],[-37.733136424752956,11.945497102463934],[-37.2806742850305,11.94549701411964],[-37.28029703427819,12.38816085406508],[-37.733513491306496,12.38816094578556]]]},"related_frames":[5467161,6652971,6647423,6652878,6652857],"version_set":[{"id":6966815,"created":"2017-07-27T12:18:45.943792Z","key":"gPeHAZhnW8LU4_ku.XWkJcJu2b3UJoTs","md5":"ed9b725a73a0734fcc6a9463f31f1cd7","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6cac/cpt1m010-fl16-20170726-0185-e91?versionId=gPeHAZhnW8LU4_ku.XWkJcJu2b3UJoTs&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=FboA842ppwuIVgI2ydOCQt8Ovt0%3D&Expires=1528984033"}],"filename":"cpt1m010-fl16-20170726-0185-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/6cac/cpt1m010-fl16-20170726-0185-e91?versionId=gPeHAZhnW8LU4_ku.XWkJcJu2b3UJoTs&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=FboA842ppwuIVgI2ydOCQt8Ovt0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T23:55:32.534000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl16","OBJECT":"messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-26T23:55:32.534000Z","OBSTYPE":"EXPOSE","BLKUID":163493419,"REQNUM":1182999},{"id":6646960,"basename":"lsc1m005-fl15-20170725-0137-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329130651,12.38816094578556],[-37.73313622475297,11.945497102463934],[-37.28067408503051,11.94549701411964],[-37.280296834278204,12.38816085406508],[-37.73351329130651,12.38816094578556]]]},"related_frames":[6640142,6645342,6645341,6610972,5630779],"version_set":[{"id":6959821,"created":"2017-07-26T22:37:34.061889Z","key":"ooY0032Wkcc4NZa2d8nggg98EyqT1S_x","md5":"15f3767f584e071cb73ed766a9e48150","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e753/lsc1m005-fl15-20170725-0137-e91?versionId=ooY0032Wkcc4NZa2d8nggg98EyqT1S_x&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Yh9HpmzcMUhncZqWIKk8n2j%2FZsI%3D&Expires=1528984033"}],"filename":"lsc1m005-fl15-20170725-0137-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e753/lsc1m005-fl15-20170725-0137-e91?versionId=ooY0032Wkcc4NZa2d8nggg98EyqT1S_x&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Yh9HpmzcMUhncZqWIKk8n2j%2FZsI%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T07:04:11.904000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl15","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-26T07:04:11.904000Z","OBSTYPE":"EXPOSE","BLKUID":163274410,"REQNUM":1182735},{"id":6645221,"basename":"lsc1m009-fl03-20170725-0171-e91","area":{"type":"Polygon","coordinates":[[[-37.7322548994286,12.386933912436925],[-37.731882006945625,11.946726975447573],[-37.28192911557778,11.94672688807197],[-37.28155604093513,12.386933821741046],[-37.7322548994286,12.386933912436925]]]},"related_frames":[6640014,6644628,6644598,6626148,5487476],"version_set":[{"id":6958082,"created":"2017-07-26T16:56:52.507602Z","key":"kMwcjUbZlC0sfGmQVjO27pAmlY9npH6f","md5":"2ce53890490a0c20799d8f4760a3f9d5","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2b0a/lsc1m009-fl03-20170725-0171-e91?versionId=kMwcjUbZlC0sfGmQVjO27pAmlY9npH6f&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Qd9ZqgoqzGuIG7I%2BF0Mu%2Fb6x8lM%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170725-0171-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2b0a/lsc1m009-fl03-20170725-0171-e91?versionId=kMwcjUbZlC0sfGmQVjO27pAmlY9npH6f&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=Qd9ZqgoqzGuIG7I%2BF0Mu%2Fb6x8lM%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T06:54:10.197000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"Messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-26T06:54:10.197000Z","OBSTYPE":"EXPOSE","BLKUID":163272625,"REQNUM":1183245},{"id":6645220,"basename":"lsc1m009-fl03-20170725-0170-e91","area":{"type":"Polygon","coordinates":[[[-37.7322548994286,12.386933912436925],[-37.731882006945625,11.946726975447573],[-37.28192911557778,11.94672688807197],[-37.28155604093513,12.386933821741046],[-37.7322548994286,12.386933912436925]]]},"related_frames":[6640009,6644634,6644628,6644598,5487476],"version_set":[{"id":6958081,"created":"2017-07-26T16:56:21.014536Z","key":"E0euMBYegPeqTS_0gLQ3ae8RTxuCBYn2","md5":"7537b9fdfa4f3aa9c03af60ba55c2b10","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f311/lsc1m009-fl03-20170725-0170-e91?versionId=E0euMBYegPeqTS_0gLQ3ae8RTxuCBYn2&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ucbYFFQ%2BKpuumx4wFNMvlOoEUyE%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170725-0170-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/f311/lsc1m009-fl03-20170725-0170-e91?versionId=E0euMBYegPeqTS_0gLQ3ae8RTxuCBYn2&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=ucbYFFQ%2BKpuumx4wFNMvlOoEUyE%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T06:50:13.478000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"Messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-26T06:50:13.478000Z","OBSTYPE":"EXPOSE","BLKUID":163272625,"REQNUM":1183245},{"id":6645454,"basename":"lsc1m005-fl15-20170725-0127-e91","area":{"type":"Polygon","coordinates":[[[-37.73351349139335,12.388161045784774],[-37.73313642483646,11.945497202463152],[-37.28067428494694,11.945497114118856],[-37.280297034191335,12.388160954064295],[-37.73351349139335,12.388161045784774]]]},"related_frames":[6639730,6645363,6645342,6645341,5630779],"version_set":[{"id":6958315,"created":"2017-07-26T18:17:49.230607Z","key":"hub2IQ_6UC51EhlhthIsp72ffJk08SAN","md5":"17f5570a49d2aa94e39cace5adb619d6","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bb78/lsc1m005-fl15-20170725-0127-e91?versionId=hub2IQ_6UC51EhlhthIsp72ffJk08SAN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=18vZRV%2FuWr86uCeFaFwmyFVZ6WY%3D&Expires=1528984033"}],"filename":"lsc1m005-fl15-20170725-0127-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/bb78/lsc1m005-fl15-20170725-0127-e91?versionId=hub2IQ_6UC51EhlhthIsp72ffJk08SAN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=18vZRV%2FuWr86uCeFaFwmyFVZ6WY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T05:58:50.137000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl15","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-26T05:58:50.137000Z","OBSTYPE":"EXPOSE","BLKUID":163259971,"REQNUM":1182996},{"id":6646435,"basename":"lsc1m005-fl15-20170725-0126-e91","area":{"type":"Polygon","coordinates":[[[-37.73351349139335,12.388161045784774],[-37.73313642483646,11.945497202463152],[-37.28067428494694,11.945497114118856],[-37.280297034191335,12.388160954064295],[-37.73351349139335,12.388161045784774]]]},"related_frames":[6639666,6645342,6645341,6610973,5630779],"version_set":[{"id":6959296,"created":"2017-07-26T20:35:54.372860Z","key":"c_mVa9bTXV8YQbGD5Cf1cPITqigk.mcQ","md5":"54a0861b3a926032b9b2d1c80d458435","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e295/lsc1m005-fl15-20170725-0126-e91?versionId=c_mVa9bTXV8YQbGD5Cf1cPITqigk.mcQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=MPt1%2Bf43zYVXXNNd2Hu%2ByoNOOMY%3D&Expires=1528984033"}],"filename":"lsc1m005-fl15-20170725-0126-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/e295/lsc1m005-fl15-20170725-0126-e91?versionId=c_mVa9bTXV8YQbGD5Cf1cPITqigk.mcQ&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=MPt1%2Bf43zYVXXNNd2Hu%2ByoNOOMY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-26T05:54:50.610000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl15","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-26T05:54:50.610000Z","OBSTYPE":"EXPOSE","BLKUID":163259971,"REQNUM":1182996},{"id":6636017,"basename":"lsc1m009-fl03-20170724-0146-e91","area":{"type":"Polygon","coordinates":[[[-37.73225469925586,12.386933712438475],[-37.73188180677954,11.946726775449116],[-37.281928915744004,11.946726688073516],[-37.281555841107945,12.3869336217426],[-37.73225469925586,12.386933712438475]]]},"related_frames":[6635414,6635405,6631302,6635379,5487476],"version_set":[{"id":6948879,"created":"2017-07-25T17:07:13.667933Z","key":"_.9H3l9dDipw0idE3ICrOSKPgbsU09YX","md5":"41302f762e69a3eb9ee65a370c947d24","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8e4c/lsc1m009-fl03-20170724-0146-e91?versionId=_.9H3l9dDipw0idE3ICrOSKPgbsU09YX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=7kiYjxhGuQIarfImIeFzFxgoj%2BI%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170724-0146-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8e4c/lsc1m009-fl03-20170724-0146-e91?versionId=_.9H3l9dDipw0idE3ICrOSKPgbsU09YX&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=7kiYjxhGuQIarfImIeFzFxgoj%2BI%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-25T07:45:25.242000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-25T07:45:25.242000Z","OBSTYPE":"EXPOSE","BLKUID":162917242,"REQNUM":1182732},{"id":6636016,"basename":"lsc1m009-fl03-20170724-0145-e91","area":{"type":"Polygon","coordinates":[[[-37.73225469934221,12.386933812437698],[-37.73188180686259,11.946726875448347],[-37.2819289156609,11.946726788072745],[-37.28155584102154,12.386933721741823],[-37.73225469934221,12.386933812437698]]]},"related_frames":[6635412,6635405,6631212,6635379,5487476],"version_set":[{"id":6948878,"created":"2017-07-25T17:06:53.657883Z","key":"KLFkb9nkBDKE6bM3P7snmtWnHONPzcmk","md5":"c524e71ca2dd7ec1b8cabaf735cff589","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7caf/lsc1m009-fl03-20170724-0145-e91?versionId=KLFkb9nkBDKE6bM3P7snmtWnHONPzcmk&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=5B59ON1od0oK514fnLxgaAKY7jw%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170724-0145-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/7caf/lsc1m009-fl03-20170724-0145-e91?versionId=KLFkb9nkBDKE6bM3P7snmtWnHONPzcmk&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=5B59ON1od0oK514fnLxgaAKY7jw%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-25T07:38:54.031000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-25T07:38:54.031000Z","OBSTYPE":"EXPOSE","BLKUID":162917239,"REQNUM":1182993},{"id":6636015,"basename":"lsc1m009-fl03-20170724-0144-e91","area":{"type":"Polygon","coordinates":[[[-37.73225469934221,12.386933812437698],[-37.73188180686259,11.946726875448347],[-37.2819289156609,11.946726788072745],[-37.28155584102154,12.386933721741823],[-37.73225469934221,12.386933812437698]]]},"related_frames":[6635405,6631156,6635379,6626145,5487476],"version_set":[{"id":6948877,"created":"2017-07-25T17:05:56.823499Z","key":"ocHWYT5SgRoHl9b1AW42hgwWfmpqJ1KD","md5":"72c2ac8f7ce0d4732a4ebb4dada236c2","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/4f11/lsc1m009-fl03-20170724-0144-e91?versionId=ocHWYT5SgRoHl9b1AW42hgwWfmpqJ1KD&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=MIC4raTGCdQrKxBAkb2%2BecCi3qc%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170724-0144-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/4f11/lsc1m009-fl03-20170724-0144-e91?versionId=ocHWYT5SgRoHl9b1AW42hgwWfmpqJ1KD&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=MIC4raTGCdQrKxBAkb2%2BecCi3qc%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-25T07:34:57.784000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-25T07:34:57.784000Z","OBSTYPE":"EXPOSE","BLKUID":162917239,"REQNUM":1182993},{"id":6636014,"basename":"lsc1m009-fl03-20170724-0143-e91","area":{"type":"Polygon","coordinates":[[[-37.73225469934221,12.386933812437698],[-37.73188180686259,11.946726875448347],[-37.2819289156609,11.946726788072745],[-37.28155584102154,12.386933721741823],[-37.73225469934221,12.386933812437698]]]},"related_frames":[6635405,6631149,6635379,6626148,5487476],"version_set":[{"id":6948876,"created":"2017-07-25T17:05:16.723447Z","key":"lpiLR7VfqvI.z79cbuAaOyd9.UtpS2Iu","md5":"ab0be2517ba4e85f4fb324fc9aec767d","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a45a/lsc1m009-fl03-20170724-0143-e91?versionId=lpiLR7VfqvI.z79cbuAaOyd9.UtpS2Iu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UPqj7c3matGD0cgvdDU6rn3xHVc%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170724-0143-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a45a/lsc1m009-fl03-20170724-0143-e91?versionId=lpiLR7VfqvI.z79cbuAaOyd9.UtpS2Iu&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=UPqj7c3matGD0cgvdDU6rn3xHVc%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-25T07:29:43.633000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"Messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-25T07:29:43.633000Z","OBSTYPE":"EXPOSE","BLKUID":162910927,"REQNUM":1183242},{"id":6636012,"basename":"lsc1m009-fl03-20170724-0142-e91","area":{"type":"Polygon","coordinates":[[[-37.73225479934223,12.386933812437698],[-37.73188190686261,11.946726875448347],[-37.28192901566092,11.946726788072745],[-37.281555941021566,12.386933721741823],[-37.73225479934223,12.386933812437698]]]},"related_frames":[6635405,6631102,6635379,6617943,5487476],"version_set":[{"id":6948874,"created":"2017-07-25T17:04:45.175253Z","key":"MLzDDM1vwlfgC_u2jPTRNZmbSwi4v8YN","md5":"ac1ca83d0ca862f471e03edba6369e82","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/78c2/lsc1m009-fl03-20170724-0142-e91?versionId=MLzDDM1vwlfgC_u2jPTRNZmbSwi4v8YN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=70WWIgr2ZHrkkeHB0iiFlyoMcW0%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170724-0142-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/78c2/lsc1m009-fl03-20170724-0142-e91?versionId=MLzDDM1vwlfgC_u2jPTRNZmbSwi4v8YN&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=70WWIgr2ZHrkkeHB0iiFlyoMcW0%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-25T07:25:38.229000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"Messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-25T07:25:38.229000Z","OBSTYPE":"EXPOSE","BLKUID":162910927,"REQNUM":1183242},{"id":6626959,"basename":"lsc1m009-fl03-20170723-0172-e91","area":{"type":"Polygon","coordinates":[[[-37.73225469925586,12.386933712438475],[-37.73188180677954,11.946726775449116],[-37.281928915744004,11.946726688073516],[-37.281555841107945,12.3869336217426],[-37.73225469925586,12.386933712438475]]]},"related_frames":[6622961,6626134,6626102,6609364,5487476],"version_set":[{"id":6939821,"created":"2017-07-24T16:47:19.183281Z","key":"FG.2AHy_leUt2kFpLNVAWluZrRGhvYRU","md5":"21fff8d805ee44d955abfc216af825aa","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/aa36/lsc1m009-fl03-20170723-0172-e91?versionId=FG.2AHy_leUt2kFpLNVAWluZrRGhvYRU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2BB4LNVsKAiYBUz7bhhlk3HoP5FU%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170723-0172-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/aa36/lsc1m009-fl03-20170723-0172-e91?versionId=FG.2AHy_leUt2kFpLNVAWluZrRGhvYRU&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=%2BB4LNVsKAiYBUz7bhhlk3HoP5FU%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-24T07:45:42.478000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-24T07:45:42.478000Z","OBSTYPE":"EXPOSE","BLKUID":162594034,"REQNUM":1182729},{"id":6626921,"basename":"lsc1m009-fl03-20170723-0157-e91","area":{"type":"Polygon","coordinates":[[[-37.73225479934223,12.386933812437698],[-37.73188190686261,11.946726875448347],[-37.28192901566092,11.946726788072745],[-37.281555941021566,12.386933721741823],[-37.73225479934223,12.386933812437698]]]},"related_frames":[6622743,6626134,6626102,6609363,5487476],"version_set":[{"id":6939783,"created":"2017-07-24T16:42:03.274897Z","key":"FOyNMPkv6.ztlHrgx5lvMFFNYoxx3Do9","md5":"f1ad879b0249317c823b738f03734b0a","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3779/lsc1m009-fl03-20170723-0157-e91?versionId=FOyNMPkv6.ztlHrgx5lvMFFNYoxx3Do9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=oIr2ipn4e2fnfkQGi3ptnAaLBPQ%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170723-0157-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/3779/lsc1m009-fl03-20170723-0157-e91?versionId=FOyNMPkv6.ztlHrgx5lvMFFNYoxx3Do9&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=oIr2ipn4e2fnfkQGi3ptnAaLBPQ%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-24T07:04:42.457000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"rp","L1PUBDAT":"2017-07-24T07:04:42.457000Z","OBSTYPE":"EXPOSE","BLKUID":162579283,"REQNUM":1182990},{"id":6626844,"basename":"lsc1m009-fl03-20170723-0156-e91","area":{"type":"Polygon","coordinates":[[[-37.73225479934223,12.386933812437698],[-37.73188190686261,11.946726875448347],[-37.28192901566092,11.946726788072745],[-37.281555941021566,12.386933721741823],[-37.73225479934223,12.386933812437698]]]},"related_frames":[6626145,6622740,6626134,6626102,5487476],"version_set":[{"id":6939706,"created":"2017-07-24T16:39:16.534733Z","key":"sdrkZtyUbqbk7hYxWYHLLCl2IDoJRSk8","md5":"abe3efab884898ed3f7062edab44fd95","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b9b4/lsc1m009-fl03-20170723-0156-e91?versionId=sdrkZtyUbqbk7hYxWYHLLCl2IDoJRSk8&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=NePRCx9BWvXRaiTY8WMJrCnboFo%3D&Expires=1528984033"}],"filename":"lsc1m009-fl03-20170723-0156-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b9b4/lsc1m009-fl03-20170723-0156-e91?versionId=sdrkZtyUbqbk7hYxWYHLLCl2IDoJRSk8&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=NePRCx9BWvXRaiTY8WMJrCnboFo%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-24T07:00:37.822000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl03","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"180.000","FILTER":"gp","L1PUBDAT":"2017-07-24T07:00:37.822000Z","OBSTYPE":"EXPOSE","BLKUID":162579283,"REQNUM":1182990},{"id":6623033,"basename":"coj1m003-fl11-20170723-0196-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329130651,12.38816094578556],[-37.73313622475297,11.945497102463934],[-37.28067408503051,11.94549701411964],[-37.280296834278204,12.38816085406508],[-37.73351329130651,12.38816094578556]]]},"related_frames":[5467576,6618565,6622447,6622508,6622444],"version_set":[{"id":6935894,"created":"2017-07-24T08:13:40.802279Z","key":"IRt_qLgJ6wthLSJVyq1kVD_5Ej3hvnn2","md5":"c75bfe6b4e8f5b6d1b54a665918e7238","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a46d/coj1m003-fl11-20170723-0196-e91?versionId=IRt_qLgJ6wthLSJVyq1kVD_5Ej3hvnn2&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=50dla6oA5EzvM0GxgODdFuTC8po%3D&Expires=1528984033"}],"filename":"coj1m003-fl11-20170723-0196-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/a46d/coj1m003-fl11-20170723-0196-e91?versionId=IRt_qLgJ6wthLSJVyq1kVD_5Ej3hvnn2&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=50dla6oA5EzvM0GxgODdFuTC8po%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-23T16:25:55.638000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl11","OBJECT":"Messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-23T16:25:55.638000Z","OBSTYPE":"EXPOSE","BLKUID":162374611,"REQNUM":1183239},{"id":6623030,"basename":"coj1m003-fl11-20170723-0195-e91","area":{"type":"Polygon","coordinates":[[[-37.73351329130651,12.38816094578556],[-37.73313622475297,11.945497102463934],[-37.28067408503051,11.94549701411964],[-37.280296834278204,12.38816085406508],[-37.73351329130651,12.38816094578556]]]},"related_frames":[5467576,6618450,6622447,6622444,6605658],"version_set":[{"id":6935892,"created":"2017-07-24T08:12:52.319034Z","key":"xIzvY5jzFwx4fPk6j.uvRwCLmFUDJB2V","md5":"cfe02c1b34fb04088b4229e2a9035491","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2b69/coj1m003-fl11-20170723-0195-e91?versionId=xIzvY5jzFwx4fPk6j.uvRwCLmFUDJB2V&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=0w0194ruvzVpa82yaLBxjYp8u1Y%3D&Expires=1528984033"}],"filename":"coj1m003-fl11-20170723-0195-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/2b69/coj1m003-fl11-20170723-0195-e91?versionId=xIzvY5jzFwx4fPk6j.uvRwCLmFUDJB2V&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=0w0194ruvzVpa82yaLBxjYp8u1Y%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-23T16:21:59.600000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl11","OBJECT":"Messier 15","SITEID":"coj","TELID":"1m0a","EXPTIME":"180.000","FILTER":"ip","L1PUBDAT":"2017-07-23T16:21:59.600000Z","OBSTYPE":"EXPOSE","BLKUID":162374611,"REQNUM":1183239},{"id":6611596,"basename":"lsc1m005-fl15-20170721-0147-e91","area":{"type":"Polygon","coordinates":[[[-37.733513691306484,12.38816094578556],[-37.733136624752944,11.945497102463934],[-37.28067448503049,11.94549701411964],[-37.28029723427818,12.38816085406508],[-37.733513691306484,12.38816094578556]]]},"related_frames":[6605126,6610972,6610950,6610949,5630779],"version_set":[{"id":6924458,"created":"2017-07-22T22:15:43.926119Z","key":"gRkArhAAS0YBaAcOL6vRsju88C7kbbjS","md5":"73d6377f2d68f036772917857602e56b","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8ea5/lsc1m005-fl15-20170721-0147-e91?versionId=gRkArhAAS0YBaAcOL6vRsju88C7kbbjS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=0ckQEYnKlftP6r4di6uLavPtz3s%3D&Expires=1528984033"}],"filename":"lsc1m005-fl15-20170721-0147-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/8ea5/lsc1m005-fl15-20170721-0147-e91?versionId=gRkArhAAS0YBaAcOL6vRsju88C7kbbjS&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=0ckQEYnKlftP6r4di6uLavPtz3s%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-22T05:07:06.686000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl15","OBJECT":"messier 15","SITEID":"lsc","TELID":"1m0a","EXPTIME":"600.000","FILTER":"up","L1PUBDAT":"2017-07-22T05:07:06.686000Z","OBSTYPE":"EXPOSE","BLKUID":161809414,"REQNUM":1182723},{"id":6606628,"basename":"cpt1m012-fl06-20170721-0173-e91","area":{"type":"Polygon","coordinates":[[[-37.73351319121963,12.388160845786343],[-37.733136124669386,11.945497002464712],[-37.28067398511405,11.945496914120424],[-37.280296734365095,12.388160754065861],[-37.73351319121963,12.388160845786343]]]},"related_frames":[5467169,6604108,6605618,6605622,6595882],"version_set":[{"id":6919491,"created":"2017-07-22T10:16:03.991057Z","key":"A8f.v.sL.Klp_41vFyHRRFfhXdXJM7kI","md5":"a812c6b3daaa9d82193cb0a92842d610","extension":".fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b2fc/cpt1m012-fl06-20170721-0173-e91?versionId=A8f.v.sL.Klp_41vFyHRRFfhXdXJM7kI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=lU%2Blu8QBlU5ERoL6Uj8rFFclkIY%3D&Expires=1528984033"}],"filename":"cpt1m012-fl06-20170721-0173-e91.fits.fz","url":"https://s3.us-west-2.amazonaws.com/archive.lcogt.net/b2fc/cpt1m012-fl06-20170721-0173-e91?versionId=A8f.v.sL.Klp_41vFyHRRFfhXdXJM7kI&AWSAccessKeyId=AKIAIJQVPYFWOR234BCA&Signature=lU%2Blu8QBlU5ERoL6Uj8rFFclkIY%3D&Expires=1528984033","RLEVEL":91,"DATE_OBS":"2017-07-22T01:47:28.889000Z","PROPID":"LCOEPO2014B-007","INSTRUME":"fl06","OBJECT":"Messier 15","SITEID":"cpt","TELID":"1m0a","EXPTIME":"180.000","FILTER":"zs","L1PUBDAT":"2017-07-22T01:47:28.889000Z","OBSTYPE":"EXPOSE","BLKUID":161756449,"REQNUM":1183233}]} diff --git a/astroquery/lco/tests/setup_package.py b/astroquery/lco/tests/setup_package.py new file mode 100644 index 0000000000..15d0e6352e --- /dev/null +++ b/astroquery/lco/tests/setup_package.py @@ -0,0 +1,10 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +from __future__ import absolute_import + +import os + + +def get_package_data(): + paths = [os.path.join('data', '*.xml'), + ] + return {'astroquery.lco.tests': paths} diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py new file mode 100644 index 0000000000..049e27a702 --- /dev/null +++ b/astroquery/lco/tests/test_lco.py @@ -0,0 +1,177 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +from __future__ import print_function +import os +import re +import numpy as np + +import pytest +from astropy.table import Table +from astropy.coordinates import SkyCoord +import astropy.units as u + +from ...utils.testing_tools import MockResponse +from ...utils import commons +from ... import lco +from ...lco import conf + +DATA_FILES = {'Cone': 'Cone.xml', + 'Box': 'Box.xml', + 'Polygon': 'Polygon.xml'} + +OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", + commons.GalacticCoordGenerator(l=121.1743, b=-21.5733, + unit=(u.deg, u.deg))] + + +def data_path(filename): + data_dir = os.path.join(os.path.dirname(__file__), 'data') + return os.path.join(data_dir, filename) + + +@pytest.fixture +def patch_get(request): + try: + mp = request.getfixturevalue("monkeypatch") + except AttributeError: # pytest < 3 + mp = request.getfuncargvalue("monkeypatch") + mp.setattr(lco.core.Lco, '_request', get_mockreturn) + return mp + + +def get_mockreturn(method, url, params=None, timeout=10, cache=True, **kwargs): + filename = data_path(DATA_FILES[params['spatial']]) + content = open(filename, 'rb').read() + return MockResponse(content, **kwargs) + + +@pytest.mark.parametrize(('dim'), + ['5d0m0s', 0.3 * u.rad, '5h0m0s', 2 * u.arcmin]) +def test_parse_dimension(dim): + # check that the returned dimension is always in units of 'arcsec', + # 'arcmin' or 'deg' + new_dim = lco.core._parse_dimension(dim) + assert new_dim.unit in ['arcsec', 'arcmin', 'deg'] + + +@pytest.mark.parametrize(('ra', 'dec', 'expected'), + [(10, 10, '10 +10'), + (10.0, -11, '10.0 -11') + ]) +def test_format_decimal_coords(ra, dec, expected): + out = lco.core._format_decimal_coords(ra, dec) + assert out == expected + + +@pytest.mark.parametrize(('coordinates', 'expected'), + [("5h0m0s 0d0m0s", "75.0 +0.0") + ]) +def test_parse_coordinates(coordinates, expected): + out = lco.core._parse_coordinates(coordinates) + for a, b in zip(out.split(), expected.split()): + try: + a = float(a) + b = float(b) + np.testing.assert_almost_equal(a, b) + except ValueError: + assert a == b + + +def test_args_to_payload(): + out = lco.core.Lco._args_to_payload("lco_img") + assert out == dict(catalog='lco_img', outfmt=3, + outrows=conf.row_limit, spatial=None) + + +@pytest.mark.parametrize(("coordinates"), OBJ_LIST) +def test_query_region_cone_async(coordinates, patch_get): + response = lco.core.Lco.query_region_async( + coordinates, catalog='lco_img', spatial='Cone', + radius=2 * u.arcmin, get_query_payload=True) + assert response['radius'] == 2 + assert response['radunits'] == 'arcmin' + response = lco.core.Lco.query_region_async( + coordinates, catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) + assert response is not None + + +@pytest.mark.parametrize(("coordinates"), OBJ_LIST) +def test_query_region_cone(coordinates, patch_get): + result = lco.core.Lco.query_region(coordinates, catalog='lco_img', + spatial='Cone', radius=2 * u.arcmin) + + assert isinstance(result, Table) + + +@pytest.mark.parametrize(("coordinates"), OBJ_LIST) +def test_query_region_box_async(coordinates, patch_get): + response = lco.core.Lco.query_region_async( + coordinates, catalog='lco_img', spatial='Box', + width=2 * u.arcmin, get_query_payload=True) + assert response['size'] == 120 + response = lco.core.Lco.query_region_async( + coordinates, catalog='lco_img', spatial='Box', width=2 * u.arcmin) + assert response is not None + + +@pytest.mark.parametrize(("coordinates"), OBJ_LIST) +def test_query_region_box(coordinates, patch_get): + result = lco.core.Lco.query_region(coordinates, catalog='lco_img', + spatial='Box', width=2 * u.arcmin) + + assert isinstance(result, Table) + + +poly1 = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), + SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), + SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), frame='icrs')] +poly2 = [(10.1 * u.deg, 10.1 * u.deg), (10.0 * u.deg, 10.1 * u.deg), + (10.0 * u.deg, 10.0 * u.deg)] + + +@pytest.mark.parametrize(("polygon"), + [poly1, + poly2 + ]) +def test_query_region_async_polygon(polygon, patch_get): + response = lco.core.Lco.query_region_async( + "m31", catalog="lco_img", spatial="Polygon", + polygon=polygon, get_query_payload=True) + + for a, b in zip(re.split("[ ,]", response["polygon"]), + re.split("[ ,]", "10.1 +10.1,10.0 +10.1,10.0 +10.0")): + for a1, b1 in zip(a.split(), b.split()): + a1 = float(a1) + b1 = float(b1) + np.testing.assert_almost_equal(a1, b1) + + response = lco.core.Lco.query_region_async( + "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) + + assert response is not None + + +@pytest.mark.parametrize(("polygon"), + [poly1, + poly2, + ]) +def test_query_region_polygon(polygon, patch_get): + result = lco.core.Lco.query_region( + "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) + assert isinstance(result, Table) + + +@pytest.mark.parametrize(('spatial', 'result'), + zip(('Cone', 'Box', 'Polygon', 'All-Sky'), + ('Cone', 'Box', 'Polygon', 'NONE'))) +def test_spatial_valid(spatial, result): + out = lco.core.Lco._parse_spatial( + spatial, coordinates='m31', radius=5 * u.deg, width=5 * u.deg, + polygon=[(5 * u.hour, 5 * u.deg)] * 3) + assert out['spatial'] == result + + +@pytest.mark.parametrize(('spatial'), [('cone', 'box', 'polygon', 'all-Sky', + 'All-sky', 'invalid', 'blah')]) +def test_spatial_invalid(spatial): + with pytest.raises(ValueError): + lco.core.Lco._parse_spatial(spatial, coordinates='m31') diff --git a/astroquery/lco/tests/test_lco_remote.py b/astroquery/lco/tests/test_lco_remote.py new file mode 100644 index 0000000000..1f4f4a2263 --- /dev/null +++ b/astroquery/lco/tests/test_lco_remote.py @@ -0,0 +1,73 @@ +# Licensed under a 3-clause BSD style license - see LICENSE.rst +from __future__ import print_function + +from astropy.tests.helper import pytest, remote_data +from astropy.table import Table +from astropy.coordinates import SkyCoord +import astropy.units as u + +import requests +import imp + +from ... import lco + +imp.reload(requests) + +OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", + SkyCoord(l=121.1743, b=-21.5733, unit=(u.deg, u.deg), + frame='galactic')] + + +@remote_data +@pytest.mark.xfail(reason="Changed remote API, xfailing until fixing" + "https://github.com/astropy/astroquery/issues/725") +class TestLco: + + def test_query_object_meta(self): + response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_img') + assert response is not None + + def test_query_object_phot(self): + response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_cat') + assert response is not None + + def test_query_region_cone_async(self): + response = lcogt.core.Lcogt.query_region_async( + 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) + + assert response is not None + + def test_query_region_cone(self): + result = lcogt.core.Lcogt.query_region( + 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) + assert isinstance(result, Table) + + def test_query_region_box_async(self): + response = lcogt.core.Lcogt.query_region_async( + "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', + width=2 * u.arcmin) + assert response is not None + + def test_query_region_box(self): + result = lcogt.core.Lcogt.query_region( + "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', + width=2 * u.arcmin) + assert isinstance(result, Table) + + def test_query_region_async_polygon(self): + polygon = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), + frame='icrs'), + SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), + frame='icrs'), + SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), + frame='icrs')] + response = lcogt.core.Lcogt.query_region_async( + "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) + assert response is not None + + def test_query_region_polygon(self): + polygon = [(10.1, 10.1), (10.0, 10.1), (10.0, 10.0)] + result = lcogt.core.Lcogt.query_region( + "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) + + assert isinstance(result, Table) From 727fecad03db58980d12d0bd1cf6db663b32e30f Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 09:23:29 +0100 Subject: [PATCH 06/10] Removing old files --- astroquery/lco/tests/data/Box.xml | 70 ---- astroquery/lco/tests/data/Cone.xml | 72 ---- astroquery/lco/tests/data/Cone_coord.xml | 72 ---- astroquery/lco/tests/data/Polygon.xml | 76 ---- astroquery/lco/tests/test_lco.py | 75 +--- astroquery/lco/tests/test_lco_remote.py | 58 +-- astroquery/lcogt/__init__.py | 41 -- astroquery/lcogt/core.py | 441 -------------------- astroquery/lcogt/tests/__init__.py | 0 astroquery/lcogt/tests/data/Box.xml | 70 ---- astroquery/lcogt/tests/data/Cone.xml | 72 ---- astroquery/lcogt/tests/data/Cone_coord.xml | 72 ---- astroquery/lcogt/tests/data/Polygon.xml | 76 ---- astroquery/lcogt/tests/setup_package.py | 10 - astroquery/lcogt/tests/test_lcogt.py | 177 -------- astroquery/lcogt/tests/test_lcogt_remote.py | 74 ---- 16 files changed, 5 insertions(+), 1451 deletions(-) delete mode 100644 astroquery/lco/tests/data/Box.xml delete mode 100644 astroquery/lco/tests/data/Cone.xml delete mode 100644 astroquery/lco/tests/data/Cone_coord.xml delete mode 100644 astroquery/lco/tests/data/Polygon.xml delete mode 100644 astroquery/lcogt/__init__.py delete mode 100644 astroquery/lcogt/core.py delete mode 100644 astroquery/lcogt/tests/__init__.py delete mode 100644 astroquery/lcogt/tests/data/Box.xml delete mode 100644 astroquery/lcogt/tests/data/Cone.xml delete mode 100644 astroquery/lcogt/tests/data/Cone_coord.xml delete mode 100644 astroquery/lcogt/tests/data/Polygon.xml delete mode 100644 astroquery/lcogt/tests/setup_package.py delete mode 100644 astroquery/lcogt/tests/test_lcogt.py delete mode 100644 astroquery/lcogt/tests/test_lcogt_remote.py diff --git a/astroquery/lco/tests/data/Box.xml b/astroquery/lco/tests/data/Box.xml deleted file mode 100644 index 063788931a..0000000000 --- a/astroquery/lco/tests/data/Box.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.78500.19300.97800
-
-
diff --git a/astroquery/lco/tests/data/Cone.xml b/astroquery/lco/tests/data/Cone.xml deleted file mode 100644 index d9d8537846..0000000000 --- a/astroquery/lco/tests/data/Cone.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.169298237.8886720.78500.19300.97800
-
-
diff --git a/astroquery/lco/tests/data/Cone_coord.xml b/astroquery/lco/tests/data/Cone_coord.xml deleted file mode 100644 index 97a1c67d8e..0000000000 --- a/astroquery/lco/tests/data/Cone_coord.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.12843098.0560100.78500.19300.97800
-
-
diff --git a/astroquery/lco/tests/data/Polygon.xml b/astroquery/lco/tests/data/Polygon.xml deleted file mode 100644 index 3c0f7cfedd..0000000000 --- a/astroquery/lco/tests/data/Polygon.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.01569610.09922800h40m03.77s10d05m57.22s0.100.079000400376+100557215.2370.0520.05428.014.6350.0660.06722.414.4810.0940.09514.6AAA22211100066350500n2000-09-2164118.312-52.670U0.225019.2017.2010.60200.15400.75600
10.03101610.06308200h40m07.44s10d03m47.10s0.190.1811400400744+100347016.4120.1170.1179.515.6030.1100.1109.215.3120.1580.1586.8BBC22211100006060600n2000-09-2164118.332-52.707U0.67319.9018.6010.80900.29101.10001
10.03677610.06027800h40m08.83s10d03m37.00s0.110.069000400882+100337015.3540.0450.04625.214.8860.0730.07317.814.5140.0890.08914.2AAA22211100066260600n2000-09-2164118.341-52.711U0.55018.4017.0010.46800.37200.84002
10.05996410.08544500h40m14.39s10d05m07.60s0.230.209600401439+100507616.3400.1030.10410.215.6430.1310.1318.815.3700.1730.1736.4ABC22211100016060500n2000-09-2164118.382-52.687U0.69819.4018.5010.69700.27300.97003
10.01583910.03806100h40m03.80s10d02m17.02s0.090.069000400380+100217014.6620.0260.02947.614.1100.0390.04036.313.7970.0500.05127.4AAA22211100066666600n2000-09-2164118.305-52.731000.55200.31300.86504
10.01117010.09390300h40m02.68s10d05m38.05s0.230.2116700400268+100538016.3730.1260.1279.815.9950.1690.1696.415.3930.1790.1796.3BCC22211100006060500n2000-09-2164118.304-52.675U2.411119.7018.5010.37800.60200.98005
10.00554910.01840100h40m01.33s10d01m06.24s0.160.1410800400133+100106216.1730.0970.09811.815.5110.1350.13510.014.9450.1120.1139.5ABB22211100016160600n2000-09-2164118.286-52.750000.66200.56601.22806
-
-
diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py index 049e27a702..3f3d8aaea6 100644 --- a/astroquery/lco/tests/test_lco.py +++ b/astroquery/lco/tests/test_lco.py @@ -14,20 +14,11 @@ from ... import lco from ...lco import conf -DATA_FILES = {'Cone': 'Cone.xml', - 'Box': 'Box.xml', - 'Polygon': 'Polygon.xml'} - -OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", +OBJ_LIST = ["M15", "00h42m44.330s +41d16m07.50s", commons.GalacticCoordGenerator(l=121.1743, b=-21.5733, unit=(u.deg, u.deg))] -def data_path(filename): - data_dir = os.path.join(os.path.dirname(__file__), 'data') - return os.path.join(data_dir, filename) - - @pytest.fixture def patch_get(request): try: @@ -111,67 +102,3 @@ def test_query_region_box_async(coordinates, patch_get): response = lco.core.Lco.query_region_async( coordinates, catalog='lco_img', spatial='Box', width=2 * u.arcmin) assert response is not None - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box(coordinates, patch_get): - result = lco.core.Lco.query_region(coordinates, catalog='lco_img', - spatial='Box', width=2 * u.arcmin) - - assert isinstance(result, Table) - - -poly1 = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), frame='icrs')] -poly2 = [(10.1 * u.deg, 10.1 * u.deg), (10.0 * u.deg, 10.1 * u.deg), - (10.0 * u.deg, 10.0 * u.deg)] - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2 - ]) -def test_query_region_async_polygon(polygon, patch_get): - response = lco.core.Lco.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", - polygon=polygon, get_query_payload=True) - - for a, b in zip(re.split("[ ,]", response["polygon"]), - re.split("[ ,]", "10.1 +10.1,10.0 +10.1,10.0 +10.0")): - for a1, b1 in zip(a.split(), b.split()): - a1 = float(a1) - b1 = float(b1) - np.testing.assert_almost_equal(a1, b1) - - response = lco.core.Lco.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - - assert response is not None - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2, - ]) -def test_query_region_polygon(polygon, patch_get): - result = lco.core.Lco.query_region( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - assert isinstance(result, Table) - - -@pytest.mark.parametrize(('spatial', 'result'), - zip(('Cone', 'Box', 'Polygon', 'All-Sky'), - ('Cone', 'Box', 'Polygon', 'NONE'))) -def test_spatial_valid(spatial, result): - out = lco.core.Lco._parse_spatial( - spatial, coordinates='m31', radius=5 * u.deg, width=5 * u.deg, - polygon=[(5 * u.hour, 5 * u.deg)] * 3) - assert out['spatial'] == result - - -@pytest.mark.parametrize(('spatial'), [('cone', 'box', 'polygon', 'all-Sky', - 'All-sky', 'invalid', 'blah')]) -def test_spatial_invalid(spatial): - with pytest.raises(ValueError): - lco.core.Lco._parse_spatial(spatial, coordinates='m31') diff --git a/astroquery/lco/tests/test_lco_remote.py b/astroquery/lco/tests/test_lco_remote.py index 1f4f4a2263..fd54b5282f 100644 --- a/astroquery/lco/tests/test_lco_remote.py +++ b/astroquery/lco/tests/test_lco_remote.py @@ -13,61 +13,11 @@ imp.reload(requests) -OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", - SkyCoord(l=121.1743, b=-21.5733, unit=(u.deg, u.deg), - frame='galactic')] - - @remote_data -@pytest.mark.xfail(reason="Changed remote API, xfailing until fixing" - "https://github.com/astropy/astroquery/issues/725") class TestLco: - def test_query_object_meta(self): - response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_img') - assert response is not None - - def test_query_object_phot(self): - response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_cat') + def test_query_region_async(self): + response = lco.core.Lco.query_region_async( + "00h42m44.330s +41d16m07.50s") assert response is not None - - def test_query_region_cone_async(self): - response = lcogt.core.Lcogt.query_region_async( - 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - - assert response is not None - - def test_query_region_cone(self): - result = lcogt.core.Lcogt.query_region( - 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - assert isinstance(result, Table) - - def test_query_region_box_async(self): - response = lcogt.core.Lcogt.query_region_async( - "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', - width=2 * u.arcmin) - assert response is not None - - def test_query_region_box(self): - result = lcogt.core.Lcogt.query_region( - "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', - width=2 * u.arcmin) - assert isinstance(result, Table) - - def test_query_region_async_polygon(self): - polygon = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), - frame='icrs'), - SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), - frame='icrs'), - SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), - frame='icrs')] - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - assert response is not None - - def test_query_region_polygon(self): - polygon = [(10.1, 10.1), (10.0, 10.1), (10.0, 10.0)] - result = lcogt.core.Lcogt.query_region( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - - assert isinstance(result, Table) + assert isinstance(response, Table) diff --git a/astroquery/lcogt/__init__.py b/astroquery/lcogt/__init__.py deleted file mode 100644 index b398717e23..0000000000 --- a/astroquery/lcogt/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -""" -LCOGT public archive Query Tool -=============== - -This module contains various methods for querying -LCOGT data archive as hosted by IPAC. -""" -from astropy import config as _config -import warnings - -warnings.warn("The LCOGT archive API has been changed. While we aim to " - "accommodate the changes into astroqeury, pleased be advised " - "that this module is not working at the moment.") - - -class Conf(_config.ConfigNamespace): - """ - Configuration parameters for `astroquery.irsa`. - """ - - server = _config.ConfigItem( - 'http://lcogtarchive.ipac.caltech.edu/cgi-bin/Gator/nph-query', - 'Name of the LCOGT archive as hosted by IPAC to use.') - row_limit = _config.ConfigItem( - 500, - 'Maximum number of rows to retrieve in result') - - timeout = _config.ConfigItem( - 60, - 'Time limit for connecting to the LCOGT IPAC server.') - - -conf = Conf() - - -from .core import Lcogt, LcogtClass - -__all__ = ['Lcogt', 'LcogtClass', - 'Conf', 'conf', - ] diff --git a/astroquery/lcogt/core.py b/astroquery/lcogt/core.py deleted file mode 100644 index 7c4d986a46..0000000000 --- a/astroquery/lcogt/core.py +++ /dev/null @@ -1,441 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -""" -LCOGT -==== - -API from - -http://lcogtarchive.ipac.caltech.edu/docs/catsearch.html - -The URL of the LCOGT catalog query service, CatQuery, is - - http://lcogtarchive.ipac.caltech.edu/cgi-bin/Gator/nph-query - -The service accepts the following keywords, which are analogous to the search -fields on the Gator search form: - - -spatial Required Type of spatial query: Cone, Box, Polygon, and NONE - -polygon Convex polygon of ra dec pairs, separated by comma(,) - Required if spatial=polygon - -radius Cone search radius - Optional if spatial=Cone, otherwise ignore it - (default 10 arcsec) - -radunits Units of a Cone search: arcsec, arcmin, deg. - Optional if spatial=Cone - (default='arcsec') - -size Width of a box in arcsec - Required if spatial=Box. - -objstr Target name or coordinate of the center of a spatial - search center. Target names must be resolved by - SIMBAD or NED. - - Required only when spatial=Cone or spatial=Box. - - Examples: 'M31' - '00 42 44.3 -41 16 08' - '00h42m44.3s -41d16m08s' - -catalog Required Catalog name in the LCOGT Archive. The database of - photometry can be found using lco_cat and the - database of image metadata is found using lco_img. - -outfmt Optional Defines query's output format. - 6 - returns a program interface in XML - 3 - returns a VO Table (XML) - 2 - returns SVC message - 1 - returns an ASCII table - 0 - returns Gator Status Page in HTML (default) - -desc Optional Short description of a specific catalog, which will - appear in the result page. - -order Optional Results ordered by this column. - -selcols Optional Select specific columns to be returned. The default - action is to return all columns in the queried - catalog. To find the names of the columns in the - LCOGT Archive databases, please read Photometry - Table column descriptions - [http://lcogtarchive.ipac.caltech.edu/docs/lco_cat_dd.html] - and Image Table column descriptions - [http://lcogtarchive.ipac.caltech.edu/docs/lco_img_dd.html]. - -constraint Optional User defined query constraint(s) - Note: The constraint should follow SQL syntax. - -""" -from __future__ import print_function, division - -import warnings -import logging - -from astropy.extern import six -import astropy.units as u -import astropy.coordinates as coord -import astropy.io.votable as votable - -from ..query import BaseQuery -from ..utils import commons, async_to_sync -from . import conf -from ..exceptions import TableParseError, NoResultsWarning - -__all__ = ['Lcogt', 'LcogtClass'] - - -@async_to_sync -class LcogtClass(BaseQuery): - LCOGT_URL = conf.server - TIMEOUT = conf.timeout - ROW_LIMIT = conf.row_limit - - @property - def catalogs(self): - """ immutable catalog listing """ - return {'lco_cat': 'Photometry archive from LCOGT', - 'lco_img': 'Image metadata archive from LCOGT'} - - def query_object_async(self, objstr, catalog=None, cache=True, - get_query_payload=False): - """ - Serves the same function as `query_object`, but - only collects the response from the LCOGT IPAC archive and returns. - - Parameters - ---------- - objstr : str - name of object to be queried - catalog : str - name of the catalog to use. 'lco_img' for image meta data; - 'lco_cat' for photometry. - - Returns - ------- - response : `requests.Response` - Response of the query from the server - """ - if catalog is None: - raise ValueError("Catalogue name is required!") - if catalog not in self.catalogs: - raise ValueError("Catalog name must be one of {0}" - .format(self.catalogs)) - - request_payload = self._args_to_payload(catalog) - request_payload['objstr'] = objstr - if get_query_payload: - return request_payload - - response = self._request(method='GET', url=self.LCOGT_URL, - params=request_payload, timeout=self.TIMEOUT, - cache=cache) - return response - - def query_region_async(self, coordinates=None, catalog=None, - spatial='Cone', radius=10 * u.arcsec, width=None, - polygon=None, get_query_payload=False, cache=True, - ): - """ - This function serves the same purpose as - :meth:`~astroquery.irsa.LcogtClass.query_region`, but returns the raw - HTTP response rather than the results in a `~astropy.table.Table`. - - Parameters - ---------- - coordinates : str, `astropy.coordinates` object - Gives the position of the center of the cone or box if - performing a cone or box search. The string can give coordinates - in various coordinate systems, or the name of a source that will - be resolved on the server (see `here - `_ for more - details). Required if spatial is ``'Cone'`` or ``'Box'``. Optional - if spatial is ``'Polygon'``. - catalog : str - The catalog to be used. Either ``'lco_img'`` for image metadata or - ``'lco_cat'`` for photometry. - spatial : str - Type of spatial query: ``'Cone'``, ``'Box'``, ``'Polygon'``, and - ``'All-Sky'``. If missing then defaults to ``'Cone'``. - radius : str or `~astropy.units.Quantity` object, [optional for \\ - spatial is ``'Cone'``] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from - `astropy.units` may also be used. Defaults to 10 arcsec. - width : str, `~astropy.units.Quantity` object [Required for spatial \\ - is ``'Polygon'``.] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. - polygon : list, [Required for spatial is ``'Polygon'``] - A list of ``(ra, dec)`` pairs (as tuples), in decimal degrees, - outlining the polygon to search in. It can also be a list of - `astropy.coordinates` object or strings that can be parsed by - `astropy.coordinates.ICRS`. - get_query_payload : bool, optional - If `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 catalog is None: - raise ValueError("Catalogue name is required!") - if catalog not in self.catalogs: - raise ValueError("Catalog name must be one of {0}" - .format(self.catalogs)) - - request_payload = self._args_to_payload(catalog) - request_payload.update(self._parse_spatial(spatial=spatial, - coordinates=coordinates, - radius=radius, width=width, - polygon=polygon)) - - if get_query_payload: - return request_payload - response = self._request(method='GET', url=self.LCOGT_URL, - params=request_payload, timeout=self.TIMEOUT, - cache=cache) - return response - - def _parse_spatial(self, spatial, coordinates, radius=None, width=None, - polygon=None): - """ - Parse the spatial component of a query - - Parameters - ---------- - spatial : str - The type of spatial query. Must be one of: ``'Cone'``, ``'Box'``, - ``'Polygon'``, and ``'All-Sky'``. - coordinates : str, `astropy.coordinates` object - Gives the position of the center of the cone or box if - performing a cone or box search. The string can give coordinates - in various coordinate systems, or the name of a source that will - be resolved on the server (see `here - `_ for more - details). Required if spatial is ``'Cone'`` or ``'Box'``. Optional - if spatial is ``'Polygon'``. - radius : str or `~astropy.units.Quantity` object, [optional for spatial is ``'Cone'``] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. Defaults to 10 arcsec. - width : str, `~astropy.units.Quantity` object [Required for spatial is ``'Polygon'``.] - The string must be parsable by `~astropy.coordinates.Angle`. The - appropriate `~astropy.units.Quantity` object from `astropy.units` - may also be used. - polygon : list, [Required for spatial is ``'Polygon'``] - A list of ``(ra, dec)`` pairs as tuples of - `astropy.coordinates.Angle`s outlining the polygon to search in. - It can also be a list of `astropy.coordinates` object or strings - that can be parsed by `astropy.coordinates.ICRS`. - - Returns - ------- - payload_dict : dict - """ - - request_payload = {} - - if spatial == 'All-Sky': - spatial = 'NONE' - elif spatial in ['Cone', 'Box']: - if not commons._is_coordinate(coordinates): - request_payload['objstr'] = coordinates - else: - request_payload['objstr'] = _parse_coordinates(coordinates) - if spatial == 'Cone': - radius = _parse_dimension(radius) - request_payload['radius'] = radius.value - request_payload['radunits'] = radius.unit.to_string() - else: - width = _parse_dimension(width) - request_payload['size'] = width.to(u.arcsec).value - elif spatial == 'Polygon': - if coordinates is not None: - request_payload['objstr'] = ( - coordinates if not commons._is_coordinate(coordinates) - else _parse_coordinates(coordinates)) - try: - coordinates_list = [_parse_coordinates(c) for c in polygon] - except (ValueError, TypeError): - coordinates_list = [_format_decimal_coords(*_pair_to_deg(pair)) - for pair in polygon] - request_payload['polygon'] = ','.join(coordinates_list) - else: - raise ValueError("Unrecognized spatial query type. " - "Must be one of `Cone`, `Box`, " - "`Polygon`, or `All-Sky`.") - - request_payload['spatial'] = spatial - - return request_payload - - def _args_to_payload(self, catalog): - """ - Sets the common parameters for all cgi -queries - - Parameters - ---------- - catalog : str - The name of the catalog to query. - - Returns - ------- - request_payload : dict - """ - request_payload = dict(catalog=catalog, - outfmt=3, - spatial=None, - outrows=Lcogt.ROW_LIMIT) - return request_payload - - def _parse_result(self, response, verbose=False): - """ - Parses the results form the HTTP response to `~astropy.table.Table`. - - Parameters - ---------- - response : `requests.Response` - The HTTP response object - verbose : bool, optional - Defaults to `False`. When true it will display warnings whenever - the VOtable returned from the Service doesn't conform to the - standard. - - Returns - ------- - table : `~astropy.table.Table` - """ - if not verbose: - commons.suppress_vo_warnings() - - content = response.text - logging.debug(content) - - # Check if results were returned - if 'The catalog is not in the list' in content: - raise Exception("Catalogue not found") - - # Check that object name was not malformed - if 'Either wrong or missing coordinate/object name' in content: - raise Exception("Malformed coordinate/object name") - - # Check that the results are not of length zero - if len(content) == 0: - raise Exception("The LCOGT server sent back an empty reply") - - # Read it in using the astropy VO table reader - try: - first_table = votable.parse(six.BytesIO(response.content), - pedantic=False).get_first_table() - except Exception as ex: - self.response = response - self.table_parse_error = ex - raise TableParseError("Failed to parse LCOGT votable! The raw " - " response can be found in self.response," - " and the error in self.table_parse_error.") - - # Convert to astropy.table.Table instance - table = first_table.to_table() - - # Check if table is empty - if len(table) == 0: - warnings.warn("Query returned no results, so the table will " - "be empty", NoResultsWarning) - - return table - - def list_catalogs(self): - """ - Return a dictionary of the catalogs in the LCOGT Gator tool. - - Returns - ------- - catalogs : dict - A dictionary of catalogs where the key indicates the catalog - name to be used in query functions, and the value is the verbose - description of the catalog. - """ - return self.catalogs - - def print_catalogs(self): - """ - Display a table of the catalogs in the LCOGT Gator tool. - """ - for catname in self.catalogs: - print("{:30s} {:s}".format(catname, self.catalogs[catname])) - - -Lcogt = LcogtClass() - - -def _parse_coordinates(coordinates): - # borrowed from commons.parse_coordinates as from_name wasn't required - # in this case - if isinstance(coordinates, six.string_types): - try: - c = coord.SkyCoord(coordinates, frame='icrs') - warnings.warn("Coordinate string is being interpreted as an " - "ICRS coordinate.") - except u.UnitsError as ex: - warnings.warn("Only ICRS coordinates can be entered as strings\n" - "For other systems please use the appropriate " - "astropy.coordinates object") - raise ex - elif isinstance(coordinates, commons.CoordClasses): - c = coordinates - else: - raise TypeError("Argument cannot be parsed as a coordinate") - c_icrs = c.transform_to(coord.ICRS) - formatted_coords = _format_decimal_coords(c_icrs.ra.degree, - c_icrs.dec.degree) - return formatted_coords - - -def _pair_to_deg(pair): - """ - Turn a pair of floats, Angles, or Quantities into pairs of float degrees. - """ - - # unpack - lon, lat = pair - - if hasattr(lon, 'degree') and hasattr(lat, 'degree'): - pair = (lon.degree, lat.degree) - elif hasattr(lon, 'to') and hasattr(lat, 'to'): - pair = [lon, lat] - for ii, ang in enumerate((lon, lat)): - if ang.unit.is_equivalent(u.degree): - pair[ii] = ang.to(u.degree).value - else: - warnings.warn("Polygon endpoints are being interpreted as RA/Dec " - "pairs specified in decimal degree units.") - return tuple(pair) - - -def _format_decimal_coords(ra, dec): - """ - Print *decimal degree* RA/Dec values in an IPAC-parseable form - """ - return '{0} {1:+}'.format(ra, dec) - - -def _parse_dimension(dim): - if (isinstance(dim, u.Quantity) and - dim.unit in u.deg.find_equivalent_units()): - if dim.unit not in ['arcsec', 'arcmin', 'deg']: - dim = dim.to(u.degree) - # otherwise must be an Angle or be specified in hours... - else: - try: - new_dim = coord.Angle(dim) - dim = u.Quantity(new_dim.degree, u.Unit('degree')) - except (u.UnitsError, coord.errors.UnitsError, AttributeError): - raise u.UnitsError("Dimension not in proper units") - return dim diff --git a/astroquery/lcogt/tests/__init__.py b/astroquery/lcogt/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/astroquery/lcogt/tests/data/Box.xml b/astroquery/lcogt/tests/data/Box.xml deleted file mode 100644 index 063788931a..0000000000 --- a/astroquery/lcogt/tests/data/Box.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.78500.19300.97800
-
-
diff --git a/astroquery/lcogt/tests/data/Cone.xml b/astroquery/lcogt/tests/data/Cone.xml deleted file mode 100644 index d9d8537846..0000000000 --- a/astroquery/lcogt/tests/data/Cone.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.169298237.8886720.78500.19300.97800
-
-
diff --git a/astroquery/lcogt/tests/data/Cone_coord.xml b/astroquery/lcogt/tests/data/Cone_coord.xml deleted file mode 100644 index 97a1c67d8e..0000000000 --- a/astroquery/lcogt/tests/data/Cone_coord.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.68473741.26903500h42m44.34s41d16m08.53s0.080.078700424433+41160859.4530.0510.0525385.68.6680.0500.0515089.98.4750.0500.0513684.8EEE22211100055665520n1997-10-248121.174-21.573000.12843098.0560100.78500.19300.97800
-
-
diff --git a/astroquery/lcogt/tests/data/Polygon.xml b/astroquery/lcogt/tests/data/Polygon.xml deleted file mode 100644 index 3c0f7cfedd..0000000000 --- a/astroquery/lcogt/tests/data/Polygon.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10.01569610.09922800h40m03.77s10d05m57.22s0.100.079000400376+100557215.2370.0520.05428.014.6350.0660.06722.414.4810.0940.09514.6AAA22211100066350500n2000-09-2164118.312-52.670U0.225019.2017.2010.60200.15400.75600
10.03101610.06308200h40m07.44s10d03m47.10s0.190.1811400400744+100347016.4120.1170.1179.515.6030.1100.1109.215.3120.1580.1586.8BBC22211100006060600n2000-09-2164118.332-52.707U0.67319.9018.6010.80900.29101.10001
10.03677610.06027800h40m08.83s10d03m37.00s0.110.069000400882+100337015.3540.0450.04625.214.8860.0730.07317.814.5140.0890.08914.2AAA22211100066260600n2000-09-2164118.341-52.711U0.55018.4017.0010.46800.37200.84002
10.05996410.08544500h40m14.39s10d05m07.60s0.230.209600401439+100507616.3400.1030.10410.215.6430.1310.1318.815.3700.1730.1736.4ABC22211100016060500n2000-09-2164118.382-52.687U0.69819.4018.5010.69700.27300.97003
10.01583910.03806100h40m03.80s10d02m17.02s0.090.069000400380+100217014.6620.0260.02947.614.1100.0390.04036.313.7970.0500.05127.4AAA22211100066666600n2000-09-2164118.305-52.731000.55200.31300.86504
10.01117010.09390300h40m02.68s10d05m38.05s0.230.2116700400268+100538016.3730.1260.1279.815.9950.1690.1696.415.3930.1790.1796.3BCC22211100006060500n2000-09-2164118.304-52.675U2.411119.7018.5010.37800.60200.98005
10.00554910.01840100h40m01.33s10d01m06.24s0.160.1410800400133+100106216.1730.0970.09811.815.5110.1350.13510.014.9450.1120.1139.5ABB22211100016160600n2000-09-2164118.286-52.750000.66200.56601.22806
-
-
diff --git a/astroquery/lcogt/tests/setup_package.py b/astroquery/lcogt/tests/setup_package.py deleted file mode 100644 index 539b55e840..0000000000 --- a/astroquery/lcogt/tests/setup_package.py +++ /dev/null @@ -1,10 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -from __future__ import absolute_import - -import os - - -def get_package_data(): - paths = [os.path.join('data', '*.xml'), - ] - return {'astroquery.lcogt.tests': paths} diff --git a/astroquery/lcogt/tests/test_lcogt.py b/astroquery/lcogt/tests/test_lcogt.py deleted file mode 100644 index a68dc9df9b..0000000000 --- a/astroquery/lcogt/tests/test_lcogt.py +++ /dev/null @@ -1,177 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -from __future__ import print_function -import os -import re -import numpy as np - -import pytest -from astropy.table import Table -from astropy.coordinates import SkyCoord -import astropy.units as u - -from ...utils.testing_tools import MockResponse -from ...utils import commons -from ... import lcogt -from ...lcogt import conf - -DATA_FILES = {'Cone': 'Cone.xml', - 'Box': 'Box.xml', - 'Polygon': 'Polygon.xml'} - -OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", - commons.GalacticCoordGenerator(l=121.1743, b=-21.5733, - unit=(u.deg, u.deg))] - - -def data_path(filename): - data_dir = os.path.join(os.path.dirname(__file__), 'data') - return os.path.join(data_dir, filename) - - -@pytest.fixture -def patch_get(request): - try: - mp = request.getfixturevalue("monkeypatch") - except AttributeError: # pytest < 3 - mp = request.getfuncargvalue("monkeypatch") - mp.setattr(lcogt.core.Lcogt, '_request', get_mockreturn) - return mp - - -def get_mockreturn(method, url, params=None, timeout=10, cache=True, **kwargs): - filename = data_path(DATA_FILES[params['spatial']]) - content = open(filename, 'rb').read() - return MockResponse(content, **kwargs) - - -@pytest.mark.parametrize(('dim'), - ['5d0m0s', 0.3 * u.rad, '5h0m0s', 2 * u.arcmin]) -def test_parse_dimension(dim): - # check that the returned dimension is always in units of 'arcsec', - # 'arcmin' or 'deg' - new_dim = lcogt.core._parse_dimension(dim) - assert new_dim.unit in ['arcsec', 'arcmin', 'deg'] - - -@pytest.mark.parametrize(('ra', 'dec', 'expected'), - [(10, 10, '10 +10'), - (10.0, -11, '10.0 -11') - ]) -def test_format_decimal_coords(ra, dec, expected): - out = lcogt.core._format_decimal_coords(ra, dec) - assert out == expected - - -@pytest.mark.parametrize(('coordinates', 'expected'), - [("5h0m0s 0d0m0s", "75.0 +0.0") - ]) -def test_parse_coordinates(coordinates, expected): - out = lcogt.core._parse_coordinates(coordinates) - for a, b in zip(out.split(), expected.split()): - try: - a = float(a) - b = float(b) - np.testing.assert_almost_equal(a, b) - except ValueError: - assert a == b - - -def test_args_to_payload(): - out = lcogt.core.Lcogt._args_to_payload("lco_img") - assert out == dict(catalog='lco_img', outfmt=3, - outrows=conf.row_limit, spatial=None) - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone_async(coordinates, patch_get): - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', - radius=2 * u.arcmin, get_query_payload=True) - assert response['radius'] == 2 - assert response['radunits'] == 'arcmin' - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - assert response is not None - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone(coordinates, patch_get): - result = lcogt.core.Lcogt.query_region(coordinates, catalog='lco_img', - spatial='Cone', radius=2 * u.arcmin) - - assert isinstance(result, Table) - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box_async(coordinates, patch_get): - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Box', - width=2 * u.arcmin, get_query_payload=True) - assert response['size'] == 120 - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Box', width=2 * u.arcmin) - assert response is not None - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box(coordinates, patch_get): - result = lcogt.core.Lcogt.query_region(coordinates, catalog='lco_img', - spatial='Box', width=2 * u.arcmin) - - assert isinstance(result, Table) - - -poly1 = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), frame='icrs')] -poly2 = [(10.1 * u.deg, 10.1 * u.deg), (10.0 * u.deg, 10.1 * u.deg), - (10.0 * u.deg, 10.0 * u.deg)] - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2 - ]) -def test_query_region_async_polygon(polygon, patch_get): - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", - polygon=polygon, get_query_payload=True) - - for a, b in zip(re.split("[ ,]", response["polygon"]), - re.split("[ ,]", "10.1 +10.1,10.0 +10.1,10.0 +10.0")): - for a1, b1 in zip(a.split(), b.split()): - a1 = float(a1) - b1 = float(b1) - np.testing.assert_almost_equal(a1, b1) - - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - - assert response is not None - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2, - ]) -def test_query_region_polygon(polygon, patch_get): - result = lcogt.core.Lcogt.query_region( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - assert isinstance(result, Table) - - -@pytest.mark.parametrize(('spatial', 'result'), - zip(('Cone', 'Box', 'Polygon', 'All-Sky'), - ('Cone', 'Box', 'Polygon', 'NONE'))) -def test_spatial_valdi(spatial, result): - out = lcogt.core.Lcogt._parse_spatial( - spatial, coordinates='m31', radius=5 * u.deg, width=5 * u.deg, - polygon=[(5 * u.hour, 5 * u.deg)] * 3) - assert out['spatial'] == result - - -@pytest.mark.parametrize(('spatial'), [('cone', 'box', 'polygon', 'all-Sky', - 'All-sky', 'invalid', 'blah')]) -def test_spatial_invalid(spatial): - with pytest.raises(ValueError): - lcogt.core.Lcogt._parse_spatial(spatial, coordinates='m31') diff --git a/astroquery/lcogt/tests/test_lcogt_remote.py b/astroquery/lcogt/tests/test_lcogt_remote.py deleted file mode 100644 index 84d278ff9e..0000000000 --- a/astroquery/lcogt/tests/test_lcogt_remote.py +++ /dev/null @@ -1,74 +0,0 @@ -# Licensed under a 3-clause BSD style license - see LICENSE.rst -from __future__ import print_function - -import imp -import pytest -import requests - -from astropy.tests.helper import remote_data -from astropy.table import Table -from astropy.coordinates import SkyCoord -import astropy.units as u - -from ... import lcogt - -imp.reload(requests) - -OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", - SkyCoord(l=121.1743, b=-21.5733, unit=(u.deg, u.deg), - frame='galactic')] - - -@remote_data -@pytest.mark.skip(reason="Changed remote API, xfailing until fixing" - "https://github.com/astropy/astroquery/issues/725") -class TestLcogt: - - def test_query_object_meta(self): - response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_img') - assert response is not None - - def test_query_object_phot(self): - response = lcogt.core.Lcogt.query_object_async('M1', catalog='lco_cat') - assert response is not None - - def test_query_region_cone_async(self): - response = lcogt.core.Lcogt.query_region_async( - 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - - assert response is not None - - def test_query_region_cone(self): - result = lcogt.core.Lcogt.query_region( - 'm31', catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - assert isinstance(result, Table) - - def test_query_region_box_async(self): - response = lcogt.core.Lcogt.query_region_async( - "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', - width=2 * u.arcmin) - assert response is not None - - def test_query_region_box(self): - result = lcogt.core.Lcogt.query_region( - "00h42m44.330s +41d16m07.50s", catalog='lco_img', spatial='Box', - width=2 * u.arcmin) - assert isinstance(result, Table) - - def test_query_region_async_polygon(self): - polygon = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), - frame='icrs'), - SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), - frame='icrs'), - SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), - frame='icrs')] - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - assert response is not None - - def test_query_region_polygon(self): - polygon = [(10.1, 10.1), (10.0, 10.1), (10.0, 10.0)] - result = lcogt.core.Lcogt.query_region( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - - assert isinstance(result, Table) From cfc5bc975da9ed2f7c5685b7dd9bc49de9b9e430 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 09:53:18 +0100 Subject: [PATCH 07/10] Updating tests --- astroquery/lco/tests/setup_package.py | 2 +- astroquery/lco/tests/test_lco.py | 45 ++++++++------------------- 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/astroquery/lco/tests/setup_package.py b/astroquery/lco/tests/setup_package.py index 15d0e6352e..8c29570ef0 100644 --- a/astroquery/lco/tests/setup_package.py +++ b/astroquery/lco/tests/setup_package.py @@ -5,6 +5,6 @@ def get_package_data(): - paths = [os.path.join('data', '*.xml'), + paths = [os.path.join('data', '*.json'), ] return {'astroquery.lco.tests': paths} diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py index 3f3d8aaea6..5e8f3c1ab1 100644 --- a/astroquery/lco/tests/test_lco.py +++ b/astroquery/lco/tests/test_lco.py @@ -14,10 +14,15 @@ from ... import lco from ...lco import conf -OBJ_LIST = ["M15", "00h42m44.330s +41d16m07.50s", +OBJ_LIST = ["00h42m44.330s +41d16m07.50s", commons.GalacticCoordGenerator(l=121.1743, b=-21.5733, unit=(u.deg, u.deg))] +DATA_FILES = {'JSON':'response.json'} + +def data_path(filename): + data_dir = os.path.join(os.path.dirname(__file__), 'data') + return os.path.join(data_dir, filename) @pytest.fixture def patch_get(request): @@ -30,7 +35,7 @@ def patch_get(request): def get_mockreturn(method, url, params=None, timeout=10, cache=True, **kwargs): - filename = data_path(DATA_FILES[params['spatial']]) + filename = data_path(DATA_FILES[params['JSON']]) content = open(filename, 'rb').read() return MockResponse(content, **kwargs) @@ -67,38 +72,14 @@ def test_parse_coordinates(coordinates, expected): assert a == b -def test_args_to_payload(): - out = lco.core.Lco._args_to_payload("lco_img") - assert out == dict(catalog='lco_img', outfmt=3, - outrows=conf.row_limit, spatial=None) - - @pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone_async(coordinates, patch_get): +def test_query_region_async(coordinates, patch_get): response = lco.core.Lco.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', - radius=2 * u.arcmin, get_query_payload=True) - assert response['radius'] == 2 - assert response['radunits'] == 'arcmin' - response = lco.core.Lco.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) + coordinates, get_query_payload=True) assert response is not None - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone(coordinates, patch_get): - result = lco.core.Lco.query_region(coordinates, catalog='lco_img', - spatial='Cone', radius=2 * u.arcmin) - - assert isinstance(result, Table) - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box_async(coordinates, patch_get): - response = lco.core.Lco.query_region_async( - coordinates, catalog='lco_img', spatial='Box', - width=2 * u.arcmin, get_query_payload=True) - assert response['size'] == 120 - response = lco.core.Lco.query_region_async( - coordinates, catalog='lco_img', spatial='Box', width=2 * u.arcmin) +@pytest.mark.parametrize(("object_name"), "M15") +def test_query_object_async(object_name, patch_get): + response = lco.core.Lco.query_object_async( + object_name, get_query_payload=True) assert response is not None From 2a881095bdcd73833d3ab1cc958e117a1fc3d75d Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 21:23:33 +0100 Subject: [PATCH 08/10] removing obsolete tests --- astroquery/lco/tests/test_lco.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py index 5e8f3c1ab1..195d23127e 100644 --- a/astroquery/lco/tests/test_lco.py +++ b/astroquery/lco/tests/test_lco.py @@ -40,38 +40,6 @@ def get_mockreturn(method, url, params=None, timeout=10, cache=True, **kwargs): return MockResponse(content, **kwargs) -@pytest.mark.parametrize(('dim'), - ['5d0m0s', 0.3 * u.rad, '5h0m0s', 2 * u.arcmin]) -def test_parse_dimension(dim): - # check that the returned dimension is always in units of 'arcsec', - # 'arcmin' or 'deg' - new_dim = lco.core._parse_dimension(dim) - assert new_dim.unit in ['arcsec', 'arcmin', 'deg'] - - -@pytest.mark.parametrize(('ra', 'dec', 'expected'), - [(10, 10, '10 +10'), - (10.0, -11, '10.0 -11') - ]) -def test_format_decimal_coords(ra, dec, expected): - out = lco.core._format_decimal_coords(ra, dec) - assert out == expected - - -@pytest.mark.parametrize(('coordinates', 'expected'), - [("5h0m0s 0d0m0s", "75.0 +0.0") - ]) -def test_parse_coordinates(coordinates, expected): - out = lco.core._parse_coordinates(coordinates) - for a, b in zip(out.split(), expected.split()): - try: - a = float(a) - b = float(b) - np.testing.assert_almost_equal(a, b) - except ValueError: - assert a == b - - @pytest.mark.parametrize(("coordinates"), OBJ_LIST) def test_query_region_async(coordinates, patch_get): response = lco.core.Lco.query_region_async( From bf23071a5f48e1b656a3dd8b93a99997ea02803b Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 21:46:03 +0100 Subject: [PATCH 09/10] Adding missing helper classes --- astroquery/lco/core.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/astroquery/lco/core.py b/astroquery/lco/core.py index 0b38c26d91..57799a3aff 100644 --- a/astroquery/lco/core.py +++ b/astroquery/lco/core.py @@ -270,6 +270,22 @@ def _parse_result(self, response, verbose=False): return t + def _parse_response(self, request_payload, cache): + if not self.TOKEN: + warnings.warn("You have not authenticated and will only get results for non-proprietary data") + headers=None + else: + headers = {'Authorization': 'Token ' + self.TOKEN} + + response = self._request('GET', self.FRAMES_URL, params=request_payload, + timeout=self.TIMEOUT, cache=cache, headers=headers) + if response.status_code == 200: + resp = json.loads(response.content) + return self._parse_result(resp) + else: + log.exception("Failed!") + return False + Lco = LcoClass() @@ -281,3 +297,21 @@ def validate_datetime(input): except ValueError: warning.warning('Input {} is not in format {} - ignoring input'.format(input, format_string)) return '' + +def validate_rlevel(input): + excepted_vals = ['0','00','11','91'] + if str(input) in excepted_vals: + return input + else: + warning.warning('Input {} is not one of {} - ignoring'.format(input,','.join(excepted_vals))) + return '' + +def validate_coordinates(coordinates): + c = commons.parse_coordinates(coordinates) + if c.frame.name == 'galactic': + coords = "POINT({} {})".format(c.icrs.ra.degree, c.icrs.dec.degree) + # for any other, convert to ICRS and send + else: + ra, dec = commons.coord_to_radec(c) + coords = "POINT({} {})".format(ra, dec) + return coords From beb4453452a6e093c66860903de6407e74a58d34 Mon Sep 17 00:00:00 2001 From: Edward Gomez Date: Wed, 13 Jun 2018 21:49:26 +0100 Subject: [PATCH 10/10] refixing problems from merge conflict --- astroquery/lco/tests/test_lco.py | 146 +++---------------------------- 1 file changed, 11 insertions(+), 135 deletions(-) diff --git a/astroquery/lco/tests/test_lco.py b/astroquery/lco/tests/test_lco.py index f21dfc1ea4..195d23127e 100644 --- a/astroquery/lco/tests/test_lco.py +++ b/astroquery/lco/tests/test_lco.py @@ -14,164 +14,40 @@ from ... import lco from ...lco import conf -DATA_FILES = {'Cone': 'Cone.xml', - 'Box': 'Box.xml', - 'Polygon': 'Polygon.xml'} - -OBJ_LIST = ["m31", "00h42m44.330s +41d16m07.50s", +OBJ_LIST = ["00h42m44.330s +41d16m07.50s", commons.GalacticCoordGenerator(l=121.1743, b=-21.5733, unit=(u.deg, u.deg))] +DATA_FILES = {'JSON':'response.json'} def data_path(filename): data_dir = os.path.join(os.path.dirname(__file__), 'data') return os.path.join(data_dir, filename) - @pytest.fixture def patch_get(request): try: mp = request.getfixturevalue("monkeypatch") except AttributeError: # pytest < 3 mp = request.getfuncargvalue("monkeypatch") - mp.setattr(lcogt.core.Lcogt, '_request', get_mockreturn) + mp.setattr(lco.core.Lco, '_request', get_mockreturn) return mp def get_mockreturn(method, url, params=None, timeout=10, cache=True, **kwargs): - filename = data_path(DATA_FILES[params['spatial']]) + filename = data_path(DATA_FILES[params['JSON']]) content = open(filename, 'rb').read() return MockResponse(content, **kwargs) -@pytest.mark.parametrize(('dim'), - ['5d0m0s', 0.3 * u.rad, '5h0m0s', 2 * u.arcmin]) -def test_parse_dimension(dim): - # check that the returned dimension is always in units of 'arcsec', - # 'arcmin' or 'deg' - new_dim = lcogt.core._parse_dimension(dim) - assert new_dim.unit in ['arcsec', 'arcmin', 'deg'] - - -@pytest.mark.parametrize(('ra', 'dec', 'expected'), - [(10, 10, '10 +10'), - (10.0, -11, '10.0 -11') - ]) -def test_format_decimal_coords(ra, dec, expected): - out = lcogt.core._format_decimal_coords(ra, dec) - assert out == expected - - -@pytest.mark.parametrize(('coordinates', 'expected'), - [("5h0m0s 0d0m0s", "75.0 +0.0") - ]) -def test_parse_coordinates(coordinates, expected): - out = lcogt.core._parse_coordinates(coordinates) - for a, b in zip(out.split(), expected.split()): - try: - a = float(a) - b = float(b) - np.testing.assert_almost_equal(a, b) - except ValueError: - assert a == b - - -def test_args_to_payload(): - out = lcogt.core.Lcogt._args_to_payload("lco_img") - assert out == dict(catalog='lco_img', outfmt=3, - outrows=conf.row_limit, spatial=None) - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone_async(coordinates, patch_get): - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', - radius=2 * u.arcmin, get_query_payload=True) - assert response['radius'] == 2 - assert response['radunits'] == 'arcmin' - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Cone', radius=2 * u.arcmin) - assert response is not None - - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_cone(coordinates, patch_get): - result = lcogt.core.Lcogt.query_region(coordinates, catalog='lco_img', - spatial='Cone', radius=2 * u.arcmin) - - assert isinstance(result, Table) - - @pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box_async(coordinates, patch_get): - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Box', - width=2 * u.arcmin, get_query_payload=True) - assert response['size'] == 120 - response = lcogt.core.Lcogt.query_region_async( - coordinates, catalog='lco_img', spatial='Box', width=2 * u.arcmin) +def test_query_region_async(coordinates, patch_get): + response = lco.core.Lco.query_region_async( + coordinates, get_query_payload=True) assert response is not None - -@pytest.mark.parametrize(("coordinates"), OBJ_LIST) -def test_query_region_box(coordinates, patch_get): - result = lcogt.core.Lcogt.query_region(coordinates, catalog='lco_img', - spatial='Box', width=2 * u.arcmin) - - assert isinstance(result, Table) - - -poly1 = [SkyCoord(ra=10.1, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.1, unit=(u.deg, u.deg), frame='icrs'), - SkyCoord(ra=10.0, dec=10.0, unit=(u.deg, u.deg), frame='icrs')] -poly2 = [(10.1 * u.deg, 10.1 * u.deg), (10.0 * u.deg, 10.1 * u.deg), - (10.0 * u.deg, 10.0 * u.deg)] - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2 - ]) -def test_query_region_async_polygon(polygon, patch_get): - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", - polygon=polygon, get_query_payload=True) - - for a, b in zip(re.split("[ ,]", response["polygon"]), - re.split("[ ,]", "10.1 +10.1,10.0 +10.1,10.0 +10.0")): - for a1, b1 in zip(a.split(), b.split()): - a1 = float(a1) - b1 = float(b1) - np.testing.assert_almost_equal(a1, b1) - - response = lcogt.core.Lcogt.query_region_async( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - +@pytest.mark.parametrize(("object_name"), "M15") +def test_query_object_async(object_name, patch_get): + response = lco.core.Lco.query_object_async( + object_name, get_query_payload=True) assert response is not None - - -@pytest.mark.parametrize(("polygon"), - [poly1, - poly2, - ]) -def test_query_region_polygon(polygon, patch_get): - result = lcogt.core.Lcogt.query_region( - "m31", catalog="lco_img", spatial="Polygon", polygon=polygon) - assert isinstance(result, Table) - - -@pytest.mark.parametrize(('spatial', 'result'), - zip(('Cone', 'Box', 'Polygon', 'All-Sky'), - ('Cone', 'Box', 'Polygon', 'NONE'))) -def test_spatial_valdi(spatial, result): - out = lcogt.core.Lcogt._parse_spatial( - spatial, coordinates='m31', radius=5 * u.deg, width=5 * u.deg, - polygon=[(5 * u.hour, 5 * u.deg)] * 3) - assert out['spatial'] == result - - -@pytest.mark.parametrize(('spatial'), [('cone', 'box', 'polygon', 'all-Sky', - 'All-sky', 'invalid', 'blah')]) -def test_spatial_invalid(spatial): - with pytest.raises(ValueError): - lcogt.core.Lcogt._parse_spatial(spatial, coordinates='m31')