Source code for astro_ghost.stellarLocus

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from astropy.table import Table
import scipy.interpolate as scinterp
import importlib_resources

[docs]def calc_7DCD(df): """Calculates the color distance (7DCD) of objects in df from the stellar locus from Tonry et al., 2012. :param df: Dataframe of PS1 objects. :type df: Pandas DataFrame :return: The same dataframe as input, with new column 7DCD. :rtype: Pandas DataFrame """ df.replace(999.00, np.nan) df.replace(-999.00, np.nan) #read the stellar locus table from PS1 stream = importlib_resources.files(__name__).joinpath('tonry_ps1_locus.txt') skt = Table.read(stream, format='ascii') gr = scinterp.interp1d(skt['ri'], skt['gr'], kind='cubic', fill_value='extrapolate') iz = scinterp.interp1d(skt['ri'], skt['iz'], kind='cubic', fill_value='extrapolate') zy = scinterp.interp1d(skt['ri'], skt['zy'], kind='cubic', fill_value='extrapolate') ri = np.arange(-0.4, 2.01, 0.001) gr_new = gr(ri) iz_new = iz(ri) zy_new = zy(ri) bands = ['g', 'r', 'i', 'z'] #adding the errors in quadrature df["g-rErr"] = np.sqrt(df["gApMagErr"].astype('float')**2 + df["rApMagErr"].astype('float')**2) df["r-iErr"] = np.sqrt(df["rApMagErr"].astype('float')**2 + df["iApMagErr"].astype('float')**2) df["i-zErr"] = np.sqrt(df["iApMagErr"].astype('float')**2 + df["zApMagErr"].astype('float')**2) df['z-yErr'] = np.sqrt(df['zApMagErr'].astype('float')**2 + df['yApMagErr'].astype('float')**2) df["7DCD"] = np.nan df.reset_index(drop=True, inplace=True) for i in np.arange(len(df["i-z"])): temp_7DCD = [] temp_7DCD_1val_gr = (df.loc[i,"g-r"] - gr_new)**2/df.loc[i, "g-rErr"] temp_7DCD_1val_ri = (df.loc[i,"r-i"] - ri)**2 /df.loc[i, "r-iErr"] temp_7DCD_1val_iz = (df.loc[i,"i-z"] - iz_new)**2/df.loc[i, "i-zErr"] temp_7DCD_1val_zy = (df.loc[i,"z-y"] - zy_new)**2/df.loc[i, "z-yErr"] temp_7DCD_1val = temp_7DCD_1val_gr + temp_7DCD_1val_ri + temp_7DCD_1val_iz + temp_7DCD_1val_zy df.loc[i,"7DCD"] = np.nanmin(np.array(temp_7DCD_1val)) return df
[docs]def plotLocus(df, color=False, save=False, type="", timestamp=""): """Plots the color-color distribution of objects in df along with the Tonry et al., 2012 PS1 stellar locus. :param df: Dataframe of PS1 objects. :type df: Pandas DataFrame :param color: If True, color objects by their distance from the stellar locus. :type color: bool, optional :param save: If True, saves the image. :type save: bool, optional :param type: Can be "Gals" for galaxies or "Stars" for stars. Only relevant for coloring the distributions. :type type: str, optional :param timestamp: Timestamp to append to the saved plot filename. :type timestamp: str, optional """ if color: plt.figure(figsize=(8,8)) plt.scatter(df["i-z"], df["g-r"], c=df["7DCD"], s=2, alpha=0.8, norm=LogNorm()) plt.xlim(-0.75, 1) plt.clim(0.1, 1000) plt.ylim(-0.5, 2) plt.xlabel("i-z") plt.ylabel("g-r") cbar = plt.colorbar() cbar.set_label("4D Color Distance") if save: plt.savefig("PS1_%s_StellarLocus_%s_Colored.pdf"%(type, timestamp)) else: plt.show() else: #read the stellar locus table from PS1 stream = importlib_resources.files(__name__).joinpath('tonry_ps1_locus.txt') skt = Table.read(stream, format='ascii') gr = scinterp.interp1d(skt['ri'], skt['gr'], kind='cubic', fill_value='extrapolate') iz = scinterp.interp1d(skt['ri'], skt['iz'], kind='cubic', fill_value='extrapolate') zy = scinterp.interp1d(skt['ri'], skt['zy'], kind='cubic', fill_value='extrapolate') ri = np.arange(-0.4, 2.01, 0.001) gr_new = gr(ri) iz_new = iz(ri) if type == 'Gals': c = '#087e8b' elif type == "Stars": c = '#ffbf00' else: c = 'violet' g = sns.JointGrid(x="i-z", y="g-r", data=df, height=9, ratio=5, xlim=(-0.4, 0.8), ylim=(-0.2, 2.0), space=0) g = g.plot_joint(sns.kdeplot, color=c,gridsize=200) g.ax_joint.plot(iz_new, gr_new, '--', c='#8c837c', lw=2) plt.xlabel(r"$i-z$",fontsize=18) plt.ylabel(r"$g-r$",fontsize=18) g = g.plot_marginals(sns.kdeplot, color=c, fill=True) if save: g.savefig("PS1_%s_StellarLocus_%s.pdf"%(type, timestamp))