Source code for lcc.utils.stars

'''
There are common functions for list of star objects (evaluation, plotting...)
'''

import os
import random
import string
import warnings

from lcc.db_tier.connectors.file_manager import FileManager
import matplotlib.pyplot as plt
import numpy as np


[docs]def saveStars(stars, path=".", clobber=True): """ Save Star objects into fits files Parameters ----------- stars : list, iterable Star objects to be saved path : str Relative path to the file where fits are stored clobber : bool Files are overwritten if True Returns ------- list List of names of star files """ N = 7 file_names = [] for star in stars: file_name = star.name if not file_name: file_name = ''.join( random.choice(string.ascii_uppercase + string.digits) for _ in range(N)) FileManager.writeToFITS( os.path.join(path, file_name + ".fits"), star, clobber) file_names.append(file_name) return file_names
# TODO: Need to be upgraded
[docs]def plotStarsPicture(stars, option="show", hist_bins=10, vario_bins=10, center=True, save_loc=None, num_plots=None, abbe_bins=20): ''' This function plot three graphs for all stars: Light curve, histogram and variogram. Additionally Abbe value will be displayed. Parameters ---------- stars : list of `Star`s List of star objects to be plot option : str Option whether plots will be saved or just showed hist_bins : int Dimension of histogram vario_bins : int Dimension of variogram center : bool Centering of histogram save_loc : str, NoneType Location where images will be saved num_plots : int, NoneType Number of plots abbe_bins : int Dimension of reduced light curve for calculating Abbe value ''' OPTIONS = ["show", "save"] if not (option in OPTIONS): raise Exception("Invalid plot option") for num, star in enumerate(stars[:num_plots]): num_rows = len(star.light_curves) fig = plt.figure(figsize=(20, 6)) for row_num, lc in enumerate(star.light_curves): xlabel = lc.meta.get("xlabel", "JD") xlabel_unit = lc.meta.get("xlabel_unit", "days") ylabel = lc.meta.get("ylabel", "Magnitude") ylabel_unit = lc.meta.get("ylabel_unit", "mag") color = lc.meta.get("color", "") invert_axis = lc.meta.get("invert_yaxis", True) ax1 = fig.add_subplot(31 + num_rows * 100 + 3 * row_num) ax1.set_xlabel("({ylabel} + {mean} ) {ylabel_unit}".format(mean=lc.mag.mean(), ylabel=ylabel, ylabel_unit=ylabel_unit)) ax1.set_ylabel("Normalized counts") hist, indices = lc.getHistogram(bins=hist_bins) ax1.set_title("Abbe index: %.2f" % lc.getAbbe(bins=abbe_bins), loc="left") width = 1 * (indices[1] - indices[0]) center = (indices[:-1] + indices[1:]) / 2 ax1.bar(center, hist, align='center', width=width) ax2 = fig.add_subplot(33 + num_rows * 100 + 3 * row_num) if invert_axis: ax2.set_ylim(np.max(lc.mag), np.min(lc.mag)) ax2.set_xlabel("%s [%s]" % (xlabel, xlabel_unit)) ax2.set_ylabel("%s [%s]" % (ylabel, ylabel_unit)) ax2.errorbar(lc.time, lc.mag, yerr=lc.err, fmt='o') if vario_bins: ax3 = fig.add_subplot(32 + num_rows * 100 + 3 * row_num) if not star.starClass: star.starClass = "unlabeled" if color: color = " %s - band" % color ax3.set_title( "Star: {0} ({1}) {2}".format(star.name, lc.meta.get("origin", ""), color)) ax3.set_xlabel("log {value} [{unit}])".format( value=xlabel, unit=xlabel_unit)) ax3.set_ylabel("log (I_i - I_j)^2") x_v, y_v = lc.getVariogram(bins=vario_bins) ax3.plot(x_v, y_v, "--") if option == "save": if not save_loc: save_loc = "" else: if not os.path.exists(save_loc): os.makedirs(save_loc) plt.tight_layout() fig.savefig(save_loc + "/" + star.name + ".png") else: try: plt.tight_layout() plt.show() except ValueError: warnings.warn( "There no light curves to plot for %s" % star.name) plt.close()