Source code for lcc.db_tier.connectors.corot_archive

from __future__ import division

import cStringIO
import collections
import os
import pyfits
import requests
import warnings

from lcc.db_tier.base_query import LightCurvesDb
from lcc.db_tier.vizier_tap_base import VizierTapBase
from lcc.entities.light_curve import LightCurve
import numpy as np
from lcc.utils.data_analysis import to_ekvi_PAA


[docs]class CorotBrightArchive(VizierTapBase, LightCurvesDb): ''' CoRoT connector. TAP query and downloading of the light curve fits are executed on Vizier catalog. It inherits `VizierTapBase` - see documentation of this class to class attributes description. As for all TAP queries it is possible to use "<" and ">" marks (for example {"CoRot":">2.5}). EXAMPLES --------- queries = [{"ra": 102.707, "dec": -0.54089, "delta": 10}, {"CoRot": 116}] client = StarsProvider.getProvider(obtain_method="CorotBrightArchive", obtain_params=queries) stars = client.getStarsWithCurves(max_bins=10000) ''' LC_URL = "http://vizier.u-strasbg.fr/viz-bin/nph-Cat?-plus=-%2b&B/corot/files/" TABLE = "B/corot/Bright_star" NAME = "{Star}" LC_FILE = "FileName" LC_META = {"xlabel": "Terrestrial time", "xlabel_unit": "days", "ylabel": "Flux", "ylabel_unit": "Electrons per second", "color": "No", "origin": "CoRoT", "invert_yaxis": False} IDENT_MAP = collections.OrderedDict( (("VizierDb", "Star"), ("CorotBrightArchive", "CoRoT"))) MORE_MAP = collections.OrderedDict((("(B-V)", "b_v_mag"), ("SpT", "spectral_type"), ("Vmag", "v_mag"), ("VMAG", "abs_v_mag"), ("Teff", "temp"))) def _getLightCurve(self, file_name, max_bins=1e3, *args, **kwargs): """ Obtain light curve Parameters ----------- file_name : str Path to the light curve file from root url max_bins : int Maximal number of dimension of the light curve Returns -------- Tuple of times, magnitudes, errors lists """ EXT_NUM = 2 warnings.warn('''COROT: Downloading super huge light curves from this database can take few minutes...''') response = requests.get(os.path.join(self.LC_URL, file_name)) lcs = [] with pyfits.open(cStringIO.StringIO(response.content)) as f: for extension in f[1:EXT_NUM]: raw_lc = self._createFromExtension(extension, max_bins) if raw_lc: lcs.append(LightCurve(raw_lc, self.LC_META)) return lcs def _createFromExtension(self, extension, max_bins): time = [] mag = [] err = [] error_occured = False for line in extension.data: try: time.append(line[self.TIME_COL]) mag.append(line[self.MAG_COL]) err.append(line[self.ERR_COL] / self.ERR_MAG_RATIO) # Case of no lc except IndexError: error_occured = True if error_occured: if len(time) == len(mag) and len(time) > 0: if not err or len(err) != len(time): err = np.zeros(len(time)) else: return None if len(time) > max_bins: red_time, red_mag = to_ekvi_PAA(time, mag, bins=max_bins) red_time, red_err = to_ekvi_PAA(time, err, bins=max_bins) else: return time, mag, err return red_time, red_mag, red_err
[docs]class CorotFaintArchive(CorotBrightArchive): """ Corot archive of faint stars Examples --------- queries = [ { "Corot" : "102706554"}, {"ra": 100.94235, "dec" : -00.89651, "delta" : 10}] client = StarsProvider().getProvider( obtain_method = "CorotFaintArchive", obtain_params = queries) stars = client.getStarsWithCurves(max_bins = 10000 ) """ TABLE = "B/corot/Faint_star" IDENT_MAP = {"CorotFaintArchive": "CoRoT"} NAME = "CoRoT" MORE_MAP = collections.OrderedDict((("SpT", "spectral_type"), ("Vmag", "v_mag"), ("Rmag", "r_mag"), ("Bmag", "b_mag"), ("Imag", "i_mag"), ("Gmean", "g_mag"))) LC_META = {"xlabel": "Barycentric time", "xlabel_unit": "julian days", "ylabel": "Flux", "ylabel_unit": "Electrons per 32 second", "color": "R", "invert_yaxis": False} TIME_COL = 2 MAG_COL = 4 ERR_COL = 5 ERR_MAG_RATIO = 16.