Source code for lcc.api.stars_handling

import os
import random

from lcc.data_manager.status_resolver import StatusResolver
from lcc.db_tier.stars_provider import StarsProvider
from lcc.entities.exceptions import QueryInputError
from lcc.utils.helpers import progressbar


[docs]def getStars(queries, lcs_fold, query_path=None, progb_txt="Querying stars: "): """ Get stars from query text. According to format of the query text different methods are called. 1.QUERY:db_name:query_file_in_inputs_folder --> Remote database is queried (db key is name of connector class) 2.stars_folder_key:number or stars_folder_key:float_number or stars_folder_key --> Light curves from folder according to first key is loaded (according to settings.STARS_PATH dictionary). All stars are loaded if there is no number and ':', in case of integer after ':' just this number of stars are loaded and if there are float number after ':' this percentage number of all stars are loaded. """ ORDINARY_QUERY_KEY = "QUERY:" stars = [] for query in progressbar(queries, progb_txt): query = query.strip() if query.startswith(ORDINARY_QUERY_KEY): stars += getStarsFromRemoteDb( query[len(ORDINARY_QUERY_KEY):], query_path) else: stars += getStarsFromFolder(query, lcs_fold) if not stars: raise QueryInputError("There no stars. Your query: %s" % queries) return stars
[docs]def getStarsFromFolder(single_path, lcs_fold): """ Get stars from folder/s. If path is iterable (case that more folders were given, light curves from that all folder will be loaded Parameters ----------- single_path : str Name of the folder of lightcurves from "light_curve" directory (specified in settings). Returns -------- stars : List of Star objects Stars from the folder """ p, restr = _check_sample_name(single_path) try: st = StarsProvider().getProvider( "FileManager", {"path": os.path.join(lcs_fold, p)}).getStarsWithCurves() stars = _split_stars(st, restr) except KeyError: raise IOError("\n\nThere no folder with light curves named %s." % (p)) if not stars: raise Exception( "There are no stars in path with given restriction %s " % single_path) random.shuffle(stars) return stars
[docs]def getStarsFromRemoteDb(query, query_path): """ This method parsing the query text in order to return desired stars from remote database. Parameters ----------- query : str Query text contains db_key and query file separated by ':' Returns -------- List of Star objects Example ------- _getStarsFromRemoteDb("OgleII:query_file.txt") --> [Star objects] query_file.txt: #starid;field;target 1;1;lmc 10;1;smc """ try: db_key, query_file = query.split(":") except: QueryInputError( "Key for resolving stars source was not recognized:\n%s" % query) queries = StatusResolver( os.path.join(query_path, query_file)).getQueries() stars = [] for query in progressbar(queries, "Querying stars: "): starsProvider = StarsProvider().getProvider(obtain_method=db_key, obtain_params=query) stars += starsProvider.getStarsWithCurves() return stars
def _split_stars(stars, restr): random.shuffle(stars) num = None if type(restr) == float: n = len(stars) num = int(n * restr) elif type(restr) == int: num = restr return stars[:num] def _check_sample_name(star_class): if "%" in star_class: parts = star_class.split("%") if len(parts) == 2: name, ratio = parts try: ratio = float(ratio) except ValueError: raise Exception("Invalid float number after '%' %s " % ratio) return name, ratio else: raise Exception( "There have to be just one '%' special mark in the star class name.\Got %s" % star_class) elif ":" in star_class: parts = star_class.split(":") if len(parts) == 2: name, num = parts try: num = int(num) except ValueError: raise Exception("Invalid integer after '%' %s " % num) return name, num else: raise Exception( "There have to be just one ':' special mark in the star class name.\Got %s" % star_class) return star_class, None