def initialize_model(planets, TESSAPFdata, addextra=False): time_base = 2458362.5 nplan = len(planets) if addextra: nplan = nplan + 1 params = radvel.Parameters( nplan, basis='per tp e w k') # number of planets = nplan n = 1 for idx in planets: c_period = TESSAPFdata['period'][idx] k = radvel.utils.semi_amplitude(TESSAPFdata['est_mass'][idx], c_period, TESSAPFdata['mstar'][idx], 0.) tpstart = time_base + c_period * (TESSAPFdata['phase'][idx] + 0.25) params['per%d' % (n)] = radvel.Parameter(value=c_period) params['tp%d' % (n)] = radvel.Parameter(value=tpstart) params['e%d' % (n)] = radvel.Parameter(value=0.0001) params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.) params['k%d' % (n)] = radvel.Parameter(value=k) n = n + 1 if addextra: params['per%d' % (n)] = radvel.Parameter(value=30.) params['tp%d' % (n)] = radvel.Parameter(value=time_base + 15.) params['e%d' % (n)] = radvel.Parameter(value=0.0001) params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.) params['k%d' % (n)] = radvel.Parameter(value=2.) mod = radvel.RVModel(params, time_base=time_base) mod.params['dvdt'] = radvel.Parameter(value=0.0) mod.params['curv'] = radvel.Parameter(value=0.0) return mod
def initialize_post(data, params=None, priors=[], linear=True, decorrs=None): """Initialize a posterior object with data, params, and priors. Args: data: a pandas dataframe. params: a list of radvel parameter objects. priors: a list of priors to place on the posterior object. decorrs: a list of decorrelation vectors. Returns: post (radvel Posterior object) """ if params is None: # params = radvel.Parameters(1, basis='per tc secosw sesinw logk') params = initialize_default_pars(instnames=data.tel, times=data.time) iparams = radvel.basis._copy_params(params) # Allow for time to be listed as 'time' or 'jd' (Julian Date). if {'jd'}.issubset(data.columns): data['time'] = data['jd'] # initialize RVModel time_base = np.mean([data['time'].max(), data['time'].min()]) mod = radvel.RVModel(params, time_base=time_base) # initialize Likelihood objects for each instrument telgrps = data.groupby('tel').groups likes = {} for inst in telgrps.keys(): # 10/8: ADD DECORRELATION VECTORS AND VARS, ONLY FOR SELECTED INST. likes[inst] = radvel.likelihood.RVLikelihood( mod, data.iloc[telgrps[inst]].time, data.iloc[telgrps[inst]].mnvel, data.iloc[telgrps[inst]].errvel, suffix='_' + inst) likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst] likes[inst].params['jit_' + inst] = iparams['jit_' + inst] # Can this be cleaner? like = radvel.likelihood.CompositeLikelihood(likes) like = radvel.likelihood.CompositeLikelihood(list(likes.values())) post = radvel.posterior.Posterior(like) if priors == []: priors.append(radvel.prior.PositiveKPrior(post.params.num_planets)) priors.append(radvel.prior.EccentricityPrior(post.params.num_planets)) if not linear: if ('j' in telgrps.keys()) and ('k' in telgrps.keys()): TexStr = 'Gaussian Prior on HIRES offset' OffsetPrior = radvel.prior.UserDefinedPrior( ['gamma_j', 'gamma_k'], GaussianDiffFunc, TexStr) priors.append(OffsetPrior) #for inst in telgrps.keys(): # priors.append(radvel.prior.Jeffrey('jit_'+inst, 0.01, 20.0)) post.priors = priors return post
def initialize_model(e): time_base = 0.0 params = radvel.Parameters(1, basis='per tp e w k') params['per1'] = radvel.Parameter(value=6) params['tp1'] = radvel.Parameter(value=2) params['e1'] = radvel.Parameter(value=e) params['w1'] = radvel.Parameter(value=0.0) params['k1'] = radvel.Parameter(value=10.1) mod = radvel.RVModel(params, time_base=time_base) mod.params['dvdt'] = radvel.Parameter(value=-0.0) mod.params['curv'] = radvel.Parameter(value=0.0) return mod
def initialize_posterior(P): params = P.params.basis.from_cps(P.params, P.fitting_basis, keep=False) for key in params.keys(): if key.startswith('logjit'): msg = """ Fitting log(jitter) is depreciated. Please convert your config files to initialize 'jit' instead of 'logjit' parameters. Converting 'logjit' to 'jit' for you now. """ warnings.warn(msg, DeprecationWarning, stacklevel=2) newkey = key.replace('logjit', 'jit') params[newkey] = np.exp(params[key]) P.vary[newkey] = P.vary[key] del P.vary[key] del params[key] iparams = params.copy() # Make sure we don't have duplicate indicies in the DataFrame P.data = P.data.reset_index(drop=True) # initialize RVmodel object mod = radvel.RVModel(params, time_base=P.time_base) # initialize RVlikelihood objects for each instrument telgrps = P.data.groupby('tel').groups likes = {} for inst in P.instnames: likes[inst] = radvel.likelihood.RVLikelihood( mod, P.data.iloc[telgrps[inst]].time, P.data.iloc[telgrps[inst]].mnvel, P.data.iloc[telgrps[inst]].errvel, suffix='_' + inst) likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst] likes[inst].params['jit_' + inst] = iparams['jit_' + inst] like = radvel.likelihood.CompositeLikelihood(likes.values()) # Set fixed/vary parameters like.vary.update(P.vary) # Initialize Posterior object post = radvel.posterior.Posterior(like) post.priors = P.priors return post
def initialize_model(planets, TESSAPFdata, addextra=False): time_base = 2458362.5 nplan = len(planets) if addextra: nplan = nplan + 1 params = radvel.Parameters( nplan, basis='per tp e w k') # number of planets = nplan n = 1 for idx in planets: c_period = TESSAPFdata['period'][idx] k = radvel.utils.semi_amplitude(TESSAPFdata['est_mass'][idx], c_period, TESSAPFdata['mstar'][idx], 0.) tpstart = time_base + c_period * (TESSAPFdata['phase'][idx] + 0.25) params['per%d' % (n)] = radvel.Parameter(value=c_period) params['tp%d' % (n)] = radvel.Parameter(value=tpstart) params['e%d' % (n)] = radvel.Parameter(value=0.0) params['w%d' % (n)] = radvel.Parameter(value=0.) params['k%d' % (n)] = radvel.Parameter(value=k) n = n + 1 if addextra: params['per%d' % (n)] = radvel.Parameter(value=30.) params['tp%d' % (n)] = radvel.Parameter(value=time_base + 15.) params['e%d' % (n)] = radvel.Parameter(value=0.0001) params['w%d' % (n)] = radvel.Parameter(value=np.pi / 2.) params['k%d' % (n)] = radvel.Parameter(value=2.) # nparams = params.basis.from_cps(params,'per tc e w k') # transform to new basis (for less biased fits?) # n = 1 # if addextra: # n = 2 # for i in range(1,len(planets+n)): # # del nparams['e%d' % (i)] # # # del nparams['k%d' % (i)] # # del nparams['w%d' % (i)] # del nparams['tp%d' % (i)] # # new basis mod = radvel.RVModel(params, time_base=time_base) mod.params['dvdt'] = radvel.Parameter(value=0.0) mod.params['curv'] = radvel.Parameter(value=0.0) return mod
def get_full_like(observations_df): """ Get a radvel likelihood object for a two-planet radial velocity model. Arguments --------- observations_df : pandas DataFrame Dataframe containing the radial observations. Required columns: 'instrument','time','velocity','uncertainty' Returns ------- radvel CompositeLikelihood """ # Set up radvel likelihood object fitbasis = 'per tc e w k' params = radvel.Parameters(2, basis=fitbasis) mdl = radvel.RVModel(params, time_base=observations_df.time.median()) likes = [] instruments = observations_df.instrument.unique() for i, instrument in enumerate(instruments): data = observations_df.query('instrument==@instrument')[[ 'time', 'velocity', 'uncertainty' ]].values inst_like = radvel.likelihood.RVLikelihood(mdl, *(data.T), suffix=instrument) # ... setting pars to 0 is for some reason # neccessary to stop the code from eating shit... for key, par in inst_like.params.items(): par.value = 0 likes.append(inst_like) like = radvel.likelihood.CompositeLikelihood(likes) like.params['dvdt'].vary = False like.params['curv'].vary = False return like
def initialize_model(self, periods, numplanets): """ Initialize the RadVel keplerian analysis model as described in the tutorial for each of the n number of planets specified Fulton et al. (2018). :param periods: The periods specified for each planet. :param numplanets: The number of planets in the system. :return: mod, the initialized radvel model. """ time_base = self.t.values[0] params = radvel.Parameters(numplanets, basis='per tc secosw sesinw logk') for i in range(1, numplanets + 1): params['per' + str(i)] = radvel.Parameter(value=periods[i - 1]) params['tc' + str(i)] = radvel.Parameter(value=self.t[0]) params['secosw' + str(i)] = radvel.Parameter(value=0.01) params['sesinw' + str(i)] = radvel.Parameter(value=0.01) params['logk' + str(i)] = radvel.Parameter(value=1.1) mod = radvel.RVModel(params, time_base=time_base) mod.params['dvdt'] = radvel.Parameter(value=-0.02) mod.params['curv'] = radvel.Parameter(value=0.01) print(mod) return mod
def initialize_posterior(config_file, decorr=False): """Initialize Posterior object Parse a setup file and initialize the RVModel, Likelihood, Posterior and priors. Args: config_file (string): path to config file decorr (bool): (optional) decorrelate RVs against columns defined in the decorr_vars list Returns: tuple: (object representation of config file, radvel.Posterior object) """ system_name = os.path.basename(config_file).split('.')[0] P = imp.load_source(system_name, os.path.abspath(config_file)) params = P.params assert str(params.basis) == "Basis Object <{}>".format( P.fitting_basis), """ Parameters in config file must be converted to fitting basis. """ if decorr: try: decorr_vars = P.decorr_vars except: raise Exception("--decorr option selected,\ but decorr_vars is not found in your setup file.") else: decorr_vars = [] for key in params.keys(): if key.startswith('logjit'): msg = """ Fitting log(jitter) is depreciated. Please convert your config files to initialize 'jit' instead of 'logjit' parameters. Converting 'logjit' to 'jit' for you now. """ warnings.warn(msg, DeprecationWarning, stacklevel=2) newkey = key.replace('logjit', 'jit') params[newkey] = radvel.model.Parameter(value=np.exp( params[key].value), vary=params[key].vary) del params[key] iparams = radvel.basis._copy_params(params) # Make sure we don't have duplicate indicies in the DataFrame P.data = P.data.reset_index(drop=True) # initialize RVmodel object mod = radvel.RVModel(params, time_base=P.time_base) # initialize Likelihood objects for each instrument telgrps = P.data.groupby('tel').groups likes = {} for inst in P.instnames: assert inst in P.data.groupby('tel').groups.keys(), \ "No data found for instrument '{}'.\nInstruments found in this dataset: {}".format(inst, list(telgrps.keys())) decorr_vectors = {} if decorr: for d in decorr_vars: decorr_vectors[d] = P.data.iloc[telgrps[inst]][d].values try: hnames = P.hnames[inst] liketype = radvel.likelihood.GPLikelihood try: kernel_name = P.kernel_name[inst] if kernel_name == "Celerite": liketype = radvel.likelihood.CeleriteLikelihood except AttributeError: kernel_name = "QuasiPer" except AttributeError: liketype = radvel.likelihood.RVLikelihood kernel_name = None hnames = None likes[inst] = liketype(mod, P.data.iloc[telgrps[inst]].time, P.data.iloc[telgrps[inst]].mnvel, P.data.iloc[telgrps[inst]].errvel, hnames=hnames, suffix='_' + inst, kernel_name=kernel_name, decorr_vars=decorr_vars, decorr_vectors=decorr_vectors) likes[inst].params['gamma_' + inst] = iparams['gamma_' + inst] likes[inst].params['jit_' + inst] = iparams['jit_' + inst] like = radvel.likelihood.CompositeLikelihood(list(likes.values())) # Initialize Posterior object post = radvel.posterior.Posterior(like) post.priors = P.priors return P, post
bin_t, bin_vel, bin_err, bin_tel = radvel.utils.bintels(data['time'].values, data['mnvel'].values, data['errvel'].values, data['tel'].values, binsize=0.1) data = pd.DataFrame([], columns=['time', 'mnvel', 'errvel', 'tel']) data['time'] = bin_t data['mnvel'] = bin_vel data['errvel'] = bin_err data['tel'] = bin_tel instnames = ['j', 'k'] ntels = len(instnames) anybasis_params['gamma_j'] = radvel.Parameter(value=0.0, vary=False, linear=True) anybasis_params['jit_j'] = radvel.Parameter(value=1.0) anybasis_params['gamma_k'] = radvel.Parameter(value=0.0, vary=False, linear=True) anybasis_params['jit_k'] = radvel.Parameter(value=1.0) params = anybasis_params.basis.to_any_basis(anybasis_params,fitting_basis) mod = radvel.RVModel(params, time_base=time_base) mod.params['per1'].vary = True mod.params['tc1'].vary = True mod.params['secosw1'].vary = True mod.params['sesinw1'].vary = True mod.params['per2'].vary = True mod.params['tc2'].vary = True mod.params['secosw2'].vary = True mod.params['sesinw2'].vary = True mod.params['dvdt'].vary = True mod.params['curv'].vary = False mod.params['jit_j'].vary = True mod.params['jit_k'].vary = True priors = [
if '-fname' in sys.argv: p = sys.argv.index('-fname') fname = str(sys.argv[p + 1]) # generate the data np.random.seed(2021) #For reproducibility x_rv = np.sort(np.random.uniform(low=1, high=100, size=25)) yerr_rv = sigma synth_params = radvel.Parameters(1, basis='per tc e w k') synth_params['per1'] = radvel.Parameter(value=per) synth_params['tc1'] = radvel.Parameter(value=tc) synth_params['e1'] = radvel.Parameter(value=e) synth_params['w1'] = radvel.Parameter(value=0.0) synth_params['k1'] = radvel.Parameter(value=k) synth_params['dvdt'] = radvel.Parameter(value=0) synth_params['curv'] = radvel.Parameter(value=0) synth_model = radvel.RVModel(params=synth_params) y_rv = synth_model(x_rv) np.random.seed(2021) #For reproducibility y_rv += yerr_rv * np.random.randn(len(y_rv)) data = pd.DataFrame({'time': x_rv, 'mnvel': y_rv, 'errvel': yerr_rv}) data.to_csv(f"./data/{fname}.csv", index=False)
def initialize_sim_posterior(data, mass_c, sma_c, incl_c, ecc_c, gammajit_dict, verbose=True): """ Initialize Posterior object to be used for the "second planet" models. Basically a hack of radvel.utils.initialize_posterior Returns: tuple: (object representation of config file, radvel.Posterior object) """ system_name = 'simWASP4' mstar = 0.864*u.Msun mass_b = 1.186*u.Mjup Mtotal = (mass_c + mass_b + mstar).to(u.Msun).value Msini = (mass_c * np.sin(np.deg2rad(incl_c))).to(u.Mjup).value period_c = np.sqrt( 4*np.pi**2 * sma_c**3 / (const.G * Mtotal*u.Msun) ).to(u.day).value k_c = semi_amplitude(Msini, period_c, Mtotal, ecc_c, Msini_units='jupiter') P = templateWASP4(data, period_c, ecc_c, k_c, tc_c=2455470, w_c=0.42*np.pi/2, gammajit_dict=gammajit_dict) # initalization from radvel.utils.initialize_posterior params = P.params assert str(params.basis) == "Basis Object <{}>".format(P.fitting_basis), """ Parameters in config file must be converted to fitting basis. """ decorr = False decorr_vars = [] for key in params.keys(): if key.startswith('logjit'): msg = """ Fitting log(jitter) is depreciated. Please convert your config files to initialize 'jit' instead of 'logjit' parameters. Converting 'logjit' to 'jit' for you now. """ warnings.warn(msg, DeprecationWarning, stacklevel=2) newkey = key.replace('logjit', 'jit') params[newkey] = ( radvel.model.Parameter(value=np.exp(params[key].value), vary=params[key].vary) ) del params[key] iparams = radvel.basis._copy_params(params) # Make sure we don't have duplicate indicies in the DataFrame P.data = P.data.reset_index(drop=True) # initialize RVmodel object mod = radvel.RVModel(params, time_base=P.time_base) # initialize Likelihood objects for each instrument telgrps = P.data.groupby('tel').groups likes = {} for inst in P.instnames: assert inst in P.data.groupby('tel').groups.keys(), \ "No data found for instrument '{}'.\nInstruments found in this dataset: {}".format(inst, list(telgrps.keys())) decorr_vectors = {} if decorr: for d in decorr_vars: decorr_vectors[d] = P.data.iloc[telgrps[inst]][d].values try: hnames = P.hnames[inst] liketype = radvel.likelihood.GPLikelihood try: kernel_name = P.kernel_name[inst] # if kernel_name == "Celerite": # liketype = radvel.likelihood.CeleriteLikelihood if kernel_name == "Celerite": liketype = radvel.likelihood.CeleriteLikelihood except AttributeError: kernel_name = "QuasiPer" except AttributeError: liketype = radvel.likelihood.RVLikelihood kernel_name = None hnames = None likes[inst] = liketype( mod, P.data.iloc[telgrps[inst]].time, P.data.iloc[telgrps[inst]].mnvel, P.data.iloc[telgrps[inst]].errvel, hnames=hnames, suffix='_'+inst, kernel_name=kernel_name, decorr_vars=decorr_vars, decorr_vectors=decorr_vectors ) likes[inst].params['gamma_'+inst] = iparams['gamma_'+inst] likes[inst].params['jit_'+inst] = iparams['jit_'+inst] like = radvel.likelihood.CompositeLikelihood(list(likes.values())) # Initialize Posterior object post = radvel.posterior.Posterior(like) post.priors = P.priors #return P, post return post
params['per2'] = radvel.Parameter(value=Ps[1]) params['tc2'] = radvel.Parameter(value=2458415.6344) params['secosw2'] = radvel.Parameter(value=np.sqrt(es[1]) * np.cos(omegas[1])) params['sesinw2'] = radvel.Parameter(value=np.sqrt(es[1]) * np.sin(omegas[1])) params['k2'] = radvel.Parameter(value=Ks[1]) params['per3'] = radvel.Parameter(value=Ps[2]) params['tc3'] = radvel.Parameter(value=2458409.7328) params['secosw3'] = radvel.Parameter(value=np.sqrt(es[2]) * np.cos(omegas[2])) params['sesinw3'] = radvel.Parameter(value=np.sqrt(es[2]) * np.sin(omegas[2])) params['k3'] = radvel.Parameter(value=Ks[2]) # params['dvdt'] = radvel.Parameter(value=0) # params['curv'] = radvel.Parameter(value=0) rv_mod = radvel.RVModel(params) like_syn = radvel.likelihood.RVLikelihood(rv_mod, t, syn_rv, np.zeros(t.size) + errval) like_syn.params['gamma'] = radvel.Parameter(value=0) like_syn.params['jit'] = radvel.Parameter(value=jitter) like_syn.params['jit'].vary = False # Don't vary jitter # like_syn.params['k1'].vary = False # Don't vary period # like_syn.params['k2'].vary = False # Don't vary period # like_syn.params['k3'].vary = False # Don't vary period # like_syn.params['per1'].vary = False # Don't vary period # like_syn.params['per2'].vary = False # Don't vary period # like_syn.params['per3'].vary = False # Don't vary period like_syn.params['dvdt'].vary = False # Don't vary dvdt like_syn.params['curv'].vary = False # Don't vary curvature