Source code for democratic_detrender.manipulate_data

""" This module contains functions to split, join and mask light curve data. """

import numpy as np

from democratic_detrender.helper_functions import find_nearest


[docs] def split_around_problems(x, y, yerr, mask, mask_fitted_planet, problem_times): problem_split_x = [] problem_split_y = [] problem_split_yerr = [] problem_split_mask = [] problem_split_mask_fitted_planet = [] split_x = [] split_y = [] split_yerr = [] split_mask = [] split_mask_fitted_planet = [] split_times = [] for time in problem_times: split_times.append(find_nearest(x, time)) for ii in range(0, len(x)): time = x[ii] flux = y[ii] flux_err = yerr[ii] a_mask = mask[ii] a_mask_fitted_planet = mask_fitted_planet[ii] if time in split_times: problem_split_x.append(np.array(split_x)) problem_split_y.append(np.array(split_y)) problem_split_yerr.append(np.array(split_yerr)) problem_split_mask.append(np.array(split_mask)) problem_split_mask_fitted_planet.append(np.array(split_mask_fitted_planet)) split_x = [] split_y = [] split_yerr = [] split_mask = [] split_mask_fitted_planet = [] else: split_x.append(time) split_y.append(flux) split_yerr.append(flux_err) split_mask.append(a_mask) split_mask_fitted_planet.append(a_mask_fitted_planet) output = [ np.array(problem_split_x, dtype=object), np.array(problem_split_y, dtype=object), np.array(problem_split_yerr, dtype=object), np.array(problem_split_mask, dtype=object), np.array(problem_split_mask_fitted_planet, dtype=object), ] return output
[docs] def add_nans_for_missing_data( sap_x_local, sap_detrended_lcs, sap_yerr_local, sap_mask_local, sap_mask_fitted_planet_local, pdc_x_local, pdc_detrended_lcs, pdc_yerr_local, pdc_mask_local, pdc_mask_fitted_planet_local, ): print("") print("") print("pdc length in: ", str(len(pdc_x_local))) print("sap length in: ", str(len(sap_x_local))) print("---") for ii in range(0, len(pdc_x_local)): time = pdc_x_local[ii] yerr = pdc_yerr_local[ii] mask = pdc_mask_local[ii] mask_fitted_planet = pdc_mask_fitted_planet_local[ii] if time not in sap_x_local: for kk in range(0, len(sap_x_local)): if sap_x_local[kk] > time: sap_x_local = np.insert(sap_x_local, kk, time) sap_yerr_local = np.insert(sap_yerr_local, kk, yerr) sap_mask_local = np.insert(sap_mask_local, kk, mask) sap_mask_fitted_planet_local = np.insert( sap_mask_fitted_planet_local, kk, mask_fitted_planet ) for jj in range(0, len(sap_detrended_lcs)): sap_detrended_lcs[jj] = np.insert( sap_detrended_lcs[jj], kk, np.nan ) break elif kk + 1 == len(sap_x_local): sap_x_local = np.insert(sap_x_local, kk + 1, time) sap_yerr_local = np.insert(sap_yerr_local, kk + 1, yerr) sap_mask_local = np.insert(sap_mask_local, kk + 1, mask) sap_mask_fitted_planet_local = np.insert( sap_mask_fitted_planet_local, kk + 1, mask_fitted_planet ) for jj in range(0, len(sap_detrended_lcs)): sap_detrended_lcs[jj] = np.insert( sap_detrended_lcs[jj], kk + 1, np.nan ) break for ii in range(0, len(sap_x_local)): time = sap_x_local[ii] yerr = sap_yerr_local[ii] mask = sap_mask_local[ii] mask_fitted_planet = sap_mask_fitted_planet_local[ii] if time not in pdc_x_local: for kk in range(0, len(pdc_x_local)): if pdc_x_local[kk] > time: pdc_x_local = np.insert(pdc_x_local, kk, time) pdc_yerr_local = np.insert(pdc_yerr_local, kk, yerr) pdc_mask_local = np.insert(pdc_mask_local, kk, mask) pdc_mask_fitted_planet_local = np.insert( pdc_mask_fitted_planet_local, kk, mask_fitted_planet ) for jj in range(0, len(pdc_detrended_lcs)): pdc_detrended_lcs[jj] = np.insert( pdc_detrended_lcs[jj], kk, np.nan ) break elif kk + 1 == len(pdc_x_local): pdc_x_local = np.insert(pdc_x_local, kk + 1, time) pdc_yerr_local = np.insert(pdc_yerr_local, kk + 1, yerr) pdc_mask_local = np.insert(pdc_mask_local, kk + 1, mask) pdc_mask_fitted_planet_local = np.insert( pdc_mask_fitted_planet_local, kk + 1, mask_fitted_planet ) for jj in range(0, len(pdc_detrended_lcs)): pdc_detrended_lcs[jj] = np.insert( pdc_detrended_lcs[jj], kk + 1, np.nan ) break print("pdc length out: ", str(len(pdc_x_local))) print("sap length out: ", str(len(sap_x_local))) print("") print("") print("") if (pdc_x_local == sap_x_local).all(): x_detrended = pdc_x_local else: print("ERROR, pdc and sap x arrays aren't the same") yerr_detrended = np.nanmean([pdc_yerr_local, sap_yerr_local], axis=0) if (pdc_mask_local == sap_mask_local).all(): mask_detrended = pdc_mask_local else: for ii in range(0, len(pdc_mask_local)): if pdc_mask_local[ii] != sap_mask_local[ii]: print(pdc_x_local[ii], pdc_mask_local[ii]) print(sap_x_local[ii], sap_mask_local[ii]) print("") print("ERROR, pdc and sap mask arrays aren't the same") if (pdc_mask_fitted_planet_local == sap_mask_fitted_planet_local).all(): mask_fitted_planet_detrended = pdc_mask_fitted_planet_local else: print("ERROR, pdc and sap mask for fitted planet arrays aren't the same") return ( x_detrended, sap_detrended_lcs, pdc_detrended_lcs, yerr_detrended, mask_detrended, mask_fitted_planet_detrended, )
[docs] def split_around_transits( x, y, yerr, mask, mask_fitted_planet, t0s, window, period, model="None" ): # x = time # y = flux # yerr = flux error # mask = mask # t0s = midtransits in data # window = what fraction of the period to plot on either side of transit (ie. xlim=1/2 means 1/2 period on either side) # period = planet period to define plotting limit xlims = [] x_split = [] y_split = [] yerr_split = [] mask_split = [] mask_fitted_planet_split = [] if type(model) is np.ndarray: model_split = [] for t0 in t0s: xlims.append([float(t0 - (period * window)), float(t0 + (period * window))]) x_split.append([]) y_split.append([]) yerr_split.append([]) mask_split.append([]) mask_fitted_planet_split.append([]) if type(model) is np.ndarray: model_split.append([]) split_index = 0 for xlim in xlims: for ii in range(0, len(x)): time = x[ii] lc = y[ii] lc_err = yerr[ii] transit_mask = mask[ii] fitted_planet_mask = mask_fitted_planet[ii] if type(model) is np.ndarray: model_val = model[ii] if time >= xlim[0] and time <= xlim[1]: x_split[split_index].append(time) y_split[split_index].append(lc) yerr_split[split_index].append(lc_err) mask_split[split_index].append(transit_mask) mask_fitted_planet_split[split_index].append(fitted_planet_mask) if type(model) is np.ndarray: model_split[split_index].append(model_val) x_split[split_index] = np.array(x_split[split_index]) y_split[split_index] = np.array(y_split[split_index]) yerr_split[split_index] = np.array(yerr_split[split_index]) mask_split[split_index] = np.array(mask_split[split_index]) mask_fitted_planet_split[split_index] = np.array( mask_fitted_planet_split[split_index] ) split_index += 1 x_split = np.array(x_split, dtype=object) y_split = np.array(y_split, dtype=object) yerr_split = np.array(yerr_split, dtype=object) mask_split = np.array(mask_split, dtype=object) mask_fitted_planet_split = np.array(mask_fitted_planet_split, dtype=object) if type(model) is np.ndarray: model_split = np.array(model_split, dtype=object) return ( x_split, y_split, yerr_split, mask_split, mask_fitted_planet_split, model_split, ) return x_split, y_split, yerr_split, mask_split, mask_fitted_planet_split
[docs] def find_quarters_with_transits( x_quarters, y_quarters, yerr_quarters, mask_quarters, mask_fitted_planet_quarters, t0s, ): x_transits = [] y_transits = [] yerr_transits = [] mask_transits = [] mask_fitted_planet_transits = [] quarters_included = [] for ii in range(0, len(x_quarters)): x_quarter = x_quarters[ii] y_quarter = y_quarters[ii] yerr_quarter = yerr_quarters[ii] mask_quarter = mask_quarters[ii] mask_fitted_planet_quarter = mask_fitted_planet_quarters[ii] xmin = np.min(x_quarter) xmax = np.max(x_quarter) for t0 in t0s: if t0 > xmin and t0 < xmax: # make sure this quarter hasn't already been added to the data # this ensures there aren't duplicates if multiple transits # exist in a single quarter or sector if ii not in quarters_included: quarters_included.append(ii) x_transits.append(x_quarter.astype("float64")) y_transits.append(y_quarter.astype("float64")) yerr_transits.append(yerr_quarter.astype("float64")) mask_transits.append(mask_quarter.astype("bool")) mask_fitted_planet_transits.append( mask_fitted_planet_quarter.astype("bool") ) return ( x_transits, y_transits, yerr_transits, mask_transits, mask_fitted_planet_transits, )