Source code for radvel.basis

import numpy as np
import pandas as pd
from collections import OrderedDict
from radvel.orbit import timeperi_to_timetrans, timetrans_to_timeperi
import radvel.model


BASIS_NAMES = ['per tp e w k',  # The synth basis
               'per tc secosw sesinw logk',
               'per tc secosw sesinw k',
               'per tc ecosw esinw k',
               'per tc e w k',
               'per tc tp e w k',  # print basis for summary report
               'logper tc secosw sesinw k',
               'logper tc secosw sesinw logk',
               'per tc se w k',
               'logper tp e w logk']

ECCENTRICITY_PARAMS_DICT = {
              'per tp e w k': 'e w',
              'per tc secosw sesinw logk': 'secosw sesinw',
              'per tc secosw sesinw k': 'secosw sesinw',
              'per tc ecosw esinw k': 'ecosw esinw',
              'per tc e w k': 'e w',
              'logper tc secosw sesinw k': 'secosw sesinw',
              'logper tc secosw sesinw logk': 'secosw sesinw',
              'per tc se w k': 'se w',
              'logper tp e w logk': 'e w'}

CIRCULAR_PARAMS_DICT = {
              'per tp e w k': 'per tp k',
              'per tc secosw sesinw logk': 'per tc logk',
              'per tc secosw sesinw k': 'per tc k',
              'per tc ecosw esinw k': 'per tc k',
              'per tc e w k': 'per tc k',
              'logper tc secosw sesinw k': 'logper tc k',
              'logper tc secosw sesinw logk': 'logper tc logk',
              'per tc se w k': 'per tc k',
              'logper tp e w logk': 'logper tp logk'}


def _print_valid_basis():
    print("Available bases:")
    print("\n".join(BASIS_NAMES))


def _copy_params(params_in):
    num_planets = params_in.num_planets
    basis = params_in.basis.name
    planet_letters = params_in.planet_letters
    params_out = radvel.model.Parameters(num_planets, basis=basis,
                                         planet_letters=planet_letters)
    params_out.update(params_in)

    return params_out


[docs]class Basis(object): """ Object that knows how to convert between the various Keplerian bases Args: name (str): basis name num_planets (int): number of planets Attributes: synth_params (str): name of synth basis Note: Valid basis functions: \n 'per tp e w k' (The synthesis basis) \n 'per tc secosw sesinw logk' \n 'per tc secosw sesinw k' \n 'per tc ecosw esinw k' \n 'per tc e w k' \n 'logper tc secosw sesinw k'\n 'logper tc secosw sesinw logk'\n 'per tc se w k' """ synth_params = 'per tp e w k'.split() def __init__(self, *args): self.name = None self.num_planets = 0 if len(args) == 0: _print_valid_basis() # return None name, num_planets = args if BASIS_NAMES.count(name) == 0: print("{} not valid basis".format(name)) _print_valid_basis() # return None self.name = name self.num_planets = num_planets self.params = name.split() def __repr__(self): return "Basis Object <{}>".format(self.name)
[docs] def to_any_basis(self, params_in, newbasis): """Convenience function for converting Parameters object to an arbitraty basis Args: params_in (radvel.Parameters): radvel.Parameters object expressed in current basis newbasis (string): string corresponding to basis to switch into Returns: radvel.Parameters object expressed in the new basis """ synth_params = self.to_synth(params_in) arbbasis_params = self.from_synth(synth_params, newbasis, keep=False) return arbbasis_params
def v_to_any_basis(self, params_in, newbasis): synth_vector = self.v_to_synth(params_in) arbbasis_vector = self.v_from_synth(synth_vector, newbasis) return arbbasis_vector def v_to_synth(self, params_in, **kwargs): basis_name = kwargs.setdefault('basis_name', self.name) if isinstance(params_in, radvel.Vector): vector = params_in.vector else: vector = params_in vector2 = vector.copy() def setvary(indices): if kwargs.get('noVary', True): for i in indices: vector2[i][1] = False vector2[i][2] = None else: for i in indices: vector2[i][1] = True vector2[i][2] = None for num_planet in range(self.num_planets): #per: (5*num_planet) #tp: 1 + (5*num_planet) #e: 2 + (5*num_planet) #w: 3 + (5*num_planet) #k: 4 + (5*num_planet) if basis_name == 'per tp e w k': return vector2 if basis_name == 'per tc e w k': vector2[1+(5*num_planet)][0] = timetrans_to_timeperi(vector[1+(5*num_planet)][0], vector[(5*num_planet)][0], vector[2+(5*num_planet)][0], vector[3+(5*num_planet)][0]) setvary([1+(5*num_planet)]) if basis_name == 'per tc se w k': vector2[2+(5 * num_planet)][0] = vector[2+(5 * num_planet)][0] ** 2 vector2[1+(5*num_planet)][0] = timetrans_to_timeperi(vector[1+(5*num_planet)][0], vector[(5*num_planet)][0], vector2[2+(5*num_planet)][0], vector[3+(5*num_planet)][0]) setvary([2+(5*num_planet), 1+(5*num_planet)]) if basis_name == 'per tc secosw sesinw logk': vector2[4+(5*num_planet)][0] = np.exp(vector[4+(5*num_planet)][0]) vector2[2+(5*num_planet)][0] = vector[2+(5*num_planet)][0]**2 + vector[3+(5*num_planet)][0]**2 vector2[3+(5 * num_planet)][0] = np.arctan2(vector[3+(5 * num_planet)][0], vector[2+(5 * num_planet)][0]) vector2[1+(5*num_planet)][0] = timetrans_to_timeperi(vector[1+(5*num_planet)][0], vector[(5*num_planet)][0], vector2[2+(5*num_planet)][0], vector2[3+(5*num_planet)][0]) setvary([4+(5*num_planet),2+(5 * num_planet),3+(5 * num_planet),1+(5 * num_planet)]) if basis_name == 'per tc secosw sesinw k': vector2[2 + (5 * num_planet)][0] = vector[2+(5 * num_planet)][0] ** 2 + vector[3+(5 * num_planet)][0] ** 2 vector2[3 + (5 * num_planet)][0] = np.arctan2(vector[3+(5 * num_planet)][0], vector[2+(5 * num_planet)][0]) vector2[1 + (5 * num_planet)][0] = timetrans_to_timeperi(vector[1+(5 * num_planet)][0], vector[(5 * num_planet)][0], vector2[2+(5 * num_planet)][0], vector2[3+(5 * num_planet)][0]) setvary([2+(5 * num_planet),3+(5 * num_planet),1+(5 * num_planet)]) if basis_name == 'logper tc secosw sesinw k': vector2[2+(5 * num_planet)][0] = vector[2+(5 * num_planet)][0] ** 2 + vector[3+(5 * num_planet)][0] ** 2 vector2[3+(5 * num_planet)][0] = np.arctan2(vector[3+(5 * num_planet)][0], vector[2+(5 * num_planet)][0]) vector2[(5 * num_planet)][0] = np.exp(vector[(5 * num_planet)][0]) vector2[1 + (5 * num_planet)][0] = timetrans_to_timeperi(vector[1 + (5 * num_planet)][0], vector2[(5 * num_planet)][0], vector2[2+(5 * num_planet)][0], vector2[3 + (5 * num_planet)][0]) setvary([2+(5 * num_planet),3+(5 * num_planet),(5 * num_planet),1 + (5 * num_planet)]) if basis_name == 'logper tc secosw sesinw logk': vector2[2+(5 * num_planet)][0] = vector[2+(5 * num_planet)][0] ** 2 + vector[3+(5 * num_planet)][0] ** 2 vector2[3+(5 * num_planet)][0] = np.arctan2(vector[3+(5 * num_planet)][0], vector[2+(5 * num_planet)][0]) vector2[(5 * num_planet)][0] = np.exp(vector[(5 * num_planet)][0]) vector2[4 + (5 * num_planet)][0] = np.exp(vector[4 + (5 * num_planet)][0]) vector2[1 + (5 * num_planet)][0] = timetrans_to_timeperi(vector[1 + (5 * num_planet)][0], vector2[(5 * num_planet)][0], vector2[2+(5 * num_planet)][0], vector2[3+(5 * num_planet)][0]) setvary([2+(5 * num_planet),3 + (5 * num_planet),(5 * num_planet),4 + (5 * num_planet),1 + (5 * num_planet)]) if basis_name == 'per tc ecosw esinw k': vector2[2 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0] ** 2 + vector[3 + (5 * num_planet)][0] ** 2) vector2[3+(5 * num_planet)][0] = np.arctan2(vector[3+(5 * num_planet)][0], vector[2+(5 * num_planet)][0]) vector2[1 + (5 * num_planet)][0] = timetrans_to_timeperi(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector2[2+(5 * num_planet)][0], vector2[3+(5 * num_planet)][0]) setvary([3+(5 * num_planet),2+(5 * num_planet),1 + (5 * num_planet)]) if basis_name == 'logper tp e w logk': vector2[4 + (5 * num_planet)][0] = np.exp(vector[4 + (5 * num_planet)][0]) vector2[(5 * num_planet)][0] = np.exp(vector[(5 * num_planet)][0]) setvary([4+(5 * num_planet),(5 * num_planet)]) return vector2
[docs] def to_synth(self, params_in, **kwargs): """Convert to synth basis Convert Parameters object with parameters of a given basis into the synth basis Args: params_in (radvel.Parameters or pandas.DataFrame): radvel.Parameters object or pandas.Dataframe containing orbital parameters expressed in current basis noVary (bool [optional]): if True, set the 'vary' attribute of the returned Parameter objects to '' (used for displaying best fit parameters) Returns: Parameters or DataFrame: parameters expressed in the synth basis """ basis_name = kwargs.setdefault('basis_name', self.name) if isinstance(params_in, pd.core.frame.DataFrame): # Output by emcee params_out = params_in.copy() else: params_out = _copy_params(params_in) for num_planet in range(1, 1+self.num_planets): def _getpar(key): if isinstance(params_in, pd.core.frame.DataFrame): return params_in['{}{}'.format(key, num_planet)] else: return params_in['{}{}'.format(key, num_planet)].value def _setpar(key, new_value): key_name = '{}{}'.format(key, num_planet) if isinstance(params_in, pd.core.frame.DataFrame): params_out[key_name] = new_value else: if key_name in params_in: local_vary = params_in[key_name].vary local_mcmcscale = params_in[key_name].mcmcscale elif kwargs.get('noVary', True): local_vary = '' local_mcmcscale = None else: local_vary = True local_mcmcscale = None params_out[key_name] = radvel.model.Parameter(value=new_value, vary=local_vary, mcmcscale=local_mcmcscale) # transform into synth basis if basis_name == 'per tp e w k': # already in the synth basis per = _getpar('per') tp = _getpar('tp') e = _getpar('e') w = _getpar('w') k = _getpar('k') if basis_name == 'per tc e w k': per = _getpar('per') tc = _getpar('tc') e = _getpar('e') w = _getpar('w') k = _getpar('k') tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'per tc tp e w k': per = _getpar('per') tp = _getpar('tp') e = _getpar('e') w = _getpar('w') k = _getpar('k') if basis_name == 'per tc se w k': # pull out parameters per = _getpar('per') tc = _getpar('tc') se = _getpar('se') w = _getpar('w') k = _getpar('k') e = se**2 tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'per tc secosw sesinw logk': # pull out parameters per = _getpar('per') tc = _getpar('tc') secosw = _getpar('secosw') sesinw = _getpar('sesinw') logk = _getpar('logk') k = np.exp(logk) e = secosw**2 + sesinw**2 w = np.arctan2(sesinw, secosw) tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'per tc secosw sesinw k': # pull out parameters per = _getpar('per') tc = _getpar('tc') secosw = _getpar('secosw') sesinw = _getpar('sesinw') k = _getpar('k') # transform into synth basis e = secosw**2 + sesinw**2 w = np.arctan2(sesinw, secosw) tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'logper tc secosw sesinw k': # pull out parameters logper = _getpar('logper') tc = _getpar('tc') secosw = _getpar('secosw') sesinw = _getpar('sesinw') k = _getpar('k') # transform into synth basis per = np.exp(logper) e = secosw**2 + sesinw**2 w = np.arctan2(sesinw, secosw) tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'logper tc secosw sesinw logk': # pull out parameters logper = _getpar('logper') tc = _getpar('tc') secosw = _getpar('secosw') sesinw = _getpar('sesinw') k = _getpar('logk') # transform into synth basis per = np.exp(logper) e = secosw ** 2 + sesinw ** 2 k = np.exp(k) w = np.arctan2(sesinw, secosw) tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'per tc ecosw esinw k': # pull out parameters per = _getpar('per') tc = _getpar('tc') ecosw = _getpar('ecosw') esinw = _getpar('esinw') k = _getpar('k') # transform into synth basis e = np.sqrt(ecosw**2 + esinw**2) w = np.arctan2(esinw, ecosw) tp = timetrans_to_timeperi(tc, per, e, w) if basis_name == 'logper tp e w logk': # pull out parameters logper = _getpar('logper') tp = _getpar('tp') e = _getpar('e') w = _getpar('w') k = _getpar('logk') # transform into synth basis per = np.exp(logper) k = np.exp(k) # shoves synth parameters from namespace into param_out _setpar('per', per) _setpar('tp', tp) _setpar('e', e) _setpar('w', w) _setpar('k', k) if isinstance(params_out, radvel.model.Parameters): params_out.basis = Basis('per tp e w k', self.num_planets) params_out.planet_parameters = params_out.basis.name.split() return params_out
def v_from_synth(self, params_in, newbasis): if isinstance(params_in, radvel.Vector): vector = params_in.vector else: vector = params_in vector2 = vector.copy() def setvary(indices): for i in indices: vector2[i][1] = True vector2[i][2] = None for num_planet in range(self.num_planets): if newbasis == 'per tc e w k': vector2[1+(5*num_planet)][0] = timeperi_to_timetrans(vector[1+(5*num_planet)][0], vector[(5*num_planet)][0], vector[2+(5*num_planet)][0], vector[3+(5*num_planet)][0]) setvary([3+(5*num_planet)]) if newbasis == 'per tc se w k': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2+(5*num_planet)][0] = np.sqrt(vector[2+(5*num_planet)][0]) setvary([1 + (5 * num_planet),2+(5*num_planet)]) if newbasis == 'per tc secosw sesinw logk': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2+(5*num_planet)][0] = np.sqrt(vector[2+(5*num_planet)][0])*np.cos(vector[3+(5*num_planet)][0]) vector2[3+(5 * num_planet)][0] = np.sqrt(vector[2+(5 * num_planet)][0]) * np.sin(vector[3 + (5 * num_planet)][0]) vector2[4+(5*num_planet)][0] = np.log(vector[4+(5*num_planet)][0]) setvary([1 + (5 * num_planet),2+(5*num_planet),3+(5 * num_planet),4+(5*num_planet)]) if newbasis == 'per tc secosw sesinw k': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.cos(vector[3 + (5 * num_planet)][0]) vector2[3 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.sin(vector[3 + (5 * num_planet)][0]) setvary([1 + (5 * num_planet), 2+(5 * num_planet), 3 + (5 * num_planet)]) if newbasis == 'logper tc secosw sesinw k': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.cos(vector[3 + (5 * num_planet)][0]) vector2[3 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.sin(vector[3 + (5 * num_planet)][0]) vector2[(5*num_planet)][0] = np.log(vector[(5*num_planet)][0]) setvary([1 + (5 * num_planet), 2+(5 * num_planet),3 + (5 * num_planet),(5*num_planet)]) if newbasis == 'logper tc secosw sesinw logk': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.cos(vector[3 + (5 * num_planet)][0]) vector2[3 + (5 * num_planet)][0] = np.sqrt(vector[2 + (5 * num_planet)][0]) * np.sin(vector[3 + (5 * num_planet)][0]) vector2[(5 * num_planet)][0] = np.log(vector[(5 * num_planet)][0]) vector2[4+(5*num_planet)][0] = np.log(vector[4+(5*num_planet)][0]) setvary([1 + (5 * num_planet), 2+(5 * num_planet), 3+ (5 * num_planet), (5 * num_planet),4+(5*num_planet)]) if newbasis == 'per tc ecosw esinw k': vector2[1 + (5 * num_planet)][0] = timeperi_to_timetrans(vector[1 + (5 * num_planet)][0], vector[(5 * num_planet)][0], vector[2 + (5 * num_planet)][0], vector[3 + (5 * num_planet)][0]) vector2[2+(5*num_planet)][0] = vector[2+(5*num_planet)][0]*np.cos(vector[3+(5*num_planet)][0]) vector2[3+(5 * num_planet)][0] = vector[2+(5 * num_planet)][0] * np.sin(vector[3 + (5 * num_planet)][0]) setvary([1 + (5 * num_planet),2+(5*num_planet),3+(5 * num_planet)]) if newbasis == 'logper tp e w logk': vector2[(5 * num_planet)][0] = np.log(vector[(5 * num_planet)][0]) vector2[4 + (5 * num_planet)][0] = np.log(vector[4 + (5 * num_planet)][0]) setvary([(5 * num_planet),4 + (5 * num_planet)]) return vector2
[docs] def from_synth(self, params_in, newbasis, **kwargs): """Convert from synth basis into another basis Convert instance of Parameters with parameters of a given basis into the synth basis Args: params_in (radvel.Parameters or pandas.DataFrame): radvel.Parameters object or pandas.Dataframe containing orbital parameters expressed in current basis newbasis (string): string corresponding to basis to switch into keep (bool [optional]): keep the parameters expressed in the old basis, else remove them from the output dictionary/DataFrame Returns: dict or dataframe with the parameters converted into the new basis """ if newbasis not in BASIS_NAMES: print("{} not valid basis".format(newbasis)) _print_valid_basis() return None if isinstance(params_in, pd.core.frame.DataFrame): # Output by emcee params_out = params_in.copy() else: params_out = _copy_params(params_in) for num_planet in range(1, 1+self.num_planets): def _getpar(key): if isinstance(params_in, pd.core.frame.DataFrame): return params_in['{}{}'.format(key, num_planet)] else: return params_in['{}{}'.format(key, num_planet)].value def _setpar(key, new_value): key_name = '{}{}'.format(key, num_planet) if isinstance(params_in, pd.core.frame.DataFrame): params_out[key_name] = new_value else: if key_name in params_in: local_vary = params_in[key_name].vary local_mcmcscale = params_in[key_name].mcmcscale else: local_vary = True local_mcmcscale = None params_out[key_name] = radvel.model.Parameter(value=new_value, vary=local_vary, mcmcscale=local_mcmcscale) def _delpar(key): if isinstance(params_in, OrderedDict): del params_out['{}{}'.format(key, num_planet)] elif isinstance(params_in, pd.core.frame.DataFrame): params_out.drop('{}{}'.format(key, num_planet)) if newbasis == 'per tc e w k': per = _getpar('per') e = _getpar('e') w = _getpar('w') tp = _getpar('tp') _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) _setpar('w', w) if not kwargs.get('keep', True): _delpar('tp') if newbasis == 'per tc tp e w k': per = _getpar('per') e = _getpar('e') w = _getpar('w') tp = _getpar('tp') _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) _setpar('w', w) if newbasis == 'per tc se w k': per = _getpar('per') e = _getpar('e') w = _getpar('w') tp = _getpar('tp') _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) _setpar('w', w) _setpar('se', np.sqrt(e)) if not kwargs.get('keep', True): _delpar('tp') _delpar('e') if newbasis == 'per tc secosw sesinw logk': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('secosw', np.sqrt(e)*np.cos(w)) _setpar('sesinw', np.sqrt(e)*np.sin(w)) _setpar('logk', np.log(k)) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('tp') _delpar('e') _delpar('w') _delpar('k') # basis_name = newbasis self.params = newbasis.split() if newbasis == 'per tc secosw sesinw k': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('secosw', np.sqrt(e)*np.cos(w)) _setpar('sesinw', np.sqrt(e)*np.sin(w)) _setpar('k', k) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('tp') _delpar('e') _delpar('w') self.name = newbasis self.params = newbasis.split() if newbasis == 'logper tc secosw sesinw k': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('logper', np.log(per)) _setpar('secosw', np.sqrt(e)*np.cos(w)) _setpar('sesinw', np.sqrt(e)*np.sin(w)) _setpar('k', k) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('per') _delpar('tp') _delpar('e') _delpar('w') self.name = newbasis self.params = newbasis.split() if newbasis == 'logper tc secosw sesinw logk': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('logper', np.log(per)) _setpar('secosw', np.sqrt(e)*np.cos(w)) _setpar('sesinw', np.sqrt(e)*np.sin(w)) _setpar('logk', np.log(k)) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('per') _delpar('tp') _delpar('e') _delpar('w') _delpar('k') self.name = newbasis self.params = newbasis.split() if newbasis == 'per tc ecosw esinw k': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('ecosw', e*np.cos(w)) _setpar('esinw', e*np.sin(w)) _setpar('k', k) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('tp') _delpar('e') _delpar('w') self.name = newbasis self.params = newbasis.split() if newbasis == 'logper tp e w logk': per = _getpar('per') e = _getpar('e') w = _getpar('w') k = _getpar('k') if 'tp' in params_in.planet_parameters: tp = _getpar('tp') else: tc = _getpar('tc') tp = timetrans_to_timeperi(tc, per, e, w) _setpar('tp', tp) _setpar('logper', np.log(per)) _setpar('logk', np.log(k)) _setpar('tc', timeperi_to_timetrans(tp, per, e, w)) if not kwargs.get('keep', True): _delpar('per') _delpar('k') self.name = newbasis self.params = newbasis.split() params_out.basis = Basis(newbasis, self.num_planets) params_out.planet_parameters = params_out.basis.name.split() return params_out
[docs] def get_eparams(self): """Return the eccentricity parameters for the object's basis Returns: the params which have to do with eccentricity """ assert BASIS_NAMES.count(self.name) == 1, "Invalid basis" eparamstring = ECCENTRICITY_PARAMS_DICT[self.name] eparamlist = eparamstring.split() assert len(eparamlist) == 2 return eparamlist
[docs] def get_circparams(self): """Return the 3 parameters for a circular orbit of a plent in the object's basis Returns: the params for a circular orbit """ assert BASIS_NAMES.count(self.name) == 1, "Invalid basis" circparamstring = CIRCULAR_PARAMS_DICT[self.name] circparamlist = circparamstring.split() assert len(circparamlist) == 3 return circparamlist