def gpSimFull(carmaTerm, SNR, duration, N, nLC=1): """Simulate full CARMA time series. Args: carmaTerm (object): celerite GP term. SNR (float): Signal to noise ratio defined as ratio between CARMA amplitude and the mode of the errors (simulated using log normal). duration (float): The duration of the simulated time series in days. N (int): The number of data points. nLC (int, optional): Number of light curves to simulate. Defaults to 1. Raises: RuntimeError: If the input CARMA term/model is not stable, thus cannot be solved by celerite. Returns: Arrays: t, y and yerr of the simulated light curves in numpy arrays. Note that errors have been added to y. """ assert isinstance( carmaTerm, celerite.celerite.terms.Term), "carmaTerm must a celerite GP term" if (not isinstance(carmaTerm, DRW_term)) and (carmaTerm._arroots.real > 0).any(): raise RuntimeError( "The covariance matrix of the provided CARMA term is not positive definite!" ) t = np.linspace(0, duration, N) noise = carmaTerm.get_rms_amp() / SNR yerr = np.random.lognormal(0, 0.25, N) * noise yerr = yerr[np.argsort(np.abs(yerr))] # init GP and solve matrix gp_sim = GP(carmaTerm) gp_sim.compute(t) # simulate, assign yerr based on y t = np.repeat(t[None, :], nLC, axis=0) y = gp_sim.sample(size=nLC) # format yerr making it heteroscedastic y_rank = y.argsort(axis=1).argsort(axis=1) yerr = np.repeat(yerr[None, :], nLC, axis=0) yerr = np.array(list(map(lambda x, y: x[y], yerr, y_rank))) yerr_sign = np.random.binomial(1, 0.5, yerr.shape) yerr_sign[yerr_sign < 1] = -1 yerr = yerr * yerr_sign if nLC == 1: return t[0], y[0] + yerr[0], yerr[0] else: return t, y + yerr, yerr
def gpSimFull(carmaTerm, SNR, duration, N, nLC=1, log_flux=True): """ Simulate CARMA time series using uniform sampling. Args: carmaTerm (object): An EzTao CARMA kernel. SNR (float): Signal-to-noise defined as ratio between CARMA RMS amplitude and the median of the measurement errors (simulated using log normal). duration (float): The duration of the simulated time series (default in days). N (int): The number of data points in the simulated time series. nLC (int, optional): Number of time series to simulate. Defaults to 1. log_flux (bool): Whether the flux/y values are in astronomical magnitude. This argument affects how errors are assigned. Defaults to True. Raises: RuntimeError: If the input CARMA term/model is not stable, thus cannot be solved by celerite. Returns: (array(float), array(float), array(float)): Time stamps (default in day), y values and measurement errors of the simulated time series. """ assert isinstance( carmaTerm, celerite.celerite.terms.Term), "carmaTerm must a celerite GP term" if (not isinstance(carmaTerm, DRW_term)) and (carmaTerm._arroots.real > 0).any(): raise RuntimeError( "The covariance matrix of the provided CARMA term is not positive definite!" ) t = np.linspace(0, duration, N) noise = carmaTerm.get_rms_amp() / SNR yerr = np.random.lognormal(0, 0.25, N) * noise yerr = yerr[np.argsort(np.abs(yerr))] # small->large # init GP and solve matrix gp_sim = GP(carmaTerm) gp_sim.compute(t) # simulate, assign yerr based on y t = np.repeat(t[None, :], nLC, axis=0) y = gp_sim.sample(size=nLC) # format yerr making it heteroscedastic yerr = np.repeat(yerr[None, :], nLC, axis=0) # if in mag, large value with large error; in flux, the opposite if log_flux: # ascending sort y_rank = y.argsort(axis=1).argsort(axis=1) yerr = np.array(list(map(lambda x, y: x[y], yerr, y_rank))) else: # descending sort y_rank = (-y).argsort(axis=1).argsort(axis=1) yerr = np.array(list(map(lambda x, y: x[y], yerr, y_rank))) if nLC == 1: return t[0], y[0], yerr[0] else: return t, y, yerr